12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- import {
- createContext,
- useContext,
- useRef,
- } from 'react'
- import {
- create,
- useStore as useZustandStore,
- } from 'zustand'
- import type {
- FileEntity,
- } from './types'
- type Shape = {
- files: FileEntity[]
- setFiles: (files: FileEntity[]) => void
- }
- export const createFileStore = (
- value: FileEntity[] = [],
- onChange?: (files: FileEntity[]) => void,
- ) => {
- return create<Shape>(set => ({
- files: [...value],
- setFiles: (files) => {
- set({ files })
- onChange?.(files)
- },
- }))
- }
- type FileStore = ReturnType<typeof createFileStore>
- export const FileContext = createContext<FileStore | null>(null)
- export function useStore<T>(selector: (state: Shape) => T): T {
- const store = useContext(FileContext)
- if (!store)
- throw new Error('Missing FileContext.Provider in the tree')
- return useZustandStore(store, selector)
- }
- export const useFileStore = () => {
- return useContext(FileContext)!
- }
- type FileProviderProps = {
- children: React.ReactNode
- value?: FileEntity[]
- onChange?: (files: FileEntity[]) => void
- }
- export const FileContextProvider = ({
- children,
- value,
- onChange,
- }: FileProviderProps) => {
- const storeRef = useRef<FileStore>()
- if (!storeRef.current)
- storeRef.current = createFileStore(value, onChange)
- return (
- <FileContext.Provider value={storeRef.current}>
- {children}
- </FileContext.Provider>
- )
- }
|