import { createContext, useContext, FC, useCallback, useMemo, useState, } from 'react' import GenericMessageModal, { GenericMessageModalOwnProps, } from '@/features/ide-react/components/modals/generic-message-modal' import OutOfSyncModal, { OutOfSyncModalProps, } from '@/features/ide-react/components/modals/out-of-sync-modal' import LockEditorMessageModal from '@/features/ide-react/components/modals/lock-editor-message-modal' type ModalsContextValue = { genericModalVisible: boolean showGenericMessageModal: ( title: GenericMessageModalOwnProps['title'], message: GenericMessageModalOwnProps['message'] ) => void showOutOfSyncModal: ( editorContent: OutOfSyncModalProps['editorContent'] ) => void showLockEditorMessageModal: (delay: number) => void } const ModalsContext = createContext(undefined) export const ModalsContextProvider: FC = ({ children }) => { const [showGenericModal, setShowGenericModal] = useState(false) const [genericMessageModalData, setGenericMessageModalData] = useState({ title: '', message: '' }) const [shouldShowOutOfSyncModal, setShouldShowOutOfSyncModal] = useState(false) const [outOfSyncModalData, setOutOfSyncModalData] = useState({ editorContent: '', }) const [shouldShowLockEditorModal, setShouldShowLockEditorModal] = useState(false) const [lockEditorModalData, setLockEditorModalData] = useState({ delay: 0, }) const handleHideGenericModal = useCallback(() => { setShowGenericModal(false) }, []) const showGenericMessageModal = useCallback( ( title: GenericMessageModalOwnProps['title'], message: GenericMessageModalOwnProps['message'] ) => { setGenericMessageModalData({ title, message }) setShowGenericModal(true) }, [] ) const handleHideOutOfSyncModal = useCallback(() => { setShouldShowOutOfSyncModal(false) }, []) const showOutOfSyncModal = useCallback((editorContent: string) => { setOutOfSyncModalData({ editorContent }) setShouldShowOutOfSyncModal(true) }, []) const showLockEditorMessageModal = useCallback((delay: number) => { setLockEditorModalData({ delay }) setShouldShowLockEditorModal(true) }, []) const value = useMemo( () => ({ showGenericMessageModal, genericModalVisible: showGenericModal, showOutOfSyncModal, showLockEditorMessageModal, }), [ showGenericMessageModal, showGenericModal, showOutOfSyncModal, showLockEditorMessageModal, ] ) return ( {children} ) } export function useModalsContext(): ModalsContextValue { const context = useContext(ModalsContext) if (!context) { throw new Error( 'useModalsContext is only available inside ModalsContextProvider' ) } return context }