diff --git a/apps/studio/components/interfaces/Realtime/RealtimeSettings.tsx b/apps/studio/components/interfaces/Realtime/RealtimeSettings.tsx
index a56bf523fc2..c46e3bbb953 100644
--- a/apps/studio/components/interfaces/Realtime/RealtimeSettings.tsx
+++ b/apps/studio/components/interfaces/Realtime/RealtimeSettings.tsx
@@ -6,16 +6,20 @@ import { toast } from 'sonner'
import * as z from 'zod'
import { useParams } from 'common'
+import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext'
import { ScaffoldSection } from 'components/layouts/Scaffold'
-import { convertFromBytes } from 'components/to-be-cleaned/Storage/StorageSettings/StorageSettings.utils'
import AlertError from 'components/ui/AlertError'
import { FormSection, FormSectionContent, FormSectionLabel } from 'components/ui/Forms/FormSection'
+import { InlineLink } from 'components/ui/InlineLink'
+import { useMaxConnectionsQuery } from 'data/database/max-connections-query'
import { useRealtimeConfigurationUpdateMutation } from 'data/realtime/realtime-config-mutation'
import {
REALTIME_DEFAULT_CONFIG,
useRealtimeConfigurationQuery,
} from 'data/realtime/realtime-config-query'
+import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query'
import { useCheckPermissions } from 'hooks/misc/useCheckPermissions'
+import { useSelectedOrganization } from 'hooks/misc/useSelectedOrganization'
import {
Button,
Card,
@@ -28,27 +32,29 @@ import {
Input_Shadcn_,
Switch,
} from 'ui'
+import { Admonition } from 'ui-patterns'
import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
const formId = 'realtime-configuration-form'
-const FormSchema = z.object({
- private_only: z.boolean(),
- connection_pool: z.coerce.number().min(1).max(100),
- max_concurrent_users: z.coerce.number().min(1).max(50000),
- max_events_per_second: z.coerce.number().min(1).max(50000),
- max_bytes_per_second: z.coerce.number().min(1).max(10000000),
- max_channels_per_client: z.coerce.number().min(1).max(10000),
- max_joins_per_second: z.coerce.number().min(1).max(5000),
-})
-
export const RealtimeSettings = () => {
const { ref: projectRef } = useParams()
+ const { project } = useProjectContext()
+ const organization = useSelectedOrganization()
const canUpdateConfig = useCheckPermissions(PermissionAction.REALTIME_ADMIN_READ, '*')
+ const { data: maxConn } = useMaxConnectionsQuery({
+ projectRef: project?.ref,
+ connectionString: project?.connectionString,
+ })
const { data, error, isLoading, isSuccess, isError } = useRealtimeConfigurationQuery({
projectRef,
})
+ const { data: subscription, isSuccess: isSuccessSubscription } = useOrgSubscriptionQuery({
+ orgSlug: organization?.slug,
+ })
+ const isUsageBillingEnabled = subscription?.usage_billing_enabled
+
const { mutate: updateRealtimeConfig, isLoading: isUpdatingConfig } =
useRealtimeConfigurationUpdateMutation({
onSuccess: () => {
@@ -57,20 +63,43 @@ export const RealtimeSettings = () => {
},
})
+ const FormSchema = z.object({
+ allow_public: z.boolean(),
+ connection_pool: z.coerce
+ .number()
+ .min(1)
+ .max(maxConn?.maxConnections ?? 100),
+ max_concurrent_users: z.coerce.number().min(1).max(50000),
+
+ // [Joshen] These fields are temporarily hidden from the UI
+ // max_events_per_second: z.coerce.number().min(1).max(50000),
+ // max_bytes_per_second: z.coerce.number().min(1).max(10000000),
+ // max_channels_per_client: z.coerce.number().min(1).max(10000),
+ // max_joins_per_second: z.coerce.number().min(1).max(5000),
+ })
+
const form = useForm
+ You need additional permissions to update realtime settings +
+ )} +