From c9bc7b81dd79a622c8e601e5f14f860f0bbd6312 Mon Sep 17 00:00:00 2001 From: Ren Amamiya <123083837+reyamir@users.noreply.github.com> Date: Fri, 22 Sep 2023 14:13:55 +0700 Subject: [PATCH] wip: browse user --- src/app.tsx | 23 ++++- src/app/browse/components/userDrawer.tsx | 125 +++++++++++++++++++++++ src/app/browse/index.tsx | 35 ++++++- src/app/browse/relays.tsx | 7 ++ src/app/browse/users.tsx | 22 ++++ src/shared/composer/modal.tsx | 2 +- src/shared/navigation.tsx | 2 +- src/shared/user.tsx | 20 +++- src/shared/widgets/local/thread.tsx | 2 +- src/utils/hooks/useProfile.ts | 2 +- 10 files changed, 229 insertions(+), 11 deletions(-) create mode 100644 src/app/browse/components/userDrawer.tsx create mode 100644 src/app/browse/relays.tsx create mode 100644 src/app/browse/users.tsx diff --git a/src/app.tsx b/src/app.tsx index fae8e0ed..4eb26828 100644 --- a/src/app.tsx +++ b/src/app.tsx @@ -4,6 +4,7 @@ import { RouterProvider, createBrowserRouter, redirect } from 'react-router-dom' import { AuthCreateScreen } from '@app/auth/create'; import { AuthImportScreen } from '@app/auth/import'; import { OnboardingScreen } from '@app/auth/onboarding'; +import { BrowseScreen } from '@app/browse'; import { ErrorScreen } from '@app/error'; import { Frame } from '@shared/frame'; @@ -61,10 +62,24 @@ const router = createBrowserRouter([ }, { path: 'browse', - async lazy() { - const { BrowseScreen } = await import('@app/browse'); - return { Component: BrowseScreen }; - }, + element: , + errorElement: , + children: [ + { + path: '', + async lazy() { + const { BrowseUsersScreen } = await import('@app/browse/users'); + return { Component: BrowseUsersScreen }; + }, + }, + { + path: 'relays', + async lazy() { + const { BrowseRelaysScreen } = await import('@app/browse/relays'); + return { Component: BrowseRelaysScreen }; + }, + }, + ], }, { path: 'users/:pubkey', diff --git a/src/app/browse/components/userDrawer.tsx b/src/app/browse/components/userDrawer.tsx new file mode 100644 index 00000000..63b685a0 --- /dev/null +++ b/src/app/browse/components/userDrawer.tsx @@ -0,0 +1,125 @@ +import * as Dialog from '@radix-ui/react-dialog'; +import { memo, useEffect, useState } from 'react'; +import { Link } from 'react-router-dom'; + +import { useStorage } from '@libs/storage/provider'; + +import { Image } from '@shared/image'; +import { NIP05 } from '@shared/nip05'; +import { TextNote } from '@shared/notes'; +import { User } from '@shared/user'; + +import { useNostr } from '@utils/hooks/useNostr'; +import { useProfile } from '@utils/hooks/useProfile'; +import { displayNpub } from '@utils/shortenKey'; + +export const UserDrawer = memo(function UserDrawer({ pubkey }: { pubkey: string }) { + const { db } = useStorage(); + const { status, user } = useProfile(pubkey); + const { addContact, removeContact } = useNostr(); + + const [followed, setFollowed] = useState(false); + + const followUser = (pubkey: string) => { + try { + addContact(pubkey); + + // update state + setFollowed(true); + } catch (error) { + console.log(error); + } + }; + + const unfollowUser = (pubkey: string) => { + try { + removeContact(pubkey); + + // update state + setFollowed(false); + } catch (error) { + console.log(error); + } + }; + + useEffect(() => { + if (db.account.follows.includes(pubkey)) { + setFollowed(true); + } + }, []); + + return ( + + + + + + +
+ {status === 'loading' ? ( +
+

Loading...

+
+ ) : ( +
+ {pubkey} +
+
+
+ {user?.displayName || user?.name || 'No name'} +
+ {user?.nip05 ? ( + + ) : ( + + {displayNpub(pubkey, 16)} + + )} +
+
+ {user.about ? : null} +
+
+ {followed ? ( + + ) : ( + + )} + + Message + +
+
+
+ )} +
+
+
+
+ ); +}); diff --git a/src/app/browse/index.tsx b/src/app/browse/index.tsx index 34c3ba6d..ecad24dc 100644 --- a/src/app/browse/index.tsx +++ b/src/app/browse/index.tsx @@ -1,7 +1,38 @@ +import { NavLink, Outlet } from 'react-router-dom'; +import { twMerge } from 'tailwind-merge'; + export function BrowseScreen() { return ( -
-

TODO

+
+
+
+
+ + twMerge( + 'inline-flex h-8 w-20 items-center justify-center rounded-full text-sm font-semibold', + isActive ? 'bg-white/10 hover:bg-white/20' : ' hover:bg-white/5' + ) + } + > + Users + + + twMerge( + 'inline-flex h-8 w-20 items-center justify-center rounded-full text-sm font-semibold', + isActive ? 'bg-white/10 hover:bg-white/20' : ' hover:bg-white/5' + ) + } + > + Relays + +
+
+
+
); } diff --git a/src/app/browse/relays.tsx b/src/app/browse/relays.tsx new file mode 100644 index 00000000..203a142e --- /dev/null +++ b/src/app/browse/relays.tsx @@ -0,0 +1,7 @@ +export function BrowseRelaysScreen() { + return ( +
+

TODO

+
+ ); +} diff --git a/src/app/browse/users.tsx b/src/app/browse/users.tsx new file mode 100644 index 00000000..f8504477 --- /dev/null +++ b/src/app/browse/users.tsx @@ -0,0 +1,22 @@ +import { UserDrawer } from '@app/browse/components/userDrawer'; + +import { useStorage } from '@libs/storage/provider'; + +import { User } from '@shared/user'; + +export function BrowseUsersScreen() { + const { db } = useStorage(); + + return ( +
+
+ +
+ {db.account.follows.map((user) => ( + + ))} +
+
+
+ ); +} diff --git a/src/shared/composer/modal.tsx b/src/shared/composer/modal.tsx index 0aa7cbaa..a002c99a 100644 --- a/src/shared/composer/modal.tsx +++ b/src/shared/composer/modal.tsx @@ -28,7 +28,7 @@ export function ComposerModal() {