From 4b85a1690439a918df1eb4108408f99115b54e7b Mon Sep 17 00:00:00 2001 From: Kieran Date: Thu, 24 Aug 2023 16:54:20 +0100 Subject: [PATCH] Style tweaks --- packages/app/src/Element/Avatar.tsx | 9 ++++--- packages/app/src/Element/Modal.css | 2 +- packages/app/src/Element/Nip05.tsx | 3 --- packages/app/src/Element/NoteCreator.css | 1 + packages/app/src/Element/ProfileImage.css | 3 --- packages/app/src/Element/ProfileImage.tsx | 4 +-- packages/app/src/Element/TrendingPosts.tsx | 4 ++- packages/app/src/Feed/FeedReactions.ts | 25 +++++++++++++++++++ packages/app/src/Feed/TimelineFeed.ts | 20 +++------------ packages/app/src/Login/Preferences.ts | 2 +- packages/app/src/Notifications.ts | 6 ++--- packages/app/src/Pages/HashTagsPage.tsx | 2 +- packages/app/src/Pages/Layout.tsx | 1 + packages/app/src/Pages/ProfilePage.tsx | 2 +- packages/app/src/Pages/Root.tsx | 27 ++++++++++++++------- packages/app/src/Pages/settings/Profile.css | 1 + packages/app/src/Pages/settings/Profile.tsx | 5 ++-- packages/app/src/SnortUtils/index.ts | 4 +++ packages/app/src/index.css | 15 ++++++------ 19 files changed, 79 insertions(+), 57 deletions(-) create mode 100644 packages/app/src/Feed/FeedReactions.ts diff --git a/packages/app/src/Element/Avatar.tsx b/packages/app/src/Element/Avatar.tsx index 73963835..e3a85162 100644 --- a/packages/app/src/Element/Avatar.tsx +++ b/packages/app/src/Element/Avatar.tsx @@ -1,20 +1,21 @@ import "./Avatar.css"; -import Nostrich from "nostrich.webp"; import { CSSProperties, useEffect, useState } from "react"; import type { UserMetadata } from "@snort/system"; import useImgProxy from "Hooks/useImgProxy"; import { getDisplayName } from "Element/ProfileImage"; +import { defaultAvatar } from "SnortUtils"; interface AvatarProps { + pubkey: string; user?: UserMetadata; onClick?: () => void; size?: number; image?: string; } -const Avatar = ({ user, size, onClick, image }: AvatarProps) => { - const [url, setUrl] = useState(Nostrich); +const Avatar = ({ pubkey, user, size, onClick, image }: AvatarProps) => { + const [url, setUrl] = useState(""); const { proxy } = useImgProxy(); useEffect(() => { @@ -23,7 +24,7 @@ const Avatar = ({ user, size, onClick, image }: AvatarProps) => { const proxyUrl = proxy(url, size ?? 120); setUrl(proxyUrl); } else { - setUrl(Nostrich); + setUrl(defaultAvatar(pubkey)); } }, [user, image]); diff --git a/packages/app/src/Element/Modal.css b/packages/app/src/Element/Modal.css index 0b52ee1f..003aab7b 100644 --- a/packages/app/src/Element/Modal.css +++ b/packages/app/src/Element/Modal.css @@ -22,6 +22,6 @@ margin-bottom: auto; } -.modal-body button:hover { +.modal-body button.secondary:hover { background-color: var(--gray); } diff --git a/packages/app/src/Element/Nip05.tsx b/packages/app/src/Element/Nip05.tsx index 847627fb..2f9da25a 100644 --- a/packages/app/src/Element/Nip05.tsx +++ b/packages/app/src/Element/Nip05.tsx @@ -1,7 +1,5 @@ import "./Nip05.css"; import { HexKey } from "@snort/system"; - -import Icon from "Icons/Icon"; import { useUserProfile } from "@snort/system-react"; export function useIsVerified(pubkey: HexKey, bypassCheck?: boolean) { @@ -28,7 +26,6 @@ const Nip05 = ({ nip05, pubkey, verifyNip = true }: Nip05Params) => { {domain} - )} diff --git a/packages/app/src/Element/NoteCreator.css b/packages/app/src/Element/NoteCreator.css index 17719ca7..e879558e 100644 --- a/packages/app/src/Element/NoteCreator.css +++ b/packages/app/src/Element/NoteCreator.css @@ -81,6 +81,7 @@ width: 48px; height: 48px; background-color: var(--highlight); + color: white; border: none; border-radius: 100%; position: fixed; diff --git a/packages/app/src/Element/ProfileImage.css b/packages/app/src/Element/ProfileImage.css index cf66f0f1..70c62ec0 100644 --- a/packages/app/src/Element/ProfileImage.css +++ b/packages/app/src/Element/ProfileImage.css @@ -19,9 +19,6 @@ a.pfp { } .pfp .username { - display: flex; - flex-direction: column; - align-items: flex-start; font-weight: 600; } diff --git a/packages/app/src/Element/ProfileImage.tsx b/packages/app/src/Element/ProfileImage.tsx index 6342e8cb..1e2244b7 100644 --- a/packages/app/src/Element/ProfileImage.tsx +++ b/packages/app/src/Element/ProfileImage.tsx @@ -54,11 +54,11 @@ export default function ProfileImage({ return ( <>
- +
{showUsername && (
-
+
{name.trim()}
{nip05 && }
diff --git a/packages/app/src/Element/TrendingPosts.tsx b/packages/app/src/Element/TrendingPosts.tsx index 26914e4f..b3e0d52b 100644 --- a/packages/app/src/Element/TrendingPosts.tsx +++ b/packages/app/src/Element/TrendingPosts.tsx @@ -4,9 +4,11 @@ import { NostrEvent, TaggedNostrEvent } from "@snort/system"; import PageSpinner from "Element/PageSpinner"; import Note from "Element/Note"; import NostrBandApi from "External/NostrBand"; +import { useReactions } from "Feed/FeedReactions"; export default function TrendingNotes() { const [posts, setPosts] = useState>(); + const related = useReactions("trending", posts?.map(a => a.id) ?? []); async function loadTrendingNotes() { const api = new NostrBandApi(); @@ -23,7 +25,7 @@ export default function TrendingNotes() { return ( <> {posts.map(e => ( - + ))} ); diff --git a/packages/app/src/Feed/FeedReactions.ts b/packages/app/src/Feed/FeedReactions.ts new file mode 100644 index 00000000..cd32b57a --- /dev/null +++ b/packages/app/src/Feed/FeedReactions.ts @@ -0,0 +1,25 @@ +import { RequestBuilder, EventKind, NoteCollection } from "@snort/system"; +import { useRequestBuilder } from "@snort/system-react"; +import useLogin from "Hooks/useLogin"; +import { useMemo } from "react"; + +export function useReactions(subId: string, ids: Array, others?: (rb: RequestBuilder) => void) { + const { preferences: pref } = useLogin(); + + const sub = useMemo(() => { + const rb = new RequestBuilder(subId); + if (ids.length > 0) { + rb.withFilter() + .kinds( + pref.enableReactions + ? [EventKind.Reaction, EventKind.Repost, EventKind.ZapReceipt] + : [EventKind.ZapReceipt, EventKind.Repost] + ) + .tag("e", ids); + } + others?.(rb); + return rb.numFilters > 0 ? rb : null; + }, [ids]); + + return useRequestBuilder(NoteCollection, sub); +} diff --git a/packages/app/src/Feed/TimelineFeed.ts b/packages/app/src/Feed/TimelineFeed.ts index ae31cf34..4022e1b1 100644 --- a/packages/app/src/Feed/TimelineFeed.ts +++ b/packages/app/src/Feed/TimelineFeed.ts @@ -6,6 +6,7 @@ import { unixNow, unwrap, tagFilterOfTextRepost } from "SnortUtils"; import useTimelineWindow from "Hooks/useTimelineWindow"; import useLogin from "Hooks/useLogin"; import { SearchRelays } from "Const"; +import { useReactions } from "./FeedReactions"; export interface TimelineFeedOptions { method: "TIME_RANGE" | "LIMIT_UNTIL"; @@ -157,26 +158,13 @@ export default function useTimelineFeed(subject: TimelineSubject, options: Timel return []; } - const subNext = useMemo(() => { - const rb = new RequestBuilder(`timeline-related:${subject.type}:${subject.discriminator}`); - const trackingEvents = main.data?.map(a => a.id) ?? []; - if (trackingEvents.length > 0) { - rb.withFilter() - .kinds( - pref.enableReactions - ? [EventKind.Reaction, EventKind.Repost, EventKind.ZapReceipt] - : [EventKind.ZapReceipt, EventKind.Repost] - ) - .tag("e", trackingEvents); - } + const trackingEvents = main.data?.map(a => a.id) ?? []; + const related = useReactions(`timeline-related:${subject.type}:${subject.discriminator}`, trackingEvents, rb => { const trackingParentEvents = getParentEvents(); if (trackingParentEvents.length > 0) { rb.withFilter().ids(trackingParentEvents); } - return rb.numFilters > 0 ? rb : null; - }, [main.data, pref, subject.type]); - - const related = useRequestBuilder(NoteCollection, subNext); + }); return { main: main.data, diff --git a/packages/app/src/Login/Preferences.ts b/packages/app/src/Login/Preferences.ts index 4d1fc35d..ea12eee5 100644 --- a/packages/app/src/Login/Preferences.ts +++ b/packages/app/src/Login/Preferences.ts @@ -77,7 +77,7 @@ export const DefaultPreferences = { language: "en", enableReactions: true, reactionEmoji: "+", - autoLoadMedia: "follows-only", + autoLoadMedia: "all", theme: "system", confirmReposts: false, showDebugMenus: false, diff --git a/packages/app/src/Notifications.ts b/packages/app/src/Notifications.ts index d0bd6daf..5f308ff4 100644 --- a/packages/app/src/Notifications.ts +++ b/packages/app/src/Notifications.ts @@ -1,9 +1,7 @@ -import Nostrich from "nostrich.webp"; - import { TaggedNostrEvent, EventKind, MetadataCache } from "@snort/system"; import { getDisplayName } from "Element/ProfileImage"; import { MentionRegex } from "Const"; -import { tagFilterOfTextRepost, unwrap } from "SnortUtils"; +import { defaultAvatar, tagFilterOfTextRepost, unwrap } from "SnortUtils"; import { UserCache } from "Cache"; import { LoginSession } from "Login"; @@ -28,7 +26,7 @@ export async function makeNotification(ev: TaggedNostrEvent): Promise unwrap(a)); const fromUser = UserCache.getFromCache(ev.pubkey); const name = getDisplayName(fromUser, ev.pubkey); - const avatarUrl = fromUser?.picture || Nostrich; + const avatarUrl = fromUser?.picture || defaultAvatar(ev.pubkey); return { title: `Reply from ${name}`, body: replaceTagsWithUser(ev, allUsers).substring(0, 50), diff --git a/packages/app/src/Pages/HashTagsPage.tsx b/packages/app/src/Pages/HashTagsPage.tsx index cbcf4db2..a2e7a8c8 100644 --- a/packages/app/src/Pages/HashTagsPage.tsx +++ b/packages/app/src/Pages/HashTagsPage.tsx @@ -27,7 +27,7 @@ const HashTagsPage = () => { return ( <> -
+

#{tag}

{isFollowing ? ( diff --git a/packages/app/src/Pages/Layout.tsx b/packages/app/src/Pages/Layout.tsx index 62d130dd..79a98a7d 100644 --- a/packages/app/src/Pages/Layout.tsx +++ b/packages/app/src/Pages/Layout.tsx @@ -179,6 +179,7 @@ const AccountHeader = () => { {hasNotifications && } { if (profile) { diff --git a/packages/app/src/Pages/ProfilePage.tsx b/packages/app/src/Pages/ProfilePage.tsx index 3f7bc31f..c9dbe216 100644 --- a/packages/app/src/Pages/ProfilePage.tsx +++ b/packages/app/src/Pages/ProfilePage.tsx @@ -382,7 +382,7 @@ export default function ProfilePage() { function avatar() { return (
- +
{renderIcons()} {!isMe && id && } diff --git a/packages/app/src/Pages/Root.tsx b/packages/app/src/Pages/Root.tsx index 831fe3eb..aee22f9e 100644 --- a/packages/app/src/Pages/Root.tsx +++ b/packages/app/src/Pages/Root.tsx @@ -36,6 +36,7 @@ export default function RootPage() { { tab: "following", path: "/notes", + show: Boolean(pubKey), element: ( <> @@ -46,6 +47,7 @@ export default function RootPage() { { tab: "trending-notes", path: "/trending/notes", + show: true, element: ( <> @@ -56,6 +58,7 @@ export default function RootPage() { { tab: "conversations", path: "/conversations", + show: Boolean(pubKey), element: ( <> @@ -66,6 +69,7 @@ export default function RootPage() { { tab: "trending-people", path: "/trending/people", + show: true, element: ( <> @@ -76,6 +80,7 @@ export default function RootPage() { { tab: "suggested", path: "/suggested", + show: Boolean(pubKey), element: ( <> @@ -86,6 +91,7 @@ export default function RootPage() { { tab: "global", path: "/global", + show: true, element: ( <> @@ -96,12 +102,13 @@ export default function RootPage() { ] as Array<{ tab: RootPage; path: string; + show: boolean; element: ReactNode; }>; useEffect(() => { if (location.pathname === "/") { - const t = pubKey ? preferences.defaultRootTab ?? "/notes" : "/global"; + const t = pubKey ? preferences.defaultRootTab ?? "/notes" : "/trending/notes"; navigate(t); } else { const currentTab = menuItems.find(a => a.path === location.pathname)?.tab; @@ -140,14 +147,16 @@ export default function RootPage() {
- {menuItems.map(a => ( - { - navigate(a.path); - }}> - {a.element} - - ))} + {menuItems + .filter(a => a.show) + .map(a => ( + { + navigate(a.path); + }}> + {a.element} + + ))} {tags.item.map(v => ( { diff --git a/packages/app/src/Pages/settings/Profile.css b/packages/app/src/Pages/settings/Profile.css index e83c25f7..1a48afc6 100644 --- a/packages/app/src/Pages/settings/Profile.css +++ b/packages/app/src/Pages/settings/Profile.css @@ -16,6 +16,7 @@ height: 100%; background-size: cover; border-radius: 12px; + background: linear-gradient(90deg, #60a5fa 0%, #a78bfa 100%); } .settings .image-settings { diff --git a/packages/app/src/Pages/settings/Profile.tsx b/packages/app/src/Pages/settings/Profile.tsx index 13759d39..c52eb691 100644 --- a/packages/app/src/Pages/settings/Profile.tsx +++ b/packages/app/src/Pages/settings/Profile.tsx @@ -1,5 +1,4 @@ import "./Profile.css"; -import Nostrich from "nostrich.webp"; import { useEffect, useState } from "react"; import { FormattedMessage } from "react-intl"; import { useNavigate } from "react-router-dom"; @@ -168,7 +167,7 @@ export default function ProfileSettings(props: ProfileSettingsProps) { {(props.banner ?? true) && (
0 ? `url(${banner})` : undefined, }} className="banner"> setNewBanner()}> @@ -178,7 +177,7 @@ export default function ProfileSettings(props: ProfileSettingsProps) { )} {(props.avatar ?? true) && (
- + setNewAvatar()}> diff --git a/packages/app/src/SnortUtils/index.ts b/packages/app/src/SnortUtils/index.ts index c42e29c3..771ac829 100644 --- a/packages/app/src/SnortUtils/index.ts +++ b/packages/app/src/SnortUtils/index.ts @@ -505,3 +505,7 @@ export function kvToObject(o: string, sep?: string) { }) ) as T; } + +export function defaultAvatar(input: string) { + return `https://robohash.v0l.io/${input}.png`; +} diff --git a/packages/app/src/index.css b/packages/app/src/index.css index 318a783d..2e49d86d 100644 --- a/packages/app/src/index.css +++ b/packages/app/src/index.css @@ -123,6 +123,10 @@ code { margin-left: auto; margin-right: auto; } + + .main-content { + border: 1px solid var(--gray-superdark); + } } .p { @@ -161,9 +165,9 @@ button { cursor: pointer; padding: 6px 12px; font-weight: 600; - color: white; + color: var(--bg-color); font-size: var(--font-size); - background-color: var(--highlight); + background-color: var(--font-color); border: none; border-radius: 16px; outline: none; @@ -194,8 +198,7 @@ button:disabled:hover { } button:hover { - background-color: var(--font-color); - color: var(--bg-color); + background-color: var(--gray-light); } button.secondary { @@ -595,10 +598,6 @@ small.xs { color: var(--highlight); } -.main-content { - border: 1px solid var(--gray-superdark); -} - .bold { font-weight: 700; }