Message flash provider

Allows errors to be displayed neatly in ephemeral boxes at bottom of screen
This commit is contained in:
jude
2023-11-05 13:45:04 +00:00
parent f310bbef54
commit 30dfaa17af
11 changed files with 131 additions and 31 deletions

View File

@ -0,0 +1,6 @@
import { createContext } from "preact";
import { useContext } from "preact/compat";
export const FlashContext = createContext(null);
export const useFlash = () => useContext(FlashContext);

View File

@ -0,0 +1,30 @@
import { FlashContext } from "./FlashContext";
import { useState } from "preact/hooks";
import { MESSAGE_FLASH_TIME } from "../../consts";
export const FlashProvider = ({ children }) => {
const [messages, setMessages] = useState([] as string[]);
return (
<FlashContext.Provider
value={(message: string) => {
setMessages((messages: string[]) => [...messages, message]);
setTimeout(() => {
setMessages((messages) => [...messages].splice(1));
}, MESSAGE_FLASH_TIME);
}}
>
<>
{children}
{messages.map((message) => (
<div class="notification is-danger flash-message is-active">
<span class="icon">
<i class="far fa-exclamation-circle"></i>
</span>{" "}
<span class="error-message">{message}</span>
</div>
))}
</>
</FlashContext.Provider>
);
};

View File

@ -2,31 +2,29 @@ import { Sidebar } from "../Sidebar";
import { QueryClient, QueryClientProvider } from "react-query";
import { Route, Router, Switch } from "wouter";
import { Welcome } from "../Welcome";
import { GuildReminders } from "../GuildReminders";
import { Guild } from "../Guild";
import { FlashProvider } from "./FlashProvider";
export function App() {
const queryClient = new QueryClient();
return (
<QueryClientProvider client={queryClient}>
<>
<FlashProvider>
<QueryClientProvider client={queryClient}>
<Router base={"/dashboard"}>
<div class="columns is-gapless dashboard-frame">
<Sidebar></Sidebar>
<div class="column is-main-content">
<Switch>
<Route
path={"/:guild/reminders"}
component={GuildReminders}
></Route>
<Route path={"/:guild/reminders"} component={Guild}></Route>
<Route>
<Welcome></Welcome>
<Welcome />
</Route>
</Switch>
</div>
</div>
</Router>
</>
</QueryClientProvider>
</QueryClientProvider>
</FlashProvider>
);
}