diff --git a/apps/studio/components/interfaces/Account/Preferences/ThemeSettingsOld.tsx b/apps/studio/components/interfaces/Account/Preferences/ThemeSettingsOld.tsx deleted file mode 100644 index 41fcad374d2..00000000000 --- a/apps/studio/components/interfaces/Account/Preferences/ThemeSettingsOld.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { Moon, Sun } from 'lucide-react' -import { useTheme } from 'next-themes' -import { useEffect, useState } from 'react' - -import Panel from 'components/ui/Panel' -import { Listbox, Theme, themes } from 'ui' - -const ThemeSettings = () => { - const [mounted, setMounted] = useState(false) - const { theme, resolvedTheme, setTheme } = useTheme() - - /** - * Avoid Hydration Mismatch - * https://github.com/pacocoursey/next-themes?tab=readme-ov-file#avoid-hydration-mismatch - */ - // useEffect only runs on the client, so now we can safely show the UI - useEffect(() => { - setMounted(true) - }, []) - - if (!mounted) { - return null - } - - return ( - Theme}> - - : } - onChange={(value: string) => setTheme(value)} - > - {themes - .filter( - (theme: Theme) => - // temporary fix to exclude new themes - theme.value === 'light' || theme.value === 'dark' || theme.value === 'system' - ) - .map((theme: Theme) => ( - - {theme.name} - - ))} - - - - ) -} - -export default ThemeSettings diff --git a/apps/studio/components/interfaces/Account/Preferences/index.ts b/apps/studio/components/interfaces/Account/Preferences/index.ts index c1d48f60d42..be8a47b1747 100644 --- a/apps/studio/components/interfaces/Account/Preferences/index.ts +++ b/apps/studio/components/interfaces/Account/Preferences/index.ts @@ -1,4 +1,3 @@ export { default as AccountInformation } from './AccountInformation' export { default as AnalyticsSettings } from './AnalyticsSettings' -export { default as ThemeSettingsOld } from './ThemeSettingsOld' export { default as ThemeSettings } from './ThemeSettings' diff --git a/apps/studio/components/interfaces/Auth/Hooks/CreateHookSheet.tsx b/apps/studio/components/interfaces/Auth/Hooks/CreateHookSheet.tsx index cfc81587e92..03d9c00b3bf 100644 --- a/apps/studio/components/interfaces/Auth/Hooks/CreateHookSheet.tsx +++ b/apps/studio/components/interfaces/Auth/Hooks/CreateHookSheet.tsx @@ -16,7 +16,6 @@ import SchemaSelector from 'components/ui/SchemaSelector' import { AuthConfigResponse } from 'data/auth/auth-config-query' import { useAuthHooksUpdateMutation } from 'data/auth/auth-hooks-update-mutation' import { executeSql } from 'data/sql/execute-sql-query' -import { useFlag } from 'hooks/ui/useFlag' import { Button, FormControl_Shadcn_, @@ -116,7 +115,6 @@ export const CreateHookSheet = ({ }: CreateHookSheetProps) => { const { ref: projectRef } = useParams() const { project } = useProjectContext() - const httpsAuthHooksEnabled = useFlag('httpsAuthHooksEnabled') const definition = useMemo( () => HOOKS_DEFINITIONS.find((d) => d.title === title) || HOOKS_DEFINITIONS[0], @@ -326,37 +324,35 @@ export const CreateHookSheet = ({ )} /> - {httpsAuthHooksEnabled && ( - ( - - - field.onChange(value)} - > - - - - - - )} - /> - )} + ( + + + field.onChange(value)} + > + + + + + + )} + /> {values.selectedType === 'postgres' ? ( <>
diff --git a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/index.tsx b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/index.tsx index d519fd87584..39e81d3c9d7 100644 --- a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/index.tsx +++ b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/index.tsx @@ -12,7 +12,6 @@ import { useThirdPartyAuthIntegrationsQuery, } from 'data/third-party-auth/integrations-query' import { useCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useFlag } from 'hooks/ui/useFlag' import { cn } from 'ui' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { AddIntegrationDropdown } from './AddIntegrationDropdown' @@ -27,7 +26,6 @@ import { } from './ThirdPartyAuthForm.utils' export const ThirdPartyAuthForm = () => { - const thirdPartyAuthEnabled = useFlag('thirdPartyAuth') const { ref: projectRef } = useParams() const { data: integrationsData, @@ -45,10 +43,6 @@ export const ThirdPartyAuthForm = () => { const { mutateAsync: deleteIntegration } = useDeleteThirdPartyAuthIntegrationMutation() const canUpdateConfig = useCheckPermissions(PermissionAction.UPDATE, 'custom_config_gotrue') - if (!thirdPartyAuthEnabled) { - return null - } - if (isError) { return ( { const router = useRouter() - const newRegions = ['EAST_US_2', 'WEST_EU_3', 'CENTRAL_EU_2', 'NORTH_EU'] - const enableNewRegions = useFlag('enableNewRegions') const showNonProdFields = process.env.NEXT_PUBLIC_ENVIRONMENT === 'local' || process.env.NEXT_PUBLIC_ENVIRONMENT === 'staging' const availableRegions = getAvailableRegions(PROVIDERS[cloudProvider].id) - const regionsArray = enableNewRegions - ? Object.entries(availableRegions) - : Object.entries(availableRegions).filter(([key]) => !newRegions.includes(key)) + const regionsArray = Object.entries(availableRegions) const { isLoading: isLoadingDefaultRegion } = useDefaultRegionQuery({ cloudProvider, diff --git a/apps/studio/components/interfaces/Support/SupportFormV2.tsx b/apps/studio/components/interfaces/Support/SupportFormV2.tsx index ba04ce4cbe6..360dacc27c1 100644 --- a/apps/studio/components/interfaces/Support/SupportFormV2.tsx +++ b/apps/studio/components/interfaces/Support/SupportFormV2.tsx @@ -10,12 +10,13 @@ import * as z from 'zod' import { useDocsSearch, useParams, type DocsSearchResult as Page } from 'common' import { CLIENT_LIBRARIES } from 'common/constants' +import { getProjectAuthConfig } from 'data/auth/auth-config-query' import { useSendSupportTicketMutation } from 'data/feedback/support-ticket-send' import { useOrganizationsQuery } from 'data/organizations/organizations-query' import type { Project } from 'data/projects/project-detail-query' import { useProjectsQuery } from 'data/projects/projects-query' import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' -import { useFlag } from 'hooks/ui/useFlag' +import { detectBrowser } from 'lib/helpers' import { useProfile } from 'lib/profile' import { Badge, @@ -37,8 +38,10 @@ import { TextArea_Shadcn_, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' -import DisabledStateForFreeTier from './DisabledStateForFreeTier' +import { MultiSelectV2 } from 'ui-patterns/MultiSelectDeprecated/MultiSelectV2' import { DocsLinkGroup } from './DocsLink' +import { IPV4SuggestionAlert } from './IPV4SuggestionAlert' +import { LibrarySuggestions } from './LibrarySuggestions' import { PlanExpectationInfoBox } from './PlanExpectationInfoBox' import { CATEGORY_OPTIONS, @@ -46,12 +49,7 @@ import { SERVICE_OPTIONS, SEVERITY_OPTIONS, } from './Support.constants' -import { LibrarySuggestions } from './LibrarySuggestions' -import { MultiSelectV2 } from 'ui-patterns/MultiSelectDeprecated/MultiSelectV2' -import { IPV4SuggestionAlert } from './IPV4SuggestionAlert' import { formatMessage, uploadAttachments } from './SupportForm.utils' -import { detectBrowser } from 'lib/helpers' -import { getProjectAuthConfig } from 'data/auth/auth-config-query' const MAX_ATTACHMENTS = 5 const INCLUDE_DISCUSSIONS = ['Problem', 'Database_unresponsive'] @@ -68,7 +66,6 @@ export const SupportFormV2 = ({ setSentCategory, setSelectedProject }: SupportFo const { profile } = useProfile() const supabaseClient = useSupabaseClient() const { ref, slug, category: urlCategory, subject: urlSubject, message: urlMessage } = useParams() - const enableFreeSupport = useFlag('enableFreeSupport') const uploadButtonRef = useRef(null) const [isSubmitting, setIsSubmitting] = useState(false) @@ -486,250 +483,239 @@ export const SupportFormV2 = ({ setSentCategory, setSelectedProject }: SupportFo - {!enableFreeSupport || (category === 'Performance' && subscriptionPlanId === 'free') ? ( - o.value === category)?.label ?? ''} - organizationSlug={organizationSlug} - /> - ) : ( - <> -
- ( - 0 && - INCLUDE_DISCUSSIONS.includes(category) && ( -

- Check our - - Github discussions - - - for a quick answer -

- ) - } - > - - - -
- )} - /> - - {docsResults.length > 0 && hasResults && ( -
-

- Suggested resources ({Math.min(docsResults.length, 5)}) -

- 3 ? 'h-[300px]' : ''}> - {docsResults.slice(0, 5).map((page, i) => ( - - ))} - -
- )} -
- - {category === 'Problem' && ( - ( - - - + ( + 0 && + INCLUDE_DISCUSSIONS.includes(category) && ( +

+ Check our + - - - - - - {CLIENT_LIBRARIES.map((option) => ( - - {option.language} - - ))} - - - - - - )} - /> + Github discussions + + + for a quick answer +

+ ) + } + > + + + +
)} + /> - {library.length > 0 && } - - {category !== 'Login_issues' && ( - ( - - - - form.setValue('affectedServices', services.join(', ')) - } - /> - - - )} - /> - )} - - ( - field.value.includes(str)) && ( - - ) - } - > - - - - - )} - /> - - {['Problem', 'Database_unresponsive', 'Performance'].includes(category) && ( - ( - - - field.onChange(value)} - /> - - - )} - /> - )} - -
-
-

Attachments

-

- Upload up to {MAX_ATTACHMENTS} screenshots that might be relevant to the issue - that you're facing -

-
- -
- {uploadedDataUrls.map((x: any, idx: number) => ( -
-
removeUploadedFile(idx)} - > - -
-
+ {docsResults.length > 0 && hasResults && ( +
+

+ Suggested resources ({Math.min(docsResults.length, 5)}) +

+ 3 ? 'h-[300px]' : ''}> + {docsResults.slice(0, 5).map((page, i) => ( + ))} - {uploadedFiles.length < MAX_ATTACHMENTS && ( -
{ - if (uploadButtonRef.current) (uploadButtonRef.current as any).click() - }} - > - -
- )} -
+
+ )} +
-
-
-

We will contact you at

-

{respondToEmail}

-
-
-

- Please ensure you haven't blocked Hubspot in your emails -

-
-
- -
-
- + {category === 'Problem' && ( + ( + + + + + + + + + {CLIENT_LIBRARIES.map((option) => ( + + {option.language} + + ))} + + + + + + )} + /> )} + + {library.length > 0 && } + + {category !== 'Login_issues' && ( + ( + + + form.setValue('affectedServices', services.join(', '))} + /> + + + )} + /> + )} + + ( + field.value.includes(str)) && ( + + ) + } + > + + + + + )} + /> + + {['Problem', 'Database_unresponsive', 'Performance'].includes(category) && ( + ( + + + field.onChange(value)} + /> + + + )} + /> + )} + +
+
+

Attachments

+

+ Upload up to {MAX_ATTACHMENTS} screenshots that might be relevant to the issue that + you're facing +

+
+ +
+ {uploadedDataUrls.map((x: any, idx: number) => ( +
+
removeUploadedFile(idx)} + > + +
+
+ ))} + {uploadedFiles.length < MAX_ATTACHMENTS && ( +
{ + if (uploadButtonRef.current) (uploadButtonRef.current as any).click() + }} + > + +
+ )} +
+
+ +
+
+

We will contact you at

+

{respondToEmail}

+
+
+

+ Please ensure you haven't blocked Hubspot in your emails +

+
+
+ +
+
) diff --git a/apps/studio/components/layouts/ProjectIntegrationsLayout/ProjectIntegrations.Commands.tsx b/apps/studio/components/layouts/ProjectIntegrationsLayout/ProjectIntegrations.Commands.tsx deleted file mode 100644 index 0601598e5a8..00000000000 --- a/apps/studio/components/layouts/ProjectIntegrationsLayout/ProjectIntegrations.Commands.tsx +++ /dev/null @@ -1,107 +0,0 @@ -import { Code } from 'lucide-react' - -import { COMMAND_MENU_SECTIONS } from 'components/interfaces/App/CommandMenu/CommandMenu.utils' -import type { CommandOptions } from 'ui-patterns/CommandMenu' -import { useRegisterCommands } from 'ui-patterns/CommandMenu' -import { useParams } from 'common' -import { orderCommandSectionsByPriority } from 'components/interfaces/App/CommandMenu/ordering' - -export function useDatabaseGotoCommands(options?: CommandOptions) { - let { ref } = useParams() - ref ||= '_' - - useRegisterCommands( - COMMAND_MENU_SECTIONS.QUERY, - [ - { - id: 'run-sql', - name: 'Run SQL', - route: `/project/${ref}/sql/new`, - icon: () => , - }, - ], - { - ...options, - deps: [ref], - orderSection: orderCommandSectionsByPriority, - sectionMeta: { priority: 2 }, - } - ) - - useRegisterCommands( - COMMAND_MENU_SECTIONS.NAVIGATE, - [ - { - id: 'nav-database-tables', - name: 'Tables', - value: 'Database: Tables', - route: `/project/${ref}/database/tables`, - defaultHidden: true, - }, - { - id: 'nav-database-triggers', - name: 'Triggers', - value: 'Database: Triggers', - route: `/project/${ref}/database/triggers`, - defaultHidden: true, - }, - { - id: 'nav-database-functions', - name: 'Functions', - value: 'Database: Functions', - route: `/project/${ref}/database/functions`, - defaultHidden: true, - }, - { - id: 'nav-database-extensions', - name: 'Extensions', - value: 'Database: Extensions', - route: `/project/${ref}/database/extensions`, - defaultHidden: true, - }, - { - id: 'nav-database-roles', - name: 'Roles', - value: 'Database: Roles', - route: `/project/${ref}/database/roles`, - defaultHidden: true, - }, - { - id: 'nav-database-replication', - name: 'Replication', - value: 'Database: Replication', - route: `/project/${ref}/database/replication`, - defaultHidden: true, - }, - { - id: 'nav-database-hooks', - name: 'Webhooks', - value: 'Database: Webhooks', - route: `/project/${ref}/integrations/hooks`, - defaultHidden: true, - }, - { - id: 'nav-database-backups', - name: 'Backups', - value: 'Database: Backups', - route: `/project/${ref}/database/backups/scheduled`, - defaultHidden: true, - }, - { - id: 'nav-database-wrappers', - name: 'Wrappers', - value: 'Database: Wrappers', - route: `/project/${ref}/integrations/wrappers`, - defaultHidden: true, - }, - { - id: 'nav-database-migrations', - name: 'Migrations', - value: 'Database: Migrations', - route: `/project/${ref}/database/migrations`, - defaultHidden: true, - }, - ], - { ...options, deps: [ref] } - ) -} diff --git a/apps/studio/components/layouts/ProjectIntegrationsLayout/ProjectIntegrationsLayout.tsx b/apps/studio/components/layouts/ProjectIntegrationsLayout/ProjectIntegrationsLayout.tsx deleted file mode 100644 index b9496ba2ba6..00000000000 --- a/apps/studio/components/layouts/ProjectIntegrationsLayout/ProjectIntegrationsLayout.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { useRouter } from 'next/router' -import { PropsWithChildren } from 'react' - -import { IS_PLATFORM } from 'common' -import { ProductMenu } from 'components/ui/ProductMenu' -import { useDatabaseExtensionsQuery } from 'data/database-extensions/database-extensions-query' -import { useSelectedProject } from 'hooks/misc/useSelectedProject' -import { withAuth } from 'hooks/misc/withAuth' -import { useFlag } from 'hooks/ui/useFlag' -import ProjectLayout from '../ProjectLayout/ProjectLayout' -import { generateProjectIntegrationsMenu } from './ProjectIntegrationsMenu.utils' - -export interface ProjectIntegrationsLayoutProps { - title: string -} - -const ProjectIntegrationsMenu = () => { - // if running on self-hosted, cron UI should be always enabled - const cronUiEnabled = useFlag('cronUi') || !IS_PLATFORM - const queuesUiEnabled = useFlag('queues') - const project = useSelectedProject() - - const router = useRouter() - const page = router.pathname.split('/')[4] - - const { data } = useDatabaseExtensionsQuery({ - projectRef: project?.ref, - connectionString: project?.connectionString, - }) - - const pgNetExtensionExists = (data ?? []).find((ext) => ext.name === 'pg_net') !== undefined - const graphqlExtensionExists = (data ?? []).find((ext) => ext.name === 'pg_graphql') !== undefined - const pgmqExtensionExists = (data ?? []).find((ext) => ext.name === 'pgmq') !== undefined - - return ( - <> - - - ) -} - -const ProjectIntegrationsLayout = ({ - children, - title, -}: PropsWithChildren) => { - return ( - } - isBlocking={false} - > - {children} - - ) -} - -export default withAuth(ProjectIntegrationsLayout) diff --git a/apps/studio/components/layouts/ProjectIntegrationsLayout/ProjectIntegrationsMenu.utils.tsx b/apps/studio/components/layouts/ProjectIntegrationsLayout/ProjectIntegrationsMenu.utils.tsx deleted file mode 100644 index 1811d28d2ad..00000000000 --- a/apps/studio/components/layouts/ProjectIntegrationsLayout/ProjectIntegrationsMenu.utils.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import type { ProductMenuGroup } from 'components/ui/ProductMenu/ProductMenu.types' -import type { Project } from 'data/projects/project-detail-query' - -export const generateProjectIntegrationsMenu = ( - project?: Project, - flags?: { - pgNetExtensionExists: boolean - cronUiEnabled: boolean - queuesUiEnabled: boolean - graphqlExtensionExists: boolean - pgmqExtensionExists: boolean - } -): ProductMenuGroup[] => { - const ref = project?.ref ?? 'default' - const { - pgNetExtensionExists, - cronUiEnabled, - queuesUiEnabled, - graphqlExtensionExists, - pgmqExtensionExists, - } = flags || {} - - return [ - { - title: 'Manage', - items: [ - { - name: 'Wrappers', - key: 'wrappers', - url: `/project/${ref}/integrations/wrappers`, - items: [], - }, - ...(!!pgNetExtensionExists - ? [ - { - name: 'Webhooks', - key: 'hooks', - url: `/project/${ref}/integrations/hooks`, - items: [], - }, - ] - : []), - - ...(!!cronUiEnabled - ? [ - { - name: 'Cron', - key: 'cron-jobs', - url: `/project/${ref}/integrations/cron`, - items: [], - }, - ] - : []), - ...(!!graphqlExtensionExists - ? [ - { - name: 'GraphiQL', - key: 'graphiql', - url: `/project/${ref}/integrations/graphiql`, - items: [], - }, - ] - : []), - { - name: 'Vault', - key: 'vault', - url: `/project/${ref}/integrations/vault/secrets`, - items: [], - label: 'BETA', - }, - ...(!!(queuesUiEnabled && pgmqExtensionExists) - ? [ - { - name: 'Queues', - key: 'queues', - url: `/project/${ref}/integrations/queues`, - items: [], - }, - ] - : []), - ], - }, - ] -} diff --git a/apps/studio/components/layouts/ProjectSettingsLayout/SettingsLayout.tsx b/apps/studio/components/layouts/ProjectSettingsLayout/SettingsLayout.tsx index 8b5bdd929e3..81af839800a 100644 --- a/apps/studio/components/layouts/ProjectSettingsLayout/SettingsLayout.tsx +++ b/apps/studio/components/layouts/ProjectSettingsLayout/SettingsLayout.tsx @@ -47,7 +47,6 @@ const SettingsLayout = ({ title, children }: PropsWithChildren { @@ -26,7 +25,6 @@ export const generateSettingsMenu = ( const edgeFunctionsEnabled = features?.edgeFunctions ?? true const storageEnabled = features?.storage ?? true const warehouseEnabled = features?.warehouse ?? false - const logDrainsEnabled = features?.logDrains ?? false const newDiskComputeEnabled = features?.diskAndCompute ?? false return [ @@ -136,7 +134,7 @@ export const generateSettingsMenu = ( }, ] : []), - ...(IS_PLATFORM && logDrainsEnabled + ...(IS_PLATFORM ? [ { name: `Log Drains`, diff --git a/apps/studio/pages/account/me.tsx b/apps/studio/pages/account/me.tsx index c94b58eb601..9c1f90281ab 100644 --- a/apps/studio/pages/account/me.tsx +++ b/apps/studio/pages/account/me.tsx @@ -2,7 +2,6 @@ import { AccountInformation, AnalyticsSettings, ThemeSettings, - ThemeSettingsOld, } from 'components/interfaces/Account/Preferences' import { AccountDeletion } from 'components/interfaces/Account/Preferences/AccountDeletion' import { ProfileInformation } from 'components/interfaces/Account/Preferences/ProfileInformation' @@ -11,7 +10,6 @@ import AlertError from 'components/ui/AlertError' import Panel from 'components/ui/Panel' import { GenericSkeletonLoader } from 'components/ui/ShimmeringLoader' import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useFlag } from 'hooks/ui/useFlag' import { useProfile } from 'lib/profile' import type { NextPageWithLayout } from 'types' @@ -41,11 +39,8 @@ export default User const ProfileCard = () => { const profileUpdateEnabled = useIsFeatureEnabled('profile:update') - const { profile, error, isLoading, isError, isSuccess } = useProfile() - const experimentalThemeEnabled = useFlag('enableExperimentalTheme') - return (
{isLoading && ( @@ -71,7 +66,9 @@ const ProfileCard = () => { )} -
{experimentalThemeEnabled ? : }
+
+ +