import { useCallback, useEffect, useMemo, useState } from 'react' import type { NotionCredential } from './credential-selector' import WorkspaceSelector from './credential-selector' import SearchInput from './search-input' import PageSelector from './page-selector' import type { DataSourceNotionPageMap, DataSourceNotionWorkspace, NotionPage } from '@/models/common' import { useModalContextSelector } from '@/context/modal-context' import NotionConnector from '../notion-connector' import { usePreImportNotionPages } from '@/service/knowledge/use-import' import Header from '../../datasets/create/website/base/header' import type { DataSourceCredential } from '../../header/account-setting/data-source-page-new/types' type NotionPageSelectorProps = { value?: string[] onSelect: (selectedPages: NotionPage[]) => void canPreview?: boolean previewPageId?: string onPreview?: (selectedPage: NotionPage) => void datasetId?: string credentialList: DataSourceCredential[] } const NotionPageSelector = ({ value, onSelect, canPreview, previewPageId, onPreview, datasetId = '', credentialList, }: NotionPageSelectorProps) => { const [searchValue, setSearchValue] = useState('') const setShowAccountSettingModal = useModalContextSelector(s => s.setShowAccountSettingModal) const notionCredentials = useMemo((): NotionCredential[] => { return credentialList.map((item) => { return { credentialId: item.id, credentialName: item.name, workspaceIcon: item.credential.workspace_icon, workspaceName: item.credential.workspace_name, } }) }, [credentialList]) const [currentCredential, setCurrentCredential] = useState(notionCredentials[0]) useEffect(() => { const credential = notionCredentials.find(item => item.credentialId === currentCredential?.credentialId) if (!credential) setCurrentCredential(notionCredentials[0]) }, [notionCredentials]) const { data } = usePreImportNotionPages({ datasetId, credentialId: currentCredential.credentialId || '' }) const getPagesMapAndSelectedPagesId: [DataSourceNotionPageMap, Set, Set] = useMemo(() => { const selectedPagesId = new Set() const boundPagesId = new Set() const notionWorkspaces = data?.notion_info || [] const pagesMap = notionWorkspaces.reduce((prev: DataSourceNotionPageMap, next: DataSourceNotionWorkspace) => { next.pages.forEach((page) => { if (page.is_bound) { selectedPagesId.add(page.page_id) boundPagesId.add(page.page_id) } prev[page.page_id] = { ...page, workspace_id: next.workspace_id, } }) return prev }, {}) return [pagesMap, selectedPagesId, boundPagesId] }, [data?.notion_info]) const defaultSelectedPagesId = [...Array.from(getPagesMapAndSelectedPagesId[1]), ...(value || [])] const [selectedPagesId, setSelectedPagesId] = useState>(new Set(defaultSelectedPagesId)) useEffect(() => { setSelectedPagesId(new Set(defaultSelectedPagesId)) }, [data]) const handleSearchValueChange = useCallback((value: string) => { setSearchValue(value) }, []) const handleSelectCredential = useCallback((credentialId: string) => { const credential = notionCredentials.find(item => item.credentialId === credentialId)! setCurrentCredential(credential) }, []) const handleSelectPages = useCallback((newSelectedPagesId: Set) => { const selectedPages = Array.from(newSelectedPagesId).map(pageId => getPagesMapAndSelectedPagesId[0][pageId]) setSelectedPagesId(new Set(Array.from(newSelectedPagesId))) onSelect(selectedPages) }, [getPagesMapAndSelectedPagesId, onSelect]) const handlePreviewPage = useCallback((previewPageId: string) => { if (onPreview) onPreview(getPagesMapAndSelectedPagesId[0][previewPageId]) }, [getPagesMapAndSelectedPagesId, onSelect, onPreview]) const handleConfigureNotion = useCallback(() => { setShowAccountSettingModal({ payload: 'data-source' }) }, [setShowAccountSettingModal]) if (!data) { return ( ) } return (
) } export default NotionPageSelector