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' ? (
+
+ ) : (
+
+
+
+
+
+ {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 (
+
+ );
+}
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() {