From e9c2504c5659e5c70c6a9e39fabab32275640f3a Mon Sep 17 00:00:00 2001 From: AkiraFukushima Date: Mon, 24 Jun 2024 01:29:28 +0900 Subject: [PATCH] refs #4792 Implement search for accounts --- renderer/components/timelines/Search.tsx | 26 ++++++-- .../components/timelines/search/Accounts.tsx | 66 +++++++++++++++++++ .../components/timelines/search/Statuses.tsx | 11 +++- 3 files changed, 95 insertions(+), 8 deletions(-) create mode 100644 renderer/components/timelines/search/Accounts.tsx diff --git a/renderer/components/timelines/Search.tsx b/renderer/components/timelines/Search.tsx index 26bcfcde..017a7a21 100644 --- a/renderer/components/timelines/Search.tsx +++ b/renderer/components/timelines/Search.tsx @@ -6,6 +6,7 @@ import { FaMagnifyingGlass } from 'react-icons/fa6' import { FormattedMessage, useIntl } from 'react-intl' import Statuses from './search/Statuses' import { Account } from '@/db' +import Accounts from './search/Accounts' type Props = { client: MegalodonInterface @@ -24,6 +25,7 @@ export default function Search(props: Props) { hashtags: [], statuses: [] }) + const [loading, setLoading] = useState(false) useEffect(() => { if (router.query.q) { @@ -33,14 +35,20 @@ export default function Search(props: Props) { }, [router.query.q]) const search = (query: string) => { + setLoading(true) setResults({ accounts: [], hashtags: [], statuses: [] }) - props.client.search(query).then(res => { - setResults(res.data) - }) + props.client + .search(query) + .then(res => { + setResults(res.data) + }) + .finally(() => { + setLoading(false) + }) } const submit = (ev: FormEvent) => { @@ -91,9 +99,17 @@ export default function Search(props: Props) { - + + + + - accounts hashtags diff --git a/renderer/components/timelines/search/Accounts.tsx b/renderer/components/timelines/search/Accounts.tsx new file mode 100644 index 00000000..6215db05 --- /dev/null +++ b/renderer/components/timelines/search/Accounts.tsx @@ -0,0 +1,66 @@ +import { Avatar, Spinner } from '@material-tailwind/react' +import { Entity, MegalodonInterface } from 'megalodon' +import emojify from '@/utils/emojify' +import { Virtuoso } from 'react-virtuoso' +import { useRouter } from 'next/router' + +type Props = { + client: MegalodonInterface + users: Array + loading: boolean +} + +export default function Accounts(props: Props) { + const router = useRouter() + + const openUser = (id: string) => { + router.push({ query: { id: router.query.id, timeline: router.query.timeline, user_id: id, detail: true } }) + } + + return ( + <> +
+ {props.users.length > 0 ? ( + } + /> + ) : ( + <> + {props.loading && ( +
+ +
+ )} + + )} +
+ + ) +} + +type UserProps = { + user: Entity.Account + openUser: (id: string) => void +} + +function User(props: UserProps) { + return ( +
+
props.openUser(props.user.id)}> +
+ +
+
+

+

@{props.user.acct}

+
+
+
+ ) +} diff --git a/renderer/components/timelines/search/Statuses.tsx b/renderer/components/timelines/search/Statuses.tsx index 23c7bed0..4f214dc5 100644 --- a/renderer/components/timelines/search/Statuses.tsx +++ b/renderer/components/timelines/search/Statuses.tsx @@ -8,6 +8,7 @@ type Props = { client: MegalodonInterface account: Account statuses: Array + loading: boolean openMedia: (media: Array, index: number) => void } @@ -33,9 +34,13 @@ export default function Statuses(props: Props) { )} /> ) : ( -
- -
+ <> + {props.loading && ( +
+ +
+ )} + )}