provider-context.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. 'use client'
  2. import { createContext, useContext } from 'use-context-selector'
  3. import useSWR from 'swr'
  4. import { useEffect, useState } from 'react'
  5. import {
  6. fetchModelList,
  7. fetchModelProviders,
  8. fetchSupportRetrievalMethods,
  9. } from '@/service/common'
  10. import {
  11. ModelStatusEnum,
  12. ModelTypeEnum,
  13. } from '@/app/components/header/account-setting/model-provider-page/declarations'
  14. import type { Model, ModelProvider } from '@/app/components/header/account-setting/model-provider-page/declarations'
  15. import type { RETRIEVE_METHOD } from '@/types/app'
  16. import { Plan, type UsagePlanInfo } from '@/app/components/billing/type'
  17. import { fetchCurrentPlanInfo } from '@/service/billing'
  18. import { parseCurrentPlan } from '@/app/components/billing/utils'
  19. import { defaultPlan } from '@/app/components/billing/config'
  20. const ProviderContext = createContext<{
  21. modelProviders: ModelProvider[]
  22. textGenerationModelList: Model[]
  23. supportRetrievalMethods: RETRIEVE_METHOD[]
  24. hasSettedApiKey: boolean
  25. plan: {
  26. type: Plan
  27. usage: UsagePlanInfo
  28. total: UsagePlanInfo
  29. }
  30. isFetchedPlan: boolean
  31. enableBilling: boolean
  32. onPlanInfoChanged: () => void
  33. enableReplaceWebAppLogo: boolean
  34. }>({
  35. modelProviders: [],
  36. textGenerationModelList: [],
  37. supportRetrievalMethods: [],
  38. hasSettedApiKey: true,
  39. plan: {
  40. type: Plan.sandbox,
  41. usage: {
  42. vectorSpace: 32,
  43. buildApps: 12,
  44. teamMembers: 1,
  45. annotatedResponse: 1,
  46. },
  47. total: {
  48. vectorSpace: 200,
  49. buildApps: 50,
  50. teamMembers: 1,
  51. annotatedResponse: 10,
  52. },
  53. },
  54. isFetchedPlan: false,
  55. enableBilling: false,
  56. onPlanInfoChanged: () => { },
  57. enableReplaceWebAppLogo: false,
  58. })
  59. export const useProviderContext = () => useContext(ProviderContext)
  60. type ProviderContextProviderProps = {
  61. children: React.ReactNode
  62. }
  63. export const ProviderContextProvider = ({
  64. children,
  65. }: ProviderContextProviderProps) => {
  66. const { data: providersData } = useSWR('/workspaces/current/model-providers', fetchModelProviders)
  67. const fetchModelListUrlPrefix = '/workspaces/current/models/model-types/'
  68. const { data: textGenerationModelList } = useSWR(`${fetchModelListUrlPrefix}${ModelTypeEnum.textGeneration}`, fetchModelList)
  69. const { data: supportRetrievalMethods } = useSWR('/datasets/retrieval-setting', fetchSupportRetrievalMethods)
  70. const [plan, setPlan] = useState(defaultPlan)
  71. const [isFetchedPlan, setIsFetchedPlan] = useState(false)
  72. const [enableBilling, setEnableBilling] = useState(true)
  73. const [enableReplaceWebAppLogo, setEnableReplaceWebAppLogo] = useState(false)
  74. const fetchPlan = async () => {
  75. const data = await fetchCurrentPlanInfo()
  76. const enabled = data.billing.enabled
  77. setEnableBilling(enabled)
  78. setEnableReplaceWebAppLogo(data.can_replace_logo)
  79. if (enabled) {
  80. setPlan(parseCurrentPlan(data))
  81. setIsFetchedPlan(true)
  82. }
  83. }
  84. useEffect(() => {
  85. fetchPlan()
  86. }, [])
  87. return (
  88. <ProviderContext.Provider value={{
  89. modelProviders: providersData?.data || [],
  90. textGenerationModelList: textGenerationModelList?.data || [],
  91. hasSettedApiKey: !!textGenerationModelList?.data.some(model => model.status === ModelStatusEnum.active),
  92. supportRetrievalMethods: supportRetrievalMethods?.retrieval_method || [],
  93. plan,
  94. isFetchedPlan,
  95. enableBilling,
  96. onPlanInfoChanged: fetchPlan,
  97. enableReplaceWebAppLogo,
  98. }}>
  99. {children}
  100. </ProviderContext.Provider>
  101. )
  102. }
  103. export default ProviderContext