mirror of
https://github.com/kremalicious/asi-calculator.git
synced 2024-12-22 09:23:16 +01:00
37 lines
801 B
TypeScript
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]
|
|
}
|