From a10e9aafd125b96c427ef4a30ea748707d3b2a0b Mon Sep 17 00:00:00 2001 From: daniyal Date: Mon, 23 Sep 2024 20:57:29 +0500 Subject: [PATCH] chore(refactor): implement a custom hook for comments --- src/hooks/useComments.ts | 46 +++++++++++++++++ src/pages/mod/internal/comment/index.tsx | 65 ++++++------------------ src/types/mod.ts | 12 +++++ 3 files changed, 74 insertions(+), 49 deletions(-) create mode 100644 src/hooks/useComments.ts diff --git a/src/hooks/useComments.ts b/src/hooks/useComments.ts new file mode 100644 index 0000000..808e67d --- /dev/null +++ b/src/hooks/useComments.ts @@ -0,0 +1,46 @@ +import { + MetadataController, + RelayController, + UserRelaysType +} from 'controllers' +import { Filter, kinds } from 'nostr-tools' +import { useState } from 'react' +import { CommentEvent, ModDetails } from 'types' +import { useDidMount } from './useDidMount' + +export const useComments = (mod: ModDetails) => { + const [commentEvents, setCommentEvents] = useState([]) + + useDidMount(async () => { + const metadataController = await MetadataController.getInstance() + + const authorReadRelays = await metadataController.findUserRelays( + mod.author, + UserRelaysType.Read + ) + + const filter: Filter = { + kinds: [kinds.ShortTextNote], + '#a': [mod.aTag] + } + + RelayController.getInstance().subscribeForEvents( + filter, + authorReadRelays, + (event) => { + setCommentEvents((prev) => { + if (prev.find((e) => e.id === event.id)) { + return [...prev] + } + + return [event, ...prev] + }) + } + ) + }) + + return { + commentEvents, + setCommentEvents + } +} diff --git a/src/pages/mod/internal/comment/index.tsx b/src/pages/mod/internal/comment/index.tsx index f42a94b..62c5099 100644 --- a/src/pages/mod/internal/comment/index.tsx +++ b/src/pages/mod/internal/comment/index.tsx @@ -6,19 +6,24 @@ import { } from 'controllers' import { formatDate } from 'date-fns' import { useAppSelector, useDidMount, useReactions } from 'hooks' -import { - Event, - kinds, - nip19, - Filter as NostrEventFilter, - UnsignedEvent -} from 'nostr-tools' -import React, { useEffect, useMemo } from 'react' -import { Dispatch, SetStateAction, useState } from 'react' +import { useComments } from 'hooks/useComments' +import { Event, kinds, nip19, UnsignedEvent } from 'nostr-tools' +import React, { + Dispatch, + SetStateAction, + useEffect, + useMemo, + useState +} from 'react' import { Link } from 'react-router-dom' import { toast } from 'react-toastify' import { getProfilePageRoute } from 'routes' -import { ModDetails, UserProfile } from 'types' +import { + CommentEvent, + CommentEventStatus, + ModDetails, + UserProfile +} from 'types/index.ts' import { abbreviateNumber, hexToNpub, log, LogType, now } from 'utils' enum SortByEnum { @@ -36,23 +41,13 @@ type FilterOptions = { author: AuthorFilterEnum } -enum CommentEventStatus { - Publishing = 'Publishing comment...', - Published = 'Published!', - Failed = 'Failed to publish comment.' -} - -interface CommentEvent extends Event { - status?: CommentEventStatus -} - type Props = { modDetails: ModDetails setCommentCount: Dispatch> } export const Comments = ({ modDetails, setCommentCount }: Props) => { - const [commentEvents, setCommentEvents] = useState([]) + const { commentEvents, setCommentEvents } = useComments(modDetails) const [filterOptions, setFilterOptions] = useState({ sort: SortByEnum.Latest, author: AuthorFilterEnum.All_Comments @@ -64,34 +59,6 @@ export const Comments = ({ modDetails, setCommentCount }: Props) => { const userState = useAppSelector((state) => state.user) - useDidMount(async () => { - const metadataController = await MetadataController.getInstance() - - const authorReadRelays = await metadataController.findUserRelays( - modDetails.author, - UserRelaysType.Read - ) - - const filter: NostrEventFilter = { - kinds: [kinds.ShortTextNote], - '#a': [modDetails.aTag] - } - - RelayController.getInstance().subscribeForEvents( - filter, - authorReadRelays, - (event) => { - setCommentEvents((prev) => { - if (prev.find((e) => e.id === event.id)) { - return [...prev] - } - - return [event, ...prev] - }) - } - ) - }) - const handleSubmit = async (content: string): Promise => { if (content === '') return false diff --git a/src/types/mod.ts b/src/types/mod.ts index 710f631..c9d14f8 100644 --- a/src/types/mod.ts +++ b/src/types/mod.ts @@ -1,3 +1,15 @@ +import { Event } from 'nostr-tools' + +export enum CommentEventStatus { + Publishing = 'Publishing comment...', + Published = 'Published!', + Failed = 'Failed to publish comment.' +} + +export interface CommentEvent extends Event { + status?: CommentEventStatus +} + export type Game = { 'Game Name': string '16 by 9 image': string