some change

This commit is contained in:
john 2025-05-16 16:09:35 +02:00
parent d4a1492d56
commit 313f1def49
38 changed files with 475 additions and 401 deletions

43
src/utils/store.ts Normal file
View file

@ -0,0 +1,43 @@
import { useEffect, useState } from 'react'
export interface Store<T> {
getState: () => T
setState: (nextState: T | ((prevState: T) => T)) => void
subscribe: (listener: Listener<T>) => () => void
}
type Listener<T> = (state: T) => void
export function createStore<T extends object | null>(initialState: T): Store<T> {
let state = initialState
const listeners = new Set<Listener<T>>()
const getState = () => Object.freeze(state)
function setState(nextState: T | ((prevState: T) => T)) {
if (typeof nextState === 'function') {
state = nextState(state)
} else {
state = nextState
}
listeners.forEach((listener) => listener(state))
}
function subscribe(listener: Listener<T>) {
listeners.add(listener)
return () => {
listeners.delete(listener)
}
}
return { getState, setState, subscribe }
}
export function useStore<T>(store: Store<T>) {
const [selectedState, setSelectedState] = useState(() => store.getState())
useEffect(() => store.subscribe((newState) => setSelectedState(newState)), [store])
return [selectedState, setSelectedState] as const
}