modal-context.tsx 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. 'use client'
  2. import type { Dispatch, SetStateAction } from 'react'
  3. import { useCallback, useState } from 'react'
  4. import { createContext, useContext } from 'use-context-selector'
  5. import { useRouter, useSearchParams } from 'next/navigation'
  6. import AccountSetting from '@/app/components/header/account-setting'
  7. import ApiBasedExtensionModal from '@/app/components/header/account-setting/api-based-extension-page/modal'
  8. import ModerationSettingModal from '@/app/components/app/configuration/toolbox/moderation/moderation-setting-modal'
  9. import ExternalDataToolModal from '@/app/components/app/configuration/tools/external-data-tool-modal'
  10. import AnnotationFullModal from '@/app/components/billing/annotation-full/modal'
  11. import ModelModal from '@/app/components/header/account-setting/model-provider-page/model-modal'
  12. import type {
  13. ConfigurateMethodEnum,
  14. CustomConfigrationModelFixedFields,
  15. ModelProvider,
  16. } from '@/app/components/header/account-setting/model-provider-page/declarations'
  17. import Pricing from '@/app/components/billing/pricing'
  18. import type { ModerationConfig } from '@/models/debug'
  19. import type {
  20. ApiBasedExtension,
  21. ExternalDataTool,
  22. } from '@/models/common'
  23. export type ModalState<T> = {
  24. payload: T
  25. onCancelCallback?: () => void
  26. onSaveCallback?: (newPayload: T) => void
  27. onValidateBeforeSaveCallback?: (newPayload: T) => boolean
  28. }
  29. export type ModelModalType = {
  30. currentProvider: ModelProvider
  31. currentConfigurateMethod: ConfigurateMethodEnum
  32. currentCustomConfigrationModelFixedFields?: CustomConfigrationModelFixedFields
  33. }
  34. const ModalContext = createContext<{
  35. setShowAccountSettingModal: Dispatch<SetStateAction<ModalState<string> | null>>
  36. setShowApiBasedExtensionModal: Dispatch<SetStateAction<ModalState<ApiBasedExtension> | null>>
  37. setShowModerationSettingModal: Dispatch<SetStateAction<ModalState<ModerationConfig> | null>>
  38. setShowExternalDataToolModal: Dispatch<SetStateAction<ModalState<ExternalDataTool> | null>>
  39. setShowPricingModal: Dispatch<SetStateAction<any>>
  40. setShowAnnotationFullModal: () => void
  41. setShowModelModal: Dispatch<SetStateAction<ModalState<ModelModalType> | null>>
  42. }>({
  43. setShowAccountSettingModal: () => { },
  44. setShowApiBasedExtensionModal: () => { },
  45. setShowModerationSettingModal: () => { },
  46. setShowExternalDataToolModal: () => { },
  47. setShowPricingModal: () => { },
  48. setShowAnnotationFullModal: () => { },
  49. setShowModelModal: () => {},
  50. })
  51. export const useModalContext = () => useContext(ModalContext)
  52. type ModalContextProviderProps = {
  53. children: React.ReactNode
  54. }
  55. export const ModalContextProvider = ({
  56. children,
  57. }: ModalContextProviderProps) => {
  58. const [showAccountSettingModal, setShowAccountSettingModal] = useState<ModalState<string> | null>(null)
  59. const [showApiBasedExtensionModal, setShowApiBasedExtensionModal] = useState<ModalState<ApiBasedExtension> | null>(null)
  60. const [showModerationSettingModal, setShowModerationSettingModal] = useState<ModalState<ModerationConfig> | null>(null)
  61. const [showExternalDataToolModal, setShowExternalDataToolModal] = useState<ModalState<ExternalDataTool> | null>(null)
  62. const [showModelModal, setShowModelModal] = useState<ModalState<ModelModalType> | null>(null)
  63. const searchParams = useSearchParams()
  64. const router = useRouter()
  65. const [showPricingModal, setShowPricingModal] = useState(searchParams.get('show-pricing') === '1')
  66. const [showAnnotationFullModal, setShowAnnotationFullModal] = useState(false)
  67. const handleCancelAccountSettingModal = () => {
  68. setShowAccountSettingModal(null)
  69. if (showAccountSettingModal?.onCancelCallback)
  70. showAccountSettingModal?.onCancelCallback()
  71. }
  72. const handleCancelModerationSettingModal = () => {
  73. setShowModerationSettingModal(null)
  74. if (showModerationSettingModal?.onCancelCallback)
  75. showModerationSettingModal.onCancelCallback()
  76. }
  77. const handleCancelExternalDataToolModal = () => {
  78. setShowExternalDataToolModal(null)
  79. if (showExternalDataToolModal?.onCancelCallback)
  80. showExternalDataToolModal.onCancelCallback()
  81. }
  82. const handleCancelModelModal = useCallback(() => {
  83. setShowModelModal(null)
  84. if (showModelModal?.onCancelCallback)
  85. showModelModal.onCancelCallback()
  86. }, [showModelModal])
  87. const handleSaveModelModal = useCallback(() => {
  88. if (showModelModal?.onSaveCallback)
  89. showModelModal.onSaveCallback(showModelModal.payload)
  90. setShowModelModal(null)
  91. }, [showModelModal])
  92. const handleSaveApiBasedExtension = (newApiBasedExtension: ApiBasedExtension) => {
  93. if (showApiBasedExtensionModal?.onSaveCallback)
  94. showApiBasedExtensionModal.onSaveCallback(newApiBasedExtension)
  95. setShowApiBasedExtensionModal(null)
  96. }
  97. const handleSaveModeration = (newModerationConfig: ModerationConfig) => {
  98. if (showModerationSettingModal?.onSaveCallback)
  99. showModerationSettingModal.onSaveCallback(newModerationConfig)
  100. setShowModerationSettingModal(null)
  101. }
  102. const handleSaveExternalDataTool = (newExternalDataTool: ExternalDataTool) => {
  103. if (showExternalDataToolModal?.onSaveCallback)
  104. showExternalDataToolModal.onSaveCallback(newExternalDataTool)
  105. setShowExternalDataToolModal(null)
  106. }
  107. const handleValidateBeforeSaveExternalDataTool = (newExternalDataTool: ExternalDataTool) => {
  108. if (showExternalDataToolModal?.onValidateBeforeSaveCallback)
  109. return showExternalDataToolModal?.onValidateBeforeSaveCallback(newExternalDataTool)
  110. return true
  111. }
  112. return (
  113. <ModalContext.Provider value={{
  114. setShowAccountSettingModal,
  115. setShowApiBasedExtensionModal,
  116. setShowModerationSettingModal,
  117. setShowExternalDataToolModal,
  118. setShowPricingModal: () => setShowPricingModal(true),
  119. setShowAnnotationFullModal: () => setShowAnnotationFullModal(true),
  120. setShowModelModal,
  121. }}>
  122. <>
  123. {children}
  124. {
  125. !!showAccountSettingModal && (
  126. <AccountSetting
  127. activeTab={showAccountSettingModal.payload}
  128. onCancel={handleCancelAccountSettingModal}
  129. />
  130. )
  131. }
  132. {
  133. !!showApiBasedExtensionModal && (
  134. <ApiBasedExtensionModal
  135. data={showApiBasedExtensionModal.payload}
  136. onCancel={() => setShowApiBasedExtensionModal(null)}
  137. onSave={handleSaveApiBasedExtension}
  138. />
  139. )
  140. }
  141. {
  142. !!showModerationSettingModal && (
  143. <ModerationSettingModal
  144. data={showModerationSettingModal.payload}
  145. onCancel={handleCancelModerationSettingModal}
  146. onSave={handleSaveModeration}
  147. />
  148. )
  149. }
  150. {
  151. !!showExternalDataToolModal && (
  152. <ExternalDataToolModal
  153. data={showExternalDataToolModal.payload}
  154. onCancel={handleCancelExternalDataToolModal}
  155. onSave={handleSaveExternalDataTool}
  156. onValidateBeforeSave={handleValidateBeforeSaveExternalDataTool}
  157. />
  158. )
  159. }
  160. {
  161. !!showPricingModal && (
  162. <Pricing onCancel={() => {
  163. if (searchParams.get('show-pricing') === '1')
  164. router.push(location.pathname, { forceOptimisticNavigation: true } as any)
  165. setShowPricingModal(false)
  166. }} />
  167. )
  168. }
  169. {
  170. showAnnotationFullModal && (
  171. <AnnotationFullModal
  172. show={showAnnotationFullModal}
  173. onHide={() => setShowAnnotationFullModal(false)} />
  174. )
  175. }
  176. {
  177. !!showModelModal && (
  178. <ModelModal
  179. provider={showModelModal.payload.currentProvider}
  180. configurateMethod={showModelModal.payload.currentConfigurateMethod}
  181. currentCustomConfigrationModelFixedFields={showModelModal.payload.currentCustomConfigrationModelFixedFields}
  182. onCancel={handleCancelModelModal}
  183. onSave={handleSaveModelModal}
  184. />
  185. )
  186. }
  187. </>
  188. </ModalContext.Provider>
  189. )
  190. }
  191. export default ModalContext