import { useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { useContext } from 'use-context-selector' import useSWR from 'swr' import cn from 'classnames' import s from './base.module.css' import WorkspaceSelector from './workspace-selector' import SearchInput from './search-input' import PageSelector from './page-selector' import { preImportNotionPages } from '@/service/datasets' import AccountSetting from '@/app/components/header/account-setting' import { NotionConnector } from '@/app/components/datasets/create/step-one' import type { DataSourceNotionPageMap, DataSourceNotionWorkspace, NotionPage } from '@/models/common' import { ToastContext } from '@/app/components/base/toast' type NotionPageSelectorProps = { value?: string[] onSelect: (selectedPages: NotionPage[]) => void canPreview?: boolean previewPageId?: string onPreview?: (selectedPage: NotionPage) => void datasetId?: string countLimit: number countUsed: number } const NotionPageSelector = ({ value, onSelect, canPreview, previewPageId, onPreview, datasetId = '', countLimit, countUsed, }: NotionPageSelectorProps) => { const { t } = useTranslation() const { notify } = useContext(ToastContext) const { data, mutate } = useSWR({ url: '/notion/pre-import/pages', datasetId }, preImportNotionPages) const [prevData, setPrevData] = useState(data) const [searchValue, setSearchValue] = useState('') const [showDataSourceSetting, setShowDataSourceSetting] = useState(false) const [currentWorkspaceId, setCurrentWorkspaceId] = useState('') const notionWorkspaces = useMemo(() => { return data?.notion_info || [] }, [data?.notion_info]) const firstWorkspaceId = notionWorkspaces[0]?.workspace_id const currentWorkspace = notionWorkspaces.find(workspace => workspace.workspace_id === currentWorkspaceId) const getPagesMapAndSelectedPagesId: [DataSourceNotionPageMap, Set] = useMemo(() => { const selectedPagesId = new Set() const pagesMap = notionWorkspaces.reduce((prev: DataSourceNotionPageMap, next: DataSourceNotionWorkspace) => { next.pages.forEach((page) => { if (page.is_bound) selectedPagesId.add(page.page_id) prev[page.page_id] = { ...page, workspace_id: next.workspace_id, } }) return prev }, {}) return [pagesMap, selectedPagesId] }, [notionWorkspaces]) const defaultSelectedPagesId = [...Array.from(getPagesMapAndSelectedPagesId[1]), ...(value || [])] const [selectedPagesId, setSelectedPagesId] = useState>(new Set(defaultSelectedPagesId)) if (prevData !== data) { setPrevData(data) setSelectedPagesId(new Set(defaultSelectedPagesId)) } const handleSearchValueChange = useCallback((value: string) => { setSearchValue(value) }, []) const handleSelectWorkspace = useCallback((workspaceId: string) => { setCurrentWorkspaceId(workspaceId) }, []) const handleSelecPages = (newSelectedPagesId: Set) => { const selectedPages = Array.from(newSelectedPagesId).map(pageId => getPagesMapAndSelectedPagesId[0][pageId]) if (selectedPages.length > countLimit - countUsed) { notify({ type: 'error', message: t('datasetCreation.stepOne.overCountLimit', { countLimit }) }) return false } setSelectedPagesId(new Set(Array.from(newSelectedPagesId))) onSelect(selectedPages) } const handlePreviewPage = (previewPageId: string) => { if (onPreview) onPreview(getPagesMapAndSelectedPagesId[0][previewPageId]) } useEffect(() => { setCurrentWorkspaceId(firstWorkspaceId) }, [firstWorkspaceId]) return (
{ data?.notion_info?.length ? ( <>
setShowDataSourceSetting(true)} />
) : ( setShowDataSourceSetting(true)} /> ) } { showDataSourceSetting && ( { setShowDataSourceSetting(false) mutate() }} /> ) }
) } export default NotionPageSelector