You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.tsx 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. 'use client'
  2. import type { FC } from 'react'
  3. import { useEffect } from 'react'
  4. import React from 'react'
  5. import { useContext } from 'use-context-selector'
  6. import ExploreContext from '@/context/explore-context'
  7. import TextGenerationApp from '@/app/components/share/text-generation'
  8. import Loading from '@/app/components/base/loading'
  9. import ChatWithHistory from '@/app/components/base/chat/chat-with-history'
  10. import { useWebAppStore } from '@/context/web-app-context'
  11. import AppUnavailable from '../../base/app-unavailable'
  12. import { useGetUserCanAccessApp } from '@/service/access-control'
  13. import { useGetInstalledAppAccessModeByAppId, useGetInstalledAppMeta, useGetInstalledAppParams } from '@/service/use-explore'
  14. import type { AppData } from '@/models/share'
  15. export type IInstalledAppProps = {
  16. id: string
  17. }
  18. const InstalledApp: FC<IInstalledAppProps> = ({
  19. id,
  20. }) => {
  21. const { installedApps, isFetchingInstalledApps } = useContext(ExploreContext)
  22. const updateAppInfo = useWebAppStore(s => s.updateAppInfo)
  23. const installedApp = installedApps.find(item => item.id === id)
  24. const updateWebAppAccessMode = useWebAppStore(s => s.updateWebAppAccessMode)
  25. const updateAppParams = useWebAppStore(s => s.updateAppParams)
  26. const updateWebAppMeta = useWebAppStore(s => s.updateWebAppMeta)
  27. const updateUserCanAccessApp = useWebAppStore(s => s.updateUserCanAccessApp)
  28. const { isFetching: isFetchingWebAppAccessMode, data: webAppAccessMode, error: webAppAccessModeError } = useGetInstalledAppAccessModeByAppId(installedApp?.id ?? null)
  29. const { isFetching: isFetchingAppParams, data: appParams, error: appParamsError } = useGetInstalledAppParams(installedApp?.id ?? null)
  30. const { isFetching: isFetchingAppMeta, data: appMeta, error: appMetaError } = useGetInstalledAppMeta(installedApp?.id ?? null)
  31. const { data: userCanAccessApp, error: useCanAccessAppError } = useGetUserCanAccessApp({ appId: installedApp?.app.id, isInstalledApp: true })
  32. useEffect(() => {
  33. if (!installedApp) {
  34. updateAppInfo(null)
  35. }
  36. else {
  37. const { id, app } = installedApp
  38. updateAppInfo({
  39. app_id: id,
  40. site: {
  41. title: app.name,
  42. icon_type: app.icon_type,
  43. icon: app.icon,
  44. icon_background: app.icon_background,
  45. icon_url: app.icon_url,
  46. prompt_public: false,
  47. copyright: '',
  48. show_workflow_steps: true,
  49. use_icon_as_answer_icon: app.use_icon_as_answer_icon,
  50. },
  51. plan: 'basic',
  52. custom_config: null,
  53. } as AppData)
  54. }
  55. if (appParams)
  56. updateAppParams(appParams)
  57. if (appMeta)
  58. updateWebAppMeta(appMeta)
  59. if (webAppAccessMode)
  60. updateWebAppAccessMode(webAppAccessMode.accessMode)
  61. updateUserCanAccessApp(Boolean(userCanAccessApp && userCanAccessApp?.result))
  62. }, [installedApp, appMeta, appParams, updateAppInfo, updateAppParams, updateUserCanAccessApp, updateWebAppMeta, userCanAccessApp, webAppAccessMode, updateWebAppAccessMode])
  63. if (appParamsError) {
  64. return <div className='flex h-full items-center justify-center'>
  65. <AppUnavailable unknownReason={appParamsError.message} />
  66. </div>
  67. }
  68. if (appMetaError) {
  69. return <div className='flex h-full items-center justify-center'>
  70. <AppUnavailable unknownReason={appMetaError.message} />
  71. </div>
  72. }
  73. if (useCanAccessAppError) {
  74. return <div className='flex h-full items-center justify-center'>
  75. <AppUnavailable unknownReason={useCanAccessAppError.message} />
  76. </div>
  77. }
  78. if (webAppAccessModeError) {
  79. return <div className='flex h-full items-center justify-center'>
  80. <AppUnavailable unknownReason={webAppAccessModeError.message} />
  81. </div>
  82. }
  83. if (userCanAccessApp && !userCanAccessApp.result) {
  84. return <div className='flex h-full flex-col items-center justify-center gap-y-2'>
  85. <AppUnavailable className='h-auto w-auto' code={403} unknownReason='no permission.' />
  86. </div>
  87. }
  88. if (isFetchingAppParams || isFetchingAppMeta || isFetchingWebAppAccessMode || isFetchingInstalledApps) {
  89. return <div className='flex h-full items-center justify-center'>
  90. <Loading />
  91. </div>
  92. }
  93. if (!installedApp) {
  94. return <div className='flex h-full items-center justify-center'>
  95. <AppUnavailable code={404} isUnknownReason />
  96. </div>
  97. }
  98. return (
  99. <div className='h-full bg-background-default py-2 pl-0 pr-2 sm:p-2'>
  100. {installedApp?.app.mode !== 'completion' && installedApp?.app.mode !== 'workflow' && (
  101. <ChatWithHistory installedAppInfo={installedApp} className='overflow-hidden rounded-2xl shadow-md' />
  102. )}
  103. {installedApp?.app.mode === 'completion' && (
  104. <TextGenerationApp isInstalledApp installedAppInfo={installedApp} />
  105. )}
  106. {installedApp?.app.mode === 'workflow' && (
  107. <TextGenerationApp isWorkflow isInstalledApp installedAppInfo={installedApp} />
  108. )}
  109. </div>
  110. )
  111. }
  112. export default React.memo(InstalledApp)