From 485d85fb9b06dbc4837611677661a89b0b6e3cda Mon Sep 17 00:00:00 2001 From: Kang Ming Date: Mon, 19 Aug 2024 11:06:36 -0400 Subject: [PATCH 001/217] fix: disable sms provider validation when sms hook is enabled (#28706) * fix: disable sms provider validation when sms hook is enabled * chore: add comments * Small fixes --------- Co-authored-by: Joshen Lim --- .../AuthProvidersForm/AuthProvidersForm.tsx | 28 +- .../Auth/AuthProvidersForm/ProviderForm.tsx | 95 +++++-- .../Auth/AuthProvidersFormValidation.tsx | 243 +++++++++--------- .../interfaces/Auth/Hooks/CreateHookSheet.tsx | 11 +- 4 files changed, 215 insertions(+), 162 deletions(-) diff --git a/apps/studio/components/interfaces/Auth/AuthProvidersForm/AuthProvidersForm.tsx b/apps/studio/components/interfaces/Auth/AuthProvidersForm/AuthProvidersForm.tsx index df03dc42d2e..859f7bf3aa7 100644 --- a/apps/studio/components/interfaces/Auth/AuthProvidersForm/AuthProvidersForm.tsx +++ b/apps/studio/components/interfaces/Auth/AuthProvidersForm/AuthProvidersForm.tsx @@ -12,7 +12,7 @@ import { Button, WarningIcon, } from 'ui' -import { PROVIDERS_SCHEMAS } from '../AuthProvidersFormValidation' +import { getPhoneProviderValidationSchema, PROVIDERS_SCHEMAS } from '../AuthProvidersFormValidation' import { ProviderCollapsibleClasses } from './AuthProvidersForm.constants' import ProviderForm from './ProviderForm' @@ -57,14 +57,16 @@ const AuthProvidersForm = () => { )} {isLoading && - PROVIDERS_SCHEMAS.map((provider) => ( -
- -
- ))} + PROVIDERS_SCHEMAS.map((provider) => { + return ( +
+ +
+ ) + })} {isError && ( @@ -74,11 +76,15 @@ const AuthProvidersForm = () => { )} {isSuccess && PROVIDERS_SCHEMAS.map((provider) => { + const providerSchema = + provider.title === 'Phone' + ? { ...provider, validationSchema: getPhoneProviderValidationSchema(authConfig) } + : provider return ( ) })} diff --git a/apps/studio/components/interfaces/Auth/AuthProvidersForm/ProviderForm.tsx b/apps/studio/components/interfaces/Auth/AuthProvidersForm/ProviderForm.tsx index ca4c86f9c65..a2f4f3cab08 100644 --- a/apps/studio/components/interfaces/Auth/AuthProvidersForm/ProviderForm.tsx +++ b/apps/studio/components/interfaces/Auth/AuthProvidersForm/ProviderForm.tsx @@ -1,6 +1,6 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { Check, ChevronUp } from 'lucide-react' +import { Check, ChevronUp, ExternalLink } from 'lucide-react' import { useState } from 'react' import toast from 'react-hot-toast' import ReactMarkdown from 'react-markdown' @@ -26,6 +26,7 @@ import { import { ProviderCollapsibleClasses } from './AuthProvidersForm.constants' import type { Provider } from './AuthProvidersForm.types' import FormField from './FormField' +import Link from 'next/link' export interface ProviderFormProps { config: components['schemas']['GoTrueConfigResponse'] @@ -38,7 +39,74 @@ const ProviderForm = ({ config, provider }: ProviderFormProps) => { const { mutate: updateAuthConfig, isLoading: isUpdatingConfig } = useAuthConfigUpdateMutation() const doubleNegativeKeys = ['MAILER_AUTOCONFIRM', 'SMS_AUTOCONFIRM'] - const canUpdateConfig = useCheckPermissions(PermissionAction.UPDATE, 'custom_config_gotrue') + const canUpdateConfig: boolean = useCheckPermissions( + PermissionAction.UPDATE, + 'custom_config_gotrue' + ) + + const shouldDisableField = (field: string): boolean => { + const shouldDisableSmsFields = + config.HOOK_SEND_SMS_ENABLED && + field.startsWith('SMS_') && + ![ + 'SMS_AUTOCONFIRM', + 'SMS_OTP_EXP', + 'SMS_OTP_LENGTH', + 'SMS_OTP_LENGTH', + 'SMS_TEMPLATE', + 'SMS_TEST_OTP', + 'SMS_TEST_OTP_VALID_UNTIL', + ].includes(field) + return ( + ['EXTERNAL_SLACK_CLIENT_ID', 'EXTERNAL_SLACK_SECRET'].includes(field) || + shouldDisableSmsFields + ) + } + + const showAlert = (title: string) => { + switch (title) { + // TODO (KM): Remove after 10th October 2024 when we disable the provider + case 'Slack (Deprecated)': + return ( + + + Slack (Deprecated) Provider + + Recently, Slack has updated their OAuth API. Please use the new Slack (OIDC) provider + below. Developers using this provider should move over to the new provider. Please + refer to our{' '} + + documentation + {' '} + for more details. + + + ) + case 'Phone': + return ( + config.HOOK_SEND_SMS_ENABLED && ( + + + + SMS provider settings are disabled while the SMS hook is enabled. + + +

The SMS hook will be used in place of the SMS provider configured

+ +
+
+ ) + ) + default: + return null + } + } const { data: settings } = useProjectApiQuery({ projectRef }) const apiUrl = `${settings?.autoApiService.protocol}://${settings?.autoApiService.endpoint}` @@ -165,26 +233,8 @@ const ProviderForm = ({ config, provider }: ProviderFormProps) => { return (
- {provider.title === 'Slack (Deprecated)' && ( - - - Slack (Deprecated) Provider - - Recently, Slack has updated their OAuth API. Please use the new Slack (OIDC) - provider below. Developers using this provider should move over to the new - provider. Please refer to our{' '} - - documentation - {' '} - for more details. - - - )}
+ {showAlert(provider.title)} {Object.keys(provider.properties).map((x: string) => ( { formValues={values} disabled={ // TODO (KM): Remove after 10th October 2024 when we disable the provider - ['EXTERNAL_SLACK_CLIENT_ID', 'EXTERNAL_SLACK_SECRET'].includes(x) || - !canUpdateConfig + shouldDisableField(x) || !canUpdateConfig } /> ))} diff --git a/apps/studio/components/interfaces/Auth/AuthProvidersFormValidation.tsx b/apps/studio/components/interfaces/Auth/AuthProvidersFormValidation.tsx index 4bbf675174e..bdf6a5598ac 100644 --- a/apps/studio/components/interfaces/Auth/AuthProvidersFormValidation.tsx +++ b/apps/studio/components/interfaces/Auth/AuthProvidersFormValidation.tsx @@ -1,5 +1,6 @@ import { boolean, number, object, string } from 'yup' import { urlRegex } from 'components/interfaces/Auth/Auth.constants' +import { ProjectAuthConfigData } from 'data/auth/auth-config-query' const parseBase64URL = (b64url: string) => { return atob(b64url.replace(/[-]/g, '+').replace(/[_]/g, '/')) @@ -61,6 +62,120 @@ const PROVIDER_EMAIL = { }, } +const smsProviderValidation = (config: ProjectAuthConfigData, provider: string) => { + return { + is: (EXTERNAL_PHONE_ENABLED: boolean, SMS_PROVIDER: string) => { + return EXTERNAL_PHONE_ENABLED && SMS_PROVIDER === provider && !config.HOOK_SEND_SMS_ENABLED + }, + } +} + +// getPhoneProviderValidationSchema generate the validation schema for the SMS providers +// based on whether the SMS hook is enabled +export const getPhoneProviderValidationSchema = (config: ProjectAuthConfigData) => { + return object().shape({ + EXTERNAL_PHONE_ENABLED: boolean().required(), + SMS_PROVIDER: string(), + + // Twilio + SMS_TWILIO_ACCOUNT_SID: string().when(['EXTERNAL_PHONE_ENABLED', 'SMS_PROVIDER'], { + ...smsProviderValidation(config, 'twilio'), + then: (schema) => schema.required('Twilio Account SID is required'), + otherwise: (schema) => schema, + }), + SMS_TWILIO_AUTH_TOKEN: string().when(['EXTERNAL_PHONE_ENABLED', 'SMS_PROVIDER'], { + ...smsProviderValidation(config, 'twilio'), + then: (schema) => schema.required('Twilio Auth Token is required'), + otherwise: (schema) => schema, + }), + SMS_TWILIO_MESSAGE_SERVICE_SID: string().when(['EXTERNAL_PHONE_ENABLED', 'SMS_PROVIDER'], { + ...smsProviderValidation(config, 'twilio'), + then: (schema) => schema.required('Twilio Message Service SID is required'), + otherwise: (schema) => schema, + }), + + // Twilio Verify + SMS_TWILIO_VERIFY_ACCOUNT_SID: string().when(['EXTERNAL_PHONE_ENABLED', 'SMS_PROVIDER'], { + ...smsProviderValidation(config, 'twilio_verify'), + then: (schema) => schema.required('Twilio Verify Account SID is required'), + otherwise: (schema) => schema, + }), + SMS_TWILIO_VERIFY_AUTH_TOKEN: string().when(['EXTERNAL_PHONE_ENABLED', 'SMS_PROVIDER'], { + ...smsProviderValidation(config, 'twilio_verify'), + then: (schema) => schema.required('Twilio Verify Auth Token is required'), + otherwise: (schema) => schema, + }), + SMS_TWILIO_VERIFY_MESSAGE_SERVICE_SID: string().when( + ['EXTERNAL_PHONE_ENABLED', 'SMS_PROVIDER'], + { + ...smsProviderValidation(config, 'twilio_verify'), + then: (schema) => schema.required('Twilio Verify Service SID is required'), + otherwise: (schema) => schema, + } + ), + + // Messagebird + SMS_MESSAGEBIRD_ACCESS_KEY: string().when(['EXTERNAL_PHONE_ENABLED', 'SMS_PROVIDER'], { + ...smsProviderValidation(config, 'messagebird'), + then: (schema) => schema.required('Messagebird Access Key is required'), + otherwise: (schema) => schema, + }), + SMS_MESSAGEBIRD_ORIGINATOR: string().when(['EXTERNAL_PHONE_ENABLED', 'SMS_PROVIDER'], { + ...smsProviderValidation(config, 'messagebird'), + then: (schema) => schema.required('Messagebird Originator is required'), + otherwise: (schema) => schema, + }), + + // Textlocal + SMS_TEXTLOCAL_API_KEY: string().when(['EXTERNAL_PHONE_ENABLED', 'SMS_PROVIDER'], { + ...smsProviderValidation(config, 'textlocal'), + then: (schema) => schema.required('Textlocal API Key is required'), + otherwise: (schema) => schema, + }), + SMS_TEXTLOCAL_SENDER: string().when(['EXTERNAL_PHONE_ENABLED', 'SMS_PROVIDER'], { + ...smsProviderValidation(config, 'textlocal'), + then: (schema) => schema.required('Textlocal Sender is required'), + otherwise: (schema) => schema, + }), + + // Vonage + SMS_VONAGE_API_KEY: string().when(['EXTERNAL_PHONE_ENABLED', 'SMS_PROVIDER'], { + ...smsProviderValidation(config, 'vonage'), + then: (schema) => schema.required('Vonage API is required'), + otherwise: (schema) => schema, + }), + SMS_VONAGE_API_SECRET: string().when(['EXTERNAL_PHONE_ENABLED', 'SMS_PROVIDER'], { + ...smsProviderValidation(config, 'vonage'), + then: (schema) => schema.required('Vonage API Secret is required'), + otherwise: (schema) => schema, + }), + SMS_VONAGE_FROM: string().when(['EXTERNAL_PHONE_ENABLED', 'SMS_PROVIDER'], { + ...smsProviderValidation(config, 'vonage'), + then: (schema) => schema.required('Vonage From is required'), + otherwise: (schema) => schema, + }), + + // Phone SMS + SMS_OTP_EXP: number().min(0, 'Must be more than 0').required('This is required'), + SMS_OTP_LENGTH: number().min(6, 'Must be 6 or more in length').required('This is required'), + SMS_TEMPLATE: string().required('SMS template is required.'), + SMS_TEST_OTP: string() + .matches( + /^\s*([0-9]{1,15}=[0-9]+)(\s*,\s*[0-9]{1,15}=[0-9]+)*\s*$/g, + 'Must be a comma-separated list of = pairs. Phone numbers should be in international format, without spaces, dashes or the + prefix. Example: 123456789=987654' + ) + .trim() + .transform((value: string) => value.replace(/\s+/g, '')), + SMS_TEST_OTP_VALID_UNTIL: string().when(['SMS_TEST_OTP'], { + is: (SMS_TEST_OTP: string | null) => { + return !!SMS_TEST_OTP + }, + then: (schema) => schema.required('You must provide a valid until date.'), + otherwise: (schema) => schema.transform((value: string) => ''), + }), + }) +} + const PROVIDER_PHONE = { $schema: JSON_SCHEMA_VERSION, type: 'object', @@ -261,133 +376,7 @@ const PROVIDER_PHONE = { }, }, }, - validationSchema: object().shape({ - EXTERNAL_PHONE_ENABLED: boolean().required(), - SMS_PROVIDER: string().required(), - - // Twilio - SMS_TWILIO_ACCOUNT_SID: string().when(['EXTERNAL_PHONE_ENABLED', 'SMS_PROVIDER'], { - is: (EXTERNAL_PHONE_ENABLED: boolean, SMS_PROVIDER: string) => { - return EXTERNAL_PHONE_ENABLED && SMS_PROVIDER === 'twilio' - }, - then: (schema) => schema.required('Twilio Account SID is required'), - otherwise: (schema) => schema, - }), - SMS_TWILIO_AUTH_TOKEN: string().when(['EXTERNAL_PHONE_ENABLED', 'SMS_PROVIDER'], { - is: (EXTERNAL_PHONE_ENABLED: boolean, SMS_PROVIDER: string) => { - return EXTERNAL_PHONE_ENABLED && SMS_PROVIDER === 'twilio' - }, - then: (schema) => schema.required('Twilio Auth Token is required'), - otherwise: (schema) => schema, - }), - SMS_TWILIO_MESSAGE_SERVICE_SID: string().when(['EXTERNAL_PHONE_ENABLED', 'SMS_PROVIDER'], { - is: (EXTERNAL_PHONE_ENABLED: boolean, SMS_PROVIDER: string) => { - return EXTERNAL_PHONE_ENABLED && SMS_PROVIDER === 'twilio' - }, - then: (schema) => schema.required('Twilio Message Service SID is required'), - otherwise: (schema) => schema, - }), - - // Twilio Verify - SMS_TWILIO_VERIFY_ACCOUNT_SID: string().when(['EXTERNAL_PHONE_ENABLED', 'SMS_PROVIDER'], { - is: (EXTERNAL_PHONE_ENABLED: boolean, SMS_PROVIDER: string) => { - return EXTERNAL_PHONE_ENABLED && SMS_PROVIDER === 'twilio-verify' - }, - then: (schema) => schema.required('Twilio Verify Account SID is required'), - otherwise: (schema) => schema, - }), - SMS_TWILIO_VERIFY_AUTH_TOKEN: string().when(['EXTERNAL_PHONE_ENABLED', 'SMS_PROVIDER'], { - is: (EXTERNAL_PHONE_ENABLED: boolean, SMS_PROVIDER: string) => { - return EXTERNAL_PHONE_ENABLED && SMS_PROVIDER === 'twilio-verify' - }, - then: (schema) => schema.required('Twilio Verify Auth Token is required'), - otherwise: (schema) => schema, - }), - SMS_TWILIO_VERIFY_MESSAGE_SERVICE_SID: string().when( - ['EXTERNAL_PHONE_ENABLED', 'SMS_PROVIDER'], - { - is: (EXTERNAL_PHONE_ENABLED: boolean, SMS_PROVIDER: string) => { - return EXTERNAL_PHONE_ENABLED && SMS_PROVIDER === 'twilio-verify' - }, - then: (schema) => schema.required('Twilio Verify Service SID is required'), - otherwise: (schema) => schema, - } - ), - - // Messagebird - SMS_MESSAGEBIRD_ACCESS_KEY: string().when(['EXTERNAL_PHONE_ENABLED', 'SMS_PROVIDER'], { - is: (EXTERNAL_PHONE_ENABLED: boolean, SMS_PROVIDER: string) => { - return EXTERNAL_PHONE_ENABLED && SMS_PROVIDER === 'messagebird' - }, - then: (schema) => schema.required('Messagebird Access Key is required'), - otherwise: (schema) => schema, - }), - SMS_MESSAGEBIRD_ORIGINATOR: string().when(['EXTERNAL_PHONE_ENABLED', 'SMS_PROVIDER'], { - is: (EXTERNAL_PHONE_ENABLED: boolean, SMS_PROVIDER: string) => { - return EXTERNAL_PHONE_ENABLED && SMS_PROVIDER === 'messagebird' - }, - then: (schema) => schema.required('Messagebird Originator is required'), - otherwise: (schema) => schema, - }), - - // Textlocal - SMS_TEXTLOCAL_API_KEY: string().when(['EXTERNAL_PHONE_ENABLED', 'SMS_PROVIDER'], { - is: (EXTERNAL_PHONE_ENABLED: boolean, SMS_PROVIDER: string) => { - return EXTERNAL_PHONE_ENABLED && SMS_PROVIDER === 'textlocal' - }, - then: (schema) => schema.required('Textlocal API Key is required'), - otherwise: (schema) => schema, - }), - SMS_TEXTLOCAL_SENDER: string().when(['EXTERNAL_PHONE_ENABLED', 'SMS_PROVIDER'], { - is: (EXTERNAL_PHONE_ENABLED: boolean, SMS_PROVIDER: string) => { - return EXTERNAL_PHONE_ENABLED && SMS_PROVIDER === 'textlocal' - }, - then: (schema) => schema.required('Textlocal Sender is required'), - otherwise: (schema) => schema, - }), - - // Vonage - SMS_VONAGE_API_KEY: string().when(['EXTERNAL_PHONE_ENABLED', 'SMS_PROVIDER'], { - is: (EXTERNAL_PHONE_ENABLED: boolean, SMS_PROVIDER: string) => { - return EXTERNAL_PHONE_ENABLED && SMS_PROVIDER === 'vonage' - }, - then: (schema) => schema.required('Vonage API is required'), - otherwise: (schema) => schema, - }), - SMS_VONAGE_API_SECRET: string().when(['EXTERNAL_PHONE_ENABLED', 'SMS_PROVIDER'], { - is: (EXTERNAL_PHONE_ENABLED: boolean, SMS_PROVIDER: string) => { - return EXTERNAL_PHONE_ENABLED && SMS_PROVIDER === 'vonage' - }, - then: (schema) => schema.required('Vonage API Secret is required'), - otherwise: (schema) => schema, - }), - SMS_VONAGE_FROM: string().when(['EXTERNAL_PHONE_ENABLED', 'SMS_PROVIDER'], { - is: (EXTERNAL_PHONE_ENABLED: boolean, SMS_PROVIDER: string) => { - return EXTERNAL_PHONE_ENABLED && SMS_PROVIDER === 'vonage' - }, - then: (schema) => schema.required('Vonage From is required'), - otherwise: (schema) => schema, - }), - - // Phone SMS - SMS_OTP_EXP: number().min(0, 'Must be more than 0').required('This is required'), - SMS_OTP_LENGTH: number().min(6, 'Must be 6 or more in length').required('This is required'), - SMS_TEMPLATE: string().required('SMS template is required.'), - SMS_TEST_OTP: string() - .matches( - /^\s*([0-9]{1,15}=[0-9]+)(\s*,\s*[0-9]{1,15}=[0-9]+)*\s*$/g, - 'Must be a comma-separated list of = pairs. Phone numbers should be in international format, without spaces, dashes or the + prefix. Example: 123456789=987654' - ) - .trim() - .transform((value: string) => value.replace(/\s+/g, '')), - SMS_TEST_OTP_VALID_UNTIL: string().when(['SMS_TEST_OTP'], { - is: (SMS_TEST_OTP: string | null) => { - return !!SMS_TEST_OTP - }, - then: (schema) => schema.required('You must provide a valid until date.'), - otherwise: (schema) => schema.transform((value: string) => ''), - }), - }), + validationSchema: null, misc: { iconKey: 'phone-icon4', helper: `To complete setup, add this authorisation callback URL to your app's configuration in the Apple Developer Console. diff --git a/apps/studio/components/interfaces/Auth/Hooks/CreateHookSheet.tsx b/apps/studio/components/interfaces/Auth/Hooks/CreateHookSheet.tsx index 6a1f575a630..4b2502f7935 100644 --- a/apps/studio/components/interfaces/Auth/Hooks/CreateHookSheet.tsx +++ b/apps/studio/components/interfaces/Auth/Hooks/CreateHookSheet.tsx @@ -300,7 +300,16 @@ export const CreateHookSheet = ({ control={form.control} name="enabled" render={({ field }) => ( - + Date: Tue, 20 Aug 2024 01:04:54 +0800 Subject: [PATCH 002/217] chore: add bootstrap command to docs page (#28747) * chore: add bootstrap command to docs page * Update common-cli-sections.json --- apps/docs/spec/common-cli-sections.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/docs/spec/common-cli-sections.json b/apps/docs/spec/common-cli-sections.json index c11bd06c9cb..896ed5d6f65 100644 --- a/apps/docs/spec/common-cli-sections.json +++ b/apps/docs/spec/common-cli-sections.json @@ -17,6 +17,12 @@ "type": "category", "title": "General", "items": [ + { + "id": "supabase-bootstrap", + "title": "Launch a quick start template", + "slug": "supabase-bootstrap", + "type": "cli-command" + }, { "id": "supabase-init", "title": "Initialize a local project", From 8038649703b15231a0ba34dc13f08b8479cf840f Mon Sep 17 00:00:00 2001 From: Craig Cannon Date: Mon, 19 Aug 2024 13:49:45 -0700 Subject: [PATCH 003/217] Update redirects.js to include redirect for changelog podcast sponsorship (#28751) Update redirects.js adding changelog podcast referral link + redirect --- apps/www/lib/redirects.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/apps/www/lib/redirects.js b/apps/www/lib/redirects.js index 7b762821596..c47076d8624 100644 --- a/apps/www/lib/redirects.js +++ b/apps/www/lib/redirects.js @@ -2579,4 +2579,12 @@ module.exports = [ source: '/launchweek', destination: '/launch-week', }, + + // marketing + + { + permanent: true, + source: '/changelogpod', + destination: 'https://forms.supabase.com/changelog-podcast-sponsorship', + }, ] From ea5e4995941ff36b5749bfcde0dfb249f05e0f55 Mon Sep 17 00:00:00 2001 From: Francesco Sansalvadore Date: Tue, 20 Aug 2024 11:34:14 +0200 Subject: [PATCH 004/217] promote webinar (#28740) * promote webinar * refactor --- .../Announcement/WebinarAnnouncement.tsx | 25 +++++++++++++ apps/www/components/Hero/Hero.tsx | 15 ++------ apps/www/pages/customers/index.tsx | 2 ++ apps/www/public/customers-rss.xml | 36 +++++++++---------- 4 files changed, 47 insertions(+), 31 deletions(-) create mode 100644 apps/www/components/Announcement/WebinarAnnouncement.tsx diff --git a/apps/www/components/Announcement/WebinarAnnouncement.tsx b/apps/www/components/Announcement/WebinarAnnouncement.tsx new file mode 100644 index 00000000000..057c7f1e8f3 --- /dev/null +++ b/apps/www/components/Announcement/WebinarAnnouncement.tsx @@ -0,0 +1,25 @@ +import React from 'react' +import AnnouncementBadge from './Badge' + +const WebinarAnnouncement = () => { + return ( +
+ + Webinar / Aug 21 + + } + announcement={ + <> + Scale to Billions: Generative AI + /Humata + + } + /> +
+ ) +} + +export default WebinarAnnouncement diff --git a/apps/www/components/Hero/Hero.tsx b/apps/www/components/Hero/Hero.tsx index 28a500ca8d1..7d29a771179 100644 --- a/apps/www/components/Hero/Hero.tsx +++ b/apps/www/components/Hero/Hero.tsx @@ -5,8 +5,7 @@ import { useTelemetryProps } from 'common/hooks/useTelemetryProps' import gaEvents from '~/lib/gaEvents' import { Button, IconBookOpen } from 'ui' import SectionContainer from '~/components/Layouts/SectionContainer' -import AnnouncementBadge from '~/components/Announcement/Badge' -import announcement from 'ui/src/layout/banners/data/Announcement.json' +import WebinarAnnouncement from '../Announcement/WebinarAnnouncement' const Hero = () => { const router = useRouter() @@ -23,17 +22,7 @@ const Hero = () => {
-
- - Launch Week 12 - - } - announcement="Explore what we shipped" - /> -
+

Build in a weekend diff --git a/apps/www/pages/customers/index.tsx b/apps/www/pages/customers/index.tsx index 03a429636f8..ccec8832659 100644 --- a/apps/www/pages/customers/index.tsx +++ b/apps/www/pages/customers/index.tsx @@ -13,6 +13,7 @@ import { motion } from 'framer-motion' import styles from './customers.module.css' import Link from 'next/link' import { GlassPanel } from 'ui-patterns/GlassPanel' +import WebinarAnnouncement from '~/components/Announcement/WebinarAnnouncement' export async function getStaticProps() { const allPostsData = getSortedPosts({ directory: '_customers' }) @@ -85,6 +86,7 @@ function CustomerStoriesPage(props: any) { initial={{ opacity: 0, y: 10 }} animate={{ opacity: 1, y: 0, transition: { duration: 0.5, easing: 'easeOut' } }} > +

Customer stories

Discover case studies on how Supabase is being used around the world to quickly diff --git a/apps/www/public/customers-rss.xml b/apps/www/public/customers-rss.xml index 93720b223dd..7b11326b55d 100644 --- a/apps/www/public/customers-rss.xml +++ b/apps/www/public/customers-rss.xml @@ -5,126 +5,126 @@ https://supabase.com Latest news from Supabase en - Tue, 11 Jun 2024 04:00:00 GMT + Tue, 11 Jun 2024 22:00:00 GMT https://supabase.com/customers/maergo Maergo's Express Delivery: How Supabase Helped Achieve Scalability, Speed, and Cost Saving https://supabase.com/customers/maergo Discover how Maergo, a nationwide expedited parcel delivery service, reduced its codebase by 90%, decreased deployment times to just seconds, and achieved unprecedented scalability with Supabase. - Tue, 11 Jun 2024 04:00:00 GMT + Tue, 11 Jun 2024 22:00:00 GMT https://supabase.com/customers/voypost Voypost uses Supabase’s strong relational model to overcome NoSQL challenges https://supabase.com/customers/voypost Learn how Voypost leveraged Supabase to avoid NoSQL workarounds, enhance scalability, and deliver a superior user experience for Inkly, an intelligent contract negotiation platform. - Mon, 03 Jun 2024 04:00:00 GMT + Mon, 03 Jun 2024 22:00:00 GMT https://supabase.com/customers/tinloof Streamlining Success: How Tinloof Scaled Seamlessly with Supabase https://supabase.com/customers/tinloof Discover Tinloof, how a full-stack development agency, managed and scaled backend services using Supabase, without having to dedicate resources to infrastructure management. - Mon, 03 Jun 2024 04:00:00 GMT + Mon, 03 Jun 2024 22:00:00 GMT https://supabase.com/customers/shotgun Supabase migration delivers an 83% reduction in data infrastructure costs for Shotgun https://supabase.com/customers/shotgun Discover how Shotgun, an event ticketing platform with over 3 million users, reduced costs and consolidated systems through migration to Supabase. - Wed, 29 Nov 2023 05:00:00 GMT + Wed, 29 Nov 2023 23:00:00 GMT https://supabase.com/customers/next-door-lending How Next Door Lending leveraged Supabase to become a top 10 mortgage broker https://supabase.com/customers/next-door-lending Discover how Supabase empowered NextDoorLending to move quickly and scale as required, leading to their surpassing other mortgage brokers and expanding their business. - Tue, 07 Nov 2023 05:00:00 GMT + Tue, 07 Nov 2023 23:00:00 GMT https://supabase.com/customers/good-tape Good Tape migrates to Supabase managed Postgres and Authentication and achieves database efficiency and a 60% cost reduction. https://supabase.com/customers/good-tape Explore how Good Tape achieved remarkable database efficiency and reduced costs by 60% through their successful migration to Supabase's managed services. - Mon, 30 Oct 2023 04:00:00 GMT + Mon, 30 Oct 2023 23:00:00 GMT https://supabase.com/customers/pebblely Scaling securely: one million users in 7 months with Supabase Auth https://supabase.com/customers/pebblely Learn how Pebblely, an AI image generation company, used Supabase Auth to handle Single Sign On for their rapidly growing user base. - Thu, 28 Sep 2023 04:00:00 GMT + Thu, 28 Sep 2023 22:00:00 GMT https://supabase.com/customers/chatbase Bootstrapped founder builds an AI app with Supabase and scales to $1M in 5 months https://supabase.com/customers/chatbase How Yasser leveraged Supabase to build Chatbase and became one of the most successful single-founder AI products. - Tue, 05 Sep 2023 04:00:00 GMT + Tue, 05 Sep 2023 22:00:00 GMT https://supabase.com/customers/quivr Quivr launch 5,000 Vector databases on Supabase. https://supabase.com/customers/quivr Learn how one of the most popular Generative AI projects uses Supabase as their Vector Store. - Mon, 04 Sep 2023 04:00:00 GMT + Mon, 04 Sep 2023 22:00:00 GMT https://supabase.com/customers/berriai Berri AI boosts productivity by migrating from AWS RDS to Supabase Vector https://supabase.com/customers/berriai Learn how Berri AI overcame challenges with self-hosting their vector database on AWS RDS and successfully migrated to Supabase. - Mon, 05 Jun 2023 04:00:00 GMT + Mon, 05 Jun 2023 22:00:00 GMT https://supabase.com/customers/markprompt Markprompt and Supabase - GDPR-compliant AI chatbots for docs and websites. https://supabase.com/customers/markprompt AI-powered chatbot platform, Markprompt, empowers developers to deliver efficient and GDPR-compliant prompt experiences on top of their content, by leveraging Supabase's secure and privacy-focused vector database and authentication solutions. - Tue, 16 May 2023 04:00:00 GMT + Tue, 16 May 2023 22:00:00 GMT https://supabase.com/customers/mendableai Mendable switches from Pinecone to Supabase Vector for PostgreSQL vector embeddings. https://supabase.com/customers/mendableai How Mendable boosts efficiency and accuracy of chat powered search for documentation using Supabase Vector. - Thu, 04 May 2023 04:00:00 GMT + Thu, 04 May 2023 22:00:00 GMT https://supabase.com/customers/happyteams HappyTeams unlocks better performance and reduces cost with Supabase. https://supabase.com/customers/happyteams How a bootstrapped startup migrated from Heroku to Supabase in 30 minutes and never looked back. - Wed, 15 Feb 2023 05:00:00 GMT + Wed, 15 Feb 2023 23:00:00 GMT https://supabase.com/customers/xendit Xendit use Supabase and create a full solution shipped to production in less than one week. https://supabase.com/customers/xendit As a payment processor, Xendit are responsible for verifying that all transactions are legal. - Mon, 13 Feb 2023 05:00:00 GMT + Mon, 13 Feb 2023 23:00:00 GMT https://supabase.com/customers/replenysh Replenysh uses Supabase to implement OTP in less than 24 hours. https://supabase.com/customers/replenysh With Supabase, Replenysh gets a slick auth experience, reduces DevOps overhead, and continues to scale with Postgres. - Mon, 13 Feb 2023 05:00:00 GMT + Mon, 13 Feb 2023 23:00:00 GMT https://supabase.com/customers/mobbin How Mobbin migrated 200,000 users from Firebase for a better authentication experience. https://supabase.com/customers/mobbin Mobbin helps over 200,000 creators globally search and view the latest design patterns from well-known apps. - Mon, 13 Feb 2023 05:00:00 GMT + Mon, 13 Feb 2023 23:00:00 GMT https://supabase.com/customers/epsilon3 Epsilon3 digitize paper-based procedures in the space industry using telemetry data, simplifying testing and operations. https://supabase.com/customers/epsilon3 Epsilon3 uses Supabase to help teams execute secure and reliable operations in an industry where project spend runs into the billions. - Mon, 13 Feb 2023 05:00:00 GMT + Mon, 13 Feb 2023 23:00:00 GMT From 185590c1cd07026b1aec81e492de1eb099ef462e Mon Sep 17 00:00:00 2001 From: Stojan Dimitrovski Date: Tue, 20 Aug 2024 14:04:17 +0200 Subject: [PATCH 005/217] fix: rename AWS Cognito to Amazon Cognito (#28765) fix: rename AWS Cognito to Amazon Cognitog --- .../guides/auth/third-party/aws-cognito.mdx | 12 ++++++------ .../CreateAwsCognitoAuthDialog.tsx | 16 ++++++++-------- .../Auth/ThirdPartyAuthForm/IntegrationCard.tsx | 6 +++--- .../ThirdPartyAuthForm.utils.ts | 2 +- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/apps/docs/content/guides/auth/third-party/aws-cognito.mdx b/apps/docs/content/guides/auth/third-party/aws-cognito.mdx index 2c9b39ed7f8..1fe4f487771 100644 --- a/apps/docs/content/guides/auth/third-party/aws-cognito.mdx +++ b/apps/docs/content/guides/auth/third-party/aws-cognito.mdx @@ -1,14 +1,14 @@ --- id: 'auth-third-party-aws-cognito' -title: 'AWS Cognito (Amplify)' -subtitle: 'Use AWS Cognito via Amplify or standalone with your Supabase project' +title: 'Amazon Cognito (Amplify)' +subtitle: 'Use Amazon Cognito via Amplify or standalone with your Supabase project' --- -AWS Cognito User Pools (via AWS Amplify or on its own) can be used as a third-party authentication provider alongside Supabase Auth, or standalone, with your Supabase project. +Amazon Cognito User Pools (via AWS Amplify or on its own) can be used as a third-party authentication provider alongside Supabase Auth, or standalone, with your Supabase project. ## Getting started -1. First you need to add an integration to connect your Supabase project with your AWS Cognito User Pool. You will need the pool's ID and region. +1. First you need to add an integration to connect your Supabase project with your Amazon Cognito User Pool. You will need the pool's ID and region. 2. Add a new Third-party Auth integration in your project's [Authentication settings](/dashboard/project/_/settings/auth) or configure it in the CLI. 3. Assign the `role: 'authenticated'` custom claim to all JWTs by using a Pre-Token Generation Trigger. 4. Finally setup the Supabase client in your application. @@ -144,9 +144,9 @@ user_pool_region = "" Your Supabase project inspects the `role` claim present in all JWTs sent to it, to assign the correct Postgres role when using the Data API, Storage or Realtime authorization. -By default, AWS Cognito JWTs (both ID token and access tokens) do not contain a `role` claim in them. If you were to send such a JWT to your Supabase project, the `anon` role would be assigned when executing the Postgres query. Most of your app's logic will be accessible by the `authenticated` role. +By default, Amazon Cognito JWTs (both ID token and access tokens) do not contain a `role` claim in them. If you were to send such a JWT to your Supabase project, the `anon` role would be assigned when executing the Postgres query. Most of your app's logic will be accessible by the `authenticated` role. -A recommended approach to do this is to configure a [Pre-Token Generation Trigger](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-token-generation.html) either `V1_0` (ID token only) or `V2_0` (both access and ID token). To do this you will need to create a new Lambda function (in any language and runtime) and assign it to the [AWS Cognito User Pool's Lambda Triggers configuration](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html). For example, the Lambda function should look similar to this: +A recommended approach to do this is to configure a [Pre-Token Generation Trigger](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-token-generation.html) either `V1_0` (ID token only) or `V2_0` (both access and ID token). To do this you will need to create a new Lambda function (in any language and runtime) and assign it to the [Amazon Cognito User Pool's Lambda Triggers configuration](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html). For example, the Lambda function should look similar to this: diff --git a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateAwsCognitoAuthDialog.tsx b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateAwsCognitoAuthDialog.tsx index 7b05e96b58b..ee4ab111c2e 100644 --- a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateAwsCognitoAuthDialog.tsx +++ b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateAwsCognitoAuthDialog.tsx @@ -55,7 +55,7 @@ export const CreateAwsCognitoAuthIntegrationDialog = ({ const { ref: projectRef } = useParams() const { mutate: createAuthIntegration, isLoading } = useCreateThirdPartyAuthIntegrationMutation({ onSuccess: () => { - toast.success(`Successfully created a new AWS Cognito Auth integration.`) + toast.success(`Successfully created a new Amazon Cognito Auth integration.`) onClose() }, }) @@ -98,12 +98,12 @@ export const CreateAwsCognitoAuthIntegrationDialog = ({ {isCreating - ? `Add new AWS Cognito Auth connection` - : `Update existing AWS Cognito Auth connection`} + ? `Add new Amazon Cognito Auth connection` + : `Update existing Amazon Cognito Auth connection`} - By adding an AWS Cognito Auth connection, you can authenticate users using AWS Cognito - User Pools. + By adding an Amazon Cognito Auth connection, you can authenticate users using Amazon + Cognito User Pools. @@ -118,7 +118,7 @@ export const CreateAwsCognitoAuthIntegrationDialog = ({ render={({ field }) => ( @@ -133,7 +133,7 @@ export const CreateAwsCognitoAuthIntegrationDialog = ({ /> */}

- This will enable a JWT token from AWS Cognito project to access data from this + This will enable a JWT token from Amazon Cognito project to access data from this Supabase project.

( - +