update channel notification
This commit is contained in:
@@ -29,8 +29,15 @@ export function ChannelsListItem({ data }: { data: any }) {
|
|||||||
>
|
>
|
||||||
<span className="text-base text-white">#</span>
|
<span className="text-base text-white">#</span>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div className="w-full inline-flex items-center justify-between">
|
||||||
<h5 className="truncate font-medium text-zinc-200">{channel?.name}</h5>
|
<h5 className="truncate font-medium text-zinc-200">{channel?.name}</h5>
|
||||||
|
<div className="flex items-center">
|
||||||
|
{data.new_messages && (
|
||||||
|
<span className="inline-flex items-center justify-center rounded bg-fuchsia-400/10 w-8 px-1 py-1 text-xs font-medium text-fuchsia-500 ring-1 ring-inset ring-fuchsia-400/20">
|
||||||
|
{data.new_messages}
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -29,9 +29,11 @@ export function ChatsList() {
|
|||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
chats.map((item) => (
|
chats.map((item) => {
|
||||||
<ChatsListItem key={item.sender_pubkey} data={item} />
|
if (account.pubkey !== item.sender_pubkey) {
|
||||||
))
|
return <ChatsListItem key={item.sender_pubkey} data={item} />;
|
||||||
|
}
|
||||||
|
})
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
import { Image } from "@shared/image";
|
import { Image } from "@shared/image";
|
||||||
import { RelayContext } from "@shared/relayProvider";
|
import { RelayContext } from "@shared/relayProvider";
|
||||||
import { useActiveAccount } from "@stores/accounts";
|
import { useActiveAccount } from "@stores/accounts";
|
||||||
|
import { useChannels } from "@stores/channels";
|
||||||
import { useChats } from "@stores/chats";
|
import { useChats } from "@stores/chats";
|
||||||
import { DEFAULT_AVATAR, READONLY_RELAYS } from "@stores/constants";
|
import { DEFAULT_AVATAR, READONLY_RELAYS } from "@stores/constants";
|
||||||
|
import { usePageContext } from "@utils/hooks/usePageContext";
|
||||||
import { useProfile } from "@utils/hooks/useProfile";
|
import { useProfile } from "@utils/hooks/useProfile";
|
||||||
import { sendNativeNotification } from "@utils/notification";
|
import { sendNativeNotification } from "@utils/notification";
|
||||||
import { useContext } from "react";
|
import { useContext } from "react";
|
||||||
@@ -10,8 +12,16 @@ import useSWRSubscription from "swr/subscription";
|
|||||||
|
|
||||||
export function ActiveAccount({ data }: { data: any }) {
|
export function ActiveAccount({ data }: { data: any }) {
|
||||||
const pool: any = useContext(RelayContext);
|
const pool: any = useContext(RelayContext);
|
||||||
|
const pageContext = usePageContext();
|
||||||
|
const pathnames: any = pageContext.urlParsed.pathname;
|
||||||
|
|
||||||
|
const notChatPage = pathnames.includes("/chat") ? false : true;
|
||||||
|
const notChannelPage = pathnames.includes("/channel") ? false : true;
|
||||||
|
const notSpacePage = pathnames.includes("/space") ? false : true;
|
||||||
|
|
||||||
const lastLogin = useActiveAccount((state: any) => state.lastLogin);
|
const lastLogin = useActiveAccount((state: any) => state.lastLogin);
|
||||||
const addChat = useChats((state: any) => state.add);
|
const notifyChat = useChats((state: any) => state.add);
|
||||||
|
const notifyChannel = useChannels((state: any) => state.add);
|
||||||
|
|
||||||
const { user } = useProfile(data.pubkey);
|
const { user } = useProfile(data.pubkey);
|
||||||
|
|
||||||
@@ -29,11 +39,23 @@ export function ActiveAccount({ data }: { data: any }) {
|
|||||||
READONLY_RELAYS,
|
READONLY_RELAYS,
|
||||||
(event) => {
|
(event) => {
|
||||||
switch (event.kind) {
|
switch (event.kind) {
|
||||||
|
case 1:
|
||||||
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
// update state
|
if (notChatPage) {
|
||||||
addChat(event.pubkey);
|
// update state
|
||||||
// send native notifiation
|
notifyChat(event.pubkey);
|
||||||
sendNativeNotification(event.content);
|
// send native notifiation
|
||||||
|
sendNativeNotification("You've received new message");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 42:
|
||||||
|
if (notChannelPage) {
|
||||||
|
// update state
|
||||||
|
notifyChannel(event);
|
||||||
|
// send native notifiation
|
||||||
|
sendNativeNotification(event.content);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -2,13 +2,36 @@ import { getChannels } from "@utils/storage";
|
|||||||
import { create } from "zustand";
|
import { create } from "zustand";
|
||||||
import { immer } from "zustand/middleware/immer";
|
import { immer } from "zustand/middleware/immer";
|
||||||
|
|
||||||
export const useChannels = create((set) => ({
|
export const useChannels = create(
|
||||||
channels: [],
|
immer((set) => ({
|
||||||
fetch: async () => {
|
channels: [],
|
||||||
const response = await getChannels(10, 0);
|
fetch: async () => {
|
||||||
set({ channels: response });
|
const response = await getChannels(10, 0);
|
||||||
},
|
set({ channels: response });
|
||||||
}));
|
},
|
||||||
|
add: (event) => {
|
||||||
|
set((state) => {
|
||||||
|
const target = state.channels.findIndex(
|
||||||
|
(m: { event_id: string }) => m.event_id === event.id,
|
||||||
|
);
|
||||||
|
if (target !== -1) {
|
||||||
|
state.channels[target]["new_messages"] =
|
||||||
|
state.channels[target]["new_messages"] + 1 || 1;
|
||||||
|
} else {
|
||||||
|
state.channels.push({ event_id: event.id, ...event });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
clearBubble: (id: string) => {
|
||||||
|
set((state) => {
|
||||||
|
const target = state.channels.findIndex(
|
||||||
|
(m: { event_id: string }) => m.event_id === id,
|
||||||
|
);
|
||||||
|
state.channels[target]["new_messages"] = 0;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
})),
|
||||||
|
);
|
||||||
|
|
||||||
export const useChannelMessages = create(
|
export const useChannelMessages = create(
|
||||||
immer((set) => ({
|
immer((set) => ({
|
||||||
|
|||||||
Reference in New Issue
Block a user