2026-09-15 16:33:09 -05:00
|
|
|
import { useState, ReactNode, useCallback, useMemo } from "react";
|
2024-04-22 09:20:23 -05:00
|
|
|
import {
|
2026-09-15 16:33:09 -05:00
|
|
|
StatusBarMessagesContext,
|
|
|
|
|
StatusMessagesState,
|
|
|
|
|
} from "@/context/statusbar-context";
|
2024-04-22 09:20:23 -05:00
|
|
|
|
|
|
|
|
type StatusBarMessagesProviderProps = {
|
|
|
|
|
children: ReactNode;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export function StatusBarMessagesProvider({
|
|
|
|
|
children,
|
|
|
|
|
}: StatusBarMessagesProviderProps) {
|
|
|
|
|
const [messagesState, setMessagesState] = useState<StatusMessagesState>({});
|
|
|
|
|
|
|
|
|
|
const messages = useMemo(() => messagesState, [messagesState]);
|
|
|
|
|
|
|
|
|
|
const addMessage = useCallback(
|
2024-04-28 16:59:03 -06:00
|
|
|
(
|
|
|
|
|
key: string,
|
|
|
|
|
message: string,
|
|
|
|
|
color?: string,
|
|
|
|
|
messageId?: string,
|
|
|
|
|
link?: string,
|
|
|
|
|
) => {
|
2024-05-18 13:55:17 -05:00
|
|
|
if (!key || !message) return;
|
|
|
|
|
|
|
|
|
|
const id = messageId ?? Date.now().toString();
|
|
|
|
|
const msgColor = color ?? "text-danger";
|
|
|
|
|
|
|
|
|
|
setMessagesState((prevMessages) => {
|
|
|
|
|
const existingMessages = prevMessages[key] || [];
|
|
|
|
|
// Check if a message with the same ID already exists
|
|
|
|
|
const messageIndex = existingMessages.findIndex((msg) => msg.id === id);
|
|
|
|
|
|
|
|
|
|
const newMessage = { id, text: message, color: msgColor, link };
|
|
|
|
|
|
|
|
|
|
// If the message exists, replace it, otherwise add the new message
|
|
|
|
|
let updatedMessages;
|
|
|
|
|
if (messageIndex > -1) {
|
|
|
|
|
updatedMessages = [
|
|
|
|
|
...existingMessages.slice(0, messageIndex),
|
|
|
|
|
newMessage,
|
|
|
|
|
...existingMessages.slice(messageIndex + 1),
|
|
|
|
|
];
|
|
|
|
|
} else {
|
|
|
|
|
updatedMessages = [...existingMessages, newMessage];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
...prevMessages,
|
|
|
|
|
[key]: updatedMessages,
|
|
|
|
|
};
|
|
|
|
|
});
|
|
|
|
|
|
2024-04-22 09:20:23 -05:00
|
|
|
return id;
|
|
|
|
|
},
|
|
|
|
|
[],
|
|
|
|
|
);
|
|
|
|
|
|
2024-05-18 13:55:17 -05:00
|
|
|
const removeMessage = useCallback(
|
|
|
|
|
(key: string, messageId: string) => {
|
|
|
|
|
if (!messages || !key || !messages[key]) return;
|
|
|
|
|
setMessagesState((prevMessages) => ({
|
|
|
|
|
...prevMessages,
|
|
|
|
|
[key]: prevMessages[key].filter((msg) => msg.id !== messageId),
|
|
|
|
|
}));
|
|
|
|
|
},
|
|
|
|
|
[messages],
|
|
|
|
|
);
|
2024-04-22 09:20:23 -05:00
|
|
|
|
|
|
|
|
const clearMessages = useCallback((key: string) => {
|
|
|
|
|
setMessagesState((prevMessages) => {
|
|
|
|
|
const updatedMessages = { ...prevMessages };
|
|
|
|
|
delete updatedMessages[key];
|
|
|
|
|
return updatedMessages;
|
|
|
|
|
});
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
return (
|
2026-03-05 08:42:38 -06:00
|
|
|
<StatusBarMessagesContext
|
2024-04-22 09:20:23 -05:00
|
|
|
value={{ messages, addMessage, removeMessage, clearMessages }}
|
|
|
|
|
>
|
|
|
|
|
{children}
|
2026-03-05 08:42:38 -06:00
|
|
|
</StatusBarMessagesContext>
|
2024-04-22 09:20:23 -05:00
|
|
|
);
|
|
|
|
|
}
|