From 6c4a2976971c16a2c5e1ea7c221b1247acecac35 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Wed, 27 Dec 2023 14:20:36 -0800 Subject: [PATCH] Added search to websites dropdown. --- src/components/common/Empty.module.css | 1 + src/components/input/WebsiteSelect.tsx | 46 ++++++++++++++++++++------ src/lib/types.ts | 2 +- src/pages/api/websites/index.ts | 4 --- src/queries/admin/website.ts | 6 ++-- 5 files changed, 41 insertions(+), 18 deletions(-) diff --git a/src/components/common/Empty.module.css b/src/components/common/Empty.module.css index 29e9f8eb..3dccb68e 100644 --- a/src/components/common/Empty.module.css +++ b/src/components/common/Empty.module.css @@ -8,4 +8,5 @@ text-align: center; width: 100%; height: 100%; + min-height: 70px; } diff --git a/src/components/input/WebsiteSelect.tsx b/src/components/input/WebsiteSelect.tsx index 3a6ca272..9dd3dd61 100644 --- a/src/components/input/WebsiteSelect.tsx +++ b/src/components/input/WebsiteSelect.tsx @@ -1,35 +1,61 @@ +import { useState, Key } from 'react'; import { Dropdown, Item } from 'react-basics'; import useApi from 'components/hooks/useApi'; import useMessages from 'components/hooks/useMessages'; import styles from './WebsiteSelect.module.css'; +import Empty from 'components/common/Empty'; export function WebsiteSelect({ websiteId, onSelect, }: { - websiteId: string; + websiteId?: string; onSelect?: (key: any) => void; }) { - const { formatMessage, labels } = useMessages(); + const [query, setQuery] = useState(''); + const [selectedId, setSelectedId] = useState(websiteId); + const { formatMessage, labels, messages } = useMessages(); const { get, useQuery } = useApi(); - const { data } = useQuery({ - queryKey: ['websites:me'], - queryFn: () => get('/me/websites', { pageSize: 100 }), + const { data: websites, isLoading } = useQuery({ + queryKey: ['websites:me', { query }], + queryFn: () => get('/me/websites', { query, pageSize: 5 }), + }); + const { data: website } = useQuery({ + queryKey: ['websites', { selectedId }], + queryFn: () => get(`/websites/${selectedId}`), + enabled: !!selectedId, }); - const renderValue = value => { - return data?.data?.find(({ id }) => id === value)?.name; + const renderValue = () => { + return website?.name; + }; + + const renderEmpty = () => { + return ; + }; + + const handleSelect = (value: any) => { + setSelectedId(value); + onSelect?.(value); + }; + + const handleSearch = (value: string) => { + setQuery(value); }; return ( {({ id, name }) => {name}} diff --git a/src/lib/types.ts b/src/lib/types.ts index af0ea0f7..c4d018a4 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -53,7 +53,7 @@ export interface SearchFilter { } export interface FilterResult { - data: T[]; + data: T; count: number; page: number; pageSize: number; diff --git a/src/pages/api/websites/index.ts b/src/pages/api/websites/index.ts index b30681cf..d0295b87 100644 --- a/src/pages/api/websites/index.ts +++ b/src/pages/api/websites/index.ts @@ -45,10 +45,6 @@ export default async ( req.query.id = userId; } - if (!req.query.pageSize) { - req.query.pageSize = 100; - } - return userWebsites(req as any, res); } diff --git a/src/queries/admin/website.ts b/src/queries/admin/website.ts index 524e2e14..0e7f5124 100644 --- a/src/queries/admin/website.ts +++ b/src/queries/admin/website.ts @@ -21,7 +21,7 @@ export async function getWebsiteByShareId(shareId: string) { export async function getWebsites( filters: WebsiteSearchFilter, options?: { include?: Prisma.WebsiteInclude }, -): Promise> { +): Promise> { const { userId, teamId, includeTeams, onlyTeams, query } = filters; const mode = prisma.getSearchMode(); @@ -105,7 +105,7 @@ export async function getWebsites( export async function getWebsitesByUserId( userId: string, filters?: WebsiteSearchFilter, -): Promise> { +): Promise> { return getWebsites( { userId, ...filters }, { @@ -133,7 +133,7 @@ export async function getWebsitesByUserId( export async function getWebsitesByTeamId( teamId: string, filters?: WebsiteSearchFilter, -): Promise> { +): Promise> { return getWebsites( { teamId,