renamed dialog, added reactions menu

This commit is contained in:
Dan Ditomaso
2025-04-07 11:42:15 -04:00
parent e410ccb2f4
commit 0e868cef58
12 changed files with 239 additions and 142 deletions
+3 -3
View File
@@ -30,7 +30,7 @@ export type DialogVariant =
| "nodeDetails"
| "unsafeRoles"
| "refreshKeys"
| "clearMessages";
| "deleteMessages";
type NodeError = {
node: number;
@@ -73,7 +73,7 @@ export interface Device {
nodeDetails: boolean;
unsafeRoles: boolean;
refreshKeys: boolean;
clearMessages: boolean;
deleteMessages: boolean;
};
@@ -155,7 +155,7 @@ export const useDeviceStore = createStore<DeviceState>((set, get) => ({
unsafeRoles: false,
refreshKeys: false,
rebootOTA: false,
clearMessages: false,
deleteMessages: false,
},
pendingSettingsChanges: false,
messageDraft: "",
+8 -8
View File
@@ -286,8 +286,8 @@ describe('useMessageStore', () => {
const messageIdToDelete = directMessageToOther1.messageId;
useMessageStore.getState().clearMessageByMessageId({
type: MessageType.Direct,
sender: myNodeNum,
recipient: otherNodeNum1,
from: myNodeNum,
to: otherNodeNum1,
messageId: messageIdToDelete
});
const state = useMessageStore.getState();
@@ -300,8 +300,8 @@ describe('useMessageStore', () => {
const messageIdToDelete = directMessageFromOther1.messageId;
useMessageStore.getState().clearMessageByMessageId({
type: MessageType.Direct,
sender: otherNodeNum1,
recipient: myNodeNum,
from: otherNodeNum1,
to: myNodeNum,
messageId: messageIdToDelete
});
const state = useMessageStore.getState();
@@ -321,8 +321,8 @@ describe('useMessageStore', () => {
expect(state.messages.broadcast[broadcastChannel]?.[messageIdToDelete]).toBeUndefined();
});
it('should clean up empty recipient/sender/channel objects', () => {
useMessageStore.getState().clearMessageByMessageId({ type: MessageType.Direct, sender: otherNodeNum1, recipient: myNodeNum, messageId: directMessageFromOther1.messageId });
it('should clean up empty to/from/channel objects', () => {
useMessageStore.getState().clearMessageByMessageId({ type: MessageType.Direct, from: otherNodeNum1, to: myNodeNum, messageId: directMessageFromOther1.messageId });
expect(useMessageStore.getState().messages.direct[otherNodeNum1]?.[myNodeNum]).toBeUndefined(); // Recipient level removed
expect(useMessageStore.getState().messages.direct[otherNodeNum1]).toBeUndefined(); // Sender level removed
@@ -354,14 +354,14 @@ describe('useMessageStore', () => {
});
});
describe('clearAllMessages', () => {
describe('deleteAllMessages', () => {
it('should clear all direct and broadcast messages', () => {
useMessageStore.getState().saveMessage(directMessageToOther1);
useMessageStore.getState().saveMessage(broadcastMessage1);
expect(Object.keys(useMessageStore.getState().messages.direct).length).toBeGreaterThan(0);
expect(Object.keys(useMessageStore.getState().messages.broadcast).length).toBeGreaterThan(0);
useMessageStore.getState().clearAllMessages();
useMessageStore.getState().deleteAllMessages();
expect(useMessageStore.getState().messages.direct).toEqual({});
expect(useMessageStore.getState().messages.broadcast).toEqual({});
+10 -10
View File
@@ -57,11 +57,11 @@ export interface MessageStore {
getMessages: (type: MessageType, options: { myNodeNum: number; otherNodeNum?: number; channel?: number }) => Message[];
getDraft: (key: Types.Destination) => string;
setDraft: (key: Types.Destination, message: string) => void;
clearAllMessages: () => void;
deleteAllMessages: () => void;
clearMessageByMessageId: (params: {
type: MessageType;
sender?: number;
recipient?: number;
from?: number;
to?: number;
channel?: number;
messageId: number
}) => void;
@@ -177,7 +177,7 @@ export const useMessageStore = create<MessageStore>()(
}
return [];
},
clearMessageByMessageId: ({ type, sender, recipient, channel, messageId }) => {
clearMessageByMessageId: ({ type, from, to, channel, messageId }) => {
set(produce((state: MessageStore) => {
if (type === MessageType.Broadcast && channel !== undefined) {
const messageMap = state.messages.broadcast[channel];
@@ -187,14 +187,14 @@ export const useMessageStore = create<MessageStore>()(
delete state.messages.broadcast[channel];
}
}
} else if (type === MessageType.Direct && sender !== undefined && recipient !== undefined) {
const messageMap = state.messages.direct?.[sender]?.[recipient];
} else if (type === MessageType.Direct && from !== undefined && to !== undefined) {
const messageMap = state.messages.direct?.[from]?.[to];
if (messageMap?.[messageId]) {
delete messageMap[messageId];
if (Object.keys(messageMap).length === 0) {
delete state.messages.direct[sender][recipient];
if (Object.keys(state.messages.direct[sender]).length === 0) {
delete state.messages.direct[sender];
delete state.messages.direct[from][to];
if (Object.keys(state.messages.direct[from]).length === 0) {
delete state.messages.direct[from];
}
}
}
@@ -215,7 +215,7 @@ export const useMessageStore = create<MessageStore>()(
state.draft.delete(key);
}));
},
clearAllMessages: () => {
deleteAllMessages: () => {
set(produce((state: MessageStore) => {
state.messages.direct = {};
state.messages.broadcast = {};