github.com/filecoin-project/bacalhau@v0.3.23-0.20230228154132-45c989550ace/dashboard/frontend/src/contexts/snackbar.tsx (about) 1 import React, { FC, createContext, useMemo, useState, useCallback } from 'react' 2 3 export type ISnackbarSeverity = 'error' | 'warning' | 'info' | 'success' 4 5 export interface ISnackbarData { 6 message: string, 7 severity: ISnackbarSeverity, 8 } 9 10 export interface ISnackbarContext { 11 snackbar?: ISnackbarData, 12 setSnackbar: { 13 (message: string, severity?: ISnackbarSeverity): void, 14 }, 15 } 16 17 export const SnackbarContext = createContext<ISnackbarContext>({ 18 setSnackbar: () => {}, 19 }) 20 21 export const useSnackbarContext = (): ISnackbarContext => { 22 const [ snackbar, setRawSnackbar ] = useState<ISnackbarData>() 23 const setSnackbar = useCallback((message: string, severity?: ISnackbarSeverity) => { 24 if(!message) { 25 setRawSnackbar(undefined) 26 } else { 27 setRawSnackbar({ 28 message, 29 severity: severity || 'info', 30 }) 31 } 32 33 }, []) 34 const contextValue = useMemo<ISnackbarContext>(() => ({ 35 snackbar, 36 setSnackbar, 37 }), [ 38 snackbar, 39 setSnackbar, 40 ]) 41 return contextValue 42 } 43 44 export const SnackbarContextProvider: FC = ({ children }) => { 45 const value = useSnackbarContext() 46 return ( 47 <SnackbarContext.Provider value={ value }> 48 { children } 49 </SnackbarContext.Provider> 50 ) 51 }