modals-context.tsx 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import {
  2. createContext,
  3. useContext,
  4. FC,
  5. useCallback,
  6. useMemo,
  7. useState,
  8. } from 'react'
  9. import GenericMessageModal, {
  10. GenericMessageModalOwnProps,
  11. } from '@/features/ide-react/components/modals/generic-message-modal'
  12. type ModalsContextValue = {
  13. showGenericMessageModal: (
  14. title: GenericMessageModalOwnProps['title'],
  15. message: GenericMessageModalOwnProps['message']
  16. ) => void
  17. }
  18. const ModalsContext = createContext<ModalsContextValue | undefined>(undefined)
  19. export const ModalsContextProvider: FC = ({ children }) => {
  20. const [showGenericModal, setShowGenericModal] = useState(false)
  21. const [genericMessageModalData, setGenericMessageModalData] =
  22. useState<GenericMessageModalOwnProps>({ title: '', message: '' })
  23. const handleHideGenericModal = useCallback(() => {
  24. setShowGenericModal(false)
  25. }, [])
  26. const showGenericMessageModal = useCallback(
  27. (
  28. title: GenericMessageModalOwnProps['title'],
  29. message: GenericMessageModalOwnProps['message']
  30. ) => {
  31. setGenericMessageModalData({ title, message })
  32. setShowGenericModal(true)
  33. },
  34. []
  35. )
  36. const value = useMemo<ModalsContextValue>(
  37. () => ({
  38. showGenericMessageModal,
  39. }),
  40. [showGenericMessageModal]
  41. )
  42. return (
  43. <ModalsContext.Provider value={value}>
  44. {children}
  45. <GenericMessageModal
  46. show={showGenericModal}
  47. onHide={handleHideGenericModal}
  48. {...genericMessageModalData}
  49. />
  50. </ModalsContext.Provider>
  51. )
  52. }
  53. export function useModalsContext(): ModalsContextValue {
  54. const context = useContext(ModalsContext)
  55. if (!context) {
  56. throw new Error(
  57. 'useModalsContext is only available inside ModalsContextProvider'
  58. )
  59. }
  60. return context
  61. }