store.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. import { useContext } from 'react'
  2. import { createStore, useStore } from 'zustand'
  3. import type { DataSet } from '@/models/datasets'
  4. import { DatasetsDetailContext } from './provider'
  5. import produce from 'immer'
  6. type DatasetsDetailStore = {
  7. datasetsDetail: Record<string, DataSet>
  8. updateDatasetsDetail: (datasetsDetail: DataSet[]) => void
  9. }
  10. export const createDatasetsDetailStore = () => {
  11. return createStore<DatasetsDetailStore>((set, get) => ({
  12. datasetsDetail: {},
  13. updateDatasetsDetail: (datasets: DataSet[]) => {
  14. const oldDatasetsDetail = get().datasetsDetail
  15. const datasetsDetail = datasets.reduce<Record<string, DataSet>>((acc, dataset) => {
  16. acc[dataset.id] = dataset
  17. return acc
  18. }, {})
  19. // Merge new datasets detail into old one
  20. const newDatasetsDetail = produce(oldDatasetsDetail, (draft) => {
  21. Object.entries(datasetsDetail).forEach(([key, value]) => {
  22. draft[key] = value
  23. })
  24. })
  25. set({ datasetsDetail: newDatasetsDetail })
  26. },
  27. }))
  28. }
  29. export const useDatasetsDetailStore = <T>(selector: (state: DatasetsDetailStore) => T): T => {
  30. const store = useContext(DatasetsDetailContext)
  31. if (!store)
  32. throw new Error('Missing DatasetsDetailContext.Provider in the tree')
  33. return useStore(store, selector)
  34. }