feat: Implement data source store with slices for local files, online documents, website crawls, and online drives
parent
ddde576b4a
commit
2dd1f41ad3
@ -0,0 +1,34 @@
|
|||||||
|
import { useContext } from 'react'
|
||||||
|
import { createStore, useStore } from 'zustand'
|
||||||
|
import { DataSourceContext } from './provider'
|
||||||
|
import type { LocalFileSliceShape } from './slices/local-file'
|
||||||
|
import { createLocalFileSlice } from './slices/local-file'
|
||||||
|
import type { OnlineDocumentSliceShape } from './slices/online-document'
|
||||||
|
import { createOnlineDocumentSlice } from './slices/online-document'
|
||||||
|
import type { WebsiteCrawlSliceShape } from './slices/website-crawl'
|
||||||
|
import { createWebsiteCrawlSlice } from './slices/website-crawl'
|
||||||
|
import type { OnlineDriveSliceShape } from './slices/online-drive'
|
||||||
|
import { createOnlineDriveSlice } from './slices/online-drive'
|
||||||
|
|
||||||
|
export type DataSourceShape =
|
||||||
|
LocalFileSliceShape &
|
||||||
|
OnlineDocumentSliceShape &
|
||||||
|
WebsiteCrawlSliceShape &
|
||||||
|
OnlineDriveSliceShape
|
||||||
|
|
||||||
|
export const createDataSourceStore = () => {
|
||||||
|
return createStore<DataSourceShape>((...args) => ({
|
||||||
|
...createLocalFileSlice(...args),
|
||||||
|
...createOnlineDocumentSlice(...args),
|
||||||
|
...createWebsiteCrawlSlice(...args),
|
||||||
|
...createOnlineDriveSlice(...args),
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
export const useDataSourceStore = <T>(selector: (state: DataSourceShape) => T): T => {
|
||||||
|
const store = useContext(DataSourceContext)
|
||||||
|
if (!store)
|
||||||
|
throw new Error('Missing DataSourceContext.Provider in the tree')
|
||||||
|
|
||||||
|
return useStore(store, selector)
|
||||||
|
}
|
||||||
@ -0,0 +1,29 @@
|
|||||||
|
import { createContext, useRef } from 'react'
|
||||||
|
import { createDataSourceStore } from './'
|
||||||
|
|
||||||
|
type DataSourceStoreApi = ReturnType<typeof createDataSourceStore>
|
||||||
|
|
||||||
|
type DataSourceContextType = DataSourceStoreApi | null
|
||||||
|
|
||||||
|
export const DataSourceContext = createContext<DataSourceContextType>(null)
|
||||||
|
|
||||||
|
type DataSourceProviderProps = {
|
||||||
|
children: React.ReactNode
|
||||||
|
}
|
||||||
|
|
||||||
|
const DataSourceProvider = ({
|
||||||
|
children,
|
||||||
|
}: DataSourceProviderProps) => {
|
||||||
|
const storeRef = useRef<DataSourceStoreApi>()
|
||||||
|
|
||||||
|
if (!storeRef.current)
|
||||||
|
storeRef.current = createDataSourceStore()
|
||||||
|
|
||||||
|
return (
|
||||||
|
<DataSourceContext.Provider value={storeRef.current!}>
|
||||||
|
{children}
|
||||||
|
</DataSourceContext.Provider>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default DataSourceProvider
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
import type { StateCreator } from 'zustand'
|
||||||
|
import type { FileItem } from '@/models/datasets'
|
||||||
|
|
||||||
|
export type LocalFileSliceShape = {
|
||||||
|
localFileList: FileItem[]
|
||||||
|
setLocalFileList: (fileList: FileItem[]) => void
|
||||||
|
currentLocalFile: File | undefined
|
||||||
|
setCurrentLocalFile: (file: File | undefined) => void
|
||||||
|
}
|
||||||
|
|
||||||
|
export const createLocalFileSlice: StateCreator<LocalFileSliceShape> = (set) => {
|
||||||
|
return ({
|
||||||
|
localFileList: [],
|
||||||
|
setLocalFileList: (fileList: FileItem[]) => set(() => ({
|
||||||
|
localFileList: fileList,
|
||||||
|
})),
|
||||||
|
currentLocalFile: undefined,
|
||||||
|
setCurrentLocalFile: (file: File | undefined) => set(() => ({
|
||||||
|
currentLocalFile: file,
|
||||||
|
})),
|
||||||
|
})
|
||||||
|
}
|
||||||
@ -0,0 +1,46 @@
|
|||||||
|
import type { StateCreator } from 'zustand'
|
||||||
|
import type { DataSourceNotionWorkspace, NotionPage } from '@/models/common'
|
||||||
|
|
||||||
|
export type OnlineDocumentSliceShape = {
|
||||||
|
documentData: DataSourceNotionWorkspace[]
|
||||||
|
setDocumentData: (documentData: DataSourceNotionWorkspace[]) => void
|
||||||
|
searchValue: string
|
||||||
|
setSearchValue: (searchValue: string) => void
|
||||||
|
currentWorkspaceId: string
|
||||||
|
setCurrentWorkspaceId: (workspaceId: string) => void
|
||||||
|
onlineDocuments: NotionPage[]
|
||||||
|
setOnlineDocuments: (documents: NotionPage[]) => void
|
||||||
|
currentDocument: NotionPage | undefined
|
||||||
|
setCurrentDocument: (document: NotionPage | undefined) => void
|
||||||
|
selectedPagesId: Set<string>
|
||||||
|
setSelectedPagesId: (selectedPagesId: Set<string>) => void
|
||||||
|
}
|
||||||
|
|
||||||
|
export const createOnlineDocumentSlice: StateCreator<OnlineDocumentSliceShape> = (set, get) => {
|
||||||
|
return ({
|
||||||
|
documentData: [],
|
||||||
|
setDocumentData: (documentData: DataSourceNotionWorkspace[]) => set(() => ({
|
||||||
|
documentData,
|
||||||
|
})),
|
||||||
|
searchValue: '',
|
||||||
|
setSearchValue: (searchValue: string) => set(() => ({
|
||||||
|
searchValue,
|
||||||
|
})),
|
||||||
|
currentWorkspaceId: '',
|
||||||
|
setCurrentWorkspaceId: (workspaceId: string) => set(() => ({
|
||||||
|
currentWorkspaceId: workspaceId,
|
||||||
|
})),
|
||||||
|
onlineDocuments: [],
|
||||||
|
setOnlineDocuments: (documents: NotionPage[]) => set(() => ({
|
||||||
|
onlineDocuments: documents,
|
||||||
|
})),
|
||||||
|
currentDocument: undefined,
|
||||||
|
setCurrentDocument: (document: NotionPage | undefined) => set(() => ({
|
||||||
|
currentDocument: document,
|
||||||
|
})),
|
||||||
|
selectedPagesId: new Set([...get().onlineDocuments.map(doc => doc.page_id)]),
|
||||||
|
setSelectedPagesId: (selectedPagesId: Set<string>) => set(() => ({
|
||||||
|
selectedPagesId,
|
||||||
|
})),
|
||||||
|
})
|
||||||
|
}
|
||||||
@ -0,0 +1,44 @@
|
|||||||
|
import type { StateCreator } from 'zustand'
|
||||||
|
import { type OnlineDriveFile, OnlineDriveFileType } from '@/models/pipeline'
|
||||||
|
|
||||||
|
export type OnlineDriveSliceShape = {
|
||||||
|
prefix: string[]
|
||||||
|
setPrefix: (prefix: string[]) => void
|
||||||
|
keywords: string
|
||||||
|
setKeywords: (keywords: string) => void
|
||||||
|
startAfter: string
|
||||||
|
setStartAfter: (startAfter: string) => void
|
||||||
|
selectedFileList: string[]
|
||||||
|
setSelectedFileList: (selectedFileList: string[]) => void
|
||||||
|
fileList: OnlineDriveFile[]
|
||||||
|
setFileList: (fileList: OnlineDriveFile[]) => void
|
||||||
|
}
|
||||||
|
|
||||||
|
export const createOnlineDriveSlice: StateCreator<OnlineDriveSliceShape> = (set) => {
|
||||||
|
return ({
|
||||||
|
prefix: [],
|
||||||
|
setPrefix: (prefix: string[]) => set(() => ({
|
||||||
|
prefix,
|
||||||
|
})),
|
||||||
|
keywords: '',
|
||||||
|
setKeywords: (keywords: string) => set(() => ({
|
||||||
|
keywords,
|
||||||
|
})),
|
||||||
|
startAfter: '',
|
||||||
|
setStartAfter: (startAfter: string) => set(() => ({
|
||||||
|
startAfter,
|
||||||
|
})),
|
||||||
|
selectedFileList: [],
|
||||||
|
setSelectedFileList: (selectedFileList: string[]) => set(() => ({
|
||||||
|
selectedFileList,
|
||||||
|
})),
|
||||||
|
fileList: [{
|
||||||
|
key: 'Bucket_1',
|
||||||
|
size: 1024, // unit bytes
|
||||||
|
type: OnlineDriveFileType.bucket,
|
||||||
|
}],
|
||||||
|
setFileList: (fileList: OnlineDriveFile[]) => set(() => ({
|
||||||
|
fileList,
|
||||||
|
})),
|
||||||
|
})
|
||||||
|
}
|
||||||
@ -0,0 +1,41 @@
|
|||||||
|
import type { StateCreator } from 'zustand'
|
||||||
|
import type { CrawlResult, CrawlResultItem } from '@/models/datasets'
|
||||||
|
import { CrawlStep } from '@/models/datasets'
|
||||||
|
|
||||||
|
export type WebsiteCrawlSliceShape = {
|
||||||
|
websitePages: CrawlResultItem[]
|
||||||
|
setWebsitePages: (pages: CrawlResultItem[]) => void
|
||||||
|
currentWebsite: CrawlResultItem | undefined
|
||||||
|
setCurrentWebsite: (website: CrawlResultItem | undefined) => void
|
||||||
|
crawlResult: CrawlResult | undefined
|
||||||
|
setCrawlResult: (result: CrawlResult | undefined) => void
|
||||||
|
step: CrawlStep
|
||||||
|
setStep: (step: CrawlStep) => void
|
||||||
|
previewIndex: number
|
||||||
|
setPreviewIndex: (index: number) => void
|
||||||
|
}
|
||||||
|
|
||||||
|
export const createWebsiteCrawlSlice: StateCreator<WebsiteCrawlSliceShape> = (set) => {
|
||||||
|
return ({
|
||||||
|
websitePages: [],
|
||||||
|
setWebsitePages: (pages: CrawlResultItem[]) => set(() => ({
|
||||||
|
websitePages: pages,
|
||||||
|
})),
|
||||||
|
currentWebsite: undefined,
|
||||||
|
setCurrentWebsite: (website: CrawlResultItem | undefined) => set(() => ({
|
||||||
|
currentWebsite: website,
|
||||||
|
})),
|
||||||
|
crawlResult: undefined,
|
||||||
|
setCrawlResult: (result: CrawlResult | undefined) => set(() => ({
|
||||||
|
crawlResult: result,
|
||||||
|
})),
|
||||||
|
step: CrawlStep.init,
|
||||||
|
setStep: (step: CrawlStep) => set(() => ({
|
||||||
|
step,
|
||||||
|
})),
|
||||||
|
previewIndex: -1,
|
||||||
|
setPreviewIndex: (index: number) => set(() => ({
|
||||||
|
previewIndex: index,
|
||||||
|
})),
|
||||||
|
})
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue