some change
This commit is contained in:
parent
d4a1492d56
commit
313f1def49
38 changed files with 475 additions and 401 deletions
43
src/utils/store.ts
Normal file
43
src/utils/store.ts
Normal 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
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue