2024-04-22 16:20:23 +02:00
|
|
|
import {
|
|
|
|
createContext,
|
|
|
|
useState,
|
|
|
|
ReactNode,
|
|
|
|
useCallback,
|
|
|
|
useMemo,
|
|
|
|
} from "react";
|
|
|
|
|
|
|
|
export type StatusMessage = {
|
|
|
|
id: string;
|
|
|
|
text: string;
|
|
|
|
color?: string;
|
2024-04-29 00:59:03 +02:00
|
|
|
link?: string;
|
2024-04-22 16:20:23 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
export type StatusMessagesState = {
|
|
|
|
[key: string]: StatusMessage[];
|
|
|
|
};
|
|
|
|
|
|
|
|
type StatusBarMessagesProviderProps = {
|
|
|
|
children: ReactNode;
|
|
|
|
};
|
|
|
|
|
|
|
|
type StatusBarMessagesContextValue = {
|
|
|
|
messages: StatusMessagesState;
|
|
|
|
addMessage: (
|
|
|
|
key: string,
|
|
|
|
message: string,
|
|
|
|
color?: string,
|
|
|
|
messageId?: string,
|
2024-04-29 00:59:03 +02:00
|
|
|
link?: string,
|
2024-04-22 16:20:23 +02:00
|
|
|
) => string;
|
|
|
|
removeMessage: (key: string, messageId: string) => void;
|
|
|
|
clearMessages: (key: string) => void;
|
|
|
|
};
|
|
|
|
|
|
|
|
export const StatusBarMessagesContext =
|
|
|
|
createContext<StatusBarMessagesContextValue | null>(null);
|
|
|
|
|
|
|
|
export function StatusBarMessagesProvider({
|
|
|
|
children,
|
|
|
|
}: StatusBarMessagesProviderProps) {
|
|
|
|
const [messagesState, setMessagesState] = useState<StatusMessagesState>({});
|
|
|
|
|
|
|
|
const messages = useMemo(() => messagesState, [messagesState]);
|
|
|
|
|
|
|
|
const addMessage = useCallback(
|
2024-04-29 00:59:03 +02:00
|
|
|
(
|
|
|
|
key: string,
|
|
|
|
message: string,
|
|
|
|
color?: string,
|
|
|
|
messageId?: string,
|
|
|
|
link?: string,
|
|
|
|
) => {
|
2024-04-22 16:20:23 +02:00
|
|
|
const id = messageId || Date.now().toString();
|
|
|
|
const msgColor = color || "text-danger";
|
|
|
|
setMessagesState((prevMessages) => ({
|
|
|
|
...prevMessages,
|
|
|
|
[key]: [
|
|
|
|
...(prevMessages[key] || []),
|
2024-04-29 00:59:03 +02:00
|
|
|
{ id, text: message, color: msgColor, link },
|
2024-04-22 16:20:23 +02:00
|
|
|
],
|
|
|
|
}));
|
|
|
|
return id;
|
|
|
|
},
|
|
|
|
[],
|
|
|
|
);
|
|
|
|
|
|
|
|
const removeMessage = useCallback((key: string, messageId: string) => {
|
|
|
|
setMessagesState((prevMessages) => ({
|
|
|
|
...prevMessages,
|
|
|
|
[key]: prevMessages[key].filter((msg) => msg.id !== messageId),
|
|
|
|
}));
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
const clearMessages = useCallback((key: string) => {
|
|
|
|
setMessagesState((prevMessages) => {
|
|
|
|
const updatedMessages = { ...prevMessages };
|
|
|
|
delete updatedMessages[key];
|
|
|
|
return updatedMessages;
|
|
|
|
});
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
return (
|
|
|
|
<StatusBarMessagesContext.Provider
|
|
|
|
value={{ messages, addMessage, removeMessage, clearMessages }}
|
|
|
|
>
|
|
|
|
{children}
|
|
|
|
</StatusBarMessagesContext.Provider>
|
|
|
|
);
|
|
|
|
}
|