All files / src/components/Toast ToastContext.tsx

100% Statements 22/22
100% Branches 2/2
100% Functions 7/7
100% Lines 20/20

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 6010x   10x               10x         10x             5x 5x 5x   5x 3x 3x 3x     5x 1x     5x 1x     5x 1x     5x                 1x         10x  
import { ReactNode, createContext, useContext, useState } from 'react'
 
import { Toast, ToastParams } from './Toast'
 
export type ToastContextProps = {
  toast: (message: string) => void
  toastSuccess: (message: string) => void
  toastError: (message: string) => void
}
 
const ToastContext = createContext<ToastContextProps>({} as ToastContextProps)
 
/**
 * Hook to access toast context
 */
const useToastContext = () => useContext(ToastContext)
 
/**
 * Provider element to wrap other elements to access toast context
 * @see {@link useToastContext}
 */
function ToastProvider({ children }: { children: ReactNode }) {
  const [showToast, setShowToast] = useState(false)
  const [type, setType] = useState<ToastParams['type']>('default')
  const [text, setText] = useState('')
 
  const _toast = (toastType: typeof type, message: string) => {
    setType(toastType)
    setText(message)
    setShowToast(true)
  }
 
  const toast = (message: string) => {
    _toast('default', message)
  }
 
  const toastSuccess = (message: string) => {
    _toast('success', message)
  }
 
  const toastError = (message: string) => {
    _toast('error', message)
  }
 
  return (
    <ToastContext.Provider
      value={{
        toast,
        toastSuccess,
        toastError,
      }}
    >
      {children}
      {showToast && <Toast type={type} text={text} onClose={() => setShowToast(false)} />}
    </ToastContext.Provider>
  )
}
 
export { useToastContext, ToastProvider }