diff --git a/bun.lockb b/bun.lockb index 0a2a603b..65bba3bb 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/src/app/chats/components/modal.tsx b/src/app/chats/components/modal.tsx index 4deb5686..5a2adce7 100644 --- a/src/app/chats/components/modal.tsx +++ b/src/app/chats/components/modal.tsx @@ -43,7 +43,7 @@ export function NewMessageModal() { New chat - + @@ -56,14 +56,14 @@ export function NewMessageModal() { {db.account?.follows?.map((pubkey) => (
diff --git a/src/app/chats/components/unknowns.tsx b/src/app/chats/components/unknowns.tsx index 5e30d96a..1b1700cd 100644 --- a/src/app/chats/components/unknowns.tsx +++ b/src/app/chats/components/unknowns.tsx @@ -43,7 +43,7 @@ export function UnknownsModal({ data }: { data: string[] }) { {data.length} unknowns - +
@@ -56,14 +56,14 @@ export function UnknownsModal({ data }: { data: string[] }) { {data.map((pubkey) => (
diff --git a/src/app/notes/article.tsx b/src/app/notes/article.tsx index c0518fdc..9e12e4c6 100644 --- a/src/app/notes/article.tsx +++ b/src/app/notes/article.tsx @@ -102,7 +102,7 @@ export function ArticleNoteScreen() { ) : ( <>
-
+
{renderKind(data)}
diff --git a/src/app/space/index.tsx b/src/app/space/index.tsx index c1931b26..d77bcc39 100644 --- a/src/app/space/index.tsx +++ b/src/app/space/index.tsx @@ -14,6 +14,7 @@ import { LocalArticlesWidget, LocalFeedsWidget, LocalFilesWidget, + LocalFollowsWidget, LocalNetworkWidget, LocalThreadWidget, LocalUserWidget, @@ -22,7 +23,6 @@ import { XfeedsWidget, XhashtagWidget, } from '@shared/widgets'; -import { LocalFollowsWidget } from '@shared/widgets/local/follows'; import { WidgetKinds, useWidgets } from '@stores/widgets'; diff --git a/src/index.css b/src/index.css index dc3515a7..643f27ec 100644 --- a/src/index.css +++ b/src/index.css @@ -12,7 +12,11 @@ } .markdown { - @apply prose prose-white max-w-none select-text hyphens-auto text-white prose-p:mb-0 prose-p:mt-0 prose-p:break-words prose-p:[word-break:break-word] prose-p:last:mb-0 prose-a:break-words prose-a:break-all prose-a:font-normal hover:prose-a:text-fuchsia-500 prose-blockquote:mb-1 prose-blockquote:mt-1 prose-blockquote:border-l-[2px] prose-blockquote:border-fuchsia-500 prose-blockquote:pl-2 prose-pre:whitespace-pre-wrap prose-pre:break-words prose-pre:break-all prose-pre:bg-white/10 prose-ol:m-0 prose-ol:mb-1 prose-ul:mb-1 prose-ul:mt-1 prose-img:mb-2 prose-img:mt-3 prose-hr:mx-0 prose-hr:my-2; + @apply prose prose-white max-w-none select-text hyphens-auto text-white prose-headings:mb-1 prose-headings:mt-3 prose-p:mb-0 prose-p:mt-0 prose-p:break-words prose-p:[word-break:break-word] prose-p:last:mb-0 prose-a:break-words prose-a:break-all prose-a:font-normal hover:prose-a:text-fuchsia-500 prose-blockquote:mb-1 prose-blockquote:mt-1 prose-blockquote:border-l-[2px] prose-blockquote:border-fuchsia-500 prose-blockquote:pl-2 prose-pre:whitespace-pre-wrap prose-pre:break-words prose-pre:break-all prose-pre:bg-white/10 prose-ol:m-0 prose-ol:mb-1 prose-ul:mb-1 prose-ul:mt-1 prose-img:mb-2 prose-img:mt-3 prose-hr:mx-0 prose-hr:my-2; +} + +.markdown-article { + @apply prose prose-white max-w-none select-text hyphens-auto text-white/80 prose-headings:mb-1 prose-headings:mt-3 prose-headings:text-white prose-p:mb-2 prose-p:mt-0 prose-p:break-words prose-p:[word-break:break-word] prose-a:break-words prose-a:break-all prose-a:font-normal hover:prose-a:text-fuchsia-500 prose-blockquote:mb-1 prose-blockquote:mt-1 prose-blockquote:border-l-[2px] prose-blockquote:border-fuchsia-500 prose-blockquote:pl-2 prose-pre:whitespace-pre-wrap prose-pre:break-words prose-pre:break-all prose-pre:bg-white/10 prose-ol:m-0 prose-ol:mb-1 prose-ul:mb-1 prose-ul:mt-1 prose-img:mb-2 prose-img:mt-3 prose-hr:mx-0 prose-hr:my-2; } .ProseMirror p.is-empty::before { diff --git a/src/libs/ndk/instance.ts b/src/libs/ndk/instance.ts index fa6bf19c..334b9bc9 100644 --- a/src/libs/ndk/instance.ts +++ b/src/libs/ndk/instance.ts @@ -6,14 +6,11 @@ import { useEffect, useMemo, useState } from 'react'; import TauriAdapter from '@libs/ndk/cache'; import { useStorage } from '@libs/storage/provider'; -import { FULL_RELAYS } from '@stores/constants'; - export const NDKInstance = () => { - const { db } = useStorage(); - const [ndk, setNDK] = useState(undefined); const [relayUrls, setRelayUrls] = useState([]); + const { db } = useStorage(); const cacheAdapter = useMemo(() => new TauriAdapter(), [ndk]); // TODO: fully support NIP-11 @@ -23,11 +20,10 @@ export const NDKInstance = () => { const timeoutId = setTimeout(() => controller.abort('timeout'), 10000); // get relays - const relays = (await db.getExplicitRelayUrls()) ?? FULL_RELAYS; + const relays = await db.getExplicitRelayUrls(); const requests = relays.map((relay) => { const url = new URL(relay); - return fetch(`https://${url.hostname + url.pathname}`, { headers: { Accept: 'application/nostr+json' }, signal: controller.signal, @@ -35,11 +31,12 @@ export const NDKInstance = () => { }); const responses = await Promise.all(requests); - const errors = responses.filter((response) => !response.ok); + const successes = responses.filter((res) => res.ok); + const errors = responses.filter((res) => !res.ok); if (errors.length > 0) throw errors.map((response) => Error(response.statusText)); - const verifiedRelays: string[] = responses.map((res) => { + const verifiedRelays: string[] = successes.map((res) => { const url = new URL(res.url); if (url.protocol === 'http:') return `ws://${url.hostname + url.pathname}`; if (url.protocol === 'https:') return `wss://${url.hostname + url.pathname}`; @@ -60,8 +57,6 @@ export const NDKInstance = () => { const instance = new NDK({ explicitRelayUrls, cacheAdapter, - // outboxRelayUrls: ['wss://purplepag.es'], - // enableOutboxModel: true, }); try { diff --git a/src/libs/ndk/provider.tsx b/src/libs/ndk/provider.tsx index 58011bb8..76e54034 100644 --- a/src/libs/ndk/provider.tsx +++ b/src/libs/ndk/provider.tsx @@ -5,12 +5,12 @@ import { PropsWithChildren, createContext, useContext } from 'react'; import { NDKInstance } from '@libs/ndk/instance'; interface NDKContext { - ndk: NDK; + ndk: undefined | NDK; relayUrls: string[]; } const NDKContext = createContext({ - ndk: new NDK({}), + ndk: undefined, relayUrls: [], }); diff --git a/src/libs/storage/instance.ts b/src/libs/storage/instance.ts index 25bf61d0..1114c796 100644 --- a/src/libs/storage/instance.ts +++ b/src/libs/storage/instance.ts @@ -4,6 +4,8 @@ import { Platform } from '@tauri-apps/api/os'; import Database from 'tauri-plugin-sql-api'; import { Stronghold } from 'tauri-plugin-stronghold-api'; +import { FULL_RELAYS } from '@stores/constants'; + import { Account, DBEvent, Relays, Widget } from '@utils/types'; export class LumeStorage { @@ -287,8 +289,9 @@ export class LumeStorage { `SELECT * FROM relays WHERE account_id = "${this.account.id}" ORDER BY id DESC LIMIT 50;` ); - if (result.length < 1) return null; - return result.map((el) => el.relay); + if (result.length < 1) return FULL_RELAYS; + // return [...new Set(result.map((el) => el.relay))]; + return FULL_RELAYS; } public async createRelay(relay: string, purpose?: string) { diff --git a/src/shared/notes/kinds/articleDetail.tsx b/src/shared/notes/kinds/articleDetail.tsx index cff9fbe7..1f573a99 100644 --- a/src/shared/notes/kinds/articleDetail.tsx +++ b/src/shared/notes/kinds/articleDetail.tsx @@ -26,7 +26,7 @@ export function ArticleDetailNote({ event }: { event: NDKEvent }) { }, [event.id]);*/ return ( - + {event.content} ); diff --git a/src/shared/widgets/index.ts b/src/shared/widgets/index.ts index 68e240ec..7b29f9d0 100644 --- a/src/shared/widgets/index.ts +++ b/src/shared/widgets/index.ts @@ -4,6 +4,7 @@ export * from './local/user'; export * from './local/thread'; export * from './local/files'; export * from './local/articles'; +export * from './local/follows'; export * from './global/articles'; export * from './global/files'; export * from './global/hashtag'; diff --git a/src/shared/widgets/local/feeds.tsx b/src/shared/widgets/local/feeds.tsx index 26c1e09f..ac1dc890 100644 --- a/src/shared/widgets/local/feeds.tsx +++ b/src/shared/widgets/local/feeds.tsx @@ -71,7 +71,7 @@ export function LocalFeedsWidget({ params }: { params: Widget }) { data-index={index} ref={virtualizer.measureElement} > - +
); case 1063: diff --git a/src/shared/widgets/local/follows.tsx b/src/shared/widgets/local/follows.tsx index 50f7a79e..73810d4e 100644 --- a/src/shared/widgets/local/follows.tsx +++ b/src/shared/widgets/local/follows.tsx @@ -70,7 +70,7 @@ export function LocalFollowsWidget({ params }: { params: Widget }) { data-index={index} ref={virtualizer.measureElement} > - +
); case 1063: diff --git a/src/shared/widgets/local/network.tsx b/src/shared/widgets/local/network.tsx index ddd0d530..68aa833e 100644 --- a/src/shared/widgets/local/network.tsx +++ b/src/shared/widgets/local/network.tsx @@ -73,7 +73,7 @@ export function LocalNetworkWidget() { data-index={index} ref={virtualizer.measureElement} > - +
); case 1063: diff --git a/src/stores/activities.ts b/src/stores/activities.ts index 800019cc..bc09540e 100644 --- a/src/stores/activities.ts +++ b/src/stores/activities.ts @@ -4,7 +4,7 @@ import { create } from 'zustand'; interface ActivitiesState { activities: Array; totalNewActivities: number; - setActivities: (events: NDKEvent[]) => void; + setActivities: (events: NDKEvent[], lastLogin: number) => void; addActivity: (event: NDKEvent) => void; clearTotalNewActivities: () => void; } @@ -12,8 +12,12 @@ interface ActivitiesState { export const useActivities = create((set) => ({ activities: null, totalNewActivities: 0, - setActivities: (events: NDKEvent[]) => { - set(() => ({ activities: events })); + setActivities: (events: NDKEvent[], lastLogin: number) => { + const latest = events.filter((ev) => ev.created_at > lastLogin); + set(() => ({ + activities: events, + totalNewActivities: latest.length > 0 ? latest.length : 0, + })); }, addActivity: (event: NDKEvent) => { set((state) => ({ diff --git a/src/utils/hooks/useNostr.ts b/src/utils/hooks/useNostr.ts index 627da89f..7beffb7b 100644 --- a/src/utils/hooks/useNostr.ts +++ b/src/utils/hooks/useNostr.ts @@ -57,7 +57,7 @@ export function useNostr() { const follows = new Set(preFollows || []); const lruNetwork = new LRUCache({ max: 300 }); - // fetch user's relays + /* fetch user's relays const relayEvents = await ndk.fetchEvents({ kinds: [NDKKind.RelayList], authors: [db.account.pubkey], @@ -74,6 +74,7 @@ export function useNostr() { } } } + */ // fetch user's follows if (!preFollows) {