modal-context.tsx 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  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 handleCancelModelModal = useCallback(() => {
  78. setShowModelModal(null)
  79. if (showModelModal?.onCancelCallback)
  80. showModelModal.onCancelCallback()
  81. }, [showModelModal])
  82. const handleSaveModelModal = useCallback(() => {
  83. if (showModelModal?.onSaveCallback)
  84. showModelModal.onSaveCallback(showModelModal.payload)
  85. setShowModelModal(null)
  86. }, [showModelModal])
  87. const handleSaveApiBasedExtension = (newApiBasedExtension: ApiBasedExtension) => {
  88. if (showApiBasedExtensionModal?.onSaveCallback)
  89. showApiBasedExtensionModal.onSaveCallback(newApiBasedExtension)
  90. setShowApiBasedExtensionModal(null)
  91. }
  92. const handleSaveModeration = (newModerationConfig: ModerationConfig) => {
  93. if (showModerationSettingModal?.onSaveCallback)
  94. showModerationSettingModal.onSaveCallback(newModerationConfig)
  95. setShowModerationSettingModal(null)
  96. }
  97. const handleSaveExternalDataTool = (newExternalDataTool: ExternalDataTool) => {
  98. if (showExternalDataToolModal?.onSaveCallback)
  99. showExternalDataToolModal.onSaveCallback(newExternalDataTool)
  100. setShowExternalDataToolModal(null)
  101. }
  102. const handleValidateBeforeSaveExternalDataTool = (newExternalDataTool: ExternalDataTool) => {
  103. if (showExternalDataToolModal?.onValidateBeforeSaveCallback)
  104. return showExternalDataToolModal?.onValidateBeforeSaveCallback(newExternalDataTool)
  105. return true
  106. }
  107. return (
  108. <ModalContext.Provider value={{
  109. setShowAccountSettingModal,
  110. setShowApiBasedExtensionModal,
  111. setShowModerationSettingModal,
  112. setShowExternalDataToolModal,
  113. setShowPricingModal: () => setShowPricingModal(true),
  114. setShowAnnotationFullModal: () => setShowAnnotationFullModal(true),
  115. setShowModelModal,
  116. }}>
  117. <>
  118. {children}
  119. {
  120. !!showAccountSettingModal && (
  121. <AccountSetting
  122. activeTab={showAccountSettingModal.payload}
  123. onCancel={handleCancelAccountSettingModal}
  124. />
  125. )
  126. }
  127. {
  128. !!showApiBasedExtensionModal && (
  129. <ApiBasedExtensionModal
  130. data={showApiBasedExtensionModal.payload}
  131. onCancel={() => setShowApiBasedExtensionModal(null)}
  132. onSave={handleSaveApiBasedExtension}
  133. />
  134. )
  135. }
  136. {
  137. !!showModerationSettingModal && (
  138. <ModerationSettingModal
  139. data={showModerationSettingModal.payload}
  140. onCancel={handleCancelModerationSettingModal}
  141. onSave={handleSaveModeration}
  142. />
  143. )
  144. }
  145. {
  146. !!showExternalDataToolModal && (
  147. <ExternalDataToolModal
  148. data={showExternalDataToolModal.payload}
  149. onCancel={() => setShowExternalDataToolModal(null)}
  150. onSave={handleSaveExternalDataTool}
  151. onValidateBeforeSave={handleValidateBeforeSaveExternalDataTool}
  152. />
  153. )
  154. }
  155. {
  156. !!showPricingModal && (
  157. <Pricing onCancel={() => {
  158. if (searchParams.get('show-pricing') === '1')
  159. router.push(location.pathname, { forceOptimisticNavigation: true })
  160. setShowPricingModal(false)
  161. }} />
  162. )
  163. }
  164. {
  165. showAnnotationFullModal && (
  166. <AnnotationFullModal
  167. show={showAnnotationFullModal}
  168. onHide={() => setShowAnnotationFullModal(false)} />
  169. )
  170. }
  171. {
  172. !!showModelModal && (
  173. <ModelModal
  174. provider={showModelModal.payload.currentProvider}
  175. configurateMethod={showModelModal.payload.currentConfigurateMethod}
  176. currentCustomConfigrationModelFixedFields={showModelModal.payload.currentCustomConfigrationModelFixedFields}
  177. onCancel={handleCancelModelModal}
  178. onSave={handleSaveModelModal}
  179. />
  180. )
  181. }
  182. </>
  183. </ModalContext.Provider>
  184. )
  185. }
  186. export default ModalContext