From ff6d494b49720cfbffa5f0262bd83bb1b401ef07 Mon Sep 17 00:00:00 2001 From: Ren Amamiya <123083837+reyamir@users.noreply.github.com> Date: Sat, 27 May 2023 16:44:13 +0700 Subject: [PATCH] update chats --- src/app/chat/components/messageList.tsx | 6 +- src/app/chat/components/messages/item.tsx | 7 ++- src/app/chat/components/messages/user.tsx | 2 +- src/app/chat/components/sidebar.tsx | 25 ++++++--- src/app/chat/hooks/useDecryptMessage.tsx | 16 ++++-- src/app/prefetch/pages/index.page.tsx | 14 ++--- src/renderer/shell.tsx | 20 +++++++ src/shared/eventCollector.tsx | 68 +++++++++++------------ src/shared/form/imagePicker.tsx | 4 -- src/stores/chats.tsx | 2 +- src/utils/storage.tsx | 14 ++++- 11 files changed, 109 insertions(+), 69 deletions(-) diff --git a/src/app/chat/components/messageList.tsx b/src/app/chat/components/messageList.tsx index c5757c25..2759bb1f 100644 --- a/src/app/chat/components/messageList.tsx +++ b/src/app/chat/components/messageList.tsx @@ -13,7 +13,11 @@ export function ChatMessageList() { const itemContent: any = useCallback( (index: string | number) => { return ( - + ); }, [account.privkey, account.pubkey, messages], diff --git a/src/app/chat/components/messages/item.tsx b/src/app/chat/components/messages/item.tsx index a007de1d..ea0ff195 100644 --- a/src/app/chat/components/messages/item.tsx +++ b/src/app/chat/components/messages/item.tsx @@ -7,13 +7,14 @@ import { memo } from "react"; export const ChatMessageItem = memo(function ChatMessageItem({ data, + userPubkey, userPrivkey, }: { data: any; + userPubkey: string; userPrivkey: string; }) { - const decryptedContent = useDecryptMessage(data, userPrivkey); - console.log(decryptedContent); + const decryptedContent = useDecryptMessage(data, userPubkey, userPrivkey); // if we have decrypted content, use it instead of the encrypted content if (decryptedContent) { data["content"] = decryptedContent; @@ -26,7 +27,7 @@ export const ChatMessageItem = memo(function ChatMessageItem({
-
+
{content.parsed || ""}
{Array.isArray(content.images) && content.images.length ? ( diff --git a/src/app/chat/components/messages/user.tsx b/src/app/chat/components/messages/user.tsx index d26913fe..acf9dc43 100644 --- a/src/app/chat/components/messages/user.tsx +++ b/src/app/chat/components/messages/user.tsx @@ -35,7 +35,7 @@ export function ChatMessageUser({
- + {user?.nip05 || user?.name || shortenKey(pubkey)} ยท diff --git a/src/app/chat/components/sidebar.tsx b/src/app/chat/components/sidebar.tsx index 2e486ad8..a90b1acf 100644 --- a/src/app/chat/components/sidebar.tsx +++ b/src/app/chat/components/sidebar.tsx @@ -16,13 +16,24 @@ export function ChatSidebar({ pubkey }: { pubkey: string }) { className="h-11 w-11 rounded-md object-cover" />
-
-

- {user?.display_name || user?.name} -

-

- {user?.nip05 || user?.username || shortenKey(pubkey)} -

+
+
+

+ {user?.display_name || user?.name} +

+
+ {user?.nip05 || user?.username || shortenKey(pubkey)} +
+
+
+

{user?.bio || user?.about}

+ + View full profile + +
diff --git a/src/app/chat/hooks/useDecryptMessage.tsx b/src/app/chat/hooks/useDecryptMessage.tsx index 7e4e569a..8e4a3715 100644 --- a/src/app/chat/hooks/useDecryptMessage.tsx +++ b/src/app/chat/hooks/useDecryptMessage.tsx @@ -1,16 +1,20 @@ import { nip04 } from "nostr-tools"; import { useEffect, useState } from "react"; -export function useDecryptMessage(data: any, userPriv: string) { +export function useDecryptMessage( + data: any, + userPubkey: string, + userPriv: string, +) { const [content, setContent] = useState(data.content); useEffect(() => { async function decrypt() { - const result = await nip04.decrypt( - userPriv, - data.sender_pubkey, - data.content, - ); + const pubkey = + userPubkey === data.sender_pubkey + ? data.receiver_pubkey + : data.sender_pubkey; + const result = await nip04.decrypt(userPriv, pubkey, data.content); setContent(result); } diff --git a/src/app/prefetch/pages/index.page.tsx b/src/app/prefetch/pages/index.page.tsx index 78877778..b689627f 100644 --- a/src/app/prefetch/pages/index.page.tsx +++ b/src/app/prefetch/pages/index.page.tsx @@ -33,15 +33,15 @@ export function Page() { const getQuery = useCallback(() => { const query = []; const follows = JSON.parse(account.follows); + const last = parseInt(lastLogin); let queryNoteSince: number; - let querySince: number; if (totalNotes === 0) { queryNoteSince = dateToUnix(getHourAgo(48, now.current)); } else { if (parseInt(lastLogin) > 0) { - queryNoteSince = parseInt(lastLogin); + queryNoteSince = last; } else { queryNoteSince = dateToUnix(getHourAgo(48, now.current)); } @@ -58,21 +58,21 @@ export function Page() { query.push({ kinds: [4], "#p": [account.pubkey], - since: querySince, + since: last, }); // kind 4 (chats) query query.push({ kinds: [4], authors: [account.pubkey], - since: querySince, + since: last, }); // kind 43, 43 (mute user, hide message) query query.push({ authors: [account.pubkey], kinds: [43, 44], - since: querySince, + since: last, }); return query; @@ -107,8 +107,8 @@ export function Page() { const receiver = event.tags.find((t) => t[0] === "p")[1]; createChat( event.id, - event.pubkey, receiver, + event.pubkey, event.content, event.tags, event.created_at, @@ -116,8 +116,8 @@ export function Page() { } else { createChat( event.id, - event.pubkey, account.pubkey, + event.pubkey, event.content, event.tags, event.created_at, diff --git a/src/renderer/shell.tsx b/src/renderer/shell.tsx index 853b7583..0a22b20b 100644 --- a/src/renderer/shell.tsx +++ b/src/renderer/shell.tsx @@ -2,7 +2,10 @@ import { LayoutDefault } from "./layoutDefault"; import { PageContext } from "./types"; import { RelayProvider } from "@shared/relayProvider"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { dateToUnix } from "@utils/date"; import { PageContextProvider } from "@utils/hooks/usePageContext"; +import { updateLastLogin } from "@utils/storage"; +import { useEffect } from "react"; const queryClient = new QueryClient(); @@ -14,6 +17,23 @@ export function Shell({ (pageContext.exports.Layout as React.ElementType) || (LayoutDefault as React.ElementType); + useEffect(() => { + async function initWindowEvent() { + const { TauriEvent } = await import("@tauri-apps/api/event"); + const { appWindow, getCurrent } = await import("@tauri-apps/api/window"); + + // listen window close event + getCurrent().listen(TauriEvent.WINDOW_CLOSE_REQUESTED, () => { + // update last login time + updateLastLogin(dateToUnix()); + // close window + appWindow.close(); + }); + } + + initWindowEvent().catch(console.error); + }, []); + return ( diff --git a/src/shared/eventCollector.tsx b/src/shared/eventCollector.tsx index cf8d8718..5509bc68 100644 --- a/src/shared/eventCollector.tsx +++ b/src/shared/eventCollector.tsx @@ -3,21 +3,14 @@ import { RelayContext } from "@shared/relayProvider"; import { useActiveAccount } from "@stores/accounts"; import { READONLY_RELAYS } from "@stores/constants"; import { dateToUnix } from "@utils/date"; -import { - createChat, - createNote, - updateAccount, - updateLastLogin, -} from "@utils/storage"; +import { createChat, createNote, updateAccount } from "@utils/storage"; import { getParentID, nip02ToArray } from "@utils/transform"; -import { useContext, useEffect, useRef } from "react"; +import { useContext } from "react"; import useSWRSubscription from "swr/subscription"; export default function EventCollector() { const pool: any = useContext(RelayContext); - const account = useActiveAccount((state: any) => state.account); - const now = useRef(new Date()); useSWRSubscription(account ? "eventCollector" : null, () => { const follows = JSON.parse(account.follows); @@ -26,7 +19,7 @@ export default function EventCollector() { { kinds: [1, 6], authors: follows, - since: dateToUnix(now.current), + since: dateToUnix(), }, { kinds: [3], @@ -35,7 +28,12 @@ export default function EventCollector() { { kinds: [4], "#p": [account.pubkey], - since: dateToUnix(now.current), + since: dateToUnix(), + }, + { + kinds: [4], + authors: [account.pubkey], + since: dateToUnix(), }, ], READONLY_RELAYS, @@ -64,16 +62,29 @@ export default function EventCollector() { break; } // chat - case 4: - createChat( - event.id, - account.pubkey, - event.pubkey, - event.content, - event.tags, - event.created_at, - ); + case 4: { + if (event.pubkey === account.pubkey) { + const receiver = event.tags.find((t) => t[0] === "p")[1]; + createChat( + event.id, + receiver, + event.pubkey, + event.content, + event.tags, + event.created_at, + ); + } else { + createChat( + event.id, + account.pubkey, + event.pubkey, + event.content, + event.tags, + event.created_at, + ); + } break; + } // repost case 6: createNote( @@ -98,23 +109,6 @@ export default function EventCollector() { }; }); - useEffect(() => { - async function initWindowEvent() { - const { TauriEvent } = await import("@tauri-apps/api/event"); - const { appWindow, getCurrent } = await import("@tauri-apps/api/window"); - - // listen window close event - getCurrent().listen(TauriEvent.WINDOW_CLOSE_REQUESTED, () => { - // update last login time - updateLastLogin(dateToUnix(now.current)); - // close window - appWindow.close(); - }); - } - - initWindowEvent().catch(console.error); - }, []); - return (
diff --git a/src/shared/form/imagePicker.tsx b/src/shared/form/imagePicker.tsx index 390b5cc8..bd39a27c 100644 --- a/src/shared/form/imagePicker.tsx +++ b/src/shared/form/imagePicker.tsx @@ -1,7 +1,6 @@ import PlusIcon from "@icons/plus"; import { channelContentAtom } from "@stores/channel"; -import { chatContentAtom } from "@stores/chat"; import { createBlobFromFile } from "@utils/createBlobFromFile"; @@ -14,9 +13,6 @@ export function ImagePicker({ type }: { type: string }) { let atom; switch (type) { - case "chat": - atom = chatContentAtom; - break; case "channel": atom = channelContentAtom; break; diff --git a/src/stores/chats.tsx b/src/stores/chats.tsx index a6b55f27..d29993b2 100644 --- a/src/stores/chats.tsx +++ b/src/stores/chats.tsx @@ -12,7 +12,7 @@ export const useChats = create((set) => ({ export const useChatMessages = create((set) => ({ messages: [], fetch: async (receiver_pubkey: string, sender_pubkey: string) => { - const response = await getChatMessages(receiver_pubkey, sender_pubkey); + const response: any = await getChatMessages(receiver_pubkey, sender_pubkey); set({ messages: response }); }, add: (message: any) => { diff --git a/src/utils/storage.tsx b/src/utils/storage.tsx index f3da1d0f..360fadb5 100644 --- a/src/utils/storage.tsx +++ b/src/utils/storage.tsx @@ -286,9 +286,19 @@ export async function getChatMessages( sender_pubkey: string, ) { const db = await connect(); - return await db.select( - `SELECT * FROM chats WHERE receiver_pubkey = "${receiver_pubkey}" AND sender_pubkey = "${sender_pubkey}" ORDER BY created_at ASC;`, + const sender: any = await db.select( + `SELECT * FROM chats WHERE sender_pubkey = "${sender_pubkey}" AND receiver_pubkey = "${receiver_pubkey}";`, ); + const receiver: any = await db.select( + `SELECT * FROM chats WHERE sender_pubkey = "${receiver_pubkey}" AND receiver_pubkey = "${sender_pubkey}";`, + ); + + const result = [...sender, ...receiver].sort( + (x: { created_at: number }, y: { created_at: number }) => + x.created_at - y.created_at, + ); + + return result; } // create chat