diff --git a/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/OverviewTab.tsx b/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/OverviewTab.tsx
index e05b84a39ea..dab27d1ac6b 100644
--- a/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/OverviewTab.tsx
+++ b/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/OverviewTab.tsx
@@ -23,7 +23,6 @@ import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal'
import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
import * as z from 'zod'
-import { IntegrationOverviewTab } from '../../Integration/IntegrationOverviewTab'
import { RequiredExtensionsSection } from '../../Integration/RequiredExtensionsSection'
import { InstallationError } from './InstallationError'
import { IntegrationInstalledActions, IntegrationNotInstalledActions } from './IntegrationActions'
@@ -38,7 +37,6 @@ import {
isUninstalling,
} from './stripe-sync-status'
import { StripeSyncChangesCard } from './StripeSyncChangesCard'
-import { useIsMarketplaceEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext'
import { useStripeSyncStatus } from '@/components/interfaces/Integrations/templates/StripeSyncEngine/useStripeSyncStatus'
import { useStripeSyncInstallMutation } from '@/data/database-integrations/stripe/stripe-sync-install-mutation'
import { useStripeSyncUninstallMutation } from '@/data/database-integrations/stripe/stripe-sync-uninstall-mutation'
@@ -392,22 +390,10 @@ const StripeSyncContent = ({ hideInstallCTA = false }: { hideInstallCTA?: boolea
}
export const StripeSyncEngineOverviewTab = () => {
- const isMarketplaceEnabled = useIsMarketplaceEnabled()
-
- if (isMarketplaceEnabled) {
- return (
- <>
-
-
- >
- )
- }
-
return (
-
-
-
-
-
+ <>
+
+
+ >
)
}
diff --git a/apps/studio/components/layouts/ProjectIntegrationsLayout.tsx b/apps/studio/components/layouts/ProjectIntegrationsLayout.tsx
index 51ca726cb0b..00222d51dde 100644
--- a/apps/studio/components/layouts/ProjectIntegrationsLayout.tsx
+++ b/apps/studio/components/layouts/ProjectIntegrationsLayout.tsx
@@ -4,7 +4,6 @@ import { PropsWithChildren } from 'react'
import { Menu, Separator } from 'ui'
import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader'
-import { useIsMarketplaceEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext'
import { useInstalledIntegrations } from '@/components/interfaces/Integrations/Landing/useInstalledIntegrations'
import { ProjectLayout } from '@/components/layouts/ProjectLayout'
import { AlertError } from '@/components/ui/AlertError'
@@ -46,7 +45,6 @@ const IntegrationCategoriesMenu = ({ page }: { page: string }) => {
const router = useRouter()
const { ref } = useParams()
const { hasLoaded: flagsLoaded } = useFeatureFlags()
- const isMarketplaceEnabled = useIsMarketplaceEnabled()
const urlParams = new URLSearchParams(router.asPath.split('?')[1] || '')
const categoryParam = urlParams.get('category')
@@ -54,10 +52,10 @@ const IntegrationCategoriesMenu = ({ page }: { page: string }) => {
const { integrationsWrappers: showWrappers } = useIsFeatureEnabled(['integrations:wrappers'])
const { data: categories = [], isPending: isPendingCategories } = useMarketplaceCategoriesQuery({
- enabled: isMarketplaceEnabled,
+ enabled: true,
})
const { data: listings = [], isPending: isPendingListings } = useMarketplaceIntegrationsQuery({
- enabled: isMarketplaceEnabled,
+ enabled: true,
})
const populatedCategoryIds = new Set(
@@ -68,7 +66,7 @@ const IntegrationCategoriesMenu = ({ page }: { page: string }) => {
)
const isLoading = IS_PLATFORM
- ? !flagsLoaded || (isMarketplaceEnabled && (isPendingCategories || isPendingListings))
+ ? !flagsLoaded || (isPendingCategories || isPendingListings)
: false
const allCategories = [
diff --git a/apps/studio/components/layouts/ProjectIntegrationsLayoutDispatch.tsx b/apps/studio/components/layouts/ProjectIntegrationsLayoutDispatch.tsx
index 31cd36043a5..ce3cb3103f1 100644
--- a/apps/studio/components/layouts/ProjectIntegrationsLayoutDispatch.tsx
+++ b/apps/studio/components/layouts/ProjectIntegrationsLayoutDispatch.tsx
@@ -1,13 +1,7 @@
import type { PropsWithChildren } from 'react'
-import { ProjectIntegrationsLayout } from './ProjectIntegrationsLayout'
import { ProjectMarketplaceLayout } from './ProjectMarketplaceLayout'
-import { useIsMarketplaceEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext'
export const ProjectIntegrationsLayoutDispatch = ({ children }: PropsWithChildren) => {
- const isMarketplaceEnabled = useIsMarketplaceEnabled()
- if (isMarketplaceEnabled) {
- return
{children}
- }
- return
{children}
+ return
{children}
}
diff --git a/apps/studio/pages/project/[ref]/integrations/[id]/[pageId]/index.tsx b/apps/studio/pages/project/[ref]/integrations/[id]/[pageId]/index.tsx
index 6f2e09f5412..14c1662d9db 100644
--- a/apps/studio/pages/project/[ref]/integrations/[id]/[pageId]/index.tsx
+++ b/apps/studio/pages/project/[ref]/integrations/[id]/[pageId]/index.tsx
@@ -1,14 +1,10 @@
-import { useIsMarketplaceEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext'
-import LegacyIntegrationPage from '@/components/interfaces/Integrations/Integration/LegacyIntegrationPage'
import { MarketplaceDetail } from '@/components/interfaces/Integrations/Marketplace/MarketplaceDetail'
import { DefaultLayout } from '@/components/layouts/DefaultLayout'
import { ProjectIntegrationsLayoutDispatch } from '@/components/layouts/ProjectIntegrationsLayoutDispatch'
import type { NextPageWithLayout } from '@/types'
const IntegrationPage: NextPageWithLayout = () => {
- const isMarketplaceEnabled = useIsMarketplaceEnabled()
- if (isMarketplaceEnabled) return
- return
+ return
}
IntegrationPage.getLayout = (page) => (
diff --git a/apps/studio/pages/project/[ref]/integrations/index.tsx b/apps/studio/pages/project/[ref]/integrations/index.tsx
index b8c4ddbb007..b6dff89ba87 100644
--- a/apps/studio/pages/project/[ref]/integrations/index.tsx
+++ b/apps/studio/pages/project/[ref]/integrations/index.tsx
@@ -1,320 +1,10 @@
-import { IS_PLATFORM, useFeatureFlags } from 'common'
-import { Database } from 'common/marketplace.types'
-import { Search } from 'lucide-react'
-import { useRouter } from 'next/router'
-import { parseAsString, useQueryState } from 'nuqs'
-import { useMemo, type ReactNode } from 'react'
-import { Input } from 'ui-patterns/DataInputs/Input'
-import { PageContainer } from 'ui-patterns/PageContainer'
-import {
- PageHeader,
- PageHeaderAside,
- PageHeaderDescription,
- PageHeaderMeta,
- PageHeaderSummary,
- PageHeaderTitle,
-} from 'ui-patterns/PageHeader'
-import { PageSection, PageSectionContent, PageSectionMeta } from 'ui-patterns/PageSection'
-import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader'
-
-import { useIsMarketplaceEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext'
-import {
- IntegrationCard,
- IntegrationLoadingCard,
-} from '@/components/interfaces/Integrations/Landing/IntegrationCard'
-import { IntegrationDefinition } from '@/components/interfaces/Integrations/Landing/Integrations.constants'
-import { useAvailableIntegrations } from '@/components/interfaces/Integrations/Landing/useAvailableIntegrations'
-import { useInstalledIntegrations } from '@/components/interfaces/Integrations/Landing/useInstalledIntegrations'
-import { useIntegrationFilteringAndSort } from '@/components/interfaces/Integrations/Landing/useIntegrationFilteringAndSort'
import { MarketplaceIndex } from '@/components/interfaces/Integrations/Marketplace/MarketplaceIndex'
import { DefaultLayout } from '@/components/layouts/DefaultLayout'
import { ProjectIntegrationsLayoutDispatch } from '@/components/layouts/ProjectIntegrationsLayoutDispatch'
-import { AlertError } from '@/components/ui/AlertError'
-import { DocsButton } from '@/components/ui/DocsButton'
-import { NoSearchResults } from '@/components/ui/NoSearchResults'
-import { useMarketplaceCategoriesQuery } from '@/data/marketplace/integration-categories-query'
-import { BASE_PATH, DOCS_URL } from '@/lib/constants'
import type { NextPageWithLayout } from '@/types'
-const FEATURED_INTEGRATIONS = ['cron', 'queues', 'stripe_sync_engine']
-
-// Featured integration images
-const FEATURED_INTEGRATION_IMAGES: Record
= {
- cron: `${BASE_PATH}/img/integrations/covers/cron-cover.webp`,
- queues: `${BASE_PATH}/img/integrations/covers/queues-cover.png`,
- stripe_wrapper: `${BASE_PATH}/img/integrations/covers/stripe-cover.png`,
- stripe_sync_engine: `${BASE_PATH}/img/integrations/covers/stripe-cover.png`,
-}
-
-function getIntegrationImage(integration: IntegrationDefinition) {
- let featured_image = FEATURED_INTEGRATION_IMAGES[integration.id]
- if (featured_image) {
- return featured_image
- }
-
- if (integration.files?.length) {
- const heroImage = integration?.files?.[0]
- return heroImage?.src ?? undefined
- }
-}
-
-type PageContent = {
- title: string
- subtitle: string
- secondaryActions?: ReactNode
-}
-
-const DEFAULT_PAGE_CONTENT: PageContent = {
- title: 'Extend your database',
- subtitle:
- 'Extensions and wrappers that add functionality to your database and connect to external services.',
-}
-
-const CATEGORY_PAGE_CONTENT = {
- wrapper: {
- title: 'Wrappers',
- subtitle:
- 'Connect to external data sources and services by querying APIs, databases, and files as if they were Postgres tables.',
- secondaryActions: (
-
- ),
- },
- postgres_extension: {
- title: 'Postgres Modules',
- subtitle: 'Extend your database with powerful Postgres extensions.',
- },
-} satisfies Record
-
-// Converts a category string to title
-// Example: some_catory -> Some Category
-function formatCategoryTitle(category: string) {
- return category
- .split(/[-_]/)
- .filter(Boolean)
- .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
- .join(' ')
-}
-
-const PageHeaderContentSkeleton = () => (
-
-
-
-
-)
-
-// Returns selected category to filter by
-function useFilterCategory() {
- const router = useRouter()
- const [selectedCategory] = useQueryState(
- 'category',
- parseAsString.withDefault('all').withOptions({ clearOnDefault: true })
- )
- const categoryFromUrl = useMemo(() => {
- const queryString = router.asPath.split('?')[1]
- if (!queryString) return null
-
- return new URLSearchParams(queryString).get('category')
- }, [router.asPath])
- const resolvedSelectedCategory = router.isReady
- ? (categoryFromUrl ?? selectedCategory)
- : undefined
- const filterCategory = resolvedSelectedCategory ?? 'all'
- return filterCategory
-}
-
-// Dynamic page content based on selected category
-function usePageContent(
- integrationFilterCategory: string,
- categories: Database['public']['Views']['categories']['Row'][]
-) {
- const pageContent = useMemo(() => {
- if (integrationFilterCategory === 'all') {
- return DEFAULT_PAGE_CONTENT
- }
-
- if (integrationFilterCategory in CATEGORY_PAGE_CONTENT) {
- return CATEGORY_PAGE_CONTENT[integrationFilterCategory as keyof typeof CATEGORY_PAGE_CONTENT]
- }
-
- const selectedMarketplaceCategory = categories.find(
- (category) => category.slug === integrationFilterCategory
- )
-
- return {
- title: selectedMarketplaceCategory?.name ?? formatCategoryTitle(integrationFilterCategory),
- subtitle: selectedMarketplaceCategory?.description ?? DEFAULT_PAGE_CONTENT.subtitle,
- }
- }, [categories, integrationFilterCategory])
- return pageContent
-}
-
const IntegrationsPage: NextPageWithLayout = () => {
- const isMarketplaceEnabled = useIsMarketplaceEnabled()
- if (isMarketplaceEnabled) return
- return
-}
-
-const LegacyIntegrationsPage = () => {
- const { hasLoaded: flagsLoaded } = useFeatureFlags()
- const isMarketplaceEnabled = useIsMarketplaceEnabled()
- const [search, setSearch] = useQueryState(
- 'search',
- parseAsString.withDefault('').withOptions({ clearOnDefault: true })
- )
-
- const {
- data: availableIntegrations,
- error,
- isPending: isLoadingAvailableIntegrations,
- isError,
- isSuccess: isSuccessAvailableIntegrations,
- } = useAvailableIntegrations()
-
- const {
- installedIntegrations,
- isLoading: isLoadingInstalledIntegrations,
- isSuccess: isSuccessInstalledIntegrations,
- } = useInstalledIntegrations()
-
- const installedIds = installedIntegrations.map((i) => i.id)
- const isLoading = isLoadingAvailableIntegrations || isLoadingInstalledIntegrations
- const isSuccess = isSuccessAvailableIntegrations && isSuccessInstalledIntegrations
-
- const selectedCategory = useFilterCategory()
-
- const { data: categories = [], isPending: isPendingCategories } = useMarketplaceCategoriesQuery({
- enabled: isMarketplaceEnabled,
- })
-
- const isLoadingSelectedCategory =
- selectedCategory !== 'all' &&
- !(selectedCategory in CATEGORY_PAGE_CONTENT) &&
- (IS_PLATFORM ? !flagsLoaded || (isMarketplaceEnabled && isPendingCategories) : false)
-
- const pageContent = usePageContent(selectedCategory, categories)
-
- const filteredIntegrations = useMemo(() => {
- let filtered = availableIntegrations ?? []
-
- if (selectedCategory !== 'all') {
- filtered = filtered.filter(
- (i) => i.type === selectedCategory || i.categories?.includes(selectedCategory)
- )
- }
-
- if (search.length > 0) {
- filtered = filtered.filter((i) => i.name.toLowerCase().includes(search.toLowerCase()))
- }
-
- return filtered
- }, [availableIntegrations, selectedCategory, search])
-
- const hasActiveFilter = selectedCategory !== 'all' || search.length > 0
-
- const { sorted: filteredAndSortedIntegrations, featured: featuredIntegrations } =
- useIntegrationFilteringAndSort(filteredIntegrations, availableIntegrations, installedIds, {
- featuredIds: FEATURED_INTEGRATIONS,
- hasActiveFilter,
- includeFeaturedFlag: true,
- })
-
- return (
- <>
-
-
-
- {isLoadingSelectedCategory ? (
-
- ) : (
- <>
- {pageContent.title}
- {pageContent.subtitle}
- >
- )}
-
- {pageContent.secondaryActions && (
- {pageContent.secondaryActions}
- )}
-
-
-
-
-
-
- setSearch(e.target.value)}
- placeholder="Search integrations..."
- icon={}
- className="w-52"
- />
-
-
-
- {isLoading && (
-
- {Array.from({ length: 8 }).map((_, idx) => (
-
- ))}
-
- )}
-
- {/* Error State */}
- {isError && (
-
- )}
-
- {/* Success State */}
- {isSuccess && (
- <>
- {/* No Search Results */}
- {search.length > 0 && filteredAndSortedIntegrations.length === 0 && (
- setSearch('')} />
- )}
-
- {/* Featured Integrations */}
- {featuredIntegrations && featuredIntegrations.length > 0 && (
-
- {featuredIntegrations.map((integration) => (
-
- ))}
-
- )}
-
- {/* All Filtered and Sorted Integrations */}
- {filteredAndSortedIntegrations.length > 0 && (
-
- {filteredAndSortedIntegrations.map((integration) => (
-
- ))}
-
- )}
- >
- )}
-
-
-
- >
- )
+ return
}
IntegrationsPage.getLayout = (page) => (
diff --git a/packages/common/constants/local-storage.ts b/packages/common/constants/local-storage.ts
index 6b74bf66803..9a96b713c27 100644
--- a/packages/common/constants/local-storage.ts
+++ b/packages/common/constants/local-storage.ts
@@ -26,7 +26,6 @@ export const LOCAL_STORAGE_KEYS = {
UI_PREVIEW_PLATFORM_WEBHOOKS: 'supabase-ui-platform-webhooks',
UI_PREVIEW_JIT_DB_ACCESS: 'supabase-ui-jit-db-access',
UI_PREVIEW_SQL_EDITOR_MANUAL_SAVE: 'supabase-ui-sql-editor-manual-save',
- UI_PREVIEW_MARKETPLACE: 'supabase-ui-marketplace',
AI_ASSISTANT_MCP_OPT_IN: 'ai-assistant-mcp-opt-in',
SIGN_IN_CHATGPT_ENABLED: 'siwc-enabled',
@@ -155,7 +154,6 @@ const LOCAL_STORAGE_KEYS_ALLOWLIST = [
LOCAL_STORAGE_KEYS.UI_PREVIEW_PLATFORM_WEBHOOKS,
LOCAL_STORAGE_KEYS.UI_PREVIEW_JIT_DB_ACCESS,
LOCAL_STORAGE_KEYS.UI_PREVIEW_SQL_EDITOR_MANUAL_SAVE,
- LOCAL_STORAGE_KEYS.UI_PREVIEW_MARKETPLACE,
LOCAL_STORAGE_KEYS.LAST_SIGN_IN_METHOD,
LOCAL_STORAGE_KEYS.HIDE_PROMO_TOAST,
LOCAL_STORAGE_KEYS.BLOG_VIEW,