modal-context.tsx 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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 { 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 Pricing from '@/app/components/billing/pricing'
  12. import type { ModerationConfig } from '@/models/debug'
  13. import type {
  14. ApiBasedExtension,
  15. ExternalDataTool,
  16. } from '@/models/common'
  17. export type ModalState<T> = {
  18. payload: T
  19. onCancelCallback?: () => void
  20. onSaveCallback?: (newPayload: T) => void
  21. onValidateBeforeSaveCallback?: (newPayload: T) => boolean
  22. }
  23. const ModalContext = createContext<{
  24. setShowAccountSettingModal: Dispatch<SetStateAction<ModalState<string> | null>>
  25. setShowApiBasedExtensionModal: Dispatch<SetStateAction<ModalState<ApiBasedExtension> | null>>
  26. setShowModerationSettingModal: Dispatch<SetStateAction<ModalState<ModerationConfig> | null>>
  27. setShowExternalDataToolModal: Dispatch<SetStateAction<ModalState<ExternalDataTool> | null>>
  28. setShowPricingModal: Dispatch<SetStateAction<any>>
  29. setShowAnnotationFullModal: () => void
  30. }>({
  31. setShowAccountSettingModal: () => { },
  32. setShowApiBasedExtensionModal: () => { },
  33. setShowModerationSettingModal: () => { },
  34. setShowExternalDataToolModal: () => { },
  35. setShowPricingModal: () => { },
  36. setShowAnnotationFullModal: () => { },
  37. })
  38. export const useModalContext = () => useContext(ModalContext)
  39. type ModalContextProviderProps = {
  40. children: React.ReactNode
  41. }
  42. export const ModalContextProvider = ({
  43. children,
  44. }: ModalContextProviderProps) => {
  45. const [showAccountSettingModal, setShowAccountSettingModal] = useState<ModalState<string> | null>(null)
  46. const [showApiBasedExtensionModal, setShowApiBasedExtensionModal] = useState<ModalState<ApiBasedExtension> | null>(null)
  47. const [showModerationSettingModal, setShowModerationSettingModal] = useState<ModalState<ModerationConfig> | null>(null)
  48. const [showExternalDataToolModal, setShowExternalDataToolModal] = useState<ModalState<ExternalDataTool> | null>(null)
  49. const searchParams = useSearchParams()
  50. const router = useRouter()
  51. const [showPricingModal, setShowPricingModal] = useState(searchParams.get('show-pricing') === '1')
  52. const [showAnnotationFullModal, setShowAnnotationFullModal] = useState(false)
  53. const handleCancelAccountSettingModal = () => {
  54. setShowAccountSettingModal(null)
  55. if (showAccountSettingModal?.onCancelCallback)
  56. showAccountSettingModal?.onCancelCallback()
  57. }
  58. const handleCancelModerationSettingModal = () => {
  59. setShowModerationSettingModal(null)
  60. if (showModerationSettingModal?.onCancelCallback)
  61. showModerationSettingModal.onCancelCallback()
  62. }
  63. const handleSaveApiBasedExtension = (newApiBasedExtension: ApiBasedExtension) => {
  64. if (showApiBasedExtensionModal?.onSaveCallback)
  65. showApiBasedExtensionModal.onSaveCallback(newApiBasedExtension)
  66. setShowApiBasedExtensionModal(null)
  67. }
  68. const handleSaveModeration = (newModerationConfig: ModerationConfig) => {
  69. if (showModerationSettingModal?.onSaveCallback)
  70. showModerationSettingModal.onSaveCallback(newModerationConfig)
  71. setShowModerationSettingModal(null)
  72. }
  73. const handleSaveExternalDataTool = (newExternalDataTool: ExternalDataTool) => {
  74. if (showExternalDataToolModal?.onSaveCallback)
  75. showExternalDataToolModal.onSaveCallback(newExternalDataTool)
  76. setShowExternalDataToolModal(null)
  77. }
  78. const handleValidateBeforeSaveExternalDataTool = (newExternalDataTool: ExternalDataTool) => {
  79. if (showExternalDataToolModal?.onValidateBeforeSaveCallback)
  80. return showExternalDataToolModal?.onValidateBeforeSaveCallback(newExternalDataTool)
  81. return true
  82. }
  83. return (
  84. <ModalContext.Provider value={{
  85. setShowAccountSettingModal,
  86. setShowApiBasedExtensionModal,
  87. setShowModerationSettingModal,
  88. setShowExternalDataToolModal,
  89. setShowPricingModal: () => setShowPricingModal(true),
  90. setShowAnnotationFullModal: () => setShowAnnotationFullModal(true),
  91. }}>
  92. <>
  93. {children}
  94. {
  95. !!showAccountSettingModal && (
  96. <AccountSetting
  97. activeTab={showAccountSettingModal.payload}
  98. onCancel={handleCancelAccountSettingModal}
  99. />
  100. )
  101. }
  102. {
  103. !!showApiBasedExtensionModal && (
  104. <ApiBasedExtensionModal
  105. data={showApiBasedExtensionModal.payload}
  106. onCancel={() => setShowApiBasedExtensionModal(null)}
  107. onSave={handleSaveApiBasedExtension}
  108. />
  109. )
  110. }
  111. {
  112. !!showModerationSettingModal && (
  113. <ModerationSettingModal
  114. data={showModerationSettingModal.payload}
  115. onCancel={handleCancelModerationSettingModal}
  116. onSave={handleSaveModeration}
  117. />
  118. )
  119. }
  120. {
  121. !!showExternalDataToolModal && (
  122. <ExternalDataToolModal
  123. data={showExternalDataToolModal.payload}
  124. onCancel={() => setShowExternalDataToolModal(null)}
  125. onSave={handleSaveExternalDataTool}
  126. onValidateBeforeSave={handleValidateBeforeSaveExternalDataTool}
  127. />
  128. )
  129. }
  130. {
  131. !!showPricingModal && (
  132. <Pricing onCancel={() => {
  133. if (searchParams.get('show-pricing') === '1')
  134. router.push(location.pathname, { forceOptimisticNavigation: true })
  135. setShowPricingModal(false)
  136. }} />
  137. )
  138. }
  139. {
  140. showAnnotationFullModal && (
  141. <AnnotationFullModal
  142. show={showAnnotationFullModal}
  143. onHide={() => setShowAnnotationFullModal(false)} />
  144. )
  145. }
  146. </>
  147. </ModalContext.Provider>
  148. )
  149. }
  150. export default ModalContext