diff --git a/src/components/modal/Modal.tsx b/src/components/modal/Modal.tsx index 9e06ae8..3de180b 100644 --- a/src/components/modal/Modal.tsx +++ b/src/components/modal/Modal.tsx @@ -8,6 +8,7 @@ export default function Modal(props: ModalProps){ display, backgroundType = "blur", backgroundClassName, + top = false, close, className, children @@ -34,7 +35,11 @@ export default function Modal(props: ModalProps){
{ display?: boolean; backgroundType?: ModalBackgroundType; backgroundClassName?: string; + top?: boolean; close?: () => void; children: React.ReactNode; } diff --git a/src/main.tsx b/src/main.tsx index c43e879..02ae970 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -5,6 +5,7 @@ import App from './App.tsx' import './index.css' import { AuthProvider } from './providers/AuthProvider.tsx' import { ThemeProvider } from './providers/ThemeProvider.tsx' +import { TimedModalProvider } from "./providers/TimedModalProvider.tsx" const queryClient = new QueryClient(); @@ -17,12 +18,14 @@ createRoot(document.getElementById('root')!).render( defaultTheme="dark" storageKey="vite-ui-theme" > - - - + + + + + diff --git a/src/providers/ThemeProvider.tsx b/src/providers/ThemeProvider.tsx index ee50fd4..ea6b18c 100644 --- a/src/providers/ThemeProvider.tsx +++ b/src/providers/ThemeProvider.tsx @@ -1,5 +1,6 @@ import { createContext, useContext, useEffect, useMemo, useState } from "react"; + type Theme = "dark" | "light" | "system"; type ThemeProviderProps = { diff --git a/src/providers/TimedModalProvider.tsx b/src/providers/TimedModalProvider.tsx new file mode 100644 index 0000000..a0b8040 --- /dev/null +++ b/src/providers/TimedModalProvider.tsx @@ -0,0 +1,86 @@ +import Modal from "@/components/modal/Modal"; +import ModalBody from "@/components/modal/ModalBody"; +import { createContext, useContext, useEffect, useRef, useState } from "react"; + + +type TimedModalProviderState = { + addMessage: (timeout: number, message: React.ReactNode) => void; +} + + +const initialState: TimedModalProviderState = { + addMessage: () => null +} + +const TimedModalProviderContext = createContext(initialState); + + +export function TimedModalProvider({ + children +}:{ + children: React.ReactNode; +}){ + const [ display, setDisplay ] = useState(false); + const [ messages, setMessages ] = useState([]); + const messagesRef = useRef(messages); + messagesRef.current = messages; + + + useEffect(() => { + console.log("effect"); + console.log(messages); + if(messages.length > 0){ + setDisplay(true); + } + else{ + setDisplay(false); + } + }, [ messages ]); + + + const addMessage = (timeout: number, message: React.ReactNode) => { + setMessages([...messages, message]); + setTimeout(() => { + setMessages(messagesRef.current.filter((m) => m !== message)); + }, timeout); + } + + + return ( + + + +
+ { + messages.map((message, index) => ( +
+ {message} +
+ )) + } +
+
+
+ {children} +
+ ); +} + +export const useTimedModal = () => { + const context = useContext(TimedModalProviderContext); + + if(context === undefined){ + throw new Error("useTimeModal must be used within a TimedModalProvider"); + } + + return context; +}