| 
									
										
										
										
											2023-06-16 21:47:51 +08:00
										 |  |  | import { useCallback, useEffect, useMemo, useState } from 'react' | 
					
						
							|  |  |  | import WorkspaceSelector from './workspace-selector' | 
					
						
							|  |  |  | import SearchInput from './search-input' | 
					
						
							|  |  |  | import PageSelector from './page-selector' | 
					
						
							| 
									
										
										
										
											2023-08-28 19:48:53 +08:00
										 |  |  | import type { DataSourceNotionPageMap, DataSourceNotionWorkspace, NotionPage } from '@/models/common' | 
					
						
							| 
									
										
										
										
											2025-04-24 15:32:04 +08:00
										 |  |  | import { useModalContextSelector } from '@/context/modal-context' | 
					
						
							| 
									
										
										
										
											2025-04-24 21:26:54 +08:00
										 |  |  | import NotionConnector from '../notion-connector' | 
					
						
							|  |  |  | import { usePreImportNotionPages } from '@/service/knowledge/use-import' | 
					
						
							| 
									
										
										
										
											2025-04-28 13:33:16 +08:00
										 |  |  | import Header from '../../datasets/create/website/base/header' | 
					
						
							| 
									
										
										
										
											2023-06-16 21:47:51 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | type NotionPageSelectorProps = { | 
					
						
							|  |  |  |   value?: string[] | 
					
						
							| 
									
										
										
										
											2023-08-28 19:48:53 +08:00
										 |  |  |   onSelect: (selectedPages: NotionPage[]) => void | 
					
						
							| 
									
										
										
										
											2023-06-16 21:47:51 +08:00
										 |  |  |   canPreview?: boolean | 
					
						
							|  |  |  |   previewPageId?: string | 
					
						
							| 
									
										
										
										
											2023-08-28 19:48:53 +08:00
										 |  |  |   onPreview?: (selectedPage: NotionPage) => void | 
					
						
							| 
									
										
										
										
											2023-06-16 21:47:51 +08:00
										 |  |  |   datasetId?: string | 
					
						
							| 
									
										
										
										
											2025-04-24 21:26:54 +08:00
										 |  |  |   isInPipeline?: boolean | 
					
						
							| 
									
										
										
										
											2023-06-16 21:47:51 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const NotionPageSelector = ({ | 
					
						
							|  |  |  |   value, | 
					
						
							|  |  |  |   onSelect, | 
					
						
							|  |  |  |   canPreview, | 
					
						
							|  |  |  |   previewPageId, | 
					
						
							|  |  |  |   onPreview, | 
					
						
							|  |  |  |   datasetId = '', | 
					
						
							| 
									
										
										
										
											2025-04-24 21:26:54 +08:00
										 |  |  |   isInPipeline = false, | 
					
						
							| 
									
										
										
										
											2023-06-16 21:47:51 +08:00
										 |  |  | }: NotionPageSelectorProps) => { | 
					
						
							| 
									
										
										
										
											2025-04-24 21:26:54 +08:00
										 |  |  |   const { data, refetch } = usePreImportNotionPages({ url: '/notion/pre-import/pages', datasetId }) | 
					
						
							| 
									
										
										
										
											2023-06-16 21:47:51 +08:00
										 |  |  |   const [prevData, setPrevData] = useState(data) | 
					
						
							|  |  |  |   const [searchValue, setSearchValue] = useState('') | 
					
						
							|  |  |  |   const [currentWorkspaceId, setCurrentWorkspaceId] = useState('') | 
					
						
							| 
									
										
										
										
											2025-04-24 15:32:04 +08:00
										 |  |  |   const setShowAccountSettingModal = useModalContextSelector(s => s.setShowAccountSettingModal) | 
					
						
							| 
									
										
										
										
											2023-06-16 21:47:51 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   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) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-20 15:48:38 +08:00
										 |  |  |   const getPagesMapAndSelectedPagesId: [DataSourceNotionPageMap, Set<string>, Set<string>] = useMemo(() => { | 
					
						
							| 
									
										
										
										
											2023-06-16 21:47:51 +08:00
										 |  |  |     const selectedPagesId = new Set<string>() | 
					
						
							| 
									
										
										
										
											2024-06-20 15:48:38 +08:00
										 |  |  |     const boundPagesId = new Set<string>() | 
					
						
							| 
									
										
										
										
											2023-06-16 21:47:51 +08:00
										 |  |  |     const pagesMap = notionWorkspaces.reduce((prev: DataSourceNotionPageMap, next: DataSourceNotionWorkspace) => { | 
					
						
							|  |  |  |       next.pages.forEach((page) => { | 
					
						
							| 
									
										
										
										
											2024-06-20 15:48:38 +08:00
										 |  |  |         if (page.is_bound) { | 
					
						
							| 
									
										
										
										
											2023-06-16 21:47:51 +08:00
										 |  |  |           selectedPagesId.add(page.page_id) | 
					
						
							| 
									
										
										
										
											2024-06-20 15:48:38 +08:00
										 |  |  |           boundPagesId.add(page.page_id) | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-06-16 21:47:51 +08:00
										 |  |  |         prev[page.page_id] = { | 
					
						
							|  |  |  |           ...page, | 
					
						
							|  |  |  |           workspace_id: next.workspace_id, | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       return prev | 
					
						
							|  |  |  |     }, {}) | 
					
						
							| 
									
										
										
										
											2024-06-20 15:48:38 +08:00
										 |  |  |     return [pagesMap, selectedPagesId, boundPagesId] | 
					
						
							| 
									
										
										
										
											2023-06-16 21:47:51 +08:00
										 |  |  |   }, [notionWorkspaces]) | 
					
						
							|  |  |  |   const defaultSelectedPagesId = [...Array.from(getPagesMapAndSelectedPagesId[1]), ...(value || [])] | 
					
						
							|  |  |  |   const [selectedPagesId, setSelectedPagesId] = useState<Set<string>>(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) | 
					
						
							|  |  |  |   }, []) | 
					
						
							| 
									
										
										
										
											2024-09-08 12:14:11 +07:00
										 |  |  |   const handleSelectPages = (newSelectedPagesId: Set<string>) => { | 
					
						
							| 
									
										
										
										
											2023-08-28 10:53:45 +08:00
										 |  |  |     const selectedPages = Array.from(newSelectedPagesId).map(pageId => getPagesMapAndSelectedPagesId[0][pageId]) | 
					
						
							| 
									
										
										
										
											2023-12-05 16:53:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-28 10:53:45 +08:00
										 |  |  |     setSelectedPagesId(new Set(Array.from(newSelectedPagesId))) | 
					
						
							| 
									
										
										
										
											2023-06-16 21:47:51 +08:00
										 |  |  |     onSelect(selectedPages) | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   const handlePreviewPage = (previewPageId: string) => { | 
					
						
							|  |  |  |     if (onPreview) | 
					
						
							|  |  |  |       onPreview(getPagesMapAndSelectedPagesId[0][previewPageId]) | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   useEffect(() => { | 
					
						
							|  |  |  |     setCurrentWorkspaceId(firstWorkspaceId) | 
					
						
							|  |  |  |   }, [firstWorkspaceId]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-24 21:26:54 +08:00
										 |  |  |   const handleConfigureNotion = useCallback(() => { | 
					
						
							|  |  |  |     setShowAccountSettingModal({ payload: 'data-source', onCancelCallback: refetch }) | 
					
						
							|  |  |  |   }, [setShowAccountSettingModal, refetch]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-16 21:47:51 +08:00
										 |  |  |   return ( | 
					
						
							| 
									
										
										
										
											2025-04-24 15:32:04 +08:00
										 |  |  |     <> | 
					
						
							| 
									
										
										
										
											2023-06-16 21:47:51 +08:00
										 |  |  |       { | 
					
						
							|  |  |  |         data?.notion_info?.length | 
					
						
							|  |  |  |           ? ( | 
					
						
							| 
									
										
										
										
											2025-04-24 21:26:54 +08:00
										 |  |  |             <div className='flex flex-col gap-y-2'> | 
					
						
							|  |  |  |               <Header | 
					
						
							|  |  |  |                 isInPipeline={isInPipeline} | 
					
						
							| 
									
										
										
										
											2025-04-28 13:33:16 +08:00
										 |  |  |                 onClickConfiguration={handleConfigureNotion} | 
					
						
							|  |  |  |                 title={'Choose notion pages'} | 
					
						
							|  |  |  |                 buttonText={'Configure Notion'} | 
					
						
							|  |  |  |                 docTitle={'Notion docs'} | 
					
						
							|  |  |  |                 docLink={'https://www.notion.so/docs'} | 
					
						
							| 
									
										
										
										
											2025-04-24 21:26:54 +08:00
										 |  |  |               /> | 
					
						
							|  |  |  |               <div className='rounded-xl border border-components-panel-border bg-background-default-subtle'> | 
					
						
							|  |  |  |                 <div className='flex h-12 items-center gap-x-2 rounded-t-xl border-b border-b-divider-regular bg-components-panel-bg p-2'> | 
					
						
							|  |  |  |                   <div className='flex grow items-center gap-x-1'> | 
					
						
							|  |  |  |                     <WorkspaceSelector | 
					
						
							|  |  |  |                       value={currentWorkspaceId || firstWorkspaceId} | 
					
						
							|  |  |  |                       items={notionWorkspaces} | 
					
						
							|  |  |  |                       onSelect={handleSelectWorkspace} | 
					
						
							|  |  |  |                     /> | 
					
						
							|  |  |  |                   </div> | 
					
						
							|  |  |  |                   <SearchInput | 
					
						
							|  |  |  |                     value={searchValue} | 
					
						
							|  |  |  |                     onChange={handleSearchValueChange} | 
					
						
							| 
									
										
										
										
											2025-03-19 11:19:57 +08:00
										 |  |  |                   /> | 
					
						
							| 
									
										
										
										
											2025-04-24 21:26:54 +08:00
										 |  |  |                 </div> | 
					
						
							|  |  |  |                 <div className='overflow-hidden rounded-b-xl'> | 
					
						
							|  |  |  |                   <PageSelector | 
					
						
							|  |  |  |                     value={selectedPagesId} | 
					
						
							|  |  |  |                     disabledValue={getPagesMapAndSelectedPagesId[2]} | 
					
						
							|  |  |  |                     searchValue={searchValue} | 
					
						
							|  |  |  |                     list={currentWorkspace?.pages || []} | 
					
						
							|  |  |  |                     pagesMap={getPagesMapAndSelectedPagesId[0]} | 
					
						
							|  |  |  |                     onSelect={handleSelectPages} | 
					
						
							|  |  |  |                     canPreview={canPreview} | 
					
						
							|  |  |  |                     previewPageId={previewPageId} | 
					
						
							|  |  |  |                     onPreview={handlePreviewPage} | 
					
						
							| 
									
										
										
										
											2025-03-19 11:19:57 +08:00
										 |  |  |                   /> | 
					
						
							|  |  |  |                 </div> | 
					
						
							| 
									
										
										
										
											2023-06-16 21:47:51 +08:00
										 |  |  |               </div> | 
					
						
							| 
									
										
										
										
											2025-04-24 15:32:04 +08:00
										 |  |  |             </div> | 
					
						
							| 
									
										
										
										
											2023-06-16 21:47:51 +08:00
										 |  |  |           ) | 
					
						
							|  |  |  |           : ( | 
					
						
							| 
									
										
										
										
											2025-04-24 21:26:54 +08:00
										 |  |  |             <NotionConnector onSetting={handleConfigureNotion} /> | 
					
						
							| 
									
										
										
										
											2023-06-16 21:47:51 +08:00
										 |  |  |           ) | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2025-04-24 15:32:04 +08:00
										 |  |  |     </> | 
					
						
							| 
									
										
										
										
											2023-06-16 21:47:51 +08:00
										 |  |  |   ) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export default NotionPageSelector |