modals-context.tsx 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. genericModalVisible: boolean
  14. showGenericMessageModal: (
  15. title: GenericMessageModalOwnProps['title'],
  16. message: GenericMessageModalOwnProps['message']
  17. ) => void
  18. }
  19. const ModalsContext = createContext<ModalsContextValue | undefined>(undefined)
  20. export const ModalsContextProvider: FC = ({ children }) => {
  21. const [showGenericModal, setShowGenericModal] = useState(false)
  22. const [genericMessageModalData, setGenericMessageModalData] =
  23. useState<GenericMessageModalOwnProps>({ title: '', message: '' })
  24. const handleHideGenericModal = useCallback(() => {
  25. setShowGenericModal(false)
  26. }, [])
  27. const showGenericMessageModal = useCallback(
  28. (
  29. title: GenericMessageModalOwnProps['title'],
  30. message: GenericMessageModalOwnProps['message']
  31. ) => {
  32. setGenericMessageModalData({ title, message })
  33. setShowGenericModal(true)
  34. },
  35. []
  36. )
  37. const value = useMemo<ModalsContextValue>(
  38. () => ({
  39. showGenericMessageModal,
  40. genericModalVisible: showGenericModal,
  41. }),
  42. [showGenericMessageModal, showGenericModal]
  43. )
  44. return (
  45. <ModalsContext.Provider value={value}>
  46. {children}
  47. <GenericMessageModal
  48. show={showGenericModal}
  49. onHide={handleHideGenericModal}
  50. {...genericMessageModalData}
  51. />
  52. </ModalsContext.Provider>
  53. )
  54. }
  55. export function useModalsContext(): ModalsContextValue {
  56. const context = useContext(ModalsContext)
  57. if (!context) {
  58. throw new Error(
  59. 'useModalsContext is only available inside ModalsContextProvider'
  60. )
  61. }
  62. return context
  63. }