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  }