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 { useInvalidPreImportNotionPages, 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' import Loading from '../loading' type NotionPageSelectorProps = { value?: string[] onSelect: (selectedPages: NotionPage[]) => void canPreview?: boolean previewPageId?: string onPreview?: (selectedPage: NotionPage) => void datasetId?: string credentialList: DataSourceCredential[] onSelectCredential?: (credentialId: string) => void } const NotionPageSelector = ({ value, onSelect, canPreview, previewPageId, onPreview, datasetId = '', credentialList, onSelectCredential, }: NotionPageSelectorProps) => { const [searchValue, setSearchValue] = useState('') const setShowAccountSettingModal = useModalContextSelector(s => s.setShowAccountSettingModal) const invalidPreImportNotionPages = useInvalidPreImportNotionPages() 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) { const firstCredential = notionCredentials[0] invalidPreImportNotionPages({ datasetId, credentialId: firstCredential.credentialId }) setCurrentCredential(notionCredentials[0]) onSelect([]) // Clear selected pages when changing credential onSelectCredential?.(firstCredential.credentialId) } else { onSelectCredential?.(credential?.credentialId || '') } }, [notionCredentials]) const { data: notionsPages, isFetching: isFetchingNotionPages, isError: isFetchingNotionPagesError, } = usePreImportNotionPages({ datasetId, credentialId: currentCredential.credentialId || '' }) const pagesMapAndSelectedPagesId: [DataSourceNotionPageMap, Set, Set] = useMemo(() => { const selectedPagesId = new Set() const boundPagesId = new Set() const notionWorkspaces = notionsPages?.notion_info || [] const pagesMap = notionWorkspaces.reduce((prev: DataSourceNotionPageMap, cur: DataSourceNotionWorkspace) => { cur.pages.forEach((page) => { if (page.is_bound) { selectedPagesId.add(page.page_id) boundPagesId.add(page.page_id) } prev[page.page_id] = { ...page, workspace_id: cur.workspace_id, } }) return prev }, {}) return [pagesMap, selectedPagesId, boundPagesId] }, [notionsPages?.notion_info]) const defaultSelectedPagesId = useMemo(() => { return [...Array.from(pagesMapAndSelectedPagesId[1]), ...(value || [])] }, [pagesMapAndSelectedPagesId, value]) const [selectedPagesId, setSelectedPagesId] = useState>(new Set(defaultSelectedPagesId)) useEffect(() => { setSelectedPagesId(new Set(defaultSelectedPagesId)) }, [defaultSelectedPagesId]) const handleSearchValueChange = useCallback((value: string) => { setSearchValue(value) }, []) const handleSelectCredential = useCallback((credentialId: string) => { const credential = notionCredentials.find(item => item.credentialId === credentialId)! invalidPreImportNotionPages({ datasetId, credentialId: credential.credentialId }) setCurrentCredential(credential) onSelect([]) // Clear selected pages when changing credential onSelectCredential?.(credential.credentialId) }, [invalidPreImportNotionPages, onSelect, onSelectCredential]) const handleSelectPages = useCallback((newSelectedPagesId: Set) => { const selectedPages = Array.from(newSelectedPagesId).map(pageId => pagesMapAndSelectedPagesId[0][pageId]) setSelectedPagesId(new Set(Array.from(newSelectedPagesId))) onSelect(selectedPages) }, [pagesMapAndSelectedPagesId, onSelect]) const handlePreviewPage = useCallback((previewPageId: string) => { if (onPreview) onPreview(pagesMapAndSelectedPagesId[0][previewPageId]) }, [pagesMapAndSelectedPagesId, onPreview]) const handleConfigureNotion = useCallback(() => { setShowAccountSettingModal({ payload: 'data-source' }) }, [setShowAccountSettingModal]) if (isFetchingNotionPagesError) { return ( ) } return (
{isFetchingNotionPages ? (
) : ( )}
) } export default NotionPageSelector