asi-calculator/features/strategies/hooks/use-persistent-state.ts
Matthias Kretschmann 51143f5980
migrate to biome (#28)
* migrate to biome

* get biome config from @kremalicious/config
2024-07-26 13:16:59 +01:00

37 lines
801 B
TypeScript

'use client'
import { type Dispatch, type SetStateAction, useEffect, useState } from 'react'
function parse(value: string) {
try {
return JSON.parse(value)
} catch {
return value
}
}
export function usePersistentState<T>(
key: string,
initialState?: T | (() => T)
): [T, Dispatch<SetStateAction<T>>] {
const [state, setState] = useState<T>(initialState as T)
function changeValue(state: SetStateAction<T>) {
setState(state)
localStorage.setItem(key, JSON.stringify(state))
}
useEffect(() => {
const stored = localStorage.getItem(key)
if (!stored) {
setState(initialState as T)
localStorage.setItem(key, JSON.stringify(initialState))
} else {
setState(parse(stored))
}
}, [initialState, key])
return [state, changeValue]
}