From 65b699d49d18b32383dfb548ae17f84af974e6af Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Tue, 1 Oct 2024 14:55:33 -0700 Subject: [PATCH] Flesh out people tab --- src/app/components/Content.svelte | 26 ++++++------ src/app/components/ContentQuote.svelte | 15 +++++-- src/app/components/PeopleItem.svelte | 56 ++++++++++++++++++++++++++ src/app/components/Profile.svelte | 26 ++++++++---- src/app/components/ProfileInfo.svelte | 12 ++++++ src/lib/components/Avatar.svelte | 20 ++++----- src/lib/components/WotScore.svelte | 44 ++++++++++++++++++++ src/lib/html.ts | 17 +++++--- src/routes/discover/+page.svelte | 14 ++++--- src/routes/home/+layout.svelte | 5 --- src/routes/home/people/+page.svelte | 45 +++++++++++++++++++++ 11 files changed, 228 insertions(+), 52 deletions(-) create mode 100644 src/app/components/PeopleItem.svelte create mode 100644 src/app/components/ProfileInfo.svelte create mode 100644 src/lib/components/WotScore.svelte diff --git a/src/app/components/Content.svelte b/src/app/components/Content.svelte index 90a02bde..90e4bba8 100644 --- a/src/app/components/Content.svelte +++ b/src/app/components/Content.svelte @@ -17,7 +17,6 @@ isNewline, } from "@welshman/content" import Link from '@lib/components/Link.svelte' - import Button from '@lib/components/Button.svelte' import ContentToken from '@app/components/ContentToken.svelte' import ContentCode from '@app/components/ContentCode.svelte' import ContentLinkInline from '@app/components/ContentLinkInline.svelte' @@ -32,7 +31,7 @@ export let minLength = 500 export let maxLength = 700 export let showEntire = false - export let skipMedia = false + export let hideMedia = false export let expandable = true export let depth = 0 @@ -65,14 +64,11 @@ $: shortContent = showEntire ? fullContent - : truncate( - fullContent.filter(p => !skipMedia || (isLink(p) && p.value.isMedia)), - { - minLength, - maxLength, - mediaLength: 200, - }, - ) + : truncate(fullContent, { + minLength, + maxLength, + mediaLength: hideMedia ? 20 : 200, + }) $: ellipsize = expandable && shortContent.find(isEllipsis) @@ -90,7 +86,7 @@ {:else if isCashu(parsed) || isInvoice(parsed)} {:else if isLink(parsed)} - {#if isStartOrEnd(i)} + {#if isStartOrEnd(i) && !hideMedia} {:else} @@ -98,10 +94,10 @@ {:else if isProfile(parsed)} {:else if isEvent(parsed) || isAddress(parsed)} - {#if isStartOrEnd(i) && depth < 2} + {#if isStartOrEnd(i) && depth < 2 && !hideMedia}
- +
{:else} @@ -120,6 +116,8 @@ {#if ellipsize}
0}> - +
{/if} diff --git a/src/app/components/ContentQuote.svelte b/src/app/components/ContentQuote.svelte index febd9392..58d6539e 100644 --- a/src/app/components/ContentQuote.svelte +++ b/src/app/components/ContentQuote.svelte @@ -1,5 +1,6 @@ - diff --git a/src/app/components/PeopleItem.svelte b/src/app/components/PeopleItem.svelte new file mode 100644 index 00000000..e6158689 --- /dev/null +++ b/src/app/components/PeopleItem.svelte @@ -0,0 +1,56 @@ + + +
+
+ + + {#if roots.length > 0} + {@const event = first(sortBy(e => -e.created_at, roots))} + {@const relays = ctx.app.router.Event(event).getUrls()} + {@const nevent = nip19.neventEncode({id: event.id, relays})} + {@const following = getListValues("p", $userFollows).includes(pubkey)} +
+ +
+ +

{formatTimestamp(event.created_at)}

+
+ +
+
{roots.length} recent {roots.length === 1 ? 'note' : 'notes'}
+
Last posted {formatTimestampRelative(event.created_at)}
+
+ {/if} +
+
diff --git a/src/app/components/Profile.svelte b/src/app/components/Profile.svelte index f3f91480..363fd648 100644 --- a/src/app/components/Profile.svelte +++ b/src/app/components/Profile.svelte @@ -1,22 +1,34 @@ -
-
+
+ -
+
-
- {$profileDisplay} +
+ + {$profileDisplay} + +
{$handle ? displayHandle($handle) : displayPubkey(pubkey)} diff --git a/src/app/components/ProfileInfo.svelte b/src/app/components/ProfileInfo.svelte new file mode 100644 index 00000000..1eac2186 --- /dev/null +++ b/src/app/components/ProfileInfo.svelte @@ -0,0 +1,12 @@ + + +{#if $profile} + +{/if} diff --git a/src/lib/components/Avatar.svelte b/src/lib/components/Avatar.svelte index fb896d16..1989b1fa 100644 --- a/src/lib/components/Avatar.svelte +++ b/src/lib/components/Avatar.svelte @@ -3,18 +3,18 @@ import Icon from "@lib/components/Icon.svelte" export let src - export let alt = "" export let size = 7 export let icon = "user-rounded" -
- {#if src} - - {:else} +{#if src} +
+{:else} +
- {/if} -
+
+{/if} diff --git a/src/lib/components/WotScore.svelte b/src/lib/components/WotScore.svelte new file mode 100644 index 00000000..d412e4ee --- /dev/null +++ b/src/lib/components/WotScore.svelte @@ -0,0 +1,44 @@ + + + + +
+ + + + +
diff --git a/src/lib/html.ts b/src/lib/html.ts index 4338302d..b70ba389 100644 --- a/src/lib/html.ts +++ b/src/lib/html.ts @@ -17,26 +17,31 @@ export const copyToClipboard = (text: string) => { } type ScrollerOpts = { + onScroll: () => any + element: Element threshold?: number reverse?: boolean delay?: number } -export const createScroller = ( - loadMore: () => Promise, - {delay = 1000, threshold = 2000, reverse = false}: ScrollerOpts = {}, -) => { +export const createScroller = ({ + onScroll, + element, + delay = 1000, + threshold = 2000, + reverse = false, +}: ScrollerOpts) => { let done = false const check = async () => { // While we have empty space, fill it const {scrollY, innerHeight} = window - const {scrollHeight, scrollTop} = document.querySelector('.max-h-screen')! + const {scrollHeight, scrollTop} = element const offset = Math.abs(scrollTop || scrollY) const shouldLoad = offset + innerHeight + threshold > scrollHeight // Only trigger loading the first time we reach the threshold if (shouldLoad) { - await loadMore() + await onScroll() } // No need to check all that often diff --git a/src/routes/discover/+page.svelte b/src/routes/discover/+page.svelte index bb16ec1f..b1139abf 100644 --- a/src/routes/discover/+page.svelte +++ b/src/routes/discover/+page.svelte @@ -10,16 +10,18 @@ let term = "" let limit = 20 - - const loadMore = async () => { - limit += 20 - } + let element: Element $: relays = $relaySearch.searchOptions(term).slice(0, limit) onMount(() => { const sub = discoverRelays() - const scroller = createScroller(loadMore) + const scroller = createScroller({ + element: element.closest('.max-h-screen')!, + onScroll: () => { + limit += 20 + }, + }) return () => { sub.close() @@ -28,7 +30,7 @@ }) -
+

Discover Spaces

Find communities all across the nostr network

- - Saved Notes - -
-
Chats
diff --git a/src/routes/home/people/+page.svelte b/src/routes/home/people/+page.svelte index e69de29b..347418f5 100644 --- a/src/routes/home/people/+page.svelte +++ b/src/routes/home/people/+page.svelte @@ -0,0 +1,45 @@ + + + +
+

People

+

Get the latest from people in your network

+ +
+ {#each pubkeys.slice(0, limit) as pubkey (pubkey)} + + {/each} +
+