modal-context.tsx 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. 'use client'
  2. import type { Dispatch, SetStateAction } from 'react'
  3. import { useState } from 'react'
  4. import { createContext, useContext } from 'use-context-selector'
  5. import AccountSetting from '@/app/components/header/account-setting'
  6. import ApiBasedExtensionModal from '@/app/components/header/account-setting/api-based-extension-page/modal'
  7. import ModerationSettingModal from '@/app/components/app/configuration/toolbox/moderation/moderation-setting-modal'
  8. import ExternalDataToolModal from '@/app/components/app/configuration/tools/external-data-tool-modal'
  9. import type { ModerationConfig } from '@/models/debug'
  10. import type {
  11. ApiBasedExtension,
  12. ExternalDataTool,
  13. } from '@/models/common'
  14. export type ModalState<T> = {
  15. payload: T
  16. onCancelCallback?: () => void
  17. onSaveCallback?: (newPayload: T) => void
  18. onValidateBeforeSaveCallback?: (newPayload: T) => boolean
  19. }
  20. const ModalContext = createContext<{
  21. setShowAccountSettingModal: Dispatch<SetStateAction<ModalState<string> | null>>
  22. setShowApiBasedExtensionModal: Dispatch<SetStateAction<ModalState<ApiBasedExtension> | null>>
  23. setShowModerationSettingModal: Dispatch<SetStateAction<ModalState<ModerationConfig> | null>>
  24. setShowExternalDataToolModal: Dispatch<SetStateAction<ModalState<ExternalDataTool> | null>>
  25. }>({
  26. setShowAccountSettingModal: () => {},
  27. setShowApiBasedExtensionModal: () => {},
  28. setShowModerationSettingModal: () => {},
  29. setShowExternalDataToolModal: () => {},
  30. })
  31. export const useModalContext = () => useContext(ModalContext)
  32. type ModalContextProviderProps = {
  33. children: React.ReactNode
  34. }
  35. export const ModalContextProvider = ({
  36. children,
  37. }: ModalContextProviderProps) => {
  38. const [showAccountSettingModal, setShowAccountSettingModal] = useState<ModalState<string> | null>(null)
  39. const [showApiBasedExtensionModal, setShowApiBasedExtensionModal] = useState<ModalState<ApiBasedExtension> | null>(null)
  40. const [showModerationSettingModal, setShowModerationSettingModal] = useState<ModalState<ModerationConfig> | null>(null)
  41. const [showExternalDataToolModal, setShowExternalDataToolModal] = useState<ModalState<ExternalDataTool> | null>(null)
  42. const handleCancelAccountSettingModal = () => {
  43. setShowAccountSettingModal(null)
  44. if (showAccountSettingModal?.onCancelCallback)
  45. showAccountSettingModal?.onCancelCallback()
  46. }
  47. const handleCancelModerationSettingModal = () => {
  48. setShowModerationSettingModal(null)
  49. if (showModerationSettingModal?.onCancelCallback)
  50. showModerationSettingModal.onCancelCallback()
  51. }
  52. const handleSaveApiBasedExtension = (newApiBasedExtension: ApiBasedExtension) => {
  53. if (showApiBasedExtensionModal?.onSaveCallback)
  54. showApiBasedExtensionModal.onSaveCallback(newApiBasedExtension)
  55. setShowApiBasedExtensionModal(null)
  56. }
  57. const handleSaveModeration = (newModerationConfig: ModerationConfig) => {
  58. if (showModerationSettingModal?.onSaveCallback)
  59. showModerationSettingModal.onSaveCallback(newModerationConfig)
  60. setShowModerationSettingModal(null)
  61. }
  62. const handleSaveExternalDataTool = (newExternalDataTool: ExternalDataTool) => {
  63. if (showExternalDataToolModal?.onSaveCallback)
  64. showExternalDataToolModal.onSaveCallback(newExternalDataTool)
  65. setShowExternalDataToolModal(null)
  66. }
  67. const handleValidateBeforeSaveExternalDataTool = (newExternalDataTool: ExternalDataTool) => {
  68. if (showExternalDataToolModal?.onValidateBeforeSaveCallback)
  69. return showExternalDataToolModal?.onValidateBeforeSaveCallback(newExternalDataTool)
  70. return true
  71. }
  72. return (
  73. <ModalContext.Provider value={{
  74. setShowAccountSettingModal,
  75. setShowApiBasedExtensionModal,
  76. setShowModerationSettingModal,
  77. setShowExternalDataToolModal,
  78. }}>
  79. <>
  80. {children}
  81. {
  82. !!showAccountSettingModal && (
  83. <AccountSetting
  84. activeTab={showAccountSettingModal.payload}
  85. onCancel={handleCancelAccountSettingModal}
  86. />
  87. )
  88. }
  89. {
  90. !!showApiBasedExtensionModal && (
  91. <ApiBasedExtensionModal
  92. data={showApiBasedExtensionModal.payload}
  93. onCancel={() => setShowApiBasedExtensionModal(null)}
  94. onSave={handleSaveApiBasedExtension}
  95. />
  96. )
  97. }
  98. {
  99. !!showModerationSettingModal && (
  100. <ModerationSettingModal
  101. data={showModerationSettingModal.payload}
  102. onCancel={handleCancelModerationSettingModal}
  103. onSave={handleSaveModeration}
  104. />
  105. )
  106. }
  107. {
  108. !!showExternalDataToolModal && (
  109. <ExternalDataToolModal
  110. data={showExternalDataToolModal.payload}
  111. onCancel={() => setShowExternalDataToolModal(null)}
  112. onSave={handleSaveExternalDataTool}
  113. onValidateBeforeSave={handleValidateBeforeSaveExternalDataTool}
  114. />
  115. )
  116. }
  117. </>
  118. </ModalContext.Provider>
  119. )
  120. }
  121. export default ModalContext