initial commit

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
BOHA
2026-03-23 08:46:51 +01:00
commit 4608494a3f
130 changed files with 40361 additions and 0 deletions

View File

@@ -0,0 +1,71 @@
import { createContext, useContext, useState, useCallback, useMemo, useRef, type ReactNode } from 'react'
interface Alert {
id: string
message: string
type: 'success' | 'error' | 'warning' | 'info'
}
interface AlertMethods {
addAlert: (message: string, type?: string, duration?: number) => string
removeAlert: (id: string) => void
success: (message: string, duration?: number) => string
error: (message: string, duration?: number) => string
warning: (message: string, duration?: number) => string
info: (message: string, duration?: number) => string
}
interface AlertStateValue {
alerts: Alert[]
removeAlert: (id: string) => void
}
const AlertContext = createContext<AlertMethods | null>(null)
const AlertStateContext = createContext<AlertStateValue | null>(null)
export function AlertProvider({ children }: { children: ReactNode }) {
const [alerts, setAlerts] = useState<Alert[]>([])
const removeAlert = useCallback((id: string) => {
setAlerts(prev => prev.filter(alert => alert.id !== id))
}, [])
const counterRef = useRef(0)
const addAlert = useCallback((message: string, type = 'success', duration = 4000) => {
const id = `${Date.now()}-${counterRef.current++}`
setAlerts(prev => [...prev, { id, message, type: type as Alert['type'] }])
if (duration > 0) {
setTimeout(() => removeAlert(id), duration)
}
return id
}, [removeAlert])
const methods = useMemo<AlertMethods>(() => ({
addAlert,
removeAlert,
success: (message, duration) => addAlert(message, 'success', duration),
error: (message, duration) => addAlert(message, 'error', duration),
warning: (message, duration) => addAlert(message, 'warning', duration),
info: (message, duration) => addAlert(message, 'info', duration),
}), [addAlert, removeAlert])
return (
<AlertContext.Provider value={methods}>
<AlertStateContext.Provider value={{ alerts, removeAlert }}>
{children}
</AlertStateContext.Provider>
</AlertContext.Provider>
)
}
export function useAlert(): AlertMethods {
const context = useContext(AlertContext)
if (!context) throw new Error('useAlert must be used within an AlertProvider')
return context
}
export function useAlertState(): AlertStateValue {
const context = useContext(AlertStateContext)
if (!context) throw new Error('useAlertState must be used within an AlertProvider')
return context
}