diff --git a/src/components/channels/browseChannelItem.tsx b/src/components/channels/browseChannelItem.tsx new file mode 100644 index 00000000..7187257c --- /dev/null +++ b/src/components/channels/browseChannelItem.tsx @@ -0,0 +1,34 @@ +import { ImageWithFallback } from '@components/imageWithFallback'; + +import { DEFAULT_AVATAR } from '@stores/constants'; + +import { useRouter } from 'next/router'; + +export const BrowseChannelItem = ({ data }: { data: any }) => { + const router = useRouter(); + const channel = JSON.parse(data.content); + + const openChannel = (id) => { + router.push({ + pathname: '/channels/[id]', + query: { id: id }, + }); + }; + + return ( +
openChannel(data.eventId)} className="flex items-center gap-2 px-3 py-2 hover:bg-zinc-950"> +
+ +
+
+ {channel.name} + {channel.about} +
+
+ ); +}; diff --git a/src/components/channels/channelMessageItem.tsx b/src/components/channels/channelMessageItem.tsx new file mode 100644 index 00000000..3884bd7c --- /dev/null +++ b/src/components/channels/channelMessageItem.tsx @@ -0,0 +1,22 @@ +import { MessageUser } from '@components/chats/messageUser'; + +import { memo } from 'react'; + +const ChannelMessageItem = ({ data }: { data: any }) => { + return ( +
+
+ +
+
+
+ {data.content} +
+
+
+
+
+ ); +}; + +export default memo(ChannelMessageItem); diff --git a/src/components/channels/channelMessageList.tsx b/src/components/channels/channelMessageList.tsx new file mode 100644 index 00000000..4414fd50 --- /dev/null +++ b/src/components/channels/channelMessageList.tsx @@ -0,0 +1,39 @@ +import ChannelMessageItem from '@components/channels/channelMessageItem'; + +import { useCallback, useRef } from 'react'; +import { Virtuoso } from 'react-virtuoso'; + +export const ChannelMessageList = ({ data }: { data: any }) => { + const virtuosoRef = useRef(null); + + const itemContent: any = useCallback( + (index: string | number) => { + return ; + }, + [data] + ); + + const computeItemKey = useCallback( + (index: string | number) => { + return data[index].id; + }, + [data] + ); + + return ( +
+ +
+ ); +}; diff --git a/src/components/chats/chatList.tsx b/src/components/chats/chatList.tsx index 4cad15b9..7857d09d 100644 --- a/src/components/chats/chatList.tsx +++ b/src/components/chats/chatList.tsx @@ -11,11 +11,10 @@ import { useEffect, useState } from 'react'; export default function ChatList() { const router = useRouter(); + const [list, setList] = useState([]); const [activeAccount]: any = useLocalStorage('activeAccount'); const accountProfile = JSON.parse(activeAccount.metadata); - const [list, setList] = useState([]); - const openSelfChat = () => { router.push({ pathname: '/chats/[pubkey]', diff --git a/src/components/form/channelMessage.tsx b/src/components/form/channelMessage.tsx new file mode 100644 index 00000000..3cd4abd0 --- /dev/null +++ b/src/components/form/channelMessage.tsx @@ -0,0 +1,71 @@ +import ImagePicker from '@components/form/imagePicker'; +import { RelayContext } from '@components/relaysProvider'; + +import { dateToUnix } from '@utils/getDate'; + +import useLocalStorage from '@rehooks/local-storage'; +import { getEventHash, signEvent } from 'nostr-tools'; +import { useCallback, useContext, useState } from 'react'; + +export default function FormChannelMessage({ eventId }: { eventId: string | string[] }) { + const [pool, relays]: any = useContext(RelayContext); + + const [value, setValue] = useState(''); + const [activeAccount]: any = useLocalStorage('activeAccount'); + + const submitEvent = useCallback(() => { + const event: any = { + content: value, + created_at: dateToUnix(), + kind: 42, + pubkey: activeAccount.pubkey, + tags: [['e', eventId, '', 'root']], + }; + event.id = getEventHash(event); + event.sig = signEvent(event, activeAccount.privkey); + + // publish note + pool.publish(event, relays); + // reset state + setValue(''); + }, [activeAccount.privkey, activeAccount.pubkey, eventId, value, pool, relays]); + + const handleEnterPress = (e) => { + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault(); + submitEvent(); + } + }; + + return ( +
+
+