From ac50cd1373327cf0ba60e6d9bfc8fb6103e6ad2e Mon Sep 17 00:00:00 2001 From: Ren Amamiya <123083837+reyamir@users.noreply.github.com> Date: Fri, 4 Aug 2023 08:51:26 +0700 Subject: [PATCH] polish --- package.json | 2 +- pnpm-lock.yaml | 32 ++++----- src/app/space/components/blocks/thread.tsx | 2 +- src/app/space/components/blocks/user.tsx | 2 +- src/shared/notes/content.tsx | 10 ++- src/shared/notes/kinds/repost.tsx | 2 +- src/shared/notes/kinds/sub.tsx | 4 +- src/shared/notes/mentions/note.tsx | 16 +++-- src/shared/notes/mentions/user.tsx | 6 +- src/shared/notes/metadata.tsx | 2 +- src/shared/notes/replies/list.tsx | 2 +- src/shared/user.tsx | 2 +- src/shared/userProfile.tsx | 6 -- src/utils/hooks/useEvent.tsx | 77 ++++++++++++---------- src/utils/hooks/useProfile.tsx | 14 ++-- src/utils/parser.tsx | 7 ++ 16 files changed, 108 insertions(+), 78 deletions(-) diff --git a/package.json b/package.json index c34c012f..d1c89b19 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "@tauri-apps/cli": "2.0.0-alpha.10", "@trivago/prettier-plugin-sort-imports": "^4.2.0", "@types/html-to-text": "^9.0.1", - "@types/node": "^18.17.1", + "@types/node": "^18.17.2", "@types/react": "^18.2.18", "@types/react-dom": "^18.2.7", "@types/youtube-player": "^5.5.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a52326b9..af13d821 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -190,8 +190,8 @@ devDependencies: specifier: ^9.0.1 version: 9.0.1 '@types/node': - specifier: ^18.17.1 - version: 18.17.1 + specifier: ^18.17.2 + version: 18.17.2 '@types/react': specifier: ^18.2.18 version: 18.2.18 @@ -269,7 +269,7 @@ devDependencies: version: 4.9.5 vite: specifier: ^4.4.8 - version: 4.4.8(@types/node@18.17.1) + version: 4.4.8(@types/node@18.17.2) vite-plugin-top-level-await: specifier: ^1.3.1 version: 1.3.1(vite@4.4.8) @@ -2437,8 +2437,8 @@ packages: resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} dev: false - /@types/node@18.17.1: - resolution: {integrity: sha512-xlR1jahfizdplZYRU59JlUx9uzF1ARa8jbhM11ccpCJya8kvos5jwdm2ZAgxSCwOl0fq21svP18EVwPBXMQudw==} + /@types/node@18.17.2: + resolution: {integrity: sha512-wBo3KqP/PBqje5TI9UTiuL3yWfP6sdPtjtygSOqcYZWT232dfDeDOnkDps5wqZBP9NgGgYrNejinl0faAuE+HQ==} dev: true /@types/normalize-package-data@2.4.1: @@ -2614,7 +2614,7 @@ packages: vite: ^4 dependencies: '@swc/core': 1.3.74 - vite: 4.4.8(@types/node@18.17.1) + vite: 4.4.8(@types/node@18.17.2) transitivePeerDependencies: - '@swc/helpers' dev: true @@ -2912,7 +2912,7 @@ packages: hasBin: true dependencies: caniuse-lite: 1.0.30001519 - electron-to-chromium: 1.4.482 + electron-to-chromium: 1.4.484 node-releases: 2.0.13 update-browserslist-db: 1.0.11(browserslist@4.21.10) @@ -3389,8 +3389,8 @@ packages: /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - /electron-to-chromium@1.4.482: - resolution: {integrity: sha512-h+UqpfmEr1Qkk0zp7ej/jid7CXoq4m4QzW6wNTb0ELJ/BZCpA4wgUylBIMGCe621tnr4l5VmoHjdoSx2lbnNJA==} + /electron-to-chromium@1.4.484: + resolution: {integrity: sha512-nO3ZEomTK2PO/3TUXgEx0A97xZTpKVf4p427lABHuCpT1IQ2N+njVh29DkQkCk6Q4m2wjU+faK4xAcfFndwjvw==} /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -6586,8 +6586,8 @@ packages: dependencies: glob: 7.2.3 - /rollup@3.27.0: - resolution: {integrity: sha512-aOltLCrYZ0FhJDm7fCqwTjIUEVjWjcydKBV/Zeid6Mn8BWgDCUBBWT5beM5ieForYNo/1ZHuGJdka26kvQ3Gzg==} + /rollup@3.27.1: + resolution: {integrity: sha512-tXNDFwOkN6C2w5Blj1g6ForKeFw6c1mDu5jxoeDO3/pmYjgt+8yvIFjKzH5FQUq70OKZBkOt0zzv0THXL7vwzQ==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: @@ -7455,7 +7455,7 @@ packages: '@rollup/plugin-virtual': 3.0.1 '@swc/core': 1.3.74 uuid: 9.0.0 - vite: 4.4.8(@types/node@18.17.1) + vite: 4.4.8(@types/node@18.17.2) transitivePeerDependencies: - '@swc/helpers' - rollup @@ -7472,13 +7472,13 @@ packages: debug: 4.3.4 globrex: 0.1.2 tsconfck: 2.1.2(typescript@4.9.5) - vite: 4.4.8(@types/node@18.17.1) + vite: 4.4.8(@types/node@18.17.2) transitivePeerDependencies: - supports-color - typescript dev: true - /vite@4.4.8(@types/node@18.17.1): + /vite@4.4.8(@types/node@18.17.2): resolution: {integrity: sha512-LONawOUUjxQridNWGQlNizfKH89qPigK36XhMI7COMGztz8KNY0JHim7/xDd71CZwGT4HtSRgI7Hy+RlhG0Gvg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -7506,10 +7506,10 @@ packages: terser: optional: true dependencies: - '@types/node': 18.17.1 + '@types/node': 18.17.2 esbuild: 0.18.17 postcss: 8.4.27 - rollup: 3.27.0 + rollup: 3.27.1 optionalDependencies: fsevents: 2.3.2 dev: true diff --git a/src/app/space/components/blocks/thread.tsx b/src/app/space/components/blocks/thread.tsx index 4bd33794..7e21efe6 100644 --- a/src/app/space/components/blocks/thread.tsx +++ b/src/app/space/components/blocks/thread.tsx @@ -22,7 +22,7 @@ export function ThreadBlock({ params }: { params: Block }) { // useLiveThread(params.content); return ( -
+
{status === 'loading' ? ( diff --git a/src/app/space/components/blocks/user.tsx b/src/app/space/components/blocks/user.tsx index 4604d6c8..4fb78569 100644 --- a/src/app/space/components/blocks/user.tsx +++ b/src/app/space/components/blocks/user.tsx @@ -45,7 +45,7 @@ export function UserBlock({ params }: { params: Block }) {
-

+

Latest activities

diff --git a/src/shared/notes/content.tsx b/src/shared/notes/content.tsx index 9b315961..c874f3a8 100644 --- a/src/shared/notes/content.tsx +++ b/src/shared/notes/content.tsx @@ -12,7 +12,15 @@ import { import { Content } from '@utils/types'; -export function NoteContent({ content }: { content: Content }) { +export function NoteContent({ content, long }: { content: Content; long?: boolean }) { + if (long) { + return ( + + {content as unknown as string} + + ); + } + return ( <> -

Failed to fetch

+

Failed to fetch event: {repostID}

); } diff --git a/src/shared/notes/kinds/sub.tsx b/src/shared/notes/kinds/sub.tsx index e2f6e527..9f9709f7 100644 --- a/src/shared/notes/kinds/sub.tsx +++ b/src/shared/notes/kinds/sub.tsx @@ -17,7 +17,7 @@ export function SubNote({ id, root }: { id: string; root?: string }) { if (status === 'error') { return (
-

Failed to fetch

+

Failed to fetch event: {id}

); } @@ -30,7 +30,7 @@ export function SubNote({ id, root }: { id: string; root?: string }) {
- +
diff --git a/src/shared/notes/mentions/note.tsx b/src/shared/notes/mentions/note.tsx index 06c3db58..537c4bd7 100644 --- a/src/shared/notes/mentions/note.tsx +++ b/src/shared/notes/mentions/note.tsx @@ -23,6 +23,14 @@ export const MentionNote = memo(function MentionNote({ id }: { id: string }) { } }; + if (!id) { + return ( +
+

Failed to fetch event: {id}

+
+ ); + } + return (
openThread(e, id)} @@ -56,14 +64,14 @@ export const MentionNote = memo(function MentionNote({ id }: { id: string }) { }, }} > - {data?.content?.parsed?.length > 160 - ? data.content.parsed.substring(0, 160) + '...' - : data.content.parsed} + {data?.content?.original?.length > 160 + ? data.content.original.substring(0, 160) + '...' + : data.content.original}
) : ( -

Failed to fetch event

+

Failed to fetch event: {id}

)}
); diff --git a/src/shared/notes/mentions/user.tsx b/src/shared/notes/mentions/user.tsx index 798d2ae7..0aa673a7 100644 --- a/src/shared/notes/mentions/user.tsx +++ b/src/shared/notes/mentions/user.tsx @@ -20,7 +20,11 @@ export function MentionUser({ pubkey }: { pubkey: string }) { } className="break-words font-normal text-blue-400 no-underline hover:text-blue-500" > - {'@' + user?.name || user?.displayName || displayNpub(pubkey, 16)} + {user?.nip05 || + user?.name || + user?.display_name || + user?.username || + displayNpub(pubkey, 16)} ); } diff --git a/src/shared/notes/metadata.tsx b/src/shared/notes/metadata.tsx index a7331dcf..b3824091 100644 --- a/src/shared/notes/metadata.tsx +++ b/src/shared/notes/metadata.tsx @@ -61,7 +61,7 @@ export function NoteMetadata({ id }: { id: string }) { return { replies, users, zap }; }, - { refetchOnWindowFocus: false, refetchOnReconnect: false } + { refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false } ); if (status === 'loading') { diff --git a/src/shared/notes/replies/list.tsx b/src/shared/notes/replies/list.tsx index af861716..7a5a7891 100644 --- a/src/shared/notes/replies/list.tsx +++ b/src/shared/notes/replies/list.tsx @@ -43,7 +43,7 @@ export function RepliesList({ id }: { id: string }) { return (
-
+
diff --git a/src/shared/user.tsx b/src/shared/user.tsx index 4afe4210..a3bf6b03 100644 --- a/src/shared/user.tsx +++ b/src/shared/user.tsx @@ -93,7 +93,7 @@ export function User({
diff --git a/src/shared/userProfile.tsx b/src/shared/userProfile.tsx index 75856def..dd438283 100644 --- a/src/shared/userProfile.tsx +++ b/src/shared/userProfile.tsx @@ -102,12 +102,6 @@ export function UserProfile({ pubkey }: { pubkey: string }) { > Message -
diff --git a/src/utils/hooks/useEvent.tsx b/src/utils/hooks/useEvent.tsx index 6ac3ad4e..c27881c6 100644 --- a/src/utils/hooks/useEvent.tsx +++ b/src/utils/hooks/useEvent.tsx @@ -8,47 +8,56 @@ import { LumeEvent } from '@utils/types'; export function useEvent(id: string, fallback?: string) { const { ndk } = useNDK(); - const { status, data, error, isFetching } = useQuery(['note', id], async () => { - const result = await getNoteByID(id); - if (result) { - return result as LumeEvent; - } else { - if (fallback) { - const embed: LumeEvent = JSON.parse(fallback); - embed['event_id'] = embed.id; - await createNote( - embed.id, - embed.pubkey, - embed.kind, - embed.tags, - embed.content as unknown as string, - embed.created_at - ); - return embed; + const { status, data, error, isFetching } = useQuery( + ['note', id], + async () => { + const result = await getNoteByID(id); + if (result) { + return result as LumeEvent; } else { - const event = await ndk.fetchEvent(id); - if (event) { + if (fallback) { + const embed: LumeEvent = JSON.parse(fallback); + embed['event_id'] = embed.id; await createNote( - event.id, - event.pubkey, - event.kind, - event.tags, - event.content, - event.created_at + embed.id, + embed.pubkey, + embed.kind, + embed.tags, + embed.content as unknown as string, + embed.created_at ); - event['event_id'] = event.id; - if (event.kind === 1) { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - event['content'] = parser(event); - } - return event as unknown as LumeEvent; + return embed; } else { - throw new Error('Event not found'); + const event = await ndk.fetchEvent(id); + if (event) { + await createNote( + event.id, + event.pubkey, + event.kind, + event.tags, + event.content, + event.created_at + ); + event['event_id'] = event.id; + if (event.kind === 1) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + event['content'] = parser(event); + } + return event as unknown as LumeEvent; + } else { + throw new Error('Event not found'); + } } } + }, + { + staleTime: Infinity, + refetchOnMount: false, + refetchOnWindowFocus: false, + refetchOnReconnect: false, } - }); + ); return { status, data, error, isFetching }; } diff --git a/src/utils/hooks/useProfile.tsx b/src/utils/hooks/useProfile.tsx index e18f4a31..c815a0ac 100644 --- a/src/utils/hooks/useProfile.tsx +++ b/src/utils/hooks/useProfile.tsx @@ -1,4 +1,3 @@ -import { NDKFilter } from '@nostr-dev-kit/ndk'; import { useQuery } from '@tanstack/react-query'; import { useNDK } from '@libs/ndk/provider'; @@ -15,12 +14,12 @@ export function useProfile(pubkey: string, fallback?: string) { ['user', pubkey], async () => { if (!fallback) { - const filter: NDKFilter = { kinds: [0], authors: [pubkey] }; - const events = await ndk.fetchEvents(filter); - const latest = [...events].sort((a, b) => b.created_at - a.created_at).pop(); - if (latest) { - await createMetadata(latest.id, latest.pubkey, latest.content); - return JSON.parse(latest.content); + const user = await ndk.getUser({ hexpubkey: pubkey }); + await user.fetchProfile(); + if (user.profile) { + user.profile.display_name = user.profile.displayName; + await createMetadata(user.npub, pubkey, JSON.stringify(user.profile)); + return user.profile; } else { throw new Error('User not found'); } @@ -30,6 +29,7 @@ export function useProfile(pubkey: string, fallback?: string) { } }, { + staleTime: Infinity, refetchOnMount: false, refetchOnWindowFocus: false, refetchOnReconnect: false, diff --git a/src/utils/parser.tsx b/src/utils/parser.tsx index 714f06df..b12b9f89 100644 --- a/src/utils/parser.tsx +++ b/src/utils/parser.tsx @@ -5,6 +5,8 @@ import ReactPlayer from 'react-player'; import { Content, LumeEvent } from '@utils/types'; export function parser(event: LumeEvent) { + if (event.kind !== 1) return; + const references = parseReferences(event as unknown as Event); const urls = getUrls(event.content as unknown as string); @@ -49,6 +51,7 @@ export function parser(event: LumeEvent) { references?.forEach((item) => { const profile = item.profile; const event = item.event; + const addr = item.address; if (event) { content.notes.push(event.id); content.parsed = content.parsed.replace(item.text, ''); @@ -56,6 +59,10 @@ export function parser(event: LumeEvent) { if (profile) { content.parsed = content.parsed.replace(item.text, `~pub${item.profile.pubkey}~`); } + if (addr) { + content.notes.push(addr.identifier); + content.parsed = content.parsed.replace(item.text, ''); + } }); return content;