diff --git a/packages/app/package.json b/packages/app/package.json index f0527a0b..3b6f8242 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -23,6 +23,7 @@ "debug": "^4.3.4", "dexie": "^3.2.4", "emojilib": "^3.0.10", + "eventemitter3": "^5.0.1", "fuse.js": "^7.0.0", "highlight.js": "^11.8.0", "light-bolt11-decoder": "^2.1.0", diff --git a/packages/app/src/Cache/index.ts b/packages/app/src/Cache/index.ts index fc96dc3a..cbd67fc4 100644 --- a/packages/app/src/Cache/index.ts +++ b/packages/app/src/Cache/index.ts @@ -2,11 +2,7 @@ import { RelayMetricCache, UserProfileCache, UserRelaysCache } from "@snort/syst import { SnortSystemDb } from "@snort/system-web"; import { ChatCache } from "./ChatCache"; -import { EventInteractionCache } from "./EventInteractionCache"; -import { FollowListCache } from "./FollowListCache"; -import { FollowsFeedCache } from "./FollowsFeed"; import { GiftWrapCache } from "./GiftWrapCache"; -import { NotificationsCache } from "./Notifications"; import { Payments } from "./PaymentsCache"; export const SystemDb = new SnortSystemDb(); @@ -16,23 +12,15 @@ export const RelayMetrics = new RelayMetricCache(SystemDb.relayMetrics); export const Chats = new ChatCache(); export const PaymentsCache = new Payments(); -export const InteractionCache = new EventInteractionCache(); export const GiftsCache = new GiftWrapCache(); -export const Notifications = new NotificationsCache(); -export const FollowsFeed = new FollowsFeedCache(); -export const FollowLists = new FollowListCache(); export async function preload(follows?: Array) { const preloads = [ UserCache.preload(follows), Chats.preload(), - InteractionCache.preload(), - UserRelays.preload(follows), RelayMetrics.preload(), GiftsCache.preload(), - Notifications.preload(), - FollowsFeed.preload(), - FollowLists.preload(), + UserRelays.preload(follows), ]; await Promise.all(preloads); } diff --git a/packages/app/src/Components/Event/Note/NoteFooter/FooterZapButton.tsx b/packages/app/src/Components/Event/Note/NoteFooter/FooterZapButton.tsx index f624cccc..c2b1b68f 100644 --- a/packages/app/src/Components/Event/Note/NoteFooter/FooterZapButton.tsx +++ b/packages/app/src/Components/Event/Note/NoteFooter/FooterZapButton.tsx @@ -10,7 +10,6 @@ import { ZapperQueue } from "@/Components/Event/Note/NoteFooter/ZapperQueue"; import { ZapsSummary } from "@/Components/Event/ZapsSummary"; import ZapModal from "@/Components/ZapModal/ZapModal"; import useEventPublisher from "@/Hooks/useEventPublisher"; -import { useInteractionCache } from "@/Hooks/useInteractionCache"; import useLogin from "@/Hooks/useLogin"; import { getDisplayName } from "@/Utils"; import { Zapper, ZapTarget } from "@/Utils/Zapper"; @@ -35,10 +34,9 @@ export const FooterZapButton = ({ ev, zaps, onClickZappers }: ZapIconProps) => { })); const walletState = useWallet(); const wallet = walletState.wallet; - const interactionCache = useInteractionCache(publicKey, ev.id); const link = NostrLink.fromEvent(ev); const zapTotal = zaps.reduce((acc, z) => acc + z.amount, 0); - const didZap = interactionCache.data.zapped || zaps.some(a => a.sender === publicKey); + const didZap = zaps.some(a => a.sender === publicKey); const [showZapModal, setShowZapModal] = useState(false); const { formatMessage } = useIntl(); const [zapping, setZapping] = useState(false); @@ -102,7 +100,6 @@ export const FooterZapButton = ({ ev, zaps, onClickZappers }: ZapIconProps) => { if (CONFIG.features.zapPool) { ZapPoolController?.allocate(totalSent); } - await interactionCache.zap(); } }); } @@ -143,7 +140,7 @@ export const FooterZapButton = ({ ev, zaps, onClickZappers }: ZapIconProps) => { value={zapTotal} onClick={fastZap} /> - + { })} /> {showZapModal && ( { const { formatMessage } = useIntl(); const { publicKey } = useLogin(s => ({ publicKey: s.publicKey })); - const interactionCache = useInteractionCache(publicKey, ev.id); const { publisher, system } = useEventPublisher(); const hasReacted = (emoji: string) => { return ( - interactionCache.data.reacted || positiveReactions?.some(({ pubkey, content }) => normalizeReaction(content) === emoji && pubkey === publicKey) ); }; @@ -31,7 +28,6 @@ export const LikeButton = ({ if (!hasReacted(content) && publisher) { const evLike = await publisher.react(ev, content); system.BroadcastEvent(evLike); - interactionCache.react(); } }; diff --git a/packages/app/src/Components/Event/Note/NoteFooter/NoteFooter.tsx b/packages/app/src/Components/Event/Note/NoteFooter/NoteFooter.tsx index c37647f3..cf392bea 100644 --- a/packages/app/src/Components/Event/Note/NoteFooter/NoteFooter.tsx +++ b/packages/app/src/Components/Event/Note/NoteFooter/NoteFooter.tsx @@ -1,5 +1,5 @@ import { NostrLink, TaggedNostrEvent } from "@snort/system"; -import { useEventReactions, useReactions } from "@snort/system-react"; +import { useEventReactions } from "@snort/system-react"; import React, { useMemo, useState } from "react"; import { FooterZapButton } from "@/Components/Event/Note/NoteFooter/FooterZapButton"; @@ -8,6 +8,7 @@ import { PowIcon } from "@/Components/Event/Note/NoteFooter/PowIcon"; import { ReplyButton } from "@/Components/Event/Note/NoteFooter/ReplyButton"; import { RepostButton } from "@/Components/Event/Note/NoteFooter/RepostButton"; import ReactionsModal from "@/Components/Event/Note/ReactionsModal"; +import { useReactionsView } from "@/Feed/WorkerRelayView"; import useLogin from "@/Hooks/useLogin"; export interface NoteFooterProps { @@ -21,7 +22,7 @@ export default function NoteFooter(props: NoteFooterProps) { const ids = useMemo(() => [link], [link]); const [showReactions, setShowReactions] = useState(false); - const related = useReactions("note:reactions", ids, undefined, false); + const related = useReactionsView(ids, false); const { reactions, zaps, reposts } = useEventReactions(link, related); const { positive } = reactions; diff --git a/packages/app/src/Components/Event/Note/NoteFooter/RepostButton.tsx b/packages/app/src/Components/Event/Note/NoteFooter/RepostButton.tsx index b9f58987..fd42f97c 100644 --- a/packages/app/src/Components/Event/Note/NoteFooter/RepostButton.tsx +++ b/packages/app/src/Components/Event/Note/NoteFooter/RepostButton.tsx @@ -7,7 +7,6 @@ import { AsyncFooterIcon } from "@/Components/Event/Note/NoteFooter/AsyncFooterI import Icon from "@/Components/Icons/Icon"; import messages from "@/Components/messages"; import useEventPublisher from "@/Hooks/useEventPublisher"; -import { useInteractionCache } from "@/Hooks/useInteractionCache"; import useLogin from "@/Hooks/useLogin"; import { useNoteCreator } from "@/State/NoteCreator"; @@ -18,11 +17,10 @@ export const RepostButton = ({ ev, reposts }: { ev: TaggedNostrEvent; reposts: T preferences: s.appData.item.preferences, publicKey: s.publicKey, })); - const interactionCache = useInteractionCache(publicKey, ev.id); const note = useNoteCreator(n => ({ show: n.show, replyTo: n.replyTo, update: n.update, quote: n.quote })); const hasReposted = () => { - return interactionCache.data.reposted || reposts.some(a => a.pubkey === publicKey); + return reposts.some(a => a.pubkey === publicKey); }; const repost = async () => { @@ -30,7 +28,6 @@ export const RepostButton = ({ ev, reposts }: { ev: TaggedNostrEvent; reposts: T if (!prefs.confirmReposts || window.confirm(formatMessage(messages.ConfirmRepost, { id: ev.id }))) { const evRepost = await publisher.repost(ev); system.BroadcastEvent(evRepost); - await interactionCache.repost(); } } }; diff --git a/packages/app/src/Components/Event/Note/NoteTime.tsx b/packages/app/src/Components/Event/Note/NoteTime.tsx index 103abfb9..4a01ce46 100644 --- a/packages/app/src/Components/Event/Note/NoteTime.tsx +++ b/packages/app/src/Components/Event/Note/NoteTime.tsx @@ -1,4 +1,4 @@ -import React, { ReactNode, useCallback, useEffect, useMemo, useState } from "react"; +import React, { ReactNode, useCallback, useMemo, useState } from "react"; import { FormattedMessage } from "react-intl"; export interface NoteTimeProps { @@ -38,7 +38,7 @@ const NoteTime: React.FC = ({ from, fallback }) => { } }, []); - const [time, setTime] = useState(calcTime(from)); + const [time] = useState(calcTime(from)); const absoluteTime = useMemo( () => @@ -51,15 +51,6 @@ const NoteTime: React.FC = ({ from, fallback }) => { const isoDate = useMemo(() => new Date(from).toISOString(), [from]); - useEffect(() => { - const t = setInterval(() => { - const newTime = calcTime(from); - setTime(s => (s !== newTime ? newTime : s)); - }, 60_000); // update every minute - - return () => clearInterval(t); - }, [from]); - return (