import { useCallback, useContext, useEffect, useLayoutEffect, useRef } from 'react'; import { useParams } from 'react-router-dom'; import { Virtuoso } from 'react-virtuoso'; import { ChannelMembers } from '@app/channel/components/members'; import { ChannelMessageForm } from '@app/channel/components/messages/form'; import { ChannelMetadata } from '@app/channel/components/metadata'; import { useNDK } from '@libs/ndk/provider'; import { useChannelMessages } from '@stores/channels'; import { dateToUnix, getHourAgo } from '@utils/date'; import { LumeEvent } from '@utils/types'; import { ChannelMessageItem } from './components/messages/item'; const now = new Date(); const Header = (
{getHourAgo(24, now).toLocaleDateString('en-US', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', })}
); const Empty = (

Nothing to see here yet

Be the first to share a message in this channel.

); export function ChannelScreen() { const { ndk } = useNDK(); const virtuosoRef = useRef(null); const { id } = useParams(); const [messages, fetchMessages, addMessage, clearMessages] = useChannelMessages( (state: any) => [state.messages, state.fetch, state.add, state.clear] ); useLayoutEffect(() => { fetchMessages(id); }, [fetchMessages]); useEffect(() => { // subscribe to channel const sub = ndk.subscribe( { '#e': [id], kinds: [42], since: dateToUnix(), }, { closeOnEose: false } ); sub.addListener('event', (event: LumeEvent) => { addMessage(id, event); }); return () => { clearMessages(); sub.stop(); }; }, []); const itemContent: any = useCallback( (index: string | number) => { return ; }, [messages] ); const computeItemKey = useCallback( (index: string | number) => { return messages[index].event_id; }, [messages] ); return (

Public Channel

{!messages ? (

Loading...

) : ( Header, EmptyPlaceholder: () => Empty, }} /> )}
); }