| 
									
										
										
										
											2023-06-16 21:47:51 +08:00
										 |  |  | import { useCallback, useEffect, useMemo, useState } from 'react' | 
					
						
							|  |  |  | 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 { NotionConnector } from '@/app/components/datasets/create/step-one' | 
					
						
							| 
									
										
										
										
											2023-08-28 19:48:53 +08:00
										 |  |  | import type { DataSourceNotionPageMap, DataSourceNotionWorkspace, NotionPage } from '@/models/common' | 
					
						
							| 
									
										
										
										
											2023-11-06 19:36:32 +08:00
										 |  |  | import { useModalContext } from '@/context/modal-context' | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const NotionPageSelector = ({ | 
					
						
							|  |  |  |   value, | 
					
						
							|  |  |  |   onSelect, | 
					
						
							|  |  |  |   canPreview, | 
					
						
							|  |  |  |   previewPageId, | 
					
						
							|  |  |  |   onPreview, | 
					
						
							|  |  |  |   datasetId = '', | 
					
						
							|  |  |  | }: NotionPageSelectorProps) => { | 
					
						
							|  |  |  |   const { data, mutate } = useSWR({ url: '/notion/pre-import/pages', datasetId }, preImportNotionPages) | 
					
						
							|  |  |  |   const [prevData, setPrevData] = useState(data) | 
					
						
							|  |  |  |   const [searchValue, setSearchValue] = useState('') | 
					
						
							|  |  |  |   const [currentWorkspaceId, setCurrentWorkspaceId] = useState('') | 
					
						
							| 
									
										
										
										
											2023-11-06 19:36:32 +08:00
										 |  |  |   const { setShowAccountSettingModal } = useModalContext() | 
					
						
							| 
									
										
										
										
											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) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const getPagesMapAndSelectedPagesId: [DataSourceNotionPageMap, Set<string>] = useMemo(() => { | 
					
						
							|  |  |  |     const selectedPagesId = new Set<string>() | 
					
						
							|  |  |  |     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<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) | 
					
						
							|  |  |  |   }, []) | 
					
						
							| 
									
										
										
										
											2023-08-28 10:53:45 +08:00
										 |  |  |   const handleSelecPages = (newSelectedPagesId: Set<string>) => { | 
					
						
							|  |  |  |     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]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return ( | 
					
						
							|  |  |  |     <div className='bg-gray-25 border border-gray-200 rounded-xl'> | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         data?.notion_info?.length | 
					
						
							|  |  |  |           ? ( | 
					
						
							|  |  |  |             <> | 
					
						
							|  |  |  |               <div className='flex items-center pl-[10px] pr-2 h-11 bg-white border-b border-b-gray-200 rounded-t-xl'> | 
					
						
							|  |  |  |                 <WorkspaceSelector | 
					
						
							|  |  |  |                   value={currentWorkspaceId || firstWorkspaceId} | 
					
						
							|  |  |  |                   items={notionWorkspaces} | 
					
						
							|  |  |  |                   onSelect={handleSelectWorkspace} | 
					
						
							|  |  |  |                 /> | 
					
						
							|  |  |  |                 <div className='mx-1 w-[1px] h-3 bg-gray-200' /> | 
					
						
							|  |  |  |                 <div | 
					
						
							|  |  |  |                   className={cn(s['setting-icon'], 'w-6 h-6 cursor-pointer')} | 
					
						
							| 
									
										
										
										
											2023-11-06 19:36:32 +08:00
										 |  |  |                   onClick={() => setShowAccountSettingModal({ payload: 'data-source', onCancelCallback: mutate })} | 
					
						
							| 
									
										
										
										
											2023-06-16 21:47:51 +08:00
										 |  |  |                 /> | 
					
						
							|  |  |  |                 <div className='grow' /> | 
					
						
							|  |  |  |                 <SearchInput | 
					
						
							|  |  |  |                   value={searchValue} | 
					
						
							|  |  |  |                   onChange={handleSearchValueChange} | 
					
						
							|  |  |  |                 /> | 
					
						
							|  |  |  |               </div> | 
					
						
							|  |  |  |               <div className='rounded-b-xl overflow-hidden'> | 
					
						
							|  |  |  |                 <PageSelector | 
					
						
							|  |  |  |                   value={selectedPagesId} | 
					
						
							|  |  |  |                   searchValue={searchValue} | 
					
						
							|  |  |  |                   list={currentWorkspace?.pages || []} | 
					
						
							|  |  |  |                   pagesMap={getPagesMapAndSelectedPagesId[0]} | 
					
						
							|  |  |  |                   onSelect={handleSelecPages} | 
					
						
							|  |  |  |                   canPreview={canPreview} | 
					
						
							|  |  |  |                   previewPageId={previewPageId} | 
					
						
							|  |  |  |                   onPreview={handlePreviewPage} | 
					
						
							|  |  |  |                 /> | 
					
						
							|  |  |  |               </div> | 
					
						
							|  |  |  |             </> | 
					
						
							|  |  |  |           ) | 
					
						
							|  |  |  |           : ( | 
					
						
							| 
									
										
										
										
											2023-11-06 19:36:32 +08:00
										 |  |  |             <NotionConnector onSetting={() => setShowAccountSettingModal({ payload: 'data-source', onCancelCallback: mutate })} /> | 
					
						
							| 
									
										
										
										
											2023-06-16 21:47:51 +08:00
										 |  |  |           ) | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     </div> | 
					
						
							|  |  |  |   ) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export default NotionPageSelector |