diff --git a/apps/studio/components/interfaces/Auth/AdvancedAuthSettingsForm/AdvancedAuthSettingsForm.tsx b/apps/studio/components/interfaces/Auth/AdvancedAuthSettingsForm/AdvancedAuthSettingsForm.tsx index abea3607806..a2f90983896 100644 --- a/apps/studio/components/interfaces/Auth/AdvancedAuthSettingsForm/AdvancedAuthSettingsForm.tsx +++ b/apps/studio/components/interfaces/Auth/AdvancedAuthSettingsForm/AdvancedAuthSettingsForm.tsx @@ -1,18 +1,9 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' -import { useParams } from 'common' import { useEffect } from 'react' import toast from 'react-hot-toast' -import { - AlertDescription_Shadcn_, - AlertTitle_Shadcn_, - Alert_Shadcn_, - Form, - IconAlertCircle, - InputNumber, - Toggle, -} from 'ui' import { boolean, number, object } from 'yup' +import { useParams } from 'common' import { FormActions, FormHeader, @@ -21,12 +12,21 @@ import { FormSectionContent, FormSectionLabel, } from 'components/ui/Forms' +import UpgradeToPro from 'components/ui/UpgradeToPro' import { useAuthConfigQuery } from 'data/auth/auth-config-query' -import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation' +import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' import { useCheckPermissions, useSelectedOrganization } from 'hooks' import { IS_PLATFORM } from 'lib/constants' -import UpgradeToPro from 'components/ui/UpgradeToPro' +import { + AlertDescription_Shadcn_, + AlertTitle_Shadcn_, + Alert_Shadcn_, + Form, + InputNumber, + Toggle, +} from 'ui' +import { WarningIcon } from 'ui-patterns/Icons/StatusIcons' const schema = object({ JWT_EXP: number() @@ -105,7 +105,7 @@ const AdvancedAuthSettingsForm = () => { if (isError) { return ( - + Failed to retrieve auth configuration {authConfigError.message} @@ -207,8 +207,6 @@ const AdvancedAuthSettingsForm = () => { primaryText="Upgrade to Teams or Enterprise" secondaryText="Max Direct Database Connections settings are only available on the Teams plan and up." buttonText="Upgrade to Teams" - projectRef={projectRef!} - organizationSlug={organization!.slug} /> )} @@ -230,8 +228,6 @@ const AdvancedAuthSettingsForm = () => { primaryText="Upgrade to Teams or Enterprise" secondaryText="Max Request Duration settings are only available on the Teams plan and up." buttonText="Upgrade to Teams" - projectRef={projectRef!} - organizationSlug={organization!.slug} /> )} diff --git a/apps/studio/components/interfaces/Auth/BasicAuthSettingsForm/BasicAuthSettingsForm.tsx b/apps/studio/components/interfaces/Auth/BasicAuthSettingsForm/BasicAuthSettingsForm.tsx index f9a44561ca4..93cf712bc18 100644 --- a/apps/studio/components/interfaces/Auth/BasicAuthSettingsForm/BasicAuthSettingsForm.tsx +++ b/apps/studio/components/interfaces/Auth/BasicAuthSettingsForm/BasicAuthSettingsForm.tsx @@ -1,22 +1,11 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' -import { useParams } from 'common' +import { ExternalLink } from 'lucide-react' +import Link from 'next/link' import { useEffect, useState } from 'react' import toast from 'react-hot-toast' -import { - AlertDescription_Shadcn_, - AlertTitle_Shadcn_, - Alert_Shadcn_, - Button, - Form, - IconAlertCircle, - IconEye, - IconEyeOff, - Input, - InputNumber, - Toggle, -} from 'ui' import { boolean, number, object, string } from 'yup' +import { useParams } from 'common' import { Markdown } from 'components/interfaces/Markdown' import { FormActions, @@ -31,10 +20,21 @@ import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutati import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' import { useCheckPermissions, useSelectedOrganization } from 'hooks' import { IS_PLATFORM } from 'lib/constants' -import Link from 'next/link' +import { + AlertDescription_Shadcn_, + AlertTitle_Shadcn_, + Alert_Shadcn_, + Button, + Form, + IconAlertCircle, + IconEye, + IconEyeOff, + Input, + InputNumber, + Toggle, +} from 'ui' import { WarningIcon } from 'ui-patterns/Icons/StatusIcons' import FormField from '../AuthProvidersForm/FormField' -import { ExternalLink } from 'lucide-react' // Use a const string to represent no chars option. Represented as empty string on the backend side. const NO_REQUIRED_CHARACTERS = 'NO_REQUIRED_CHARS' @@ -332,8 +332,6 @@ const BasicAuthSettingsForm = () => { )} { )} { if (planKey === 'FREE') { return ( } - primaryText="Free Plan does not include project backups." - projectRef={projectRef} - organizationSlug={organization!.slug} - secondaryText="Upgrade to the Pro plan for up to 7 days of scheduled backups." addon="pitr" + icon={} + primaryText="Free Plan does not include project backups." + secondaryText="Upgrade to the Pro plan for up to 7 days of scheduled backups." /> ) } @@ -85,7 +83,7 @@ const BackupsList = () => { <> {!canTriggerScheduledBackups && ( } + icon={} title="You need additional permissions to trigger a scheduled backup" /> )} diff --git a/apps/studio/components/interfaces/Database/Hooks/HTTPRequestFields.tsx b/apps/studio/components/interfaces/Database/Hooks/HTTPRequestFields.tsx index d4463792e32..c3fa2c3cfd2 100644 --- a/apps/studio/components/interfaces/Database/Hooks/HTTPRequestFields.tsx +++ b/apps/studio/components/interfaces/Database/Hooks/HTTPRequestFields.tsx @@ -55,9 +55,7 @@ const HTTPRequestFields = ({ const edgeFunctions = functions ?? [] const apiService = settings?.autoApiService - const anonKey = apiService?.service_api_keys.find((x) => x.name === 'service_role key') - ? apiService.serviceApiKey - : '[YOUR API KEY]' + const apiKey = apiService?.serviceApiKey ?? '[YOUR API KEY]' return ( <> @@ -180,7 +178,7 @@ const HTTPRequestFields = ({ onAddHeader({ id: uuidv4(), name: 'Authorization', - value: `Bearer ${anonKey}`, + value: `Bearer ${apiKey}`, }) } > diff --git a/apps/studio/components/interfaces/Docs/ResourceContent.tsx b/apps/studio/components/interfaces/Docs/ResourceContent.tsx index 55422ab83ae..151c1d371e4 100644 --- a/apps/studio/components/interfaces/Docs/ResourceContent.tsx +++ b/apps/studio/components/interfaces/Docs/ResourceContent.tsx @@ -1,6 +1,6 @@ -import { useParams } from 'common' -import { IconTable } from 'ui' +import { Table2 } from 'lucide-react' +import { useParams } from 'common' import CodeSnippet from 'components/interfaces/Docs/CodeSnippet' import Description from 'components/interfaces/Docs/Description' import Param from 'components/interfaces/Docs/Param' @@ -34,7 +34,8 @@ const ResourceContent = ({ const resourceDefinition = definitions[resourceId] const resourceMeta = resources[resourceId] const description = resourceDefinition?.description || null - const methods = Object.keys(resourcePaths).map((x) => x.toUpperCase()) + + const methods = Object.keys(resourcePaths ?? {}).map((x) => x.toUpperCase()) const properties = Object.entries(resourceDefinition.properties || []).map(([id, val]: any) => ({ ...val, id, @@ -45,7 +46,7 @@ const ResourceContent = ({ <>

- + {resourceId}

diff --git a/apps/studio/components/interfaces/Functions/CommandRender.tsx b/apps/studio/components/interfaces/Functions/CommandRender.tsx index abe2d70ae33..010ff1f3474 100644 --- a/apps/studio/components/interfaces/Functions/CommandRender.tsx +++ b/apps/studio/components/interfaces/Functions/CommandRender.tsx @@ -1,5 +1,5 @@ +import { Check, Clipboard } from 'lucide-react' import { useState } from 'react' -import { IconCheck, IconClipboard } from 'ui' const CommandRender = ({ commands }: any) => { return ( @@ -15,6 +15,7 @@ export default CommandRender const Command = ({ item }: any) => { const [isCopied, setIsCopied] = useState(false) + return (
{`> ${item.comment}`} @@ -38,15 +39,9 @@ const Command = ({ item }: any) => { }} > {isCopied ? ( -
- -
+ ) : ( -
-
- -
-
+ )} diff --git a/apps/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionDetails.tsx b/apps/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionDetails.tsx index 7f1b81463e6..0fd475adaef 100644 --- a/apps/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionDetails.tsx +++ b/apps/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionDetails.tsx @@ -23,18 +23,8 @@ import { useEdgeFunctionQuery } from 'data/edge-functions/edge-function-query' import { useEdgeFunctionDeleteMutation } from 'data/edge-functions/edge-functions-delete-mutation' import { useEdgeFunctionUpdateMutation } from 'data/edge-functions/edge-functions-update-mutation' import { useCheckPermissions } from 'hooks' -import { - Alert, - Button, - Form, - IconExternalLink, - IconMaximize2, - IconMinimize2, - IconTerminal, - Input, - Modal, - Toggle, -} from 'ui' +import { ExternalLink, Maximize2, Minimize2, Terminal } from 'lucide-react' +import { Alert, Button, Form, Input, Modal, Toggle } from 'ui' import CommandRender from '../CommandRender' import { generateCLICommands } from './EdgeFunctionDetails.utils' @@ -60,9 +50,7 @@ const EdgeFunctionDetails = () => { // Get the API service const apiService = settings?.autoApiService - const anonKey = apiService?.service_api_keys.find((x) => x.name === 'anon key') - ? apiService.defaultApiKey - : '[YOUR ANON KEY]' + const anonKey = apiService?.defaultApiKey ?? '[YOUR ANON KEY]' const endpoint = apiService?.app_config.endpoint ?? '' const functionUrl = @@ -198,11 +186,7 @@ const EdgeFunctionDetails = () => { explicit import URLs

- - -
diff --git a/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceGrid.tsx b/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceGrid.tsx index 85ed9bf35c8..87bea407407 100644 --- a/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceGrid.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceGrid.tsx @@ -91,7 +91,7 @@ export const QueryPerformanceGrid = ({ queryPerformanceQuery }: QueryPerformance }) const selectedQuery = - selectedRow !== undefined ? queryPerformanceQuery.data?.[selectedRow]['query'] : undefined + selectedRow !== undefined ? queryPerformanceQuery.data?.[selectedRow]?.['query'] : undefined const showIndexSuggestions = (selectedQuery ?? '').trim().toLowerCase().startsWith('select') const onSortChange = (column: string) => { diff --git a/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainConfig.tsx b/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainConfig.tsx index 88c6f9aa91e..f8635f8946a 100644 --- a/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainConfig.tsx +++ b/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainConfig.tsx @@ -1,19 +1,19 @@ +import { AlertCircle } from 'lucide-react' import Link from 'next/link' -import { useParams } from 'common/hooks' +import { useParams } from 'common' import { FormHeader } from 'components/ui/Forms' import Panel from 'components/ui/Panel' import UpgradeToPro from 'components/ui/UpgradeToPro' import { useProjectApiQuery } from 'data/config/project-api-query' import { useCustomDomainsQuery } from 'data/custom-domains/custom-domains-query' -import { IconAlertCircle } from 'ui' -import CustomDomainActivate from './CustomDomainActivate' -import CustomDomainDelete from './CustomDomainDelete' -import CustomDomainsConfigureHostname from './CustomDomainsConfigureHostname' -import CustomDomainsShimmerLoader from './CustomDomainsShimmerLoader' -import CustomDomainVerify from './CustomDomainVerify' import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' import { useFlag, useSelectedOrganization } from 'hooks' +import CustomDomainActivate from './CustomDomainActivate' +import CustomDomainDelete from './CustomDomainDelete' +import CustomDomainVerify from './CustomDomainVerify' +import CustomDomainsConfigureHostname from './CustomDomainsConfigureHostname' +import CustomDomainsShimmerLoader from './CustomDomainsShimmerLoader' const CustomDomainConfig = () => { const { ref } = useParams() @@ -50,7 +50,7 @@ const CustomDomainConfig = () => {
- +

Failed to retrieve custom domain configuration. Please try again later or{' '} @@ -65,14 +65,12 @@ const CustomDomainConfig = () => { ) : data?.status === '0_not_allowed' ? ( } + icon={} primaryText={ customDomainsDisabledDueToQuota ? 'New custom domains are temporarily disabled' : 'Custom domains are a Pro plan add-on' } - projectRef={ref} - organizationSlug={organization?.slug} secondaryText={ customDomainsDisabledDueToQuota ? 'We are working with our upstream DNS provider before we are able to sign up new custom domains. Please check back in a few hours.' diff --git a/apps/studio/components/to-be-cleaned/Storage/StorageSettings/StorageSettings.tsx b/apps/studio/components/to-be-cleaned/Storage/StorageSettings/StorageSettings.tsx index 7fdda3f4b93..d2b3c7cb612 100644 --- a/apps/studio/components/to-be-cleaned/Storage/StorageSettings/StorageSettings.tsx +++ b/apps/studio/components/to-be-cleaned/Storage/StorageSettings/StorageSettings.tsx @@ -1,7 +1,19 @@ +import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { useParams } from 'common' +import { Clock } from 'lucide-react' import { useEffect, useState } from 'react' +import { SubmitHandler, useForm } from 'react-hook-form' import toast from 'react-hot-toast' +import * as z from 'zod' + +import { useParams } from 'common' +import AlertError from 'components/ui/AlertError' +import { GenericSkeletonLoader } from 'components/ui/ShimmeringLoader' +import UpgradeToPro from 'components/ui/UpgradeToPro' +import { useProjectStorageConfigQuery } from 'data/config/project-storage-config-query' +import { useProjectStorageConfigUpdateUpdateMutation } from 'data/config/project-storage-config-update-mutation' +import { useCheckPermissions } from 'hooks' +import { IS_PLATFORM } from 'lib/constants' import { Button, FormControl_Shadcn_, @@ -11,32 +23,17 @@ import { FormMessage_Shadcn_, Form_Shadcn_, Input_Shadcn_, - Select_Shadcn_, + SelectContent_Shadcn_, SelectItem_Shadcn_, SelectTrigger_Shadcn_, SelectValue_Shadcn_, - SelectContent_Shadcn_, + Select_Shadcn_, } from 'ui' - -import AlertError from 'components/ui/AlertError' -import { GenericSkeletonLoader } from 'components/ui/ShimmeringLoader' -import UpgradeToPro from 'components/ui/UpgradeToPro' -import { useProjectStorageConfigQuery } from 'data/config/project-storage-config-query' -import { useProjectStorageConfigUpdateUpdateMutation } from 'data/config/project-storage-config-update-mutation' -import { useCheckPermissions, useSelectedOrganization } from 'hooks' -import { IS_PLATFORM } from 'lib/constants' import { STORAGE_FILE_SIZE_LIMIT_MAX_BYTES, StorageSizeUnits } from './StorageSettings.constants' import { convertFromBytes, convertToBytes } from './StorageSettings.utils' -import * as z from 'zod' -import { zodResolver } from '@hookform/resolvers/zod' -import { useForm, SubmitHandler } from 'react-hook-form' -import { Clock } from 'lucide-react' const StorageSettings = () => { const { ref: projectRef } = useParams() - const organization = useSelectedOrganization() - const organizationSlug = organization?.slug - const canUpdateStorageSettings = useCheckPermissions(PermissionAction.STORAGE_ADMIN_WRITE, '*') const { @@ -196,9 +193,7 @@ const StorageSettings = () => {

} - organizationSlug={organizationSlug ?? ''} primaryText="Free Plan has a fixed upload file size limit of 50 MB." - projectRef={projectRef ?? ''} secondaryText="Upgrade to the Pro plan for a configurable upload file size limit of up to 5 GB." />
diff --git a/apps/studio/components/ui/UpgradeToPro.tsx b/apps/studio/components/ui/UpgradeToPro.tsx index 90c4ae72a53..e8d004d315d 100644 --- a/apps/studio/components/ui/UpgradeToPro.tsx +++ b/apps/studio/components/ui/UpgradeToPro.tsx @@ -4,14 +4,12 @@ import Link from 'next/link' import { ReactNode } from 'react' import { Button } from 'ui' -import { useCheckPermissions, useFlag } from 'hooks' +import { useCheckPermissions, useFlag, useSelectedOrganization, useSelectedProject } from 'hooks' import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' interface UpgradeToProProps { icon?: ReactNode primaryText: string - projectRef?: string - organizationSlug?: string secondaryText: string addon?: 'pitr' | 'customDomain' | 'computeInstance' buttonText?: string @@ -21,14 +19,14 @@ interface UpgradeToProProps { const UpgradeToPro = ({ icon, primaryText, - projectRef, - organizationSlug, secondaryText, addon, buttonText, disabled = false, }: UpgradeToProProps) => { - const { data: subscription } = useOrgSubscriptionQuery({ orgSlug: organizationSlug }) + const project = useSelectedProject() + const organization = useSelectedOrganization() + const { data: subscription } = useOrgSubscriptionQuery({ orgSlug: organization?.slug }) const plan = subscription?.plan?.id const canUpdateSubscription = useCheckPermissions( @@ -63,8 +61,8 @@ const UpgradeToPro = ({ {buttonText || (plan === 'free' ? 'Upgrade to Pro' : 'Enable Addon')} diff --git a/apps/studio/data/notifications/notifications-v2-query.ts b/apps/studio/data/notifications/notifications-v2-query.ts index 847c03ce95c..10214be42e6 100644 --- a/apps/studio/data/notifications/notifications-v2-query.ts +++ b/apps/studio/data/notifications/notifications-v2-query.ts @@ -76,7 +76,7 @@ export const useNotificationsV2Query = ( enabled: enabled, getNextPageParam(lastPage, pages) { const page = pages.length - if (lastPage.length < limit) return undefined + if ((lastPage ?? []).length < limit) return undefined return page }, ...options, diff --git a/apps/studio/pages/project/[ref]/database/backups/pitr.tsx b/apps/studio/pages/project/[ref]/database/backups/pitr.tsx index fb46c8dff0d..8ca1607c74a 100644 --- a/apps/studio/pages/project/[ref]/database/backups/pitr.tsx +++ b/apps/studio/pages/project/[ref]/database/backups/pitr.tsx @@ -1,4 +1,5 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' + import DatabaseBackupsNav from 'components/interfaces/Database/Backups/DatabaseBackupsNav' import { PITRNotice, PITRSelection } from 'components/interfaces/Database/Backups/PITR' import { DatabaseLayout } from 'components/layouts' @@ -54,7 +55,6 @@ const PITR = () => { const { data: subscription } = useOrgSubscriptionQuery({ orgSlug: organization?.slug }) - const ref = project?.ref ?? 'default' const plan = subscription?.plan?.id const isEnabled = backups?.pitr_enabled @@ -78,15 +78,13 @@ const PITR = () => { ) : ( )}