LegacyIntegrationPage.tsx 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import Link from 'next/link'
  2. import { useMemo } from 'react'
  3. import {
  4. BreadcrumbItem,
  5. BreadcrumbLink,
  6. BreadcrumbList,
  7. BreadcrumbPage,
  8. BreadcrumbSeparator,
  9. NavMenu,
  10. NavMenuItem,
  11. } from 'ui'
  12. import {
  13. Admonition,
  14. PageContainer,
  15. PageHeader,
  16. PageHeaderBreadcrumb,
  17. PageHeaderDescription,
  18. PageHeaderIcon,
  19. PageHeaderMeta,
  20. PageHeaderNavigationTabs,
  21. PageHeaderSummary,
  22. PageHeaderTitle,
  23. PageSection,
  24. PageSectionContent,
  25. } from 'ui-patterns'
  26. import ShimmeringLoader, { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader'
  27. import { IntegrationLogo } from '@/components/interfaces/Integrations/Integration/IntegrationLogo'
  28. import { InstallOAuthIntegrationButton } from '@/components/interfaces/Integrations/Integration/IntegrationOverviewTabV2/InstallIntegrationSheet/InstallOAuthIntegrationButton'
  29. import { useIntegrationDetail } from '@/components/interfaces/Integrations/Landing/useIntegrationDetail'
  30. import { UnknownInterface } from '@/components/ui/UnknownInterface'
  31. const LegacyIntegrationPage = () => {
  32. const {
  33. ref,
  34. id,
  35. isReady,
  36. isWrapperBlocked,
  37. pageTitle,
  38. pageSubTitle,
  39. integration,
  40. isAvailableLoading,
  41. isInstalledLoading,
  42. tabs,
  43. Component,
  44. } = useIntegrationDetail()
  45. const content = useMemo(() => {
  46. if (!isReady || isInstalledLoading || isAvailableLoading) {
  47. return (
  48. <PageContainer size="full">
  49. <PageSection>
  50. <PageSectionContent>
  51. <GenericSkeletonLoader />
  52. </PageSectionContent>
  53. </PageSection>
  54. </PageContainer>
  55. )
  56. } else if (!Component || !id || !integration) {
  57. return (
  58. <PageContainer size="full">
  59. <PageSection>
  60. <PageSectionContent>
  61. <Admonition type="warning" title="This integration is not currently available">
  62. Please try again later or contact support if the problem persists.
  63. </Admonition>
  64. </PageSectionContent>
  65. </PageSection>
  66. </PageContainer>
  67. )
  68. } else {
  69. return <Component />
  70. }
  71. }, [isReady, isInstalledLoading, isAvailableLoading, id, integration, Component])
  72. if (!isReady) return null
  73. if (isWrapperBlocked) return <UnknownInterface urlBack={`/project/${ref}/integrations`} />
  74. return (
  75. <>
  76. <PageHeader size="full">
  77. <PageHeaderBreadcrumb className="mx-auto w-full">
  78. <BreadcrumbList>
  79. <BreadcrumbItem>
  80. <BreadcrumbLink asChild>
  81. <Link href={`/project/${ref}/integrations`}>Integrations</Link>
  82. </BreadcrumbLink>
  83. </BreadcrumbItem>
  84. <BreadcrumbSeparator />
  85. <BreadcrumbItem>
  86. <BreadcrumbPage>{integration?.name || 'Integration not found'}</BreadcrumbPage>
  87. </BreadcrumbItem>
  88. </BreadcrumbList>
  89. </PageHeaderBreadcrumb>
  90. {isAvailableLoading ? (
  91. <PageHeaderMeta className="mx-auto w-full">
  92. <PageHeaderSummary>
  93. <PageHeaderTitle>
  94. <ShimmeringLoader className="w-64 py-4" />
  95. </PageHeaderTitle>
  96. <PageHeaderDescription>
  97. <ShimmeringLoader />
  98. </PageHeaderDescription>
  99. </PageHeaderSummary>
  100. </PageHeaderMeta>
  101. ) : (
  102. <PageHeaderMeta className="mx-auto w-full">
  103. {integration && (
  104. <PageHeaderIcon>
  105. <IntegrationLogo integration={integration} size="w-14 h-14" />
  106. </PageHeaderIcon>
  107. )}
  108. <PageHeaderSummary className="gap-y-0.5">
  109. <PageHeaderTitle>{pageTitle}</PageHeaderTitle>
  110. <PageHeaderDescription>{pageSubTitle}</PageHeaderDescription>
  111. </PageHeaderSummary>
  112. {integration?.type === 'oauth' && (
  113. <InstallOAuthIntegrationButton integration={integration} />
  114. )}
  115. </PageHeaderMeta>
  116. )}
  117. {tabs.length > 0 && (
  118. <PageHeaderNavigationTabs className="mx-auto w-full">
  119. <NavMenu>
  120. {tabs.map((tab) => (
  121. <NavMenuItem key={tab.href} active={tab.active}>
  122. <Link href={tab.href}>{tab.label}</Link>
  123. </NavMenuItem>
  124. ))}
  125. </NavMenu>
  126. </PageHeaderNavigationTabs>
  127. )}
  128. </PageHeader>
  129. <div className="mx-auto w-full">{content}</div>
  130. </>
  131. )
  132. }
  133. export default LegacyIntegrationPage