/** * Copyright 2022 Design Barn Inc. */ import * as React from 'react'; import { useState } from 'react'; import { EmptyIcon } from '../../../../../assets/Icons'; import { useWorkspace } from '../../../../../context/workspace-provider'; import { queries } from '../../../../../helpers/query-strings'; import useLazyQuery from '../../../../../hooks/use-lazy-query'; import { Empty } from './empty'; import { FileCard } from './file-card'; import { FileModal } from './file-modal'; import { FolderCard } from './folder-card'; import { Loading } from './loading'; import { MiniTabs } from './mini-tabs'; import { Pagination } from './Pagination'; import { ProjectSearchCard } from './project-search-card'; interface SearchWrapperProps { children?: React.ReactNode; // isSearch: boolean; // searchQuery: string; } type IncludeFields = 'files' | 'folders' | 'projects'; // if key provided all true, otherwise only the value with the key is true const include = (key?: IncludeFields) => ({ inclFiles: key ? key === 'files' : true, inclFolders: key ? key === 'folders' : true, inclProjects: key ? key === 'projects' : true, }); const LIMIT = 10; export const SearchWrapper = ({ children }: SearchWrapperProps) => { const { searchQuery, workspace } = useWorkspace(); const [page, setPage] = useState(1); const [{ data, fetching: loading }, searchWorkspace] = useLazyQuery({ query: queries.searchWorkspace, requestPolicy: "network-only", }); const [activeTab, setActiveTab] = useState('Animations'); const isPremium = workspace && workspace.features ? workspace.features['search-workspace-assets'] : false; const first = (key: IncludeFields) => { setPage(1); searchWorkspace({ query: searchQuery, first: LIMIT, ...include(key), }); }; const next = (key: IncludeFields) => { searchWorkspace({ query: searchQuery, first: LIMIT, after: data && data.searchWorkspace && data.searchWorkspace[key] && data.searchWorkspace[key].pageInfo && data.searchWorkspace[key].pageInfo.endCursor, before: null, last: null, ...include(key), }); setPage((pg: number) => pg + 1); }; const prev = (key: IncludeFields) => { searchWorkspace({ query: searchQuery, last: LIMIT, before: data && data.searchWorkspace && data.searchWorkspace[key] && data.searchWorkspace[key].pageInfo && data.searchWorkspace[key].pageInfo.startCursor, after: null, first: null, ...include(key), }); setPage((pg: number) => pg - 1); }; const searching = ; const empty = ( } title="No results found" description="We couldn't find any item based on your search." /> ); const renderFiles = () => { const files = (data && data.searchWorkspace.files && data.searchWorkspace.files.edges) || []; const pageInfo = (data && data.searchWorkspace.files && data.searchWorkspace.files.pageInfo) || []; const totalCount = (data && data.searchWorkspace.files && data.searchWorkspace.files.totalCount) || []; const anyOther = (data && data.searchWorkspace.folders) || (data && data.searchWorkspace.projects); if (loading || anyOther) return searching; if (files.length === 0) return empty; return ( <>
{files.map((file: unknown) => { if (file && file.node && file.node.fileObject && file.node.fileObject.url) { return ( ); } else { return
; } })}
next('files')} prev={() => prev('files')} page={page} total={totalCount} hasNext={pageInfo?.hasNextPage || false} hasPrev={pageInfo?.hasPreviousPage || false} /> ); }; const renderFolders = () => { const folders = (data && data.searchWorkspace.folders && data.searchWorkspace.folders.edges) || []; const pageInfo = (data && data.searchWorkspace.folders && data.searchWorkspace.folders.pageInfo) || []; const totalCount = (data && data.searchWorkspace.folders && data.searchWorkspace.folders.totalCount) || []; const anyOther = (data && data.searchWorkspace.files) || (data && data.searchWorkspace.projects); if (loading || anyOther) return searching; if (folders.length === 0) return empty; return ( <>
{folders.map((folder: unknown) => ( ))}
next('folders')} prev={() => prev('folders')} page={page} total={totalCount} hasNext={pageInfo?.hasNextPage || false} hasPrev={pageInfo?.hasPreviousPage || false} /> ); }; const renderProjects = () => { const projects = (data && data.searchWorkspace.projects && data.searchWorkspace.projects.edges) || []; const pageInfo = (data && data.searchWorkspace.projects && data.searchWorkspace.projects.pageInfo) || []; const totalCount = (data && data.searchWorkspace.projects && data.searchWorkspace.projects.totalCount) || []; const anyOther = (data && data.searchWorkspace.files) || (data && data.searchWorkspace.folders); if (loading || anyOther) return searching; if (projects.length === 0) return empty; return (
{projects.map((project: unknown) => ( ))} next('projects')} prev={() => prev('projects')} page={page} total={totalCount} hasNext={pageInfo?.hasNextPage || false} hasPrev={pageInfo?.hasPreviousPage || false} />
); }; const renderSearch = () => { if (!isPremium) { return (
{children}
); } // const fileCount = (data && data.searchWorkspace.files && data.searchWorkspace.files.totalCount) || 0; // const folderCount = (data && data.searchWorkspace.folders && data.searchWorkspace.folders.totalCount) || 0; // const projectCount = (data && data.searchWorkspace.projects && data.searchWorkspace.projects.totalCount) || 0; return ( { if (tab.startsWith('Animations')) { first('files'); setActiveTab('Animations'); } else if (tab.startsWith('Folders')) { first('folders'); setActiveTab('Folders'); } else if (tab.startsWith('Projects')) { first('projects'); setActiveTab('Projects'); } }} tabs={[ { name: `Animations`, children: renderFiles(), }, { name: `Folders`, children: renderFolders(), }, { name: `Projects`, children: renderProjects(), }, ]} /> ); }; React.useEffect(() => { if (searchQuery) { if (activeTab === 'Animations') { first('files'); } else if (activeTab === 'Folders') { first('folders'); } else if (activeTab === 'Projects') { first('projects'); } } }, [searchQuery, activeTab]); return ( <>
{searchQuery ? renderSearch() : children}
); };