From 8f4cf7e948edbd2634c07f8e43a058854e0ec353 Mon Sep 17 00:00:00 2001 From: Ren Amamiya <123083837+reyamir@users.noreply.github.com> Date: Thu, 20 Jul 2023 17:14:32 +0700 Subject: [PATCH] fix errors --- package.json | 3 - pnpm-lock.yaml | 102 +---------- src/app/space/components/blocks/hashtag.tsx | 2 +- src/app/space/components/blocks/user.tsx | 187 +++++++++----------- src/shared/notes/kinds/repost.tsx | 6 +- src/shared/notes/kinds/sub.tsx | 4 +- src/shared/notes/skeleton.tsx | 10 +- src/shared/userProfile.tsx | 115 ++++++++++++ src/utils/hooks/useEvent.tsx | 2 +- src/utils/hooks/useSocial.tsx | 6 +- 10 files changed, 214 insertions(+), 223 deletions(-) create mode 100644 src/shared/userProfile.tsx diff --git a/package.json b/package.json index 034b2fff..cd9baee8 100644 --- a/package.json +++ b/package.json @@ -44,9 +44,6 @@ "react-string-replace": "^1.1.1", "react-virtuoso": "^4.4.1", "remark-gfm": "^3.0.1", - "slate": "^0.94.1", - "slate-history": "^0.93.0", - "slate-react": "^0.97.2", "tailwind-merge": "^1.14.0", "tauri-plugin-autostart-api": "github:tauri-apps/tauri-plugin-autostart#v1", "tauri-plugin-sql-api": "github:tauri-apps/tauri-plugin-sql", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6ca71662..647d1029 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -85,15 +85,6 @@ dependencies: remark-gfm: specifier: ^3.0.1 version: 3.0.1 - slate: - specifier: ^0.94.1 - version: 0.94.1 - slate-history: - specifier: ^0.93.0 - version: 0.93.0(slate@0.94.1) - slate-react: - specifier: ^0.97.2 - version: 0.97.2(react-dom@18.2.0)(react@18.2.0)(slate@0.94.1) tailwind-merge: specifier: ^1.14.0 version: 1.14.0 @@ -875,10 +866,6 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@juggle/resize-observer@3.4.0: - resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} - dev: false - /@noble/curves@1.0.0: resolution: {integrity: sha512-2upgEu0iLiDVDZkNLeFV2+ht0BAVgQnEmCk6JsOch9Rp8xfkMCbvbAZlA2pBHQc73dbl+vFOXfqkf4uemdn0bw==} dependencies: @@ -1800,10 +1787,6 @@ packages: '@types/unist': 2.0.7 dev: false - /@types/is-hotkey@0.1.7: - resolution: {integrity: sha512-yB5C7zcOM7idwYZZ1wKQ3pTfjA9BbvFqRWvKB46GFddxnJtHwi/b9y84ykQtxQPg5qhdpg4Q/kWU3EGoCTmLzQ==} - dev: false - /@types/json-schema@7.0.12: resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} @@ -1811,10 +1794,6 @@ packages: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: false - /@types/lodash@4.14.195: - resolution: {integrity: sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==} - dev: false - /@types/mdast@3.0.12: resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} dependencies: @@ -2273,7 +2252,7 @@ packages: hasBin: true dependencies: caniuse-lite: 1.0.30001517 - electron-to-chromium: 1.4.465 + electron-to-chromium: 1.4.466 node-releases: 2.0.13 update-browserslist-db: 1.0.11(browserslist@4.21.9) dev: true @@ -2480,10 +2459,6 @@ packages: engines: {node: '>= 6'} dev: true - /compute-scroll-into-view@1.0.20: - resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} - dev: false - /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -2684,11 +2659,6 @@ packages: dependencies: path-type: 4.0.0 - /direction@1.0.4: - resolution: {integrity: sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==} - hasBin: true - dev: false - /dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} dev: true @@ -2735,8 +2705,8 @@ packages: /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - /electron-to-chromium@1.4.465: - resolution: {integrity: sha512-XQcuHvEJRMU97UJ75e170mgcITZoz0lIyiaVjk6R+NMTJ8KBIvUHYd1779swgOppUlzxR+JsLpq59PumaXS1jQ==} + /electron-to-chromium@1.4.466: + resolution: {integrity: sha512-TSkRvbXRXD8BwhcGlZXDsbI2lRoP8dvqR7LQnqQNk9KxXBc4tG8O+rTuXgTyIpEdiqSGKEBSqrxdqEntnjNncA==} dev: true /emoji-regex@8.0.0: @@ -3649,10 +3619,6 @@ packages: resolution: {integrity: sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA==} dev: false - /immer@9.0.21: - resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} - dev: false - /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -3783,10 +3749,6 @@ packages: dependencies: is-extglob: 2.1.1 - /is-hotkey@0.1.8: - resolution: {integrity: sha512-qs3NZ1INIS+H+yeo7cD9pDfwYV/jqRh1JG9S9zYrNudkoUQg7OL7ziXqRKu+InFjUIDoP2o6HIkLYMh1pcWgyQ==} - dev: false - /is-lambda@1.0.1: resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} dev: false @@ -3819,11 +3781,6 @@ packages: engines: {node: '>=12'} dev: false - /is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - dev: false - /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -4086,6 +4043,7 @@ packages: /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true /log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} @@ -5713,12 +5671,6 @@ packages: loose-envify: 1.4.0 dev: false - /scroll-into-view-if-needed@2.2.31: - resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} - dependencies: - compute-scroll-into-view: 1.0.20 - dev: false - /semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -5784,44 +5736,6 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - /slate-history@0.93.0(slate@0.94.1): - resolution: {integrity: sha512-Gr1GMGPipRuxIz41jD2/rbvzPj8eyar56TVMyJBvBeIpQSSjNISssvGNDYfJlSWM8eaRqf6DAcxMKzsLCYeX6g==} - peerDependencies: - slate: '>=0.65.3' - dependencies: - is-plain-object: 5.0.0 - slate: 0.94.1 - dev: false - - /slate-react@0.97.2(react-dom@18.2.0)(react@18.2.0)(slate@0.94.1): - resolution: {integrity: sha512-jVUbTU+0MnbT7l09thQnWfM7gneTFGMsybmXX9utryQnbttKwIo3NynPI6chGwiz0N4/6k5Yb4fc8N/eZkYHUw==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - slate: '>=0.65.3' - dependencies: - '@juggle/resize-observer': 3.4.0 - '@types/is-hotkey': 0.1.7 - '@types/lodash': 4.14.195 - direction: 1.0.4 - is-hotkey: 0.1.8 - is-plain-object: 5.0.0 - lodash: 4.17.21 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - scroll-into-view-if-needed: 2.2.31 - slate: 0.94.1 - tiny-invariant: 1.0.6 - dev: false - - /slate@0.94.1: - resolution: {integrity: sha512-GH/yizXr1ceBoZ9P9uebIaHe3dC/g6Plpf9nlUwnvoyf6V1UOYrRwkabtOCd3ZfIGxomY4P7lfgLr7FPH8/BKA==} - dependencies: - immer: 9.0.21 - is-plain-object: 5.0.0 - tiny-warning: 1.0.3 - dev: false - /slice-ansi@3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} @@ -6137,14 +6051,6 @@ packages: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} dev: true - /tiny-invariant@1.0.6: - resolution: {integrity: sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA==} - dev: false - - /tiny-warning@1.0.3: - resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} - dev: false - /tlds@1.240.0: resolution: {integrity: sha512-1OYJQenswGZSOdRw7Bql5Qu7uf75b+F3HFBXbqnG/ifHa0fev1XcG+3pJf3pA/KC6RtHQzfKgIf1vkMlMG7mtQ==} hasBin: true diff --git a/src/app/space/components/blocks/hashtag.tsx b/src/app/space/components/blocks/hashtag.tsx index 5dd2fcc5..33e14fa7 100644 --- a/src/app/space/components/blocks/hashtag.tsx +++ b/src/app/space/components/blocks/hashtag.tsx @@ -40,7 +40,7 @@ export function HashtagBlock({ params }: { params: Block }) { > {status === 'loading' ? (
-
+
diff --git a/src/app/space/components/blocks/user.tsx b/src/app/space/components/blocks/user.tsx index 0aad51c2..b26a8dda 100644 --- a/src/app/space/components/blocks/user.tsx +++ b/src/app/space/components/blocks/user.tsx @@ -1,125 +1,100 @@ -import { useEffect, useState } from 'react'; -import { Link } from 'react-router-dom'; +import { useQuery } from '@tanstack/react-query'; +import { useVirtualizer } from '@tanstack/react-virtual'; +import { useRef } from 'react'; -import { UserFeed } from '@app/user/components/feed'; -import { UserMetadata } from '@app/user/components/metadata'; +import { useNDK } from '@libs/ndk/provider'; -import { ZapIcon } from '@shared/icons'; -import { Image } from '@shared/image'; +import { NoteKind_1, NoteSkeleton } from '@shared/notes'; import { TitleBar } from '@shared/titleBar'; +import { UserProfile } from '@shared/userProfile'; -import { DEFAULT_AVATAR } from '@stores/constants'; - -import { useProfile } from '@utils/hooks/useProfile'; -import { useSocial } from '@utils/hooks/useSocial'; -import { shortenKey } from '@utils/shortenKey'; -import { Block } from '@utils/types'; +import { nHoursAgo } from '@utils/date'; +import { Block, LumeEvent } from '@utils/types'; export function UserBlock({ params }: { params: Block }) { - const { user } = useProfile(params.content); - const { status, userFollows, follow, unfollow } = useSocial(); + const parentRef = useRef(null); - const [followed, setFollowed] = useState(false); + const { fetcher, relayUrls } = useNDK(); + const { status, data } = useQuery(['user-feed', params.content], async () => { + const events = await fetcher.fetchAllEvents( + relayUrls, + { kinds: [1], authors: [params.content] }, + { since: nHoursAgo(48) }, + { sort: true } + ); + return events as unknown as LumeEvent[]; + }); - const followUser = (pubkey: string) => { - try { - follow(pubkey); + const rowVirtualizer = useVirtualizer({ + count: data ? data.length : 0, + getScrollElement: () => parentRef.current, + estimateSize: () => 400, + }); - // update state - setFollowed(true); - } catch (error) { - console.log(error); - } - }; - - const unfollowUser = (pubkey: string) => { - try { - unfollow(pubkey); - - // update state - setFollowed(false); - } catch (error) { - console.log(error); - } - }; - - useEffect(() => { - if (status === 'success' && userFollows) { - if (userFollows.includes(params.content)) { - setFollowed(true); - } - } - }, [status]); + const itemsVirtualizer = rowVirtualizer.getVirtualItems(); return (
-
+
- {params.content} -
-
-
- {user?.displayName || user?.name || 'No name'} -
- - {user?.nip05 || shortenKey(params.content)} - -
-
-

- {user?.about} -

- -
-
- {status === 'loading' ? ( - - ) : followed ? ( - - ) : ( - - )} - - Message - - -
-
+
-

Timeline

- +

+ Latest activities +

+
+ {status === 'loading' ? ( +
+
+ +
+
+ ) : itemsVirtualizer.length === 0 ? ( +
+
+
+

+ No new posts about this hashtag in 48 hours ago +

+
+
+
+ ) : ( +
+
+ {itemsVirtualizer.map((virtualRow) => ( +
+ +
+ ))} +
+
+ )} +
diff --git a/src/shared/notes/kinds/repost.tsx b/src/shared/notes/kinds/repost.tsx index 15f9759f..6b92eddb 100644 --- a/src/shared/notes/kinds/repost.tsx +++ b/src/shared/notes/kinds/repost.tsx @@ -37,16 +37,16 @@ export function Repost({ event }: { event: LumeEvent }) {
- +
- +
- +
diff --git a/src/shared/notes/kinds/sub.tsx b/src/shared/notes/kinds/sub.tsx index b9ff380e..145afaec 100644 --- a/src/shared/notes/kinds/sub.tsx +++ b/src/shared/notes/kinds/sub.tsx @@ -8,7 +8,7 @@ export function SubNote({ id }: { id: string }) { if (status === 'loading') { return ( -
+
); @@ -16,7 +16,7 @@ export function SubNote({ id }: { id: string }) { if (status === 'error') { return ( -
+

Failed to fetch

); diff --git a/src/shared/notes/skeleton.tsx b/src/shared/notes/skeleton.tsx index 3f417f03..4875328d 100644 --- a/src/shared/notes/skeleton.tsx +++ b/src/shared/notes/skeleton.tsx @@ -2,16 +2,16 @@ export function NoteSkeleton() { return (
-
+
-
+
-
-
-
+
+
+
diff --git a/src/shared/userProfile.tsx b/src/shared/userProfile.tsx new file mode 100644 index 00000000..9163607d --- /dev/null +++ b/src/shared/userProfile.tsx @@ -0,0 +1,115 @@ +import { useEffect, useState } from 'react'; +import { Link } from 'react-router-dom'; + +import { UserMetadata } from '@app/user/components/metadata'; + +import { ZapIcon } from '@shared/icons'; +import { Image } from '@shared/image'; + +import { DEFAULT_AVATAR } from '@stores/constants'; + +import { useProfile } from '@utils/hooks/useProfile'; +import { useSocial } from '@utils/hooks/useSocial'; +import { displayNpub } from '@utils/shortenKey'; + +export function UserProfile({ pubkey }: { pubkey: string }) { + const { user } = useProfile(pubkey); + const { status, userFollows, follow, unfollow } = useSocial(); + + const [followed, setFollowed] = useState(false); + + const followUser = (pubkey: string) => { + try { + follow(pubkey); + + // update state + setFollowed(true); + } catch (error) { + console.log(error); + } + }; + + const unfollowUser = (pubkey: string) => { + try { + unfollow(pubkey); + + // update state + setFollowed(false); + } catch (error) { + console.log(error); + } + }; + + useEffect(() => { + if (status === 'success' && userFollows) { + if (userFollows.includes(pubkey)) { + setFollowed(true); + } + } + }, [status]); + + return ( +
+ {pubkey} +
+
+
+ {user?.displayName || user?.name || 'No name'} +
+ + {user?.nip05 || displayNpub(pubkey, 16)} + +
+
+

+ {user?.about} +

+ +
+
+ {status === 'loading' ? ( + + ) : followed ? ( + + ) : ( + + )} + + Message + + +
+
+
+ ); +} diff --git a/src/utils/hooks/useEvent.tsx b/src/utils/hooks/useEvent.tsx index 06f4f4a2..4b257b28 100644 --- a/src/utils/hooks/useEvent.tsx +++ b/src/utils/hooks/useEvent.tsx @@ -47,7 +47,7 @@ export function useEvent(id: string, fallback?: string) { } return event; } else { - return null; + throw new Error('Event not found'); } } } diff --git a/src/utils/hooks/useSocial.tsx b/src/utils/hooks/useSocial.tsx index 5a3062e6..2b241f1c 100644 --- a/src/utils/hooks/useSocial.tsx +++ b/src/utils/hooks/useSocial.tsx @@ -1,20 +1,18 @@ -import { NDKEvent, NDKFilter } from '@nostr-dev-kit/ndk'; import { useQuery, useQueryClient } from '@tanstack/react-query'; import { useNDK } from '@libs/ndk/provider'; import { createNote } from '@libs/storage'; -import { dateToUnix, getHourAgo, nHoursAgo } from '@utils/date'; +import { nHoursAgo } from '@utils/date'; import { useAccount } from '@utils/hooks/useAccount'; import { usePublish } from '@utils/hooks/usePublish'; import { nip02ToArray } from '@utils/transform'; -import { LumeEvent } from '@utils/types'; export function useSocial() { const queryClient = useQueryClient(); const publish = usePublish(); - const { ndk, fetcher, relayUrls } = useNDK(); + const { fetcher, relayUrls } = useNDK(); const { account } = useAccount(); const { status, data: userFollows } = useQuery( ['userFollows', account.pubkey],