From fc8117e0682f3d92df8537694309b91cb9dc2301 Mon Sep 17 00:00:00 2001 From: Martti Malmi Date: Wed, 23 Aug 2023 18:10:23 +0300 Subject: [PATCH] eventcomponent & usesubscribe --- src/js/components/events/EventComponent.tsx | 120 +++++++------------- src/js/nostr/hooks/useSubscribe.ts | 3 - 2 files changed, 44 insertions(+), 79 deletions(-) diff --git a/src/js/components/events/EventComponent.tsx b/src/js/components/events/EventComponent.tsx index 01a77583..fc46a1fe 100644 --- a/src/js/components/events/EventComponent.tsx +++ b/src/js/components/events/EventComponent.tsx @@ -1,7 +1,8 @@ -import { memo } from 'react'; -import { useEffect, useMemo, useRef, useState } from 'preact/hooks'; +import { memo, useEffect, useMemo, useRef, useState } from 'react'; +import classNames from 'classnames'; import EventDB from '@/nostr/EventDB'; +import { isRepost } from '@/nostr/utils.ts'; import { EventID } from '@/utils/Hex/Hex.ts'; import Events from '../../nostr/Events'; @@ -22,6 +23,14 @@ declare global { } } +const COMPONENTS_BY_EVENT_KIND = { + 1: Note, + 3: Follow, + 6: Repost, + 7: Like, + 9735: Zap, +}; + export interface EventComponentProps { id: string; standalone?: boolean; @@ -43,39 +52,23 @@ const EventComponent = (props: EventComponentProps) => { const unmounted = useRef(false); const handleEvent = (e: any) => { - if (!e) { - return; - } - - clearTimeout(retrievingTimeout.current); - if (unmounted.current) { - return; - } - - if (retrieving) { - setRetrieving(false); - } - - if (!event) { - setEvent(e); + if (e) { + clearTimeout(retrievingTimeout.current); + if (!unmounted.current) { + setRetrieving(false); + setEvent(e); + } } }; useEffect(() => { - if (props.standalone) { - if (event) { - window.prerenderReady = true; - } else { - setTimeout(() => { - window.prerenderReady = true; - }, 1000); - } + //console.log('EventComponent init'); // this gets called more than displayCount - unnecessary? + if (props.standalone && (event || retrievingTimeout.current)) { + window.prerenderReady = true; } if (!event) { - retrievingTimeout.current = setTimeout(() => { - setRetrieving(true); - }, 1000); - Events.getEventById(hex, true, (event) => handleEvent(event)); + retrievingTimeout.current = setTimeout(() => setRetrieving(true), 1000); + Events.getEventById(hex, true, handleEvent); } return () => { @@ -83,21 +76,16 @@ const EventComponent = (props: EventComponentProps) => { }; }, [props.id]); - const renderDropdown = () => { - return props.asInlineQuote ? null : ; - }; + const loadingClass = classNames('m-2 md:mx-4 flex items-center', { + 'opacity-100': retrieving, + 'opacity-0': !retrieving, + }); if (!event) { return ( -
-
-
{t('looking_up_message')}
-
{renderDropdown()}
-
+
+
{t('looking_up_message')}
+ {props.asInlineQuote ? null : }
); } @@ -110,46 +98,26 @@ const EventComponent = (props: EventComponentProps) => { Message from a blocked user
); - } else { - return null; } + return null; } - const renderComponent = () => { - let Component: any = Note; + const Component: any = isRepost(event) ? Repost : COMPONENTS_BY_EVENT_KIND[event.kind]; - if (event.kind === 1) { - const mentionIndex = event?.tags?.findIndex((tag) => tag[0] === 'e' && tag[3] === 'mention'); - if (event?.content === `#[${mentionIndex}]`) { - Component = Repost; - } - } else { - Component = { - 1: Note, - 3: Follow, - 6: Repost, - 7: Like, - 9735: Zap, - }[event.kind]; - } + if (!Component) { + console.error('unknown event kind', event); + return null; + } - if (!Component) { - console.error('unknown event kind', event); - return null; - } - - return ( - - ); - }; - - return renderComponent(); + return ( + + ); }; export default memo(EventComponent); diff --git a/src/js/nostr/hooks/useSubscribe.ts b/src/js/nostr/hooks/useSubscribe.ts index 665d0dfb..4ff6ebfc 100644 --- a/src/js/nostr/hooks/useSubscribe.ts +++ b/src/js/nostr/hooks/useSubscribe.ts @@ -46,9 +46,6 @@ const useSubscribe = (ops: SubscribeOptions) => { useEffect(() => { setEvents([]); - }, [filter, filterFn, enabled, sinceLastOpened, mergeSubscriptions]); - - useEffect(() => { if (!enabled || !filter) return; return PubSub.subscribe(filter, updateEvents, sinceLastOpened, mergeSubscriptions); }, [filter, filterFn, enabled, sinceLastOpened, mergeSubscriptions]);