-
-
diff --git a/src/shared/widgets/topic.tsx b/src/shared/widgets/topic.tsx
index 80fe3e92..18c030fd 100644
--- a/src/shared/widgets/topic.tsx
+++ b/src/shared/widgets/topic.tsx
@@ -1,5 +1,6 @@
import { NDKEvent, NDKKind } from '@nostr-dev-kit/ndk';
import { useInfiniteQuery } from '@tanstack/react-query';
+import { FetchFilter } from 'nostr-fetch';
import { useCallback, useMemo } from 'react';
import { VList } from 'virtua';
@@ -33,18 +34,18 @@ export function TopicWidget({ widget }: { widget: Widget }) {
pageParam: number;
}) => {
const hashtags: string[] = JSON.parse(widget.content as string);
+ const filter: FetchFilter = {
+ kinds: [NDKKind.Text, NDKKind.Repost],
+ '#t': hashtags.map((tag) => tag.replace('#', '')),
+ };
+
const rootIds = new Set();
const dedupQueue = new Set();
- const events = await fetcher.fetchLatestEvents(
- relayUrls,
- {
- kinds: [NDKKind.Text, NDKKind.Repost],
- '#t': hashtags,
- },
- FETCH_LIMIT,
- { asOf: pageParam === 0 ? undefined : pageParam, abortSignal: signal }
- );
+ const events = await fetcher.fetchLatestEvents(relayUrls, filter, FETCH_LIMIT, {
+ asOf: pageParam === 0 ? undefined : pageParam,
+ abortSignal: signal,
+ });
const ndkEvents = events.map((event) => {
return new NDKEvent(ndk, event);
diff --git a/src/stores/constants.ts b/src/stores/constants.ts
index f3d48a2e..e666a95f 100644
--- a/src/stores/constants.ts
+++ b/src/stores/constants.ts
@@ -1,8 +1,5 @@
-import { WidgetGroup } from '@utils/types';
-
export const FULL_RELAYS = [
'wss://relay.damus.io',
- 'wss://relay.primal.net',
'wss://relayable.org',
'wss://relay.nostr.band/all',
'wss://nostr.mutinywallet.com',
@@ -59,8 +56,6 @@ export const WIDGET_KIND = {
export const TOPICS = [
{
title: 'Gaming',
- description: '',
- kind: WIDGET_KIND.global.topic,
content: [
'#gamestr',
'#gaming',
@@ -74,31 +69,23 @@ export const TOPICS = [
'#twitch',
'#fortnite',
'#pc',
- '#memes',
'#pcgaming',
'#gamers',
'#gamingcommunity',
- '#youtube',
'#switch',
'#gamergirl',
'#nintendo',
'#gta',
'#callofduty',
- '#streamer',
- '#follow',
'#pubg',
'#videogame',
'#esports',
- '#bhfyp',
- '#meme',
- '#twitchstreamer',
- '#art',
'#genshinimpact',
'#honkaiimpact',
'#warthunder',
- '#hovoverse',
+ '#hoyoverse',
'#arknights',
- '#soul',
+ '#soullike',
'#eldenring',
'#steam',
'#pubg',
@@ -108,12 +95,17 @@ export const TOPICS = [
'#starfield',
'#gta6',
'#gameoftheyear',
+ '#darksoul',
+ '#batterfield',
+ '#dota',
+ '#rpg',
+ '#thewitcher',
+ '#rogally',
+ '#rog',
],
},
{
title: 'Music',
- description: '',
- kind: WIDGET_KIND.global.topic,
content: [
'#audiostr',
'#musicstr',
@@ -125,18 +117,12 @@ export const TOPICS = [
'#musician',
'#artist',
'#musica',
- '#instagood',
'#singer',
'#dj',
- '#follow',
'#rock',
- '#like',
'#dance',
'#guitar',
- '#s',
- '#photography',
'#song',
- '#bhfyp',
'#newmusic',
'#producer',
'#life',
@@ -146,12 +132,14 @@ export const TOPICS = [
'#explorepage',
'#viral',
'#beats',
+ '#dvd',
+ '#amass',
+ '#bluray',
+ '#Blu_Ray',
],
},
{
title: 'Photography',
- description: '',
- kind: WIDGET_KIND.global.topic,
content: [
'#photography',
'#photooftheday',
@@ -159,57 +147,38 @@ export const TOPICS = [
'#photo',
'#nature',
'#picoftheday',
- '#like',
'#photographer',
'#beautiful',
- '#follow',
- '#art',
'#fashion',
'#travel',
- '#bhfyp',
'#photoshoot',
- '#likeforlikes',
- '#instadaily',
'#naturephotography',
'#model',
'#me',
'#smile',
'#style',
- '#instalike',
'#happy',
'#likes',
'#myself',
- '#followme',
- '#followforfollowback',
],
},
{
title: 'Art',
- description: '',
- kind: WIDGET_KIND.global.topic,
content: [
+ '#nostrdesign',
'#artstr',
'#art',
'#artist',
- '#love',
'#drawing',
- '#photography',
'#artwork',
- '#instagood',
- '#photooftheday',
'#painting',
'#fashion',
- '#like',
- '#artistsoninstagram',
'#beautiful',
'#illustration',
'#digitalart',
- '#follow',
'#design',
'#nature',
- '#picoftheday',
'#photo',
- '#bhfyp',
'#sketch',
'#style',
'#arte',
@@ -221,8 +190,6 @@ export const TOPICS = [
},
{
title: 'Movie',
- description: '',
- kind: WIDGET_KIND.global.topic,
content: [
'#filmstr',
'#moviestr',
@@ -233,9 +200,6 @@ export const TOPICS = [
'#films',
'#hollywood',
'#actor',
- '#love',
- '#s',
- '#art',
'#cinematography',
'#actress',
'#netflix',
@@ -243,7 +207,6 @@ export const TOPICS = [
'#music',
'#filmmaking',
'#horror',
- '#instagood',
'#bollywood',
'#movienight',
'#photography',
@@ -259,8 +222,6 @@ export const TOPICS = [
},
{
title: 'Technology',
- description: '',
- kind: WIDGET_KIND.global.topic,
content: [
'#apple',
'#xiaomi',
@@ -276,30 +237,27 @@ export const TOPICS = [
'#iphone',
'#technews',
'#science',
- '#design',
'#gadgets',
'#electronics',
'#android',
'#software',
'#programming',
'#smartphone',
- '#bhfyp',
'#samsung',
- '#instagood',
'#coding',
'#computer',
- '#pro',
- '#education',
'#security',
'#gadget',
'#mobile',
'#technologynews',
+ '#opensource',
+ '#tor',
+ '#bitcoin',
+ '#lightning',
],
},
{
title: 'Anime',
- description: '',
- kind: WIDGET_KIND.global.topic,
content: [
'#animestr',
'#anime',
@@ -317,78 +275,23 @@ export const TOPICS = [
'#aot',
'#hentai',
'#fanart',
+ '#loli',
+ '#vocaloid',
+ '#vtuber',
],
},
-];
-
-export const DEFAULT_WIDGETS: Array
= [
{
- title: 'Topics',
- data: TOPICS,
- },
- {
- title: 'Local',
- data: [
- {
- kind: WIDGET_KIND.tmp.xfeed,
- title: 'Group feeds',
- description: 'All posts from specific people you want to keep up with',
- },
- {
- kind: WIDGET_KIND.local.files,
- title: 'Files',
- description: 'All files shared by people you follow',
- },
- {
- kind: WIDGET_KIND.local.articles,
- title: 'Articles',
- description: 'All articles shared by people you follow',
- },
- ],
- },
- {
- title: 'Global',
- data: [
- {
- kind: WIDGET_KIND.tmp.xhashtag,
- title: 'Hashtag',
- description: 'All posts have a specific hashtag',
- },
- {
- kind: WIDGET_KIND.global.files,
- title: 'Files',
- description: 'All files shared by people in your current relay set',
- },
- {
- kind: WIDGET_KIND.global.articles,
- title: 'Articles',
- description: 'All articles shared by people in your current relay set',
- },
- ],
- },
- {
- title: 'nostr.band',
- data: [
- {
- kind: WIDGET_KIND.nostrBand.trendingAccounts,
- title: 'Accounts',
- description: 'Trending accounts from the last 24 hours',
- },
- {
- kind: WIDGET_KIND.nostrBand.trendingNotes,
- title: 'Notes',
- description: 'Trending notes from the last 24 hours',
- },
- ],
- },
- {
- title: 'Other',
- data: [
- {
- kind: WIDGET_KIND.local.notification,
- title: 'Notification',
- description: 'Everything happens around you',
- },
+ title: 'NSFW',
+ content: [
+ '#pornstr',
+ '#porn',
+ '#nsfw',
+ '#bdsm',
+ '#lewd',
+ '#kink',
+ '#sexy',
+ '#loli',
+ '#hentai',
],
},
];
diff --git a/src/utils/hooks/useWidget.ts b/src/utils/hooks/useWidget.ts
index 7cf6017c..e8c902a8 100644
--- a/src/utils/hooks/useWidget.ts
+++ b/src/utils/hooks/useWidget.ts
@@ -17,6 +17,32 @@ export function useWidget() {
},
});
+ const replaceWidget = useMutation({
+ mutationFn: async ({ currentId, widget }: { currentId: string; widget: Widget }) => {
+ // Cancel any outgoing refetches
+ await queryClient.cancelQueries({ queryKey: ['widgets'] });
+
+ // Snapshot the previous value
+ const prevWidgets = queryClient.getQueryData(['widgets']);
+
+ // create new widget
+ await db.removeWidget(currentId);
+ const newWidget = await db.createWidget(widget.kind, widget.title, widget.content);
+
+ // Optimistically update to the new value
+ queryClient.setQueryData(['widgets'], (prev: Widget[]) => [
+ ...prev.filter((t) => t.id !== currentId),
+ newWidget,
+ ]);
+
+ // Return a context object with the snapshotted value
+ return { prevWidgets };
+ },
+ onSettled: () => {
+ queryClient.invalidateQueries({ queryKey: ['widgets'] });
+ },
+ });
+
const removeWidget = useMutation({
mutationFn: async (id: string) => {
// Cancel any outgoing refetches
@@ -41,5 +67,5 @@ export function useWidget() {
},
});
- return { addWidget, removeWidget };
+ return { addWidget, replaceWidget, removeWidget };
}