From 43263af423f3db769119e1ab8d192d3ad53346c4 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 20 Apr 2023 18:44:29 -0500 Subject: [PATCH 001/694] blog post for PostgREST v11 --- apps/www/_blog/2023-04-20-postgrest-11.mdx | 223 +++++++++++++++++++++ 1 file changed, 223 insertions(+) create mode 100644 apps/www/_blog/2023-04-20-postgrest-11.mdx diff --git a/apps/www/_blog/2023-04-20-postgrest-11.mdx b/apps/www/_blog/2023-04-20-postgrest-11.mdx new file mode 100644 index 00000000000..27eb84930c7 --- /dev/null +++ b/apps/www/_blog/2023-04-20-postgrest-11.mdx @@ -0,0 +1,223 @@ +--- +title: 'PostgREST v11: configurable role settings, isolation level and more' +description: 'PostgREST v11 new features' +author: steve_chavez +image: lw6-community/postgrest.png +thumb: lw6-community/postgrest.png +tags: + - postgres + - rest + - isolation level + - transactions + - roles + - planetpg +date: '2023-04-20' +toc_depth: 3 +--- + +PostgREST 11 was just released. In addition to the [pre-release](https://supabase.com/blog/postgrest-11-prerelease) features, we’ve added security, configuration and querying improvements. + +## Configurable Role Settings + +Role settings are now applied on every request, you can set these with a regular `ALTER ROLE SET `. This is useful, for example, to prevent web users from running expensive queries. + +Let’s try it by setting a statement timeout and cost limit. + +### Statement timeout + +`statement_timeout` aborts any statement that takes more than the specified amount of time. Let’s set it for the usual `anon`, `authenticated` and `service_role` roles: + +```sql +-- anon users can only run queries that take 100 milliseconds max +alter role anon set statement_timeout = '100ms'; + +-- authenticated users can only run queries that take 5 seconds max +alter role authenticated set statement_timeout = '5s'; + +-- service_role users can only run queries that take 15 seconds max +alter role service_role set statement_timeout = '15s'; +``` + +You need to reload PostgREST config cache to apply these changes. + +```sql +NOTIFY pgrst, 'reload config'; +``` + +Now, suppose you have a big table and you apply a filter on an unindexed column: + +```jsx +const { data, error } = await supabase + .from('big_table') + .select() + .eq('unindexed_column', 'value') +``` + +Then, after 5 seconds, the request will be aborted and the response will be: + +```json +{ + "hint": null, + "details": null, + "code": "57014", + "message": "canceling statement due to statement timeout" +} +``` + +### Statement cost limit + +With `statement_timeout`, queries will still run for that length of time, consuming resources until they’re terminated. To prevent this, you can abort queries based on their plan cost — this is determined at the planning phase, before they get executed. + +```sql +-- anon users can only run cheap queries +ALTER USER anon SET plan_filter.statement_cost_limit = 10000; + +-- authenticated users can run more expensive queries +ALTER USER authenticated SET plan_filter.statement_cost_limit = 1e6; + +-- service_role can run any query +ALTER USER service_role SET plan_filter.statement_cost_limit = 0; + +NOTIFY pgrst, 'reload config'; -- reload postgREST config cache to apply changes +``` + +Let’s repeat the previous example. + +```jsx +const { data, error } = await supabase + .from('big_table') + .select() + .eq('unindexed_column', 'value') +``` + +Then, immediately, the request will be aborted and the response will be: + +```jsx +{ + "hint": null, + "details": null, + "code": "54001", + "message": "plan cost limit exceeded" +} +``` + +This uses the [pg_plan_filter](https://github.com/pgexperts/pg_plan_filter) extension(available on the Supabase platform) and requires tuning to get the cost limit right. You should use this with care as it can invalidate legitimate queries. + +## Configurable transaction isolation level + +By default, all queries in PostgREST run in a transaction with the default *Read Committed* isolation level. + +```sql +BEGIN ISOLATION LEVEL READ COMMITTED; +-- +COMMIT; +``` + +Now you can change this by settting `default_transaction_isolation`. + +You can do it per-function: + +```sql +create function hello() +returns text as $$ + select 'hello'; +$$ language sql +set default_transaction_isolation = 'repeatable read'; +``` + +Or per-role, which will affect all queries ran by that role: + +```sql +alter role service_role set default_transaction_isolation = 'serializable'; +NOTIFY pgrst, 'reload config'; -- reload postgREST config cache +``` + +Trying out the function above. + +```jsx +const { data, error } = await supabase + .rpc('hello') +``` + +Will result in PostgREST running the query with the *Repeatable Read* isolation level: + +```sql +BEGIN ISOLATION LEVEL REPEATABLE READ; +-- SELECT hello(); +COMMIT; +``` + +Note that the default *Read Committed* is good enough for almost all use cases. Using higher isolation levels will incur in overhead as they use more sophisticated locking. + +## Bulk insert JSON with default values + +A long wanted feature was bulk inserting JSON while considering columns' default values. + +Having the following sample table. + +```sql +create table foo +( id bigint generated by default as identity primary key +, bar text +, baz int default 100 +); +``` + +You can now do it like this: + +```jsx +const { error } = await supabase + .from('foo') + .insert([ + { "bar": "val1" + } + , { "bar": "val2" + , "baz": 15 + } + ], defaultToNull: false) + .select() +``` + +And the respone will be: + +```json +[ + { "id": 1 + , "bar": "val1" + , "baz": 100 + } +, { "id": 2 + , "bar": "val2" + , "baz": 15 + } +] +``` + +As you can see, `id` and `baz` took their default values. + +## ANY/ALL filter modifiers + +To avoid unwieldy `OR` filters, you can now use `any` modifiers on various filters. Take the `like` filter as an example: + +```jsx +const res = await postgrest + .from('users') + .select() + .likeAnyOf('username', ['%supa%', '%kiwi%']) +``` + +This is equivalent to the following in SQL. + +```sql +SELECT * FROM users WHERE username like any('{%supa%,%kiwi%}'); +``` + +`any` modifiers are available for the `eq,like,ilike,gt,gte,lt,lte,match,imatch` filters. + +For completeness, the `all` modifier is also added. + +## Closing up + +There you have it, now you can make your API more secure with role settings and use higher isolation levels without resorting to direct PostgreSQL connections. + +PostgREST v11 is being rolled on the Supabase platform, it will be available for new projects on the coming week. From 9488391a318dfb724ea6b5aba4a78ee050c919ab Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 21 Apr 2023 11:55:36 -0500 Subject: [PATCH 002/694] improve wording for OR queries --- apps/www/_blog/2023-04-20-postgrest-11.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/www/_blog/2023-04-20-postgrest-11.mdx b/apps/www/_blog/2023-04-20-postgrest-11.mdx index 27eb84930c7..7b42dee7de2 100644 --- a/apps/www/_blog/2023-04-20-postgrest-11.mdx +++ b/apps/www/_blog/2023-04-20-postgrest-11.mdx @@ -197,7 +197,7 @@ As you can see, `id` and `baz` took their default values. ## ANY/ALL filter modifiers -To avoid unwieldy `OR` filters, you can now use `any` modifiers on various filters. Take the `like` filter as an example: +As a shortcut to `OR` filters, you can now use `any` modifiers on various filters. Take the `like` filter as an example: ```jsx const res = await postgrest @@ -209,7 +209,7 @@ const res = await postgrest This is equivalent to the following in SQL. ```sql -SELECT * FROM users WHERE username like any('{%supa%,%kiwi%}'); +SELECT * FROM users WHERE username LIKE ANY('{%supa%,%kiwi%}'); ``` `any` modifiers are available for the `eq,like,ilike,gt,gte,lt,lte,match,imatch` filters. From d90cc4f4c7a19aab3d9fbfc0ee277d6e17a08345 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 21 Apr 2023 14:22:16 -0500 Subject: [PATCH 003/694] improve wording --- apps/www/_blog/2023-04-20-postgrest-11.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/www/_blog/2023-04-20-postgrest-11.mdx b/apps/www/_blog/2023-04-20-postgrest-11.mdx index 7b42dee7de2..6ffe0944a01 100644 --- a/apps/www/_blog/2023-04-20-postgrest-11.mdx +++ b/apps/www/_blog/2023-04-20-postgrest-11.mdx @@ -44,7 +44,7 @@ You need to reload PostgREST config cache to apply these changes. NOTIFY pgrst, 'reload config'; ``` -Now, suppose you have a big table and you apply a filter on an unindexed column: +Now, suppose you do an expensive query, by having a big table and a filter on an unindexed column(this will cause a full table scan): ```jsx const { data, error } = await supabase @@ -81,7 +81,7 @@ ALTER USER service_role SET plan_filter.statement_cost_limit = 0; NOTIFY pgrst, 'reload config'; -- reload postgREST config cache to apply changes ``` -Let’s repeat the previous example. +Let’s repeat the previous expensive query. ```jsx const { data, error } = await supabase @@ -178,7 +178,7 @@ const { error } = await supabase .select() ``` -And the respone will be: +And the response will be: ```json [ @@ -214,7 +214,7 @@ SELECT * FROM users WHERE username LIKE ANY('{%supa%,%kiwi%}'); `any` modifiers are available for the `eq,like,ilike,gt,gte,lt,lte,match,imatch` filters. -For completeness, the `all` modifier is also added. +For completeness, the `all` modifier is also included. ## Closing up From 5027727232adeacc98b8aa7b71c42360b354aadc Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 24 Apr 2023 12:33:21 -0500 Subject: [PATCH 004/694] clarify --- apps/www/_blog/2023-04-20-postgrest-11.mdx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/www/_blog/2023-04-20-postgrest-11.mdx b/apps/www/_blog/2023-04-20-postgrest-11.mdx index 6ffe0944a01..50bebccfa02 100644 --- a/apps/www/_blog/2023-04-20-postgrest-11.mdx +++ b/apps/www/_blog/2023-04-20-postgrest-11.mdx @@ -28,13 +28,13 @@ Let’s try it by setting a statement timeout and cost limit. `statement_timeout` aborts any statement that takes more than the specified amount of time. Let’s set it for the usual `anon`, `authenticated` and `service_role` roles: ```sql --- anon users can only run queries that take 100 milliseconds max +-- anonymous users can only run queries that take 100 milliseconds max alter role anon set statement_timeout = '100ms'; -- authenticated users can only run queries that take 5 seconds max alter role authenticated set statement_timeout = '5s'; --- service_role users can only run queries that take 15 seconds max +-- backend-only users can only run queries that take 15 seconds max alter role service_role set statement_timeout = '15s'; ``` @@ -69,13 +69,13 @@ Then, after 5 seconds, the request will be aborted and the response will be: With `statement_timeout`, queries will still run for that length of time, consuming resources until they’re terminated. To prevent this, you can abort queries based on their plan cost — this is determined at the planning phase, before they get executed. ```sql --- anon users can only run cheap queries +-- anonymous users can only run cheap queries ALTER USER anon SET plan_filter.statement_cost_limit = 10000; -- authenticated users can run more expensive queries ALTER USER authenticated SET plan_filter.statement_cost_limit = 1e6; --- service_role can run any query +-- backend-only users can run any query ALTER USER service_role SET plan_filter.statement_cost_limit = 0; NOTIFY pgrst, 'reload config'; -- reload postgREST config cache to apply changes @@ -109,7 +109,7 @@ By default, all queries in PostgREST run in a transaction with the default *Read ```sql BEGIN ISOLATION LEVEL READ COMMITTED; --- +-- COMMIT; ``` From 27c8f9bfaee42b990e66d5de206f1bf90cc2beda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ramiro=20Nu=C3=B1ez=20Dosio?= Date: Wed, 3 May 2023 14:38:25 +0100 Subject: [PATCH 005/694] Update date. --- ...st-11.mdx => 2023-05-03-postgrest-11-release.mdx} | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) rename apps/www/_blog/{2023-04-20-postgrest-11.mdx => 2023-05-03-postgrest-11-release.mdx} (87%) diff --git a/apps/www/_blog/2023-04-20-postgrest-11.mdx b/apps/www/_blog/2023-05-03-postgrest-11-release.mdx similarity index 87% rename from apps/www/_blog/2023-04-20-postgrest-11.mdx rename to apps/www/_blog/2023-05-03-postgrest-11-release.mdx index 50bebccfa02..c09012c3cc9 100644 --- a/apps/www/_blog/2023-04-20-postgrest-11.mdx +++ b/apps/www/_blog/2023-05-03-postgrest-11-release.mdx @@ -11,11 +11,11 @@ tags: - transactions - roles - planetpg -date: '2023-04-20' +date: '2023-05-03' toc_depth: 3 --- -PostgREST 11 was just released. In addition to the [pre-release](https://supabase.com/blog/postgrest-11-prerelease) features, we’ve added security, configuration and querying improvements. +PostgREST 11 is now fully released! In addition to the [pre-release](https://supabase.com/blog/postgrest-11-prerelease) features, we’ve added security, configuration, and querying improvements. Here is what's new: ## Configurable Role Settings @@ -221,3 +221,11 @@ For completeness, the `all` modifier is also included. There you have it, now you can make your API more secure with role settings and use higher isolation levels without resorting to direct PostgreSQL connections. PostgREST v11 is being rolled on the Supabase platform, it will be available for new projects on the coming week. + +## More Postgres resources + +- [Storing OpenAI embeddings in Postgres with pgvector](https://supabase.com/blog/openai-embeddings-postgres-vector) +- [Choosing a Postgres Primary Key](https://supabase.com/blog/choosing-a-postgres-primary-key) +- [SQL or NoSQL? Why not use both (with PostgreSQL)?](https://supabase.com/blog/sql-or-nosql-both-with-postgresql) +- [pg_jsonschema: JSON Schema support for Postgres](https://supabase.com/blog/pg-jsonschema-a-postgres-extension-for-json-validation) +- [Implementing "seen by" functionality with Postgres](https://supabase.com/blog/seen-by-in-postgresql) From 0067e1ac3f991aa2f6e7d17ede876fee1fc6363b Mon Sep 17 00:00:00 2001 From: hwr12 Date: Thu, 11 May 2023 18:52:38 +0900 Subject: [PATCH 006/694] added Kakao Auth docs --- .../NavigationMenu.constants.ts | 5 + apps/docs/data/authProviders.ts | 10 ++ apps/docs/pages/guides/auth.mdx | 1 - .../guides/auth/social-login/auth-kakao.mdx | 88 ++++++++++++++++++ .../auth-kakao/kakao-developers-page.png | Bin 0 -> 469724 bytes apps/docs/public/img/icons/kakao-icon.svg | 1 + package-lock.json | 2 +- 7 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 apps/docs/pages/guides/auth/social-login/auth-kakao.mdx create mode 100644 apps/docs/public/img/guides/auth-kakao/kakao-developers-page.png create mode 100644 apps/docs/public/img/icons/kakao-icon.svg diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index 840c07ac2a0..45fc485898a 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -391,6 +391,11 @@ export const SocialLoginItems = [ icon: '/docs/img/icons/zoom-icon', url: '/guides/auth/social-login/auth-zoom', }, + { + name: 'Kakao', + icon: '/docs/img/icons/kakao-icon', + url: '/guides/auth/social-login/auth-kakao', + }, ] export const PhoneLoginsItems = [ diff --git a/apps/docs/data/authProviders.ts b/apps/docs/data/authProviders.ts index ea5855061bd..483bee4b837 100644 --- a/apps/docs/data/authProviders.ts +++ b/apps/docs/data/authProviders.ts @@ -79,6 +79,16 @@ const authProviders = [ selfHosted: true, authType: 'social', }, + { + name: 'Kakao', + logo: '/docs/img/icons/kakao-icon', + href: '/guides/auth/social-login/auth-kakao', + official: true, + supporter: 'Supabase', + platform: true, + selfHosted: true, + authType: 'social', + }, { name: 'Keycloak', logo: '/docs/img/icons/keycloak-icon', diff --git a/apps/docs/pages/guides/auth.mdx b/apps/docs/pages/guides/auth.mdx index 2e6760545b4..b379d55ba90 100644 --- a/apps/docs/pages/guides/auth.mdx +++ b/apps/docs/pages/guides/auth.mdx @@ -1,6 +1,5 @@ import Layout from '~/layouts/DefaultGuideLayout' -import { useRouter } from 'next/router' export const meta = { id: 'auth', diff --git a/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx b/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx new file mode 100644 index 00000000000..e7a8d14324f --- /dev/null +++ b/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx @@ -0,0 +1,88 @@ +import Layout from '~/layouts/DefaultGuideLayout' + +export const meta = { + id: 'auth-kakao', + title: 'Login with Kakao', + description: 'Add Kakao OAuth to your Supabase project', +} + +To enable Kakao Auth for your project, you need to set up an Kakao OAuth application and add the application credentials to your Supabase Dashboard. + +## Overview + +Kakao OAuth consists of six broad steps: + +- Create and configure your app in the [Kakao Developer Portal](https://developers.kakao.com). +- Obtaining a `REST API key` - this will serve as the `client_id`. +- Generating the `client_secret` using the `Client secret code`. +- Add your `client id` and `client secret` keys to your [Supabase Project](https://app.supabase.com). +- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js). + +## Access your Kakao Developer account + +- Go to [Kakao Developers Portal](https://developers.kakao.com). +- Click on `Login` at the top right to log in. + +![Kakao Developers Portal.](/docs/img/guides/auth-kakao/kakao-developers-page.png) + +## Create and configure your app + +- Go to `My Application`. +- Click on `Add an application` at the top. +- Fill out your app information: + - App icon. + - App name. + - Company name. + - Click `Save` at the bottom right. + +## Obtain a REST API key + +This will serve as the `client_id` when you make API calls to authenticate the user. + +- Go to `My Application`. +- Click on your app that you have just created. +- You will be redirected to `Summary` tab of your app. +- In the `App Keys` section you will see `REST API key` -- this ID will become your `client_id` later. + +## Find your callback URL + + + +## Generate and activate a `client_secret` + +- Go to `Product settings` > `Kakao Login` > `Security`. +- Click on the `Kakao Login` switch to enable Kakao Login. +- Click on `generate code` at the bottom to generate the `Client secret code` -- this will serve as a `client_secret` for your supabase project. +- Make sure you enabled `Client sercet code` by selecting `enable` from the `Activation state` section. + +## Add your OAuth credentials to Supabase + + + +## Add login code to your client app + +When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `kakao` as the `provider`: + +```js +async function signInWithApple() { + const { data, error } = await supabase.auth.signInWithOAuth({ + provider: 'kakao', + }) +} +``` + +When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: + +```js +async function signout() { + const { error } = await supabase.auth.signOut() +} +``` + +## Resources + +- [Kakao Developers Portal](https://developers.kakao.com). + +export const Page = ({ children }) => + +export default Page diff --git a/apps/docs/public/img/guides/auth-kakao/kakao-developers-page.png b/apps/docs/public/img/guides/auth-kakao/kakao-developers-page.png new file mode 100644 index 0000000000000000000000000000000000000000..81d30550eb6875073ab0c4fb2b3db82b5189205f GIT binary patch literal 469724 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

Ng;h(drSGZ@y)1Z8&IC%tBSk%A&ggyq; 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

!6lfI?sd9dps?W4PK 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� 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 \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index d3c3ed3179d..955ac2ff1d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -70213,4 +70213,4 @@ "integrity": "sha512-Bq0B+ixT/DMyG8kgX2xWcI5jUvCwqrMxSFam7m0lAf78nf04hv6lNCsyLYdyYTrCVMqNDY/206K7eExYCeSyUQ==" } } -} \ No newline at end of file +} From be76d34bfbc4baef7ab6b92d5f88ed632dd4edc1 Mon Sep 17 00:00:00 2001 From: hwr12 Date: Thu, 11 May 2023 18:54:39 +0900 Subject: [PATCH 007/694] undelete import statement --- apps/docs/pages/guides/auth.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/docs/pages/guides/auth.mdx b/apps/docs/pages/guides/auth.mdx index b379d55ba90..2e6760545b4 100644 --- a/apps/docs/pages/guides/auth.mdx +++ b/apps/docs/pages/guides/auth.mdx @@ -1,5 +1,6 @@ import Layout from '~/layouts/DefaultGuideLayout' +import { useRouter } from 'next/router' export const meta = { id: 'auth', From b93f6a76f8d8dd7505a324af0247ffca7283447f Mon Sep 17 00:00:00 2001 From: Hyeonwoo Rue <54504396+hwr12@users.noreply.github.com> Date: Fri, 12 May 2023 00:44:26 +0900 Subject: [PATCH 008/694] Update apps/docs/pages/guides/auth/social-login/auth-kakao.mdx Co-authored-by: Kang Ming --- apps/docs/pages/guides/auth/social-login/auth-kakao.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx b/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx index e7a8d14324f..e564d5642d0 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx @@ -33,7 +33,7 @@ Kakao OAuth consists of six broad steps: - App icon. - App name. - Company name. - - Click `Save` at the bottom right. +- Click `Save` at the bottom right. ## Obtain a REST API key From 1b6bae7458eefa6f44451921020065c4a2b0f96e Mon Sep 17 00:00:00 2001 From: Hyeonwoo Rue <54504396+hwr12@users.noreply.github.com> Date: Fri, 12 May 2023 00:48:19 +0900 Subject: [PATCH 009/694] Update apps/docs/pages/guides/auth/social-login/auth-kakao.mdx Co-authored-by: Kang Ming --- apps/docs/pages/guides/auth/social-login/auth-kakao.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx b/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx index e564d5642d0..6838f225da1 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx @@ -64,7 +64,7 @@ This will serve as the `client_id` when you make API calls to authenticate the u When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `kakao` as the `provider`: ```js -async function signInWithApple() { +async function signInWithKakao() { const { data, error } = await supabase.auth.signInWithOAuth({ provider: 'kakao', }) From 2b9d37485874bcc0071db39f8f52694870932f66 Mon Sep 17 00:00:00 2001 From: hwr12 Date: Fri, 12 May 2023 05:18:47 +0900 Subject: [PATCH 010/694] add additional configuration instruction and ensure the settings needed to be done --- .../guides/auth/social-login/auth-kakao.mdx | 7 +++++++ .../kakao-developers-consent-items-set.png | Bin 0 -> 319920 bytes 2 files changed, 7 insertions(+) create mode 100644 apps/docs/public/img/guides/auth-kakao/kakao-developers-consent-items-set.png diff --git a/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx b/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx index 6838f225da1..961edbd37d5 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx @@ -15,6 +15,7 @@ Kakao OAuth consists of six broad steps: - Create and configure your app in the [Kakao Developer Portal](https://developers.kakao.com). - Obtaining a `REST API key` - this will serve as the `client_id`. - Generating the `client_secret` using the `Client secret code`. +- Additional configurations on Kakao Developers Portal. - Add your `client id` and `client secret` keys to your [Supabase Project](https://app.supabase.com). - Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js). @@ -55,6 +56,12 @@ This will serve as the `client_id` when you make API calls to authenticate the u - Click on `generate code` at the bottom to generate the `Client secret code` -- this will serve as a `client_secret` for your supabase project. - Make sure you enabled `Client sercet code` by selecting `enable` from the `Activation state` section. +## Additional configurations on Kakao Developers Portal +- Make sure the Kakao Login is enabled in the `Kakao Login` tab. +- Set following scopes under the "Consent Items": account_email, profile_image, profile_nickname + +![Consent items needs to be set.](/docs/img/guides/auth-kakao/kakao-developers-consent-items-set.png) + ## Add your OAuth credentials to Supabase diff --git a/apps/docs/public/img/guides/auth-kakao/kakao-developers-consent-items-set.png b/apps/docs/public/img/guides/auth-kakao/kakao-developers-consent-items-set.png new file mode 100644 index 0000000000000000000000000000000000000000..b59c4616984345e7d1a681bb49a00127ac32ee4b GIT binary patch literal 319920 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 UTP43 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 z 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 literal 0 HcmV?d00001 From d0e5cb77f7defc5b900e8e799e3af63667dbf84a Mon Sep 17 00:00:00 2001 From: hwr12 Date: Fri, 12 May 2023 05:19:35 +0900 Subject: [PATCH 011/694] add callback URL instruction on Kakao developers portal --- apps/docs/pages/guides/auth/social-login/auth-kakao.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx b/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx index 961edbd37d5..c6c2bd81956 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx @@ -48,6 +48,7 @@ This will serve as the `client_id` when you make API calls to authenticate the u ## Find your callback URL +- To add callback URL on Kakao, go to `Product settings` > `Kakao Login` > `Redirect URI`. ## Generate and activate a `client_secret` From dd63b598efd49a46e119d3331b868d772c1553b3 Mon Sep 17 00:00:00 2001 From: hwr12 Date: Fri, 12 May 2023 05:19:58 +0900 Subject: [PATCH 012/694] doc update --- apps/docs/pages/guides/auth/social-login/auth-kakao.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx b/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx index c6c2bd81956..0e08c9f0eae 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx @@ -41,7 +41,7 @@ Kakao OAuth consists of six broad steps: This will serve as the `client_id` when you make API calls to authenticate the user. - Go to `My Application`. -- Click on your app that you have just created. +- Click on your app. - You will be redirected to `Summary` tab of your app. - In the `App Keys` section you will see `REST API key` -- this ID will become your `client_id` later. From 827d68bcdd7b7875b22a387b626b9153dae70304 Mon Sep 17 00:00:00 2001 From: hwr12 Date: Fri, 12 May 2023 13:28:28 +0900 Subject: [PATCH 013/694] reformat code with prettier --- apps/docs/pages/guides/auth/social-login/auth-kakao.mdx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx b/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx index 0e08c9f0eae..d1c6206d452 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx @@ -47,8 +47,8 @@ This will serve as the `client_id` when you make API calls to authenticate the u ## Find your callback URL - -- To add callback URL on Kakao, go to `Product settings` > `Kakao Login` > `Redirect URI`. +- To add callback URL on Kakao, go to `Product settings` > `Kakao +Login` > `Redirect URI`. ## Generate and activate a `client_secret` @@ -58,6 +58,7 @@ This will serve as the `client_id` when you make API calls to authenticate the u - Make sure you enabled `Client sercet code` by selecting `enable` from the `Activation state` section. ## Additional configurations on Kakao Developers Portal + - Make sure the Kakao Login is enabled in the `Kakao Login` tab. - Set following scopes under the "Consent Items": account_email, profile_image, profile_nickname From a652aaf76506a2409fce755ec2e4817b45c15ca5 Mon Sep 17 00:00:00 2001 From: hwr12 Date: Fri, 12 May 2023 16:00:07 +0900 Subject: [PATCH 014/694] reformat code with prettier --- apps/docs/pages/guides/auth/social-login/auth-kakao.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx b/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx index d1c6206d452..afa79845929 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-kakao.mdx @@ -47,8 +47,8 @@ This will serve as the `client_id` when you make API calls to authenticate the u ## Find your callback URL -- To add callback URL on Kakao, go to `Product settings` > `Kakao -Login` > `Redirect URI`. +- To add callback URL on Kakao, go to `Product settings` > +`Kakao Login` > `Redirect URI`. ## Generate and activate a `client_secret` From f504d8b108311994f3d73f595a50fd6773c6c619 Mon Sep 17 00:00:00 2001 From: Kang Ming Date: Tue, 16 May 2023 16:58:17 +0800 Subject: [PATCH 015/694] reorder navigation bar --- .../NavigationMenu/NavigationMenu.constants.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index 45fc485898a..1a7a185fce3 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -351,6 +351,11 @@ export const SocialLoginItems = [ icon: '/docs/img/icons/discord-icon', url: '/guides/auth/social-login/auth-discord', }, + { + name: 'Kakao', + icon: '/docs/img/icons/kakao-icon', + url: '/guides/auth/social-login/auth-kakao', + }, { name: 'Keycloak', icon: '/docs/img/icons/keycloak-icon', @@ -391,11 +396,6 @@ export const SocialLoginItems = [ icon: '/docs/img/icons/zoom-icon', url: '/guides/auth/social-login/auth-zoom', }, - { - name: 'Kakao', - icon: '/docs/img/icons/kakao-icon', - url: '/guides/auth/social-login/auth-kakao', - }, ] export const PhoneLoginsItems = [ From b68f1de1b3113078d9c2de0f534d5f6dadac741e Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Sat, 20 May 2023 16:49:36 +0800 Subject: [PATCH 016/694] started moving Button over --- package-lock.json | 44 +++ packages/ui/package.json | 5 +- .../ui/src/components/Button/Button-old.tsx | 159 +++++++++ packages/ui/src/components/Button/Button.tsx | 303 ++++++++++-------- .../ui/src/components/Command/AiCommand.tsx | 2 +- .../src/components/Command/Command.utils.tsx | 2 +- .../Command/GenerateSQL/GenerateSQL.tsx | 2 +- .../ui/src/components/Command/LoadingLine.tsx | 2 +- .../ui/src/components/Dropdown/Dropdown.tsx | 2 +- .../ui/src/components/Icon/IconContext.tsx | 5 +- packages/ui/src/components/Radio/Radio.tsx | 2 +- .../ThemeProvider/ThemeProvider.tsx | 2 +- packages/ui/src/lib/commonCva.ts | 71 ++++ packages/ui/src/lib/theme/themeContext.tsx | 2 +- packages/ui/src/lib/utilities.tsx | 78 ----- packages/ui/src/{ => lib}/utils/cn.ts | 0 packages/ui/src/lib/utils/index.ts | 3 + packages/ui/src/{ => lib}/utils/mergeDeep.ts | 0 .../src/{ => lib}/utils/randomIdGenerator.ts | 2 +- packages/ui/src/utils/useDarkMode.ts | 46 --- packages/ui/tsconfig.json | 18 +- 21 files changed, 470 insertions(+), 280 deletions(-) create mode 100644 packages/ui/src/components/Button/Button-old.tsx create mode 100644 packages/ui/src/lib/commonCva.ts delete mode 100644 packages/ui/src/lib/utilities.tsx rename packages/ui/src/{ => lib}/utils/cn.ts (100%) create mode 100644 packages/ui/src/lib/utils/index.ts rename packages/ui/src/{ => lib}/utils/mergeDeep.ts (100%) rename packages/ui/src/{ => lib}/utils/randomIdGenerator.ts (92%) delete mode 100644 packages/ui/src/utils/useDarkMode.ts diff --git a/package-lock.json b/package-lock.json index 52b222b705b..f17479dc837 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18803,6 +18803,33 @@ "node": ">=0.10.0" } }, + "node_modules/class-variance-authority": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.6.0.tgz", + "integrity": "sha512-qdRDgfjx3GRb9fpwpSvn+YaidnT7IUJNe4wt5/SWwM+PmUwJUhQRk/8zAyNro0PmVfmen2635UboTjIBXXxy5A==", + "dependencies": { + "clsx": "1.2.1" + }, + "funding": { + "url": "https://joebell.co.uk" + }, + "peerDependencies": { + "typescript": ">= 4.5.5 < 6" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/class-variance-authority/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, "node_modules/classnames": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", @@ -45507,6 +45534,7 @@ "@tailwindcss/forms": "^0.4.0", "@tailwindcss/typography": "^0.5.0", "autoprefixer": "^10.4.14", + "class-variance-authority": "^0.6.0", "clsx": "^1.2.1", "cmdk-supabase": "^0.2.2", "color": "^4.2.3", @@ -60387,6 +60415,21 @@ } } }, + "class-variance-authority": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.6.0.tgz", + "integrity": "sha512-qdRDgfjx3GRb9fpwpSvn+YaidnT7IUJNe4wt5/SWwM+PmUwJUhQRk/8zAyNro0PmVfmen2635UboTjIBXXxy5A==", + "requires": { + "clsx": "1.2.1" + }, + "dependencies": { + "clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" + } + } + }, "classnames": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", @@ -80001,6 +80044,7 @@ "@types/react-dom": "^17.0.11", "@types/react-syntax-highlighter": "^15.5.6", "autoprefixer": "^10.4.14", + "class-variance-authority": "*", "clsx": "^1.2.1", "cmdk-supabase": "^0.2.2", "color": "^4.2.3", diff --git a/packages/ui/package.json b/packages/ui/package.json index ce7073b768d..d3e425d8f3d 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -30,6 +30,7 @@ "@tailwindcss/forms": "^0.4.0", "@tailwindcss/typography": "^0.5.0", "autoprefixer": "^10.4.14", + "class-variance-authority": "^0.6.0", "clsx": "^1.2.1", "cmdk-supabase": "^0.2.2", "color": "^4.2.3", @@ -53,7 +54,6 @@ "tailwindcss-radix": "^1.6.0" }, "devDependencies": { - "config": "*", "@babel/preset-env": "^7.21.4", "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.21.4", @@ -62,13 +62,14 @@ "@storybook/addon-styling": "^1.0.1", "@storybook/react": "^7.0.5", "@storybook/react-webpack5": "^7.0.5", - "@tokens-studio/sd-transforms": "^0.8.5", "@testing-library/jest-dom": "^5.16.5", + "@tokens-studio/sd-transforms": "^0.8.5", "@types/common-tags": "^1.8.1", "@types/react": "^17.0.37", "@types/react-copy-to-clipboard": "^5.0.4", "@types/react-dom": "^17.0.11", "@types/react-syntax-highlighter": "^15.5.6", + "config": "*", "copyfiles": "^2.4.1", "glob": "^8.1.0", "sql-formatter": "^12.2.0", diff --git a/packages/ui/src/components/Button/Button-old.tsx b/packages/ui/src/components/Button/Button-old.tsx new file mode 100644 index 00000000000..145a9333ebb --- /dev/null +++ b/packages/ui/src/components/Button/Button-old.tsx @@ -0,0 +1,159 @@ +import React, { forwardRef } from 'react' +import { IconContext } from './../Icon/IconContext' +import { IconLoader } from './../Icon/icons/IconLoader' + +import styleHandler from '../../lib/theme/styleHandler' + +export interface ButtonProps extends React.HTMLAttributes { + block?: boolean + className?: string + children?: React.ReactNode + disabled?: boolean + onClick?: React.MouseEventHandler + icon?: React.ReactNode + iconRight?: React.ReactNode + loading?: boolean + loadingCentered?: boolean + shadow?: boolean + size?: ButtonSize + style?: React.CSSProperties + type?: ButtonType + danger?: boolean + htmlType?: 'button' | 'submit' | 'reset' + ref?: any + ariaSelected?: boolean + ariaControls?: string + tabIndex?: 0 | -1 + role?: string + textAlign?: 'left' | 'center' | 'right' + as?: keyof JSX.IntrinsicElements + form?: string +} + +export type ButtonSize = 'tiny' | 'small' | 'medium' | 'large' | 'xlarge' +export type ButtonType = + | 'primary' + | 'default' + | 'secondary' + | 'alternative' + | 'outline' + | 'dashed' + | 'link' + | 'text' + | 'danger' + | 'warning' + +interface CustomButtonProps extends React.HTMLAttributes {} + +export const Button = forwardRef( + ( + { + block, + className, + children, + danger, + disabled = false, + onClick, + icon, + iconRight, + loading = false, + loadingCentered = false, + shadow = true, + size = 'tiny', + style, + type = 'primary', + htmlType = 'button', + ariaSelected, + ariaControls, + tabIndex, + role, + as, + textAlign = 'center', + ...props + }: ButtonProps, + ref + ) => { + let __styles = styleHandler('button') + + // styles + const showIcon = loading || icon + + let classes = [__styles.base] + let containerClasses = [__styles.container] + + classes.push(__styles.type[type]) + + if (block) { + containerClasses.push(__styles.block) + classes.push(__styles.block) + } + + if (shadow && type !== 'link' && type !== 'text') { + classes.push(__styles.shadow) + } + + if (size) { + classes.push(__styles.size[size]) + } + + if (className) { + classes.push(className) + } + + if (disabled) { + classes.push(__styles.disabled) + } + + const iconLoaderClasses = [__styles.loading] + + // custom button tag + const CustomButton = ({ ...props }) => { + const Tag = as as keyof JSX.IntrinsicElements + return + } + + const buttonContent = ( + <> + {showIcon && + (loading ? ( + + ) : icon ? ( + {icon} + ) : null)} + {children && {children}} + {iconRight && !loading && ( + {iconRight} + )} + + ) + + if (as) { + return ( + + {buttonContent} + + ) + } else { + return ( + // + + // + ) + } + } +) diff --git a/packages/ui/src/components/Button/Button.tsx b/packages/ui/src/components/Button/Button.tsx index 145a9333ebb..ba48a5d2463 100644 --- a/packages/ui/src/components/Button/Button.tsx +++ b/packages/ui/src/components/Button/Button.tsx @@ -1,159 +1,196 @@ -import React, { forwardRef } from 'react' +import * as React from 'react' +import { Slot } from '@radix-ui/react-slot' +import { VariantProps, cva } from 'class-variance-authority' + import { IconContext } from './../Icon/IconContext' import { IconLoader } from './../Icon/icons/IconLoader' -import styleHandler from '../../lib/theme/styleHandler' +import { cn } from '@ui/lib/utils' +import { sizes } from '@ui/lib/commonCva' -export interface ButtonProps extends React.HTMLAttributes { - block?: boolean - className?: string - children?: React.ReactNode - disabled?: boolean - onClick?: React.MouseEventHandler +export type ButtonVariantProps = VariantProps +const buttonVariantsNew = cva( + `relative + cursor-pointer + inline-flex + items-center + space-x-2 + text-center + font-regular + ease-out + duration-200 + rounded + outline-none + transition-all + outline-0 + focus-visible:outline-4 + focus-visible:outline-offset-1`, + { + variants: { + type: { + primary: ` + bg-brand-fixed-1100 hover:bg-brand-fixed-1000 + text-white + bordershadow-brand-fixed-1000 hover:bordershadow-brand-fixed-900 dark:bordershadow-brand-fixed-1000 dark:hover:bordershadow-brand-fixed-1000 + focus-visible:outline-brand-600 + shadow-sm`, + secondary: ` + bg-scale-1200 + text-scale-100 hover:text-scale-800 + focus-visible:text-scale-600 + bordershadow-scale-1100 hover:bordershadow-scale-900 + focus-visible:outline-scale-700 + shadow-sm`, + default: ` + text-scale-1200 + bg-scale-100 hover:bg-scale-300 + bordershadow-scale-600 hover:bordershadow-scale-700 + dark:bordershadow-scale-700 hover:dark:bordershadow-scale-800 + dark:bg-scale-500 dark:hover:bg-scale-600 + focus-visible:outline-brand-600 + shadow-sm`, + alternative: ` + text-brand-1100 + bg-brand-200 hover:bg-brand-400 + bordershadow-brand-600 hover:bordershadow-brand-800 + dark:bordershadow-brand-700 hover:dark:bordershadow-brand-800 + focus-visible:border-brand-800 + focus-visible:outline-brand-600 + shadow-sm`, + outline: ` + text-scale-1200 + bg-transparent + bordershadow-scale-600 hover:bordershadow-scale-700 + dark:bordershadow-scale-800 hover:dark:bordershadow-scale-900 + focus-visible:outline-scale-700`, + dashed: ` + text-scale-1200 + border + border-dashed + border-scale-700 hover:border-scale-900 + bg-transparent + focus-visible:outline-scale-700 + shadow-sm`, + link: ` + text-brand-1100 + border + border-transparent + hover:bg-brand-400 + border-opacity-0 + bg-opacity-0 dark:bg-opacity-0 + shadow-none + focus-visible:outline-scale-700`, + text: ` + text-scale-1200 + hover:bg-scale-500 + shadow-none + focus-visible:outline-scale-700`, + danger: ` + text-red-1100 + bg-red-200 + bordershadow-red-700 hover:bordershadow-red-900 + hover:bg-red-900 + hover:text-lo-contrast + focus-visible:outline-red-700 + shadow-sm`, + warning: ` + text-amber-1100 + bg-amber-200 + bordershadow-amber-700 hover:bordershadow-amber-900 + hover:bg-amber-900 + hover:text-hi-contrast + focus-visible:outline-amber-700 + shadow-sm`, + }, + block: { + default: 'w-full flex items-center justify-center', + }, + size: { + ...sizes, + }, + overlay: { + base: `absolute inset-0 bg-scale-200 opacity-50`, + container: `fixed inset-0 transition-opacity`, + }, + disabled: { + true: 'opacity-50 cursor-not-allowed pointer-events-none', + }, + defaultVariants: { + // variant: 'default', + // size: 'default', + }, + }, + } +) + +export type LoadingVariantProps = VariantProps +const loadingVariants = cva('', { + variants: { + loading: { + default: '', + true: `animate-spin`, + }, + }, +}) + +export interface ButtonProps + // omit `type` as we use it to change type of button + // replaced with `htmlType` + extends Omit, 'type'>, + // omit 'disabled' as it is included in HTMLButtonElement + Omit, + LoadingVariantProps { + asChild?: boolean + type?: ButtonVariantProps['type'] + htmlType?: React.ButtonHTMLAttributes['type'] icon?: React.ReactNode + iconLeft?: React.ReactNode iconRight?: React.ReactNode - loading?: boolean - loadingCentered?: boolean - shadow?: boolean - size?: ButtonSize - style?: React.CSSProperties - type?: ButtonType - danger?: boolean - htmlType?: 'button' | 'submit' | 'reset' - ref?: any - ariaSelected?: boolean - ariaControls?: string - tabIndex?: 0 | -1 - role?: string - textAlign?: 'left' | 'center' | 'right' - as?: keyof JSX.IntrinsicElements - form?: string } -export type ButtonSize = 'tiny' | 'small' | 'medium' | 'large' | 'xlarge' -export type ButtonType = - | 'primary' - | 'default' - | 'secondary' - | 'alternative' - | 'outline' - | 'dashed' - | 'link' - | 'text' - | 'danger' - | 'warning' +const Button = React.forwardRef( + ({ asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : 'button' -interface CustomButtonProps extends React.HTMLAttributes {} + const { className, type, disabled, size, loading, icon, iconLeft, iconRight } = props -export const Button = forwardRef( - ( - { - block, - className, - children, - danger, - disabled = false, - onClick, - icon, - iconRight, - loading = false, - loadingCentered = false, - shadow = true, - size = 'tiny', - style, - type = 'primary', - htmlType = 'button', - ariaSelected, - ariaControls, - tabIndex, - role, - as, - textAlign = 'center', - ...props - }: ButtonProps, - ref - ) => { - let __styles = styleHandler('button') - - // styles const showIcon = loading || icon - let classes = [__styles.base] - let containerClasses = [__styles.container] - - classes.push(__styles.type[type]) - - if (block) { - containerClasses.push(__styles.block) - classes.push(__styles.block) - } - - if (shadow && type !== 'link' && type !== 'text') { - classes.push(__styles.shadow) - } - - if (size) { - classes.push(__styles.size[size]) - } - - if (className) { - classes.push(className) - } - - if (disabled) { - classes.push(__styles.disabled) - } - - const iconLoaderClasses = [__styles.loading] - - // custom button tag - const CustomButton = ({ ...props }) => { - const Tag = as as keyof JSX.IntrinsicElements - return - } + // decrecating 'showIcon' for rightIcon + const _iconLeft: React.ReactNode = icon ?? iconLeft const buttonContent = ( <> {showIcon && (loading ? ( - - ) : icon ? ( - {icon} + + ) : _iconLeft ? ( + {_iconLeft} ) : null)} - {children && {children}} + {props.children && {props.children}} {iconRight && !loading && ( {iconRight} )} ) - if (as) { - return ( - - {buttonContent} - - ) - } else { - return ( - // - - // - ) - } + return ( + + {buttonContent} + + ) } ) + +Button.displayName = 'Button' + +function Test() { + return +} + +export { Button, buttonVariantsNew } diff --git a/packages/ui/src/components/Command/AiCommand.tsx b/packages/ui/src/components/Command/AiCommand.tsx index 48a35a8c788..509b7c13d91 100644 --- a/packages/ui/src/components/Command/AiCommand.tsx +++ b/packages/ui/src/components/Command/AiCommand.tsx @@ -30,7 +30,7 @@ import { AiWarning } from './Command.alerts' import { useCommandMenu } from './CommandMenuProvider' import ReactMarkdown from 'react-markdown' -import { cn } from './../../utils/cn' +import { cn } from '../../lib/utils/cn' import remarkGfm from 'remark-gfm' const questions = [ diff --git a/packages/ui/src/components/Command/Command.utils.tsx b/packages/ui/src/components/Command/Command.utils.tsx index f7796e4a9b1..e183ad76b2d 100644 --- a/packages/ui/src/components/Command/Command.utils.tsx +++ b/packages/ui/src/components/Command/Command.utils.tsx @@ -1,7 +1,7 @@ import { Command as CommandPrimitive } from 'cmdk-supabase' import * as React from 'react' -import { cn } from './../../utils/cn' +import { cn } from '../../lib/utils/cn' import { DetailedHTMLProps, HTMLAttributes, KeyboardEventHandler } from 'react' import { Modal } from '../Modal' diff --git a/packages/ui/src/components/Command/GenerateSQL/GenerateSQL.tsx b/packages/ui/src/components/Command/GenerateSQL/GenerateSQL.tsx index f25aec4fcbb..5ccc7ca988e 100644 --- a/packages/ui/src/components/Command/GenerateSQL/GenerateSQL.tsx +++ b/packages/ui/src/components/Command/GenerateSQL/GenerateSQL.tsx @@ -16,7 +16,7 @@ import { UseAiChatOptions, } from 'ui' -import { cn } from '../../../utils/cn' +import { cn } from '../../../lib/utils/cn' import { AiIcon, AiIconChat } from '../Command.icons' import { CommandItem, useAutoInputFocus, useHistoryKeys } from '../Command.utils' import { useCommandMenu } from '../CommandMenuProvider' diff --git a/packages/ui/src/components/Command/LoadingLine.tsx b/packages/ui/src/components/Command/LoadingLine.tsx index 6e2c172c579..529ae689e94 100644 --- a/packages/ui/src/components/Command/LoadingLine.tsx +++ b/packages/ui/src/components/Command/LoadingLine.tsx @@ -1,5 +1,5 @@ import React from 'react' -import { cn } from '../../utils/cn' +import { cn } from '../../lib/utils/cn' export const LoadingLine = ({ loading }: { loading: boolean }) => { return ( diff --git a/packages/ui/src/components/Dropdown/Dropdown.tsx b/packages/ui/src/components/Dropdown/Dropdown.tsx index 760197c5919..32fd4af3814 100644 --- a/packages/ui/src/components/Dropdown/Dropdown.tsx +++ b/packages/ui/src/components/Dropdown/Dropdown.tsx @@ -7,7 +7,7 @@ import type * as RadixDropdownTypes from '@radix-ui/react-dropdown-menu/' import styleHandler from '../../lib/theme/styleHandler' import { IconTarget } from '../Icon/icons/IconTarget' -import { cn } from '../../utils/cn' +import { cn } from '../../lib/utils/cn' interface RootProps extends RadixDropdownTypes.DropdownMenuProps { open?: boolean diff --git a/packages/ui/src/components/Icon/IconContext.tsx b/packages/ui/src/components/Icon/IconContext.tsx index 4d2198bdfe7..58c731dcf8c 100644 --- a/packages/ui/src/components/Icon/IconContext.tsx +++ b/packages/ui/src/components/Icon/IconContext.tsx @@ -1,10 +1,11 @@ +import { SizeVariantProps } from '@ui/lib/commonCva' import { createContext } from 'react' -type ContextValue = { contextSize?: string; className?: string } +type ContextValue = { contextSize?: SizeVariantProps; className?: string } // Make sure the shape of the default value passed to // createContext matches the shape that the consumers expect! export const IconContext = createContext({ - contextSize: '', + contextSize: 'small', className: '', }) diff --git a/packages/ui/src/components/Radio/Radio.tsx b/packages/ui/src/components/Radio/Radio.tsx index 72ad375ec43..715637eee8b 100644 --- a/packages/ui/src/components/Radio/Radio.tsx +++ b/packages/ui/src/components/Radio/Radio.tsx @@ -7,7 +7,7 @@ import { useFormContext } from '../Form/FormContext' import defaultTheme from '../../lib/theme/defaultTheme' import styleHandler from '../../lib/theme/styleHandler' -import randomIdGenerator from './../../utils/randomIdGenerator' +import randomIdGenerator from '../../lib/utils/randomIdGenerator' interface GroupProps { allowedValues?: any diff --git a/packages/ui/src/components/ThemeProvider/ThemeProvider.tsx b/packages/ui/src/components/ThemeProvider/ThemeProvider.tsx index 334587987f1..524f2e718b3 100644 --- a/packages/ui/src/components/ThemeProvider/ThemeProvider.tsx +++ b/packages/ui/src/components/ThemeProvider/ThemeProvider.tsx @@ -3,7 +3,7 @@ import { createContext } from 'react' import defaultTheme from '../../lib/theme/defaultTheme' -import { mergeDeep } from '../../utils/mergeDeep' +import { mergeDeep } from '../../lib/utils/mergeDeep' // import useDarkMode from './utils/useDarkMode' interface ThemeContextInterface { diff --git a/packages/ui/src/lib/commonCva.ts b/packages/ui/src/lib/commonCva.ts new file mode 100644 index 00000000000..fdf863e24c9 --- /dev/null +++ b/packages/ui/src/lib/commonCva.ts @@ -0,0 +1,71 @@ +import { VariantProps, cva } from 'class-variance-authority' + +const defaults = { + bg: { + brand: { + primary: 'bg-purple-600', + secondary: 'bg-purple-200', + }, + }, + text: { + brand: 'text-purple-600', + body: 'text-scale-600 dark:text-scaleDark-200', + title: 'text-scale-700 dark:text-scaleDark-100', + }, + border: { + brand: 'border-brand-600', + primary: 'border-scale-700', + secondary: 'border-scale-400', + alternative: 'border-scale-600 dark:border-scaleDark-200', + }, + placeholder: 'placeholder-scale-800', + focus: ` + outline-none + focus:ring-current focus:ring-2 + `, + 'focus-visible': ` + outline-none + transition-all + outline-0 + focus-visible:outline-4 + focus-visible:outline-offset-1 + `, + size: { + // buttons, inputs, input labels use these sizes + text: { + tiny: 'text-xs', + small: 'text-sm leading-4', + medium: 'text-sm', + large: 'text-base', + xlarge: 'text-base', + }, + // buttons, inputs, input labels use these sizes + padding: { + tiny: 'px-2.5 py-1', + small: 'px-3 py-2', + medium: 'px-4 py-2', + large: 'px-4 py-2', + xlarge: 'px-6 py-3', + }, + }, + overlay: { + base: `absolute inset-0 bg-scale-200 opacity-50`, + container: `fixed inset-0 transition-opacity`, + }, +} + +export const sizes = { + tiny: `${defaults.size.text.tiny} ${defaults.size.padding.tiny}`, + small: `${defaults.size.text.small} ${defaults.size.padding.small}`, + medium: `${defaults.size.text.medium} ${defaults.size.padding.medium}`, + large: `${defaults.size.text.large} ${defaults.size.padding.large}`, + xlarge: `${defaults.size.text.xlarge} ${defaults.size.padding.xlarge}`, +} +export type SizeVariantProps = VariantProps['size'] +export const sizeVariants = cva('', { + variants: { + size: { + ...sizes, + }, + }, +}) diff --git a/packages/ui/src/lib/theme/themeContext.tsx b/packages/ui/src/lib/theme/themeContext.tsx index 3e0fbcfc011..c5264812354 100644 --- a/packages/ui/src/lib/theme/themeContext.tsx +++ b/packages/ui/src/lib/theme/themeContext.tsx @@ -2,7 +2,7 @@ import React, { useLayoutEffect, useMemo } from 'react' import { createContext } from 'react' import defaultTheme from './defaultTheme' -import { mergeDeep } from '../../utils/mergeDeep' +import { mergeDeep } from '../utils/mergeDeep' // import useDarkMode from './utils/useDarkMode' interface ThemeContextInterface { diff --git a/packages/ui/src/lib/utilities.tsx b/packages/ui/src/lib/utilities.tsx deleted file mode 100644 index 89cc8a5a1c4..00000000000 --- a/packages/ui/src/lib/utilities.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import React from 'react' - -// export const FormLayout = (props: any) => { -// const { -// align, -// direction, -// size, -// label, -// labelOptional, -// layout, -// children, -// id, -// error, -// descriptionText, -// className, -// responsive -// } = props - -// const spacingClass = -// 'space-' + (direction === 'vertical' ? 'y' : 'x') + '-' + size - -// const responsiveClasses = responsive ? ' md:grid-cols-12' : ' grid-cols-12' - -// return ( -//
-// -// {label && ( -// -// )} -// {labelOptional && ( -// -// {labelOptional} -// -// )} -// -//
-// {children} -// {error && ( -//

-// {error} -//

-// )} -// {descriptionText && ( -//

-// {descriptionText} -//

-// )} -//
-//
-// ) -// } - -// export const Space = (props: any) => { -// const { direction, size, className } = props - -// const spacingClass = -// 'space-' + (direction === 'vertical' ? 'y' : 'x') + '-' + size - -// return ( -//
-// {props.children} -//
-// ) -// } diff --git a/packages/ui/src/utils/cn.ts b/packages/ui/src/lib/utils/cn.ts similarity index 100% rename from packages/ui/src/utils/cn.ts rename to packages/ui/src/lib/utils/cn.ts diff --git a/packages/ui/src/lib/utils/index.ts b/packages/ui/src/lib/utils/index.ts new file mode 100644 index 00000000000..524b85fccef --- /dev/null +++ b/packages/ui/src/lib/utils/index.ts @@ -0,0 +1,3 @@ +export * from './cn' +export * from './mergeDeep' +export * from './randomIdGenerator' diff --git a/packages/ui/src/utils/mergeDeep.ts b/packages/ui/src/lib/utils/mergeDeep.ts similarity index 100% rename from packages/ui/src/utils/mergeDeep.ts rename to packages/ui/src/lib/utils/mergeDeep.ts diff --git a/packages/ui/src/utils/randomIdGenerator.ts b/packages/ui/src/lib/utils/randomIdGenerator.ts similarity index 92% rename from packages/ui/src/utils/randomIdGenerator.ts rename to packages/ui/src/lib/utils/randomIdGenerator.ts index be7c8071b9a..e3043cbd938 100644 --- a/packages/ui/src/utils/randomIdGenerator.ts +++ b/packages/ui/src/lib/utils/randomIdGenerator.ts @@ -3,7 +3,7 @@ // return randomNumber.toString() // } -export default function generateUID() { +export function generateUID() { // I generate the UID from two parts here // to ensure the random number provide enough bits. var firstPart = (Math.random() * 46656) | 0 diff --git a/packages/ui/src/utils/useDarkMode.ts b/packages/ui/src/utils/useDarkMode.ts deleted file mode 100644 index 8db60d6b634..00000000000 --- a/packages/ui/src/utils/useDarkMode.ts +++ /dev/null @@ -1,46 +0,0 @@ -// import { useEffect, useState } from 'react' - -// export const useDarkMode = ( -// usePreferences: boolean -// ): [Mode, React.Dispatch> | null, -// (() => void) | null -// ] => { -// if (!usePreferences) return [null, null, null] - -// const [mode, setMode] = useState(null) - -// const toggleMode = () => { -// if (mode === 'light') { -// document.documentElement.className = '' -// document.documentElement.classList.add('dark') -// setMode('dark') -// } else { -// document.documentElement.className = '' -// document.documentElement.classList.add('light') -// setMode('light') -// } -// } - -// useEffect(() => { -// const userPreference = -// !!window.matchMedia && -// window.matchMedia('(prefers-color-scheme: dark)').matches - -// setMode( -// // use stored theme; fallback to user preference -// window.localStorage.getItem('theme') || -// (userPreference ? 'dark' : 'light') -// ) -// }, []) - -// useEffect(() => { -// if (mode) { -// window.localStorage.setItem('theme', mode) -// document.documentElement.classList.add(mode) -// } -// }, [mode]) - -// return [mode, setMode, toggleMode] -// } - -// export default useDarkMode diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json index 8637a0ecaf7..da20469057f 100644 --- a/packages/ui/tsconfig.json +++ b/packages/ui/tsconfig.json @@ -1,14 +1,12 @@ { "extends": "tsconfig/react-library.json", "compilerOptions": { - "resolveJsonModule": true + "resolveJsonModule": true, + "baseUrl": ".", + "paths": { + "@ui/*": ["./src/*"] // no other project in the monorepo uses this alias + } }, - "include": [ - "." - ], - "exclude": [ - "dist", - "build", - "node_modules" - ] -} \ No newline at end of file + "include": ["."], + "exclude": ["dist", "build", "node_modules"] +} From 18d2cc27471011978895fdea19dada17671e47b7 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Sat, 20 May 2023 17:33:27 +0800 Subject: [PATCH 017/694] update stories --- package-lock.json | 97 ++++- packages/ui/.storybook/{main.js => main.ts} | 28 +- packages/ui/.storybook/preview.css | 2 +- packages/ui/build/css/themes/dark.css | 2 +- packages/ui/build/css/themes/light.css | 14 +- packages/ui/package.json | 1 + .../components/Button/Button.stories-old.tsx | 234 +++++++++++ .../src/components/Button/Button.stories.tsx | 363 ++++++++---------- packages/ui/src/components/Button/Button.tsx | 10 +- 9 files changed, 517 insertions(+), 234 deletions(-) rename packages/ui/.storybook/{main.js => main.ts} (51%) create mode 100644 packages/ui/src/components/Button/Button.stories-old.tsx diff --git a/package-lock.json b/package-lock.json index f17479dc837..d27e2ca9c96 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42788,6 +42788,59 @@ "strip-bom": "^3.0.0" } }, + "node_modules/tsconfig-paths-webpack-plugin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.1.tgz", + "integrity": "sha512-m5//KzLoKmqu2MVix+dgLKq70MnFi8YL8sdzQZ6DblmCdfuq/y3OqvJd5vMndg2KEVCOeNz8Es4WVZhYInteLw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tsconfig-paths": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/tsconfig-paths/node_modules/json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", @@ -45580,6 +45633,7 @@ "storybook": "^7.0.5", "storybook-dark-mode": "^3.0.0", "style-dictionary": "^3.7.1", + "tsconfig-paths-webpack-plugin": "^4.0.1", "typescript": "4.3.4" } }, @@ -79845,6 +79899,46 @@ } } }, + "tsconfig-paths-webpack-plugin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.1.tgz", + "integrity": "sha512-m5//KzLoKmqu2MVix+dgLKq70MnFi8YL8sdzQZ6DblmCdfuq/y3OqvJd5vMndg2KEVCOeNz8Es4WVZhYInteLw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tsconfig-paths": "^4.1.2" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "requires": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + } + } + }, "tslib": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", @@ -80044,7 +80138,7 @@ "@types/react-dom": "^17.0.11", "@types/react-syntax-highlighter": "^15.5.6", "autoprefixer": "^10.4.14", - "class-variance-authority": "*", + "class-variance-authority": "^0.6.0", "clsx": "^1.2.1", "cmdk-supabase": "^0.2.2", "color": "^4.2.3", @@ -80073,6 +80167,7 @@ "tailwind-merge": "^1.10.0", "tailwindcss": "^3.0.15", "tailwindcss-radix": "^1.6.0", + "tsconfig-paths-webpack-plugin": "*", "typescript": "4.3.4" }, "dependencies": { diff --git a/packages/ui/.storybook/main.js b/packages/ui/.storybook/main.ts similarity index 51% rename from packages/ui/.storybook/main.js rename to packages/ui/.storybook/main.ts index 6eec6659784..9af87dbdec2 100644 --- a/packages/ui/.storybook/main.js +++ b/packages/ui/.storybook/main.ts @@ -1,4 +1,7 @@ -module.exports = { +const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin') +import type { StorybookConfig } from '@storybook/your-framework' + +const config: StorybookConfig = { // // stories: [ // // '../src/components/**/*.stories.mdx', // // '../src/components/**/*.stories.@(js|jsx|ts|tsx)', @@ -6,14 +9,14 @@ module.exports = { // // TODO: Temporally Import one by one story and fix build issue. // // After all stories are cleaned, revert to wildcard import. stories: [ - '../src/components/Accordion/Accordion.stories.tsx', - '../src/components/Alert/Alert.stories.tsx', - '../src/components/Avatar/Avatar.stories.tsx', + // '../src/components/Accordion/Accordion.stories.tsx', + // '../src/components/Alert/Alert.stories.tsx', + // '../src/components/Avatar/Avatar.stories.tsx', '../src/components/Button/Button.stories.tsx', - '../src/components/Checkbox/Checkbox.stories.tsx', - '../src/components/Collapsible/Collapsible.stories.tsx', - '../src/components/ContextMenu/ContextMenu.stories.tsx', - '../src/components/Dropdown/Dropdown.stories.tsx', + // '../src/components/Checkbox/Checkbox.stories.tsx', + // '../src/components/Collapsible/Collapsible.stories.tsx', + // '../src/components/ContextMenu/ContextMenu.stories.tsx', + // '../src/components/Dropdown/Dropdown.stories.tsx', ], addons: [ // '@storybook/addon-links', @@ -39,4 +42,13 @@ module.exports = { name: '@storybook/react-webpack5', options: {}, }, + webpackFinal: async (config, { configType }) => { + /** + * resolve import paths from tsconfig + * based on https://stackoverflow.com/a/71677949/4807782 + */ + config.resolve.plugins = [new TsconfigPathsPlugin()] // ;<-- this line + return config + }, } +export default config diff --git a/packages/ui/.storybook/preview.css b/packages/ui/.storybook/preview.css index 5682f9ab6be..7c9bdb31cb7 100644 --- a/packages/ui/.storybook/preview.css +++ b/packages/ui/.storybook/preview.css @@ -4,7 +4,7 @@ @import './../build/css/themes/dark.css'; @import './../build/css/themes/light.css'; -@import './../build/css/themes/darker-dark.css'; +/* @import './../build/css/themes/darker-dark.css'; */ .dark, .light, diff --git a/packages/ui/build/css/themes/dark.css b/packages/ui/build/css/themes/dark.css index fedf2507642..a4d60d733a8 100644 --- a/packages/ui/build/css/themes/dark.css +++ b/packages/ui/build/css/themes/dark.css @@ -1,6 +1,6 @@ /** * Do not edit directly - * Generated on Tue, 09 May 2023 15:35:29 GMT + * Generated on Sat, 20 May 2023 09:00:49 GMT */ .dark { diff --git a/packages/ui/build/css/themes/light.css b/packages/ui/build/css/themes/light.css index 340a6635965..0f4e33acc9f 100644 --- a/packages/ui/build/css/themes/light.css +++ b/packages/ui/build/css/themes/light.css @@ -1,6 +1,6 @@ /** * Do not edit directly - * Generated on Tue, 09 May 2023 15:35:29 GMT + * Generated on Sat, 20 May 2023 09:00:49 GMT */ .light { @@ -22,7 +22,7 @@ --theme-variables-warning: 26.9deg 93.8% 56.1%; --theme-variables-background-body-alt: 0deg 0% 100%; /* og color is colors.Gray.Dark.1 */ --theme-variables-background-body: 210deg 16.7% 97.6%; /* og color is colors.Slate.Light.2 */ - --theme-variables-background: 210deg 33.3% 98.8%; /* og color is colors.Slate.Light.1 */ + --theme-variables-background: 0deg 0% 98.4%; /* og color is colors.Slate.Light.1 */ --theme-variables-brand: 153.1deg 60.2% 52.7%; --text-color-disabled-default: 195deg 7.1% 5.5%; --text-color-danger-default: var(--theme-variables-danger); @@ -48,11 +48,11 @@ --text-color-body-lightest: 195deg 1% 65.6%; --text-color-body-lighter: 195deg 1% 51.8%; --text-color-body-light: 195deg 1.9% 34.3%; - --border-color-selection: 210deg 0.4% 46.1%; + --border-color-selection: 91.8deg 0% 45.9%; --border-color-body-alt: 91.8deg 0% 96%; --border-color-body: 210deg 6.1% 93.7%; - --border-color-default: 210deg 7.5% 94.9%; /* Default border color */ - --background-color-control: 210deg 33.3% 99.2%; - --background-color-selection: 210deg 7.5% 94.9%; - --border-color-control: 210deg 4.1% 91.2%; + --border-color-default: 91.8deg 0% 94.5%; /* Default border color */ + --background-color-control: 91.8deg 0% 98.9%; + --background-color-selection: 91.8deg 0% 94.5%; + --border-color-control: 91.8deg 0% 90.8%; } diff --git a/packages/ui/package.json b/packages/ui/package.json index d3e425d8f3d..ccdeeeefa95 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -76,6 +76,7 @@ "storybook": "^7.0.5", "storybook-dark-mode": "^3.0.0", "style-dictionary": "^3.7.1", + "tsconfig-paths-webpack-plugin": "^4.0.1", "typescript": "4.3.4" } } diff --git a/packages/ui/src/components/Button/Button.stories-old.tsx b/packages/ui/src/components/Button/Button.stories-old.tsx new file mode 100644 index 00000000000..57c0e956cc7 --- /dev/null +++ b/packages/ui/src/components/Button/Button.stories-old.tsx @@ -0,0 +1,234 @@ +import { Button } from './' +import { IconPackage } from './../Icon/icons/IconPackage' +import { IconChevronRight } from './../Icon/icons/IconChevronRight' + +export default { + title: 'General/Button', + component: Button, +} + +export const Neutral = (args: any) => +export const Success = (args: any) => +export const withStyles = (args: any) => +export const withIcon = (args: any) => +export const withIconRight = (args: any) => +export const withBlock = (args: any) => +export const withOnlyIcon = (args: any) => +) + +export const allButtons = (args: any) => ( + <> +
+
+ + + + + + + + + + +
+ +
+ + + + + + + + + + +
+
+ + + + + + + + + + +
+
+ + + + + + + + + + +
+
+ + + + + + + + + + +
+
+ +) + +export const withCustomTag = (args: any) => + +const icon = + +withIcon.args = { + type: 'primary', + icon: icon, +} + +withIconRight.args = { + type: 'primary', + iconRight: , +} + +withStyles.args = { + type: 'primary', + style: { backgroundColor: 'red', color: 'yellow' }, +} + +withBlock.args = { + type: 'primary', + block: true, +} + +withOnlyIcon.args = { + icon: icon, +} + +withOnlyLoading.args = { + loading: true, +} + +withLoadingCentered.args = { + loading: true, + loadingCentered: true, +} + +allButtons.args = { + loading: false, + danger: false, +} + +withCustomTag.args = { + as: 'span', +} diff --git a/packages/ui/src/components/Button/Button.stories.tsx b/packages/ui/src/components/Button/Button.stories.tsx index e73cac1cc86..ce468ee7a01 100644 --- a/packages/ui/src/components/Button/Button.stories.tsx +++ b/packages/ui/src/components/Button/Button.stories.tsx @@ -1,235 +1,180 @@ -import { Button } from './' -import { IconPackage } from './../Icon/icons/IconPackage' -import { IconChevronRight } from './../Icon/icons/IconChevronRight' +// Button.stories.ts|tsx -export default { +import type { Meta, StoryObj } from '@storybook/react' + +import { Button, ButtonProps } from './Button' +import { Fragment } from 'react' +import { IconAirplay } from '../Icon/icons/IconAirplay' + +const meta: Meta = { + /* 👇 The title prop is optional. + * See https://storybook.js.org/docs/react/configure/overview#configure-story-loading + * to learn how to generate automatic titles + */ title: 'General/Button', component: Button, } -export const Neutral = (args: any) => -export const Success = (args: any) => +export default meta -export const withStyles = (args: any) => -export const withIcon = (args: any) => -export const withIconRight = (args: any) => -export const withBlock = (args: any) => -export const withOnlyIcon = (args: any) => -) +// export default { +// title: 'General/Button', +// component: Button, +// } -export const allButtons = (args: any) => ( - <> -
-
- - - - - - - - - - -
+type Story = StoryObj -
- - - - - - - - - - -
-
- - - - - - - - - - -
-
- - - - - - - - - - -
-
- - - - - - - - - - -
-
- -) +/* + *👇 Render functions are a framework specific feature to allow you control on how the component renders. + * See https://storybook.js.org/docs/react/api/csf + * to learn how to use render functions. + */ -export const withCustomTag = (args: any) => - -const icon = - -withIcon.args = { - type: 'primary', - icon: icon, +export const Primary = { + args: { + children: 'Hello world', + type: 'primary', + }, + render: ({ children, type }: ButtonProps) => , +} +export const Default = { + args: { + children: 'Hello world', + type: 'default', + }, + render: ({ children, type }: ButtonProps) => , } -withIconRight.args = { - type: 'primary', - iconRight: , +export const Alternative = { + args: { + children: 'Hello world', + type: 'alternative', + }, + render: ({ children, type }: ButtonProps) => , } -withStyles.args = { - type: 'primary', - style: { backgroundColor: 'red', color: 'yellow' }, +export const Outline = { + args: { + children: 'Hello world', + type: 'outline', + }, + render: ({ children, type }: ButtonProps) => , } -withBlock.args = { - type: 'primary', - block: true, +export const Secondary = { + args: { + children: 'Hello world', + type: 'secondary', + }, + render: ({ children, type }: ButtonProps) => , } -withOnlyIcon.args = { - icon: icon, +export const Dashed = { + args: { + children: 'Hello world', + type: 'dashed', + }, + render: ({ children, type }: ButtonProps) => , } -withOnlyLoading.args = { - loading: true, +export const Link = { + args: { + children: 'Hello world', + type: 'link', + }, + render: ({ children, type }: ButtonProps) => , } -withLoadingCentered.args = { - loading: true, - loadingCentered: true, +export const Text = { + args: { + children: 'Hello world', + type: 'text', + }, + render: ({ children, type }: ButtonProps) => , } -allButtons.args = { - loading: false, - danger: false, +export const Danger = { + args: { + children: 'Hello world', + type: 'danger', + }, + render: ({ children, type }: ButtonProps) => , } -withCustomTag.args = { - as: 'span', +export const Block = { + args: { + children: 'Hello world', + type: 'primary', + block: true, + }, + render: ({ children, type, block }: ButtonProps) => ( + + ), +} + +export const Disabled = { + args: { + children: 'Hello world', + type: 'primary', + disabled: true, + }, + render: ({ children, type, disabled }: ButtonProps) => ( + + ), +} + +export const Sizes = { + args: { + children: 'Change the size below', + type: 'primary', + size: 'large', + }, + render: ({ children, type, size }: ButtonProps) => ( + + ), +} + +export const LeftIcon = { + args: { + children: 'Change the size below', + type: 'primary', + iconLeft: , + }, + render: ({ children, type, iconLeft }: ButtonProps) => ( + + ), +} + +export const RightIcon = { + args: { + children: 'Change the size below', + type: 'primary', + iconRight: , + }, + render: ({ children, type, iconRight }: ButtonProps) => ( + + ), +} + +export const Loading = { + args: { + children: 'Change the size below', + type: 'primary', + loading: true, + }, + render: ({ children, type, loading }: ButtonProps) => ( + + ), } diff --git a/packages/ui/src/components/Button/Button.tsx b/packages/ui/src/components/Button/Button.tsx index ba48a5d2463..a70c9b393c1 100644 --- a/packages/ui/src/components/Button/Button.tsx +++ b/packages/ui/src/components/Button/Button.tsx @@ -103,7 +103,7 @@ const buttonVariantsNew = cva( shadow-sm`, }, block: { - default: 'w-full flex items-center justify-center', + true: 'w-full flex items-center justify-center', }, size: { ...sizes, @@ -149,10 +149,10 @@ export interface ButtonProps } const Button = React.forwardRef( - ({ asChild = false, ...props }, ref) => { + ({ asChild = false, size = 'small', type = 'primary', ...props }, ref) => { const Comp = asChild ? Slot : 'button' - const { className, type, disabled, size, loading, icon, iconLeft, iconRight } = props + const { className, disabled, loading, icon, iconLeft, iconRight } = props const showIcon = loading || icon @@ -189,8 +189,4 @@ const Button = React.forwardRef( Button.displayName = 'Button' -function Test() { - return -} - export { Button, buttonVariantsNew } From 980ca5d536cb625a331f5803ed6041a0ee8d63f7 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Sat, 20 May 2023 17:34:29 +0800 Subject: [PATCH 018/694] Update Button.stories.tsx --- packages/ui/src/components/Button/Button.stories.tsx | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/ui/src/components/Button/Button.stories.tsx b/packages/ui/src/components/Button/Button.stories.tsx index ce468ee7a01..3827669916e 100644 --- a/packages/ui/src/components/Button/Button.stories.tsx +++ b/packages/ui/src/components/Button/Button.stories.tsx @@ -3,7 +3,7 @@ import type { Meta, StoryObj } from '@storybook/react' import { Button, ButtonProps } from './Button' -import { Fragment } from 'react' + import { IconAirplay } from '../Icon/icons/IconAirplay' const meta: Meta = { @@ -17,11 +17,6 @@ const meta: Meta = { export default meta -// export default { -// title: 'General/Button', -// component: Button, -// } - type Story = StoryObj /* From 34794e35657aaa3c62d97ec799e0581ae0f4672e Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Sun, 21 May 2023 21:11:38 +0800 Subject: [PATCH 019/694] Accordion updated --- packages/ui/.storybook/main.ts | 2 +- .../Accordion/Accordion-old.stories.tsx | 166 +++++++++ .../components/Accordion/Accordion-old.tsx | 137 ++++++++ .../Accordion/Accordion.stories.tsx | 256 ++++---------- .../ui/src/components/Accordion/Accordion.tsx | 332 +++++++++++------- 5 files changed, 584 insertions(+), 309 deletions(-) create mode 100644 packages/ui/src/components/Accordion/Accordion-old.stories.tsx create mode 100644 packages/ui/src/components/Accordion/Accordion-old.tsx diff --git a/packages/ui/.storybook/main.ts b/packages/ui/.storybook/main.ts index 9af87dbdec2..a166e5ddacc 100644 --- a/packages/ui/.storybook/main.ts +++ b/packages/ui/.storybook/main.ts @@ -9,7 +9,7 @@ const config: StorybookConfig = { // // TODO: Temporally Import one by one story and fix build issue. // // After all stories are cleaned, revert to wildcard import. stories: [ - // '../src/components/Accordion/Accordion.stories.tsx', + '../src/components/Accordion/Accordion.stories.tsx', // '../src/components/Alert/Alert.stories.tsx', // '../src/components/Avatar/Avatar.stories.tsx', '../src/components/Button/Button.stories.tsx', diff --git a/packages/ui/src/components/Accordion/Accordion-old.stories.tsx b/packages/ui/src/components/Accordion/Accordion-old.stories.tsx new file mode 100644 index 00000000000..e11fc9edc0c --- /dev/null +++ b/packages/ui/src/components/Accordion/Accordion-old.stories.tsx @@ -0,0 +1,166 @@ +import React from 'react' + +import Accordion, { AccordionProps } from './Accordion' +import { Badge } from '../Badge' + +export default { + title: 'Displays/Accordion', + component: Accordion, +} + +export const OneItem = (args: AccordionProps) => ( + + + Title of the thing + Test badge + + } + id="first" + > + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + + + +) + +export const MultipleItems = (args: AccordionProps) => ( + + Title of the thing + } + id={'1'} + > + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + + + Title of the thing + } + id={'2'} + > + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + + + Title of the thing + } + id={'3'} + > + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + + + Title of the thing + } + id={'4'} + > + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + + + +) + +export const Bordered = (args: AccordionProps) => ( + + Title of the thing + } + id={'1'} + > + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + + + Title of the thing + } + id={'2'} + > + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + + + Title of the thing + } + id={'3'} + > + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + + + Title of the thing + } + id={'4'} + > + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + + + +) + +Bordered.args = { + type: 'bordered', +} + +export const LeftAlignedChevron = (args: AccordionProps) => ( + + + First item + Test badge + + } + id="first" + > + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + + + + Second item + + } + id="second" + > + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + + + +) + +// export const withDefaultActive = Multiple.bind({}) +// withDefaultActive.args = { +// defaultActiveId: [1], +// } + +// export const withIconLeft = Multiple.bind({}) +// withIconLeft.args = { +// iconPosition: 'left', +// } + +// export const withCustomIcon = Multiple.bind({}) +// withCustomIcon.args = { +// icon: , +// } diff --git a/packages/ui/src/components/Accordion/Accordion-old.tsx b/packages/ui/src/components/Accordion/Accordion-old.tsx new file mode 100644 index 00000000000..524bf7b9de9 --- /dev/null +++ b/packages/ui/src/components/Accordion/Accordion-old.tsx @@ -0,0 +1,137 @@ +import React, { createContext, useContext, useState } from 'react' + +import styleHandler from '../../lib/theme/styleHandler' + +import * as RadixAccordion from '@radix-ui/react-accordion' +import { IconChevronDown } from '../Icon/icons/IconChevronDown' +import { IconChevronUp } from '../Icon/icons/IconChevronUp' + +type Type = 'default' | 'bordered' +type Size = 'tiny' | 'small' | 'medium' | 'large' | 'xlarge' +type Align = 'left' | 'right' + +interface ContextValue { + bordered?: boolean + type: Type + justified: Boolean + chevronAlign: Align +} + +const AccordionContext = createContext({ + chevronAlign: 'left', + justified: true, + type: 'default', +}) + +export interface AccordionProps { + children?: React.ReactNode + className?: string + + onChange?: (item: string | string[]) => void + openBehaviour: 'single' | 'multiple' + type?: Type + defaultValue?: string | string[] | undefined + justified?: Boolean + chevronAlign?: Align +} + +function Accordion({ + children, + className, + onChange, + openBehaviour = 'multiple', + type = 'default', + defaultValue = undefined, + justified = false, + chevronAlign = 'left', +}: AccordionProps) { + const __styles = styleHandler('accordion') + + let containerClasses = [__styles.variants[type].base] + + if (className) { + containerClasses.push(className) + } + + const contextValue = { + chevronAlign, + justified, + type, + defaultValue, + } + + function handleOnChange(e: string | string[]) { + if (onChange) onChange(e) + const value = e == typeof String ? e.split(' ') : e + // setCurrentItems(e) + // console.log('about to change state') + // currentItems = e + // console.log('currentItems', currentItems) + } + + return ( + <> + +
{children}
+ + } + >
+ + ) +} + +interface ItemProps { + children?: React.ReactNode + className?: string + header: React.ReactNode + id: string + icon?: React.ReactNode + disabled?: boolean +} + +export function Item({ children, className, header, id, disabled }: ItemProps) { + const __styles = styleHandler('accordion') + const [open, setOpen] = useState(false) + + const { type, justified, chevronAlign } = useContext(AccordionContext) + + let triggerClasses = [__styles.variants[type].trigger] + if (justified) triggerClasses.push(__styles.justified) + if (className) triggerClasses.push(className) + + let chevronClasses = [__styles.chevron.base, __styles.chevron.align[chevronAlign]] + + if (open && !disabled) { + chevronClasses.unshift('!rotate-180') + } + + return ( + { + setOpen(!open) + }} + > + + {header} + {!disabled && ( + + )} + + +
{children}
+
+
+ ) +} + +Accordion.Item = Item +export default Accordion diff --git a/packages/ui/src/components/Accordion/Accordion.stories.tsx b/packages/ui/src/components/Accordion/Accordion.stories.tsx index 613caccc178..25886206394 100644 --- a/packages/ui/src/components/Accordion/Accordion.stories.tsx +++ b/packages/ui/src/components/Accordion/Accordion.stories.tsx @@ -1,199 +1,79 @@ -import React from 'react' +// Button.stories.ts|tsx -import Accordion, { AccordionProps } from './Accordion' +import type { Meta, StoryObj } from '@storybook/react' + +import { Accordion, AccordionItem } from './Accordion' import { Badge } from '../Badge' -export default { - title: 'Displays/Accordion', +const meta: Meta = { + /* 👇 The title prop is optional. + * See https://storybook.js.org/docs/react/configure/overview#configure-story-loading + * to learn how to generate automatic titles + */ + title: 'General/Accordion', component: Accordion, } -export const OneItem = (args: AccordionProps) => ( - - - - Title of the thing - - Test badge - - } - id="first" - > - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur - amet labore. - - - -) +export default meta -export const MultipleItems = (args: AccordionProps) => ( - - - Title of the thing - - } - id={'1'} - > - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur - amet labore. - - - - Title of the thing - - } - id={'2'} - > - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur - amet labore. - - - - Title of the thing - - } - id={'3'} - > - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur - amet labore. - - - - Title of the thing - - } - id={'4'} - > - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur - amet labore. - - - -) +type Story = StoryObj -export const Bordered = (args: AccordionProps) => ( - - - Title of the thing - - } - id={'1'} - > - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur - amet labore. - - - - Title of the thing - - } - id={'2'} - > - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur - amet labore. - - - - Title of the thing - - } - id={'3'} - > - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur - amet labore. - - - - Title of the thing - - } - id={'4'} - > - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur - amet labore. - - - -) +/* + *👇 Render functions are a framework specific feature to allow you control on how the component renders. + * See https://storybook.js.org/docs/react/api/csf + * to learn how to use render functions. + */ -Bordered.args = { - type: 'bordered', +export const Default = { + args: { + type: 'default', + }, + render: ({ children, type }: any) => ( + + + + Title of the thing + + Yes. It adheres to the WAI-ARIA design pattern. + + + Is it styled? + + Yes. It comes with default styles that matches the other components' aesthetic. + + + + Is it animated? + + Yes. It's animated by default, but you can disable it if you prefer. + + + + ), } -export const LeftAlignedChevron = (args: AccordionProps) => ( - - - - First item - - Test badge - - } - id="first" - > - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur - amet labore. - - - - - Second item - - - } - id="second" - > - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur - amet labore. - - - -) - -// export const withDefaultActive = Multiple.bind({}) -// withDefaultActive.args = { -// defaultActiveId: [1], -// } - -// export const withIconLeft = Multiple.bind({}) -// withIconLeft.args = { -// iconPosition: 'left', -// } - -// export const withCustomIcon = Multiple.bind({}) -// withCustomIcon.args = { -// icon: , -// } +export const Bordered = { + args: { + type: 'bordered', + }, + render: ({ children, type }: any) => ( + + + Is it accessible? + Yes. It adheres to the WAI-ARIA design pattern. + + + Is it styled? + + Yes. It comes with default styles that matches the other components' aesthetic. + + + + Is it animated? + + Yes. It's animated by default, but you can disable it if you prefer. + + + + ), +} diff --git a/packages/ui/src/components/Accordion/Accordion.tsx b/packages/ui/src/components/Accordion/Accordion.tsx index 7488ee5666c..80a8cbd7d3e 100644 --- a/packages/ui/src/components/Accordion/Accordion.tsx +++ b/packages/ui/src/components/Accordion/Accordion.tsx @@ -1,142 +1,234 @@ +import * as AccordionPrimitive from '@radix-ui/react-accordion' +import { cn } from '@ui/lib/utils' +import { VariantProps, cva, cx } from 'class-variance-authority' +import { ChevronDown } from 'lucide-react' import React, { createContext, useContext, useState } from 'react' -import styleHandler from '../../lib/theme/styleHandler' - -import * as RadixAccordion from '@radix-ui/react-accordion' -import { IconChevronDown } from '../Icon/icons/IconChevronDown' -import { IconChevronUp } from '../Icon/icons/IconChevronUp' - -type Type = 'default' | 'bordered' -type Size = 'tiny' | 'small' | 'medium' | 'large' | 'xlarge' -type Align = 'left' | 'right' - -interface ContextValue { - bordered?: boolean - type: Type - justified: Boolean - chevronAlign: Align -} - -const AccordionContext = createContext({ - chevronAlign: 'left', - justified: true, - type: 'default', +export type AccordionRootVariantsProps = VariantProps +const accordionRootVariants = cva('flex flex-col', { + variants: { + type: { + default: 'space-y-3', + bordered: '-space-y-px', + }, + defaultVariants: { + type: 'default', + }, + }, }) -export interface AccordionProps { - children?: React.ReactNode - className?: string - defaultActiveId?: (string | number)[] - icon?: React.ReactNode - iconPosition?: Align - onChange?: (item: string | string[]) => void +export type AccordionItemVariantsProps = VariantProps +const accordionItemVariants = cva( + 'group first:rounded-tl-md first:rounded-tr-md last:rounded-bl-md last:rounded-br-md', + { + variants: { + type: { + default: 'overflow-hidden', + bordered: 'border border-scale-700', + }, + justified: { + true: 'justify-between', + false: '', + }, + }, + } +) + +const accordionTriggerVariants = cva( + `flex flex-row items-center w-full text-left cursor-pointer focus-visible:ring-1 focus-visible:z-10 ring-scale-1100 + justify-between transition-all hover:underline [&[data-state=open]>svg]:rotate-180`, + { + variants: { + type: { + default: 'gap-3', + bordered: ` + px-6 py-4 + font-medium text-base bg-transparent + transition-colors hover:bg-scale-200 + overflow-hidden + group-first:rounded-tl-md group-first:rounded-tr-md + group-last:rounded-bl-md group-last:rounded-br-md`, + }, + }, + } +) + +const accordionContentVariants = cva('pb-4 pt-0', { + variants: { + type: { + default: '', + bordered: 'px-6', + }, + }, +}) + +type Type = AccordionRootVariantsProps['type'] +type Align = 'left' | 'right' | undefined + +interface ContextValue { + chevronAlign: Align + justified: boolean + type: Type + defaultValue: AccordionPrimitive.AccordionImplSingleProps['defaultValue'] +} + +interface AdditionalProps { openBehaviour: 'single' | 'multiple' + variant?: Type + // Add other additional props here + onChange?: (item: string | string[]) => void type?: Type - size?: Size - defaultValue?: string | string[] | undefined - justified?: Boolean + justified?: AccordionItemVariantsProps['justified'] chevronAlign?: Align } -function Accordion({ - children, - className, - onChange, - openBehaviour = 'multiple', - type = 'default', - defaultValue = undefined, - justified = false, - chevronAlign = 'left', -}: AccordionProps) { - const __styles = styleHandler('accordion') - - let containerClasses = [__styles.variants[type].base] - - if (className) { - containerClasses.push(className) - } - - const contextValue = { - chevronAlign, - justified, - type, - defaultValue, - } - - function handleOnChange(e: string | string[]) { - if (onChange) onChange(e) - const value = e == typeof String ? e.split(' ') : e - // setCurrentItems(e) - // console.log('about to change state') - // currentItems = e - // console.log('currentItems', currentItems) - } - - return ( - <> - {/* // - @ts-expect-error */} - -
{children}
- - } - >
- - ) +interface AccordionComponent + extends React.ForwardRefExoticComponent< + ExtendedAccordionProps & React.RefAttributes + > { + Item: typeof AccordionItem + Content: typeof AccordionContent + Trigger: typeof AccordionTrigger } -interface ItemProps { - children?: React.ReactNode - className?: string - header: React.ReactNode - id: string - icon?: React.ReactNode - disabled?: boolean +export interface AccordionSingleProps extends AccordionPrimitive.AccordionImplSingleProps { + openBehaviour: 'single' + value?: string + // Add other props specific to single accordion } -export function Item({ children, className, header, id, disabled }: ItemProps) { - const __styles = styleHandler('accordion') +export interface AccordionMultipleProps extends AccordionPrimitive.AccordionImplMultipleProps { + openBehaviour: 'multiple' + value?: string[] + // Add other props specific to multiple accordion +} + +type ExtendedAccordionProps = (AccordionSingleProps | AccordionMultipleProps) & AdditionalProps + +const AccordionContext = createContext({ + chevronAlign: 'left', + justified: false, // Set the default value to false + type: undefined, + defaultValue: undefined, +}) + +const Accordion: AccordionComponent = React.forwardRef( + ({ openBehaviour, type, chevronAlign, justified, defaultValue, ...props }, ref) => { + function handleOnChange(e: string | string[]) { + if (props.onChange) props.onChange(e) + } + + const contextValue = { + chevronAlign, + justified: justified || false, // Provide a default value of false + type: type || 'default', // Provide a default value for the type + defaultValue: Array.isArray(defaultValue) ? defaultValue.join('') : defaultValue, // Convert array to string + } + + if (openBehaviour === 'single') { + const { value, children, className, ...singleProps } = props as AccordionSingleProps + return ( + + {children} + + } + {...singleProps} + /> + ) + } else { + const { value, children, className, ...multipleProps } = props as AccordionMultipleProps + return ( + +
{props.children}
+ + } + {...multipleProps} + /> + ) + } + } +) as AccordionComponent + +export interface ItemAdditionalProps + extends React.ComponentPropsWithoutRef {} + +export const AccordionItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => { const [open, setOpen] = useState(false) - const { type, justified, chevronAlign } = useContext(AccordionContext) - - let triggerClasses = [__styles.variants[type].trigger] - if (justified) triggerClasses.push(__styles.justified) - if (className) triggerClasses.push(className) - - let chevronClasses = [__styles.chevron.base, __styles.chevron.align[chevronAlign]] - - if (open && !disabled) { - chevronClasses.unshift('!rotate-180') - } + let { type, justified } = useContext(AccordionContext) return ( - { setOpen(!open) }} - > - - {header} - {!disabled && ( - - )} - - -
{children}
-
-
+ {...props} + /> ) -} +}) +AccordionItem.displayName = AccordionPrimitive.Item.displayName -Accordion.Item = Item -export default Accordion +export const AccordionTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => { + const { type } = useContext(AccordionContext) + return ( + + + {children} + + + + ) +}) +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName + +export const AccordionContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => { + const { type } = useContext(AccordionContext) + return ( + +
{children}
+
+ ) +}) +AccordionContent.displayName = AccordionPrimitive.Content.displayName + +Accordion.Item = AccordionItem +Accordion.Content = AccordionContent +Accordion.Trigger = AccordionTrigger +export { Accordion } From 4514035a4cf266069aec6bbbd792a71c37a23c93 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Sun, 21 May 2023 22:50:11 +0800 Subject: [PATCH 020/694] Alert updated --- packages/ui/.storybook/main.ts | 2 +- .../components/Alert/Alert-old.stories.tsx | 135 ++++++++++++ .../ui/src/components/Alert/Alert-old.tsx | 84 ++++++++ .../ui/src/components/Alert/Alert.stories.tsx | 193 +++++++---------- packages/ui/src/components/Alert/Alert.tsx | 201 ++++++++++++------ 5 files changed, 426 insertions(+), 189 deletions(-) create mode 100644 packages/ui/src/components/Alert/Alert-old.stories.tsx create mode 100644 packages/ui/src/components/Alert/Alert-old.tsx diff --git a/packages/ui/.storybook/main.ts b/packages/ui/.storybook/main.ts index a166e5ddacc..90d3cf7e460 100644 --- a/packages/ui/.storybook/main.ts +++ b/packages/ui/.storybook/main.ts @@ -10,7 +10,7 @@ const config: StorybookConfig = { // // After all stories are cleaned, revert to wildcard import. stories: [ '../src/components/Accordion/Accordion.stories.tsx', - // '../src/components/Alert/Alert.stories.tsx', + '../src/components/Alert/Alert.stories.tsx', // '../src/components/Avatar/Avatar.stories.tsx', '../src/components/Button/Button.stories.tsx', // '../src/components/Checkbox/Checkbox.stories.tsx', diff --git a/packages/ui/src/components/Alert/Alert-old.stories.tsx b/packages/ui/src/components/Alert/Alert-old.stories.tsx new file mode 100644 index 00000000000..915e408018b --- /dev/null +++ b/packages/ui/src/components/Alert/Alert-old.stories.tsx @@ -0,0 +1,135 @@ +import React from 'react' + +import Alert, { AlertProps } from './Alert' + +export default { + title: 'Displays/Alerts', + component: Alert, +} + +export const Neutral = (args: AlertProps) => ( + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + +) + +export const Success = (args: AlertProps) => ( + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + +) + +export const SuccessWithIcon = (args: AlertProps) => ( + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + +) + +export const Danger = (args: AlertProps) => ( + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + +) + +export const DangerWithIcon = (args: AlertProps) => ( + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + +) + +export const Info = (args: AlertProps) => ( + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + +) + +export const InfoWithIcon = (args: AlertProps) => ( + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + +) + +export const Warning = (args: AlertProps) => ( + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + +) + +export const WarningWithIcon = (args: AlertProps) => ( + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + +) + +export const Closable = (args: AlertProps) => ( + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + +) + +export const WithAction = (args: AlertProps) => ( + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + +) + +Neutral.args = { + title: 'Success alert with icon', + withIcon: true, +} + +Success.args = { + title: 'Success alert', + variant: 'success', +} + +SuccessWithIcon.args = { + title: 'Success alert with icon', + variant: 'success', + withIcon: true, +} + +Danger.args = { + title: 'Danger alert', + variant: 'danger', +} + +DangerWithIcon.args = { + title: 'Danger alert with icon', + variant: 'danger', + withIcon: true, +} + +Info.args = { + title: 'Info alert', + variant: 'info', +} + +InfoWithIcon.args = { + title: 'Info alert with icon', + variant: 'info', + withIcon: true, +} + +Warning.args = { + title: 'Warning alert', + variant: 'warning', +} + +WarningWithIcon.args = { + title: 'Warning alert with icon', + variant: 'warning', + withIcon: true, +} + +Closable.args = { + title: 'Closable alert', + closable: true, +} + +WithAction.args = { + title: 'Alert with action', + variant: 'warning', + withIcon: true, + actions:
Hello
, +} diff --git a/packages/ui/src/components/Alert/Alert-old.tsx b/packages/ui/src/components/Alert/Alert-old.tsx new file mode 100644 index 00000000000..cf0b96fe810 --- /dev/null +++ b/packages/ui/src/components/Alert/Alert-old.tsx @@ -0,0 +1,84 @@ +import React, { useState } from 'react' +import { IconAlertTriangle } from '../Icon/icons/IconAlertTriangle' + +import { IconInfo } from '../Icon/icons/IconInfo' +import { IconX } from '../Icon/icons/IconX' + +import styleHandler from '../../lib/theme/styleHandler' +import { IconAlertOctagon } from '../Icon/icons/IconAlertOctagon' +import { IconCheckCircle } from '../Icon/icons/IconCheckCircle' + +export interface AlertProps { + variant?: 'success' | 'danger' | 'warning' | 'info' | 'neutral' + className?: string + title: string | React.ReactNode + withIcon?: boolean + closable?: boolean + children?: React.ReactNode + icon?: React.ReactNode + actions?: React.ReactNode +} + +const icons: Record<'success' | 'danger' | 'warning' | 'info' | 'neutral', React.ReactElement> = { + danger: , + success: , + warning: , + info: , + neutral: <>, +} + +function Alert({ + variant = 'neutral', + className, + title, + withIcon, + closable, + children, + icon, + actions, +}: AlertProps) { + let __styles = styleHandler('alert') + + const [visible, setVisible] = useState(true) + + let containerClasses = [__styles.base] + containerClasses.push(__styles.variant[variant].base) + + if (className) containerClasses.push(className) + + let descriptionClasses = [__styles.description, __styles.variant[variant].description] + let closeButtonClasses = [__styles.close] + + return ( + <> + {visible && ( +
+ {withIcon ? ( +
{withIcon && icons[variant]}
+ ) : null} + {icon && icon} +
+
+

+ {title} +

+
{children}
+
+ {actions} +
+ {closable && ( + + )} +
+ )} + + ) +} + +export default Alert diff --git a/packages/ui/src/components/Alert/Alert.stories.tsx b/packages/ui/src/components/Alert/Alert.stories.tsx index 915e408018b..de5cf016871 100644 --- a/packages/ui/src/components/Alert/Alert.stories.tsx +++ b/packages/ui/src/components/Alert/Alert.stories.tsx @@ -1,135 +1,92 @@ -import React from 'react' +// Button.stories.ts|tsx -import Alert, { AlertProps } from './Alert' +import type { Meta, StoryObj } from '@storybook/react' -export default { - title: 'Displays/Alerts', +import { Alert, AlertProps } from './Alert' + +import { IconAirplay } from '../Icon/icons/IconAirplay' +import { Terminal } from 'lucide-react' + +const meta: Meta = { + /* 👇 The title prop is optional. + * See https://storybook.js.org/docs/react/configure/overview#configure-story-loading + * to learn how to generate automatic titles + */ + title: 'General/Alert', component: Alert, } -export const Neutral = (args: AlertProps) => ( - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - -) +export default meta -export const Success = (args: AlertProps) => ( - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - -) +type Story = StoryObj -export const SuccessWithIcon = (args: AlertProps) => ( - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - -) +/* + *👇 Render functions are a framework specific feature to allow you control on how the component renders. + * See https://storybook.js.org/docs/react/api/csf + * to learn how to use render functions. + */ -export const Danger = (args: AlertProps) => ( - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - -) - -export const DangerWithIcon = (args: AlertProps) => ( - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - -) - -export const Info = (args: AlertProps) => ( - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - -) - -export const InfoWithIcon = (args: AlertProps) => ( - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - -) - -export const Warning = (args: AlertProps) => ( - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - -) - -export const WarningWithIcon = (args: AlertProps) => ( - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - -) - -export const Closable = (args: AlertProps) => ( - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - -) - -export const WithAction = (args: AlertProps) => ( - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - -) - -Neutral.args = { - title: 'Success alert with icon', - withIcon: true, +export const Info = { + args: { + variant: 'info', + withIcon: true, + }, + render: ({ withIcon, variant }: AlertProps) => ( + + Info Alert + This is an informative message for your application. + + ), } -Success.args = { - title: 'Success alert', - variant: 'success', +export const Danger = { + args: { + variant: 'danger', + withIcon: true, + }, + render: ({ withIcon, variant }: AlertProps) => ( + + Danger Alert + This is a dangerous warning for your application. + + ), } -SuccessWithIcon.args = { - title: 'Success alert with icon', - variant: 'success', - withIcon: true, +export const Warning = { + args: { + variant: 'warning', + withIcon: true, + }, + render: ({ withIcon, variant }: AlertProps) => ( + + Warning Alert + This is a warning message for your application. + + ), } -Danger.args = { - title: 'Danger alert', - variant: 'danger', +export const Success = { + args: { + variant: 'success', + withIcon: true, + }, + render: ({ withIcon, variant }: AlertProps) => ( + + Success Alert + This is a successful notification for your application. + + ), } -DangerWithIcon.args = { - title: 'Danger alert with icon', - variant: 'danger', - withIcon: true, -} - -Info.args = { - title: 'Info alert', - variant: 'info', -} - -InfoWithIcon.args = { - title: 'Info alert with icon', - variant: 'info', - withIcon: true, -} - -Warning.args = { - title: 'Warning alert', - variant: 'warning', -} - -WarningWithIcon.args = { - title: 'Warning alert with icon', - variant: 'warning', - withIcon: true, -} - -Closable.args = { - title: 'Closable alert', - closable: true, -} - -WithAction.args = { - title: 'Alert with action', - variant: 'warning', - withIcon: true, - actions:
Hello
, +export const Neutral = { + args: { + variant: 'neutral', + withIcon: true, + }, + render: ({ withIcon, variant }: AlertProps) => ( + + Neutral Alert + This is a neutral message for your application. + + ), } diff --git a/packages/ui/src/components/Alert/Alert.tsx b/packages/ui/src/components/Alert/Alert.tsx index cf0b96fe810..73f58c95b2b 100644 --- a/packages/ui/src/components/Alert/Alert.tsx +++ b/packages/ui/src/components/Alert/Alert.tsx @@ -1,84 +1,145 @@ -import React, { useState } from 'react' -import { IconAlertTriangle } from '../Icon/icons/IconAlertTriangle' +import * as React from 'react' +import { VariantProps, cva } from 'class-variance-authority' +import { cn } from '@ui/lib/utils' +import { AlertCircle, AlertOctagon, AlertTriangle, Check, Info } from 'lucide-react' -import { IconInfo } from '../Icon/icons/IconInfo' -import { IconX } from '../Icon/icons/IconX' +export type AlertRootVariantsProps = VariantProps +const alertRootVariants = cva( + `relative w-full + rounded-lg border + py-4 px-6 + [&>svg]:absolute [&>svg]:text-foreground [&>svg]:left-4 [&>svg]:top-4 [&>svg+div]:translate-y-[-3px] [&:has(svg)]:pl-11`, + { + variants: { + variant: { + danger: `bg-red-200 dark:bg-red-100 text-red-1200 border-red-700 [&>svg]:text-red-1200`, + warning: `bg-amber-200 dark:bg-amber-100 border-amber-700 [&>svg]:text-amber-1200`, + info: `bg-scale-400 border-scale-500 dark:bg-scale-100 dark:border-scale-300 [&>svg]:text-scale-1200`, + success: `bg-brand-300 dark:bg-brand-100 border-brand-700 [&>svg]:text-brand-900`, + neutral: `bg-scale-300 dark:bg-scale-300 border-scale-500 [&>svg]:text-scale-900`, + }, + }, + defaultVariants: { + variant: 'info', + }, + } +) -import styleHandler from '../../lib/theme/styleHandler' -import { IconAlertOctagon } from '../Icon/icons/IconAlertOctagon' -import { IconCheckCircle } from '../Icon/icons/IconCheckCircle' +const alertTitleVariants = cva('mb-1 font-medium leading-none tracking-tight', { + variants: { + variant: { + danger: `text-red-1200`, + warning: `text-amber-1200`, + info: `text-scale-1200`, + success: `text-brand-1200`, + neutral: `text-scale-1200`, + }, + defaultVariants: { + variant: 'info', + }, + }, +}) -export interface AlertProps { - variant?: 'success' | 'danger' | 'warning' | 'info' | 'neutral' - className?: string - title: string | React.ReactNode - withIcon?: boolean - closable?: boolean - children?: React.ReactNode - icon?: React.ReactNode - actions?: React.ReactNode +const alertDescriptionVariants = cva('text-sm [&_p]:leading-relaxed', { + variants: { + variant: { + danger: 'text-red-1100', + warning: 'text-amber-1100', + info: 'text-scale-1100', + success: 'text-brand-1100', + neutral: 'text-scale-1100', + }, + defaultVariants: { + variant: 'info', + }, + }, +}) + +interface ContextValue { + variant: AlertRootVariantsProps['variant'] } -const icons: Record<'success' | 'danger' | 'warning' | 'info' | 'neutral', React.ReactElement> = { - danger: , - success: , - warning: , - info: , +const AlertContext = React.createContext({ + variant: undefined, +}) + +// Define the Alert component +interface AlertProps + extends React.HTMLAttributes, + VariantProps { + withIcon: boolean +} + +interface AlertComponent + extends React.ForwardRefExoticComponent> { + Title: typeof AlertTitle + Description: typeof AlertDescription +} + +type AlertIconVariant = Exclude +const icons: Record = { + danger: , + success: , + warning: , + info: , neutral: <>, } -function Alert({ - variant = 'neutral', - className, - title, - withIcon, - closable, - children, - icon, - actions, -}: AlertProps) { - let __styles = styleHandler('alert') +const Alert = React.forwardRef( + ({ className, withIcon, variant = 'info', children, ...props }, ref) => { + const contextValue = { + variant, + } - const [visible, setVisible] = useState(true) + return ( +
+ {withIcon && icons[variant as AlertIconVariant]} + {children} + + } + /> + ) + } +) as AlertComponent - let containerClasses = [__styles.base] - containerClasses.push(__styles.variant[variant].base) +Alert.displayName = 'Alert' - if (className) containerClasses.push(className) +// Define the AlertTitle component as a subcomponent of Alert +interface AlertTitleProps extends React.HTMLAttributes {} - let descriptionClasses = [__styles.description, __styles.variant[variant].description] - let closeButtonClasses = [__styles.close] +const AlertTitle = React.forwardRef( + ({ className, ...props }, ref) => { + const { variant } = React.useContext(AlertContext) + console.log('variant', variant) + return
+ } +) - return ( - <> - {visible && ( -
- {withIcon ? ( -
{withIcon && icons[variant]}
- ) : null} - {icon && icon} -
-
-

- {title} -

-
{children}
-
- {actions} -
- {closable && ( - - )} -
- )} - - ) -} +AlertTitle.displayName = 'AlertTitle' -export default Alert +// Define the AlertDescription component as a subcomponent of Alert +interface AlertDescriptionProps extends React.HTMLAttributes {} + +const AlertDescription = React.forwardRef( + ({ className, ...props }, ref) => { + const { variant } = React.useContext(AlertContext) + return ( +
+ ) + } +) + +AlertDescription.displayName = 'AlertDescription' + +// Attach the subcomponents to the Alert component +Alert.Title = AlertTitle +Alert.Description = AlertDescription + +// Export the Alert component +export { Alert } From 53b3514efbd71d1358a1825b532d6f06a872f1a7 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Sun, 21 May 2023 23:15:52 +0800 Subject: [PATCH 021/694] updated Badge --- packages/ui/.storybook/main.ts | 5 +- .../ui/src/components/Badge/Badge.stories.tsx | 189 +++++++++++++----- packages/ui/src/components/Badge/Badge.tsx | 85 ++++---- 3 files changed, 190 insertions(+), 89 deletions(-) diff --git a/packages/ui/.storybook/main.ts b/packages/ui/.storybook/main.ts index 90d3cf7e460..aa4cf9f637c 100644 --- a/packages/ui/.storybook/main.ts +++ b/packages/ui/.storybook/main.ts @@ -1,7 +1,7 @@ const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin') -import type { StorybookConfig } from '@storybook/your-framework' +// import type { StorybookConfig } from '@storybook/your-framework' -const config: StorybookConfig = { +const config: any = { // // stories: [ // // '../src/components/**/*.stories.mdx', // // '../src/components/**/*.stories.@(js|jsx|ts|tsx)', @@ -11,6 +11,7 @@ const config: StorybookConfig = { stories: [ '../src/components/Accordion/Accordion.stories.tsx', '../src/components/Alert/Alert.stories.tsx', + '../src/components/Badge/Badge.stories.tsx', // '../src/components/Avatar/Avatar.stories.tsx', '../src/components/Button/Button.stories.tsx', // '../src/components/Checkbox/Checkbox.stories.tsx', diff --git a/packages/ui/src/components/Badge/Badge.stories.tsx b/packages/ui/src/components/Badge/Badge.stories.tsx index 32c5042e3bb..5567cb06464 100644 --- a/packages/ui/src/components/Badge/Badge.stories.tsx +++ b/packages/ui/src/components/Badge/Badge.stories.tsx @@ -1,64 +1,155 @@ -import { COLORS } from '../../lib/constants' -import { Badge } from './' +import type { Meta, StoryObj } from '@storybook/react' +import { Badge, BadgeProps } from './Badge' -export default { - title: 'Displays/Badge', +const meta: Meta = { + /* 👇 The title prop is optional. + * See https://storybook.js.org/docs/react/configure/overview#configure-story-loading + * to learn how to generate automatic titles + */ + title: 'General/Badge', component: Badge, } -const sizes: string[] = ['small', 'large'] +export default meta -export const Default = (args: any) => Hello world +type Story = StoryObj -export const withColor = (args: any) => Hello world - -export const withDot = (args: any) => Hello world - -export const large = (args: any) => Hello world - -export const withDotLarge = (args: any) => Hello world - -export const withCustomClassNames = (args: any) => Hello world - -export const allBadges = () => ( - <> -
- {sizes.map((size, sizeIndex) => ( - <> -

{size}

-
- {COLORS.map((x, colorIndex) => ( - // @ts-ignore - - Supabase - - ))} -
- - ))} -
- -) - -Default.args = {} - -withColor.args = { - color: 'red', +export const Outline = { + args: { + variant: 'outline', + }, + render: ({ variant }: BadgeProps) => Hello World, } -withDot.args = { - dot: true, +export const Brand = { + args: { + variant: 'brand', + }, + render: ({ variant }: BadgeProps) => Hello World, } -large.args = { - size: 'large', +export const Scale = { + args: { + variant: 'scale', + }, + render: ({ variant }: BadgeProps) => Hello World, } -withDotLarge.args = { - size: 'large', - dot: true, +export const Tomato = { + args: { + variant: 'tomato', + }, + render: ({ variant }: BadgeProps) => Hello World, } -withCustomClassNames.args = { - className: 'border-teal-100 border-2', +export const Red = { + args: { + variant: 'red', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Crimson = { + args: { + variant: 'crimson', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Pink = { + args: { + variant: 'pink', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Purple = { + args: { + variant: 'purple', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Violet = { + args: { + variant: 'violet', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Indigo = { + args: { + variant: 'indigo', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Blue = { + args: { + variant: 'blue', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Green = { + args: { + variant: 'green', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Grass = { + args: { + variant: 'grass', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Orange = { + args: { + variant: 'orange', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Yellow = { + args: { + variant: 'yellow', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Amber = { + args: { + variant: 'amber', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Gold = { + args: { + variant: 'gold', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Gray = { + args: { + variant: 'gray', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Slate = { + args: { + variant: 'slate', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Large = { + args: { + size: 'large', + }, + render: ({ size }: BadgeProps) => Hello World, } diff --git a/packages/ui/src/components/Badge/Badge.tsx b/packages/ui/src/components/Badge/Badge.tsx index af526dc7747..199d771d0f3 100644 --- a/packages/ui/src/components/Badge/Badge.tsx +++ b/packages/ui/src/components/Badge/Badge.tsx @@ -1,42 +1,51 @@ -import { AvailableColors } from '../../lib/constants' -import styleHandler from '../../lib/theme/styleHandler' +import * as React from 'react' +import { VariantProps, cva } from 'class-variance-authority' -interface Props { - color?: AvailableColors - children: string | React.ReactNode - size?: 'large' | 'small' - dot?: boolean - className?: string +import { cn } from '@ui/lib/utils' + +const badgeVariants = cva( + 'inline-flex items-center border rounded-full px-2.5 py-0.5 text-xs font-normal transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2', + { + variants: { + variant: { + outline: 'text-foreground', + brand: 'bg-brand-200 text-brand-1100 border border-brand-700', + scale: 'bg-scale-200 text-scale-1100 border border-scale-700', + tomato: `bg-tomato-200 text-tomato-1100 border border-tomato-700`, + red: `bg-red-200 text-red-1100 border border-red-700`, + crimson: `bg-crimson-200 text-crimson-1100 border border-crimson-700`, + pink: `bg-pink-200 text-pink-1100 border border-pink-700`, + purple: `bg-purple-200 text-purple-1100 border border-purple-700`, + violet: `bg-violet-200 text-violet-1100 border border-violet-700`, + indigo: `bg-indigo-200 text-indigo-1100 border border-indigo-700`, + blue: `bg-blue-200 text-blue-1100 border border-blue-700`, + green: `bg-green-200 text-green-1100 border border-green-700`, + grass: `bg-grass-200 text-grass-1100 border border-grass-700`, + orange: `bg-orange-200 text-orange-1100 border border-orange-700`, + yellow: `bg-yellow-200 text-yellow-1100 border border-yellow-700`, + amber: `bg-amber-200 text-amber-1100 border border-amber-700`, + gold: `bg-gold-200 text-gold-1100 border border-gold-700`, + gray: `bg-gray-200 text-gray-1100 border border-gray-700`, + slate: `bg-slate-200 text-slate-1100 border border-slate-700`, + }, + size: { + large: 'px-3 py-0.5 rounded-full text-sm', + }, + }, + defaultVariants: { + variant: 'scale', + }, + } +) + +export interface BadgeProps + extends React.HTMLAttributes, + VariantProps {} + +const Badge = ({ className, variant, size, ...props }: BadgeProps) => { + return
} -function Badge({ color = 'brand', children, size, dot, className }: Props) { - const __styles = styleHandler('badge') +Badge.displayName = 'Badge' - let classes = [__styles.base] - if (color) { - classes.push(__styles.color[color]) - } - if (size === 'large') { - classes.push(__styles.size.large) - } - if (className) { - classes.push(className) - } - - return ( - - {dot && ( - - - - )} - - {children} - - ) -} -export default Badge +export { Badge } From a4f6517e73a8f6ec9de896966f1772da18b802f6 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Mon, 22 May 2023 01:25:17 +0800 Subject: [PATCH 022/694] fix import issues --- package-lock.json | 6 +++++- packages/ui/.babelrc.json | 5 ++--- packages/ui/.storybook/main.ts | 17 +++-------------- packages/ui/package.json | 2 ++ 4 files changed, 12 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index d27e2ca9c96..b846e84fff0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45611,7 +45611,9 @@ "tailwindcss-radix": "^1.6.0" }, "devDependencies": { + "@babel/plugin-syntax-flow": "^7.21.4", "@babel/preset-env": "^7.21.4", + "@babel/preset-flow": "^7.21.4", "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.21.4", "@storybook/addon-actions": "^7.0.5", @@ -80109,7 +80111,9 @@ "ui": { "version": "file:packages/ui", "requires": { + "@babel/plugin-syntax-flow": "^7.21.4", "@babel/preset-env": "^7.21.4", + "@babel/preset-flow": "^7.21.4", "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.21.4", "@headlessui/react": "^1.0.0", @@ -80167,7 +80171,7 @@ "tailwind-merge": "^1.10.0", "tailwindcss": "^3.0.15", "tailwindcss-radix": "^1.6.0", - "tsconfig-paths-webpack-plugin": "*", + "tsconfig-paths-webpack-plugin": "^4.0.1", "typescript": "4.3.4" }, "dependencies": { diff --git a/packages/ui/.babelrc.json b/packages/ui/.babelrc.json index b5cf683b7e0..104d722287c 100644 --- a/packages/ui/.babelrc.json +++ b/packages/ui/.babelrc.json @@ -1,11 +1,10 @@ { - "sourceType": "unambiguous", "presets": [ [ "@babel/preset-env", { "targets": { - "chrome": 100 + "chrome": "58" } } ], @@ -13,4 +12,4 @@ "@babel/preset-react" ], "plugins": [] -} \ No newline at end of file +} diff --git a/packages/ui/.storybook/main.ts b/packages/ui/.storybook/main.ts index aa4cf9f637c..93e7c8ba318 100644 --- a/packages/ui/.storybook/main.ts +++ b/packages/ui/.storybook/main.ts @@ -2,28 +2,18 @@ const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin') // import type { StorybookConfig } from '@storybook/your-framework' const config: any = { - // // stories: [ - // // '../src/components/**/*.stories.mdx', - // // '../src/components/**/*.stories.@(js|jsx|ts|tsx)', - // // ], - // // TODO: Temporally Import one by one story and fix build issue. - // // After all stories are cleaned, revert to wildcard import. stories: [ '../src/components/Accordion/Accordion.stories.tsx', '../src/components/Alert/Alert.stories.tsx', '../src/components/Badge/Badge.stories.tsx', // '../src/components/Avatar/Avatar.stories.tsx', '../src/components/Button/Button.stories.tsx', - // '../src/components/Checkbox/Checkbox.stories.tsx', - // '../src/components/Collapsible/Collapsible.stories.tsx', + '../src/components/Checkbox/Checkbox.stories.tsx', + '../src/components/Collapsible/Collapsible.stories.tsx', // '../src/components/ContextMenu/ContextMenu.stories.tsx', - // '../src/components/Dropdown/Dropdown.stories.tsx', + '../src/components/Dropdown/Dropdown.stories.tsx', ], addons: [ - // '@storybook/addon-links', - // '@storybook/addon-essentials', - // '@storybook/addon-interactions', - // '@storybook/addon-actions', 'storybook-dark-mode', { name: '@storybook/addon-styling', @@ -35,7 +25,6 @@ const config: any = { }, '@storybook/addon-mdx-gfm', ], - docs: { autodocs: true, }, diff --git a/packages/ui/package.json b/packages/ui/package.json index ccdeeeefa95..256e0a39ff8 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -54,7 +54,9 @@ "tailwindcss-radix": "^1.6.0" }, "devDependencies": { + "@babel/plugin-syntax-flow": "^7.21.4", "@babel/preset-env": "^7.21.4", + "@babel/preset-flow": "^7.21.4", "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.21.4", "@storybook/addon-actions": "^7.0.5", From 02ba30934c4c85c929b8529ae0afb9eabc18580f Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Mon, 22 May 2023 01:47:50 +0800 Subject: [PATCH 023/694] adding form in --- package-lock.json | 81 ++++++++- packages/ui/.storybook/main.ts | 2 + packages/ui/package.json | 7 +- packages/ui/src/components/shadcn/form.tsx | 170 ++++++++++++++++++ .../components/shadcn/form/Form.stories.tsx | 88 +++++++++ packages/ui/src/components/shadcn/input.tsx | 30 ++++ packages/ui/src/components/shadcn/label.tsx | 19 ++ 7 files changed, 394 insertions(+), 3 deletions(-) create mode 100644 packages/ui/src/components/shadcn/form.tsx create mode 100644 packages/ui/src/components/shadcn/form/Form.stories.tsx create mode 100644 packages/ui/src/components/shadcn/input.tsx create mode 100644 packages/ui/src/components/shadcn/label.tsx diff --git a/package-lock.json b/package-lock.json index b846e84fff0..9914a9fcb9d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3913,6 +3913,14 @@ "react": ">= 16" } }, + "node_modules/@hookform/resolvers": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.1.0.tgz", + "integrity": "sha512-z0A8K+Nxq+f83Whm/ajlwE6VtQlp/yPHZnXw7XWVPIGm1Vx0QV8KThU3BpbBRfAZ7/dYqCKKBNnQh85BkmBKkA==", + "peerDependencies": { + "react-hook-form": "^7.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.9.5", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", @@ -37862,6 +37870,21 @@ "node": ">=6" } }, + "node_modules/react-hook-form": { + "version": "7.43.9", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.43.9.tgz", + "integrity": "sha512-AUDN3Pz2NSeoxQ7Hs6OhQhDr6gtF9YRuutGDwPQqhSUAHJSgGl2VeY3qN19MG0SucpjgDiuMJ4iC5T5uB+eaNQ==", + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18" + } + }, "node_modules/react-hot-toast": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.3.0.tgz", @@ -45465,6 +45488,14 @@ "resolved": "https://registry.npmjs.org/yup-password/-/yup-password-0.2.2.tgz", "integrity": "sha512-2PHfqGWtbXg4OfDV7VKFIb3hyEaYgTYpEORnFqgGAYqzENWmGzWMoeGvJg2Ohmq6maTRxhJzLZpNTITrqlZTrA==" }, + "node_modules/zod": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", + "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/zwitch": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", @@ -45574,14 +45605,17 @@ "license": "MIT", "dependencies": { "@headlessui/react": "^1.0.0", + "@hookform/resolvers": "^3.1.0", "@mertasan/tailwindcss-variables": "^2.0.1", "@radix-ui/react-accordion": "^1.1.0", "@radix-ui/react-collapsible": "^1.0.1", "@radix-ui/react-context-menu": "^2.1.2", "@radix-ui/react-dialog": "^1.0.2", "@radix-ui/react-dropdown-menu": "^2.0.3", + "@radix-ui/react-id": "^0.0.6", "@radix-ui/react-popover": "^1.0.4", "@radix-ui/react-portal": "^1.0.1", + "@radix-ui/react-slot": "^1.0.1", "@radix-ui/react-tabs": "^1.0.2", "@supabase/auth-helpers-react": "^0.3.1", "@tailwindcss/forms": "^0.4.0", @@ -45602,13 +45636,15 @@ "react-copy-to-clipboard": "^5.1.0", "react-countdown": "^2.3.5", "react-feather": "^2.0.10", + "react-hook-form": "^7.43.9", "react-markdown": "^8.0.3", "react-syntax-highlighter": "^15.5.0", "remark-gfm": "^3.0.1", "sse.js": "^0.6.1", "tailwind-merge": "^1.10.0", "tailwindcss": "^3.0.15", - "tailwindcss-radix": "^1.6.0" + "tailwindcss-radix": "^1.6.0", + "zod": "^3.21.4" }, "devDependencies": { "@babel/plugin-syntax-flow": "^7.21.4", @@ -45639,6 +45675,17 @@ "typescript": "4.3.4" } }, + "packages/ui/node_modules/@radix-ui/react-id": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-0.0.6.tgz", + "integrity": "sha512-PzmraF34fYggsYvTIZVJ5S68WMp3aKUN3HkSmGnz4zn9zpRjkAbbg7Xn3ueQI3FQsLWKgyUfnpsmWFDndpcqYg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0" + } + }, "packages/ui/node_modules/@storybook/addon-actions": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.0.9.tgz", @@ -49173,6 +49220,12 @@ "integrity": "sha512-JJCXydOFWMDpCP4q13iEplA503MQO3xLoZiKum+955ZCtHINWnx26CUxVxxFQu/uLb4LW3ge15ZpzIkXKkJ8oQ==", "requires": {} }, + "@hookform/resolvers": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.1.0.tgz", + "integrity": "sha512-z0A8K+Nxq+f83Whm/ajlwE6VtQlp/yPHZnXw7XWVPIGm1Vx0QV8KThU3BpbBRfAZ7/dYqCKKBNnQh85BkmBKkA==", + "requires": {} + }, "@humanwhocodes/config-array": { "version": "0.9.5", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", @@ -75511,6 +75564,12 @@ } } }, + "react-hook-form": { + "version": "7.43.9", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.43.9.tgz", + "integrity": "sha512-AUDN3Pz2NSeoxQ7Hs6OhQhDr6gtF9YRuutGDwPQqhSUAHJSgGl2VeY3qN19MG0SucpjgDiuMJ4iC5T5uB+eaNQ==", + "requires": {} + }, "react-hot-toast": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.3.0.tgz", @@ -80117,14 +80176,17 @@ "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.21.4", "@headlessui/react": "^1.0.0", + "@hookform/resolvers": "^3.1.0", "@mertasan/tailwindcss-variables": "^2.0.1", "@radix-ui/react-accordion": "^1.1.0", "@radix-ui/react-collapsible": "^1.0.1", "@radix-ui/react-context-menu": "^2.1.2", "@radix-ui/react-dialog": "^1.0.2", "@radix-ui/react-dropdown-menu": "^2.0.3", + "@radix-ui/react-id": "^0.0.6", "@radix-ui/react-popover": "^1.0.4", "@radix-ui/react-portal": "^1.0.1", + "@radix-ui/react-slot": "^1.0.1", "@radix-ui/react-tabs": "^1.0.2", "@storybook/addon-actions": "^7.0.5", "@storybook/addon-mdx-gfm": "^7.0.5", @@ -80160,6 +80222,7 @@ "react-copy-to-clipboard": "^5.1.0", "react-countdown": "^2.3.5", "react-feather": "^2.0.10", + "react-hook-form": "^7.43.9", "react-markdown": "^8.0.3", "react-syntax-highlighter": "^15.5.0", "remark-gfm": "^3.0.1", @@ -80172,9 +80235,18 @@ "tailwindcss": "^3.0.15", "tailwindcss-radix": "^1.6.0", "tsconfig-paths-webpack-plugin": "^4.0.1", - "typescript": "4.3.4" + "typescript": "4.3.4", + "zod": "^3.21.4" }, "dependencies": { + "@radix-ui/react-id": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-0.0.6.tgz", + "integrity": "sha512-PzmraF34fYggsYvTIZVJ5S68WMp3aKUN3HkSmGnz4zn9zpRjkAbbg7Xn3ueQI3FQsLWKgyUfnpsmWFDndpcqYg==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, "@storybook/addon-actions": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.0.9.tgz", @@ -82642,6 +82714,11 @@ "resolved": "https://registry.npmjs.org/yup-password/-/yup-password-0.2.2.tgz", "integrity": "sha512-2PHfqGWtbXg4OfDV7VKFIb3hyEaYgTYpEORnFqgGAYqzENWmGzWMoeGvJg2Ohmq6maTRxhJzLZpNTITrqlZTrA==" }, + "zod": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", + "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==" + }, "zwitch": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", diff --git a/packages/ui/.storybook/main.ts b/packages/ui/.storybook/main.ts index 93e7c8ba318..b138249d283 100644 --- a/packages/ui/.storybook/main.ts +++ b/packages/ui/.storybook/main.ts @@ -12,6 +12,8 @@ const config: any = { '../src/components/Collapsible/Collapsible.stories.tsx', // '../src/components/ContextMenu/ContextMenu.stories.tsx', '../src/components/Dropdown/Dropdown.stories.tsx', + + '../src/components/shadcn/form/Form.stories.tsx', ], addons: [ 'storybook-dark-mode', diff --git a/packages/ui/package.json b/packages/ui/package.json index 256e0a39ff8..221d6ee632d 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -17,14 +17,17 @@ }, "dependencies": { "@headlessui/react": "^1.0.0", + "@hookform/resolvers": "^3.1.0", "@mertasan/tailwindcss-variables": "^2.0.1", "@radix-ui/react-accordion": "^1.1.0", "@radix-ui/react-collapsible": "^1.0.1", "@radix-ui/react-context-menu": "^2.1.2", "@radix-ui/react-dialog": "^1.0.2", "@radix-ui/react-dropdown-menu": "^2.0.3", + "@radix-ui/react-id": "^0.0.6", "@radix-ui/react-popover": "^1.0.4", "@radix-ui/react-portal": "^1.0.1", + "@radix-ui/react-slot": "^1.0.1", "@radix-ui/react-tabs": "^1.0.2", "@supabase/auth-helpers-react": "^0.3.1", "@tailwindcss/forms": "^0.4.0", @@ -45,13 +48,15 @@ "react-copy-to-clipboard": "^5.1.0", "react-countdown": "^2.3.5", "react-feather": "^2.0.10", + "react-hook-form": "^7.43.9", "react-markdown": "^8.0.3", "react-syntax-highlighter": "^15.5.0", "remark-gfm": "^3.0.1", "sse.js": "^0.6.1", "tailwind-merge": "^1.10.0", "tailwindcss": "^3.0.15", - "tailwindcss-radix": "^1.6.0" + "tailwindcss-radix": "^1.6.0", + "zod": "^3.21.4" }, "devDependencies": { "@babel/plugin-syntax-flow": "^7.21.4", diff --git a/packages/ui/src/components/shadcn/form.tsx b/packages/ui/src/components/shadcn/form.tsx new file mode 100644 index 00000000000..80674dfe20b --- /dev/null +++ b/packages/ui/src/components/shadcn/form.tsx @@ -0,0 +1,170 @@ +import * as React from 'react' +import * as LabelPrimitive from '@radix-ui/react-label' +import { Slot } from '@radix-ui/react-slot' +import { + Controller, + ControllerProps, + FieldPath, + FieldValues, + FormProvider, + useFormContext, +} from 'react-hook-form' + +import { cn } from '@ui/lib/utils' +import { Label } from '@ui/components/shadcn/label' + +import { useId } from '@radix-ui/react-id' + +const Form = FormProvider + +type FormFieldContextValue< + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath = FieldPath +> = { + name: TName +} + +const FormFieldContext = React.createContext({} as FormFieldContextValue) + +const FormField = < + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath = FieldPath +>({ + ...props +}: ControllerProps) => { + return ( + + + + ) +} + +const useFormField = () => { + const fieldContext = React.useContext(FormFieldContext) + const itemContext = React.useContext(FormItemContext) + const { getFieldState, formState } = useFormContext() + + const fieldState = getFieldState(fieldContext.name, formState) + + if (!fieldContext) { + throw new Error('useFormField should be used within ') + } + + const { id } = itemContext + + return { + id, + name: fieldContext.name, + formItemId: `${id}-form-item`, + formDescriptionId: `${id}-form-item-description`, + formMessageId: `${id}-form-item-message`, + ...fieldState, + } +} + +type FormItemContextValue = { + id: string +} + +const FormItemContext = React.createContext({} as FormItemContextValue) + +const FormItem = React.forwardRef>( + ({ className, ...props }, ref) => { + // const id = React.useId() + const id = useId() + console.log('id', id) + return ( + +
+ + ) + } +) +FormItem.displayName = 'FormItem' + +const FormLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => { + const { error, formItemId } = useFormField() + + return ( + email settings. + )} /> - + ) }, } + +export const CalendarExample = { + args: {}, + render: ({}: any) => { + const FormSchema = z.object({ + dob: z.date({ + required_error: 'A date of birth is required.', + }), + }) + + const form = useForm>({ + resolver: zodResolver(FormSchema), + }) + + function onSubmit(data: z.infer) { + toast({ + title: 'You submitted the following values:', + description: ( +
+            {JSON.stringify(data, null, 2)}
+          
+ ), + }) + } + + return ( +
+ + ( + + Date of birth + + + + + + + + date > new Date() || date < new Date('1900-01-01')} + initialFocus + /> + + + Your date of birth is used to calculate your age. + + + )} + /> + + + + ) + }, +} diff --git a/packages/ui/src/components/shadcn/input.tsx b/packages/ui/src/components/shadcn/input.tsx index 16a52c8bf59..97902149ee0 100644 --- a/packages/ui/src/components/shadcn/input.tsx +++ b/packages/ui/src/components/shadcn/input.tsx @@ -10,13 +10,7 @@ const Input = React.forwardRef( , + React.ComponentPropsWithoutRef +>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => ( + + + +)) +PopoverContent.displayName = PopoverPrimitive.Content.displayName + +export { Popover, PopoverTrigger, PopoverContent } diff --git a/packages/ui/src/components/shadcn/select.tsx b/packages/ui/src/components/shadcn/select.tsx new file mode 100644 index 00000000000..917c7cf6bc0 --- /dev/null +++ b/packages/ui/src/components/shadcn/select.tsx @@ -0,0 +1,118 @@ +import * as React from 'react' +import * as SelectPrimitive from '@radix-ui/react-select' +import { Check, ChevronDown } from 'lucide-react' + +import { cn } from '@ui/lib/utils' + +const Select = SelectPrimitive.Root + +const SelectGroup = SelectPrimitive.Group + +const SelectValue = SelectPrimitive.Value + +const SelectTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + {children} + + + + +)) +SelectTrigger.displayName = SelectPrimitive.Trigger.displayName + +const SelectContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, position = 'popper', ...props }, ref) => ( + + + + {children} + + + +)) +SelectContent.displayName = SelectPrimitive.Content.displayName + +const SelectLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SelectLabel.displayName = SelectPrimitive.Label.displayName + +const SelectItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + + {children} + +)) +SelectItem.displayName = SelectPrimitive.Item.displayName + +const SelectSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SelectSeparator.displayName = SelectPrimitive.Separator.displayName + +export { + Select, + SelectGroup, + SelectValue, + SelectTrigger, + SelectContent, + SelectLabel, + SelectItem, + SelectSeparator, +} diff --git a/packages/ui/src/components/shadcn/toast.tsx b/packages/ui/src/components/shadcn/toast.tsx new file mode 100644 index 00000000000..0596ac420ff --- /dev/null +++ b/packages/ui/src/components/shadcn/toast.tsx @@ -0,0 +1,122 @@ +import * as React from 'react' +import * as ToastPrimitives from '@radix-ui/react-toast' +import { VariantProps, cva } from 'class-variance-authority' +import { X } from 'lucide-react' + +import { cn } from '@ui/lib/utils' + +const ToastProvider = ToastPrimitives.Provider + +const ToastViewport = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +ToastViewport.displayName = ToastPrimitives.Viewport.displayName + +const toastVariants = cva( + 'data-[swipe=move]:transition-none group relative pointer-events-auto flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full data-[state=closed]:slide-out-to-right-full', + { + variants: { + variant: { + default: 'bg-background border', + destructive: + 'group destructive border-destructive bg-destructive text-destructive-foreground', + }, + }, + defaultVariants: { + variant: 'default', + }, + } +) + +const Toast = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & VariantProps +>(({ className, variant, ...props }, ref) => { + return ( + + ) +}) +Toast.displayName = ToastPrimitives.Root.displayName + +const ToastAction = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +ToastAction.displayName = ToastPrimitives.Action.displayName + +const ToastClose = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)) +ToastClose.displayName = ToastPrimitives.Close.displayName + +const ToastTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +ToastTitle.displayName = ToastPrimitives.Title.displayName + +const ToastDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +ToastDescription.displayName = ToastPrimitives.Description.displayName + +type ToastProps = React.ComponentPropsWithoutRef + +type ToastActionElement = React.ReactElement + +export { + type ToastProps, + type ToastActionElement, + ToastProvider, + ToastViewport, + Toast, + ToastTitle, + ToastDescription, + ToastClose, + ToastAction, +} diff --git a/packages/ui/src/components/shadcn/use-toast.tsx b/packages/ui/src/components/shadcn/use-toast.tsx new file mode 100644 index 00000000000..c4cbb92e510 --- /dev/null +++ b/packages/ui/src/components/shadcn/use-toast.tsx @@ -0,0 +1,187 @@ +// Inspired by react-hot-toast library +import * as React from 'react' + +import { ToastActionElement, type ToastProps } from '@ui/components/shadcn/toast' + +const TOAST_LIMIT = 1 +const TOAST_REMOVE_DELAY = 1000000 + +type ToasterToast = ToastProps & { + id: string + title?: React.ReactNode + description?: React.ReactNode + action?: ToastActionElement +} + +const actionTypes = { + ADD_TOAST: 'ADD_TOAST', + UPDATE_TOAST: 'UPDATE_TOAST', + DISMISS_TOAST: 'DISMISS_TOAST', + REMOVE_TOAST: 'REMOVE_TOAST', +} as const + +let count = 0 + +function genId() { + count = (count + 1) % Number.MAX_VALUE + return count.toString() +} + +type ActionType = typeof actionTypes + +type Action = + | { + type: ActionType['ADD_TOAST'] + toast: ToasterToast + } + | { + type: ActionType['UPDATE_TOAST'] + toast: Partial + } + | { + type: ActionType['DISMISS_TOAST'] + toastId?: ToasterToast['id'] + } + | { + type: ActionType['REMOVE_TOAST'] + toastId?: ToasterToast['id'] + } + +interface State { + toasts: ToasterToast[] +} + +const toastTimeouts = new Map>() + +const addToRemoveQueue = (toastId: string) => { + if (toastTimeouts.has(toastId)) { + return + } + + const timeout = setTimeout(() => { + toastTimeouts.delete(toastId) + dispatch({ + type: 'REMOVE_TOAST', + toastId: toastId, + }) + }, TOAST_REMOVE_DELAY) + + toastTimeouts.set(toastId, timeout) +} + +export const reducer = (state: State, action: Action): State => { + switch (action.type) { + case 'ADD_TOAST': + return { + ...state, + toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT), + } + + case 'UPDATE_TOAST': + return { + ...state, + toasts: state.toasts.map((t) => (t.id === action.toast.id ? { ...t, ...action.toast } : t)), + } + + case 'DISMISS_TOAST': { + const { toastId } = action + + // ! Side effects ! - This could be extracted into a dismissToast() action, + // but I'll keep it here for simplicity + if (toastId) { + addToRemoveQueue(toastId) + } else { + state.toasts.forEach((toast) => { + addToRemoveQueue(toast.id) + }) + } + + return { + ...state, + toasts: state.toasts.map((t) => + t.id === toastId || toastId === undefined + ? { + ...t, + open: false, + } + : t + ), + } + } + case 'REMOVE_TOAST': + if (action.toastId === undefined) { + return { + ...state, + toasts: [], + } + } + return { + ...state, + toasts: state.toasts.filter((t) => t.id !== action.toastId), + } + } +} + +const listeners: Array<(state: State) => void> = [] + +let memoryState: State = { toasts: [] } + +function dispatch(action: Action) { + memoryState = reducer(memoryState, action) + listeners.forEach((listener) => { + listener(memoryState) + }) +} + +interface Toast extends Omit {} + +function toast({ ...props }: Toast) { + const id = genId() + + const update = (props: ToasterToast) => + dispatch({ + type: 'UPDATE_TOAST', + toast: { ...props, id }, + }) + const dismiss = () => dispatch({ type: 'DISMISS_TOAST', toastId: id }) + + dispatch({ + type: 'ADD_TOAST', + toast: { + ...props, + id, + open: true, + onOpenChange: (open) => { + if (!open) dismiss() + }, + }, + }) + + return { + id: id, + dismiss, + update, + } +} + +function useToast() { + const [state, setState] = React.useState(memoryState) + + React.useEffect(() => { + listeners.push(setState) + return () => { + const index = listeners.indexOf(setState) + if (index > -1) { + listeners.splice(index, 1) + } + } + }, [state]) + + return { + ...state, + toast, + dismiss: (toastId?: string) => dispatch({ type: 'DISMISS_TOAST', toastId }), + } +} + +export { useToast, toast } diff --git a/packages/ui/tailwind.config.js b/packages/ui/tailwind.config.js index 1dff83a81f0..d717c4d8d49 100644 --- a/packages/ui/tailwind.config.js +++ b/packages/ui/tailwind.config.js @@ -1,4 +1,5 @@ const config = require('config/tailwind.config') +const { fontFamily } = require('tailwindcss/defaultTheme') module.exports = config({ content: [ @@ -11,6 +12,13 @@ module.exports = config({ './_blog/*.mdx', ], theme: { + container: { + center: true, + padding: '2rem', + screens: { + '2xl': '1400px', + }, + }, extend: { keyframes: { 'flash-code': { @@ -22,8 +30,63 @@ module.exports = config({ 'flash-code': 'flash-code 1s forwards', 'flash-code-slow': 'flash-code 2s forwards', }, + colors: { + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))', + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))', + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))', + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))', + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))', + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))', + }, + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))', + }, + }, + borderRadius: { + lg: `var(--radius)`, + md: `calc(var(--radius) - 2px)`, + sm: 'calc(var(--radius) - 4px)', + }, + fontFamily: { + sans: ['var(--font-sans)', ...fontFamily.sans], + }, + keyframes: { + 'accordion-down': { + from: { height: 0 }, + to: { height: 'var(--radix-accordion-content-height)' }, + }, + 'accordion-up': { + from: { height: 'var(--radix-accordion-content-height)' }, + to: { height: 0 }, + }, + }, + animation: { + 'accordion-down': 'accordion-down 0.2s ease-out', + 'accordion-up': 'accordion-up 0.2s ease-out', + }, }, }, }) - -// module.exports = require('config/tailwind.config') From bdaa61c45e18615be414f1ab5d64d9ecba1c4a16 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Tue, 23 May 2023 17:53:59 +0800 Subject: [PATCH 025/694] add dropdown and stories directory --- packages/ui/.storybook/main.ts | 3 +- .../src/components/shadcn/dropdown-menu.tsx | 185 ++++++++++++++++++ .../shadcn/stories/DropdownMenu.stories.tsx | 146 ++++++++++++++ .../shadcn/{form => stories}/Form.stories.tsx | 6 +- 4 files changed, 336 insertions(+), 4 deletions(-) create mode 100644 packages/ui/src/components/shadcn/dropdown-menu.tsx create mode 100644 packages/ui/src/components/shadcn/stories/DropdownMenu.stories.tsx rename packages/ui/src/components/shadcn/{form => stories}/Form.stories.tsx (98%) diff --git a/packages/ui/.storybook/main.ts b/packages/ui/.storybook/main.ts index b138249d283..4fa3c2f60e0 100644 --- a/packages/ui/.storybook/main.ts +++ b/packages/ui/.storybook/main.ts @@ -12,8 +12,9 @@ const config: any = { '../src/components/Collapsible/Collapsible.stories.tsx', // '../src/components/ContextMenu/ContextMenu.stories.tsx', '../src/components/Dropdown/Dropdown.stories.tsx', + // '../src/components/Form/Form.stories.tsx', - '../src/components/shadcn/form/Form.stories.tsx', + '../src/components/shadcn/stories/**/*.tsx', ], addons: [ 'storybook-dark-mode', diff --git a/packages/ui/src/components/shadcn/dropdown-menu.tsx b/packages/ui/src/components/shadcn/dropdown-menu.tsx new file mode 100644 index 00000000000..5d6d2d03b87 --- /dev/null +++ b/packages/ui/src/components/shadcn/dropdown-menu.tsx @@ -0,0 +1,185 @@ +'use client' + +import * as React from 'react' +import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu' +import { Check, ChevronRight, Circle } from 'lucide-react' + +import { cn } from '@ui/lib/utils' + +const DropdownMenu = DropdownMenuPrimitive.Root + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger + +const DropdownMenuGroup = DropdownMenuPrimitive.Group + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal + +const DropdownMenuSub = DropdownMenuPrimitive.Sub + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup + +const DropdownMenuSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)) +DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName + +const DropdownMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)) +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName + +const DropdownMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName + +const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName + +const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName + +const DropdownMenuShortcut = ({ className, ...props }: React.HTMLAttributes) => { + return +} +DropdownMenuShortcut.displayName = 'DropdownMenuShortcut' + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, +} diff --git a/packages/ui/src/components/shadcn/stories/DropdownMenu.stories.tsx b/packages/ui/src/components/shadcn/stories/DropdownMenu.stories.tsx new file mode 100644 index 00000000000..72a7a1f7e2b --- /dev/null +++ b/packages/ui/src/components/shadcn/stories/DropdownMenu.stories.tsx @@ -0,0 +1,146 @@ +import type { Meta, StoryObj } from '@storybook/react' +import { + Cloud, + CreditCard, + Github, + Keyboard, + LifeBuoy, + LogOut, + Mail, + MessageSquare, + Plus, + PlusCircle, + Settings, + User, + UserPlus, + Users, +} from 'lucide-react' + +import { Button } from '@ui/components/shadcn/button' +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuPortal, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuTrigger, +} from '@ui/components/shadcn/dropdown-menu' + +const meta: Meta = { + /* 👇 The title prop is optional. + * See https://storybook.js.org/docs/react/configure/overview#configure-story-loading + * to learn how to generate automatic titles + */ + title: 'shadcn/Dropdow Menu', + component: DropdownMenu, +} + +export default meta + +type Story = StoryObj + +/* + *👇 Render functions are a framework specific feature to allow you control on how the component renders. + * See https://storybook.js.org/docs/react/api/csf + * to learn how to use render functions. + */ + +export const Default = { + args: { + // children: 'Hello world', + // type: 'primary', + }, + render: ({}) => ( + + + + + + My Account + + + + + Profile + ⇧⌘P + + + + Billing + ⌘B + + + + Settings + ⌘S + + + + Keyboard shortcuts + ⌘K + + + + + + + Team + + + + + Invite users + + + + + + Email + + + + Message + + + + + More... + + + + + + + New Team + ⌘+T + + + + + + GitHub + + + + Support + + + + API + + + + + Log out + ⇧⌘Q + + + + ), +} diff --git a/packages/ui/src/components/shadcn/form/Form.stories.tsx b/packages/ui/src/components/shadcn/stories/Form.stories.tsx similarity index 98% rename from packages/ui/src/components/shadcn/form/Form.stories.tsx rename to packages/ui/src/components/shadcn/stories/Form.stories.tsx index edbeed4af12..e95b83311dc 100644 --- a/packages/ui/src/components/shadcn/form/Form.stories.tsx +++ b/packages/ui/src/components/shadcn/stories/Form.stories.tsx @@ -3,7 +3,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { IdProvider } from '@radix-ui/react-id' import type { Meta, StoryObj } from '@storybook/react' -import { Button } from './../button' +import { Button } from '../button' import { cn } from '@ui/lib/utils' import { format } from 'date-fns' import { CalendarIcon } from 'lucide-react' @@ -21,8 +21,8 @@ import { FormItem, FormLabel, FormMessage, -} from './../form' -import { Input } from './../input' +} from '../form' +import { Input } from '../input' const meta: Meta = { /* 👇 The title prop is optional. From 5f0fa068947c14418cccf20d9bd818f24b584732 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Tue, 23 May 2023 17:54:04 +0800 Subject: [PATCH 026/694] fix animation --- packages/ui/src/components/Alert/Alert.tsx | 6 +++--- packages/ui/tailwind.config.js | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/ui/src/components/Alert/Alert.tsx b/packages/ui/src/components/Alert/Alert.tsx index 73f58c95b2b..a89ea6ce8d2 100644 --- a/packages/ui/src/components/Alert/Alert.tsx +++ b/packages/ui/src/components/Alert/Alert.tsx @@ -1,7 +1,7 @@ -import * as React from 'react' -import { VariantProps, cva } from 'class-variance-authority' import { cn } from '@ui/lib/utils' -import { AlertCircle, AlertOctagon, AlertTriangle, Check, Info } from 'lucide-react' +import { VariantProps, cva } from 'class-variance-authority' +import { AlertOctagon, AlertTriangle, Check, Info } from 'lucide-react' +import * as React from 'react' export type AlertRootVariantsProps = VariantProps const alertRootVariants = cva( diff --git a/packages/ui/tailwind.config.js b/packages/ui/tailwind.config.js index d717c4d8d49..be1b40a860b 100644 --- a/packages/ui/tailwind.config.js +++ b/packages/ui/tailwind.config.js @@ -89,4 +89,5 @@ module.exports = config({ }, }, }, + plugins: [require('tailwindcss-animate')], }) From cff1c275ed63879e8217110a7b74a7822417250e Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Tue, 23 May 2023 19:33:46 +0800 Subject: [PATCH 027/694] fix issue with styles --- apps/www/components/ImageFadeStack.tsx | 3 +- package-lock.json | 127 ++++++++++++++++++- packages/ui/.storybook/preview.css | 25 ++-- packages/ui/build/css/themes/dark.css | 2 +- packages/ui/build/css/themes/light.css | 4 +- packages/ui/index.tsx | 3 + packages/ui/internals/tokens/build-tokens.js | 3 +- packages/ui/package.json | 2 + 8 files changed, 151 insertions(+), 18 deletions(-) diff --git a/apps/www/components/ImageFadeStack.tsx b/apps/www/components/ImageFadeStack.tsx index 34075797046..b8f7236d408 100644 --- a/apps/www/components/ImageFadeStack.tsx +++ b/apps/www/components/ImageFadeStack.tsx @@ -1,7 +1,6 @@ import Image from 'next/image' import React, { useState, useEffect } from 'react' -import { IconPauseCircle, IconPlayCircle } from 'ui' -import { cn } from '~/../../packages/ui/src/utils/cn' +import { IconPauseCircle, IconPlayCircle, cn } from 'ui' interface ImageFadeStackProps { autoplay?: boolean diff --git a/package-lock.json b/package-lock.json index c55cecd9c09..5d7e33ef8ad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6156,6 +6156,14 @@ "resolved": "https://registry.npmjs.org/@radix-ui/colors/-/colors-0.1.8.tgz", "integrity": "sha512-jwRMXYwC0hUo0mv6wGpuw254Pd9p/R6Td5xsRpOmaWkUHlooNWqVcadgyzlRumMq3xfOTXwJReU0Jv+EIy4Jbw==" }, + "node_modules/@radix-ui/number": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.0.tgz", + "integrity": "sha512-Ofwh/1HX69ZfJRiRBMTy7rgjAzHmwe4kW9C9Y99HTRUcYLUuVT0KESFj15rPjRgKJs20GPq8Bm5aEDJ8DuA3vA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, "node_modules/@radix-ui/primitive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz", @@ -6385,6 +6393,19 @@ "react": "^16.8 || ^17.0 || ^18.0" } }, + "node_modules/@radix-ui/react-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.0.1.tgz", + "integrity": "sha512-qcfbS3B8hTYmEO44RNcXB6pegkxRsJIbdxTMu0PEX0Luv5O2DvTIwwVYxQfUwLpM88EL84QRPLOLgwUSApMsLQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.2" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, "node_modules/@radix-ui/react-menu": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.0.4.tgz", @@ -6525,6 +6546,39 @@ "react-dom": "^16.8 || ^17.0 || ^18.0" } }, + "node_modules/@radix-ui/react-select": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-1.2.1.tgz", + "integrity": "sha512-GULRMITaOHNj79BZvQs3iZO0+f2IgI8g5HDhMi7Bnc13t7IlG86NFtOCfTLme4PNZdEtU+no+oGgcl6IFiphpQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/number": "1.0.0", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-collection": "1.0.2", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.3", + "@radix-ui/react-focus-guards": "1.0.0", + "@radix-ui/react-focus-scope": "1.0.2", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-popper": "1.1.1", + "@radix-ui/react-portal": "1.0.2", + "@radix-ui/react-primitive": "1.0.2", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0", + "@radix-ui/react-use-previous": "1.0.0", + "@radix-ui/react-visually-hidden": "1.0.2", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, "node_modules/@radix-ui/react-slot": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.1.tgz", @@ -6627,6 +6681,17 @@ "react": "^16.8 || ^17.0 || ^18.0" } }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.0.0.tgz", + "integrity": "sha512-RG2K8z/K7InnOKpq6YLDmT49HGjNmrK+fr82UCVKT2sW0GYfVnYp4wZWBooT/EYfQ5faA9uIjvsuMMhH61rheg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, "node_modules/@radix-ui/react-use-rect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.0.tgz", @@ -45621,8 +45686,10 @@ "@radix-ui/react-dialog": "^1.0.2", "@radix-ui/react-dropdown-menu": "^2.0.3", "@radix-ui/react-id": "^0.0.6", + "@radix-ui/react-label": "^2.0.1", "@radix-ui/react-popover": "^1.0.4", "@radix-ui/react-portal": "^1.0.1", + "@radix-ui/react-select": "^1.2.1", "@radix-ui/react-slot": "^1.0.1", "@radix-ui/react-tabs": "^1.0.2", "@supabase/auth-helpers-react": "^0.3.1", @@ -50949,6 +51016,14 @@ "resolved": "https://registry.npmjs.org/@radix-ui/colors/-/colors-0.1.8.tgz", "integrity": "sha512-jwRMXYwC0hUo0mv6wGpuw254Pd9p/R6Td5xsRpOmaWkUHlooNWqVcadgyzlRumMq3xfOTXwJReU0Jv+EIy4Jbw==" }, + "@radix-ui/number": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.0.tgz", + "integrity": "sha512-Ofwh/1HX69ZfJRiRBMTy7rgjAzHmwe4kW9C9Y99HTRUcYLUuVT0KESFj15rPjRgKJs20GPq8Bm5aEDJ8DuA3vA==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, "@radix-ui/primitive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz", @@ -51127,6 +51202,15 @@ "@radix-ui/react-use-layout-effect": "1.0.0" } }, + "@radix-ui/react-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.0.1.tgz", + "integrity": "sha512-qcfbS3B8hTYmEO44RNcXB6pegkxRsJIbdxTMu0PEX0Luv5O2DvTIwwVYxQfUwLpM88EL84QRPLOLgwUSApMsLQ==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.2" + } + }, "@radix-ui/react-menu": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.0.4.tgz", @@ -51239,6 +51323,35 @@ "@radix-ui/react-use-controllable-state": "1.0.0" } }, + "@radix-ui/react-select": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-1.2.1.tgz", + "integrity": "sha512-GULRMITaOHNj79BZvQs3iZO0+f2IgI8g5HDhMi7Bnc13t7IlG86NFtOCfTLme4PNZdEtU+no+oGgcl6IFiphpQ==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/number": "1.0.0", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-collection": "1.0.2", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.3", + "@radix-ui/react-focus-guards": "1.0.0", + "@radix-ui/react-focus-scope": "1.0.2", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-popper": "1.1.1", + "@radix-ui/react-portal": "1.0.2", + "@radix-ui/react-primitive": "1.0.2", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0", + "@radix-ui/react-use-previous": "1.0.0", + "@radix-ui/react-visually-hidden": "1.0.2", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + } + }, "@radix-ui/react-slot": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.1.tgz", @@ -51318,6 +51431,14 @@ "@babel/runtime": "^7.13.10" } }, + "@radix-ui/react-use-previous": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.0.0.tgz", + "integrity": "sha512-RG2K8z/K7InnOKpq6YLDmT49HGjNmrK+fr82UCVKT2sW0GYfVnYp4wZWBooT/EYfQ5faA9uIjvsuMMhH61rheg==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, "@radix-ui/react-use-rect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.0.tgz", @@ -80230,8 +80351,10 @@ "@radix-ui/react-dialog": "^1.0.2", "@radix-ui/react-dropdown-menu": "^2.0.3", "@radix-ui/react-id": "^0.0.6", + "@radix-ui/react-label": "^2.0.1", "@radix-ui/react-popover": "^1.0.4", "@radix-ui/react-portal": "^1.0.1", + "@radix-ui/react-select": "*", "@radix-ui/react-slot": "^1.0.1", "@radix-ui/react-tabs": "^1.0.2", "@storybook/addon-actions": "^7.0.5", @@ -80279,9 +80402,9 @@ "storybook": "^7.0.5", "storybook-dark-mode": "^3.0.0", "style-dictionary": "^3.7.1", - "tailwind-merge": "^1.10.0", + "tailwind-merge": "^1.12.0", "tailwindcss": "^3.0.15", - "tailwindcss-animate": "*", + "tailwindcss-animate": "^1.0.5", "tailwindcss-radix": "^1.6.0", "tsconfig-paths-webpack-plugin": "^4.0.1", "typescript": "4.3.4", diff --git a/packages/ui/.storybook/preview.css b/packages/ui/.storybook/preview.css index e03c2e1e6f7..3f34bda100e 100644 --- a/packages/ui/.storybook/preview.css +++ b/packages/ui/.storybook/preview.css @@ -14,14 +14,16 @@ } */ @layer base { :root { - --background: 0 0% 100%; - --foreground: 222.2 47.4% 11.2%; + --background: var(--theme-variables-background-body); /* --background: 0 0% 100%; */ + --foreground: var(--theme-variables-background); /* --foreground: 222.2 47.4% 11.2%; */ --muted: 210 40% 96.1%; --muted-foreground: 215.4 16.3% 46.9%; - --popover: 0 0% 100%; - --popover-foreground: 222.2 47.4% 11.2%; + --popover: var(--theme-variables-background); /* --popover: 0 0% 100%; */ + --popover-foreground: var( + --text-color-body-default + ); /* --popover-foreground: 222.2 47.4% 11.2%; */ --card: 0 0% 100%; --card-foreground: 222.2 47.4% 11.2%; @@ -47,19 +49,21 @@ } .dark { - --background: 224 71% 4%; - --foreground: 213 31% 91%; + --background: var(--theme-variables-background-body); /* --background: 224 71% 4%; */ + --foreground: var(--theme-variables-background); /* --foreground: 213 31% 91%; */ - --muted: 223 47% 11%; + --muted: var(--background-color-body); /* --muted: 223 47% 11%; */ --muted-foreground: 215.4 16.3% 56.9%; - --popover: 224 71% 4%; - --popover-foreground: 215 20.2% 65.1%; + --popover: var(--theme-variables-background); /* --popover: 224 71% 4%; */ + --popover-foreground: var( + --text-color-body-default + ); /* --popover-foreground: 215 20.2% 65.1%; */ --card: 224 71% 4%; --card-foreground: 213 31% 91%; - --border: 216 34% 17%; + --border: var(--border-color-default); /* --border: 216 34% 17%; */ --input: 216 34% 17%; --primary: 210 40% 98%; @@ -95,4 +99,5 @@ .light .docs-story, .dark .docs-story { @apply bg-background text-foreground; + font-family: 'Circular std'; } diff --git a/packages/ui/build/css/themes/dark.css b/packages/ui/build/css/themes/dark.css index a4d60d733a8..ee6386aca3e 100644 --- a/packages/ui/build/css/themes/dark.css +++ b/packages/ui/build/css/themes/dark.css @@ -1,6 +1,6 @@ /** * Do not edit directly - * Generated on Sat, 20 May 2023 09:00:49 GMT + * Generated on Tue, 23 May 2023 11:26:05 GMT */ .dark { diff --git a/packages/ui/build/css/themes/light.css b/packages/ui/build/css/themes/light.css index 0f4e33acc9f..2a74cbca46a 100644 --- a/packages/ui/build/css/themes/light.css +++ b/packages/ui/build/css/themes/light.css @@ -1,9 +1,9 @@ /** * Do not edit directly - * Generated on Sat, 20 May 2023 09:00:49 GMT + * Generated on Tue, 23 May 2023 11:26:05 GMT */ -.light { +:root { --utility-github-background: 0deg 0% 100%; --utility-mix-negative: 0deg 0% 100%; --utility-mix-positive: 0deg 0% 0%; diff --git a/packages/ui/index.tsx b/packages/ui/index.tsx index b6b1c095d9a..8565a9b0731 100644 --- a/packages/ui/index.tsx +++ b/packages/ui/index.tsx @@ -67,6 +67,9 @@ export * from './src/components/Command' // banners export * from './src/layout/banners' +// utils +export * from './src/lib/utils/cn' + // config // export { default as Config } from './../ui.config' diff --git a/packages/ui/internals/tokens/build-tokens.js b/packages/ui/internals/tokens/build-tokens.js index 1478218edc7..85f518e8abe 100644 --- a/packages/ui/internals/tokens/build-tokens.js +++ b/packages/ui/internals/tokens/build-tokens.js @@ -178,6 +178,7 @@ themeFiles.map(function (filePath, i) { const buildTailwindFiles = filePath.includes('root') // i === 0 const fileName = fileNameCleaner(filePath) const rootTheme = filePath.includes('root') + console.log('here', filePath ?? 'no file path', rootTheme) const SD = StyleDictionary.extend( getStyleDictionaryConfig( // determine wether to include the root theme properties with each theme @@ -185,7 +186,7 @@ themeFiles.map(function (filePath, i) { rootTheme ? 'dark' : fileName, 'themes', buildTailwindFiles, - false + fileName === 'light' ? true : false ) ) SD.buildAllPlatforms() diff --git a/packages/ui/package.json b/packages/ui/package.json index 97661ec88e8..ec27bcb311e 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -25,8 +25,10 @@ "@radix-ui/react-dialog": "^1.0.2", "@radix-ui/react-dropdown-menu": "^2.0.3", "@radix-ui/react-id": "^0.0.6", + "@radix-ui/react-label": "^2.0.1", "@radix-ui/react-popover": "^1.0.4", "@radix-ui/react-portal": "^1.0.1", + "@radix-ui/react-select": "^1.2.1", "@radix-ui/react-slot": "^1.0.1", "@radix-ui/react-tabs": "^1.0.2", "@supabase/auth-helpers-react": "^0.3.1", From 9745cdcb971f0e668c305c0babb03c147a27bead Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Tue, 23 May 2023 20:27:59 +0800 Subject: [PATCH 028/694] move all new components out --- apps/docs/components/Navigation/Footer.tsx | 166 ++++---- .../Navigation/NavigationMenu/HomeMenu.tsx | 6 +- .../NavigationMenuRefListItems.tsx | 14 +- .../Accordion/Accordion-old.stories.tsx | 166 -------- .../components/Accordion/Accordion-old.tsx | 137 ------- .../Accordion/Accordion.stories.tsx | 227 +++++++---- .../ui/src/components/Accordion/Accordion.tsx | 319 ++++++---------- .../components/Alert/Alert-old.stories.tsx | 135 ------- .../ui/src/components/Alert/Alert-old.tsx | 84 ---- .../ui/src/components/Alert/Alert.stories.tsx | 193 ++++++---- packages/ui/src/components/Alert/Alert.tsx | 201 ++++------ packages/ui/src/components/Alert/index.tsx | 2 +- packages/ui/src/components/Badge/Badge.tsx | 2 +- .../ui/src/components/Button/Button-old.tsx | 159 -------- .../components/Button/Button.stories-old.tsx | 234 ------------ .../src/components/Button/Button.stories.tsx | 359 ++++++++++-------- .../ui/src/components/Button/Button.test.tsx | 2 +- packages/ui/src/components/Button/Button.tsx | 303 +++++++-------- packages/ui/src/components/Button/index.tsx | 2 +- .../updated/Accordion/Accordion.stories.tsx | 79 ++++ .../shadcn/updated/Accordion/Accordion.tsx | 235 ++++++++++++ .../shadcn/updated/Alert/Alert.stories.tsx | 92 +++++ .../components/shadcn/updated/Alert/Alert.tsx | 145 +++++++ .../shadcn/updated/Button/Button.stories.tsx | 175 +++++++++ .../shadcn/updated/Button/Button.tsx | 192 ++++++++++ 25 files changed, 1802 insertions(+), 1827 deletions(-) delete mode 100644 packages/ui/src/components/Accordion/Accordion-old.stories.tsx delete mode 100644 packages/ui/src/components/Accordion/Accordion-old.tsx delete mode 100644 packages/ui/src/components/Alert/Alert-old.stories.tsx delete mode 100644 packages/ui/src/components/Alert/Alert-old.tsx delete mode 100644 packages/ui/src/components/Button/Button-old.tsx delete mode 100644 packages/ui/src/components/Button/Button.stories-old.tsx create mode 100644 packages/ui/src/components/shadcn/updated/Accordion/Accordion.stories.tsx create mode 100644 packages/ui/src/components/shadcn/updated/Accordion/Accordion.tsx create mode 100644 packages/ui/src/components/shadcn/updated/Alert/Alert.stories.tsx create mode 100644 packages/ui/src/components/shadcn/updated/Alert/Alert.tsx create mode 100644 packages/ui/src/components/shadcn/updated/Button/Button.stories.tsx create mode 100644 packages/ui/src/components/shadcn/updated/Button/Button.tsx diff --git a/apps/docs/components/Navigation/Footer.tsx b/apps/docs/components/Navigation/Footer.tsx index e14892a8f39..c9347b74647 100644 --- a/apps/docs/components/Navigation/Footer.tsx +++ b/apps/docs/components/Navigation/Footer.tsx @@ -55,105 +55,85 @@ const Footer = () => ( ))}
- - - - + + +
diff --git a/apps/docs/components/Navigation/NavigationMenu/HomeMenu.tsx b/apps/docs/components/Navigation/NavigationMenu/HomeMenu.tsx index fb51bb98ba7..761d23a317c 100644 --- a/apps/docs/components/Navigation/NavigationMenu/HomeMenu.tsx +++ b/apps/docs/components/Navigation/NavigationMenu/HomeMenu.tsx @@ -1,12 +1,10 @@ import { useTheme } from 'common/Providers' -import Image from 'next/image' import Link from 'next/link' import { useRouter } from 'next/router' import { Fragment } from 'react' -import { Badge } from '~/../../packages/ui' -import { cn } from 'ui/src/utils/cn' -import { HOMEPAGE_MENU_ITEMS } from './NavigationMenu.constants' +import { Badge, cn } from 'ui' import HomeMenuIconPicker from './HomeMenuIconPicker' +import { HOMEPAGE_MENU_ITEMS } from './NavigationMenu.constants' const NavigationMenuHome = () => { const router = useRouter() diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenuRefListItems.tsx b/apps/docs/components/Navigation/NavigationMenu/NavigationMenuRefListItems.tsx index 0069b311827..59c0cca96e6 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenuRefListItems.tsx +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenuRefListItems.tsx @@ -1,18 +1,14 @@ import * as Accordion from '@radix-ui/react-accordion' +import Image from 'next/image' import Link from 'next/link' import { useRouter } from 'next/router' -import { IconChevronLeft, IconChevronUp } from 'ui' -import * as NavItems from './NavigationMenu.constants' - -import Image from 'next/image' - -import RevVersionDropdown from '~/components/RefVersionDropdown' -import { useMenuActiveRefId } from '~/hooks/useMenuState' - import React, { Fragment } from 'react' -import { cn } from 'ui/src/utils/cn' +import { IconChevronLeft, IconChevronUp, cn } from 'ui' +import RevVersionDropdown from '~/components/RefVersionDropdown' import { ICommonItem, ICommonSection } from '~/components/reference/Reference.types' +import { useMenuActiveRefId } from '~/hooks/useMenuState' import HomeMenuIconPicker from './HomeMenuIconPicker' +import * as NavItems from './NavigationMenu.constants' import { deepFilterSections } from './NavigationMenu.utils' const HeaderLink = React.memo(function HeaderLink(props: any) { diff --git a/packages/ui/src/components/Accordion/Accordion-old.stories.tsx b/packages/ui/src/components/Accordion/Accordion-old.stories.tsx deleted file mode 100644 index e11fc9edc0c..00000000000 --- a/packages/ui/src/components/Accordion/Accordion-old.stories.tsx +++ /dev/null @@ -1,166 +0,0 @@ -import React from 'react' - -import Accordion, { AccordionProps } from './Accordion' -import { Badge } from '../Badge' - -export default { - title: 'Displays/Accordion', - component: Accordion, -} - -export const OneItem = (args: AccordionProps) => ( - - - Title of the thing - Test badge - - } - id="first" - > - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - - - -) - -export const MultipleItems = (args: AccordionProps) => ( - - Title of the thing - } - id={'1'} - > - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - - - Title of the thing - } - id={'2'} - > - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - - - Title of the thing - } - id={'3'} - > - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - - - Title of the thing - } - id={'4'} - > - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - - - -) - -export const Bordered = (args: AccordionProps) => ( - - Title of the thing - } - id={'1'} - > - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - - - Title of the thing - } - id={'2'} - > - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - - - Title of the thing - } - id={'3'} - > - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - - - Title of the thing - } - id={'4'} - > - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - - - -) - -Bordered.args = { - type: 'bordered', -} - -export const LeftAlignedChevron = (args: AccordionProps) => ( - - - First item - Test badge - - } - id="first" - > - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - - - - Second item - - } - id="second" - > - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - - - -) - -// export const withDefaultActive = Multiple.bind({}) -// withDefaultActive.args = { -// defaultActiveId: [1], -// } - -// export const withIconLeft = Multiple.bind({}) -// withIconLeft.args = { -// iconPosition: 'left', -// } - -// export const withCustomIcon = Multiple.bind({}) -// withCustomIcon.args = { -// icon: , -// } diff --git a/packages/ui/src/components/Accordion/Accordion-old.tsx b/packages/ui/src/components/Accordion/Accordion-old.tsx deleted file mode 100644 index 524bf7b9de9..00000000000 --- a/packages/ui/src/components/Accordion/Accordion-old.tsx +++ /dev/null @@ -1,137 +0,0 @@ -import React, { createContext, useContext, useState } from 'react' - -import styleHandler from '../../lib/theme/styleHandler' - -import * as RadixAccordion from '@radix-ui/react-accordion' -import { IconChevronDown } from '../Icon/icons/IconChevronDown' -import { IconChevronUp } from '../Icon/icons/IconChevronUp' - -type Type = 'default' | 'bordered' -type Size = 'tiny' | 'small' | 'medium' | 'large' | 'xlarge' -type Align = 'left' | 'right' - -interface ContextValue { - bordered?: boolean - type: Type - justified: Boolean - chevronAlign: Align -} - -const AccordionContext = createContext({ - chevronAlign: 'left', - justified: true, - type: 'default', -}) - -export interface AccordionProps { - children?: React.ReactNode - className?: string - - onChange?: (item: string | string[]) => void - openBehaviour: 'single' | 'multiple' - type?: Type - defaultValue?: string | string[] | undefined - justified?: Boolean - chevronAlign?: Align -} - -function Accordion({ - children, - className, - onChange, - openBehaviour = 'multiple', - type = 'default', - defaultValue = undefined, - justified = false, - chevronAlign = 'left', -}: AccordionProps) { - const __styles = styleHandler('accordion') - - let containerClasses = [__styles.variants[type].base] - - if (className) { - containerClasses.push(className) - } - - const contextValue = { - chevronAlign, - justified, - type, - defaultValue, - } - - function handleOnChange(e: string | string[]) { - if (onChange) onChange(e) - const value = e == typeof String ? e.split(' ') : e - // setCurrentItems(e) - // console.log('about to change state') - // currentItems = e - // console.log('currentItems', currentItems) - } - - return ( - <> - -
{children}
- - } - >
- - ) -} - -interface ItemProps { - children?: React.ReactNode - className?: string - header: React.ReactNode - id: string - icon?: React.ReactNode - disabled?: boolean -} - -export function Item({ children, className, header, id, disabled }: ItemProps) { - const __styles = styleHandler('accordion') - const [open, setOpen] = useState(false) - - const { type, justified, chevronAlign } = useContext(AccordionContext) - - let triggerClasses = [__styles.variants[type].trigger] - if (justified) triggerClasses.push(__styles.justified) - if (className) triggerClasses.push(className) - - let chevronClasses = [__styles.chevron.base, __styles.chevron.align[chevronAlign]] - - if (open && !disabled) { - chevronClasses.unshift('!rotate-180') - } - - return ( - { - setOpen(!open) - }} - > - - {header} - {!disabled && ( - - )} - - -
{children}
-
-
- ) -} - -Accordion.Item = Item -export default Accordion diff --git a/packages/ui/src/components/Accordion/Accordion.stories.tsx b/packages/ui/src/components/Accordion/Accordion.stories.tsx index 25886206394..e11fc9edc0c 100644 --- a/packages/ui/src/components/Accordion/Accordion.stories.tsx +++ b/packages/ui/src/components/Accordion/Accordion.stories.tsx @@ -1,79 +1,166 @@ -// Button.stories.ts|tsx +import React from 'react' -import type { Meta, StoryObj } from '@storybook/react' - -import { Accordion, AccordionItem } from './Accordion' +import Accordion, { AccordionProps } from './Accordion' import { Badge } from '../Badge' -const meta: Meta = { - /* 👇 The title prop is optional. - * See https://storybook.js.org/docs/react/configure/overview#configure-story-loading - * to learn how to generate automatic titles - */ - title: 'General/Accordion', +export default { + title: 'Displays/Accordion', component: Accordion, } -export default meta - -type Story = StoryObj - -/* - *👇 Render functions are a framework specific feature to allow you control on how the component renders. - * See https://storybook.js.org/docs/react/api/csf - * to learn how to use render functions. - */ - -export const Default = { - args: { - type: 'default', - }, - render: ({ children, type }: any) => ( - - - +export const OneItem = (args: AccordionProps) => ( + + Title of the thing - - Yes. It adheres to the WAI-ARIA design pattern. - - - Is it styled? - - Yes. It comes with default styles that matches the other components' aesthetic. - - - - Is it animated? - - Yes. It's animated by default, but you can disable it if you prefer. - - - - ), + Test badge + + } + id="first" + > + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + + + +) + +export const MultipleItems = (args: AccordionProps) => ( + + Title of the thing + } + id={'1'} + > + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + + + Title of the thing + } + id={'2'} + > + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + + + Title of the thing + } + id={'3'} + > + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + + + Title of the thing + } + id={'4'} + > + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + + + +) + +export const Bordered = (args: AccordionProps) => ( + + Title of the thing + } + id={'1'} + > + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + + + Title of the thing + } + id={'2'} + > + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + + + Title of the thing + } + id={'3'} + > + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + + + Title of the thing + } + id={'4'} + > + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + + + +) + +Bordered.args = { + type: 'bordered', } -export const Bordered = { - args: { - type: 'bordered', - }, - render: ({ children, type }: any) => ( - - - Is it accessible? - Yes. It adheres to the WAI-ARIA design pattern. - - - Is it styled? - - Yes. It comes with default styles that matches the other components' aesthetic. - - - - Is it animated? - - Yes. It's animated by default, but you can disable it if you prefer. - - - - ), -} +export const LeftAlignedChevron = (args: AccordionProps) => ( + + + First item + Test badge + + } + id="first" + > + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + + + + Second item + + } + id="second" + > + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + + + +) + +// export const withDefaultActive = Multiple.bind({}) +// withDefaultActive.args = { +// defaultActiveId: [1], +// } + +// export const withIconLeft = Multiple.bind({}) +// withIconLeft.args = { +// iconPosition: 'left', +// } + +// export const withCustomIcon = Multiple.bind({}) +// withCustomIcon.args = { +// icon: , +// } diff --git a/packages/ui/src/components/Accordion/Accordion.tsx b/packages/ui/src/components/Accordion/Accordion.tsx index 80a8cbd7d3e..524bf7b9de9 100644 --- a/packages/ui/src/components/Accordion/Accordion.tsx +++ b/packages/ui/src/components/Accordion/Accordion.tsx @@ -1,234 +1,137 @@ -import * as AccordionPrimitive from '@radix-ui/react-accordion' -import { cn } from '@ui/lib/utils' -import { VariantProps, cva, cx } from 'class-variance-authority' -import { ChevronDown } from 'lucide-react' import React, { createContext, useContext, useState } from 'react' -export type AccordionRootVariantsProps = VariantProps -const accordionRootVariants = cva('flex flex-col', { - variants: { - type: { - default: 'space-y-3', - bordered: '-space-y-px', - }, - defaultVariants: { - type: 'default', - }, - }, -}) +import styleHandler from '../../lib/theme/styleHandler' -export type AccordionItemVariantsProps = VariantProps -const accordionItemVariants = cva( - 'group first:rounded-tl-md first:rounded-tr-md last:rounded-bl-md last:rounded-br-md', - { - variants: { - type: { - default: 'overflow-hidden', - bordered: 'border border-scale-700', - }, - justified: { - true: 'justify-between', - false: '', - }, - }, - } -) +import * as RadixAccordion from '@radix-ui/react-accordion' +import { IconChevronDown } from '../Icon/icons/IconChevronDown' +import { IconChevronUp } from '../Icon/icons/IconChevronUp' -const accordionTriggerVariants = cva( - `flex flex-row items-center w-full text-left cursor-pointer focus-visible:ring-1 focus-visible:z-10 ring-scale-1100 - justify-between transition-all hover:underline [&[data-state=open]>svg]:rotate-180`, - { - variants: { - type: { - default: 'gap-3', - bordered: ` - px-6 py-4 - font-medium text-base bg-transparent - transition-colors hover:bg-scale-200 - overflow-hidden - group-first:rounded-tl-md group-first:rounded-tr-md - group-last:rounded-bl-md group-last:rounded-br-md`, - }, - }, - } -) - -const accordionContentVariants = cva('pb-4 pt-0', { - variants: { - type: { - default: '', - bordered: 'px-6', - }, - }, -}) - -type Type = AccordionRootVariantsProps['type'] -type Align = 'left' | 'right' | undefined +type Type = 'default' | 'bordered' +type Size = 'tiny' | 'small' | 'medium' | 'large' | 'xlarge' +type Align = 'left' | 'right' interface ContextValue { - chevronAlign: Align - justified: boolean + bordered?: boolean type: Type - defaultValue: AccordionPrimitive.AccordionImplSingleProps['defaultValue'] + justified: Boolean + chevronAlign: Align } -interface AdditionalProps { - openBehaviour: 'single' | 'multiple' - variant?: Type - // Add other additional props here - onChange?: (item: string | string[]) => void - type?: Type - justified?: AccordionItemVariantsProps['justified'] - chevronAlign?: Align -} - -interface AccordionComponent - extends React.ForwardRefExoticComponent< - ExtendedAccordionProps & React.RefAttributes - > { - Item: typeof AccordionItem - Content: typeof AccordionContent - Trigger: typeof AccordionTrigger -} - -export interface AccordionSingleProps extends AccordionPrimitive.AccordionImplSingleProps { - openBehaviour: 'single' - value?: string - // Add other props specific to single accordion -} - -export interface AccordionMultipleProps extends AccordionPrimitive.AccordionImplMultipleProps { - openBehaviour: 'multiple' - value?: string[] - // Add other props specific to multiple accordion -} - -type ExtendedAccordionProps = (AccordionSingleProps | AccordionMultipleProps) & AdditionalProps - const AccordionContext = createContext({ chevronAlign: 'left', - justified: false, // Set the default value to false - type: undefined, - defaultValue: undefined, + justified: true, + type: 'default', }) -const Accordion: AccordionComponent = React.forwardRef( - ({ openBehaviour, type, chevronAlign, justified, defaultValue, ...props }, ref) => { - function handleOnChange(e: string | string[]) { - if (props.onChange) props.onChange(e) - } +export interface AccordionProps { + children?: React.ReactNode + className?: string - const contextValue = { - chevronAlign, - justified: justified || false, // Provide a default value of false - type: type || 'default', // Provide a default value for the type - defaultValue: Array.isArray(defaultValue) ? defaultValue.join('') : defaultValue, // Convert array to string - } + onChange?: (item: string | string[]) => void + openBehaviour: 'single' | 'multiple' + type?: Type + defaultValue?: string | string[] | undefined + justified?: Boolean + chevronAlign?: Align +} - if (openBehaviour === 'single') { - const { value, children, className, ...singleProps } = props as AccordionSingleProps - return ( - - {children} - - } - {...singleProps} - /> - ) - } else { - const { value, children, className, ...multipleProps } = props as AccordionMultipleProps - return ( - -
{props.children}
- - } - {...multipleProps} - /> - ) - } +function Accordion({ + children, + className, + onChange, + openBehaviour = 'multiple', + type = 'default', + defaultValue = undefined, + justified = false, + chevronAlign = 'left', +}: AccordionProps) { + const __styles = styleHandler('accordion') + + let containerClasses = [__styles.variants[type].base] + + if (className) { + containerClasses.push(className) } -) as AccordionComponent -export interface ItemAdditionalProps - extends React.ComponentPropsWithoutRef {} + const contextValue = { + chevronAlign, + justified, + type, + defaultValue, + } -export const AccordionItem = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => { - const [open, setOpen] = useState(false) - - let { type, justified } = useContext(AccordionContext) + function handleOnChange(e: string | string[]) { + if (onChange) onChange(e) + const value = e == typeof String ? e.split(' ') : e + // setCurrentItems(e) + // console.log('about to change state') + // currentItems = e + // console.log('currentItems', currentItems) + } return ( - + +
{children}
+ + } + >
+ + ) +} + +interface ItemProps { + children?: React.ReactNode + className?: string + header: React.ReactNode + id: string + icon?: React.ReactNode + disabled?: boolean +} + +export function Item({ children, className, header, id, disabled }: ItemProps) { + const __styles = styleHandler('accordion') + const [open, setOpen] = useState(false) + + const { type, justified, chevronAlign } = useContext(AccordionContext) + + let triggerClasses = [__styles.variants[type].trigger] + if (justified) triggerClasses.push(__styles.justified) + if (className) triggerClasses.push(className) + + let chevronClasses = [__styles.chevron.base, __styles.chevron.align[chevronAlign]] + + if (open && !disabled) { + chevronClasses.unshift('!rotate-180') + } + + return ( + { setOpen(!open) }} - {...props} - /> - ) -}) -AccordionItem.displayName = AccordionPrimitive.Item.displayName - -export const AccordionTrigger = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, children, ...props }, ref) => { - const { type } = useContext(AccordionContext) - return ( - - - {children} - - - - ) -}) -AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName - -export const AccordionContent = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, children, ...props }, ref) => { - const { type } = useContext(AccordionContext) - return ( - -
{children}
-
+ + {header} + {!disabled && ( + + )} + + +
{children}
+
+
) -}) -AccordionContent.displayName = AccordionPrimitive.Content.displayName +} -Accordion.Item = AccordionItem -Accordion.Content = AccordionContent -Accordion.Trigger = AccordionTrigger -export { Accordion } +Accordion.Item = Item +export default Accordion diff --git a/packages/ui/src/components/Alert/Alert-old.stories.tsx b/packages/ui/src/components/Alert/Alert-old.stories.tsx deleted file mode 100644 index 915e408018b..00000000000 --- a/packages/ui/src/components/Alert/Alert-old.stories.tsx +++ /dev/null @@ -1,135 +0,0 @@ -import React from 'react' - -import Alert, { AlertProps } from './Alert' - -export default { - title: 'Displays/Alerts', - component: Alert, -} - -export const Neutral = (args: AlertProps) => ( - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - -) - -export const Success = (args: AlertProps) => ( - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - -) - -export const SuccessWithIcon = (args: AlertProps) => ( - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - -) - -export const Danger = (args: AlertProps) => ( - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - -) - -export const DangerWithIcon = (args: AlertProps) => ( - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - -) - -export const Info = (args: AlertProps) => ( - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - -) - -export const InfoWithIcon = (args: AlertProps) => ( - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - -) - -export const Warning = (args: AlertProps) => ( - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - -) - -export const WarningWithIcon = (args: AlertProps) => ( - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - -) - -export const Closable = (args: AlertProps) => ( - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - -) - -export const WithAction = (args: AlertProps) => ( - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. - -) - -Neutral.args = { - title: 'Success alert with icon', - withIcon: true, -} - -Success.args = { - title: 'Success alert', - variant: 'success', -} - -SuccessWithIcon.args = { - title: 'Success alert with icon', - variant: 'success', - withIcon: true, -} - -Danger.args = { - title: 'Danger alert', - variant: 'danger', -} - -DangerWithIcon.args = { - title: 'Danger alert with icon', - variant: 'danger', - withIcon: true, -} - -Info.args = { - title: 'Info alert', - variant: 'info', -} - -InfoWithIcon.args = { - title: 'Info alert with icon', - variant: 'info', - withIcon: true, -} - -Warning.args = { - title: 'Warning alert', - variant: 'warning', -} - -WarningWithIcon.args = { - title: 'Warning alert with icon', - variant: 'warning', - withIcon: true, -} - -Closable.args = { - title: 'Closable alert', - closable: true, -} - -WithAction.args = { - title: 'Alert with action', - variant: 'warning', - withIcon: true, - actions:
Hello
, -} diff --git a/packages/ui/src/components/Alert/Alert-old.tsx b/packages/ui/src/components/Alert/Alert-old.tsx deleted file mode 100644 index cf0b96fe810..00000000000 --- a/packages/ui/src/components/Alert/Alert-old.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import React, { useState } from 'react' -import { IconAlertTriangle } from '../Icon/icons/IconAlertTriangle' - -import { IconInfo } from '../Icon/icons/IconInfo' -import { IconX } from '../Icon/icons/IconX' - -import styleHandler from '../../lib/theme/styleHandler' -import { IconAlertOctagon } from '../Icon/icons/IconAlertOctagon' -import { IconCheckCircle } from '../Icon/icons/IconCheckCircle' - -export interface AlertProps { - variant?: 'success' | 'danger' | 'warning' | 'info' | 'neutral' - className?: string - title: string | React.ReactNode - withIcon?: boolean - closable?: boolean - children?: React.ReactNode - icon?: React.ReactNode - actions?: React.ReactNode -} - -const icons: Record<'success' | 'danger' | 'warning' | 'info' | 'neutral', React.ReactElement> = { - danger: , - success: , - warning: , - info: , - neutral: <>, -} - -function Alert({ - variant = 'neutral', - className, - title, - withIcon, - closable, - children, - icon, - actions, -}: AlertProps) { - let __styles = styleHandler('alert') - - const [visible, setVisible] = useState(true) - - let containerClasses = [__styles.base] - containerClasses.push(__styles.variant[variant].base) - - if (className) containerClasses.push(className) - - let descriptionClasses = [__styles.description, __styles.variant[variant].description] - let closeButtonClasses = [__styles.close] - - return ( - <> - {visible && ( -
- {withIcon ? ( -
{withIcon && icons[variant]}
- ) : null} - {icon && icon} -
-
-

- {title} -

-
{children}
-
- {actions} -
- {closable && ( - - )} -
- )} - - ) -} - -export default Alert diff --git a/packages/ui/src/components/Alert/Alert.stories.tsx b/packages/ui/src/components/Alert/Alert.stories.tsx index de5cf016871..611c47ee072 100644 --- a/packages/ui/src/components/Alert/Alert.stories.tsx +++ b/packages/ui/src/components/Alert/Alert.stories.tsx @@ -1,92 +1,135 @@ -// Button.stories.ts|tsx +import React from 'react' -import type { Meta, StoryObj } from '@storybook/react' +import Alert, { AlertProps } from '../shadcn/updated/Alert/Alert' -import { Alert, AlertProps } from './Alert' - -import { IconAirplay } from '../Icon/icons/IconAirplay' -import { Terminal } from 'lucide-react' - -const meta: Meta = { - /* 👇 The title prop is optional. - * See https://storybook.js.org/docs/react/configure/overview#configure-story-loading - * to learn how to generate automatic titles - */ - title: 'General/Alert', +export default { + title: 'Displays/Alerts', component: Alert, } -export default meta +export const Neutral = (args: AlertProps) => ( + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + +) -type Story = StoryObj +export const Success = (args: AlertProps) => ( + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + +) -/* - *👇 Render functions are a framework specific feature to allow you control on how the component renders. - * See https://storybook.js.org/docs/react/api/csf - * to learn how to use render functions. - */ +export const SuccessWithIcon = (args: AlertProps) => ( + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + +) -export const Info = { - args: { - variant: 'info', - withIcon: true, - }, - render: ({ withIcon, variant }: AlertProps) => ( - - Info Alert - This is an informative message for your application. - - ), +export const Danger = (args: AlertProps) => ( + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + +) + +export const DangerWithIcon = (args: AlertProps) => ( + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + +) + +export const Info = (args: AlertProps) => ( + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + +) + +export const InfoWithIcon = (args: AlertProps) => ( + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + +) + +export const Warning = (args: AlertProps) => ( + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + +) + +export const WarningWithIcon = (args: AlertProps) => ( + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + +) + +export const Closable = (args: AlertProps) => ( + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + +) + +export const WithAction = (args: AlertProps) => ( + + Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. + +) + +Neutral.args = { + title: 'Success alert with icon', + withIcon: true, } -export const Danger = { - args: { - variant: 'danger', - withIcon: true, - }, - render: ({ withIcon, variant }: AlertProps) => ( - - Danger Alert - This is a dangerous warning for your application. - - ), +Success.args = { + title: 'Success alert', + variant: 'success', } -export const Warning = { - args: { - variant: 'warning', - withIcon: true, - }, - render: ({ withIcon, variant }: AlertProps) => ( - - Warning Alert - This is a warning message for your application. - - ), +SuccessWithIcon.args = { + title: 'Success alert with icon', + variant: 'success', + withIcon: true, } -export const Success = { - args: { - variant: 'success', - withIcon: true, - }, - render: ({ withIcon, variant }: AlertProps) => ( - - Success Alert - This is a successful notification for your application. - - ), +Danger.args = { + title: 'Danger alert', + variant: 'danger', } -export const Neutral = { - args: { - variant: 'neutral', - withIcon: true, - }, - render: ({ withIcon, variant }: AlertProps) => ( - - Neutral Alert - This is a neutral message for your application. - - ), +DangerWithIcon.args = { + title: 'Danger alert with icon', + variant: 'danger', + withIcon: true, +} + +Info.args = { + title: 'Info alert', + variant: 'info', +} + +InfoWithIcon.args = { + title: 'Info alert with icon', + variant: 'info', + withIcon: true, +} + +Warning.args = { + title: 'Warning alert', + variant: 'warning', +} + +WarningWithIcon.args = { + title: 'Warning alert with icon', + variant: 'warning', + withIcon: true, +} + +Closable.args = { + title: 'Closable alert', + closable: true, +} + +WithAction.args = { + title: 'Alert with action', + variant: 'warning', + withIcon: true, + actions:
Hello
, } diff --git a/packages/ui/src/components/Alert/Alert.tsx b/packages/ui/src/components/Alert/Alert.tsx index a89ea6ce8d2..cf0b96fe810 100644 --- a/packages/ui/src/components/Alert/Alert.tsx +++ b/packages/ui/src/components/Alert/Alert.tsx @@ -1,145 +1,84 @@ -import { cn } from '@ui/lib/utils' -import { VariantProps, cva } from 'class-variance-authority' -import { AlertOctagon, AlertTriangle, Check, Info } from 'lucide-react' -import * as React from 'react' +import React, { useState } from 'react' +import { IconAlertTriangle } from '../Icon/icons/IconAlertTriangle' -export type AlertRootVariantsProps = VariantProps -const alertRootVariants = cva( - `relative w-full - rounded-lg border - py-4 px-6 - [&>svg]:absolute [&>svg]:text-foreground [&>svg]:left-4 [&>svg]:top-4 [&>svg+div]:translate-y-[-3px] [&:has(svg)]:pl-11`, - { - variants: { - variant: { - danger: `bg-red-200 dark:bg-red-100 text-red-1200 border-red-700 [&>svg]:text-red-1200`, - warning: `bg-amber-200 dark:bg-amber-100 border-amber-700 [&>svg]:text-amber-1200`, - info: `bg-scale-400 border-scale-500 dark:bg-scale-100 dark:border-scale-300 [&>svg]:text-scale-1200`, - success: `bg-brand-300 dark:bg-brand-100 border-brand-700 [&>svg]:text-brand-900`, - neutral: `bg-scale-300 dark:bg-scale-300 border-scale-500 [&>svg]:text-scale-900`, - }, - }, - defaultVariants: { - variant: 'info', - }, - } -) +import { IconInfo } from '../Icon/icons/IconInfo' +import { IconX } from '../Icon/icons/IconX' -const alertTitleVariants = cva('mb-1 font-medium leading-none tracking-tight', { - variants: { - variant: { - danger: `text-red-1200`, - warning: `text-amber-1200`, - info: `text-scale-1200`, - success: `text-brand-1200`, - neutral: `text-scale-1200`, - }, - defaultVariants: { - variant: 'info', - }, - }, -}) +import styleHandler from '../../lib/theme/styleHandler' +import { IconAlertOctagon } from '../Icon/icons/IconAlertOctagon' +import { IconCheckCircle } from '../Icon/icons/IconCheckCircle' -const alertDescriptionVariants = cva('text-sm [&_p]:leading-relaxed', { - variants: { - variant: { - danger: 'text-red-1100', - warning: 'text-amber-1100', - info: 'text-scale-1100', - success: 'text-brand-1100', - neutral: 'text-scale-1100', - }, - defaultVariants: { - variant: 'info', - }, - }, -}) - -interface ContextValue { - variant: AlertRootVariantsProps['variant'] +export interface AlertProps { + variant?: 'success' | 'danger' | 'warning' | 'info' | 'neutral' + className?: string + title: string | React.ReactNode + withIcon?: boolean + closable?: boolean + children?: React.ReactNode + icon?: React.ReactNode + actions?: React.ReactNode } -const AlertContext = React.createContext({ - variant: undefined, -}) - -// Define the Alert component -interface AlertProps - extends React.HTMLAttributes, - VariantProps { - withIcon: boolean -} - -interface AlertComponent - extends React.ForwardRefExoticComponent> { - Title: typeof AlertTitle - Description: typeof AlertDescription -} - -type AlertIconVariant = Exclude -const icons: Record = { - danger: , - success: , - warning: , - info: , +const icons: Record<'success' | 'danger' | 'warning' | 'info' | 'neutral', React.ReactElement> = { + danger: , + success: , + warning: , + info: , neutral: <>, } -const Alert = React.forwardRef( - ({ className, withIcon, variant = 'info', children, ...props }, ref) => { - const contextValue = { - variant, - } +function Alert({ + variant = 'neutral', + className, + title, + withIcon, + closable, + children, + icon, + actions, +}: AlertProps) { + let __styles = styleHandler('alert') - return ( -
- {withIcon && icons[variant as AlertIconVariant]} - {children} - - } - /> - ) - } -) as AlertComponent + const [visible, setVisible] = useState(true) -Alert.displayName = 'Alert' + let containerClasses = [__styles.base] + containerClasses.push(__styles.variant[variant].base) -// Define the AlertTitle component as a subcomponent of Alert -interface AlertTitleProps extends React.HTMLAttributes {} + if (className) containerClasses.push(className) -const AlertTitle = React.forwardRef( - ({ className, ...props }, ref) => { - const { variant } = React.useContext(AlertContext) - console.log('variant', variant) - return
- } -) + let descriptionClasses = [__styles.description, __styles.variant[variant].description] + let closeButtonClasses = [__styles.close] -AlertTitle.displayName = 'AlertTitle' + return ( + <> + {visible && ( +
+ {withIcon ? ( +
{withIcon && icons[variant]}
+ ) : null} + {icon && icon} +
+
+

+ {title} +

+
{children}
+
+ {actions} +
+ {closable && ( + + )} +
+ )} + + ) +} -// Define the AlertDescription component as a subcomponent of Alert -interface AlertDescriptionProps extends React.HTMLAttributes {} - -const AlertDescription = React.forwardRef( - ({ className, ...props }, ref) => { - const { variant } = React.useContext(AlertContext) - return ( -
- ) - } -) - -AlertDescription.displayName = 'AlertDescription' - -// Attach the subcomponents to the Alert component -Alert.Title = AlertTitle -Alert.Description = AlertDescription - -// Export the Alert component -export { Alert } +export default Alert diff --git a/packages/ui/src/components/Alert/index.tsx b/packages/ui/src/components/Alert/index.tsx index fd2a1266021..545a13bde4d 100644 --- a/packages/ui/src/components/Alert/index.tsx +++ b/packages/ui/src/components/Alert/index.tsx @@ -1 +1 @@ -export { default as Alert } from './Alert' +export { default as Alert } from '../shadcn/updated/Alert/Alert' diff --git a/packages/ui/src/components/Badge/Badge.tsx b/packages/ui/src/components/Badge/Badge.tsx index 199d771d0f3..c7096715f21 100644 --- a/packages/ui/src/components/Badge/Badge.tsx +++ b/packages/ui/src/components/Badge/Badge.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import { VariantProps, cva } from 'class-variance-authority' -import { cn } from '@ui/lib/utils' +import { cn } from './../../lib/utils' const badgeVariants = cva( 'inline-flex items-center border rounded-full px-2.5 py-0.5 text-xs font-normal transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2', diff --git a/packages/ui/src/components/Button/Button-old.tsx b/packages/ui/src/components/Button/Button-old.tsx deleted file mode 100644 index 145a9333ebb..00000000000 --- a/packages/ui/src/components/Button/Button-old.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import React, { forwardRef } from 'react' -import { IconContext } from './../Icon/IconContext' -import { IconLoader } from './../Icon/icons/IconLoader' - -import styleHandler from '../../lib/theme/styleHandler' - -export interface ButtonProps extends React.HTMLAttributes { - block?: boolean - className?: string - children?: React.ReactNode - disabled?: boolean - onClick?: React.MouseEventHandler - icon?: React.ReactNode - iconRight?: React.ReactNode - loading?: boolean - loadingCentered?: boolean - shadow?: boolean - size?: ButtonSize - style?: React.CSSProperties - type?: ButtonType - danger?: boolean - htmlType?: 'button' | 'submit' | 'reset' - ref?: any - ariaSelected?: boolean - ariaControls?: string - tabIndex?: 0 | -1 - role?: string - textAlign?: 'left' | 'center' | 'right' - as?: keyof JSX.IntrinsicElements - form?: string -} - -export type ButtonSize = 'tiny' | 'small' | 'medium' | 'large' | 'xlarge' -export type ButtonType = - | 'primary' - | 'default' - | 'secondary' - | 'alternative' - | 'outline' - | 'dashed' - | 'link' - | 'text' - | 'danger' - | 'warning' - -interface CustomButtonProps extends React.HTMLAttributes {} - -export const Button = forwardRef( - ( - { - block, - className, - children, - danger, - disabled = false, - onClick, - icon, - iconRight, - loading = false, - loadingCentered = false, - shadow = true, - size = 'tiny', - style, - type = 'primary', - htmlType = 'button', - ariaSelected, - ariaControls, - tabIndex, - role, - as, - textAlign = 'center', - ...props - }: ButtonProps, - ref - ) => { - let __styles = styleHandler('button') - - // styles - const showIcon = loading || icon - - let classes = [__styles.base] - let containerClasses = [__styles.container] - - classes.push(__styles.type[type]) - - if (block) { - containerClasses.push(__styles.block) - classes.push(__styles.block) - } - - if (shadow && type !== 'link' && type !== 'text') { - classes.push(__styles.shadow) - } - - if (size) { - classes.push(__styles.size[size]) - } - - if (className) { - classes.push(className) - } - - if (disabled) { - classes.push(__styles.disabled) - } - - const iconLoaderClasses = [__styles.loading] - - // custom button tag - const CustomButton = ({ ...props }) => { - const Tag = as as keyof JSX.IntrinsicElements - return - } - - const buttonContent = ( - <> - {showIcon && - (loading ? ( - - ) : icon ? ( - {icon} - ) : null)} - {children && {children}} - {iconRight && !loading && ( - {iconRight} - )} - - ) - - if (as) { - return ( - - {buttonContent} - - ) - } else { - return ( - // - - // - ) - } - } -) diff --git a/packages/ui/src/components/Button/Button.stories-old.tsx b/packages/ui/src/components/Button/Button.stories-old.tsx deleted file mode 100644 index 57c0e956cc7..00000000000 --- a/packages/ui/src/components/Button/Button.stories-old.tsx +++ /dev/null @@ -1,234 +0,0 @@ -import { Button } from './' -import { IconPackage } from './../Icon/icons/IconPackage' -import { IconChevronRight } from './../Icon/icons/IconChevronRight' - -export default { - title: 'General/Button', - component: Button, -} - -export const Neutral = (args: any) => -export const Success = (args: any) => -export const withStyles = (args: any) => -export const withIcon = (args: any) => -export const withIconRight = (args: any) => -export const withBlock = (args: any) => -export const withOnlyIcon = (args: any) => -) - -export const allButtons = (args: any) => ( - <> -
-
- - - - - - - - - - -
- -
- - - - - - - - - - -
-
- - - - - - - - - - -
-
- - - - - - - - - - -
-
- - - - - - - - - - -
-
- -) - -export const withCustomTag = (args: any) => - -const icon = - -withIcon.args = { - type: 'primary', - icon: icon, -} - -withIconRight.args = { - type: 'primary', - iconRight: , -} - -withStyles.args = { - type: 'primary', - style: { backgroundColor: 'red', color: 'yellow' }, -} - -withBlock.args = { - type: 'primary', - block: true, -} - -withOnlyIcon.args = { - icon: icon, -} - -withOnlyLoading.args = { - loading: true, -} - -withLoadingCentered.args = { - loading: true, - loadingCentered: true, -} - -allButtons.args = { - loading: false, - danger: false, -} - -withCustomTag.args = { - as: 'span', -} diff --git a/packages/ui/src/components/Button/Button.stories.tsx b/packages/ui/src/components/Button/Button.stories.tsx index 3827669916e..cc821725f15 100644 --- a/packages/ui/src/components/Button/Button.stories.tsx +++ b/packages/ui/src/components/Button/Button.stories.tsx @@ -1,175 +1,234 @@ -// Button.stories.ts|tsx +import { Button } from '.' +import { IconPackage } from '../Icon/icons/IconPackage' +import { IconChevronRight } from '../Icon/icons/IconChevronRight' -import type { Meta, StoryObj } from '@storybook/react' - -import { Button, ButtonProps } from './Button' - -import { IconAirplay } from '../Icon/icons/IconAirplay' - -const meta: Meta = { - /* 👇 The title prop is optional. - * See https://storybook.js.org/docs/react/configure/overview#configure-story-loading - * to learn how to generate automatic titles - */ +export default { title: 'General/Button', component: Button, } -export default meta +export const Neutral = (args: any) => +export const Success = (args: any) => +export const withStyles = (args: any) => +export const withIcon = (args: any) => +export const withIconRight = (args: any) => +export const withBlock = (args: any) => +export const withOnlyIcon = (args: any) => +) -type Story = StoryObj +export const allButtons = (args: any) => ( + <> +
+
+ + + + + + + + + + +
-/* - *👇 Render functions are a framework specific feature to allow you control on how the component renders. - * See https://storybook.js.org/docs/react/api/csf - * to learn how to use render functions. - */ +
+ + + + + + + + + + +
+
+ + + + + + + + + + +
+
+ + + + + + + + + + +
+
+ + + + + + + + + + +
+
+ +) -export const Primary = { - args: { - children: 'Hello world', - type: 'primary', - }, - render: ({ children, type }: ButtonProps) => , -} -export const Default = { - args: { - children: 'Hello world', - type: 'default', - }, - render: ({ children, type }: ButtonProps) => , +export const withCustomTag = (args: any) => + +const icon = + +withIcon.args = { + type: 'primary', + icon: icon, } -export const Alternative = { - args: { - children: 'Hello world', - type: 'alternative', - }, - render: ({ children, type }: ButtonProps) => , +withIconRight.args = { + type: 'primary', + iconRight: , } -export const Outline = { - args: { - children: 'Hello world', - type: 'outline', - }, - render: ({ children, type }: ButtonProps) => , +withStyles.args = { + type: 'primary', + style: { backgroundColor: 'red', color: 'yellow' }, } -export const Secondary = { - args: { - children: 'Hello world', - type: 'secondary', - }, - render: ({ children, type }: ButtonProps) => , +withBlock.args = { + type: 'primary', + block: true, } -export const Dashed = { - args: { - children: 'Hello world', - type: 'dashed', - }, - render: ({ children, type }: ButtonProps) => , +withOnlyIcon.args = { + icon: icon, } -export const Link = { - args: { - children: 'Hello world', - type: 'link', - }, - render: ({ children, type }: ButtonProps) => , +withOnlyLoading.args = { + loading: true, } -export const Text = { - args: { - children: 'Hello world', - type: 'text', - }, - render: ({ children, type }: ButtonProps) => , +withLoadingCentered.args = { + loading: true, + loadingCentered: true, } -export const Danger = { - args: { - children: 'Hello world', - type: 'danger', - }, - render: ({ children, type }: ButtonProps) => , +allButtons.args = { + loading: false, + danger: false, } -export const Block = { - args: { - children: 'Hello world', - type: 'primary', - block: true, - }, - render: ({ children, type, block }: ButtonProps) => ( - - ), -} - -export const Disabled = { - args: { - children: 'Hello world', - type: 'primary', - disabled: true, - }, - render: ({ children, type, disabled }: ButtonProps) => ( - - ), -} - -export const Sizes = { - args: { - children: 'Change the size below', - type: 'primary', - size: 'large', - }, - render: ({ children, type, size }: ButtonProps) => ( - - ), -} - -export const LeftIcon = { - args: { - children: 'Change the size below', - type: 'primary', - iconLeft: , - }, - render: ({ children, type, iconLeft }: ButtonProps) => ( - - ), -} - -export const RightIcon = { - args: { - children: 'Change the size below', - type: 'primary', - iconRight: , - }, - render: ({ children, type, iconRight }: ButtonProps) => ( - - ), -} - -export const Loading = { - args: { - children: 'Change the size below', - type: 'primary', - loading: true, - }, - render: ({ children, type, loading }: ButtonProps) => ( - - ), +withCustomTag.args = { + as: 'span', } diff --git a/packages/ui/src/components/Button/Button.test.tsx b/packages/ui/src/components/Button/Button.test.tsx index 93e88e8650c..bc2cede9768 100644 --- a/packages/ui/src/components/Button/Button.test.tsx +++ b/packages/ui/src/components/Button/Button.test.tsx @@ -1,6 +1,6 @@ import React from 'react' import { render, screen, fireEvent } from '@testing-library/react' -import { Button, ButtonSize, ButtonType } from './Button' +import { Button, ButtonSize, ButtonType } from '../shadcn/updated/Button/Button' import defaultTheme from '../../lib/theme/defaultTheme' import Link from 'next/link' diff --git a/packages/ui/src/components/Button/Button.tsx b/packages/ui/src/components/Button/Button.tsx index 24546fb28e6..a0fb3267c11 100644 --- a/packages/ui/src/components/Button/Button.tsx +++ b/packages/ui/src/components/Button/Button.tsx @@ -1,192 +1,159 @@ -import * as React from 'react' -import { Slot } from '@radix-ui/react-slot' -import { VariantProps, cva } from 'class-variance-authority' +import React, { forwardRef } from 'react' +import { IconContext } from '../Icon/IconContext' +import { IconLoader } from '../Icon/icons/IconLoader' -import { IconContext } from './../Icon/IconContext' -import { IconLoader } from './../Icon/icons/IconLoader' +import styleHandler from '../../lib/theme/styleHandler' -import { cn } from '@ui/lib/utils' -import { sizes } from '@ui/lib/commonCva' - -export type ButtonVariantProps = VariantProps -const buttonVariants = cva( - `relative - cursor-pointer - inline-flex - items-center - space-x-2 - text-center - font-regular - ease-out - duration-200 - rounded - outline-none - transition-all - outline-0 - focus-visible:outline-4 - focus-visible:outline-offset-1`, - { - variants: { - type: { - primary: ` - bg-brand-fixed-1100 hover:bg-brand-fixed-1000 - text-white - bordershadow-brand-fixed-1000 hover:bordershadow-brand-fixed-900 dark:bordershadow-brand-fixed-1000 dark:hover:bordershadow-brand-fixed-1000 - focus-visible:outline-brand-600 - shadow-sm`, - secondary: ` - bg-scale-1200 - text-scale-100 hover:text-scale-800 - focus-visible:text-scale-600 - bordershadow-scale-1100 hover:bordershadow-scale-900 - focus-visible:outline-scale-700 - shadow-sm`, - default: ` - text-scale-1200 - bg-scale-100 hover:bg-scale-300 - bordershadow-scale-600 hover:bordershadow-scale-700 - dark:bordershadow-scale-700 hover:dark:bordershadow-scale-800 - dark:bg-scale-500 dark:hover:bg-scale-600 - focus-visible:outline-brand-600 - shadow-sm`, - alternative: ` - text-brand-1100 - bg-brand-200 hover:bg-brand-400 - bordershadow-brand-600 hover:bordershadow-brand-800 - dark:bordershadow-brand-700 hover:dark:bordershadow-brand-800 - focus-visible:border-brand-800 - focus-visible:outline-brand-600 - shadow-sm`, - outline: ` - text-scale-1200 - bg-transparent - bordershadow-scale-600 hover:bordershadow-scale-700 - dark:bordershadow-scale-800 hover:dark:bordershadow-scale-900 - focus-visible:outline-scale-700`, - dashed: ` - text-scale-1200 - border - border-dashed - border-scale-700 hover:border-scale-900 - bg-transparent - focus-visible:outline-scale-700 - shadow-sm`, - link: ` - text-brand-1100 - border - border-transparent - hover:bg-brand-400 - border-opacity-0 - bg-opacity-0 dark:bg-opacity-0 - shadow-none - focus-visible:outline-scale-700`, - text: ` - text-scale-1200 - hover:bg-scale-500 - shadow-none - focus-visible:outline-scale-700`, - danger: ` - text-red-1100 - bg-red-200 - bordershadow-red-700 hover:bordershadow-red-900 - hover:bg-red-900 - hover:text-lo-contrast - focus-visible:outline-red-700 - shadow-sm`, - warning: ` - text-amber-1100 - bg-amber-200 - bordershadow-amber-700 hover:bordershadow-amber-900 - hover:bg-amber-900 - hover:text-hi-contrast - focus-visible:outline-amber-700 - shadow-sm`, - }, - block: { - true: 'w-full flex items-center justify-center', - }, - size: { - ...sizes, - }, - overlay: { - base: `absolute inset-0 bg-scale-200 opacity-50`, - container: `fixed inset-0 transition-opacity`, - }, - disabled: { - true: 'opacity-50 cursor-not-allowed pointer-events-none', - }, - defaultVariants: { - // variant: 'default', - // size: 'default', - }, - }, - } -) - -export type LoadingVariantProps = VariantProps -const loadingVariants = cva('', { - variants: { - loading: { - default: '', - true: `animate-spin`, - }, - }, -}) - -export interface ButtonProps - // omit `type` as we use it to change type of button - // replaced with `htmlType` - extends Omit, 'type'>, - // omit 'disabled' as it is included in HTMLButtonElement - Omit, - LoadingVariantProps { - asChild?: boolean - type?: ButtonVariantProps['type'] - htmlType?: React.ButtonHTMLAttributes['type'] +export interface ButtonProps extends React.HTMLAttributes { + block?: boolean + className?: string + children?: React.ReactNode + disabled?: boolean + onClick?: React.MouseEventHandler icon?: React.ReactNode - iconLeft?: React.ReactNode iconRight?: React.ReactNode + loading?: boolean + loadingCentered?: boolean + shadow?: boolean + size?: ButtonSize + style?: React.CSSProperties + type?: ButtonType + danger?: boolean + htmlType?: 'button' | 'submit' | 'reset' + ref?: any + ariaSelected?: boolean + ariaControls?: string + tabIndex?: 0 | -1 + role?: string + textAlign?: 'left' | 'center' | 'right' + as?: keyof JSX.IntrinsicElements + form?: string } -const Button = React.forwardRef( - ({ asChild = false, size = 'small', type = 'primary', ...props }, ref) => { - const Comp = asChild ? Slot : 'button' +export type ButtonSize = 'tiny' | 'small' | 'medium' | 'large' | 'xlarge' +export type ButtonType = + | 'primary' + | 'default' + | 'secondary' + | 'alternative' + | 'outline' + | 'dashed' + | 'link' + | 'text' + | 'danger' + | 'warning' - const { className, disabled, loading, icon, iconLeft, iconRight } = props +interface CustomButtonProps extends React.HTMLAttributes {} +export const Button = forwardRef( + ( + { + block, + className, + children, + danger, + disabled = false, + onClick, + icon, + iconRight, + loading = false, + loadingCentered = false, + shadow = true, + size = 'tiny', + style, + type = 'primary', + htmlType = 'button', + ariaSelected, + ariaControls, + tabIndex, + role, + as, + textAlign = 'center', + ...props + }: ButtonProps, + ref + ) => { + let __styles = styleHandler('button') + + // styles const showIcon = loading || icon - // decrecating 'showIcon' for rightIcon - const _iconLeft: React.ReactNode = icon ?? iconLeft + let classes = [__styles.base] + let containerClasses = [__styles.container] + + classes.push(__styles.type[type]) + + if (block) { + containerClasses.push(__styles.block) + classes.push(__styles.block) + } + + if (shadow && type !== 'link' && type !== 'text') { + classes.push(__styles.shadow) + } + + if (size) { + classes.push(__styles.size[size]) + } + + if (className) { + classes.push(className) + } + + if (disabled) { + classes.push(__styles.disabled) + } + + const iconLoaderClasses = [__styles.loading] + + // custom button tag + const CustomButton = ({ ...props }) => { + const Tag = as as keyof JSX.IntrinsicElements + return + } const buttonContent = ( <> {showIcon && (loading ? ( - - ) : _iconLeft ? ( - {_iconLeft} + + ) : icon ? ( + {icon} ) : null)} - {props.children && {props.children}} + {children && {children}} {iconRight && !loading && ( {iconRight} )} ) - return ( - - {buttonContent} - - ) + if (as) { + return ( + + {buttonContent} + + ) + } else { + return ( + // + + // + ) + } } ) - -Button.displayName = 'Button' - -export { Button, buttonVariants } diff --git a/packages/ui/src/components/Button/index.tsx b/packages/ui/src/components/Button/index.tsx index 8486fd6d62d..7b8c48cb4b6 100644 --- a/packages/ui/src/components/Button/index.tsx +++ b/packages/ui/src/components/Button/index.tsx @@ -1 +1 @@ -export * from './Button' +export * from '../shadcn/updated/Button/Button' diff --git a/packages/ui/src/components/shadcn/updated/Accordion/Accordion.stories.tsx b/packages/ui/src/components/shadcn/updated/Accordion/Accordion.stories.tsx new file mode 100644 index 00000000000..229ab104714 --- /dev/null +++ b/packages/ui/src/components/shadcn/updated/Accordion/Accordion.stories.tsx @@ -0,0 +1,79 @@ +// Button.stories.ts|tsx + +import type { Meta, StoryObj } from '@storybook/react' + +import { Accordion, AccordionItem } from './Accordion' +import { Badge } from '../../../Badge' + +const meta: Meta = { + /* 👇 The title prop is optional. + * See https://storybook.js.org/docs/react/configure/overview#configure-story-loading + * to learn how to generate automatic titles + */ + title: 'General/Accordion', + component: Accordion, +} + +export default meta + +type Story = StoryObj + +/* + *👇 Render functions are a framework specific feature to allow you control on how the component renders. + * See https://storybook.js.org/docs/react/api/csf + * to learn how to use render functions. + */ + +export const Default = { + args: { + type: 'default', + }, + render: ({ children, type }: any) => ( + + + + Title of the thing + + Yes. It adheres to the WAI-ARIA design pattern. + + + Is it styled? + + Yes. It comes with default styles that matches the other components' aesthetic. + + + + Is it animated? + + Yes. It's animated by default, but you can disable it if you prefer. + + + + ), +} + +export const Bordered = { + args: { + type: 'bordered', + }, + render: ({ children, type }: any) => ( + + + Is it accessible? + Yes. It adheres to the WAI-ARIA design pattern. + + + Is it styled? + + Yes. It comes with default styles that matches the other components' aesthetic. + + + + Is it animated? + + Yes. It's animated by default, but you can disable it if you prefer. + + + + ), +} diff --git a/packages/ui/src/components/shadcn/updated/Accordion/Accordion.tsx b/packages/ui/src/components/shadcn/updated/Accordion/Accordion.tsx new file mode 100644 index 00000000000..1e28737c64a --- /dev/null +++ b/packages/ui/src/components/shadcn/updated/Accordion/Accordion.tsx @@ -0,0 +1,235 @@ +import * as AccordionPrimitive from '@radix-ui/react-accordion' +import { cn } from './../../lib/utils' + +import { VariantProps, cva, cx } from 'class-variance-authority' +import { ChevronDown } from 'lucide-react' +import React, { createContext, useContext, useState } from 'react' + +export type AccordionRootVariantsProps = VariantProps +const accordionRootVariants = cva('flex flex-col', { + variants: { + type: { + default: 'space-y-3', + bordered: '-space-y-px', + }, + defaultVariants: { + type: 'default', + }, + }, +}) + +export type AccordionItemVariantsProps = VariantProps +const accordionItemVariants = cva( + 'group first:rounded-tl-md first:rounded-tr-md last:rounded-bl-md last:rounded-br-md', + { + variants: { + type: { + default: 'overflow-hidden', + bordered: 'border border-scale-700', + }, + justified: { + true: 'justify-between', + false: '', + }, + }, + } +) + +const accordionTriggerVariants = cva( + `flex flex-row items-center w-full text-left cursor-pointer focus-visible:ring-1 focus-visible:z-10 ring-scale-1100 + justify-between transition-all hover:underline [&[data-state=open]>svg]:rotate-180`, + { + variants: { + type: { + default: 'gap-3', + bordered: ` + px-6 py-4 + font-medium text-base bg-transparent + transition-colors hover:bg-scale-200 + overflow-hidden + group-first:rounded-tl-md group-first:rounded-tr-md + group-last:rounded-bl-md group-last:rounded-br-md`, + }, + }, + } +) + +const accordionContentVariants = cva('pb-4 pt-0', { + variants: { + type: { + default: '', + bordered: 'px-6', + }, + }, +}) + +type Type = AccordionRootVariantsProps['type'] +type Align = 'left' | 'right' | undefined + +interface ContextValue { + chevronAlign: Align + justified: boolean + type: Type + defaultValue: AccordionPrimitive.AccordionImplSingleProps['defaultValue'] +} + +interface AdditionalProps { + openBehaviour: 'single' | 'multiple' + variant?: Type + // Add other additional props here + onChange?: (item: string | string[]) => void + type?: Type + justified?: AccordionItemVariantsProps['justified'] + chevronAlign?: Align +} + +interface AccordionComponent + extends React.ForwardRefExoticComponent< + ExtendedAccordionProps & React.RefAttributes + > { + Item: typeof AccordionItem + Content: typeof AccordionContent + Trigger: typeof AccordionTrigger +} + +export interface AccordionSingleProps extends AccordionPrimitive.AccordionImplSingleProps { + openBehaviour: 'single' + value?: string + // Add other props specific to single accordion +} + +export interface AccordionMultipleProps extends AccordionPrimitive.AccordionImplMultipleProps { + openBehaviour: 'multiple' + value?: string[] + // Add other props specific to multiple accordion +} + +type ExtendedAccordionProps = (AccordionSingleProps | AccordionMultipleProps) & AdditionalProps + +const AccordionContext = createContext({ + chevronAlign: 'left', + justified: false, // Set the default value to false + type: undefined, + defaultValue: undefined, +}) + +const Accordion: AccordionComponent = React.forwardRef( + ({ openBehaviour, type, chevronAlign, justified, defaultValue, ...props }, ref) => { + function handleOnChange(e: string | string[]) { + if (props.onChange) props.onChange(e) + } + + const contextValue = { + chevronAlign, + justified: justified || false, // Provide a default value of false + type: type || 'default', // Provide a default value for the type + defaultValue: Array.isArray(defaultValue) ? defaultValue.join('') : defaultValue, // Convert array to string + } + + if (openBehaviour === 'single') { + const { value, children, className, ...singleProps } = props as AccordionSingleProps + return ( + + {children} + + } + {...singleProps} + /> + ) + } else { + const { value, children, className, ...multipleProps } = props as AccordionMultipleProps + return ( + +
{props.children}
+ + } + {...multipleProps} + /> + ) + } + } +) as AccordionComponent + +export interface ItemAdditionalProps + extends React.ComponentPropsWithoutRef {} + +export const AccordionItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => { + const [open, setOpen] = useState(false) + + let { type, justified } = useContext(AccordionContext) + + return ( + { + setOpen(!open) + }} + {...props} + /> + ) +}) +AccordionItem.displayName = AccordionPrimitive.Item.displayName + +export const AccordionTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => { + const { type } = useContext(AccordionContext) + return ( + + + {children} + + + + ) +}) +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName + +export const AccordionContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => { + const { type } = useContext(AccordionContext) + return ( + +
{children}
+
+ ) +}) +AccordionContent.displayName = AccordionPrimitive.Content.displayName + +Accordion.Item = AccordionItem +Accordion.Content = AccordionContent +Accordion.Trigger = AccordionTrigger +export { Accordion } diff --git a/packages/ui/src/components/shadcn/updated/Alert/Alert.stories.tsx b/packages/ui/src/components/shadcn/updated/Alert/Alert.stories.tsx new file mode 100644 index 00000000000..de5cf016871 --- /dev/null +++ b/packages/ui/src/components/shadcn/updated/Alert/Alert.stories.tsx @@ -0,0 +1,92 @@ +// Button.stories.ts|tsx + +import type { Meta, StoryObj } from '@storybook/react' + +import { Alert, AlertProps } from './Alert' + +import { IconAirplay } from '../Icon/icons/IconAirplay' +import { Terminal } from 'lucide-react' + +const meta: Meta = { + /* 👇 The title prop is optional. + * See https://storybook.js.org/docs/react/configure/overview#configure-story-loading + * to learn how to generate automatic titles + */ + title: 'General/Alert', + component: Alert, +} + +export default meta + +type Story = StoryObj + +/* + *👇 Render functions are a framework specific feature to allow you control on how the component renders. + * See https://storybook.js.org/docs/react/api/csf + * to learn how to use render functions. + */ + +export const Info = { + args: { + variant: 'info', + withIcon: true, + }, + render: ({ withIcon, variant }: AlertProps) => ( + + Info Alert + This is an informative message for your application. + + ), +} + +export const Danger = { + args: { + variant: 'danger', + withIcon: true, + }, + render: ({ withIcon, variant }: AlertProps) => ( + + Danger Alert + This is a dangerous warning for your application. + + ), +} + +export const Warning = { + args: { + variant: 'warning', + withIcon: true, + }, + render: ({ withIcon, variant }: AlertProps) => ( + + Warning Alert + This is a warning message for your application. + + ), +} + +export const Success = { + args: { + variant: 'success', + withIcon: true, + }, + render: ({ withIcon, variant }: AlertProps) => ( + + Success Alert + This is a successful notification for your application. + + ), +} + +export const Neutral = { + args: { + variant: 'neutral', + withIcon: true, + }, + render: ({ withIcon, variant }: AlertProps) => ( + + Neutral Alert + This is a neutral message for your application. + + ), +} diff --git a/packages/ui/src/components/shadcn/updated/Alert/Alert.tsx b/packages/ui/src/components/shadcn/updated/Alert/Alert.tsx new file mode 100644 index 00000000000..c555727ee9e --- /dev/null +++ b/packages/ui/src/components/shadcn/updated/Alert/Alert.tsx @@ -0,0 +1,145 @@ +import { cn } from '../../../../lib/utils' +import { VariantProps, cva } from 'class-variance-authority' +import { AlertOctagon, AlertTriangle, Check, Info } from 'lucide-react' +import * as React from 'react' + +export type AlertRootVariantsProps = VariantProps +const alertRootVariants = cva( + `relative w-full + rounded-lg border + py-4 px-6 + [&>svg]:absolute [&>svg]:text-foreground [&>svg]:left-4 [&>svg]:top-4 [&>svg+div]:translate-y-[-3px] [&:has(svg)]:pl-11`, + { + variants: { + variant: { + danger: `bg-red-200 dark:bg-red-100 text-red-1200 border-red-700 [&>svg]:text-red-1200`, + warning: `bg-amber-200 dark:bg-amber-100 border-amber-700 [&>svg]:text-amber-1200`, + info: `bg-scale-400 border-scale-500 dark:bg-scale-100 dark:border-scale-300 [&>svg]:text-scale-1200`, + success: `bg-brand-300 dark:bg-brand-100 border-brand-700 [&>svg]:text-brand-900`, + neutral: `bg-scale-300 dark:bg-scale-300 border-scale-500 [&>svg]:text-scale-900`, + }, + }, + defaultVariants: { + variant: 'info', + }, + } +) + +const alertTitleVariants = cva('mb-1 font-medium leading-none tracking-tight', { + variants: { + variant: { + danger: `text-red-1200`, + warning: `text-amber-1200`, + info: `text-scale-1200`, + success: `text-brand-1200`, + neutral: `text-scale-1200`, + }, + defaultVariants: { + variant: 'info', + }, + }, +}) + +const alertDescriptionVariants = cva('text-sm [&_p]:leading-relaxed', { + variants: { + variant: { + danger: 'text-red-1100', + warning: 'text-amber-1100', + info: 'text-scale-1100', + success: 'text-brand-1100', + neutral: 'text-scale-1100', + }, + defaultVariants: { + variant: 'info', + }, + }, +}) + +interface ContextValue { + variant: AlertRootVariantsProps['variant'] +} + +const AlertContext = React.createContext({ + variant: undefined, +}) + +// Define the Alert component +interface AlertProps + extends React.HTMLAttributes, + VariantProps { + withIcon: boolean +} + +interface AlertComponent + extends React.ForwardRefExoticComponent> { + Title: typeof AlertTitle + Description: typeof AlertDescription +} + +type AlertIconVariant = Exclude +const icons: Record = { + danger: , + success: , + warning: , + info: , + neutral: <>, +} + +const Alert = React.forwardRef( + ({ className, withIcon, variant = 'info', children, ...props }, ref) => { + const contextValue = { + variant, + } + + return ( +
+ {withIcon && icons[variant as AlertIconVariant]} + {children} + + } + /> + ) + } +) as AlertComponent + +Alert.displayName = 'Alert' + +// Define the AlertTitle component as a subcomponent of Alert +interface AlertTitleProps extends React.HTMLAttributes {} + +const AlertTitle = React.forwardRef( + ({ className, ...props }, ref) => { + const { variant } = React.useContext(AlertContext) + console.log('variant', variant) + return
+ } +) + +AlertTitle.displayName = 'AlertTitle' + +// Define the AlertDescription component as a subcomponent of Alert +interface AlertDescriptionProps extends React.HTMLAttributes {} + +const AlertDescription = React.forwardRef( + ({ className, ...props }, ref) => { + const { variant } = React.useContext(AlertContext) + return ( +
+ ) + } +) + +AlertDescription.displayName = 'AlertDescription' + +// Attach the subcomponents to the Alert component +Alert.Title = AlertTitle +Alert.Description = AlertDescription + +// Export the Alert component +export { Alert } diff --git a/packages/ui/src/components/shadcn/updated/Button/Button.stories.tsx b/packages/ui/src/components/shadcn/updated/Button/Button.stories.tsx new file mode 100644 index 00000000000..3827669916e --- /dev/null +++ b/packages/ui/src/components/shadcn/updated/Button/Button.stories.tsx @@ -0,0 +1,175 @@ +// Button.stories.ts|tsx + +import type { Meta, StoryObj } from '@storybook/react' + +import { Button, ButtonProps } from './Button' + +import { IconAirplay } from '../Icon/icons/IconAirplay' + +const meta: Meta = { + /* 👇 The title prop is optional. + * See https://storybook.js.org/docs/react/configure/overview#configure-story-loading + * to learn how to generate automatic titles + */ + title: 'General/Button', + component: Button, +} + +export default meta + +type Story = StoryObj + +/* + *👇 Render functions are a framework specific feature to allow you control on how the component renders. + * See https://storybook.js.org/docs/react/api/csf + * to learn how to use render functions. + */ + +export const Primary = { + args: { + children: 'Hello world', + type: 'primary', + }, + render: ({ children, type }: ButtonProps) => , +} +export const Default = { + args: { + children: 'Hello world', + type: 'default', + }, + render: ({ children, type }: ButtonProps) => , +} + +export const Alternative = { + args: { + children: 'Hello world', + type: 'alternative', + }, + render: ({ children, type }: ButtonProps) => , +} + +export const Outline = { + args: { + children: 'Hello world', + type: 'outline', + }, + render: ({ children, type }: ButtonProps) => , +} + +export const Secondary = { + args: { + children: 'Hello world', + type: 'secondary', + }, + render: ({ children, type }: ButtonProps) => , +} + +export const Dashed = { + args: { + children: 'Hello world', + type: 'dashed', + }, + render: ({ children, type }: ButtonProps) => , +} + +export const Link = { + args: { + children: 'Hello world', + type: 'link', + }, + render: ({ children, type }: ButtonProps) => , +} + +export const Text = { + args: { + children: 'Hello world', + type: 'text', + }, + render: ({ children, type }: ButtonProps) => , +} + +export const Danger = { + args: { + children: 'Hello world', + type: 'danger', + }, + render: ({ children, type }: ButtonProps) => , +} + +export const Block = { + args: { + children: 'Hello world', + type: 'primary', + block: true, + }, + render: ({ children, type, block }: ButtonProps) => ( + + ), +} + +export const Disabled = { + args: { + children: 'Hello world', + type: 'primary', + disabled: true, + }, + render: ({ children, type, disabled }: ButtonProps) => ( + + ), +} + +export const Sizes = { + args: { + children: 'Change the size below', + type: 'primary', + size: 'large', + }, + render: ({ children, type, size }: ButtonProps) => ( + + ), +} + +export const LeftIcon = { + args: { + children: 'Change the size below', + type: 'primary', + iconLeft: , + }, + render: ({ children, type, iconLeft }: ButtonProps) => ( + + ), +} + +export const RightIcon = { + args: { + children: 'Change the size below', + type: 'primary', + iconRight: , + }, + render: ({ children, type, iconRight }: ButtonProps) => ( + + ), +} + +export const Loading = { + args: { + children: 'Change the size below', + type: 'primary', + loading: true, + }, + render: ({ children, type, loading }: ButtonProps) => ( + + ), +} diff --git a/packages/ui/src/components/shadcn/updated/Button/Button.tsx b/packages/ui/src/components/shadcn/updated/Button/Button.tsx new file mode 100644 index 00000000000..4b13fb9cf83 --- /dev/null +++ b/packages/ui/src/components/shadcn/updated/Button/Button.tsx @@ -0,0 +1,192 @@ +import * as React from 'react' +import { Slot } from '@radix-ui/react-slot' +import { VariantProps, cva } from 'class-variance-authority' + +import { IconContext } from '../../../Icon/IconContext' +import { IconLoader } from '../../../Icon/icons/IconLoader' + +import { cn } from '../../../../lib/utils' +import { sizes } from '../../../../lib/commonCva' + +export type ButtonVariantProps = VariantProps +const buttonVariants = cva( + `relative + cursor-pointer + inline-flex + items-center + space-x-2 + text-center + font-regular + ease-out + duration-200 + rounded + outline-none + transition-all + outline-0 + focus-visible:outline-4 + focus-visible:outline-offset-1`, + { + variants: { + type: { + primary: ` + bg-brand-fixed-1100 hover:bg-brand-fixed-1000 + text-white + bordershadow-brand-fixed-1000 hover:bordershadow-brand-fixed-900 dark:bordershadow-brand-fixed-1000 dark:hover:bordershadow-brand-fixed-1000 + focus-visible:outline-brand-600 + shadow-sm`, + secondary: ` + bg-scale-1200 + text-scale-100 hover:text-scale-800 + focus-visible:text-scale-600 + bordershadow-scale-1100 hover:bordershadow-scale-900 + focus-visible:outline-scale-700 + shadow-sm`, + default: ` + text-scale-1200 + bg-scale-100 hover:bg-scale-300 + bordershadow-scale-600 hover:bordershadow-scale-700 + dark:bordershadow-scale-700 hover:dark:bordershadow-scale-800 + dark:bg-scale-500 dark:hover:bg-scale-600 + focus-visible:outline-brand-600 + shadow-sm`, + alternative: ` + text-brand-1100 + bg-brand-200 hover:bg-brand-400 + bordershadow-brand-600 hover:bordershadow-brand-800 + dark:bordershadow-brand-700 hover:dark:bordershadow-brand-800 + focus-visible:border-brand-800 + focus-visible:outline-brand-600 + shadow-sm`, + outline: ` + text-scale-1200 + bg-transparent + bordershadow-scale-600 hover:bordershadow-scale-700 + dark:bordershadow-scale-800 hover:dark:bordershadow-scale-900 + focus-visible:outline-scale-700`, + dashed: ` + text-scale-1200 + border + border-dashed + border-scale-700 hover:border-scale-900 + bg-transparent + focus-visible:outline-scale-700 + shadow-sm`, + link: ` + text-brand-1100 + border + border-transparent + hover:bg-brand-400 + border-opacity-0 + bg-opacity-0 dark:bg-opacity-0 + shadow-none + focus-visible:outline-scale-700`, + text: ` + text-scale-1200 + hover:bg-scale-500 + shadow-none + focus-visible:outline-scale-700`, + danger: ` + text-red-1100 + bg-red-200 + bordershadow-red-700 hover:bordershadow-red-900 + hover:bg-red-900 + hover:text-lo-contrast + focus-visible:outline-red-700 + shadow-sm`, + warning: ` + text-amber-1100 + bg-amber-200 + bordershadow-amber-700 hover:bordershadow-amber-900 + hover:bg-amber-900 + hover:text-hi-contrast + focus-visible:outline-amber-700 + shadow-sm`, + }, + block: { + true: 'w-full flex items-center justify-center', + }, + size: { + ...sizes, + }, + overlay: { + base: `absolute inset-0 bg-scale-200 opacity-50`, + container: `fixed inset-0 transition-opacity`, + }, + disabled: { + true: 'opacity-50 cursor-not-allowed pointer-events-none', + }, + defaultVariants: { + // variant: 'default', + // size: 'default', + }, + }, + } +) + +export type LoadingVariantProps = VariantProps +const loadingVariants = cva('', { + variants: { + loading: { + default: '', + true: `animate-spin`, + }, + }, +}) + +export interface ButtonProps + // omit `type` as we use it to change type of button + // replaced with `htmlType` + extends Omit, 'type'>, + // omit 'disabled' as it is included in HTMLButtonElement + Omit, + LoadingVariantProps { + asChild?: boolean + type?: ButtonVariantProps['type'] + htmlType?: React.ButtonHTMLAttributes['type'] + icon?: React.ReactNode + iconLeft?: React.ReactNode + iconRight?: React.ReactNode +} + +const Button = React.forwardRef( + ({ asChild = false, size = 'small', type = 'primary', ...props }, ref) => { + const Comp = asChild ? Slot : 'button' + + const { className, disabled, loading, icon, iconLeft, iconRight } = props + + const showIcon = loading || icon + + // decrecating 'showIcon' for rightIcon + const _iconLeft: React.ReactNode = icon ?? iconLeft + + const buttonContent = ( + <> + {showIcon && + (loading ? ( + + ) : _iconLeft ? ( + {_iconLeft} + ) : null)} + {props.children && {props.children}} + {iconRight && !loading && ( + {iconRight} + )} + + ) + + return ( + + {buttonContent} + + ) + } +) + +Button.displayName = 'Button' + +export { Button, buttonVariants } From 439c0fe627581091083cf5d9ad4178e902cfde90 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Tue, 23 May 2023 20:28:40 +0800 Subject: [PATCH 029/694] revert --- apps/docs/components/Navigation/Footer.tsx | 166 ++++++++++++--------- 1 file changed, 93 insertions(+), 73 deletions(-) diff --git a/apps/docs/components/Navigation/Footer.tsx b/apps/docs/components/Navigation/Footer.tsx index c9347b74647..e14892a8f39 100644 --- a/apps/docs/components/Navigation/Footer.tsx +++ b/apps/docs/components/Navigation/Footer.tsx @@ -55,85 +55,105 @@ const Footer = () => ( ))}
From 9e86f30bc4eba74b6289e0943833de5ff8b311b7 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Tue, 23 May 2023 20:30:01 +0800 Subject: [PATCH 030/694] revert --- .../Navigation/NavigationMenu/HomeMenu.tsx | 5 +++-- .../NavigationMenuRefListItems.tsx | 16 ++++++++++------ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/apps/docs/components/Navigation/NavigationMenu/HomeMenu.tsx b/apps/docs/components/Navigation/NavigationMenu/HomeMenu.tsx index 761d23a317c..8fbb26b0e4f 100644 --- a/apps/docs/components/Navigation/NavigationMenu/HomeMenu.tsx +++ b/apps/docs/components/Navigation/NavigationMenu/HomeMenu.tsx @@ -1,10 +1,11 @@ import { useTheme } from 'common/Providers' +import Image from 'next/image' import Link from 'next/link' import { useRouter } from 'next/router' import { Fragment } from 'react' -import { Badge, cn } from 'ui' -import HomeMenuIconPicker from './HomeMenuIconPicker' +import { Badge, cn } from '~/../../packages/ui' import { HOMEPAGE_MENU_ITEMS } from './NavigationMenu.constants' +import HomeMenuIconPicker from './HomeMenuIconPicker' const NavigationMenuHome = () => { const router = useRouter() diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenuRefListItems.tsx b/apps/docs/components/Navigation/NavigationMenu/NavigationMenuRefListItems.tsx index 59c0cca96e6..7d5dc734a18 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenuRefListItems.tsx +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenuRefListItems.tsx @@ -1,14 +1,18 @@ import * as Accordion from '@radix-ui/react-accordion' -import Image from 'next/image' import Link from 'next/link' import { useRouter } from 'next/router' -import React, { Fragment } from 'react' import { IconChevronLeft, IconChevronUp, cn } from 'ui' -import RevVersionDropdown from '~/components/RefVersionDropdown' -import { ICommonItem, ICommonSection } from '~/components/reference/Reference.types' -import { useMenuActiveRefId } from '~/hooks/useMenuState' -import HomeMenuIconPicker from './HomeMenuIconPicker' import * as NavItems from './NavigationMenu.constants' + +import Image from 'next/image' + +import RevVersionDropdown from '~/components/RefVersionDropdown' +import { useMenuActiveRefId } from '~/hooks/useMenuState' + +import React, { Fragment } from 'react' + +import { ICommonItem, ICommonSection } from '~/components/reference/Reference.types' +import HomeMenuIconPicker from './HomeMenuIconPicker' import { deepFilterSections } from './NavigationMenu.utils' const HeaderLink = React.memo(function HeaderLink(props: any) { From d19d968ab7d531e912835b2ad4cad43e49a43847 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Tue, 23 May 2023 20:31:23 +0800 Subject: [PATCH 031/694] Update HomeMenu.tsx --- apps/docs/components/Navigation/NavigationMenu/HomeMenu.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/docs/components/Navigation/NavigationMenu/HomeMenu.tsx b/apps/docs/components/Navigation/NavigationMenu/HomeMenu.tsx index 8fbb26b0e4f..0b7772f8595 100644 --- a/apps/docs/components/Navigation/NavigationMenu/HomeMenu.tsx +++ b/apps/docs/components/Navigation/NavigationMenu/HomeMenu.tsx @@ -3,7 +3,8 @@ import Image from 'next/image' import Link from 'next/link' import { useRouter } from 'next/router' import { Fragment } from 'react' -import { Badge, cn } from '~/../../packages/ui' +import { Badge } from '~/../../packages/ui' +import { cn } from 'ui/src/lib/utils/cn' import { HOMEPAGE_MENU_ITEMS } from './NavigationMenu.constants' import HomeMenuIconPicker from './HomeMenuIconPicker' From c35de88c4a851779c9c89210c72270b12fb58248 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Tue, 23 May 2023 20:31:46 +0800 Subject: [PATCH 032/694] Update NavigationMenuRefListItems.tsx --- .../Navigation/NavigationMenu/NavigationMenuRefListItems.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenuRefListItems.tsx b/apps/docs/components/Navigation/NavigationMenu/NavigationMenuRefListItems.tsx index 7d5dc734a18..510b5061e44 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenuRefListItems.tsx +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenuRefListItems.tsx @@ -1,7 +1,7 @@ import * as Accordion from '@radix-ui/react-accordion' import Link from 'next/link' import { useRouter } from 'next/router' -import { IconChevronLeft, IconChevronUp, cn } from 'ui' +import { IconChevronLeft, IconChevronUp } from 'ui' import * as NavItems from './NavigationMenu.constants' import Image from 'next/image' @@ -10,7 +10,7 @@ import RevVersionDropdown from '~/components/RefVersionDropdown' import { useMenuActiveRefId } from '~/hooks/useMenuState' import React, { Fragment } from 'react' - +import { cn } from 'ui/src/lib/utils/cn' import { ICommonItem, ICommonSection } from '~/components/reference/Reference.types' import HomeMenuIconPicker from './HomeMenuIconPicker' import { deepFilterSections } from './NavigationMenu.utils' From 729e6d778d1953c4f93fff3e44f38fa47a09a70d Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Tue, 23 May 2023 20:32:24 +0800 Subject: [PATCH 033/694] Update ImageFadeStack.tsx --- apps/www/components/ImageFadeStack.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/www/components/ImageFadeStack.tsx b/apps/www/components/ImageFadeStack.tsx index b8f7236d408..9ad108a7f74 100644 --- a/apps/www/components/ImageFadeStack.tsx +++ b/apps/www/components/ImageFadeStack.tsx @@ -1,6 +1,7 @@ import Image from 'next/image' import React, { useState, useEffect } from 'react' -import { IconPauseCircle, IconPlayCircle, cn } from 'ui' +import { IconPauseCircle, IconPlayCircle } from 'ui' +import { cn } from '~/../../packages/ui/src/lib/utils/cn' interface ImageFadeStackProps { autoplay?: boolean From 87e8bc6282ccbbdcb544319e491288eb41a2eeb1 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Tue, 23 May 2023 20:38:45 +0800 Subject: [PATCH 034/694] update --- packages/ui/src/components/Accordion/Accordion.tsx | 7 ++++++- packages/ui/src/components/Alert/Alert.stories.tsx | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/ui/src/components/Accordion/Accordion.tsx b/packages/ui/src/components/Accordion/Accordion.tsx index 524bf7b9de9..f175a320fba 100644 --- a/packages/ui/src/components/Accordion/Accordion.tsx +++ b/packages/ui/src/components/Accordion/Accordion.tsx @@ -26,10 +26,13 @@ const AccordionContext = createContext({ export interface AccordionProps { children?: React.ReactNode className?: string - + defaultActiveId?: (string | number)[] + icon?: React.ReactNode + iconPosition?: Align onChange?: (item: string | string[]) => void openBehaviour: 'single' | 'multiple' type?: Type + size?: Size defaultValue?: string | string[] | undefined justified?: Boolean chevronAlign?: Align @@ -71,6 +74,8 @@ function Accordion({ return ( <> + {/* // + @ts-expect-error */} Date: Tue, 23 May 2023 20:40:24 +0800 Subject: [PATCH 035/694] fix alert --- packages/ui/src/components/Alert/Alert.stories.tsx | 2 +- packages/ui/src/components/Alert/Alert.tsx | 4 +--- packages/ui/src/components/Alert/index.tsx | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/ui/src/components/Alert/Alert.stories.tsx b/packages/ui/src/components/Alert/Alert.stories.tsx index 915e408018b..42e52242b83 100644 --- a/packages/ui/src/components/Alert/Alert.stories.tsx +++ b/packages/ui/src/components/Alert/Alert.stories.tsx @@ -1,6 +1,6 @@ import React from 'react' -import Alert, { AlertProps } from './Alert' +import { Alert, AlertProps } from './Alert' export default { title: 'Displays/Alerts', diff --git a/packages/ui/src/components/Alert/Alert.tsx b/packages/ui/src/components/Alert/Alert.tsx index cf0b96fe810..ff819091e76 100644 --- a/packages/ui/src/components/Alert/Alert.tsx +++ b/packages/ui/src/components/Alert/Alert.tsx @@ -27,7 +27,7 @@ const icons: Record<'success' | 'danger' | 'warning' | 'info' | 'neutral', React neutral: <>, } -function Alert({ +export function Alert({ variant = 'neutral', className, title, @@ -80,5 +80,3 @@ function Alert({ ) } - -export default Alert diff --git a/packages/ui/src/components/Alert/index.tsx b/packages/ui/src/components/Alert/index.tsx index 545a13bde4d..1d5a733b147 100644 --- a/packages/ui/src/components/Alert/index.tsx +++ b/packages/ui/src/components/Alert/index.tsx @@ -1 +1 @@ -export { default as Alert } from '../shadcn/updated/Alert/Alert' +export * from './Alert' From 199aa9b74b7304c65283980f67c10d436f13bf71 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Tue, 23 May 2023 20:49:55 +0800 Subject: [PATCH 036/694] revert --- packages/ui/src/components/Badge/Badge.tsx | 85 +++++----- .../shadcn/updated/Badge/Badge.stories.tsx | 155 ++++++++++++++++++ .../components/shadcn/updated/Badge/Badge.tsx | 51 ++++++ 3 files changed, 244 insertions(+), 47 deletions(-) create mode 100644 packages/ui/src/components/shadcn/updated/Badge/Badge.stories.tsx create mode 100644 packages/ui/src/components/shadcn/updated/Badge/Badge.tsx diff --git a/packages/ui/src/components/Badge/Badge.tsx b/packages/ui/src/components/Badge/Badge.tsx index c7096715f21..af526dc7747 100644 --- a/packages/ui/src/components/Badge/Badge.tsx +++ b/packages/ui/src/components/Badge/Badge.tsx @@ -1,51 +1,42 @@ -import * as React from 'react' -import { VariantProps, cva } from 'class-variance-authority' +import { AvailableColors } from '../../lib/constants' +import styleHandler from '../../lib/theme/styleHandler' -import { cn } from './../../lib/utils' - -const badgeVariants = cva( - 'inline-flex items-center border rounded-full px-2.5 py-0.5 text-xs font-normal transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2', - { - variants: { - variant: { - outline: 'text-foreground', - brand: 'bg-brand-200 text-brand-1100 border border-brand-700', - scale: 'bg-scale-200 text-scale-1100 border border-scale-700', - tomato: `bg-tomato-200 text-tomato-1100 border border-tomato-700`, - red: `bg-red-200 text-red-1100 border border-red-700`, - crimson: `bg-crimson-200 text-crimson-1100 border border-crimson-700`, - pink: `bg-pink-200 text-pink-1100 border border-pink-700`, - purple: `bg-purple-200 text-purple-1100 border border-purple-700`, - violet: `bg-violet-200 text-violet-1100 border border-violet-700`, - indigo: `bg-indigo-200 text-indigo-1100 border border-indigo-700`, - blue: `bg-blue-200 text-blue-1100 border border-blue-700`, - green: `bg-green-200 text-green-1100 border border-green-700`, - grass: `bg-grass-200 text-grass-1100 border border-grass-700`, - orange: `bg-orange-200 text-orange-1100 border border-orange-700`, - yellow: `bg-yellow-200 text-yellow-1100 border border-yellow-700`, - amber: `bg-amber-200 text-amber-1100 border border-amber-700`, - gold: `bg-gold-200 text-gold-1100 border border-gold-700`, - gray: `bg-gray-200 text-gray-1100 border border-gray-700`, - slate: `bg-slate-200 text-slate-1100 border border-slate-700`, - }, - size: { - large: 'px-3 py-0.5 rounded-full text-sm', - }, - }, - defaultVariants: { - variant: 'scale', - }, - } -) - -export interface BadgeProps - extends React.HTMLAttributes, - VariantProps {} - -const Badge = ({ className, variant, size, ...props }: BadgeProps) => { - return
+interface Props { + color?: AvailableColors + children: string | React.ReactNode + size?: 'large' | 'small' + dot?: boolean + className?: string } -Badge.displayName = 'Badge' +function Badge({ color = 'brand', children, size, dot, className }: Props) { + const __styles = styleHandler('badge') -export { Badge } + let classes = [__styles.base] + if (color) { + classes.push(__styles.color[color]) + } + if (size === 'large') { + classes.push(__styles.size.large) + } + if (className) { + classes.push(className) + } + + return ( + + {dot && ( + + + + )} + + {children} + + ) +} +export default Badge diff --git a/packages/ui/src/components/shadcn/updated/Badge/Badge.stories.tsx b/packages/ui/src/components/shadcn/updated/Badge/Badge.stories.tsx new file mode 100644 index 00000000000..5567cb06464 --- /dev/null +++ b/packages/ui/src/components/shadcn/updated/Badge/Badge.stories.tsx @@ -0,0 +1,155 @@ +import type { Meta, StoryObj } from '@storybook/react' +import { Badge, BadgeProps } from './Badge' + +const meta: Meta = { + /* 👇 The title prop is optional. + * See https://storybook.js.org/docs/react/configure/overview#configure-story-loading + * to learn how to generate automatic titles + */ + title: 'General/Badge', + component: Badge, +} + +export default meta + +type Story = StoryObj + +export const Outline = { + args: { + variant: 'outline', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Brand = { + args: { + variant: 'brand', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Scale = { + args: { + variant: 'scale', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Tomato = { + args: { + variant: 'tomato', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Red = { + args: { + variant: 'red', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Crimson = { + args: { + variant: 'crimson', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Pink = { + args: { + variant: 'pink', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Purple = { + args: { + variant: 'purple', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Violet = { + args: { + variant: 'violet', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Indigo = { + args: { + variant: 'indigo', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Blue = { + args: { + variant: 'blue', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Green = { + args: { + variant: 'green', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Grass = { + args: { + variant: 'grass', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Orange = { + args: { + variant: 'orange', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Yellow = { + args: { + variant: 'yellow', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Amber = { + args: { + variant: 'amber', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Gold = { + args: { + variant: 'gold', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Gray = { + args: { + variant: 'gray', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Slate = { + args: { + variant: 'slate', + }, + render: ({ variant }: BadgeProps) => Hello World, +} + +export const Large = { + args: { + size: 'large', + }, + render: ({ size }: BadgeProps) => Hello World, +} diff --git a/packages/ui/src/components/shadcn/updated/Badge/Badge.tsx b/packages/ui/src/components/shadcn/updated/Badge/Badge.tsx new file mode 100644 index 00000000000..d3910f5e16c --- /dev/null +++ b/packages/ui/src/components/shadcn/updated/Badge/Badge.tsx @@ -0,0 +1,51 @@ +import * as React from 'react' +import { VariantProps, cva } from 'class-variance-authority' + +import { cn } from './../../lib/utils' + +const badgeVariants = cva( + 'inline-flex items-center border rounded-full px-2.5 py-0.5 text-xs font-normal transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2', + { + variants: { + variant: { + outline: 'text-foreground', + brand: 'bg-brand-200 text-brand-1100 border border-brand-700', + scale: 'bg-scale-200 text-scale-1100 border border-scale-700', + tomato: `bg-tomato-200 text-tomato-1100 border border-tomato-700`, + red: `bg-red-200 text-red-1100 border border-red-700`, + crimson: `bg-crimson-200 text-crimson-1100 border border-crimson-700`, + pink: `bg-pink-200 text-pink-1100 border border-pink-700`, + purple: `bg-purple-200 text-purple-1100 border border-purple-700`, + violet: `bg-violet-200 text-violet-1100 border border-violet-700`, + indigo: `bg-indigo-200 text-indigo-1100 border border-indigo-700`, + blue: `bg-blue-200 text-blue-1100 border border-blue-700`, + green: `bg-green-200 text-green-1100 border border-green-700`, + grass: `bg-grass-200 text-grass-1100 border border-grass-700`, + orange: `bg-orange-200 text-orange-1100 border border-orange-700`, + yellow: `bg-yellow-200 text-yellow-1100 border border-yellow-700`, + amber: `bg-amber-200 text-amber-1100 border border-amber-700`, + gold: `bg-gold-200 text-gold-1100 border border-gold-700`, + gray: `bg-gray-200 text-gray-1100 border border-gray-700`, + slate: `bg-slate-200 text-slate-1100 border border-slate-700`, + }, + size: { + large: 'px-3 py-0.5 rounded-full text-sm', + }, + }, + defaultVariants: { + variant: 'scale', + }, + } +) + +export interface BadgeProps + extends React.HTMLAttributes, + VariantProps {} + +const Badge = ({ className, variant, size, ...props }: BadgeProps) => { + return
+} + +// Badge.displayName = 'Badge' + +export { Badge } From 78b37d7f93b714b1603f1efa6cbd2d7604c9ac58 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Tue, 23 May 2023 21:46:11 +0800 Subject: [PATCH 037/694] update background color of preview --- packages/ui/.storybook/preview.css | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/ui/.storybook/preview.css b/packages/ui/.storybook/preview.css index 3f34bda100e..28dc3437d32 100644 --- a/packages/ui/.storybook/preview.css +++ b/packages/ui/.storybook/preview.css @@ -89,7 +89,11 @@ @apply border-border; } body { - @apply bg-background text-foreground; + /* @apply bg-background text-foreground; + font-feature-settings: 'rlig' 1, 'calt' 1; */ + + @apply bg-body text-body; + font-family: 'Circular std'; font-feature-settings: 'rlig' 1, 'calt' 1; } } @@ -98,6 +102,6 @@ .light, .light .docs-story, .dark .docs-story { - @apply bg-background text-foreground; - font-family: 'Circular std'; + /* @apply bg-background text; + font-family: 'Circular std'; */ } From e7ab8082229993b94c2bcc57e904b043eb6abdcc Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Tue, 23 May 2023 21:46:20 +0800 Subject: [PATCH 038/694] add new dropdown example --- .../shadcn/stories/DropdownMenu.stories.tsx | 92 ++++++++++++++++--- 1 file changed, 77 insertions(+), 15 deletions(-) diff --git a/packages/ui/src/components/shadcn/stories/DropdownMenu.stories.tsx b/packages/ui/src/components/shadcn/stories/DropdownMenu.stories.tsx index 72a7a1f7e2b..06c3d5bce41 100644 --- a/packages/ui/src/components/shadcn/stories/DropdownMenu.stories.tsx +++ b/packages/ui/src/components/shadcn/stories/DropdownMenu.stories.tsx @@ -1,4 +1,22 @@ import type { Meta, StoryObj } from '@storybook/react' +import { Button } from '@ui/components/shadcn/button' +import { + DropdownMenu, + DropdownMenuCheckboxItem, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuPortal, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuTrigger, +} from '@ui/components/shadcn/dropdown-menu' import { Cloud, CreditCard, @@ -15,22 +33,9 @@ import { UserPlus, Users, } from 'lucide-react' +import React from 'react' -import { Button } from '@ui/components/shadcn/button' -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuGroup, - DropdownMenuItem, - DropdownMenuLabel, - DropdownMenuPortal, - DropdownMenuSeparator, - DropdownMenuShortcut, - DropdownMenuSub, - DropdownMenuSubContent, - DropdownMenuSubTrigger, - DropdownMenuTrigger, -} from '@ui/components/shadcn/dropdown-menu' +type Checked = DropdownMenuCheckboxItemProps['checked'] const meta: Meta = { /* 👇 The title prop is optional. @@ -144,3 +149,60 @@ export const Default = { ), } + +export const Checkboxes = { + args: {}, + render: ({}) => { + const [showStatusBar, setShowStatusBar] = React.useState(true) + const [showActivityBar, setShowActivityBar] = React.useState(false) + const [showPanel, setShowPanel] = React.useState(false) + return ( + + + + + + Appearance + + + Status Bar + + + Activity Bar + + + Panel + + + + ) + }, +} + +export const RadioGroup = { + args: {}, + render: ({}) => { + const [position, setPosition] = React.useState('bottom') + + return ( + + + + + + Panel Position + + + Top + Bottom + Right + + + + ) + }, +} From 73d10a0419838f2649f4ca6b970d01dccf001161 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Tue, 23 May 2023 22:06:43 +0800 Subject: [PATCH 039/694] Added command and ComboBox examples --- packages/ui/.storybook/preview.css | 4 +- packages/ui/src/components/shadcn/command.tsx | 145 ++++++ packages/ui/src/components/shadcn/dialog.tsx | 106 +++++ .../shadcn/stories/ComboBox.stories.tsx | 423 ++++++++++++++++++ 4 files changed, 676 insertions(+), 2 deletions(-) create mode 100644 packages/ui/src/components/shadcn/command.tsx create mode 100644 packages/ui/src/components/shadcn/dialog.tsx create mode 100644 packages/ui/src/components/shadcn/stories/ComboBox.stories.tsx diff --git a/packages/ui/.storybook/preview.css b/packages/ui/.storybook/preview.css index 28dc3437d32..2850c368505 100644 --- a/packages/ui/.storybook/preview.css +++ b/packages/ui/.storybook/preview.css @@ -15,7 +15,7 @@ @layer base { :root { --background: var(--theme-variables-background-body); /* --background: 0 0% 100%; */ - --foreground: var(--theme-variables-background); /* --foreground: 222.2 47.4% 11.2%; */ + --foreground: var(--text-color-body-default); /* --foreground: 222.2 47.4% 11.2%; */ --muted: 210 40% 96.1%; --muted-foreground: 215.4 16.3% 46.9%; @@ -50,7 +50,7 @@ .dark { --background: var(--theme-variables-background-body); /* --background: 224 71% 4%; */ - --foreground: var(--theme-variables-background); /* --foreground: 213 31% 91%; */ + --foreground: var(--text-color-body-default); /* --foreground: 213 31% 91%; */ --muted: var(--background-color-body); /* --muted: 223 47% 11%; */ --muted-foreground: 215.4 16.3% 56.9%; diff --git a/packages/ui/src/components/shadcn/command.tsx b/packages/ui/src/components/shadcn/command.tsx new file mode 100644 index 00000000000..8c8940306ac --- /dev/null +++ b/packages/ui/src/components/shadcn/command.tsx @@ -0,0 +1,145 @@ +'use client' + +import * as React from 'react' +import { DialogProps } from '@radix-ui/react-dialog' +import { Command as CommandPrimitive } from 'cmdk-supabase' +import { Search } from 'lucide-react' + +import { cn } from '@ui/lib/utils' +import { Dialog, DialogContent } from '@ui/components/shadcn/dialog' + +const Command = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +Command.displayName = CommandPrimitive.displayName + +interface CommandDialogProps extends DialogProps {} + +const CommandDialog = ({ children, ...props }: CommandDialogProps) => { + return ( + + + + {children} + + + + ) +} + +const CommandInput = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( +
+ + +
+)) + +CommandInput.displayName = CommandPrimitive.Input.displayName + +const CommandList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandList.displayName = CommandPrimitive.List.displayName + +const CommandEmpty = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>((props, ref) => ( + +)) + +CommandEmpty.displayName = CommandPrimitive.Empty.displayName + +const CommandGroup = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandGroup.displayName = CommandPrimitive.Group.displayName + +const CommandSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +CommandSeparator.displayName = CommandPrimitive.Separator.displayName + +const CommandItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandItem.displayName = CommandPrimitive.Item.displayName + +const CommandShortcut = ({ className, ...props }: React.HTMLAttributes) => { + return ( + + ) +} +CommandShortcut.displayName = 'CommandShortcut' + +export { + Command, + CommandDialog, + CommandInput, + CommandList, + CommandEmpty, + CommandGroup, + CommandItem, + CommandShortcut, + CommandSeparator, +} diff --git a/packages/ui/src/components/shadcn/dialog.tsx b/packages/ui/src/components/shadcn/dialog.tsx new file mode 100644 index 00000000000..5055e1bdddd --- /dev/null +++ b/packages/ui/src/components/shadcn/dialog.tsx @@ -0,0 +1,106 @@ +'use client' + +import * as React from 'react' +import * as DialogPrimitive from '@radix-ui/react-dialog' +import { X } from 'lucide-react' + +import { cn } from '@ui/lib/utils' + +const Dialog = DialogPrimitive.Root + +const DialogTrigger = DialogPrimitive.Trigger + +const DialogPortal = ({ className, children, ...props }: DialogPrimitive.DialogPortalProps) => ( + +
+ {children} +
+
+) +DialogPortal.displayName = DialogPrimitive.Portal.displayName + +const DialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName + +const DialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)) +DialogContent.displayName = DialogPrimitive.Content.displayName + +const DialogHeader = ({ className, ...props }: React.HTMLAttributes) => ( +
+) +DialogHeader.displayName = 'DialogHeader' + +const DialogFooter = ({ className, ...props }: React.HTMLAttributes) => ( +
+) +DialogFooter.displayName = 'DialogFooter' + +const DialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogTitle.displayName = DialogPrimitive.Title.displayName + +const DialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogDescription.displayName = DialogPrimitive.Description.displayName + +export { + Dialog, + DialogTrigger, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription, +} diff --git a/packages/ui/src/components/shadcn/stories/ComboBox.stories.tsx b/packages/ui/src/components/shadcn/stories/ComboBox.stories.tsx new file mode 100644 index 00000000000..08d04d8dfbe --- /dev/null +++ b/packages/ui/src/components/shadcn/stories/ComboBox.stories.tsx @@ -0,0 +1,423 @@ +import { + Form, + FormControl, + FormDescription, + FormField, + FormItem, + FormLabel, + FormMessage, +} from '@ui/components/shadcn/form' +import { zodResolver } from '@hookform/resolvers/zod' +import type { Meta } from '@storybook/react' +import { Button } from '@ui/components/shadcn/button' +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, +} from '@ui/components/shadcn/command' +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuTrigger, +} from '@ui/components/shadcn/dropdown-menu' +import { Popover, PopoverContent, PopoverTrigger } from '@ui/components/shadcn/popover' +import { toast } from '@ui/components/shadcn/use-toast' +import { cn } from '@ui/lib/utils' +import { + ArrowUpCircle, + Calendar, + Check, + CheckCircle2, + ChevronsUpDown, + Circle, + HelpCircle, + LucideIcon, + MoreHorizontal, + Tags, + Trash, + User, + XCircle, +} from 'lucide-react' +import React from 'react' +import { useForm } from 'react-hook-form' +import * as z from 'zod' + +const meta: Meta = { + /* 👇 The title prop is optional. + * See https://storybook.js.org/docs/react/configure/overview#configure-story-loading + * to learn how to generate automatic titles + */ + title: 'shadcn/Combobox', + component: DropdownMenu, +} + +export default meta + +// type Story = StoryObj + +/* + *👇 Render functions are a framework specific feature to allow you control on how the component renders. + * See https://storybook.js.org/docs/react/api/csf + * to learn how to use render functions. + */ + +export const Combobox = { + args: {}, + render: ({}) => { + const [open, setOpen] = React.useState(false) + const [value, setValue] = React.useState('') + + const frameworks = [ + { + value: 'next.js', + label: 'Next.js', + }, + { + value: 'sveltekit', + label: 'SvelteKit', + }, + { + value: 'nuxt.js', + label: 'Nuxt.js', + }, + { + value: 'remix', + label: 'Remix', + }, + { + value: 'astro', + label: 'Astro', + }, + ] + + return ( + + + + + + + + No framework found. + + {frameworks.map((framework) => ( + { + setValue(currentValue === value ? '' : currentValue) + setOpen(false) + }} + > + + {framework.label} + + ))} + + + + + ) + }, +} + +export const PopoverExample = { + args: {}, + render: ({}) => { + type Status = { + value: string + label: string + icon: LucideIcon + } + + const statuses: Status[] = [ + { + value: 'backlog', + label: 'Backlog', + icon: HelpCircle, + }, + { + value: 'todo', + label: 'Todo', + icon: Circle, + }, + { + value: 'in progress', + label: 'In Progress', + icon: ArrowUpCircle, + }, + { + value: 'done', + label: 'Done', + icon: CheckCircle2, + }, + { + value: 'canceled', + label: 'Canceled', + icon: XCircle, + }, + ] + + const [open, setOpen] = React.useState(false) + const [selectedStatus, setSelectedStatus] = React.useState(null) + + return ( +
+

Status

+ + + + + + + + + No results found. + + {statuses.map((status) => ( + { + setSelectedStatus( + statuses.find((priority) => priority.value === value) || null + ) + setOpen(false) + }} + > + + {status.label} + + ))} + + + + + +
+ ) + }, +} + +export const DropdownExample = { + args: {}, + render: ({}) => { + const [label, setLabel] = React.useState('feature') + const [open, setOpen] = React.useState(false) + + const labels = [ + 'feature', + 'bug', + 'enhancement', + 'documentation', + 'design', + 'question', + 'maintenance', + ] + return ( +
+

+ + {label} + + Create a new project +

+ + + + + + Actions + + + + Assign to... + + + + Set due date... + + + + + + Apply label + + + + + + No label found. + + {labels.map((label) => ( + { + setLabel(value) + setOpen(false) + }} + > + {label} + + ))} + + + + + + + + + Delete + ⌘⌫ + + + + +
+ ) + }, +} + +export const ReactHookFormDemo = { + args: {}, + render: ({}) => { + const languages = [ + { label: 'English', value: 'en' }, + { label: 'French', value: 'fr' }, + { label: 'German', value: 'de' }, + { label: 'Spanish', value: 'es' }, + { label: 'Portuguese', value: 'pt' }, + { label: 'Russian', value: 'ru' }, + { label: 'Japanese', value: 'ja' }, + { label: 'Korean', value: 'ko' }, + { label: 'Chinese', value: 'zh' }, + ] as const + + const FormSchema = z.object({ + language: z.string({ + required_error: 'Please select a language.', + }), + }) + + const form = useForm>({ + resolver: zodResolver(FormSchema), + }) + + function onSubmit(data: z.infer) { + toast({ + title: 'You submitted the following values:', + description: ( +
+            {JSON.stringify(data, null, 2)}
+          
+ ), + }) + } + + return ( +
+ + ( + + Language + + + + + + + + + + No framework found. + + {languages.map((language) => ( + { + form.setValue('language', value) + }} + > + + {language.label} + + ))} + + + + + + This is the language that will be used in the dashboard. + + + + )} + /> + + + + ) + }, +} From b93c483cb9b3ad216d4e6d22da1e5f30c15266d7 Mon Sep 17 00:00:00 2001 From: Alaister Young Date: Thu, 25 May 2023 15:06:28 +1000 Subject: [PATCH 040/694] initial changes for vercel integration --- .../interfaces/Integrations/ProjectLinker.tsx | 84 +++++++++++++++++++ studio/components/ui/OrganizationPicker.tsx | 59 +++++++++++++ studio/data/integrations/keys.ts | 4 + .../vercel-integration-create-mutation.ts | 46 ++++++++++ .../integrations/vercel-projects-query.ts | 72 ++++++++++++++++ studio/hooks/misc/useAutoAuthRedirect.tsx | 4 +- studio/pages/integrations/vercel.tsx | 67 +++++++++++++++ 7 files changed, 333 insertions(+), 3 deletions(-) create mode 100644 studio/components/interfaces/Integrations/ProjectLinker.tsx create mode 100644 studio/components/ui/OrganizationPicker.tsx create mode 100644 studio/data/integrations/keys.ts create mode 100644 studio/data/integrations/vercel-integration-create-mutation.ts create mode 100644 studio/data/integrations/vercel-projects-query.ts create mode 100644 studio/pages/integrations/vercel.tsx diff --git a/studio/components/interfaces/Integrations/ProjectLinker.tsx b/studio/components/interfaces/Integrations/ProjectLinker.tsx new file mode 100644 index 00000000000..f00e815e59f --- /dev/null +++ b/studio/components/interfaces/Integrations/ProjectLinker.tsx @@ -0,0 +1,84 @@ +import { IconChevronRight, Listbox } from 'ui' + +const ProjectLinker = () => { + return
+} + +export default ProjectLinker + +type ProjectLinkerItemProps = {} +const ProjectLinkerItem = ({}: ProjectLinkerItemProps) => { + function onVercelProjectChange(e: string) { + const value = e != UNDEFINED_SELECT_VALUE ? e : undefined + } + + function onSupabaseProjectChange(e: string) { + const value = e != UNDEFINED_SELECT_VALUE ? e : undefined + } + + function onRemove() {} + + return ( +
  • +
    +
    + + + Choose a project + + {selectedVercelProject && ( + vercelIcon} + > + {selectedVercelProject.name} + + )} + {_store.vercelProjectsAvailable.map((x) => ( + vercelIcon}> + {x.name} + + ))} + +
    +
    + +
    +
    + + + Choose a project + + {sortedProjects?.map((x: Dictionary) => ( + databaseIcon} + > + {x.name} + + ))} + +
    + {/* {idx != 0 && ( +
    +
    + )} */} +
    +
  • + ) +} diff --git a/studio/components/ui/OrganizationPicker.tsx b/studio/components/ui/OrganizationPicker.tsx new file mode 100644 index 00000000000..808a5166f68 --- /dev/null +++ b/studio/components/ui/OrganizationPicker.tsx @@ -0,0 +1,59 @@ +import { useOrganizationsQuery } from 'data/organizations/organizations-query' +import { useState } from 'react' +import { Organization } from 'types' +import { Listbox } from 'ui' + +export interface OrganizationPickerProps { + label?: string + onSelectedOrgChange?: (org: Organization) => void +} + +const OrganizationPicker = ({ + label = 'Choose an organization', + onSelectedOrgChange, +}: OrganizationPickerProps) => { + const [selectedOrg, setSelectedOrg] = useState(null) + + const { data, isLoading } = useOrganizationsQuery({ + onSuccess(organizations) { + const firstOrg = organizations?.[0] + if (firstOrg && selectedOrg === null) { + setSelectedOrg(firstOrg) + onSelectedOrgChange?.(firstOrg) + } + }, + }) + + function _onSelectedOrgChange(slug: string) { + const org = data?.find((org) => org.slug === slug) + + if (org) { + setSelectedOrg(org) + onSelectedOrgChange?.(org) + } + } + + if (isLoading) { + return ( + + + Loading... + + + ) + } + + return ( + + {data?.map((org) => { + return ( + + {org.name} + + ) + })} + + ) +} + +export default OrganizationPicker diff --git a/studio/data/integrations/keys.ts b/studio/data/integrations/keys.ts new file mode 100644 index 00000000000..6859ecd3b0c --- /dev/null +++ b/studio/data/integrations/keys.ts @@ -0,0 +1,4 @@ +export const integrationKeys = { + vercelProjectList: (orgSlug: string | undefined) => + ['organizations', orgSlug, 'vercel-projects'] as const, +} diff --git a/studio/data/integrations/vercel-integration-create-mutation.ts b/studio/data/integrations/vercel-integration-create-mutation.ts new file mode 100644 index 00000000000..69703a157ac --- /dev/null +++ b/studio/data/integrations/vercel-integration-create-mutation.ts @@ -0,0 +1,46 @@ +import { useMutation, UseMutationOptions } from '@tanstack/react-query' +import { post } from 'lib/common/fetch' +import { API_URL } from 'lib/constants' + +export type VercelIntegrationCreateVariables = { + code: string + configurationId: string + orgId: number +} + +export async function createVercelIntegration({ + code, + configurationId, + orgId, +}: VercelIntegrationCreateVariables) { + const response = await post(`${API_URL}/integrations/vercel`, { + code, + configurationId, + orgId, + }) + if (response.error) { + throw response.error + } + + return response +} + +type VercelIntegrationCreateData = Awaited> + +export const useVercelIntegrationCreateMutation = ({ + onSuccess, + ...options +}: Omit< + UseMutationOptions, + 'mutationFn' +> = {}) => { + return useMutation( + (vars) => createVercelIntegration(vars), + { + async onSuccess(data, variables, context) { + await onSuccess?.(data, variables, context) + }, + ...options, + } + ) +} diff --git a/studio/data/integrations/vercel-projects-query.ts b/studio/data/integrations/vercel-projects-query.ts new file mode 100644 index 00000000000..06fe30f1c86 --- /dev/null +++ b/studio/data/integrations/vercel-projects-query.ts @@ -0,0 +1,72 @@ +import { useQuery, useQueryClient, UseQueryOptions } from '@tanstack/react-query' +import { get } from 'lib/common/fetch' +import { API_URL } from 'lib/constants' +import { useCallback } from 'react' +import { integrationKeys } from './keys' + +export type VercelProjectsVariables = { + orgId?: number + orgSlug?: string +} + +export type VercelProjectsResponse = { + id: string +} + +export async function getVercelProjects({ orgId }: VercelProjectsVariables, signal?: AbortSignal) { + if (!orgId) { + throw new Error('orgId is required') + } + + const response = await get(`${API_URL}/integrations/vercel/projects?orgId=${orgId}`, { + signal, + }) + if (response.error) { + throw response.error + } + + return response as VercelProjectsResponse[] +} + +export type VercelProjectsData = Awaited> +export type VercelProjectsError = unknown + +export const useVercelProjectsQuery = ( + { orgSlug, orgId }: VercelProjectsVariables, + { + enabled = true, + ...options + }: UseQueryOptions = {} +) => + useQuery( + integrationKeys.vercelProjectList(orgSlug), + ({ signal }) => getVercelProjects({ orgSlug, orgId }, signal), + { + enabled: enabled && typeof orgSlug !== 'undefined' && typeof orgId !== 'undefined', + ...options, + } + ) + +/** + * useVercelProjectsPrefetch is used for prefetching data. For example, starting a query loading before a page is navigated to. + * + * @example + * const prefetch = useVercelProjectsPrefetch({ orgSlug }) + * + * return ( + * prefetch()}> + * Start loading on hover + * + * ) + */ +export const useVercelProjectsPrefetch = ({ orgSlug, orgId }: VercelProjectsVariables) => { + const client = useQueryClient() + + return useCallback(() => { + if (orgSlug) { + client.prefetchQuery(integrationKeys.vercelProjectList(orgSlug), ({ signal }) => + getVercelProjects({ orgSlug, orgId }, signal) + ) + } + }, [orgSlug]) +} diff --git a/studio/hooks/misc/useAutoAuthRedirect.tsx b/studio/hooks/misc/useAutoAuthRedirect.tsx index 3a63cae6976..ca97fe8d486 100644 --- a/studio/hooks/misc/useAutoAuthRedirect.tsx +++ b/studio/hooks/misc/useAutoAuthRedirect.tsx @@ -19,9 +19,7 @@ export function usePushNext() { // vercel integration const isVercelIntegration = next.includes('https://vercel.com') if (isVercelIntegration) { - searchParams.delete('returnTo') - - return await router.push(`/vercel/integrate?${searchParams.toString()}`) + return } // database.new integration diff --git a/studio/pages/integrations/vercel.tsx b/studio/pages/integrations/vercel.tsx new file mode 100644 index 00000000000..173a0eb2460 --- /dev/null +++ b/studio/pages/integrations/vercel.tsx @@ -0,0 +1,67 @@ +import { useParams } from 'common' +import { WizardLayout } from 'components/layouts' +import OrganizationPicker from 'components/ui/OrganizationPicker' +import { useVercelIntegrationCreateMutation } from 'data/integrations/vercel-integration-create-mutation' +import { useVercelProjectsQuery } from 'data/integrations/vercel-projects-query' +import { useStore } from 'hooks' +import { useState } from 'react' +import { NextPageWithLayout, Organization } from 'types' +import { Button } from 'ui' + +const VercelIntegration: NextPageWithLayout = () => { + const { ui } = useStore() + const { code, configurationId } = useParams() + const [selectedOrg, setSelectedOrg] = useState(null) + const [hasInstalled, setHasInstalled] = useState(true) + + const { mutate, isLoading } = useVercelIntegrationCreateMutation({ + onSuccess() { + setHasInstalled(true) + }, + }) + + function onInstall() { + const orgId = selectedOrg?.id + if (!orgId) { + return ui.setNotification({ category: 'error', message: 'Please select an organization' }) + } + + if (!code) { + return ui.setNotification({ category: 'error', message: 'Vercel code missing' }) + } + + if (!configurationId) { + return ui.setNotification({ category: 'error', message: 'Vercel Configuration ID missing' }) + } + + mutate({ + code, + configurationId, + orgId, + }) + } + + const { data: projects } = useVercelProjectsQuery( + { + orgId: selectedOrg?.id, + orgSlug: selectedOrg?.slug, + }, + { enabled: hasInstalled } + ) + + return ( +
    +

    Vercel Integration

    + + + + +
    + ) +} + +VercelIntegration.getLayout = (page) => {page} + +export default VercelIntegration From 4d8df9602d4399ce7dc2a8f09fbfae313cd90ba2 Mon Sep 17 00:00:00 2001 From: Alaister Young Date: Tue, 30 May 2023 15:49:53 +1000 Subject: [PATCH 041/694] adds integrations page scaffold in settings --- .../components/layouts/OrganizationLayout.tsx | 40 +++++++++++++++---- studio/pages/org/[slug]/billing.tsx | 35 +--------------- studio/pages/org/[slug]/general.tsx | 35 +--------------- studio/pages/org/[slug]/integrations.tsx | 14 +++++++ studio/pages/org/[slug]/invoices.tsx | 35 +--------------- 5 files changed, 53 insertions(+), 106 deletions(-) create mode 100644 studio/pages/org/[slug]/integrations.tsx diff --git a/studio/components/layouts/OrganizationLayout.tsx b/studio/components/layouts/OrganizationLayout.tsx index 0b323386d03..0dadc3f8ae0 100644 --- a/studio/components/layouts/OrganizationLayout.tsx +++ b/studio/components/layouts/OrganizationLayout.tsx @@ -1,21 +1,47 @@ +import { useParams } from 'common' import { useStore } from 'hooks' import { observer } from 'mobx-react-lite' -import { FC, ReactNode } from 'react' +import { useRouter } from 'next/router' +import { PropsWithChildren } from 'react' +import { Tabs } from 'ui' import { AccountLayout } from './' -interface Props { - children: ReactNode -} - -const OrganizationLayout: FC = ({ children }) => { +const OrganizationLayout = ({ children }: PropsWithChildren<{}>) => { const { ui } = useStore() + const router = useRouter() + const { slug } = useParams() + const id = router.asPath.split('/').at(-1) return ( - {children} +
    +
    +
    +

    {ui.selectedOrganization?.name ?? 'Organization'} settings

    +
    + +
    + +
    {children}
    +
    ) } diff --git a/studio/pages/org/[slug]/billing.tsx b/studio/pages/org/[slug]/billing.tsx index 83c44735b40..83248fec7a6 100644 --- a/studio/pages/org/[slug]/billing.tsx +++ b/studio/pages/org/[slug]/billing.tsx @@ -1,56 +1,25 @@ -import { useRouter } from 'next/router' import { observer } from 'mobx-react-lite' -import { Tabs } from 'ui' import { NextPageWithLayout } from 'types' import { useStore } from 'hooks' -import { useParams } from 'common/hooks' import Loading from 'components/ui/Loading' import { OrganizationLayout } from 'components/layouts' import { BillingSettings } from 'components/interfaces/Organization' const OrgBillingSettings: NextPageWithLayout = () => { const { ui } = useStore() - const { slug } = useParams() - const router = useRouter() return ( <> {ui.selectedOrganization === undefined && (ui?.permissions ?? []).length === 0 ? ( ) : ( -
    -
    -
    -

    - {ui.selectedOrganization?.name ?? 'Organization'} settings -

    -
    - -
    - -
    - -
    -
    + )} ) } OrgBillingSettings.getLayout = (page) => {page} + export default observer(OrgBillingSettings) diff --git a/studio/pages/org/[slug]/general.tsx b/studio/pages/org/[slug]/general.tsx index f07415ba47e..a62ed0e7c4b 100644 --- a/studio/pages/org/[slug]/general.tsx +++ b/studio/pages/org/[slug]/general.tsx @@ -1,56 +1,25 @@ -import { useRouter } from 'next/router' import { observer } from 'mobx-react-lite' -import { Tabs } from 'ui' import { NextPageWithLayout } from 'types' import { useStore } from 'hooks' -import { useParams } from 'common/hooks' import Loading from 'components/ui/Loading' import { OrganizationLayout } from 'components/layouts' import { GeneralSettings } from 'components/interfaces/Organization' const OrgGeneralSettings: NextPageWithLayout = () => { const { ui } = useStore() - const { slug } = useParams() - const router = useRouter() return ( <> {ui.selectedOrganization === undefined && (ui?.permissions ?? []).length === 0 ? ( ) : ( -
    -
    -
    -

    - {ui.selectedOrganization?.name ?? 'Organization'} settings -

    -
    - -
    - -
    - -
    -
    + )} ) } OrgGeneralSettings.getLayout = (page) => {page} + export default observer(OrgGeneralSettings) diff --git a/studio/pages/org/[slug]/integrations.tsx b/studio/pages/org/[slug]/integrations.tsx new file mode 100644 index 00000000000..6a9c54bedfc --- /dev/null +++ b/studio/pages/org/[slug]/integrations.tsx @@ -0,0 +1,14 @@ +import { NextPageWithLayout } from 'types' +import { OrganizationLayout } from 'components/layouts' +// import { IntegrationSettings } from 'components/interfaces/Organization' + +const OrgIntegrationSettings: NextPageWithLayout = () => { + return ( +
    howdy
    + // + ) +} + +OrgIntegrationSettings.getLayout = (page) => {page} + +export default OrgIntegrationSettings diff --git a/studio/pages/org/[slug]/invoices.tsx b/studio/pages/org/[slug]/invoices.tsx index 5ccf1ebc825..f1c7127198a 100644 --- a/studio/pages/org/[slug]/invoices.tsx +++ b/studio/pages/org/[slug]/invoices.tsx @@ -1,56 +1,25 @@ -import { useRouter } from 'next/router' import { observer } from 'mobx-react-lite' -import { Tabs } from 'ui' import { NextPageWithLayout } from 'types' import { useStore } from 'hooks' -import { useParams } from 'common/hooks' import Loading from 'components/ui/Loading' import { OrganizationLayout } from 'components/layouts' import { InvoicesSettings } from 'components/interfaces/Organization' const OrgInvoices: NextPageWithLayout = () => { const { ui } = useStore() - const { slug } = useParams() - const router = useRouter() return ( <> {ui.selectedOrganization === undefined && (ui?.permissions ?? []).length === 0 ? ( ) : ( -
    -
    -
    -

    - {ui.selectedOrganization?.name ?? 'Organization'} settings -

    -
    - -
    - -
    - -
    -
    + )} ) } OrgInvoices.getLayout = (page) => {page} + export default observer(OrgInvoices) From 5baa37239be0a55c053c522d4e97957f3aa6c33d Mon Sep 17 00:00:00 2001 From: Nick Rayburn <52075362+nrayburn-tech@users.noreply.github.com> Date: Tue, 30 May 2023 19:43:12 -0500 Subject: [PATCH 042/694] Change global example code replacement to start and ends with replacement --- .../reference/RefFunctionSection.tsx | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/apps/docs/components/reference/RefFunctionSection.tsx b/apps/docs/components/reference/RefFunctionSection.tsx index 23b50392b5e..913d741929d 100644 --- a/apps/docs/components/reference/RefFunctionSection.tsx +++ b/apps/docs/components/reference/RefFunctionSection.tsx @@ -114,7 +114,13 @@ const RefFunctionSection: React.FC = (props) => { > {item.examples && item.examples.map((example, exampleIndex) => { - const exampleString = '' + const exampleString = + '' + + (example.code && + example.code + .trim() + .replace(/^```(js|ts|dart|c#|kotlin)/, '') + .replace(/```$/, '')) const codeBlockLang = example?.code?.startsWith('```js') ? 'js' @@ -133,7 +139,6 @@ const RefFunctionSection: React.FC = (props) => { // // Create a single supabase client for interacting with your database // const supabase = createClient('https://xyzcompany.supabase.co', 'public-anon-key') // ` - const currentExampleId = example.id const staticExample = item.examples[exampleIndex] const response = staticExample.response @@ -152,15 +157,7 @@ const RefFunctionSection: React.FC = (props) => { language={codeBlockLang} hideLineNumbers={true} > - {exampleString + - (example.code && - example.code - .replace(/```/g, '') - .replace('js', '') - .replace('ts', '') - .replace('dart', '') - .replace('c#', '') - .replace('kotlin', ''))} + {exampleString} {((tables && tables.length > 0) || sql) && ( From 3991383b164752b4848e88db7f8c9c25fa020080 Mon Sep 17 00:00:00 2001 From: Nick Rayburn <52075362+nrayburn-tech@users.noreply.github.com> Date: Wed, 31 May 2023 20:14:29 -0500 Subject: [PATCH 043/694] Change regex to be more general --- apps/docs/components/reference/RefFunctionSection.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/components/reference/RefFunctionSection.tsx b/apps/docs/components/reference/RefFunctionSection.tsx index 913d741929d..2be99d3e0d7 100644 --- a/apps/docs/components/reference/RefFunctionSection.tsx +++ b/apps/docs/components/reference/RefFunctionSection.tsx @@ -119,7 +119,7 @@ const RefFunctionSection: React.FC = (props) => { (example.code && example.code .trim() - .replace(/^```(js|ts|dart|c#|kotlin)/, '') + .replace(/^```.*/, '') .replace(/```$/, '')) const codeBlockLang = example?.code?.startsWith('```js') From 2635932f8f781309e2210633e8b9b40d12bd95b9 Mon Sep 17 00:00:00 2001 From: Alaister Young Date: Thu, 1 Jun 2023 17:15:13 +1000 Subject: [PATCH 044/694] adds IntegrationSettings interface --- .../IntegrationSettings/Integration.tsx | 117 ++++++++++++++++++ .../IntegrationSettings.tsx | 30 +++++ .../interfaces/Organization/index.ts | 3 +- .../components/layouts/OrganizationLayout.tsx | 3 +- studio/lib/helpers.ts | 7 ++ studio/lib/void.ts | 7 ++ studio/pages/org/[slug]/integrations.tsx | 7 +- 7 files changed, 167 insertions(+), 7 deletions(-) create mode 100644 studio/components/interfaces/Organization/IntegrationSettings/Integration.tsx create mode 100644 studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx create mode 100644 studio/lib/void.ts diff --git a/studio/components/interfaces/Organization/IntegrationSettings/Integration.tsx b/studio/components/interfaces/Organization/IntegrationSettings/Integration.tsx new file mode 100644 index 00000000000..0e746edd52e --- /dev/null +++ b/studio/components/interfaces/Organization/IntegrationSettings/Integration.tsx @@ -0,0 +1,117 @@ +import dayjs from 'dayjs' +import { pluralize } from 'lib/helpers' +import { EMPTY_ARR } from 'lib/void' +import { Button, IconArrowRight } from 'ui' + +export interface OrganizationConnection { + id: string + orgName: string + addedByUser: string +} + +export interface ProjectConnection { + id: string + createdAt: string + /** External resource name */ + fromProjectName: string + /** Supabase project name */ + toProjectName: string +} + +export interface IntegrationProps { + title: string + description?: string + note?: string + organizationConnections?: OrganizationConnection[] + projectConnections?: ProjectConnection[] +} + +const Integration = ({ + title, + description, + note, + organizationConnections = EMPTY_ARR, + projectConnections = EMPTY_ARR, +}: IntegrationProps) => { + return ( + <> +
    +

    {title}

    +
    + +
    + {description !== undefined && ( +
    +

    How does the {title} integration work?

    +

    {description}

    +
    + )} + + {organizationConnections.length > 0 && ( +
      + {organizationConnections.map((connection) => ( +
    • +
      + + {title} integration connection | {connection.orgName} + + Added by {connection.addedByUser} +
      + +
      + +
      +
    • + ))} +
    + )} + +
    + + {projectConnections.length > 0 && ( +
    +

    + {projectConnections.length} project{' '} + {pluralize(projectConnections.length, 'connection')} +

    + +
      + {projectConnections.map((connection) => ( +
    • +
      +
      + {connection.fromProjectName} + + {connection.toProjectName} +
      + + + Connected {dayjs(connection.createdAt).fromNow()} + +
      + +
      + +
      +
    • + ))} +
    + + + {note !== undefined &&

    {note}

    } +
    + )} +
    + + ) +} + +export default Integration diff --git a/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx b/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx new file mode 100644 index 00000000000..e4564cf6a7e --- /dev/null +++ b/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx @@ -0,0 +1,30 @@ +import Integration from './Integration' + +const IntegrationSettings = () => { + return ( +
    + +
    + ) +} + +export default IntegrationSettings diff --git a/studio/components/interfaces/Organization/index.ts b/studio/components/interfaces/Organization/index.ts index 08d77572274..48df8a473a6 100644 --- a/studio/components/interfaces/Organization/index.ts +++ b/studio/components/interfaces/Organization/index.ts @@ -2,5 +2,6 @@ import GeneralSettings from './GeneralSettings/GeneralSettings' import TeamSettings from './TeamSettings/TeamSettings' import BillingSettings from './BillingSettings/BillingSettings' import InvoicesSettings from './InvoicesSettings/InvoicesSettings' +import IntegrationSettings from './IntegrationSettings/IntegrationSettings' -export { GeneralSettings, TeamSettings, BillingSettings, InvoicesSettings } +export { GeneralSettings, TeamSettings, BillingSettings, InvoicesSettings, IntegrationSettings } diff --git a/studio/components/layouts/OrganizationLayout.tsx b/studio/components/layouts/OrganizationLayout.tsx index 0dadc3f8ae0..7eac56171f3 100644 --- a/studio/components/layouts/OrganizationLayout.tsx +++ b/studio/components/layouts/OrganizationLayout.tsx @@ -17,11 +17,12 @@ const OrganizationLayout = ({ children }: PropsWithChildren<{}>) => { title={ui.selectedOrganization?.name ?? 'Supabase'} breadcrumbs={[{ key: `org-settings`, label: 'Settings' }]} > -
    +

    {ui.selectedOrganization?.name ?? 'Organization'} settings

    +
    ) diff --git a/studio/data/integrations/integration-connections-create-mutation.ts b/studio/data/integrations/integration-connections-create-mutation.ts new file mode 100644 index 00000000000..82ffa0d8b27 --- /dev/null +++ b/studio/data/integrations/integration-connections-create-mutation.ts @@ -0,0 +1,51 @@ +import { useMutation, UseMutationOptions } from '@tanstack/react-query' +import { post } from 'lib/common/fetch' +import { API_URL } from 'lib/constants' + +export type IntegrationConnectionsCreateVariables = { + organizationIntegrationId: string + connections: { + foreignProjectId: string + supabaseProjectId: string + }[] +} + +export async function createIntegrationConnections({ + organizationIntegrationId, + connections, +}: IntegrationConnectionsCreateVariables) { + const response = await post(`${API_URL}/integrations/connections`, { + organizationIntegrationId, + connections, + }) + if (response.error) { + throw response.error + } + + return response +} + +type IntegrationConnectionsCreateData = Awaited> + +export const useIntegrationConnectionsCreateMutation = ({ + onSuccess, + ...options +}: Omit< + UseMutationOptions< + IntegrationConnectionsCreateData, + unknown, + IntegrationConnectionsCreateVariables + >, + 'mutationFn' +> = {}) => { + return useMutation< + IntegrationConnectionsCreateData, + unknown, + IntegrationConnectionsCreateVariables + >((vars) => createIntegrationConnections(vars), { + async onSuccess(data, variables, context) { + await onSuccess?.(data, variables, context) + }, + ...options, + }) +} diff --git a/studio/pages/integrations/vercel.tsx b/studio/pages/integrations/vercel.tsx index bb060a236fe..8d0e77d637a 100644 --- a/studio/pages/integrations/vercel.tsx +++ b/studio/pages/integrations/vercel.tsx @@ -14,13 +14,13 @@ import { Button } from 'ui' const VercelIntegration: NextPageWithLayout = () => { const { ui } = useStore() - const { code, configurationId } = useParams() + const { code, configurationId, next } = useParams() const [selectedOrg, setSelectedOrg] = useState(null) - const [hasInstalled, setHasInstalled] = useState(true) + const [organizationIntegrationId, setOrganizationIntegrationId] = useState(null) const { mutate, isLoading } = useVercelIntegrationCreateMutation({ - onSuccess() { - setHasInstalled(true) + onSuccess({ id }) { + setOrganizationIntegrationId(id) }, }) @@ -45,12 +45,14 @@ const VercelIntegration: NextPageWithLayout = () => { }) } - const { data: supabaseProjectsData } = useProjectsQuery({ enabled: hasInstalled }) + const { data: supabaseProjectsData } = useProjectsQuery({ + enabled: organizationIntegrationId !== null, + }) const supabaseProjects = useMemo( () => supabaseProjectsData ?.filter((project) => project.organization_id === selectedOrg?.id) - .map((project) => ({ id: project.ref, name: project.name })) ?? EMPTY_ARR, + .map((project) => ({ id: project.id.toString(), name: project.name })) ?? EMPTY_ARR, [selectedOrg?.id, supabaseProjectsData] ) @@ -59,7 +61,7 @@ const VercelIntegration: NextPageWithLayout = () => { orgId: selectedOrg?.id, orgSlug: selectedOrg?.slug, }, - { enabled: hasInstalled } + { enabled: organizationIntegrationId !== null } ) const vercelProjects = useMemo( () => @@ -74,7 +76,7 @@ const VercelIntegration: NextPageWithLayout = () => {

    Vercel Integration

    - {!hasInstalled ? ( + {organizationIntegrationId === null ? ( <> @@ -84,7 +86,16 @@ const VercelIntegration: NextPageWithLayout = () => { ) : ( <> - + { + if (next) { + window.location.href = next + } + }} + /> )}
    From 178697eed7006d219f9121466faf5666e3883ca4 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Wed, 14 Jun 2023 18:07:33 +0800 Subject: [PATCH 053/694] first pass on introducing new UI. although added a rogue new thing to mobx store --- .../Integrations/IntegrationPanels.tsx | 233 ++++++++++++++++++ studio/components/interfaces/Markdown.tsx | 18 ++ .../GitHubRepoSelection.tsx | 57 +++++ .../IntegrationSettings/Integration.tsx | 164 ++++++------ .../IntegrationSettings/IntegrationGitHub.tsx | 95 +++++++ .../IntegrationSettings.tsx | 50 +++- .../components/layouts/OrganizationLayout.tsx | 31 +-- studio/components/layouts/Scaffold.tsx | 84 +++++++ .../data/integrations/integrations-query.ts | 72 +++++- .../img/integrations/covers/github-cover.png | Bin 0 -> 196269 bytes .../img/integrations/covers/vercel-cover.png | Bin 0 -> 197501 bytes studio/stores/UiStore.ts | 7 + 12 files changed, 709 insertions(+), 102 deletions(-) create mode 100644 studio/components/interfaces/Integrations/IntegrationPanels.tsx create mode 100644 studio/components/interfaces/Markdown.tsx create mode 100644 studio/components/interfaces/Organization/IntegrationSettings/GitHubRepoSelection.tsx create mode 100644 studio/components/interfaces/Organization/IntegrationSettings/IntegrationGitHub.tsx create mode 100644 studio/components/layouts/Scaffold.tsx create mode 100644 studio/public/img/integrations/covers/github-cover.png create mode 100644 studio/public/img/integrations/covers/vercel-cover.png diff --git a/studio/components/interfaces/Integrations/IntegrationPanels.tsx b/studio/components/interfaces/Integrations/IntegrationPanels.tsx new file mode 100644 index 00000000000..5d301ecc747 --- /dev/null +++ b/studio/components/interfaces/Integrations/IntegrationPanels.tsx @@ -0,0 +1,233 @@ +import { Integration, IntegrationProjectConnection } from 'data/integrations/integrations-query' +import dayjs from 'dayjs' +import React from 'react' +import { + Button, + IconArrowRight, + IconCloudLightning, + IconGitHub, + IconSquare, + IconTriangle, +} from 'ui' +import { cn } from 'ui/src/utils/cn' + +var relativeTime = require('dayjs/plugin/relativeTime') +dayjs.extend(relativeTime) + +const ICON_STROKE_WIDTH = 2 +const ICON_SIZE = 14 +export interface IntegrationInstallationProps extends React.HTMLAttributes { + title: string + orgName: string + connection: Integration +} + +type HandleIconType = Integration['type'] | 'SUPABASE' + +const HandleIcon = ({ type }: { type: HandleIconType }) => { + switch (type) { + case 'GITHUB': + return + break + case 'NETLIFY': + return + break + case 'VERCEL': + return ( + + + + ) + + // + break + case 'SUPABASE': + return ( + Supabase + ) + // + break + + default: + return <> + break + } +} + +const IntegrationInstallation = React.forwardRef( + ({ className, title, orgName, connection, ...props }, ref) => { + const IntegrationIconBlock = () => { + return ( +
    + +
    + ) + } + + return ( +
  • +
    +
    + + + + + +
    +
    + + {title} integration connection •{' '} + {connection.metadata?.vercelTeam || connection.metadata?.gitHubConnectionOwner} + +
    + + Created {dayjs(connection.createdAt).fromNow()} + + Added by {connection.createdBy} +
    +
    +
    + + +
  • + ) + } +) + +export interface IntegrationConnectionProps extends React.HTMLAttributes { + connection: IntegrationProjectConnection + type: Integration['type'] +} + +const IntegrationConnection = React.forwardRef( + ({ className, connection, type, ...props }, ref) => { + return ( +
  • +
    +
    +
    +
    + + {connection.from.name} + + + {connection.to.name} +
    + + + Connected {dayjs(connection.createdAt).fromNow()} + +
    + +
    + +
    +
    +
  • + ) + } +) + +const IntegrationConnectionOption = React.forwardRef( + ({ className, connection, type, ...props }, ref) => { + return ( +
  • +
    +
    + + {connection.from.name} + + + {connection.to.name} +
    + + + Connected {dayjs(connection.createdAt).fromNow()} + +
    + + +
  • + ) + } +) + +const EmptyIntegrationConnection = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => { + return ( +
    +
    + +
    +
    + ) +}) + +interface IntegrationConnectionHeader extends React.HTMLAttributes { + name?: string +} + +const IntegrationConnectionHeader = React.forwardRef( + ({ className, name, ...props }, ref) => { + return ( +
    +

    {props.title}

    +

    + Repository connections for {name?.toLowerCase()} +

    +
    + ) + } +) + +IntegrationInstallation.displayName = 'IntegrationInstallation' +IntegrationConnection.displayName = 'IntegrationConnection' +IntegrationConnectionHeader.displayName = 'IntegrationConnectionHeader' +EmptyIntegrationConnection.displayName = 'EmptyIntegrationConnection' +IntegrationConnectionOption.displayName = 'IntegrationConnectionOption' + +export { + EmptyIntegrationConnection, + IntegrationConnection, + IntegrationConnectionHeader, + IntegrationInstallation, + IntegrationConnectionOption, +} diff --git a/studio/components/interfaces/Markdown.tsx b/studio/components/interfaces/Markdown.tsx new file mode 100644 index 00000000000..db85f97f4f3 --- /dev/null +++ b/studio/components/interfaces/Markdown.tsx @@ -0,0 +1,18 @@ +import { ReactMarkdownProps } from 'react-markdown/lib/complex-types' +import { ReactMarkdown } from 'react-markdown/lib/react-markdown' +import { cn } from 'ui/src/utils/cn' + +interface Props extends Omit { + className?: string + content: string +} + +const Markdown = ({ className, content, ...props }: Props) => { + return ( + + {content} + + ) +} + +export { Markdown } diff --git a/studio/components/interfaces/Organization/IntegrationSettings/GitHubRepoSelection.tsx b/studio/components/interfaces/Organization/IntegrationSettings/GitHubRepoSelection.tsx new file mode 100644 index 00000000000..fb036c6cabc --- /dev/null +++ b/studio/components/interfaces/Organization/IntegrationSettings/GitHubRepoSelection.tsx @@ -0,0 +1,57 @@ +import { useParams } from 'common' +import { IntegrationConnectionOption } from 'components/interfaces/Integrations/IntegrationPanels' +import { Markdown } from 'components/interfaces/Markdown' +import { useIntegrationsQuery } from 'data/integrations/integrations-query' +import { useStore } from 'hooks' +import { observer } from 'mobx-react-lite' +import { IconGitHub, IconSearch, Input, Select, SidePanel } from 'ui' + +const GitHubRepoSelection = () => { + const { ui } = useStore() + const { slug } = useParams() + const { data } = useIntegrationsQuery({ orgSlug: slug }) + + const visible = ui.showGitHubRepoSelectionPanel + + const githubIntegrations = data?.filter((integration) => integration.type === 'GITHUB') + + return ( + ui.setShowGitHubRepoSelectionPanel(false)} + > +
    + + + + + +
    + + } className="w-full" placeholder="Search..." /> +
    +
    + +
      +
    • + {/* */} +
    • +
    +
    +
    +
    + ) +} + +export default observer(GitHubRepoSelection) diff --git a/studio/components/interfaces/Organization/IntegrationSettings/Integration.tsx b/studio/components/interfaces/Organization/IntegrationSettings/Integration.tsx index 835d58a42ff..4e8bfc3739e 100644 --- a/studio/components/interfaces/Organization/IntegrationSettings/Integration.tsx +++ b/studio/components/interfaces/Organization/IntegrationSettings/Integration.tsx @@ -1,14 +1,28 @@ +import { + EmptyIntegrationConnection, + IntegrationConnection, + IntegrationConnectionHeader, + IntegrationInstallation, +} from 'components/interfaces/Integrations/IntegrationPanels' +import { Markdown } from 'components/interfaces/Markdown' +import { + ScaffoldContainer, + ScaffoldSection, + ScaffoldSectionContent, + ScaffoldSectionDetail, +} from 'components/layouts/Scaffold' import { Integration as TIntegration } from 'data/integrations/integrations-query' -import dayjs from 'dayjs' +import { useStore } from 'hooks' import { pluralize } from 'lib/helpers' import { EMPTY_ARR } from 'lib/void' import { useMemo } from 'react' -import { Button, IconArrowRight } from 'ui' + export interface IntegrationProps { title: string orgName?: string description?: string note?: string + detail?: string integrations?: TIntegration[] } @@ -17,8 +31,11 @@ const Integration = ({ orgName, description, note, + detail, integrations = EMPTY_ARR, }: IntegrationProps) => { + const { ui } = useStore() + const projectConnections = useMemo( () => integrations.flatMap((integration) => integration.connections), [integrations] @@ -26,81 +43,80 @@ const Integration = ({ return ( <> -
    -

    {title}

    -
    + + + + {detail && } + cover + + +
    + +
    +
    + {integrations.length > 0 && + integrations.map((integration, i) => { + return ( +
    + + {integration.connections.length > 0 ? ( + <> + -
    - {description !== undefined && ( -
    -

    How does the {title} integration work?

    -

    {description}

    -
    - )} - - {integrations.length > 0 && ( -
      - {integrations.map((connection) => ( -
    • -
      - - {title} integration connection | {orgName} - - Added by {connection.createdBy} -
      - -
      - -
      -
    • - ))} -
    - )} - -
    - - {projectConnections.length > 0 && ( -
    -

    - {projectConnections.length} project{' '} - {pluralize(projectConnections.length, 'connection')} -

    - -
      - {projectConnections.map((connection) => ( -
    • -
      -
      - {connection.from.name} - - {connection.to.name} +
        + {integration.connections.map((connection, i) => ( + + ))} +
      + + ) : ( + + )} + ui.setShowGitHubRepoSelectionPanel(true)} + > + Add new project connection +
      + ) + })} +
      - - Connected {dayjs(connection.createdAt).fromNow()} - -
    - -
    - -
    - - ))} - - - - {note !== undefined &&

    {note}

    } -
    - )} -
    + + + + ) } diff --git a/studio/components/interfaces/Organization/IntegrationSettings/IntegrationGitHub.tsx b/studio/components/interfaces/Organization/IntegrationSettings/IntegrationGitHub.tsx new file mode 100644 index 00000000000..11ff03fdf45 --- /dev/null +++ b/studio/components/interfaces/Organization/IntegrationSettings/IntegrationGitHub.tsx @@ -0,0 +1,95 @@ +import { + EmptyIntegrationConnection, + IntegrationConnection, + IntegrationConnectionHeader, + IntegrationInstallation, +} from 'components/interfaces/Integrations/IntegrationPanels' +import { Markdown } from 'components/interfaces/Markdown' +import { + ScaffoldContainer, + ScaffoldSection, + ScaffoldSectionContent, + ScaffoldSectionDetail, +} from 'components/layouts/Scaffold' +import { Integration as TIntegration } from 'data/integrations/integrations-query' +import { pluralize } from 'lib/helpers' +import { EMPTY_ARR } from 'lib/void' +import { useMemo } from 'react' + +export interface IntegrationProps { + title: string + orgName?: string + description?: string + note?: string + integrations?: TIntegration[] +} + +const Integration = ({ + title, + orgName, + description, + note, + integrations = EMPTY_ARR, +}: IntegrationProps) => { + const projectConnections = useMemo( + () => integrations.flatMap((integration) => integration.connections), + [integrations] + ) + + return ( + <> + + + +

    {title}

    +
    + + {description !== undefined && ( + + )} +
    + {integrations.length > 0 && + integrations.map((integraton, i) => { + return ( +
    + + {integraton.connections.length > 0 && ( + <> + + +
      + {integraton.connections.map((connection, i) => ( + + ))} +
    + + + Add new project connection + + + )} +
    + ) + })} +
    + + +
    +
    +
    + + ) +} + +export default Integration diff --git a/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx b/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx index 154a869bf6c..a5e423fc918 100644 --- a/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx +++ b/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx @@ -1,8 +1,9 @@ -import { observer } from 'mobx-react-lite' - import { useParams } from 'common' +import { ScaffoldDivider } from 'components/layouts/Scaffold' import { useIntegrationsQuery } from 'data/integrations/integrations-query' import { useStore } from 'hooks' +import { observer } from 'mobx-react-lite' +import GitHubRepoSelection from './GitHubRepoSelection' import Integration from './Integration' const IntegrationSettings = () => { @@ -13,17 +14,54 @@ const IntegrationSettings = () => { const org = ui.selectedOrganization const vercelIntegrations = data?.filter((integration) => integration.type === 'VERCEL') + const githubIntegrations = data?.filter((integration) => integration.type === 'GITHUB') return ( -
    + <> -
    + + + + ) } diff --git a/studio/components/layouts/OrganizationLayout.tsx b/studio/components/layouts/OrganizationLayout.tsx index 7eac56171f3..35d35debe4f 100644 --- a/studio/components/layouts/OrganizationLayout.tsx +++ b/studio/components/layouts/OrganizationLayout.tsx @@ -5,6 +5,7 @@ import { useRouter } from 'next/router' import { PropsWithChildren } from 'react' import { Tabs } from 'ui' import { AccountLayout } from './' +import { ScaffoldContainer, ScaffoldDivider, ScaffoldHeader, ScaffoldTitle } from './Scaffold' const OrganizationLayout = ({ children }: PropsWithChildren<{}>) => { const { ui } = useStore() @@ -17,14 +18,14 @@ const OrganizationLayout = ({ children }: PropsWithChildren<{}>) => { title={ui.selectedOrganization?.name ?? 'Supabase'} breadcrumbs={[{ key: `org-settings`, label: 'Settings' }]} > -
    -
    -
    -

    {ui.selectedOrganization?.name ?? 'Organization'} settings

    -
    - + + + {ui.selectedOrganization?.name ?? 'Organization'} settings + + -
    - -
    {children}
    -
    + + + + {children} ) } diff --git a/studio/components/layouts/Scaffold.tsx b/studio/components/layouts/Scaffold.tsx new file mode 100644 index 00000000000..e69a4a44cd0 --- /dev/null +++ b/studio/components/layouts/Scaffold.tsx @@ -0,0 +1,84 @@ +import React from 'react' +import { cn } from 'ui/src/utils/cn' + +const maxWdithClasses = 'mx-auto w-full max-w-[1600px]' +const paddingClasses = 'px-6 lg:px-14 xl:px-28 2xl:px-32' + +// lg: pt - 8 + +const ScaffoldHeader = React.forwardRef>( + ({ className, ...props }, ref) => { + return ( +
    + ) + } +) + +const ScaffoldTitle = React.forwardRef< + HTMLHeadingElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => { + return

    +}) + +const ScaffoldContainer = React.forwardRef>( + ({ className, ...props }, ref) => { + return
    + } +) + +const ScaffoldDivider = React.forwardRef>( + ({ className, ...props }, ref) => { + return
    + } +) + +const ScaffoldSection = React.forwardRef>( + ({ className, ...props }, ref) => { + return ( +
    + ) + } +) + +const ScaffoldSectionDetail = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => { + return
    +}) + +const ScaffoldSectionContent = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => { + return ( +
    + ) +}) + +ScaffoldHeader.displayName = 'ScaffoldHeader' +ScaffoldTitle.displayName = 'ScaffoldTitle' +ScaffoldContainer.displayName = 'ScaffoldContainer' +ScaffoldDivider.displayName = 'ScaffoldDivider' +ScaffoldSection.displayName = 'ScaffoldSection' +ScaffoldSectionDetail.displayName = 'ScaffoldSectionDetail' +ScaffoldSectionContent.displayName = 'ScaffoldSectionContent' + +export { + ScaffoldHeader, + ScaffoldTitle, + ScaffoldContainer, + ScaffoldDivider, + ScaffoldSection, + ScaffoldSectionDetail, + ScaffoldSectionContent, +} diff --git a/studio/data/integrations/integrations-query.ts b/studio/data/integrations/integrations-query.ts index a15a6c0d55d..bb3e7e91015 100644 --- a/studio/data/integrations/integrations-query.ts +++ b/studio/data/integrations/integrations-query.ts @@ -24,6 +24,10 @@ export type Integration = { createdBy: string createdAt: string connections: IntegrationProjectConnection[] + metadata?: { + vercelTeam?: string + gitHubConnectionOwner?: string + } } export type IntegrationsResponse = Integration[] @@ -37,17 +41,71 @@ export async function getIntegrations({ orgSlug }: IntegrationsVariables, signal { id: '1', type: 'VERCEL', - createdBy: 'Alaister', + createdBy: 'alaister@supabase.io', createdAt: '2023-06-05T06:56:25.565Z', + metadata: { + vercelTeam: 'alaister-team', + }, connections: [ { - id: '1.1', - createdAt: '2023-06-05T06:56:25.565Z', - from: { - name: 'supabase-vercel', - }, + id: '1.0', + createdAt: '2023-06-05T01:56:25.565Z', to: { - name: 'alaister', + name: 'www prod', + }, + from: { + name: 'alaister project prod', + }, + }, + { + id: '1.1', + createdAt: '2023-06-14T06:56:25.565Z', + to: { + name: 'www staging', + }, + from: { + name: 'alaister project staging', + }, + }, + { + id: '1.1', + createdAt: '2023-06-02T21:56:25.565Z', + to: { + name: 'bees knees', + }, + from: { + name: 'jonny bee project', + }, + }, + ], + }, + { + id: '1.5', + type: 'VERCEL', + createdBy: 'alaister@supabase.io', + createdAt: '2023-06-05T06:56:25.565Z', + metadata: { + vercelTeam: 'alaister-team', + }, + connections: [], + }, + { + id: '2', + type: 'GITHUB', + createdBy: 'Alaister', + createdAt: '2023-06-05T06:56:25.565Z', + metadata: { + gitHubConnectionOwner: 'alaister', + }, + connections: [ + { + id: '1.2', + createdAt: '2023-06-05T06:56:25.565Z', + to: { + name: 'supabase/supabase', + }, + from: { + name: 'alaister project', }, }, ], diff --git a/studio/public/img/integrations/covers/github-cover.png b/studio/public/img/integrations/covers/github-cover.png new file mode 100644 index 0000000000000000000000000000000000000000..853f5322db52711cfba3cac2ec4b486bf8568ea9 GIT binary patch literal 196269 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[bnxQs@;fYc5`=3! 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ŠIw{eZ#?pq}fj=wK zsaSx?64~k|FyNw3sLKFAq}njd%6k8Ou=Nz)e!S(~ci+vgLUzYa_$CnmrysaA7W9%$ z41;anwST>?Li`JClPNBcz;d^LBl~Y8r24=zns|tluW03Y9h!8|+&6;;D6}0$_Z#kO zil;xDG(A7Yc!YcG7hIp+9YlajK1365OlU0~Z_}L^b+dI6G9_P!{PK?f9K;sctJf{5 zE7HxmB`!8J5w_1dK^cO0-hjAQUpI26jmztei;h3jd5y)+b1Cz}eilcUW9R*W=FrEN zG1i+l&Vdn<$rhJU|F90nS#^=@LktdT-uinic;j77)=%bazQt>4?yQ26KjtV^b$C$B ztim9GCf>u9z;E}eprDn{!b2oCE73X8?=%E0AZ?oG?8I{BaaI)t&in}pK7QmKl0q9N z)eOjDvCcypaoueZ4@l3!!Ovv-d%OQCT`4KB(Ccrbz)GOiNSdo8eVY}u}k628z-`CK*RTXop&IIE|p;kN9YaNp`Y4n zs4FId37$z^uhIIK$(ZbJCv&BfBwwMMK92Tw*cEq9eJ91naX#9Tzif{Vb1CKEa8=oE zR9kn_GoNz}#!LWHZWUGtnh360;Fx8Yw!tvm`Abcb>#?NRXecYZ(zvb^2NRxmr&nnI z9!g?z8c_`z=5g{Bi(K!IzP$VHdqPRPK~gW_2E=`mgJf*D(LHaRYmWu7td?oh=+;LP zTb&=jLAomgdW3o!*?)!p7$0iTqnM=L;YK5Sd89$eb>hFy^HLdI4ETSk<`2QRw1Tlh z%5HINGRG9*FV4X-d70>*=PEMhGB^q14?t=cu%_NkS^`*5k{`UU0Ss66zY74eJU)IH z{2yP|a{gGb&&&O`kgZ%kRiHS_XkI9ftEU)d{3M6tK>>NEMflq9tpwZkF>B&A@r3Pm zWlUu9CihR!Iom^gq@b*(gEkF

    LeKto{YiJtTCi8!8W|DP542-qMHux-O6_Pv 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�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ð$;rFzgtY&DUkPe6Y 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 literal 0 HcmV?d00001 diff --git a/studio/public/img/integrations/covers/vercel-cover.png b/studio/public/img/integrations/covers/vercel-cover.png new file mode 100644 index 0000000000000000000000000000000000000000..d2965eefdc6465e972dc79bb46742f9e240628f5 GIT binary patch literal 197501 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 mO*<+mP#N(rS+`rAD4aS8AeZa)Y{4V+PgPk void setProjectRef: (ref?: string) => void setOrganizationSlug: (slug?: string) => void setNotification: (notification: Notification) => string setPermissions: (permissions?: Permission[]) => void + setShowGitHubRepoSelectionPanel: (visible?: boolean) => void } export default class UiStore implements IUiStore { rootStore: IRootStore @@ -24,6 +26,7 @@ export default class UiStore implements IUiStore { selectedOrganizationSlug?: string notification?: Notification permissions?: Permission[] = [] + showGitHubRepoSelectionPanel: boolean = false constructor(rootStore: IRootStore) { this.rootStore = rootStore @@ -101,4 +104,8 @@ export default class UiStore implements IUiStore { setPermissions(permissions?: any) { this.permissions = permissions } + + setShowGitHubRepoSelectionPanel(visible: boolean) { + this.showGitHubRepoSelectionPanel = visible + } } From 2598b269d46e7eb586f83604c5aa4a982554820c Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Fri, 16 Jun 2023 03:05:53 +0800 Subject: [PATCH 054/694] upgrade UI for vercel integration. added icons for frameworks as well --- .../Integrations/IntegrationPanels.tsx | 122 +++--- .../interfaces/Integrations/ProjectLinker.tsx | 99 +++-- .../GitHubRepoSelection.tsx | 8 +- .../IntegrationSettings/Integration.tsx | 53 +-- .../IntegrationSettings.tsx | 5 +- ...integration-connections-create-mutation.ts | 2 + .../integrations-github-repos-query.ts | 137 +++++++ .../data/integrations/integrations-query.ts | 347 +++++++++++++----- ... => integrations-vercel-projects-query.ts} | 8 +- .../vercel-integration-create-mutation.ts | 9 +- studio/next.config.js | 2 +- studio/pages/integrations/vercel.tsx | 22 +- .../public/img/icons/frameworks/angular.svg | 1 + studio/public/img/icons/frameworks/astro.svg | 15 + .../public/img/icons/frameworks/blitzjs.svg | 30 ++ studio/public/img/icons/frameworks/brunch.svg | 3 + .../img/icons/frameworks/create-react-app.svg | 1 + .../img/icons/frameworks/docusaurus-2.svg | 1 + .../img/icons/frameworks/docusaurus.svg | 1 + studio/public/img/icons/frameworks/dojo.svg | 1 + .../public/img/icons/frameworks/eleventy.svg | 1 + studio/public/img/icons/frameworks/ember.svg | 1 + studio/public/img/icons/frameworks/gatsby.svg | 1 + .../public/img/icons/frameworks/gridsome.svg | 1 + studio/public/img/icons/frameworks/hexo.svg | 1 + studio/public/img/icons/frameworks/hugo.svg | 5 + .../public/img/icons/frameworks/hydrogen.svg | 12 + .../img/icons/frameworks/ionic-angular.svg | 4 + .../img/icons/frameworks/ionic-react.svg | 4 + studio/public/img/icons/frameworks/jekyll.svg | 19 + .../public/img/icons/frameworks/middleman.svg | 9 + studio/public/img/icons/frameworks/nextjs.svg | 1 + studio/public/img/icons/frameworks/nuxtjs.svg | 5 + studio/public/img/icons/frameworks/parcel.svg | 9 + .../public/img/icons/frameworks/polymer.svg | 1 + studio/public/img/icons/frameworks/preact.svg | 1 + .../public/img/icons/frameworks/redwoodjs.svg | 1 + studio/public/img/icons/frameworks/remix.svg | 6 + studio/public/img/icons/frameworks/saber.svg | 1 + studio/public/img/icons/frameworks/sanity.svg | 6 + studio/public/img/icons/frameworks/sapper.svg | 1 + studio/public/img/icons/frameworks/scully.svg | 94 +++++ .../img/icons/frameworks/solidstart.svg | 1 + .../public/img/icons/frameworks/stencil.svg | 4 + .../public/img/icons/frameworks/storybook.svg | 9 + studio/public/img/icons/frameworks/svelte.svg | 1 + .../img/icons/frameworks/sveltekit-1.svg | 1 + .../public/img/icons/frameworks/sveltekit.svg | 1 + studio/public/img/icons/frameworks/umijs.svg | 19 + studio/public/img/icons/frameworks/vite.svg | 15 + .../public/img/icons/frameworks/vitepress.svg | 15 + studio/public/img/icons/frameworks/vue.svg | 1 + .../public/img/icons/frameworks/vuepress.svg | 1 + studio/public/img/icons/frameworks/zola.svg | 4 + .../state/github-connection-config-panel.ts | 15 + studio/stores/UiStore.ts | 7 - 56 files changed, 910 insertions(+), 235 deletions(-) create mode 100644 studio/data/integrations/integrations-github-repos-query.ts rename studio/data/integrations/{vercel-projects-query.ts => integrations-vercel-projects-query.ts} (95%) create mode 100644 studio/public/img/icons/frameworks/angular.svg create mode 100644 studio/public/img/icons/frameworks/astro.svg create mode 100644 studio/public/img/icons/frameworks/blitzjs.svg create mode 100644 studio/public/img/icons/frameworks/brunch.svg create mode 100644 studio/public/img/icons/frameworks/create-react-app.svg create mode 100644 studio/public/img/icons/frameworks/docusaurus-2.svg create mode 100644 studio/public/img/icons/frameworks/docusaurus.svg create mode 100644 studio/public/img/icons/frameworks/dojo.svg create mode 100644 studio/public/img/icons/frameworks/eleventy.svg create mode 100644 studio/public/img/icons/frameworks/ember.svg create mode 100644 studio/public/img/icons/frameworks/gatsby.svg create mode 100644 studio/public/img/icons/frameworks/gridsome.svg create mode 100644 studio/public/img/icons/frameworks/hexo.svg create mode 100644 studio/public/img/icons/frameworks/hugo.svg create mode 100644 studio/public/img/icons/frameworks/hydrogen.svg create mode 100644 studio/public/img/icons/frameworks/ionic-angular.svg create mode 100644 studio/public/img/icons/frameworks/ionic-react.svg create mode 100644 studio/public/img/icons/frameworks/jekyll.svg create mode 100644 studio/public/img/icons/frameworks/middleman.svg create mode 100644 studio/public/img/icons/frameworks/nextjs.svg create mode 100644 studio/public/img/icons/frameworks/nuxtjs.svg create mode 100644 studio/public/img/icons/frameworks/parcel.svg create mode 100644 studio/public/img/icons/frameworks/polymer.svg create mode 100644 studio/public/img/icons/frameworks/preact.svg create mode 100644 studio/public/img/icons/frameworks/redwoodjs.svg create mode 100644 studio/public/img/icons/frameworks/remix.svg create mode 100644 studio/public/img/icons/frameworks/saber.svg create mode 100644 studio/public/img/icons/frameworks/sanity.svg create mode 100644 studio/public/img/icons/frameworks/sapper.svg create mode 100644 studio/public/img/icons/frameworks/scully.svg create mode 100644 studio/public/img/icons/frameworks/solidstart.svg create mode 100644 studio/public/img/icons/frameworks/stencil.svg create mode 100644 studio/public/img/icons/frameworks/storybook.svg create mode 100644 studio/public/img/icons/frameworks/svelte.svg create mode 100644 studio/public/img/icons/frameworks/sveltekit-1.svg create mode 100644 studio/public/img/icons/frameworks/sveltekit.svg create mode 100644 studio/public/img/icons/frameworks/umijs.svg create mode 100644 studio/public/img/icons/frameworks/vite.svg create mode 100644 studio/public/img/icons/frameworks/vitepress.svg create mode 100644 studio/public/img/icons/frameworks/vue.svg create mode 100644 studio/public/img/icons/frameworks/vuepress.svg create mode 100644 studio/public/img/icons/frameworks/zola.svg create mode 100644 studio/state/github-connection-config-panel.ts diff --git a/studio/components/interfaces/Integrations/IntegrationPanels.tsx b/studio/components/interfaces/Integrations/IntegrationPanels.tsx index 5d301ecc747..3ac3b3e79d8 100644 --- a/studio/components/interfaces/Integrations/IntegrationPanels.tsx +++ b/studio/components/interfaces/Integrations/IntegrationPanels.tsx @@ -1,38 +1,34 @@ +import { useParams } from 'common' +import { Markdown } from 'components/interfaces/Markdown' import { Integration, IntegrationProjectConnection } from 'data/integrations/integrations-query' import dayjs from 'dayjs' +import { useStore } from 'hooks' +import Image from 'next/image' +import { useRouter } from 'next/router' import React from 'react' -import { - Button, - IconArrowRight, - IconCloudLightning, - IconGitHub, - IconSquare, - IconTriangle, -} from 'ui' +import { Project } from 'types' +import { Button, IconArrowRight, IconGitHub, IconSquare } from 'ui' import { cn } from 'ui/src/utils/cn' -var relativeTime = require('dayjs/plugin/relativeTime') -dayjs.extend(relativeTime) - const ICON_STROKE_WIDTH = 2 const ICON_SIZE = 14 export interface IntegrationInstallationProps extends React.HTMLAttributes { title: string - orgName: string + // orgName: string connection: Integration } -type HandleIconType = Integration['type'] | 'SUPABASE' +type HandleIconType = Integration['integration']['name'] | 'Supabase' const HandleIcon = ({ type }: { type: HandleIconType }) => { switch (type) { - case 'GITHUB': + case 'GitHub': return break - case 'NETLIFY': + case 'Netlify': return break - case 'VERCEL': + case 'Vercel': return ( { // break - case 'SUPABASE': - return ( - Supabase - ) + case 'Supabase': + return Supabase // break @@ -64,11 +54,11 @@ const HandleIcon = ({ type }: { type: HandleIconType }) => { } const IntegrationInstallation = React.forwardRef( - ({ className, title, orgName, connection, ...props }, ref) => { + ({ className, title, connection, ...props }, ref) => { const IntegrationIconBlock = () => { return (

    - +
    ) } @@ -93,9 +83,11 @@ const IntegrationInstallation = React.forwardRef
    - Created {dayjs(connection.createdAt).fromNow()} + Created {dayjs(connection.created_at).fromNow()} + + + Added by {connection?.added_by?.primary_email} - Added by {connection.createdBy}
    @@ -108,36 +100,51 @@ const IntegrationInstallation = React.forwardRef { connection: IntegrationProjectConnection - type: Integration['type'] + type: Integration['integration']['name'] } const IntegrationConnection = React.forwardRef( ({ className, connection, type, ...props }, ref) => { + const { app } = useStore() + + const { projects } = app + return (
  • - - {connection.from.name} + + {projects.byId(connection.project_ref)?.name} - - {connection.to.name} + {!connection.metadata.framework ? ( + + ) : ( + {`icon`} + )} + + {connection.metadata.name}
    - - Connected {dayjs(connection.createdAt).fromNow()} - +
    + + Connected {dayjs(connection?.created_at).fromNow()} + + + Added by {connection?.added_by?.primary_email} + +
    @@ -151,6 +158,9 @@ const IntegrationConnection = React.forwardRef( ({ className, connection, type, ...props }, ref) => { + const { app } = useStore() + + const { projects } = app return (
  • - - {connection.from.name} + + {projects.byId(connection.project_ref)?.name} - {connection.to.name} + {connection.metadata.name}
    - Connected {dayjs(connection.createdAt).fromNow()} + Connected {dayjs(connection.created_at).fromNow()}
    @@ -183,7 +193,12 @@ const EmptyIntegrationConnection = React.forwardRef< React.HTMLAttributes >(({ className, ...props }, ref) => { return ( -
    +
    +
    @@ -203,16 +217,18 @@ const EmptyIntegrationConnection = React.forwardRef< interface IntegrationConnectionHeader extends React.HTMLAttributes { name?: string + markdown?: string } const IntegrationConnectionHeader = React.forwardRef( - ({ className, name, ...props }, ref) => { + ({ className, name, markdown = '', ...props }, ref) => { return ( -
    -

    {props.title}

    +
    + {/*

    {props.title}

    Repository connections for {name?.toLowerCase()} -

    +

    */} +
    ) } @@ -228,6 +244,6 @@ export { EmptyIntegrationConnection, IntegrationConnection, IntegrationConnectionHeader, - IntegrationInstallation, IntegrationConnectionOption, + IntegrationInstallation, } diff --git a/studio/components/interfaces/Integrations/ProjectLinker.tsx b/studio/components/interfaces/Integrations/ProjectLinker.tsx index 05a4b10d94f..9c694ead9ab 100644 --- a/studio/components/interfaces/Integrations/ProjectLinker.tsx +++ b/studio/components/interfaces/Integrations/ProjectLinker.tsx @@ -1,6 +1,8 @@ import { databaseIcon, vercelIcon } from 'components/to-be-cleaned/ListIcons' import { useIntegrationConnectionsCreateMutation } from 'data/integrations/integration-connections-create-mutation' +import { VercelProjectsResponse } from 'data/integrations/integrations-vercel-projects-query' import { useState } from 'react' +import { TRUE } from 'sass' import { Button, IconArrowRight, IconPlus, IconX, Listbox } from 'ui' interface Project { @@ -8,14 +10,18 @@ interface Project { name: string } +// to do: move this somewhere +const INTEGRATION_INTERNAL_ID = 1 + export interface ProjectLinkerProps { organizationIntegrationId: string - foreignProjects: Project[] + foreignProjects: VercelProjectsResponse[] supabaseProjects: Project[] onCreateConnections?: () => void } const UNDEFINED_SELECT_VALUE = 'undefined' +const UNDEFINED_METADATA_VALUE = {} const ProjectLinker = ({ organizationIntegrationId, @@ -24,12 +30,28 @@ const ProjectLinker = ({ onCreateConnections: _onCreateConnections, }: ProjectLinkerProps) => { const [connections, setConnections] = useState([ - { foreignProjectId: UNDEFINED_SELECT_VALUE, supabaseProjectId: UNDEFINED_SELECT_VALUE }, + { + foreignProjectId: UNDEFINED_SELECT_VALUE, + supabaseProjectId: UNDEFINED_SELECT_VALUE, + integrationId: INTEGRATION_INTERNAL_ID, + metadata: UNDEFINED_METADATA_VALUE, + }, ]) function onSetForeignProjectId(idx: number, id: string) { + console.log(id) + + console.log(foreignProjects) const newConnections = [...connections] + const projectDetails = foreignProjects.filter((x) => x.id === id)[0] + newConnections[idx].metadata = { ...projectDetails } newConnections[idx].foreignProjectId = id + newConnections[idx].supabaseConfig = { + projectEnvVars: { + write: true, + }, + } + setConnections(newConnections) } @@ -42,7 +64,12 @@ const ProjectLinker = ({ function addConnection() { setConnections([ ...connections, - { foreignProjectId: UNDEFINED_SELECT_VALUE, supabaseProjectId: UNDEFINED_SELECT_VALUE }, + { + foreignProjectId: UNDEFINED_SELECT_VALUE, + supabaseProjectId: UNDEFINED_SELECT_VALUE, + integrationId: INTEGRATION_INTERNAL_ID, + metadata: UNDEFINED_METADATA_VALUE, + }, ]) } @@ -59,6 +86,7 @@ const ProjectLinker = ({ }) function onCreateConnections() { + console.log('connections', connections) createConnections({ organizationIntegrationId, connections, @@ -71,6 +99,7 @@ const ProjectLinker = ({ {connections.map((connection, i) => ( void removeConnection: () => void canRemove: boolean + connections: any[] } const ProjectLinkerItem = ({ @@ -132,30 +162,6 @@ const ProjectLinkerItem = ({ return (
  • -
    - - - Choose a project - - - {foreignProjects.map((project) => ( - vercelIcon} - > - {project.name} - - ))} - -
    -
    - -
    +
    + +
    +
    + + + Choose a project + + + {foreignProjects.map((project) => ( + { + return ( + <> + {!project?.framework ? ( + vercelIcon + ) : ( + {`icon`} + )} + + ) + }} + > + {project.name} + + ))} + +
    {canRemove && ( -
    +
    {actions}
  • ) @@ -216,8 +211,6 @@ const EmptyIntegrationConnection = React.forwardRef< >
    { return (
    - {/*

    {props.title}

    -

    - Repository connections for {name?.toLowerCase()} -

    */}
    ) diff --git a/studio/components/interfaces/Integrations/ProjectLinker.tsx b/studio/components/interfaces/Integrations/ProjectLinker.tsx index 9c694ead9ab..7488298a8a8 100644 --- a/studio/components/interfaces/Integrations/ProjectLinker.tsx +++ b/studio/components/interfaces/Integrations/ProjectLinker.tsx @@ -2,8 +2,7 @@ import { databaseIcon, vercelIcon } from 'components/to-be-cleaned/ListIcons' import { useIntegrationConnectionsCreateMutation } from 'data/integrations/integration-connections-create-mutation' import { VercelProjectsResponse } from 'data/integrations/integrations-vercel-projects-query' import { useState } from 'react' -import { TRUE } from 'sass' -import { Button, IconArrowRight, IconPlus, IconX, Listbox } from 'ui' +import { Button, IconArrowRight, IconPlus, IconX, Listbox, Select } from 'ui' interface Project { id: string @@ -18,6 +17,7 @@ export interface ProjectLinkerProps { foreignProjects: VercelProjectsResponse[] supabaseProjects: Project[] onCreateConnections?: () => void + installedConnections?: any[] } const UNDEFINED_SELECT_VALUE = 'undefined' @@ -28,20 +28,34 @@ const ProjectLinker = ({ foreignProjects, supabaseProjects, onCreateConnections: _onCreateConnections, + installedConnections, }: ProjectLinkerProps) => { - const [connections, setConnections] = useState([ - { - foreignProjectId: UNDEFINED_SELECT_VALUE, - supabaseProjectId: UNDEFINED_SELECT_VALUE, - integrationId: INTEGRATION_INTERNAL_ID, - metadata: UNDEFINED_METADATA_VALUE, - }, - ]) + const [connections, setConnections] = useState( + installedConnections && installedConnections.length > 0 + ? installedConnections?.map((connection) => { + return { + foreignProjectId: connection?.foreign_project_id, + supabaseProjectId: connection?.supabase_project_id, + integrationId: INTEGRATION_INTERNAL_ID, + metadata: UNDEFINED_METADATA_VALUE, + } + }) + : [ + { + foreignProjectId: UNDEFINED_SELECT_VALUE, + supabaseProjectId: UNDEFINED_SELECT_VALUE, + integrationId: INTEGRATION_INTERNAL_ID, + metadata: UNDEFINED_METADATA_VALUE, + }, + ] + ) + + console.log('installedConnections', installedConnections) + console.log('connections', connections) + console.log('foreignProjects', foreignProjects) + console.log('supabaseProjects', supabaseProjects) function onSetForeignProjectId(idx: number, id: string) { - console.log(id) - - console.log(foreignProjects) const newConnections = [...connections] const projectDetails = foreignProjects.filter((x) => x.id === id)[0] newConnections[idx].metadata = { ...projectDetails } @@ -86,13 +100,14 @@ const ProjectLinker = ({ }) function onCreateConnections() { - console.log('connections', connections) createConnections({ organizationIntegrationId, connections, }) } + console.log(connections) + return (
      @@ -159,29 +174,27 @@ const ProjectLinkerItem = ({ removeConnection, canRemove, }: ProjectLinkerItemProps) => { + console.log(supabaseProjectId) return (
    • - - +
      diff --git a/studio/components/interfaces/Organization/IntegrationSettings/Integration.tsx b/studio/components/interfaces/Organization/IntegrationSettings/Integration.tsx index 9be3d46e382..ecbd6751ea2 100644 --- a/studio/components/interfaces/Organization/IntegrationSettings/Integration.tsx +++ b/studio/components/interfaces/Organization/IntegrationSettings/Integration.tsx @@ -1,3 +1,4 @@ +import { useParams } from 'common' import { EmptyIntegrationConnection, IntegrationConnection, @@ -11,11 +12,17 @@ import { ScaffoldSectionContent, ScaffoldSectionDetail, } from 'components/layouts/Scaffold' -import { Integration as TIntegration } from 'data/integrations/integrations-query' +import { useIntegrationConnectionsCreateMutation } from 'data/integrations/integration-connections-create-mutation' +import { + Integration as TIntegration, + useIntegrationsQuery, +} from 'data/integrations/integrations-query' +import { useIntegrationsVercelInstalledConnectionDeleteMutation } from 'data/integrations/integrations-vercel-installed-connection-delete-mutation' import { pluralize } from 'lib/helpers' import { EMPTY_ARR } from 'lib/void' import { useMemo } from 'react' import { useGithubConnectionConfigPanelSnapshot } from 'state/github-connection-config-panel' +import { Button, Dropdown, IconChevronDown, IconRefreshCcw, IconTrash } from 'ui' export interface IntegrationProps { title: string @@ -35,6 +42,11 @@ const Integration = ({ integrations = EMPTY_ARR, }: IntegrationProps) => { const githubConnectionConfigPanelShotshot = useGithubConnectionConfigPanelSnapshot() + const deleteMutation = useIntegrationsVercelInstalledConnectionDeleteMutation({ + onSuccess: (data, variables, context) => { + // Handle the success case + }, + }) const ConnectionHeading = ({ integration }: { integration: TIntegration }) => { return ( @@ -49,6 +61,16 @@ Repository connections for ${title?.toLowerCase()} ) } + // Call the mutation when needed + const handleDelete = (organizationIntegrationId: string, projectIntegrationId: string) => { + const variables = { + organization_integration_id: organizationIntegrationId, + id: projectIntegrationId, + } + + deleteMutation.mutate(variables) + } + return ( <> @@ -84,6 +106,42 @@ Repository connections for ${title?.toLowerCase()} key={i} connection={connection} type={integration.integration.name} + actions={ + + + +
      + } + > +
      Refresh Enviroment Variables
      +
      + Reapply env vars in vercel. +
      + + + } + onSelect={() => + handleDelete(integration.id, connection.id) + } + > + Delete + + + } + > + + + } /> ))}
    diff --git a/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx b/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx index 4e13f013ad0..7576bb5187c 100644 --- a/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx +++ b/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx @@ -3,8 +3,10 @@ import { ScaffoldDivider } from 'components/layouts/Scaffold' import { useIntegrationsQuery } from 'data/integrations/integrations-query' import { useStore } from 'hooks' import { observer } from 'mobx-react-lite' -import GitHubRepoSelection from './GitHubRepoSelection' +import GitHubRepoSelection from './SidePanelGitHubRepoSelection' import Integration from './Integration' +import SidePanelGitHubRepoSelection from './SidePanelGitHubRepoSelection' +import SidePanelVercelProjectLinker from './SidePanelVercelProjectLinker' const IntegrationSettings = () => { const { ui } = useStore() @@ -68,7 +70,8 @@ You can change the scope of the access for Supabase by configuring here. `} integrations={githubIntegrations} /> - + {/* */} + ) } diff --git a/studio/components/interfaces/Organization/IntegrationSettings/GitHubRepoSelection.tsx b/studio/components/interfaces/Organization/IntegrationSettings/SidePanelGitHubRepoSelection.tsx similarity index 100% rename from studio/components/interfaces/Organization/IntegrationSettings/GitHubRepoSelection.tsx rename to studio/components/interfaces/Organization/IntegrationSettings/SidePanelGitHubRepoSelection.tsx diff --git a/studio/components/interfaces/Organization/IntegrationSettings/SidePanelVercelProjectLinker.tsx b/studio/components/interfaces/Organization/IntegrationSettings/SidePanelVercelProjectLinker.tsx new file mode 100644 index 00000000000..44132a299db --- /dev/null +++ b/studio/components/interfaces/Organization/IntegrationSettings/SidePanelVercelProjectLinker.tsx @@ -0,0 +1,108 @@ +import { useParams } from 'common' +import ProjectLinker from 'components/interfaces/Integrations/ProjectLinker' +import { Markdown } from 'components/interfaces/Markdown' +import { useIntegrationsQuery } from 'data/integrations/integrations-query' +import { useStore } from 'hooks' +import { observer } from 'mobx-react-lite' +import { useMemo, useState } from 'react' +import { useGithubConnectionConfigPanelSnapshot } from 'state/github-connection-config-panel' +import { SidePanel } from 'ui' + +import { useVercelProjectsQuery } from 'data/integrations/integrations-vercel-projects-query' +import { useProjectsQuery } from 'data/projects/projects-query' +import { EMPTY_ARR } from 'lib/void' +import { Organization } from 'types' +import { useVercelProjectConnectionsQuery } from 'data/integrations/integrations-vercel-installed-connections-query' + +const SidePanelVercelProjectLinker = () => { + const { ui } = useStore() + const { slug } = useParams() + const { data } = useIntegrationsQuery({ orgSlug: slug }) + + const vercelIntegrations = data?.filter((integration) => integration.integration.id === 1) // vercel + + const selectedOrg = ui.selectedOrganization + + const [organizationIntegrationId, setOrganizationIntegrationId] = useState( + '880cb835-54b4-415b-8178-6f7920fdc40d' + ) + + const githubConnectionConfigPanelSnapshot = useGithubConnectionConfigPanelSnapshot() + + const { data: supabaseProjectsData } = useProjectsQuery({ + enabled: organizationIntegrationId !== null, + }) + const supabaseProjects = useMemo( + () => + supabaseProjectsData + ?.filter((project) => project.organization_id === selectedOrg?.id) + .map((project) => ({ id: project.id.toString(), name: project.name })) ?? EMPTY_ARR, + [selectedOrg?.id, supabaseProjectsData] + ) + + const { data: vercelProjectConnectionsData } = useVercelProjectConnectionsQuery( + { + organization_integration_id: organizationIntegrationId, + }, + { enabled: organizationIntegrationId !== null } + ) + + const vercelProjectConnections = useMemo( + () => vercelProjectConnectionsData ?? EMPTY_ARR, + [vercelProjectConnectionsData] + ) + + const { data: vercelProjectsData } = useVercelProjectsQuery( + { + orgId: selectedOrg?.id, + orgSlug: selectedOrg?.slug, + }, + { enabled: organizationIntegrationId !== null } + ) + + console.log('vercelProjectsData', vercelProjectsData) + const vercelProjects = useMemo(() => vercelProjectsData ?? EMPTY_ARR, [vercelProjectsData]) + + return ( + githubConnectionConfigPanelSnapshot.setVisible(false)} + > +
    + + + + + { + // if (next) { + // window.location.href = next + // } + }} + installedConnections={vercelProjectConnections} + /> + + +
      +
    • + {/* */} +
    • +
    +
    +
    +
    + ) +} + +export default observer(SidePanelVercelProjectLinker) diff --git a/studio/components/layouts/Scaffold.tsx b/studio/components/layouts/Scaffold.tsx index e69a4a44cd0..b3adc0714f7 100644 --- a/studio/components/layouts/Scaffold.tsx +++ b/studio/components/layouts/Scaffold.tsx @@ -1,7 +1,7 @@ import React from 'react' import { cn } from 'ui/src/utils/cn' -const maxWdithClasses = 'mx-auto w-full max-w-[1600px]' +const maxWidthClasses = 'mx-auto w-full max-w-[1600px]' const paddingClasses = 'px-6 lg:px-14 xl:px-28 2xl:px-32' // lg: pt - 8 @@ -23,7 +23,7 @@ const ScaffoldTitle = React.forwardRef< const ScaffoldContainer = React.forwardRef>( ({ className, ...props }, ref) => { - return
    + return
    } ) diff --git a/studio/data/integrations/integration-connections-create-mutation.ts b/studio/data/integrations/integration-connections-create-mutation.ts index d60828ca565..6881b405fab 100644 --- a/studio/data/integrations/integration-connections-create-mutation.ts +++ b/studio/data/integrations/integration-connections-create-mutation.ts @@ -16,7 +16,7 @@ export async function createIntegrationConnections({ organizationIntegrationId, connections, }: IntegrationConnectionsCreateVariables) { - const response = await post(`${API_URL}/integrations/connections`, { + const response = await post(`${API_URL}/integrations/vercel/connections`, { organizationIntegrationId, connections, }) diff --git a/studio/data/integrations/integrations-vercel-installed-connection-delete-mutation.ts b/studio/data/integrations/integrations-vercel-installed-connection-delete-mutation.ts new file mode 100644 index 00000000000..5c9825553b4 --- /dev/null +++ b/studio/data/integrations/integrations-vercel-installed-connection-delete-mutation.ts @@ -0,0 +1,41 @@ +import { useMutation, UseMutationOptions } from '@tanstack/react-query' +import { delete_ } from 'lib/common/fetch' +import { API_URL } from 'lib/constants' +import { UserContent } from 'types' + +type DeleteVariables = { organization_integration_id: string; id: string } + +export async function deleteConnection( + { organization_integration_id, id }: DeleteVariables, + signal?: AbortSignal +) { + if (!organization_integration_id) { + throw new Error('organization_integration_id is required') + } + + const response = await delete_( + `${API_URL}/integrations/vercel/connections/${id}`, + { organization_integration_id }, + { signal } + ) + + if (response.error) throw response.error + return response +} + +type DeleteContentData = Awaited> + +export const useIntegrationsVercelInstalledConnectionDeleteMutation = ({ + onSuccess, + ...options +}: Omit, 'mutationFn'> = {}) => { + return useMutation( + (args) => deleteConnection(args), + { + async onSuccess(data, variables, context) { + await onSuccess?.(data, variables, context) + }, + ...options, + } + ) +} diff --git a/studio/data/integrations/integrations-vercel-installed-connections-query.ts b/studio/data/integrations/integrations-vercel-installed-connections-query.ts new file mode 100644 index 00000000000..f4136c2f11d --- /dev/null +++ b/studio/data/integrations/integrations-vercel-installed-connections-query.ts @@ -0,0 +1,90 @@ +import { useQuery, useQueryClient, UseQueryOptions } from '@tanstack/react-query' +import { get } from 'lib/common/fetch' +import { API_URL } from 'lib/constants' +import { useCallback } from 'react' +import { integrationKeys } from './keys' + +export type VercelProjectsVariables = { + organization_integration_id?: string +} + +export type VercelProjectsResponse = { + id: string + name: string + metadata: { + id: string + name: string + framework: string + link: string + } +} + +export async function getVercelInstalledConnections( + { organization_integration_id }: VercelProjectsVariables, + signal?: AbortSignal +) { + if (!organization_integration_id) { + throw new Error('organization_integration_id is required') + } + + const response = await get( + `${API_URL}/integrations/vercel/connections/${organization_integration_id}`, + { + signal, + } + ) + if (response.error) { + throw response.error + } + + return response as VercelProjectsResponse[] +} + +export type VercelProjectsData = Awaited> +export type VercelProjectsError = unknown + +export const useVercelProjectConnectionsQuery = ( + { organization_integration_id }: VercelProjectsVariables, + { + enabled = true, + ...options + }: UseQueryOptions = {} +) => + useQuery( + integrationKeys.vercelProjectList(organization_integration_id), + ({ signal }) => getVercelInstalledConnections({ organization_integration_id }, signal), + { + enabled: + enabled && + typeof organization_integration_id !== 'undefined' && + typeof organization_integration_id !== 'undefined', + ...options, + } + ) + +/** + * useVercelProjectsPrefetch is used for prefetching data. For example, starting a query loading before a page is navigated to. + * + * @example + * const prefetch = useVercelProjectsPrefetch({ orgSlug }) + * + * return ( + * prefetch()}> + * Start loading on hover + * + * ) + */ +export const useVercelProjectsPrefetch = ({ + organization_integration_id, +}: VercelProjectsVariables) => { + const client = useQueryClient() + + return useCallback(() => { + if (organization_integration_id) { + client.prefetchQuery( + integrationKeys.vercelConnectionsList(organization_integration_id), + ({ signal }) => getVercelInstalledConnections({ organization_integration_id }, signal) + ) + } + }, [organization_integration_id]) +} diff --git a/studio/data/integrations/keys.ts b/studio/data/integrations/keys.ts index f317710e2b3..be833c0d307 100644 --- a/studio/data/integrations/keys.ts +++ b/studio/data/integrations/keys.ts @@ -2,4 +2,6 @@ export const integrationKeys = { list: (orgSlug: string | undefined) => ['organizations', orgSlug, 'integrations'] as const, vercelProjectList: (orgSlug: string | undefined) => ['organizations', orgSlug, 'vercel-projects'] as const, + vercelConnectionsList: (organization_integration_id: string | undefined) => + ['organizations', organization_integration_id, 'vercel-connections'] as const, } From dc9f9956df3a0a27ec043aafd69806de465dadf8 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Mon, 19 Jun 2023 18:50:18 +0800 Subject: [PATCH 057/694] fix issues using new API changes --- .../interfaces/Integrations/ProjectLinker.tsx | 20 +-- .../IntegrationSettings.tsx | 4 +- .../SidePanelVercelProjectLinker.tsx | 4 +- ...integration-connections-create-mutation.ts | 2 +- .../data/integrations/integrations-query.ts | 128 +++--------------- .../integrations-vercel-projects-query.ts | 2 +- 6 files changed, 34 insertions(+), 126 deletions(-) diff --git a/studio/components/interfaces/Integrations/ProjectLinker.tsx b/studio/components/interfaces/Integrations/ProjectLinker.tsx index 7488298a8a8..81e9ca7e6d2 100644 --- a/studio/components/interfaces/Integrations/ProjectLinker.tsx +++ b/studio/components/interfaces/Integrations/ProjectLinker.tsx @@ -34,16 +34,16 @@ const ProjectLinker = ({ installedConnections && installedConnections.length > 0 ? installedConnections?.map((connection) => { return { - foreignProjectId: connection?.foreign_project_id, - supabaseProjectId: connection?.supabase_project_id, + foreign_project_id: connection?.foreign_project_id, + supabase_project_id: connection?.supabase_project_id, integrationId: INTEGRATION_INTERNAL_ID, metadata: UNDEFINED_METADATA_VALUE, } }) : [ { - foreignProjectId: UNDEFINED_SELECT_VALUE, - supabaseProjectId: UNDEFINED_SELECT_VALUE, + foreign_project_id: UNDEFINED_SELECT_VALUE, + supabase_project_id: UNDEFINED_SELECT_VALUE, integrationId: INTEGRATION_INTERNAL_ID, metadata: UNDEFINED_METADATA_VALUE, }, @@ -59,7 +59,7 @@ const ProjectLinker = ({ const newConnections = [...connections] const projectDetails = foreignProjects.filter((x) => x.id === id)[0] newConnections[idx].metadata = { ...projectDetails } - newConnections[idx].foreignProjectId = id + newConnections[idx].foreign_project_id = id newConnections[idx].supabaseConfig = { projectEnvVars: { write: true, @@ -71,7 +71,7 @@ const ProjectLinker = ({ function onSetSupabaseProjectId(idx: number, id: string) { const newConnections = [...connections] - newConnections[idx].supabaseProjectId = id + newConnections[idx].supabase_project_id = id setConnections(newConnections) } @@ -79,8 +79,8 @@ const ProjectLinker = ({ setConnections([ ...connections, { - foreignProjectId: UNDEFINED_SELECT_VALUE, - supabaseProjectId: UNDEFINED_SELECT_VALUE, + foreign_project_id: UNDEFINED_SELECT_VALUE, + supabase_project_id: UNDEFINED_SELECT_VALUE, integrationId: INTEGRATION_INTERNAL_ID, metadata: UNDEFINED_METADATA_VALUE, }, @@ -117,9 +117,9 @@ const ProjectLinker = ({ connections={connections} foreignProjects={foreignProjects} supabaseProjects={supabaseProjects} - foreignProjectId={connection.foreignProjectId} + foreignProjectId={connection.foreign_project_id} setForeignProjectId={(id) => onSetForeignProjectId(i, id)} - supabaseProjectId={connection.supabaseProjectId} + supabaseProjectId={connection.supabase_project_id} setSupabaseProjectId={(id) => onSetSupabaseProjectId(i, id)} removeConnection={() => removeConnection(i)} canRemove={connections.length > 1} diff --git a/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx b/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx index 7576bb5187c..240cce5449c 100644 --- a/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx +++ b/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx @@ -11,7 +11,7 @@ import SidePanelVercelProjectLinker from './SidePanelVercelProjectLinker' const IntegrationSettings = () => { const { ui } = useStore() const { slug } = useParams() - const { data } = useIntegrationsQuery({ orgSlug: slug }) + const { data } = useIntegrationsQuery({ orgId: ui.selectedOrganization?.id }) const org = ui.selectedOrganization @@ -71,7 +71,7 @@ You can change the scope of the access for Supabase by configuring here. integrations={githubIntegrations} /> {/* */} - + {/* */} ) } diff --git a/studio/components/interfaces/Organization/IntegrationSettings/SidePanelVercelProjectLinker.tsx b/studio/components/interfaces/Organization/IntegrationSettings/SidePanelVercelProjectLinker.tsx index 44132a299db..f5c459773b5 100644 --- a/studio/components/interfaces/Organization/IntegrationSettings/SidePanelVercelProjectLinker.tsx +++ b/studio/components/interfaces/Organization/IntegrationSettings/SidePanelVercelProjectLinker.tsx @@ -16,8 +16,8 @@ import { useVercelProjectConnectionsQuery } from 'data/integrations/integrations const SidePanelVercelProjectLinker = () => { const { ui } = useStore() - const { slug } = useParams() - const { data } = useIntegrationsQuery({ orgSlug: slug }) + + const { data } = useIntegrationsQuery({ orgId: ui.selectedOrganization?.id }) const vercelIntegrations = data?.filter((integration) => integration.integration.id === 1) // vercel diff --git a/studio/data/integrations/integration-connections-create-mutation.ts b/studio/data/integrations/integration-connections-create-mutation.ts index 6881b405fab..3c58ea49072 100644 --- a/studio/data/integrations/integration-connections-create-mutation.ts +++ b/studio/data/integrations/integration-connections-create-mutation.ts @@ -17,7 +17,7 @@ export async function createIntegrationConnections({ connections, }: IntegrationConnectionsCreateVariables) { const response = await post(`${API_URL}/integrations/vercel/connections`, { - organizationIntegrationId, + organization_integration_id: organizationIntegrationId, connections, }) if (response.error) { diff --git a/studio/data/integrations/integrations-query.ts b/studio/data/integrations/integrations-query.ts index 1dff671601a..39cc1f7b7ad 100644 --- a/studio/data/integrations/integrations-query.ts +++ b/studio/data/integrations/integrations-query.ts @@ -7,20 +7,15 @@ type metadata = { metadata: { id: string supabaseConfig: { - // branching: { - // prodBranch: string - // } projectEnvVars: { write: boolean } - // supabaseDeploymentConfig: { - // functions: { - // deploy: false - // } - // } } link?: | { + /** + * GitHub link + */ org?: string repo?: string repoId?: number @@ -39,6 +34,9 @@ type metadata = { productionBranch?: string } | { + /** + * GitLab link + */ projectId?: string projectName?: string projectNameWithNamespace?: string @@ -59,6 +57,9 @@ type metadata = { productionBranch?: string } | { + /** + * Bitbucket link + */ name?: string slug?: string owner?: string @@ -138,7 +139,7 @@ export type IntegrationProjectConnection = { } export type IntegrationsVariables = { - orgSlug?: string + orgId?: number } export type IntegrationProjectConnectionPayload = { @@ -174,87 +175,12 @@ export type Integration = { export type IntegrationsResponse = Integration[] -export async function getIntegrations({ orgSlug }: IntegrationsVariables, signal?: AbortSignal) { - if (!orgSlug) { - throw new Error('orgSlug is required') +export async function getIntegrations({ orgId }: IntegrationsVariables, signal?: AbortSignal) { + if (!orgId) { + throw new Error('orgId is required') } - // const response: IntegrationsResponse = [ - // { - // id: '1', - // type: 'VERCEL', - // createdBy: 'alaister@supabase.io', - // createdAt: '2023-06-05T06:56:25.565Z', - // metadata: { - // vercelTeam: 'alaister-team', - // }, - // connections: [ - // { - // id: '1.0', - // createdAt: '2023-06-05T01:56:25.565Z', - // to: { - // name: 'www prod', - // }, - // from: { - // name: 'alaister project prod', - // }, - // }, - // { - // id: '1.1', - // createdAt: '2023-06-14T06:56:25.565Z', - // to: { - // name: 'www staging', - // }, - // from: { - // name: 'alaister project staging', - // }, - // }, - // { - // id: '1.1', - // createdAt: '2023-06-02T21:56:25.565Z', - // to: { - // name: 'bees knees', - // }, - // from: { - // name: 'jonny bee project', - // }, - // }, - // ], - // }, - // { - // id: '2', - // type: 'VERCEL', - // createdBy: 'alaister@supabase.io', - // createdAt: '2023-06-05T06:56:25.565Z', - // metadata: { - // vercelTeam: 'alaister-team', - // }, - // connections: [], - // }, - // { - // id: '3', - // type: 'GITHUB', - // createdBy: 'Alaister', - // createdAt: '2023-06-05T06:56:25.565Z', - // metadata: { - // gitHubConnectionOwner: 'alaister', - // }, - // connections: [ - // { - // id: '1.2', - // createdAt: '2023-06-05T06:56:25.565Z', - // to: { - // name: 'supabase/supabase', - // }, - // from: { - // name: 'alaister project', - // }, - // }, - // ], - // }, - // ] - - const response = await get(`${API_URL}/integrations/${orgSlug}`, { + const response = await get(`${API_URL}/integrations/${orgId}`, { signal, }) if (response.error) { @@ -264,24 +190,6 @@ export async function getIntegrations({ orgSlug }: IntegrationsVariables, signal return response as IntegrationsResponse } -// export async function getProjectIntegrationConnections( -// { orgSlug }: IntegrationsVariables, -// signal?: AbortSignal -// ) { -// if (!orgSlug) { -// throw new Error('orgSlug is required') -// } - -// const response = await get(`${API_URL}/integrations`, { -// signal, -// }) -// if (response.error) { -// throw response.error -// } - -// return response as IntegrationsResponse -// } - export type IntegrationsData = Awaited> export type ProjectIntegrationConnectionsData = Awaited< ReturnType @@ -289,11 +197,11 @@ export type ProjectIntegrationConnectionsData = Awaited< export type IntegrationsError = unknown export const useIntegrationsQuery = ( - { orgSlug }: IntegrationsVariables, + { orgId }: IntegrationsVariables, { enabled = true, ...options }: UseQueryOptions = {} ) => useQuery( - integrationKeys.list(orgSlug), - ({ signal }) => getIntegrations({ orgSlug }, signal), - { enabled: enabled && typeof orgSlug !== 'undefined', ...options } + integrationKeys.list(orgId), + ({ signal }) => getIntegrations({ orgId }, signal), + { enabled: enabled && typeof orgId !== 'undefined', ...options } ) diff --git a/studio/data/integrations/integrations-vercel-projects-query.ts b/studio/data/integrations/integrations-vercel-projects-query.ts index da159791234..493cfd83dae 100644 --- a/studio/data/integrations/integrations-vercel-projects-query.ts +++ b/studio/data/integrations/integrations-vercel-projects-query.ts @@ -25,7 +25,7 @@ export async function getVercelProjects({ orgId }: VercelProjectsVariables, sign throw new Error('orgId is required') } - const response = await get(`${API_URL}/integrations/vercel/projects/${orgId}`, { + const response = await get(`${API_URL}/integrations/vercel/connections/${orgId}`, { signal, }) if (response.error) { From 8c1d4f716297739b7f5241c5d670e89cdd0ce845 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Tue, 20 Jun 2023 00:13:21 +0800 Subject: [PATCH 058/694] add source and teamId to new org integration payload --- .../vercel-integration-create-mutation.ts | 10 +++++++++- studio/pages/integrations/vercel.tsx | 11 ++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/studio/data/integrations/vercel-integration-create-mutation.ts b/studio/data/integrations/vercel-integration-create-mutation.ts index 9b8a8b21ead..04781212e39 100644 --- a/studio/data/integrations/vercel-integration-create-mutation.ts +++ b/studio/data/integrations/vercel-integration-create-mutation.ts @@ -7,6 +7,10 @@ export type VercelIntegrationCreateVariables = { configurationId: string orgId: number metadata: { [key: string]: string } + source: string + // teamId is only present when a team is being installed + // personal accounts (hobby) will not have this value defined + teamId?: string } export async function createVercelIntegration({ @@ -14,13 +18,17 @@ export async function createVercelIntegration({ configurationId, orgId, metadata, + source, + teamId, }: VercelIntegrationCreateVariables) { - console.log('payload', { code, configurationId, orgId, metadata }) + console.log('payload', { code, configurationId, orgId, metadata, source, teamId }) const response = await post(`${API_URL}/integrations/vercel`, { code, configuration_id: configurationId, organization_id: orgId, metadata, + source, + teamId, }) if (response.error) { throw response.error diff --git a/studio/pages/integrations/vercel.tsx b/studio/pages/integrations/vercel.tsx index 3c7930ca83c..0a9b9b60d89 100644 --- a/studio/pages/integrations/vercel.tsx +++ b/studio/pages/integrations/vercel.tsx @@ -14,7 +14,7 @@ import { Button } from 'ui' const VercelIntegration: NextPageWithLayout = () => { const { ui } = useStore() - const { code, configurationId, next } = useParams() + const { code, configurationId, next, teamId, source } = useParams() const [selectedOrg, setSelectedOrg] = useState(null) const [organizationIntegrationId, setOrganizationIntegrationId] = useState(null) @@ -38,6 +38,13 @@ const VercelIntegration: NextPageWithLayout = () => { return ui.setNotification({ category: 'error', message: 'Vercel Configuration ID missing' }) } + if (!source) { + return ui.setNotification({ + category: 'error', + message: 'Vercel Configuration source missing', + }) + } + const metadata = {} mutate({ @@ -45,6 +52,8 @@ const VercelIntegration: NextPageWithLayout = () => { configurationId, orgId, metadata, + source, + teamId, }) } From 321fd0818c289005b6b5604abbbdcf01a9ce1cc2 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Tue, 20 Jun 2023 01:59:27 +0800 Subject: [PATCH 059/694] fix visuals --- .../Integrations/IntegrationPanels.tsx | 2 +- .../integrations-vercel-projects-query.ts | 29 +++++++++++++------ studio/pages/integrations/vercel.tsx | 3 +- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/studio/components/interfaces/Integrations/IntegrationPanels.tsx b/studio/components/interfaces/Integrations/IntegrationPanels.tsx index 46b9b59db37..6817050500b 100644 --- a/studio/components/interfaces/Integrations/IntegrationPanels.tsx +++ b/studio/components/interfaces/Integrations/IntegrationPanels.tsx @@ -91,7 +91,7 @@ const IntegrationInstallation = React.forwardRef - {connection.metadata.account.plan} + {connection.metadata.account.type}
    diff --git a/studio/data/integrations/integrations-vercel-projects-query.ts b/studio/data/integrations/integrations-vercel-projects-query.ts index 493cfd83dae..2f3307b373b 100644 --- a/studio/data/integrations/integrations-vercel-projects-query.ts +++ b/studio/data/integrations/integrations-vercel-projects-query.ts @@ -7,6 +7,7 @@ import { integrationKeys } from './keys' export type VercelProjectsVariables = { orgId?: number orgSlug?: string + organization_integration_id?: string } export type VercelProjectsResponse = { @@ -20,14 +21,20 @@ export type VercelProjectsResponse = { } } -export async function getVercelProjects({ orgId }: VercelProjectsVariables, signal?: AbortSignal) { - if (!orgId) { +export async function getVercelProjects( + { orgId, organization_integration_id }: VercelProjectsVariables, + signal?: AbortSignal +) { + if (!organization_integration_id) { throw new Error('orgId is required') } - const response = await get(`${API_URL}/integrations/vercel/connections/${orgId}`, { - signal, - }) + const response = await get( + `${API_URL}/integrations/vercel/projects/${organization_integration_id}`, + { + signal, + } + ) if (response.error) { throw response.error } @@ -39,7 +46,7 @@ export type VercelProjectsData = Awaited> export type VercelProjectsError = unknown export const useVercelProjectsQuery = ( - { orgSlug, orgId }: VercelProjectsVariables, + { orgSlug, orgId, organization_integration_id }: VercelProjectsVariables, { enabled = true, ...options @@ -47,7 +54,7 @@ export const useVercelProjectsQuery = ( ) => useQuery( integrationKeys.vercelProjectList(orgSlug), - ({ signal }) => getVercelProjects({ orgSlug, orgId }, signal), + ({ signal }) => getVercelProjects({ orgSlug, orgId, organization_integration_id }, signal), { enabled: enabled && typeof orgSlug !== 'undefined' && typeof orgId !== 'undefined', ...options, @@ -66,13 +73,17 @@ export const useVercelProjectsQuery = ( * * ) */ -export const useVercelProjectsPrefetch = ({ orgSlug, orgId }: VercelProjectsVariables) => { +export const useVercelProjectsPrefetch = ({ + orgSlug, + orgId, + organization_integration_id, +}: VercelProjectsVariables) => { const client = useQueryClient() return useCallback(() => { if (orgSlug) { client.prefetchQuery(integrationKeys.vercelProjectList(orgSlug), ({ signal }) => - getVercelProjects({ orgSlug, orgId }, signal) + getVercelProjects({ orgSlug, orgId, organization_integration_id }, signal) ) } }, [orgSlug]) diff --git a/studio/pages/integrations/vercel.tsx b/studio/pages/integrations/vercel.tsx index 0a9b9b60d89..049ad06a48e 100644 --- a/studio/pages/integrations/vercel.tsx +++ b/studio/pages/integrations/vercel.tsx @@ -53,7 +53,7 @@ const VercelIntegration: NextPageWithLayout = () => { orgId, metadata, source, - teamId, + teamId: teamId, }) } @@ -72,6 +72,7 @@ const VercelIntegration: NextPageWithLayout = () => { { orgId: selectedOrg?.id, orgSlug: selectedOrg?.slug, + organization_integration_id: organizationIntegrationId, }, { enabled: organizationIntegrationId !== null } ) From af5433acbecc543d196110b88b65c47529076139 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Tue, 20 Jun 2023 16:54:48 +0800 Subject: [PATCH 060/694] new UI for vercel integration marketplace flow --- packages/ui/index.tsx | 1 + .../src/components/Command/Command.utils.tsx | 2 +- .../{Command => LoadingLine}/LoadingLine.tsx | 2 +- .../ui/src/components/LoadingLine/index.tsx | 1 + .../Integrations/IntegrationPanels.tsx | 6 +- .../Integrations-Vercel.constants.ts | 52 +++ .../interfaces/Integrations/ProjectLinker.tsx | 297 ++++++++---------- .../Integrations/ProjectsLinker.tsx | 245 +++++++++++++++ studio/components/interfaces/Markdown.tsx | 2 +- .../IntegrationSettings.tsx | 8 +- .../SidePanelVercelProjectLinker.tsx | 2 +- .../layouts/IntegrationWindowLayout.tsx | 72 +++++ studio/components/layouts/Scaffold.tsx | 2 +- studio/pages/integrations/vercel.tsx | 119 +++++-- 14 files changed, 609 insertions(+), 202 deletions(-) rename packages/ui/src/components/{Command => LoadingLine}/LoadingLine.tsx (93%) create mode 100644 packages/ui/src/components/LoadingLine/index.tsx create mode 100644 studio/components/interfaces/Integrations/Integrations-Vercel.constants.ts create mode 100644 studio/components/interfaces/Integrations/ProjectsLinker.tsx create mode 100644 studio/components/layouts/IntegrationWindowLayout.tsx diff --git a/packages/ui/index.tsx b/packages/ui/index.tsx index 30d9ad7d52e..f5009a16d8d 100644 --- a/packages/ui/index.tsx +++ b/packages/ui/index.tsx @@ -63,6 +63,7 @@ export * from './src/components/Form' export * from './src/components/Command' // layout +export * from './src/components/LoadingLine' // banners export * from './src/layout/banners' diff --git a/packages/ui/src/components/Command/Command.utils.tsx b/packages/ui/src/components/Command/Command.utils.tsx index ee020395eb9..a7a44b0cc8b 100644 --- a/packages/ui/src/components/Command/Command.utils.tsx +++ b/packages/ui/src/components/Command/Command.utils.tsx @@ -7,7 +7,7 @@ import { DetailedHTMLProps, HTMLAttributes, KeyboardEventHandler } from 'react' import { Modal } from '../Modal' import { ModalProps } from '../Modal/Modal' import { useCommandMenu } from './CommandMenuProvider' -import { LoadingLine } from './LoadingLine' +import { LoadingLine } from '../LoadingLine/LoadingLine' type CommandPrimitiveElement = React.ElementRef type CommandPrimitiveProps = React.ComponentPropsWithoutRef diff --git a/packages/ui/src/components/Command/LoadingLine.tsx b/packages/ui/src/components/LoadingLine/LoadingLine.tsx similarity index 93% rename from packages/ui/src/components/Command/LoadingLine.tsx rename to packages/ui/src/components/LoadingLine/LoadingLine.tsx index 1e590e092b1..afb8522b653 100644 --- a/packages/ui/src/components/Command/LoadingLine.tsx +++ b/packages/ui/src/components/LoadingLine/LoadingLine.tsx @@ -1,5 +1,5 @@ import React from 'react' -import { cn } from './../../lib/utils' +import { cn } from '../../lib/utils' export const LoadingLine = ({ loading }: { loading: boolean }) => { return ( diff --git a/packages/ui/src/components/LoadingLine/index.tsx b/packages/ui/src/components/LoadingLine/index.tsx new file mode 100644 index 00000000000..16a23c1edfe --- /dev/null +++ b/packages/ui/src/components/LoadingLine/index.tsx @@ -0,0 +1 @@ +export * from './LoadingLine' diff --git a/studio/components/interfaces/Integrations/IntegrationPanels.tsx b/studio/components/interfaces/Integrations/IntegrationPanels.tsx index 6817050500b..9cf53225dfa 100644 --- a/studio/components/interfaces/Integrations/IntegrationPanels.tsx +++ b/studio/components/interfaces/Integrations/IntegrationPanels.tsx @@ -6,8 +6,7 @@ import Image from 'next/image' import React from 'react' -import { Badge, Button, IconArrowRight, IconGitHub, IconSquare } from 'ui' -import { cn } from 'ui/src/utils/cn' +import { Badge, Button, IconArrowRight, IconGitHub, IconSquare, cn } from 'ui' const ICON_STROKE_WIDTH = 2 const ICON_SIZE = 14 @@ -50,6 +49,7 @@ const HandleIcon = ({ type }: { type: HandleIconType }) => { } const Avatar = ({ src }: { src: string }) => { + console.log('src of avatar', src) return (
    avatar @@ -80,7 +80,7 @@ const IntegrationInstallation = React.forwardRef */}
    - +
    diff --git a/studio/components/interfaces/Integrations/Integrations-Vercel.constants.ts b/studio/components/interfaces/Integrations/Integrations-Vercel.constants.ts new file mode 100644 index 00000000000..4513c7a4aed --- /dev/null +++ b/studio/components/interfaces/Integrations/Integrations-Vercel.constants.ts @@ -0,0 +1,52 @@ +export const ENV_VAR_KEYS = { + POSTGRES_URL: { + key: 'POSTGRES_URL', + type: 'encrypted', + }, + POSTGRES_PRISMA_URL: { + key: 'POSTGRES_PRISMA_URL', + type: 'encrypted', + }, + POSTGRES_URL_NON_POOLING: { + key: 'POSTGRES_URL_NON_POOLING', + type: 'encrypted', + }, + POSTGRES_USER: { + key: 'POSTGRES_USER', + type: 'encrypted', + }, + POSTGRES_HOST: { + key: 'POSTGRES_HOST', + type: 'encrypted', + }, + POSTGRES_PASSWORD: { + key: 'POSTGRES_PASSWORD', + type: 'encrypted', + }, + POSTGRES_DATABASE: { + key: 'POSTGRES_DATABASE', + type: 'encrypted', + }, + SUPABASE_ANON_KEY: { + key: 'SUPABASE_ANON_KEY', + type: 'encrypted', + }, + SUPABASE_URL: { + key: 'SUPABASE_URL', + type: 'encrypted', + }, + SUPABASE_SERVICE_ROLE_KEY: { + key: 'SUPABASE_SERVICE_ROLE_KEY', + type: 'encrypted', + }, + NEXT_PUBLIC_SUPABASE_ANON_KEY: { + key: 'NEXT_PUBLIC_SUPABASE_ANON_KEY', + type: 'encrypted', + }, + NEXT_PUBLIC_SUPABASE_URL: { + key: 'NEXT_PUBLIC_SUPABASE_URL', + type: 'encrypted', + }, +} as const + +export const ENV_VAR_RAW_KEYS = Object.values(ENV_VAR_KEYS).map((x) => x.key) diff --git a/studio/components/interfaces/Integrations/ProjectLinker.tsx b/studio/components/interfaces/Integrations/ProjectLinker.tsx index 81e9ca7e6d2..8b8ac5f5758 100644 --- a/studio/components/interfaces/Integrations/ProjectLinker.tsx +++ b/studio/components/interfaces/Integrations/ProjectLinker.tsx @@ -1,8 +1,11 @@ -import { databaseIcon, vercelIcon } from 'components/to-be-cleaned/ListIcons' +import { ENV_VAR_RAW_KEYS } from 'components/interfaces/Integrations/Integrations-Vercel.constants' +import { Markdown } from 'components/interfaces/Markdown' +import { vercelIcon } from 'components/to-be-cleaned/ListIcons' import { useIntegrationConnectionsCreateMutation } from 'data/integrations/integration-connections-create-mutation' import { VercelProjectsResponse } from 'data/integrations/integrations-vercel-projects-query' +import { BASE_PATH } from 'lib/constants' import { useState } from 'react' -import { Button, IconArrowRight, IconPlus, IconX, Listbox, Select } from 'ui' +import { Button, IconArrowRight, IconPlus, IconX, Input, Listbox, Select, cn } from 'ui' interface Project { id: string @@ -30,68 +33,26 @@ const ProjectLinker = ({ onCreateConnections: _onCreateConnections, installedConnections, }: ProjectLinkerProps) => { - const [connections, setConnections] = useState( - installedConnections && installedConnections.length > 0 - ? installedConnections?.map((connection) => { - return { - foreign_project_id: connection?.foreign_project_id, - supabase_project_id: connection?.supabase_project_id, - integrationId: INTEGRATION_INTERNAL_ID, - metadata: UNDEFINED_METADATA_VALUE, - } - }) - : [ - { - foreign_project_id: UNDEFINED_SELECT_VALUE, - supabase_project_id: UNDEFINED_SELECT_VALUE, - integrationId: INTEGRATION_INTERNAL_ID, - metadata: UNDEFINED_METADATA_VALUE, - }, - ] - ) + const [supabaseProjectId, setSupabaseProjectId] = useState('') + const [vercelProjectId, setVercelProjectId] = useState('') - console.log('installedConnections', installedConnections) - console.log('connections', connections) - console.log('foreignProjects', foreignProjects) - console.log('supabaseProjects', supabaseProjects) + // function addConnection() { + // setConnections([ + // ...connections, + // { + // foreign_project_id: UNDEFINED_SELECT_VALUE, + // supabase_project_id: UNDEFINED_SELECT_VALUE, + // integrationId: INTEGRATION_INTERNAL_ID, + // metadata: UNDEFINED_METADATA_VALUE, + // }, + // ]) + // } - function onSetForeignProjectId(idx: number, id: string) { - const newConnections = [...connections] - const projectDetails = foreignProjects.filter((x) => x.id === id)[0] - newConnections[idx].metadata = { ...projectDetails } - newConnections[idx].foreign_project_id = id - newConnections[idx].supabaseConfig = { - projectEnvVars: { - write: true, - }, - } - - setConnections(newConnections) - } - - function onSetSupabaseProjectId(idx: number, id: string) { - const newConnections = [...connections] - newConnections[idx].supabase_project_id = id - setConnections(newConnections) - } - - function addConnection() { - setConnections([ - ...connections, - { - foreign_project_id: UNDEFINED_SELECT_VALUE, - supabase_project_id: UNDEFINED_SELECT_VALUE, - integrationId: INTEGRATION_INTERNAL_ID, - metadata: UNDEFINED_METADATA_VALUE, - }, - ]) - } - - function removeConnection(idx: number) { - const newConnections = [...connections] - newConnections.splice(idx, 1) - setConnections(newConnections) - } + // function removeConnection(idx: number) { + // const newConnections = [...connections] + // newConnections.splice(idx, 1) + // setConnections(newConnections) + // } const { mutate: createConnections, isLoading } = useIntegrationConnectionsCreateMutation({ onSuccess() { @@ -100,114 +61,99 @@ const ProjectLinker = ({ }) function onCreateConnections() { + const projectDetails = foreignProjects.filter((x) => x.id === vercelProjectId)[0] + createConnections({ organizationIntegrationId, - connections, + connections: [ + { + foreign_project_id: vercelProjectId, + supabase_project_id: supabaseProjectId, + integrationId: INTEGRATION_INTERNAL_ID, + metadata: { + ...projectDetails, + supabaseConfig: { + projectEnvVars: { + write: true, + }, + }, + }, + }, + ], }) } - console.log(connections) + const Panel = ({ children, className, ...props }: React.HTMLAttributes) => { + return ( +
    + {children} +
    + ) + } return (
    -
      - {connections.map((connection, i) => ( - onSetForeignProjectId(i, id)} - supabaseProjectId={connection.supabase_project_id} - setSupabaseProjectId={(id) => onSetSupabaseProjectId(i, id)} - removeConnection={() => removeConnection(i)} - canRemove={connections.length > 1} - /> - ))} -
    - - - -
    - - -
    - ) -} - -export default ProjectLinker - -interface ProjectLinkerItemProps { - foreignProjects: Project[] - supabaseProjects: Project[] - foreignProjectId: string - setForeignProjectId: (id: string) => void - supabaseProjectId: string - setSupabaseProjectId: (id: string) => void - removeConnection: () => void - canRemove: boolean - connections: any[] -} - -const ProjectLinkerItem = ({ - foreignProjects, - supabaseProjects, - foreignProjectId, - setForeignProjectId, - supabaseProjectId, - setSupabaseProjectId, - removeConnection, - canRemove, -}: ProjectLinkerItemProps) => { - console.log(supabaseProjectId) - return ( -
  • -
    -
    - -
    -
    - -
    -
    +
    + +
    + Supabase +
    setSupabaseProjectId(e)} > - Choose a project + Choose a Supabase project + + {supabaseProjects.map((project) => ( + { + return ( + <> +
    + Supabase +
    + + ) + }} + > + {project.name} +
    + ))} +
    +
    +
    + +
    + {/* integration icon */} + + + +
    + setVercelProjectId(e)} + > + + Choose a Vercel project - {foreignProjects.map((project) => ( ))} -
    - - {canRemove && ( -
    -
  • +
    + +
    +
    +

    + The following enviroment variables will be added: +

    +

    + {ENV_VAR_RAW_KEYS.map((x, idx) => { + return ( + + {x},{' '} + + ) + })} +

    +
    +
    ) } + +export default ProjectLinker diff --git a/studio/components/interfaces/Integrations/ProjectsLinker.tsx b/studio/components/interfaces/Integrations/ProjectsLinker.tsx new file mode 100644 index 00000000000..81e9ca7e6d2 --- /dev/null +++ b/studio/components/interfaces/Integrations/ProjectsLinker.tsx @@ -0,0 +1,245 @@ +import { databaseIcon, vercelIcon } from 'components/to-be-cleaned/ListIcons' +import { useIntegrationConnectionsCreateMutation } from 'data/integrations/integration-connections-create-mutation' +import { VercelProjectsResponse } from 'data/integrations/integrations-vercel-projects-query' +import { useState } from 'react' +import { Button, IconArrowRight, IconPlus, IconX, Listbox, Select } from 'ui' + +interface Project { + id: string + name: string +} + +// to do: move this somewhere +const INTEGRATION_INTERNAL_ID = 1 + +export interface ProjectLinkerProps { + organizationIntegrationId: string + foreignProjects: VercelProjectsResponse[] + supabaseProjects: Project[] + onCreateConnections?: () => void + installedConnections?: any[] +} + +const UNDEFINED_SELECT_VALUE = 'undefined' +const UNDEFINED_METADATA_VALUE = {} + +const ProjectLinker = ({ + organizationIntegrationId, + foreignProjects, + supabaseProjects, + onCreateConnections: _onCreateConnections, + installedConnections, +}: ProjectLinkerProps) => { + const [connections, setConnections] = useState( + installedConnections && installedConnections.length > 0 + ? installedConnections?.map((connection) => { + return { + foreign_project_id: connection?.foreign_project_id, + supabase_project_id: connection?.supabase_project_id, + integrationId: INTEGRATION_INTERNAL_ID, + metadata: UNDEFINED_METADATA_VALUE, + } + }) + : [ + { + foreign_project_id: UNDEFINED_SELECT_VALUE, + supabase_project_id: UNDEFINED_SELECT_VALUE, + integrationId: INTEGRATION_INTERNAL_ID, + metadata: UNDEFINED_METADATA_VALUE, + }, + ] + ) + + console.log('installedConnections', installedConnections) + console.log('connections', connections) + console.log('foreignProjects', foreignProjects) + console.log('supabaseProjects', supabaseProjects) + + function onSetForeignProjectId(idx: number, id: string) { + const newConnections = [...connections] + const projectDetails = foreignProjects.filter((x) => x.id === id)[0] + newConnections[idx].metadata = { ...projectDetails } + newConnections[idx].foreign_project_id = id + newConnections[idx].supabaseConfig = { + projectEnvVars: { + write: true, + }, + } + + setConnections(newConnections) + } + + function onSetSupabaseProjectId(idx: number, id: string) { + const newConnections = [...connections] + newConnections[idx].supabase_project_id = id + setConnections(newConnections) + } + + function addConnection() { + setConnections([ + ...connections, + { + foreign_project_id: UNDEFINED_SELECT_VALUE, + supabase_project_id: UNDEFINED_SELECT_VALUE, + integrationId: INTEGRATION_INTERNAL_ID, + metadata: UNDEFINED_METADATA_VALUE, + }, + ]) + } + + function removeConnection(idx: number) { + const newConnections = [...connections] + newConnections.splice(idx, 1) + setConnections(newConnections) + } + + const { mutate: createConnections, isLoading } = useIntegrationConnectionsCreateMutation({ + onSuccess() { + _onCreateConnections?.() + }, + }) + + function onCreateConnections() { + createConnections({ + organizationIntegrationId, + connections, + }) + } + + console.log(connections) + + return ( +
    +
      + {connections.map((connection, i) => ( + onSetForeignProjectId(i, id)} + supabaseProjectId={connection.supabase_project_id} + setSupabaseProjectId={(id) => onSetSupabaseProjectId(i, id)} + removeConnection={() => removeConnection(i)} + canRemove={connections.length > 1} + /> + ))} +
    + + + +
    + + +
    + ) +} + +export default ProjectLinker + +interface ProjectLinkerItemProps { + foreignProjects: Project[] + supabaseProjects: Project[] + foreignProjectId: string + setForeignProjectId: (id: string) => void + supabaseProjectId: string + setSupabaseProjectId: (id: string) => void + removeConnection: () => void + canRemove: boolean + connections: any[] +} + +const ProjectLinkerItem = ({ + foreignProjects, + supabaseProjects, + foreignProjectId, + setForeignProjectId, + supabaseProjectId, + setSupabaseProjectId, + removeConnection, + canRemove, +}: ProjectLinkerItemProps) => { + console.log(supabaseProjectId) + return ( +
  • +
    +
    + +
    +
    + +
    +
    + + + Choose a project + + + {foreignProjects.map((project) => ( + { + return ( + <> + {!project?.framework ? ( + vercelIcon + ) : ( + {`icon`} + )} + + ) + }} + > + {project.name} + + ))} + +
    + + {canRemove && ( +
    +
  • + ) +} diff --git a/studio/components/interfaces/Markdown.tsx b/studio/components/interfaces/Markdown.tsx index db85f97f4f3..1755f86c843 100644 --- a/studio/components/interfaces/Markdown.tsx +++ b/studio/components/interfaces/Markdown.tsx @@ -1,6 +1,6 @@ import { ReactMarkdownProps } from 'react-markdown/lib/complex-types' import { ReactMarkdown } from 'react-markdown/lib/react-markdown' -import { cn } from 'ui/src/utils/cn' +import { cn } from 'ui' interface Props extends Omit { className?: string diff --git a/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx b/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx index 240cce5449c..e535d1f0577 100644 --- a/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx +++ b/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx @@ -20,9 +20,11 @@ const IntegrationSettings = () => { vercelIntegrations?.map((x) => { let data: any = { ...x } - data['metadata']['account'][ - 'avatar' - ] = `https://vercel.com/api/www/avatar/${data.metadata.account.avatar}?w=48` + + const avatarSrc = data.metadata.account.avatar + ? `https://vercel.com/api/www/avatar/${data.metadata.account.avatar}?s=48` + : `https://vercel.com/api/www/avatar?teamId=${data.metadata.account.team_id}&s=48` + data['metadata']['account']['avatar'] = avatarSrc return data }) diff --git a/studio/components/interfaces/Organization/IntegrationSettings/SidePanelVercelProjectLinker.tsx b/studio/components/interfaces/Organization/IntegrationSettings/SidePanelVercelProjectLinker.tsx index f5c459773b5..be862353f74 100644 --- a/studio/components/interfaces/Organization/IntegrationSettings/SidePanelVercelProjectLinker.tsx +++ b/studio/components/interfaces/Organization/IntegrationSettings/SidePanelVercelProjectLinker.tsx @@ -1,5 +1,5 @@ import { useParams } from 'common' -import ProjectLinker from 'components/interfaces/Integrations/ProjectLinker' +import ProjectLinker from 'components/interfaces/Integrations/ProjectsLinker' import { Markdown } from 'components/interfaces/Markdown' import { useIntegrationsQuery } from 'data/integrations/integrations-query' import { useStore } from 'hooks' diff --git a/studio/components/layouts/IntegrationWindowLayout.tsx b/studio/components/layouts/IntegrationWindowLayout.tsx new file mode 100644 index 00000000000..98adc94be52 --- /dev/null +++ b/studio/components/layouts/IntegrationWindowLayout.tsx @@ -0,0 +1,72 @@ +import { FC } from 'react' +import Link from 'next/link' +import { IconChevronRight, IconX, cn } from 'ui' +import { withAuth, useFlag } from 'hooks' +import { observer } from 'mobx-react-lite' +import { BASE_PATH } from 'lib/constants' +import React from 'react' +import { ScaffoldContainer } from './Scaffold' + +const IntegrationWindowLayout: FC = ({ organization, project, children }) => { + const ongoingIncident = useFlag('ongoingIncident') + const maxHeight = ongoingIncident ? 'calc(100vh - 44px)' : '100vh' + + return ( +
    +
    + {children} +
    + ) +} + +const INTEGRATION_LAYOUT_MAX_WIDTH = '' // 'max-w-[720px]' + +export default withAuth(observer(IntegrationWindowLayout)) + +export const IntegrationWindowLayoutWithoutAuth = observer(IntegrationWindowLayout) + +const Header: FC = ({ organization, project }) => { + let stepNumber = organization ? 1 : project ? 2 : 0 + return ( +
    + +
    +
    +
    + Supabase +
    + +
    + {/* integration icon */} + + + +
    +
    + + Supabase + Vercel Integration Marketplace Connector + +
    +
    +
    + ) +} + +const maxWidthClasses = 'mx-auto w-full max-w-[1600px]' +const paddingClasses = 'px-6 lg:px-14 xl:px-28 2xl:px-32' + +const IntegrationScaffoldContainer = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => { + return
    +}) + +IntegrationScaffoldContainer.displayName = 'IntegrationScaffoldContainer' + +export { IntegrationScaffoldContainer } diff --git a/studio/components/layouts/Scaffold.tsx b/studio/components/layouts/Scaffold.tsx index b3adc0714f7..c0367141f76 100644 --- a/studio/components/layouts/Scaffold.tsx +++ b/studio/components/layouts/Scaffold.tsx @@ -1,5 +1,5 @@ import React from 'react' -import { cn } from 'ui/src/utils/cn' +import { cn } from 'ui' const maxWidthClasses = 'mx-auto w-full max-w-[1600px]' const paddingClasses = 'px-6 lg:px-14 xl:px-28 2xl:px-32' diff --git a/studio/pages/integrations/vercel.tsx b/studio/pages/integrations/vercel.tsx index 049ad06a48e..2133b293df6 100644 --- a/studio/pages/integrations/vercel.tsx +++ b/studio/pages/integrations/vercel.tsx @@ -2,7 +2,7 @@ import { useMemo, useState } from 'react' import { useParams } from 'common' import ProjectLinker from 'components/interfaces/Integrations/ProjectLinker' -import { WizardLayout } from 'components/layouts' + import OrganizationPicker from 'components/ui/OrganizationPicker' import { useVercelIntegrationCreateMutation } from 'data/integrations/vercel-integration-create-mutation' import { useVercelProjectsQuery } from 'data/integrations/integrations-vercel-projects-query' @@ -10,7 +10,12 @@ import { useProjectsQuery } from 'data/projects/projects-query' import { useStore } from 'hooks' import { EMPTY_ARR } from 'lib/void' import { NextPageWithLayout, Organization } from 'types' -import { Button } from 'ui' +import { Alert, Button, IconBook, IconLifeBuoy, Input, LoadingLine, cn } from 'ui' +import IntegrationWindowLayout from 'components/layouts/IntegrationWindowLayout' +import { ScaffoldContainer, ScaffoldDivider, ScaffoldSection } from 'components/layouts/Scaffold' +import { Markdown } from 'components/interfaces/Markdown' +import { BASE_PATH } from 'lib/constants' +import { ENV_VAR_RAW_KEYS } from 'components/interfaces/Integrations/Integrations-Vercel.constants' const VercelIntegration: NextPageWithLayout = () => { const { ui } = useStore() @@ -81,35 +86,95 @@ const VercelIntegration: NextPageWithLayout = () => { const vercelProjects = useMemo(() => vercelProjectsData ?? EMPTY_ARR, [vercelProjectsData]) return ( -
    -

    Vercel Integration

    + <> +
    + + {organizationIntegrationId === null && ( + <> + +

    Install Integration

    + <> + + +
    + +
    + +
    + + + + + + + )} - {organizationIntegrationId === null ? ( - <> - + {organizationIntegrationId !== null && ( + <> + +
    +

    + Link a Supabase project to a Vercel project +

    + +
    + {/* { + if (next) { + window.location.href = next + } + }} + /> */} - - - ) : ( - <> - { - if (next) { - window.location.href = next - } - }} - /> - - )} -
    + { + if (next) { + window.location.href = next + } + }} + /> + + + )} + + + +
    + Docs +
    +
    + Support +
    +
    + ) } -VercelIntegration.getLayout = (page) => {page} +VercelIntegration.getLayout = (page) => {page} export default VercelIntegration From b5561cc413cbcb1dbd097c8dcf3b199355e0e8af Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Tue, 20 Jun 2023 20:54:39 +0800 Subject: [PATCH 061/694] update picker UI --- package-lock.json | 1 + packages/config/package.json | 3 +- packages/config/ui.config.js | 35 ++-- .../interfaces/Integrations/ProjectLinker.tsx | 193 ++++++++++-------- .../IntegrationSettings/Integration.tsx | 14 +- .../layouts/IntegrationWindowLayout.tsx | 2 +- ...el-installed-connection-delete-mutation.ts | 13 +- studio/data/integrations/keys.ts | 6 +- 8 files changed, 156 insertions(+), 111 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4fdc32b163d..2c815be09f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42860,6 +42860,7 @@ "eslint-config-next": "^13.3.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-react": "7.28.0", + "mini-svg-data-uri": "^1.4.3", "tailwindcss-radix": "^2.0.0" } }, diff --git a/packages/config/package.json b/packages/config/package.json index 45901f19411..b9fb4a06dab 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -15,6 +15,7 @@ "eslint-config-prettier": "^8.3.0", "eslint-plugin-react": "7.28.0", "tailwindcss-radix": "^2.0.0", - "@tailwindcss/typography": "^0.5.9" + "@tailwindcss/typography": "^0.5.9", + "mini-svg-data-uri": "^1.4.3" } } diff --git a/packages/config/ui.config.js b/packages/config/ui.config.js index 96cf6ae71a7..856f8ff436a 100644 --- a/packages/config/ui.config.js +++ b/packages/config/ui.config.js @@ -3,6 +3,7 @@ const forms = require('@tailwindcss/forms') const plugin = require('tailwindcss/plugin') const radixUiColors = require('@radix-ui/colors') const brandColors = require('./default-colors') +const svgToDataUri = require('mini-svg-data-uri') const { default: flattenColorPalette } = require('tailwindcss/lib/util/flattenColorPalette') @@ -371,18 +372,28 @@ const uiConfig = { highlight: (value) => ({ boxShadow: `inset 0 1px 0 0 ${value}` }), }, { values: flattenColorPalette(theme('backgroundColor')), type: 'color' } - ), - matchUtilities( - { - subhighlight: (value) => ({ - boxShadow: `inset 0 -1px 0 0 ${value}`, - }), - }, - { - values: flattenColorPalette(theme('backgroundColor')), - type: 'color', - } - ) + ) + matchUtilities( + { + subhighlight: (value) => ({ + boxShadow: `inset 0 -1px 0 0 ${value}`, + }), + }, + { + values: flattenColorPalette(theme('backgroundColor')), + type: 'color', + } + ) + matchUtilities( + { + 'bg-grid': (value) => ({ + backgroundImage: `url("${svgToDataUri( + `` + )}")`, + }), + }, + { values: flattenColorPalette(theme('backgroundColor')), type: 'color' } + ) }, require('tailwindcss-radix')(), forms, diff --git a/studio/components/interfaces/Integrations/ProjectLinker.tsx b/studio/components/interfaces/Integrations/ProjectLinker.tsx index 8b8ac5f5758..8f183b8b7c8 100644 --- a/studio/components/interfaces/Integrations/ProjectLinker.tsx +++ b/studio/components/interfaces/Integrations/ProjectLinker.tsx @@ -86,7 +86,10 @@ const ProjectLinker = ({ const Panel = ({ children, className, ...props }: React.HTMLAttributes) => { return (
    {children} @@ -96,91 +99,97 @@ const ProjectLinker = ({ return (
    -
    - -
    - Supabase -
    - setSupabaseProjectId(e)} - > - - Choose a Supabase project - - {supabaseProjects.map((project) => ( - { - return ( - <> -
    - Supabase -
    - - ) - }} - > - {project.name} -
    - ))} -
    -
    -
    - -
    - {/* integration icon */} - +
    +
    + +
    + Supabase +
    + setSupabaseProjectId(e)} > - - -
    - setVercelProjectId(e)} - > - - Choose a Vercel project - - {foreignProjects.map((project) => ( - { - return ( - <> - {!project?.framework ? ( - vercelIcon - ) : ( - {`icon`} - )} - - ) - }} - > - {project.name} + + Choose a Supabase project - ))} - - + {supabaseProjects.map((project) => ( + { + return ( + <> +
    + Supabase +
    + + ) + }} + > + {project.name} +
    + ))} + + +
    + +
    + {/* integration icon */} + + + +
    + setVercelProjectId(e)} + > + + Choose a Vercel project + + {foreignProjects.map((project) => ( + { + return ( + <> + {!project?.framework ? ( + vercelIcon + ) : ( + {`icon`} + )} + + ) + }} + > + {project.name} + + ))} + +
    +
    -
    + {/*

    The following enviroment variables will be added:

    @@ -206,7 +215,19 @@ const ProjectLinker = ({ ) })}

    -
    +
    */} + { + return ` + \n + - \`${x}\` - ${(This is the URL for the Project)} +` +})} +`} + />
    ) } diff --git a/studio/components/interfaces/Organization/IntegrationSettings/Integration.tsx b/studio/components/interfaces/Organization/IntegrationSettings/Integration.tsx index ecbd6751ea2..cf4a11985df 100644 --- a/studio/components/interfaces/Organization/IntegrationSettings/Integration.tsx +++ b/studio/components/interfaces/Organization/IntegrationSettings/Integration.tsx @@ -18,6 +18,7 @@ import { useIntegrationsQuery, } from 'data/integrations/integrations-query' import { useIntegrationsVercelInstalledConnectionDeleteMutation } from 'data/integrations/integrations-vercel-installed-connection-delete-mutation' +import { useStore } from 'hooks' import { pluralize } from 'lib/helpers' import { EMPTY_ARR } from 'lib/void' import { useMemo } from 'react' @@ -42,11 +43,11 @@ const Integration = ({ integrations = EMPTY_ARR, }: IntegrationProps) => { const githubConnectionConfigPanelShotshot = useGithubConnectionConfigPanelSnapshot() - const deleteMutation = useIntegrationsVercelInstalledConnectionDeleteMutation({ - onSuccess: (data, variables, context) => { - // Handle the success case - }, - }) + + const { ui } = useStore() + + const { mutate: deleteMutate, isLoading: isDeleteLoading } = + useIntegrationsVercelInstalledConnectionDeleteMutation() const ConnectionHeading = ({ integration }: { integration: TIntegration }) => { return ( @@ -66,9 +67,10 @@ Repository connections for ${title?.toLowerCase()} const variables = { organization_integration_id: organizationIntegrationId, id: projectIntegrationId, + orgId: ui.selectedOrganization?.id, } - deleteMutation.mutate(variables) + deleteMutate(variables) } return ( diff --git a/studio/components/layouts/IntegrationWindowLayout.tsx b/studio/components/layouts/IntegrationWindowLayout.tsx index 98adc94be52..9b4fb43bf86 100644 --- a/studio/components/layouts/IntegrationWindowLayout.tsx +++ b/studio/components/layouts/IntegrationWindowLayout.tsx @@ -29,7 +29,7 @@ const Header: FC = ({ organization, project }) => { let stepNumber = organization ? 1 : project ? 2 : 0 return (
    - +
    diff --git a/studio/data/integrations/integrations-vercel-installed-connection-delete-mutation.ts b/studio/data/integrations/integrations-vercel-installed-connection-delete-mutation.ts index 5c9825553b4..fa6d74522a8 100644 --- a/studio/data/integrations/integrations-vercel-installed-connection-delete-mutation.ts +++ b/studio/data/integrations/integrations-vercel-installed-connection-delete-mutation.ts @@ -1,9 +1,14 @@ -import { useMutation, UseMutationOptions } from '@tanstack/react-query' +import { useMutation, UseMutationOptions, useQueryClient } from '@tanstack/react-query' import { delete_ } from 'lib/common/fetch' import { API_URL } from 'lib/constants' import { UserContent } from 'types' +import { integrationKeys } from './keys' -type DeleteVariables = { organization_integration_id: string; id: string } +type DeleteVariables = { + organization_integration_id: string + id: string + orgId: number | undefined +} export async function deleteConnection( { organization_integration_id, id }: DeleteVariables, @@ -29,10 +34,14 @@ export const useIntegrationsVercelInstalledConnectionDeleteMutation = ({ onSuccess, ...options }: Omit, 'mutationFn'> = {}) => { + const queryClient = useQueryClient() return useMutation( (args) => deleteConnection(args), { async onSuccess(data, variables, context) { + console.log('variables in mutate delete onSuccess', variables) + await Promise.all([queryClient.invalidateQueries(integrationKeys.list(variables.orgId))]) + await onSuccess?.(data, variables, context) }, ...options, diff --git a/studio/data/integrations/keys.ts b/studio/data/integrations/keys.ts index be833c0d307..b25c9329d41 100644 --- a/studio/data/integrations/keys.ts +++ b/studio/data/integrations/keys.ts @@ -1,7 +1,7 @@ export const integrationKeys = { - list: (orgSlug: string | undefined) => ['organizations', orgSlug, 'integrations'] as const, - vercelProjectList: (orgSlug: string | undefined) => - ['organizations', orgSlug, 'vercel-projects'] as const, + list: (orgId: number | undefined) => ['organizations', orgId, 'integrations'] as const, + vercelProjectList: (organization_integration_id: string | undefined) => + ['organizations', organization_integration_id, 'vercel-projects'] as const, vercelConnectionsList: (organization_integration_id: string | undefined) => ['organizations', organization_integration_id, 'vercel-connections'] as const, } From 331195333bed8d5747033c963deb12ea5960e33f Mon Sep 17 00:00:00 2001 From: "joel@joellee.org" Date: Wed, 21 Jun 2023 11:47:25 +0800 Subject: [PATCH 062/694] feat: update studio config to include twilio verify --- .../components/interfaces/Auth/Auth.types.ts | 3 + studio/pages/api/auth/[ref]/config.ts | 249 +++++++++--------- .../AuthProvidersFormValidation.tsx | 50 ++++ .../stores/jsonSchema/auth_gotrue_config.json | 13 + 4 files changed, 192 insertions(+), 123 deletions(-) diff --git a/studio/components/interfaces/Auth/Auth.types.ts b/studio/components/interfaces/Auth/Auth.types.ts index 3c4118ec83b..55b756c31bd 100644 --- a/studio/components/interfaces/Auth/Auth.types.ts +++ b/studio/components/interfaces/Auth/Auth.types.ts @@ -137,6 +137,9 @@ export interface AuthConfig { SMS_TWILIO_ACCOUNT_SID: string SMS_TWILIO_AUTH_TOKEN: string SMS_TWILIO_MESSAGE_SERVICE_SID: string + SMS_TWILIO_VERIFY_ACCOUNT_SID: string + SMS_TWILIO_VERIFY_AUTH_TOKEN: string + SMS_TWILIO_VERIFY_MESSAGE_SERVICE_SID: string SMS_VONAGE_API_KEY: string SMS_VONAGE_API_SECRET: string SMS_VONAGE_FROM: string diff --git a/studio/pages/api/auth/[ref]/config.ts b/studio/pages/api/auth/[ref]/config.ts index 66545dba0ae..96d3f1a6f6e 100644 --- a/studio/pages/api/auth/[ref]/config.ts +++ b/studio/pages/api/auth/[ref]/config.ts @@ -20,135 +20,138 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { const handleGetAll = async (req: NextApiRequest, res: NextApiResponse) => { // Platform only API return res.status(200).json({ - app_version: '', - config_override_id: '', - project_id: '', - jwt_secret_encrypted: '', - isFreeTier: true, - SITE_URL: '', - OPERATOR_TOKEN: null, - DISABLE_SIGNUP: false, - RATE_LIMIT_HEADER: null, - JWT_EXP: 3600, - JWT_AUD: '', - JWT_DEFAULT_GROUP_NAME: '', - URI_ALLOW_LIST: '', - MAILER_AUTOCONFIRM: false, - MAILER_OTP_EXP: 86400, - MAILER_URLPATHS_INVITE: '', - MAILER_URLPATHS_CONFIRMATION: '', - MAILER_URLPATHS_RECOVERY: '', - MAILER_URLPATHS_EMAIL_CHANGE: '', - SECURITY_UPDATE_PASSWORD_REQUIRE_REAUTHENTICATION: false, - SMTP_ADMIN_EMAIL: '', - SMTP_HOST: null, - SMTP_PORT: null, - SMTP_USER: null, - SMTP_PASS: null, - SMTP_MAX_FREQUENCY: 0, - EXTERNAL_EMAIL_ENABLED: true, - EXTERNAL_PHONE_ENABLED: true, - EXTERNAL_APPLE_ENABLED: false, - EXTERNAL_APPLE_CLIENT_ID: null, - EXTERNAL_APPLE_SECRET: null, - EXTERNAL_AZURE_ENABLED: false, - EXTERNAL_AZURE_CLIENT_ID: null, - EXTERNAL_AZURE_SECRET: null, - EXTERNAL_AZURE_URL: null, - EXTERNAL_BITBUCKET_ENABLED: false, - EXTERNAL_BITBUCKET_CLIENT_ID: null, - EXTERNAL_BITBUCKET_SECRET: null, - EXTERNAL_DISCORD_ENABLED: false, - EXTERNAL_DISCORD_CLIENT_ID: null, - EXTERNAL_DISCORD_SECRET: null, - EXTERNAL_FACEBOOK_ENABLED: false, - EXTERNAL_FACEBOOK_CLIENT_ID: null, - EXTERNAL_FACEBOOK_SECRET: null, - EXTERNAL_GITHUB_ENABLED: false, - EXTERNAL_GITHUB_CLIENT_ID: null, - EXTERNAL_GITHUB_SECRET: null, - EXTERNAL_GITLAB_ENABLED: false, - EXTERNAL_GITLAB_CLIENT_ID: null, - EXTERNAL_GITLAB_SECRET: null, - EXTERNAL_GITLAB_REDIRECT_URI: null, - EXTERNAL_GOOGLE_ENABLED: false, - EXTERNAL_GOOGLE_CLIENT_ID: null, - EXTERNAL_GOOGLE_SECRET: null, - EXTERNAL_KEYCLOAK_ENABLED: false, - EXTERNAL_KEYCLOAK_CLIENT_ID: null, - EXTERNAL_KEYCLOAK_SECRET: null, - EXTERNAL_KEYCLOAK_URL: null, - EXTERNAL_LINKEDIN_ENABLED: false, - EXTERNAL_LINKEDIN_CLIENT_ID: null, - EXTERNAL_LINKEDIN_SECRET: null, - EXTERNAL_NOTION_ENABLED: false, - EXTERNAL_NOTION_CLIENT_ID: null, - EXTERNAL_NOTION_SECRET: null, - EXTERNAL_SPOTIFY_ENABLED: false, - EXTERNAL_SPOTIFY_CLIENT_ID: null, - EXTERNAL_SPOTIFY_SECRET: null, - EXTERNAL_SLACK_ENABLED: false, - EXTERNAL_SLACK_CLIENT_ID: null, - EXTERNAL_SLACK_SECRET: null, - EXTERNAL_TWITTER_ENABLED: false, - EXTERNAL_TWITTER_CLIENT_ID: null, - EXTERNAL_TWITTER_SECRET: null, - EXTERNAL_TWITCH_ENABLED: false, - EXTERNAL_TWITCH_CLIENT_ID: null, - EXTERNAL_TWITCH_SECRET: null, - EXTERNAL_WORKOS_ENABLED: false, - EXTERNAL_WORKOS_CLIENT_ID: null, - EXTERNAL_WORKOS_SECRET: null, - EXTERNAL_WORKOS_URL: null, - EXTERNAL_ZOOM_ENABLED: false, - EXTERNAL_ZOOM_CLIENT_ID: null, - EXTERNAL_ZOOM_SECRET: null, + app_version: '', + config_override_id: '', + project_id: '', + jwt_secret_encrypted: '', + isFreeTier: true, + SITE_URL: '', + OPERATOR_TOKEN: null, + DISABLE_SIGNUP: false, + RATE_LIMIT_HEADER: null, + JWT_EXP: 3600, + JWT_AUD: '', + JWT_DEFAULT_GROUP_NAME: '', + URI_ALLOW_LIST: '', + MAILER_AUTOCONFIRM: false, + MAILER_OTP_EXP: 86400, + MAILER_URLPATHS_INVITE: '', + MAILER_URLPATHS_CONFIRMATION: '', + MAILER_URLPATHS_RECOVERY: '', + MAILER_URLPATHS_EMAIL_CHANGE: '', + SECURITY_UPDATE_PASSWORD_REQUIRE_REAUTHENTICATION: false, + SMTP_ADMIN_EMAIL: '', + SMTP_HOST: null, + SMTP_PORT: null, + SMTP_USER: null, + SMTP_PASS: null, + SMTP_MAX_FREQUENCY: 0, + EXTERNAL_EMAIL_ENABLED: true, + EXTERNAL_PHONE_ENABLED: true, + EXTERNAL_APPLE_ENABLED: false, + EXTERNAL_APPLE_CLIENT_ID: null, + EXTERNAL_APPLE_SECRET: null, + EXTERNAL_AZURE_ENABLED: false, + EXTERNAL_AZURE_CLIENT_ID: null, + EXTERNAL_AZURE_SECRET: null, + EXTERNAL_AZURE_URL: null, + EXTERNAL_BITBUCKET_ENABLED: false, + EXTERNAL_BITBUCKET_CLIENT_ID: null, + EXTERNAL_BITBUCKET_SECRET: null, + EXTERNAL_DISCORD_ENABLED: false, + EXTERNAL_DISCORD_CLIENT_ID: null, + EXTERNAL_DISCORD_SECRET: null, + EXTERNAL_FACEBOOK_ENABLED: false, + EXTERNAL_FACEBOOK_CLIENT_ID: null, + EXTERNAL_FACEBOOK_SECRET: null, + EXTERNAL_GITHUB_ENABLED: false, + EXTERNAL_GITHUB_CLIENT_ID: null, + EXTERNAL_GITHUB_SECRET: null, + EXTERNAL_GITLAB_ENABLED: false, + EXTERNAL_GITLAB_CLIENT_ID: null, + EXTERNAL_GITLAB_SECRET: null, + EXTERNAL_GITLAB_REDIRECT_URI: null, + EXTERNAL_GOOGLE_ENABLED: false, + EXTERNAL_GOOGLE_CLIENT_ID: null, + EXTERNAL_GOOGLE_SECRET: null, + EXTERNAL_KEYCLOAK_ENABLED: false, + EXTERNAL_KEYCLOAK_CLIENT_ID: null, + EXTERNAL_KEYCLOAK_SECRET: null, + EXTERNAL_KEYCLOAK_URL: null, + EXTERNAL_LINKEDIN_ENABLED: false, + EXTERNAL_LINKEDIN_CLIENT_ID: null, + EXTERNAL_LINKEDIN_SECRET: null, + EXTERNAL_NOTION_ENABLED: false, + EXTERNAL_NOTION_CLIENT_ID: null, + EXTERNAL_NOTION_SECRET: null, + EXTERNAL_SPOTIFY_ENABLED: false, + EXTERNAL_SPOTIFY_CLIENT_ID: null, + EXTERNAL_SPOTIFY_SECRET: null, + EXTERNAL_SLACK_ENABLED: false, + EXTERNAL_SLACK_CLIENT_ID: null, + EXTERNAL_SLACK_SECRET: null, + EXTERNAL_TWITTER_ENABLED: false, + EXTERNAL_TWITTER_CLIENT_ID: null, + EXTERNAL_TWITTER_SECRET: null, + EXTERNAL_TWITCH_ENABLED: false, + EXTERNAL_TWITCH_CLIENT_ID: null, + EXTERNAL_TWITCH_SECRET: null, + EXTERNAL_WORKOS_ENABLED: false, + EXTERNAL_WORKOS_CLIENT_ID: null, + EXTERNAL_WORKOS_SECRET: null, + EXTERNAL_WORKOS_URL: null, + EXTERNAL_ZOOM_ENABLED: false, + EXTERNAL_ZOOM_CLIENT_ID: null, + EXTERNAL_ZOOM_SECRET: null, - MAILER_SUBJECTS_INVITE: 'You have been invited', - MAILER_SUBJECTS_CONFIRMATION: 'Confirm Your Signup', - MAILER_SUBJECTS_RECOVERY: 'Reset Your Password', - MAILER_SUBJECTS_EMAIL_CHANGE: 'Confirm Email Change', - MAILER_SUBJECTS_MAGIC_LINK: 'Your Magic Link', - MAILER_TEMPLATES_INVITE: null, - MAILER_TEMPLATES_INVITE_CONTENT: + MAILER_SUBJECTS_INVITE: 'You have been invited', + MAILER_SUBJECTS_CONFIRMATION: 'Confirm Your Signup', + MAILER_SUBJECTS_RECOVERY: 'Reset Your Password', + MAILER_SUBJECTS_EMAIL_CHANGE: 'Confirm Email Change', + MAILER_SUBJECTS_MAGIC_LINK: 'Your Magic Link', + MAILER_TEMPLATES_INVITE: null, + MAILER_TEMPLATES_INVITE_CONTENT: '

    You have been invited

    \n\n

    You have been invited to create a user on {{ .SiteURL }}. Follow this link to accept the invite:

    \n

    Accept the invite

    ', - MAILER_TEMPLATES_CONFIRMATION: null, - MAILER_TEMPLATES_CONFIRMATION_CONTENT: + MAILER_TEMPLATES_CONFIRMATION: null, + MAILER_TEMPLATES_CONFIRMATION_CONTENT: '

    Confirm your email

    \n\n

    Follow this link to confirm your email:

    \n\n

    Confirm your email address

    ', - MAILER_TEMPLATES_RECOVERY: null, - MAILER_TEMPLATES_RECOVERY_CONTENT: + MAILER_TEMPLATES_RECOVERY: null, + MAILER_TEMPLATES_RECOVERY_CONTENT: '

    Reset Password

    \n\n

    Follow this link to reset the password for your user:

    \n

    Reset Password

    ', - MAILER_TEMPLATES_EMAIL_CHANGE: null, - MAILER_TEMPLATES_EMAIL_CHANGE_CONTENT: + MAILER_TEMPLATES_EMAIL_CHANGE: null, + MAILER_TEMPLATES_EMAIL_CHANGE_CONTENT: '

    Confirm Change of Email

    \n\n

    Follow this link to confirm the update of your email from {{ .Email }} to {{ .NewEmail }}:

    \n

    Change Email

    ', - MAILER_TEMPLATES_MAGIC_LINK: null, - MAILER_TEMPLATES_MAGIC_LINK_CONTENT: + MAILER_TEMPLATES_MAGIC_LINK: null, + MAILER_TEMPLATES_MAGIC_LINK_CONTENT: '

    Magic Link

    \n\n

    Follow this link to login:

    \n

    Log In

    ', - PASSWORD_MIN_LENGTH: 6, - SMTP_SENDER_NAME: null, - SMS_AUTOCONFIRM: false, - SMS_MAX_FREQUENCY: 0, - SMS_OTP_EXP: 60, - SMS_OTP_LENGTH: 6, - SMS_PROVIDER: 'twilio', - SMS_TWILIO_ACCOUNT_SID: null, - SMS_TWILIO_AUTH_TOKEN: null, - SMS_TWILIO_MESSAGE_SERVICE_SID: null, - SMS_TEMPLATE: 'Your code is {{ .Code }}', - SECURITY_CAPTCHA_ENABLED: false, - SECURITY_CAPTCHA_PROVIDER: 'hcaptcha', - SECURITY_CAPTCHA_SECRET: null, - SECURITY_REFRESH_TOKEN_REUSE_INTERVAL: '10', - RATE_LIMIT_EMAIL_SENT: 0, - RATE_LIMIT_SMS_SENT: 0, - MAILER_SECURE_EMAIL_CHANGE_ENABLED: true, - SMS_MESSAGEBIRD_ACCESS_KEY: null, - SMS_MESSAGEBIRD_ORIGINATOR: null, - SMS_VONAGE_API_KEY: null, - SMS_VONAGE_API_SECRET: null, - SMS_VONAGE_FROM: null, - SMS_TEXTLOCAL_API_KEY: null, - SMS_TEXTLOCAL_SENDER: null, + PASSWORD_MIN_LENGTH: 6, + SMTP_SENDER_NAME: null, + SMS_AUTOCONFIRM: false, + SMS_MAX_FREQUENCY: 0, + SMS_OTP_EXP: 60, + SMS_OTP_LENGTH: 6, + SMS_PROVIDER: 'twilio', + SMS_TWILIO_ACCOUNT_SID: null, + SMS_TWILIO_AUTH_TOKEN: null, + SMS_TWILIO_MESSAGE_SERVICE_SID: null, + SMS_TWILIO_VERIFY_ACCOUNT_SID: null, + SMS_TWILIO_VERIFY_AUTH_TOKEN: null, + SMS_TWILIO_VERIFY_MESSAGE_SERVICE_SID: null, + SMS_TEMPLATE: 'Your code is {{ .Code }}', + SECURITY_CAPTCHA_ENABLED: false, + SECURITY_CAPTCHA_PROVIDER: 'hcaptcha', + SECURITY_CAPTCHA_SECRET: null, + SECURITY_REFRESH_TOKEN_REUSE_INTERVAL: '10', + RATE_LIMIT_EMAIL_SENT: 0, + RATE_LIMIT_SMS_SENT: 0, + MAILER_SECURE_EMAIL_CHANGE_ENABLED: true, + SMS_MESSAGEBIRD_ACCESS_KEY: null, + SMS_MESSAGEBIRD_ORIGINATOR: null, + SMS_VONAGE_API_KEY: null, + SMS_VONAGE_API_SECRET: null, + SMS_VONAGE_FROM: null, + SMS_TEXTLOCAL_API_KEY: null, + SMS_TEXTLOCAL_SENDER: null, }) } diff --git a/studio/stores/authConfig/schema/AuthProviders/AuthProvidersFormValidation.tsx b/studio/stores/authConfig/schema/AuthProviders/AuthProvidersFormValidation.tsx index 750ff44fa62..4e6b7541d01 100644 --- a/studio/stores/authConfig/schema/AuthProviders/AuthProvidersFormValidation.tsx +++ b/studio/stores/authConfig/schema/AuthProviders/AuthProvidersFormValidation.tsx @@ -112,6 +112,33 @@ const PROVIDER_PHONE = { }, }, + // Twilio Verify + SMS_TWILIO_VERIFY_ACCOUNT_SID: { + type: 'string', + title: 'Twilio Account Sid', + show: { + key: 'SMS_PROVIDER', + matches: 'twilio', + }, + }, + SMS_TWILIO_VERIFY_AUTH_TOKEN: { + type: 'string', + title: 'Twilio Auth Token', + isSecret: true, + show: { + key: 'SMS_PROVIDER', + matches: 'twilio', + }, + }, + SMS_TWILIO_VERIFY_MESSAGE_SERVICE_SID: { + type: 'string', + title: 'Twilio Message Service Sid', + show: { + key: 'SMS_PROVIDER', + matches: 'twilio', + }, + }, + // Messagebird SMS_MESSAGEBIRD_ACCESS_KEY: { type: 'string', @@ -227,6 +254,29 @@ const PROVIDER_PHONE = { 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) => { diff --git a/studio/stores/jsonSchema/auth_gotrue_config.json b/studio/stores/jsonSchema/auth_gotrue_config.json index a0d00a3deb2..cfd63164f12 100644 --- a/studio/stores/jsonSchema/auth_gotrue_config.json +++ b/studio/stores/jsonSchema/auth_gotrue_config.json @@ -526,6 +526,19 @@ "type": "string", "help": "Twilio message service SID or twilio phone number" }, + "SMS_TWILIO_VERIFY_ACCOUNT_SID": { + "title": "Twilio account SID", + "type": "string" + }, + "SMS_TWILIO_VERIFY_AUTH_TOKEN": { + "title": "Twilio Verify auth token", + "type": "string" + }, + "SMS_TWILIO_VERIFY_MESSAGE_SERVICE_SID": { + "title": "Twilio Verify service SID", + "type": "string", + "help": "Twilio Verify service SID" + }, "SMS_MESSAGEBIRD_ACCESS_KEY": { "title": "Messagebird access key", "type": "string" From beb159ebb01066048a9757f99205f75572ccc4c4 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Wed, 21 Jun 2023 15:33:14 +0800 Subject: [PATCH 063/694] fix connection issues moving away from array POST --- .../Integrations/IntegrationPanels.tsx | 8 ++++--- .../interfaces/Integrations/ProjectLinker.tsx | 22 +++++++++---------- ...integration-connections-create-mutation.ts | 8 +++---- .../data/integrations/integrations-query.ts | 2 +- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/studio/components/interfaces/Integrations/IntegrationPanels.tsx b/studio/components/interfaces/Integrations/IntegrationPanels.tsx index 9cf53225dfa..5aa16fbbde3 100644 --- a/studio/components/interfaces/Integrations/IntegrationPanels.tsx +++ b/studio/components/interfaces/Integrations/IntegrationPanels.tsx @@ -67,6 +67,8 @@ const IntegrationInstallation = React.forwardRef
    - {projects.byId(connection.project_ref)?.name} + {projects.byId(connection.supabase_project_id)?.name} - {!connection.metadata.framework ? ( + {!connection?.metadata?.framework ? ( ) : ( {`icon`} )} - {connection.metadata.name} + {connection.metadata?.name}
    diff --git a/studio/components/interfaces/Integrations/ProjectLinker.tsx b/studio/components/interfaces/Integrations/ProjectLinker.tsx index 8f183b8b7c8..570de471499 100644 --- a/studio/components/interfaces/Integrations/ProjectLinker.tsx +++ b/studio/components/interfaces/Integrations/ProjectLinker.tsx @@ -65,21 +65,19 @@ const ProjectLinker = ({ createConnections({ organizationIntegrationId, - connections: [ - { - foreign_project_id: vercelProjectId, - supabase_project_id: supabaseProjectId, - integrationId: INTEGRATION_INTERNAL_ID, - metadata: { - ...projectDetails, - supabaseConfig: { - projectEnvVars: { - write: true, - }, + connection: { + foreign_project_id: vercelProjectId, + supabase_project_id: supabaseProjectId, + integrationId: INTEGRATION_INTERNAL_ID, + metadata: { + ...projectDetails, + supabaseConfig: { + projectEnvVars: { + write: true, }, }, }, - ], + }, }) } diff --git a/studio/data/integrations/integration-connections-create-mutation.ts b/studio/data/integrations/integration-connections-create-mutation.ts index 3c58ea49072..170a18a2404 100644 --- a/studio/data/integrations/integration-connections-create-mutation.ts +++ b/studio/data/integrations/integration-connections-create-mutation.ts @@ -4,21 +4,21 @@ import { API_URL } from 'lib/constants' export type IntegrationConnectionsCreateVariables = { organizationIntegrationId: string - connections: { + connection: { foreignProjectId: string supabaseProjectId: string integrationId: number metadata: any - }[] + } } export async function createIntegrationConnections({ organizationIntegrationId, - connections, + connection, }: IntegrationConnectionsCreateVariables) { const response = await post(`${API_URL}/integrations/vercel/connections`, { organization_integration_id: organizationIntegrationId, - connections, + connection, }) if (response.error) { throw response.error diff --git a/studio/data/integrations/integrations-query.ts b/studio/data/integrations/integrations-query.ts index 39cc1f7b7ad..1865da940d3 100644 --- a/studio/data/integrations/integrations-query.ts +++ b/studio/data/integrations/integrations-query.ts @@ -133,7 +133,7 @@ export type IntegrationProjectConnection = { created_at: string updated_at: string added_by: addedBy - project_ref: string + supabase_project_id: string organization_integration_id: string metadata: metadata } From f8d94c647abba9dd954e45f53a1cb847c14230a1 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Wed, 21 Jun 2023 18:37:05 +0800 Subject: [PATCH 064/694] chore: you can now add new connections via dashboard --- .../Integrations/IntegrationPanels.tsx | 1 - .../interfaces/Integrations/ProjectLinker.tsx | 82 +++--- .../IntegrationSettings/Integration.tsx | 16 +- .../IntegrationSettings.tsx | 3 +- .../SidePanelVercelProjectLinker.tsx | 67 ++--- ...integration-connections-create-mutation.ts | 6 +- .../data/integrations/integrations-query.ts | 241 +++++++++--------- ...el-installed-connection-delete-mutation.ts | 1 - .../integrations-vercel-projects-query.ts | 2 + .../state/github-connection-config-panel.ts | 10 +- 10 files changed, 233 insertions(+), 196 deletions(-) diff --git a/studio/components/interfaces/Integrations/IntegrationPanels.tsx b/studio/components/interfaces/Integrations/IntegrationPanels.tsx index 5aa16fbbde3..e8a3352fded 100644 --- a/studio/components/interfaces/Integrations/IntegrationPanels.tsx +++ b/studio/components/interfaces/Integrations/IntegrationPanels.tsx @@ -49,7 +49,6 @@ const HandleIcon = ({ type }: { type: HandleIconType }) => { } const Avatar = ({ src }: { src: string }) => { - console.log('src of avatar', src) return (
    avatar diff --git a/studio/components/interfaces/Integrations/ProjectLinker.tsx b/studio/components/interfaces/Integrations/ProjectLinker.tsx index 570de471499..3b0553124f1 100644 --- a/studio/components/interfaces/Integrations/ProjectLinker.tsx +++ b/studio/components/interfaces/Integrations/ProjectLinker.tsx @@ -2,7 +2,9 @@ import { ENV_VAR_RAW_KEYS } from 'components/interfaces/Integrations/Integration import { Markdown } from 'components/interfaces/Markdown' import { vercelIcon } from 'components/to-be-cleaned/ListIcons' import { useIntegrationConnectionsCreateMutation } from 'data/integrations/integration-connections-create-mutation' +import { Integration, IntegrationProjectConnection } from 'data/integrations/integrations-query' import { VercelProjectsResponse } from 'data/integrations/integrations-vercel-projects-query' +import { useStore } from 'hooks' import { BASE_PATH } from 'lib/constants' import { useState } from 'react' import { Button, IconArrowRight, IconPlus, IconX, Input, Listbox, Select, cn } from 'ui' @@ -20,7 +22,7 @@ export interface ProjectLinkerProps { foreignProjects: VercelProjectsResponse[] supabaseProjects: Project[] onCreateConnections?: () => void - installedConnections?: any[] + installedConnections: IntegrationProjectConnection[] | undefined } const UNDEFINED_SELECT_VALUE = 'undefined' @@ -31,10 +33,12 @@ const ProjectLinker = ({ foreignProjects, supabaseProjects, onCreateConnections: _onCreateConnections, - installedConnections, + installedConnections = [], }: ProjectLinkerProps) => { - const [supabaseProjectId, setSupabaseProjectId] = useState('') - const [vercelProjectId, setVercelProjectId] = useState('') + const { ui } = useStore() + + const [supabaseProjectId, setSupabaseProjectId] = useState(UNDEFINED_SELECT_VALUE) + const [vercelProjectId, setVercelProjectId] = useState(UNDEFINED_SELECT_VALUE) // function addConnection() { // setConnections([ @@ -54,6 +58,8 @@ const ProjectLinker = ({ // setConnections(newConnections) // } + // console.log('installed connections', installedConnections) + const { mutate: createConnections, isLoading } = useIntegrationConnectionsCreateMutation({ onSuccess() { _onCreateConnections?.() @@ -78,6 +84,7 @@ const ProjectLinker = ({ }, }, }, + orgId: ui.selectedOrganization?.id, }) } @@ -95,9 +102,22 @@ const ProjectLinker = ({ ) } + /** + * create a flat array of foreign project ids. ie, ["prj_MlkO6AiLG5ofS9ojKrkS3PhhlY3f", ..] + */ + const flatInstalledConnectionsIds = installedConnections.map((x) => x.foreign_project_id) + /** + * check that vercel project is not already installed + */ + const filteredForeignProjects: VercelProjectsResponse[] = foreignProjects.filter( + (foreignProject) => { + return !flatInstalledConnectionsIds.includes(foreignProject.id) + } + ) + return (
    -
    +
    Choose a Vercel project - {foreignProjects.map((project) => ( - { - return ( - <> - {!project?.framework ? ( - vercelIcon - ) : ( - {`icon`} - )} - - ) - }} - > - {project.name} - - ))} + {filteredForeignProjects.map((project) => { + return ( + { + return ( + <> + {!project?.framework ? ( + vercelIcon + ) : ( + {`icon`} + )} + + ) + }} + > + {project.name} + + ) + })}
    diff --git a/studio/components/interfaces/Organization/IntegrationSettings/Integration.tsx b/studio/components/interfaces/Organization/IntegrationSettings/Integration.tsx index cf4a11985df..3bd3b2434c3 100644 --- a/studio/components/interfaces/Organization/IntegrationSettings/Integration.tsx +++ b/studio/components/interfaces/Organization/IntegrationSettings/Integration.tsx @@ -1,4 +1,3 @@ -import { useParams } from 'common' import { EmptyIntegrationConnection, IntegrationConnection, @@ -12,16 +11,11 @@ import { ScaffoldSectionContent, ScaffoldSectionDetail, } from 'components/layouts/Scaffold' -import { useIntegrationConnectionsCreateMutation } from 'data/integrations/integration-connections-create-mutation' -import { - Integration as TIntegration, - useIntegrationsQuery, -} from 'data/integrations/integrations-query' +import { Integration as TIntegration } from 'data/integrations/integrations-query' import { useIntegrationsVercelInstalledConnectionDeleteMutation } from 'data/integrations/integrations-vercel-installed-connection-delete-mutation' import { useStore } from 'hooks' import { pluralize } from 'lib/helpers' import { EMPTY_ARR } from 'lib/void' -import { useMemo } from 'react' import { useGithubConnectionConfigPanelSnapshot } from 'state/github-connection-config-panel' import { Button, Dropdown, IconChevronDown, IconRefreshCcw, IconTrash } from 'ui' @@ -42,7 +36,7 @@ const Integration = ({ detail, integrations = EMPTY_ARR, }: IntegrationProps) => { - const githubConnectionConfigPanelShotshot = useGithubConnectionConfigPanelSnapshot() + const snapshot = useGithubConnectionConfigPanelSnapshot() const { ui } = useStore() @@ -90,6 +84,7 @@ Repository connections for ${title?.toLowerCase()}
    {integrations.length > 0 && integrations.map((integration, i) => { + console.log('integration.id', integration?.id) return (
    )} githubConnectionConfigPanelShotshot.setVisible(true)} + onClick={() => { + snapshot.setOrganizationIntegrationId(integration.id) + snapshot.setOpen(true) + }} > Add new project connection diff --git a/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx b/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx index e535d1f0577..e2932027eba 100644 --- a/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx +++ b/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx @@ -72,8 +72,7 @@ You can change the scope of the access for Supabase by configuring here. `} integrations={githubIntegrations} /> - {/* */} - {/* */} + ) } diff --git a/studio/components/interfaces/Organization/IntegrationSettings/SidePanelVercelProjectLinker.tsx b/studio/components/interfaces/Organization/IntegrationSettings/SidePanelVercelProjectLinker.tsx index be862353f74..58ee9775500 100644 --- a/studio/components/interfaces/Organization/IntegrationSettings/SidePanelVercelProjectLinker.tsx +++ b/studio/components/interfaces/Organization/IntegrationSettings/SidePanelVercelProjectLinker.tsx @@ -1,37 +1,48 @@ -import { useParams } from 'common' -import ProjectLinker from 'components/interfaces/Integrations/ProjectsLinker' +import ProjectLinker from 'components/interfaces/Integrations/ProjectLinker' import { Markdown } from 'components/interfaces/Markdown' import { useIntegrationsQuery } from 'data/integrations/integrations-query' +import { useVercelProjectConnectionsQuery } from 'data/integrations/integrations-vercel-installed-connections-query' +import { useVercelProjectsQuery } from 'data/integrations/integrations-vercel-projects-query' +import { useProjectsQuery } from 'data/projects/projects-query' import { useStore } from 'hooks' +import { EMPTY_ARR } from 'lib/void' import { observer } from 'mobx-react-lite' -import { useMemo, useState } from 'react' +import { useMemo } from 'react' import { useGithubConnectionConfigPanelSnapshot } from 'state/github-connection-config-panel' import { SidePanel } from 'ui' -import { useVercelProjectsQuery } from 'data/integrations/integrations-vercel-projects-query' -import { useProjectsQuery } from 'data/projects/projects-query' -import { EMPTY_ARR } from 'lib/void' -import { Organization } from 'types' -import { useVercelProjectConnectionsQuery } from 'data/integrations/integrations-vercel-installed-connections-query' - const SidePanelVercelProjectLinker = () => { const { ui } = useStore() - - const { data } = useIntegrationsQuery({ orgId: ui.selectedOrganization?.id }) - - const vercelIntegrations = data?.filter((integration) => integration.integration.id === 1) // vercel - const selectedOrg = ui.selectedOrganization - const [organizationIntegrationId, setOrganizationIntegrationId] = useState( - '880cb835-54b4-415b-8178-6f7920fdc40d' + const { data: integrationData } = useIntegrationsQuery({ + orgId: ui.selectedOrganization?.id, + }) + const vercelIntegrations = integrationData?.filter( + (integration) => integration.integration.name === 'Vercel' + ) // vercel + + const snapshot = useGithubConnectionConfigPanelSnapshot() + + /** + * Find the right integration + * + * we use the snapshot.organizationIntegrationId which should be set whenever this sidepanel is opened + */ + const selectedIntegration = vercelIntegrations?.find( + (x) => x.id === snapshot.organizationIntegrationId ) - const githubConnectionConfigPanelSnapshot = useGithubConnectionConfigPanelSnapshot() + const organizationIntegrationId = snapshot.organizationIntegrationId + const open = snapshot.open + /** + * Supabase projects available + */ const { data: supabaseProjectsData } = useProjectsQuery({ enabled: organizationIntegrationId !== null, }) + const supabaseProjects = useMemo( () => supabaseProjectsData @@ -47,30 +58,26 @@ const SidePanelVercelProjectLinker = () => { { enabled: organizationIntegrationId !== null } ) - const vercelProjectConnections = useMemo( - () => vercelProjectConnectionsData ?? EMPTY_ARR, - [vercelProjectConnectionsData] - ) - const { data: vercelProjectsData } = useVercelProjectsQuery( { orgId: selectedOrg?.id, orgSlug: selectedOrg?.slug, + organization_integration_id: organizationIntegrationId, }, { enabled: organizationIntegrationId !== null } ) - console.log('vercelProjectsData', vercelProjectsData) const vercelProjects = useMemo(() => vercelProjectsData ?? EMPTY_ARR, [vercelProjectsData]) return ( githubConnectionConfigPanelSnapshot.setVisible(false)} + visible={open} + hideFooter + onCancel={() => snapshot.setOpen(false)} > -
    +
    { - // if (next) { - // window.location.href = next - // } + snapshot.setOpen(false) }} - installedConnections={vercelProjectConnections} + installedConnections={selectedIntegration?.connections} /> diff --git a/studio/data/integrations/integration-connections-create-mutation.ts b/studio/data/integrations/integration-connections-create-mutation.ts index 170a18a2404..aa73ad05b9a 100644 --- a/studio/data/integrations/integration-connections-create-mutation.ts +++ b/studio/data/integrations/integration-connections-create-mutation.ts @@ -1,6 +1,7 @@ -import { useMutation, UseMutationOptions } from '@tanstack/react-query' +import { useMutation, UseMutationOptions, useQueryClient } from '@tanstack/react-query' import { post } from 'lib/common/fetch' import { API_URL } from 'lib/constants' +import { integrationKeys } from './keys' export type IntegrationConnectionsCreateVariables = { organizationIntegrationId: string @@ -10,6 +11,7 @@ export type IntegrationConnectionsCreateVariables = { integrationId: number metadata: any } + orgId: number | undefined } export async function createIntegrationConnections({ @@ -40,12 +42,14 @@ export const useIntegrationConnectionsCreateMutation = ({ >, 'mutationFn' > = {}) => { + const queryClient = useQueryClient() return useMutation< IntegrationConnectionsCreateData, unknown, IntegrationConnectionsCreateVariables >((vars) => createIntegrationConnections(vars), { async onSuccess(data, variables, context) { + await Promise.all([queryClient.invalidateQueries(integrationKeys.list(variables.orgId))]) await onSuccess?.(data, variables, context) }, ...options, diff --git a/studio/data/integrations/integrations-query.ts b/studio/data/integrations/integrations-query.ts index 1865da940d3..4467bbf9b9f 100644 --- a/studio/data/integrations/integrations-query.ts +++ b/studio/data/integrations/integrations-query.ts @@ -3,7 +3,123 @@ import { get } from 'lib/common/fetch' import { API_URL } from 'lib/constants' import { integrationKeys } from './keys' -type metadata = { +export type VercelFramework = + | ( + | 'blitzjs' + | 'nextjs' + | 'gatsby' + | 'remix' + | 'astro' + | 'hexo' + | 'eleventy' + | 'docusaurus-2' + | 'docusaurus' + | 'preact' + | 'solidstart' + | 'dojo' + | 'ember' + | 'vue' + | 'scully' + | 'ionic-angular' + | 'angular' + | 'polymer' + | 'svelte' + | 'sveltekit' + | 'sveltekit-1' + | 'ionic-react' + | 'create-react-app' + | 'gridsome' + | 'umijs' + | 'sapper' + | 'saber' + | 'stencil' + | 'nuxtjs' + | 'redwoodjs' + | 'hugo' + | 'jekyll' + | 'brunch' + | 'middleman' + | 'zola' + | 'hydrogen' + | 'vite' + | 'vitepress' + | 'vuepress' + | 'parcel' + | 'sanity' + | 'storybook' + ) + | null + +export type VercelGitLink = + | { + /** + * GitHub link + */ + org?: string + repo?: string + repoId?: number + type?: 'github' + createdAt?: number + deployHooks: { + createdAt?: number + id: string + name: string + ref: string + url: string + }[] + gitCredentialId?: string + updatedAt?: number + sourceless?: boolean + productionBranch?: string + } + | { + /** + * GitLab link + */ + projectId?: string + projectName?: string + projectNameWithNamespace?: string + projectNamespace?: string + projectUrl?: string + type?: 'gitlab' + createdAt?: number + deployHooks: { + createdAt?: number + id: string + name: string + ref: string + url: string + }[] + gitCredentialId?: string + updatedAt?: number + sourceless?: boolean + productionBranch?: string + } + | { + /** + * Bitbucket link + */ + name?: string + slug?: string + owner?: string + type?: 'bitbucket' + uuid?: string + workspaceUuid?: string + createdAt?: number + deployHooks: { + createdAt?: number + id: string + name: string + ref: string + url: string + }[] + gitCredentialId?: string + updatedAt?: number + sourceless?: boolean + productionBranch?: string + } + +type Imetadata = { metadata: { id: string supabaseConfig: { @@ -11,121 +127,9 @@ type metadata = { write: boolean } } - link?: - | { - /** - * GitHub link - */ - org?: string - repo?: string - repoId?: number - type?: 'github' - createdAt?: number - deployHooks: { - createdAt?: number - id: string - name: string - ref: string - url: string - }[] - gitCredentialId?: string - updatedAt?: number - sourceless?: boolean - productionBranch?: string - } - | { - /** - * GitLab link - */ - projectId?: string - projectName?: string - projectNameWithNamespace?: string - projectNamespace?: string - projectUrl?: string - type?: 'gitlab' - createdAt?: number - deployHooks: { - createdAt?: number - id: string - name: string - ref: string - url: string - }[] - gitCredentialId?: string - updatedAt?: number - sourceless?: boolean - productionBranch?: string - } - | { - /** - * Bitbucket link - */ - name?: string - slug?: string - owner?: string - type?: 'bitbucket' - uuid?: string - workspaceUuid?: string - createdAt?: number - deployHooks: { - createdAt?: number - id: string - name: string - ref: string - url: string - }[] - gitCredentialId?: string - updatedAt?: number - sourceless?: boolean - productionBranch?: string - } + link?: VercelGitLink name: string - framework: - | ( - | 'blitzjs' - | 'nextjs' - | 'gatsby' - | 'remix' - | 'astro' - | 'hexo' - | 'eleventy' - | 'docusaurus-2' - | 'docusaurus' - | 'preact' - | 'solidstart' - | 'dojo' - | 'ember' - | 'vue' - | 'scully' - | 'ionic-angular' - | 'angular' - | 'polymer' - | 'svelte' - | 'sveltekit' - | 'sveltekit-1' - | 'ionic-react' - | 'create-react-app' - | 'gridsome' - | 'umijs' - | 'sapper' - | 'saber' - | 'stencil' - | 'nuxtjs' - | 'redwoodjs' - | 'hugo' - | 'jekyll' - | 'brunch' - | 'middleman' - | 'zola' - | 'hydrogen' - | 'vite' - | 'vitepress' - | 'vuepress' - | 'parcel' - | 'sanity' - | 'storybook' - ) - | null + framework: VercelFramework } } export type IntegrationProjectConnection = { @@ -134,8 +138,9 @@ export type IntegrationProjectConnection = { updated_at: string added_by: addedBy supabase_project_id: string + foreign_project_id: string organization_integration_id: string - metadata: metadata + metadata: Imetadata } export type IntegrationsVariables = { @@ -146,7 +151,7 @@ export type IntegrationProjectConnectionPayload = { foreignProjectId: string supabaseProjectId: string integrationId: string - metadata: metadata + metadata: Imetadata } type userDetails = { @@ -166,7 +171,7 @@ export type Integration = { added_by: addedBy created_at: string updated_at: string - connections: IntegrationProjectConnection[] + connections: IntegrationProjectConnection[] | [] metadata?: { vercelTeam?: string gitHubConnectionOwner?: string diff --git a/studio/data/integrations/integrations-vercel-installed-connection-delete-mutation.ts b/studio/data/integrations/integrations-vercel-installed-connection-delete-mutation.ts index fa6d74522a8..dbcac04ee61 100644 --- a/studio/data/integrations/integrations-vercel-installed-connection-delete-mutation.ts +++ b/studio/data/integrations/integrations-vercel-installed-connection-delete-mutation.ts @@ -41,7 +41,6 @@ export const useIntegrationsVercelInstalledConnectionDeleteMutation = ({ async onSuccess(data, variables, context) { console.log('variables in mutate delete onSuccess', variables) await Promise.all([queryClient.invalidateQueries(integrationKeys.list(variables.orgId))]) - await onSuccess?.(data, variables, context) }, ...options, diff --git a/studio/data/integrations/integrations-vercel-projects-query.ts b/studio/data/integrations/integrations-vercel-projects-query.ts index 2f3307b373b..1e63ee1f6a3 100644 --- a/studio/data/integrations/integrations-vercel-projects-query.ts +++ b/studio/data/integrations/integrations-vercel-projects-query.ts @@ -3,6 +3,7 @@ import { get } from 'lib/common/fetch' import { API_URL } from 'lib/constants' import { useCallback } from 'react' import { integrationKeys } from './keys' +import { VercelFramework } from './integrations-query' export type VercelProjectsVariables = { orgId?: number @@ -13,6 +14,7 @@ export type VercelProjectsVariables = { export type VercelProjectsResponse = { id: string name: string + framework: VercelFramework metadata: { id: string name: string diff --git a/studio/state/github-connection-config-panel.ts b/studio/state/github-connection-config-panel.ts index 021d5c54846..915c6ec5fe8 100644 --- a/studio/state/github-connection-config-panel.ts +++ b/studio/state/github-connection-config-panel.ts @@ -1,9 +1,13 @@ import { proxy, snapshot, useSnapshot } from 'valtio' export const githubConnectionConfigPanelState = proxy({ - visible: false as boolean, - setVisible: (visible: boolean) => { - githubConnectionConfigPanelState.visible = visible + open: false as boolean, + setOpen: (open: boolean) => { + githubConnectionConfigPanelState.open = open + }, + organizationIntegrationId: '' as string, + setOrganizationIntegrationId: (organizationInterationId: string) => { + githubConnectionConfigPanelState.organizationIntegrationId = organizationInterationId }, }) From 450b83fa81f2959f934c23573678dae9c9480213 Mon Sep 17 00:00:00 2001 From: Dylan Johnson Date: Wed, 21 Jun 2023 19:54:19 -0400 Subject: [PATCH 065/694] fix: extension links --- apps/docs/components/Extensions.tsx | 14 +- apps/docs/data/extensions.json | 248 +++++++----------- .../extensions/{pgcron.mdx => pg_cron.mdx} | 2 +- .../extensions/{pgnet.mdx => pg_net.mdx} | 2 +- .../{pgrepack.mdx => pg_repack.mdx} | 1 + apps/www/lib/redirects.js | 15 ++ 6 files changed, 114 insertions(+), 168 deletions(-) rename apps/docs/pages/guides/database/extensions/{pgcron.mdx => pg_cron.mdx} (99%) rename apps/docs/pages/guides/database/extensions/{pgnet.mdx => pg_net.mdx} (99%) rename apps/docs/pages/guides/database/extensions/{pgrepack.mdx => pg_repack.mdx} (99%) diff --git a/apps/docs/components/Extensions.tsx b/apps/docs/components/Extensions.tsx index b7b7260cd64..4cd04e76e72 100644 --- a/apps/docs/components/Extensions.tsx +++ b/apps/docs/components/Extensions.tsx @@ -3,14 +3,14 @@ import React, { useState } from 'react' import { GlassPanel, IconLink, IconX, Input } from 'ui' import extensions from '../data/extensions.json' -type extension = { +type Extension = { name: string comment: string tags: string[] link?: string } -function getUniqueTags(json: extension[]) { +function getUniqueTags(json: Extension[]): string[] { const tags = [] for (const item of json) { if (item.tags) { @@ -21,12 +21,12 @@ function getUniqueTags(json: extension[]) { } export default function Extensions() { - const [searchTerm, setSearchTerm] = useState('') - const [filters, setFilters] = useState([]) + const [searchTerm, setSearchTerm] = useState('') + const [filters, setFilters] = useState([]) const tags = getUniqueTags(extensions) - function handleChecked(tag) { + function handleChecked(tag: string) { if (filters.includes(tag)) { setFilters(filters.filter((x) => x !== tag)) } else { @@ -98,8 +98,8 @@ export default function Extensions() { passHref href={`${ extension.link - ? `/guides/database/extensions/${extension.name}` - : '/guides/database/extensions#full-list-of-extensions' + ? extension.link + : `/guides/database/extensions/${extension.name}` }`} > diff --git a/apps/docs/data/extensions.json b/apps/docs/data/extensions.json index c46542b2cfd..95cd6460628 100644 --- a/apps/docs/data/extensions.json +++ b/apps/docs/data/extensions.json @@ -3,460 +3,390 @@ "name": "address_standardizer", "comment": "Used to parse an address into constituent elements. Generally used to support geocoding address normalization step.", "tags": ["Utility"], - "link": "http://supabase.com/docs/guides/extensions/etc/etc/etc" - }, - { - "name": "address_standardizer-3", - "comment": "Used to parse an address into constituent elements. Generally used to support geocoding address normalization step.", - "tags": ["Utility"] + "link": "https://postgis.net/docs/manual-2.5/Address_Standardizer.html" }, { "name": "address_standardizer_data_us", "comment": "Address Standardizer US dataset example", - "tags": ["Dataset"] - }, - { - "name": "address_standardizer_data_us-3", - "comment": "Address Standardizer US dataset example", - "tags": ["Dataset"] - }, - { - "name": "adminpack", - "comment": "administrative functions for PostgreSQL", - "tags": ["Admin", "Utility"] + "tags": ["Dataset"], + "link": "https://postgis.net/docs/manual-2.5/Address_Standardizer.html" }, { "name": "amcheck", "comment": "functions for verifying relation integrity", - "tags": ["Admin", "Utility"] + "tags": ["Admin", "Utility"], + "link": "https://www.postgresql.org/docs/current/amcheck.html" }, { "name": "autoinc", "comment": "functions for autoincrementing fields", - "tags": ["Utility"] + "tags": ["Utility"], + "link": "https://www.postgresql.org/docs/current/contrib-spi.html#id-1.11.7.50.6" }, { "name": "bloom", "comment": "bloom access method - signature file based index", - "tags": ["Index"] + "tags": ["Index"], + "link": "https://www.postgresql.org/docs/current/bloom.html" }, { "name": "btree_gin", "comment": "support for indexing common datatypes in GIN", - "tags": ["Index"] + "tags": ["Index"], + "link": "https://www.postgresql.org/docs/current/btree-gin.html" }, { "name": "btree_gist", "comment": "support for indexing common datatypes in GiST", - "tags": ["Index"] + "tags": ["Index"], + "link": "https://www.postgresql.org/docs/current/btree-gist.html" }, { "name": "citext", "comment": "data type for case-insensitive character strings", - "tags": ["Data Type"] + "tags": ["Data Type"], + "link": "https://www.postgresql.org/docs/current/citext.html" }, { "name": "cube", "comment": "data type for multidimensional cubes", - "tags": ["Data Type"] + "tags": ["Data Type"], + "link": "https://www.postgresql.org/docs/current/cube.html" }, { "name": "dblink", "comment": "connect to other PostgreSQL databases from within a database", - "tags": ["Admin", "Utility"] + "tags": ["Admin", "Utility"], + "link": "https://www.postgresql.org/docs/current/contrib-dblink-function.html" }, { "name": "dict_int", "comment": "text search dictionary template for integers", - "tags": ["Search"] + "tags": ["Search"], + "link": "https://www.postgresql.org/docs/current/dict-int.html" }, { "name": "dict_xsyn", "comment": "text search dictionary template for extended synonym processing", - "tags": ["Search"] + "tags": ["Search"], + "link": "https://www.postgresql.org/docs/current/dict-xsyn.html" }, { "name": "earthdistance", "comment": "calculate great-circle distances on the surface of the Earth", - "tags": ["Geo", "Utility"] - }, - { - "name": "file_fdw", - "comment": "foreign-data wrapper for flat file access", - "tags": ["Admin", "Utility"] + "tags": ["Geo", "Utility"], + "link": "https://www.postgresql.org/docs/current/earthdistance.html" }, { "name": "fuzzystrmatch", "comment": "determine similarities and distance between strings", - "tags": ["Search"] + "tags": ["Search"], + "link": "https://www.postgresql.org/docs/current/fuzzystrmatch.html" }, { "name": "hstore", "comment": "data type for storing sets of (key, value) pairs", - "tags": ["Data Type"] + "tags": ["Data Type"], + "link": "https://www.postgresql.org/docs/current/hstore.html" }, { "name": "hypopg", "comment": "Hypothetical indexes for PostgreSQL", - "link": "https://supabase.com/docs/guides/database/extensions/hypopg", "tags": ["Admin", "Index"] }, { "name": "http", "comment": "HTTP client for PostgreSQL, allows web page retrieval inside the database.", - "link": "https://supabase.com/docs/guides/database/extensions/http", "tags": ["Utility"] }, { "name": "insert_username", "comment": "functions for tracking who changed a table", - "tags": ["Audit", "Utility"] + "tags": ["Audit", "Utility"], + "link": "https://www.postgresql.org/docs/current/contrib-spi.html#id-1.11.7.50.7" }, { "name": "old_snapshot", "comment": "utilities in support of old_snapshot_threshold", - "tags": ["Admin", "Utility"] - }, - { - "name": "intagg", - "comment": "integer aggregator and enumerator (obsolete)", - "tags": ["Utility"] + "tags": ["Admin", "Utility"], + "link": "https://www.postgresql.org/docs/current/oldsnapshot.html" }, { "name": "intarray", "comment": "functions, operators, and index support for 1-D arrays of integers", - "tags": ["Utility"] + "tags": ["Utility"], + "link": "https://www.postgresql.org/docs/current/intarray.html" }, { "name": "isn", "comment": "data types for international product numbering standards", - "tags": ["Data Type"] + "tags": ["Data Type"], + "link": "https://www.postgresql.org/docs/current/isn.html" }, { "name": "lo", "comment": "Large Object maintenance", - "tags": ["Data Type"] + "tags": ["Data Type"], + "link": "https://www.postgresql.org/docs/current/lo.html" }, { "name": "ltree", "comment": "data type for hierarchical tree-like structures", - "tags": ["Data Type"] + "tags": ["Data Type"], + "link": "https://www.postgresql.org/docs/current/ltree.html" }, { "name": "moddatetime", "comment": "functions for tracking last modification time", - "tags": ["Audit", "Utility"] - }, - { - "name": "pageinspect", - "comment": "inspect the contents of database pages at a low level", - "tags": ["Admin", "Utility"] - }, - { - "name": "pg_buffercache", - "comment": "examine the shared buffer cache", - "tags": ["Admin", "Utility"] + "tags": ["Audit", "Utility"], + "link": "https://www.postgresql.org/docs/current/contrib-spi.html#id-1.11.7.50.8" }, { "name": "pg_cron", "comment": "Job scheduler for PostgreSQL", - "link": "https://supabase.com/docs/guides/database/extensions/pgcron", "tags": ["Utility"] }, { "name": "pg_freespacemap", "comment": "examine the free space map (FSM)", - "tags": ["Admin", "Utility"] + "tags": ["Admin", "Utility"], + "link": "https://www.postgresql.org/docs/current/pgfreespacemap.html" }, { "name": "pg_graphql", "comment": "pg_graphql: GraphQL support", - "link": "https://supabase.com/docs/guides/database/extensions/pg_graphql", "tags": ["Utility"] }, { "name": "pg_hashids", "comment": "pg_hashids", - "link": "https://supabase.com/docs/guides/database/extensions/pg_hashids", "tags": ["Utility"] }, { "name": "pg_jsonschema", "comment": "pg_jsonschema", - "link": "https://supabase.com/docs/guides/database/extensions/pg_jsonschema", "tags": ["Utility"] }, { "name": "pg_net", "comment": "Async HTTP", - "link": "https://supabase.com/docs/guides/database/extensions/pgnet", "tags": ["Utility", "Notifications"] }, { "name": "pg_prewarm", "comment": "prewarm relation data", - "tags": ["Admin", "Utility"] + "tags": ["Admin", "Utility"], + "link": "https://www.postgresql.org/docs/current/pgprewarm.html" }, { "name": "pg_stat_monitor", "comment": "The pg_stat_monitor is a PostgreSQL Query Performance Monitoring tool, based on PostgreSQL contrib module pg_stat_statements. pg_stat_monitor provides aggregated statistics, client information, plan details including plan, and histogram information.", - "link": "https://supabase.com/docs/guides/database/extensions/pg_stat_monitor", "tags": ["Utility"] }, { "name": "pg_stat_statements", "comment": "track execution statistics of all SQL statements executed", - "link": "https://supabase.com/docs/guides/database/extensions/pg_stat_statements", "tags": ["Admin", "Utility"] }, { "name": "pg_surgery", "comment": "extension to perform surgery on a damaged relation", - "tags": ["Admin", "Utility"] + "tags": ["Admin", "Utility"], + "link": "https://www.postgresql.org/docs/current/pgsurgery.html" }, { "name": "pg_trgm", "comment": "text similarity measurement and index searching based on trigrams", - "tags": ["Search"] - }, - { - "name": "pg_visibility", - "comment": "examine the visibility map (VM) and page-level visibility info", - "tags": ["Admin", "Utility"] + "tags": ["Search"], + "link": "https://www.postgresql.org/docs/current/pgtrgm.html" }, { "name": "pgaudit", "comment": "provides auditing functionality", - "link": "https://supabase.com/docs/guides/database/extensions/pgaudit", "tags": ["Audit", "Utility"] }, { "name": "pg_walinspect", "comment": "functions to inspect contents of PostgreSQL Write-Ahead Log", - "tags": ["Admin", "Utility"] + "tags": ["Admin", "Utility"], + "link": "https://www.postgresql.org/docs/current/pgwalinspect.html" }, { "name": "pgcrypto", "comment": "cryptographic functions", - "tags": ["Utility", "Cryptography"] + "tags": ["Utility", "Cryptography"], + "link": "https://www.postgresql.org/docs/current/pgcrypto.html" }, { "name": "pgjwt", "comment": "JSON Web Token API for Postgresql", - "link": "https://supabase.com/docs/guides/database/extensions/pgjwt", "tags": ["Utility", "Cryptography"] }, { "name": "pgroonga", "comment": "Super fast and all languages supported full text search index based on Groonga", - "link": "https://supabase.com/docs/guides/database/extensions/pgroonga", "tags": ["Search"] }, { "name": "pgroonga_database", "comment": "PGroonga database management module", - "tags": ["Admin"] + "tags": ["Admin"], + "link": "https://pgroonga.github.io/reference/modules/pgroonga-database.html" }, { "name": "pgrouting", "comment": "pgRouting Extension", - "link": "https://supabase.com/docs/guides/database/extensions/pgrouting", "tags": ["Geo", "Utility"] }, { "name": "pgrowlocks", "comment": "show row-level locking information", - "tags": ["Admin", "Utility"] + "tags": ["Admin", "Utility"], + "link": "https://www.postgresql.org/docs/current/pgrowlocks.html" }, { "name": "pgsodium", "comment": "Postgres extension for libsodium functions", - "link": "https://supabase.com/docs/guides/database/extensions/pgsodium", "tags": ["Utility", "Cryptography"] }, { "name": "pgstattuple", "comment": "show tuple-level statistics", - "tags": ["Admin", "Utility"] + "tags": ["Admin", "Utility"], + "link": "https://www.postgresql.org/docs/current/pgstattuple.html" }, { "name": "pgtap", "comment": "Unit testing for PostgreSQL", - "link": "https://supabase.com/docs/guides/database/extensions/pgtap", "tags": ["Utility", "Testing"] }, { "name": "plcoffee", "comment": "PL/CoffeeScript (v8) trusted procedural language", - "tags": ["Language"] + "tags": ["Language"], + "link": "https://github.com/plv8/plv8/blob/master/doc/plv8.md#coffeescript-extension" }, { "name": "pljava", "comment": "PL/Java procedural language (https://tada.github.io/pljava/)", - "tags": ["Language"] + "tags": ["Language"], + "link": "https://tada.github.io/pljava/" }, { "name": "plls", "comment": "PL/LiveScript (v8) trusted procedural language", - "tags": ["Language"] + "tags": ["Language"], + "link": "https://github.com/plv8/plv8/blob/master/doc/plv8.md#livescript-extension" }, { "name": "plpgsql", "comment": "PL/pgSQL procedural language", - "tags": ["Language"] + "tags": ["Language"], + "link": "https://www.postgresql.org/docs/current/plpgsql.html" }, { "name": "plpgsql_check", "comment": "extended check for plpgsql functions", - "href": "https://supabase.com/docs/guides/database/extensions/plpgsql_check", "tags": ["Utility", "Testing"] }, { "name": "plv8", "comment": "PL/JavaScript (v8) trusted procedural language", - "link": "http://localhost:3001/docs/guides/database/extensions/plv8", "tags": ["Language"] }, { "name": "postgis", "comment": "PostGIS geometry and geography spatial types and functions", - "link": "https://supabase.com/docs/guides/database/extensions/postgis", - "tags": ["Geo"] - }, - { - "name": "postgis-3", - "comment": "PostGIS geometry and geography spatial types and functions", - "tags": ["Geo"] - }, - { - "name": "postgis_raster", - "comment": "PostGIS raster types and functions", - "tags": ["Geo"] - }, - { - "name": "postgis_raster-3", - "comment": "PostGIS raster types and functions", - "tags": ["Geo"] - }, - { - "name": "postgis_sfcgal", - "comment": "PostGIS SFCGAL functions", - "tags": ["Geo"] - }, - { - "name": "postgis_sfcgal-3", - "comment": "PostGIS SFCGAL functions", - "tags": ["Geo"] - }, - { - "name": "postgis_tiger_geocoder", - "comment": "PostGIS tiger geocoder and reverse geocoder", - "tags": ["Geo"] - }, - { - "name": "postgis_tiger_geocoder-3", - "comment": "PostGIS tiger geocoder and reverse geocoder", - "tags": ["Geo"] - }, - { - "name": "postgis_topology", - "comment": "PostGIS topology spatial types and functions", - "tags": ["Geo"] - }, - { - "name": "postgis_topology-3", - "comment": "PostGIS topology spatial types and functions", "tags": ["Geo"] }, { "name": "postgres_fdw", "comment": "foreign-data wrapper for remote PostgreSQL servers", - "tags": ["Admin"] + "tags": ["Admin"], + "link": "https://www.postgresql.org/docs/current/postgres-fdw.html" }, { "name": "refint", "comment": "functions for implementing referential integrity (obsolete)", - "tags": ["Utility"] + "tags": ["Utility"], + "link": "https://www.postgresql.org/docs/current/contrib-spi.html#id-1.11.7.50.5" }, { "name": "rum", "comment": "GIN-like index for text search", - "link": "https://supabase.com/docs/guides/database/extensions/rum", "tags": ["Index", "Search"] }, { "name": "seg", "comment": "data type for representing line segments or floating-point intervals", - "tags": ["Utility"] + "tags": ["Utility"], + "link": "https://www.postgresql.org/docs/current/seg.html" }, { "name": "sslinfo", "comment": "information about SSL certificates", - "tags": ["Admin", "Utility"] + "tags": ["Admin", "Utility"], + "link": "https://www.postgresql.org/docs/current/sslinfo.html" }, { "name": "supautils", "comment": "Supabase standard library", - "tags": ["Utility"] + "tags": ["Utility"], + "link": "https://supabase.github.io/supautils/" }, { "name": "tablefunc", "comment": "functions that manipulate whole tables, including crosstab", - "tags": ["Utility"] + "tags": ["Utility"], + "link": "https://www.postgresql.org/docs/current/tablefunc.html" }, { "name": "tcn", "comment": "Triggered change notifications", - "tags": ["Utility", "Notifications"] + "tags": ["Utility", "Notifications"], + "link": "https://www.postgresql.org/docs/current/tcn.html" }, { "name": "timescaledb", "comment": "Enables scalable inserts and complex queries for time-series data", - "link": "https://supabase.com/docs/guides/database/extensions/timescaledb", "tags": ["Time Series", "Data Type", "Utility"] }, { "name": "tsm_system_rows", "comment": "TABLESAMPLE method which accepts number of rows as a limit", - "tags": ["Utility"] + "tags": ["Utility"], + "link": "https://www.postgresql.org/docs/current/tsm-system-rows.html" }, { "name": "tsm_system_time", "comment": "TABLESAMPLE method which accepts time in milliseconds as a limit", - "tags": ["Utility"] + "tags": ["Utility"], + "link": "https://www.postgresql.org/docs/current/tsm-system-time.html" }, { "name": "unaccent", "comment": "text search dictionary that removes accents", - "tags": ["Search"] + "tags": ["Search"], + "link": "https://www.postgresql.org/docs/current/unaccent.html" }, { "name": "uuid-ossp", "comment": "generate universally unique identifiers (UUIDs)", - "link": "https://supabase.com/docs/guides/database/extensions/uuid-ossp", "tags": ["Utility", "Data Type"] }, { "name": "pgvector", "comment": "vector data type with similarity search", - "link": "https://supabase.com/docs/guides/database/extensions/pgvector", "tags": ["AI", "Data Type", "Search"] }, { "name": "pg_repack", "comment": "Optimize physical storage and remove bloat from tables and indexes", - "link": "https://supabase.com/docs/guides/database/extensions/pgrepack", "tags": ["Admin", "Utility"] }, { "name": "wrappers", "comment": "Foreign data wrappers developed by Supabase", - "link": "https://supabase.com/docs/guides/database/extensions/wrappers", "tags": ["Admin", "Utility"] - }, - { - "name": "xml2", - "comment": "XPath querying and XSLT", - "tags": ["Utility"] } ] diff --git a/apps/docs/pages/guides/database/extensions/pgcron.mdx b/apps/docs/pages/guides/database/extensions/pg_cron.mdx similarity index 99% rename from apps/docs/pages/guides/database/extensions/pgcron.mdx rename to apps/docs/pages/guides/database/extensions/pg_cron.mdx index 8b4b5016c4d..521767b020d 100644 --- a/apps/docs/pages/guides/database/extensions/pgcron.mdx +++ b/apps/docs/pages/guides/database/extensions/pg_cron.mdx @@ -1,7 +1,7 @@ import Layout from '~/layouts/DefaultGuideLayout' export const meta = { - id: 'pgcron', + id: 'pg_cron', title: 'pg_cron: Job Scheduling', description: 'pgnet: a simple cron-based job scheduler for PostgreSQL that runs inside the database.', diff --git a/apps/docs/pages/guides/database/extensions/pgnet.mdx b/apps/docs/pages/guides/database/extensions/pg_net.mdx similarity index 99% rename from apps/docs/pages/guides/database/extensions/pgnet.mdx rename to apps/docs/pages/guides/database/extensions/pg_net.mdx index 5a93b7a48b5..8510d2c6fe9 100644 --- a/apps/docs/pages/guides/database/extensions/pgnet.mdx +++ b/apps/docs/pages/guides/database/extensions/pg_net.mdx @@ -1,7 +1,7 @@ import Layout from '~/layouts/DefaultGuideLayout' export const meta = { - id: 'pgnet', + id: 'pg_net', title: 'pg_net: Async Networking', description: 'pg_net: an async networking extension for PostgreSQL.', } diff --git a/apps/docs/pages/guides/database/extensions/pgrepack.mdx b/apps/docs/pages/guides/database/extensions/pg_repack.mdx similarity index 99% rename from apps/docs/pages/guides/database/extensions/pgrepack.mdx rename to apps/docs/pages/guides/database/extensions/pg_repack.mdx index bea7f7474b2..0225216f320 100644 --- a/apps/docs/pages/guides/database/extensions/pgrepack.mdx +++ b/apps/docs/pages/guides/database/extensions/pg_repack.mdx @@ -1,6 +1,7 @@ import Layout from '~/layouts/DefaultGuideLayout' export const meta = { + id: 'pg_repack', title: 'pg_repack: Physical storage optimization and maintenance', description: 'A tool to remove bloat from tables and indexes and optimize physical data order and physical storage', diff --git a/apps/www/lib/redirects.js b/apps/www/lib/redirects.js index 341fdabd2d4..e67fc764458 100644 --- a/apps/www/lib/redirects.js +++ b/apps/www/lib/redirects.js @@ -2036,4 +2036,19 @@ module.exports = [ source: '/docs/guides/realtime/extensions/postgres-changes', destination: '/docs/guides/realtime/postgres-changes', }, + { + permanent: true, + source: '/docs/guides/database/extensions/pgcron', + destination: '/docs/guides/database/extensions/pg_cron', + }, + { + permanent: true, + source: '/docs/guides/database/extensions/pgnet', + destination: '/docs/guides/database/extensions/pg_net', + }, + { + permanent: true, + source: '/docs/guides/database/extensions/pgrepack', + destination: '/docs/guides/database/extensions/pg_repack', + }, ] From 6f9754592d5b4544d57b5624692755e451dde070 Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Thu, 22 Jun 2023 12:20:31 +0800 Subject: [PATCH 066/694] Show read only badge on project card --- .../Home/ProjectList/ProjectCard.tsx | 39 +++++++++---- studio/data/projects/keys.ts | 2 + .../projects/project-readonly-status-query.ts | 55 +++++++++++++++++++ 3 files changed, 86 insertions(+), 10 deletions(-) create mode 100644 studio/data/projects/project-readonly-status-query.ts diff --git a/studio/components/interfaces/Home/ProjectList/ProjectCard.tsx b/studio/components/interfaces/Home/ProjectList/ProjectCard.tsx index a22a0682b94..dff7b3a46bd 100644 --- a/studio/components/interfaces/Home/ProjectList/ProjectCard.tsx +++ b/studio/components/interfaces/Home/ProjectList/ProjectCard.tsx @@ -1,22 +1,27 @@ -import { FC } from 'react' -import { Badge, IconLoader, IconPauseCircle } from 'ui' +import { Badge, IconAlertTriangle, IconLoader, IconPauseCircle } from 'ui' -import { Project } from 'types' import CardButton from 'components/ui/CardButton' +import { useProjectReadOnlyStatusQuery } from 'data/projects/project-readonly-status-query' import { PROJECT_STATUS } from 'lib/constants' +import { Project } from 'types' -interface Props { +interface ProjectCardProps { project: Project rewriteHref?: string } -const ProjectCard: FC = ({ project, rewriteHref }) => { +const ProjectCard = ({ project, rewriteHref }: ProjectCardProps) => { const { name, ref: projectRef } = project const desc = `${project.cloud_provider} | ${project.region}` + const { data: readonlyStatus } = useProjectReadOnlyStatusQuery({ projectRef }) + + // Project status should supercede is read only status + const isHealthy = project.status === PROJECT_STATUS.ACTIVE_HEALTHY const isPausing = project.status === PROJECT_STATUS.GOING_DOWN const isPaused = project.status === PROJECT_STATUS.INACTIVE const isRestoring = project.status === PROJECT_STATUS.RESTORING + const isReadonly = readonlyStatus?.enabled ?? false return (
  • @@ -30,7 +35,19 @@ const ProjectCard: FC = ({ project, rewriteHref }) => { footer={
    {desc} - {isRestoring ? ( + + {isHealthy && isReadonly && ( +
    + +
    + + Readonly mode enabled +
    +
    +
    + )} + + {isRestoring && (
    @@ -39,7 +56,9 @@ const ProjectCard: FC = ({ project, rewriteHref }) => {
    - ) : isPausing ? ( + )} + + {isPausing && (
    @@ -48,7 +67,9 @@ const ProjectCard: FC = ({ project, rewriteHref }) => {
    - ) : isPaused ? ( + )} + + {isPaused && (
    @@ -57,8 +78,6 @@ const ProjectCard: FC = ({ project, rewriteHref }) => {
    - ) : ( - <> )}
    } diff --git a/studio/data/projects/keys.ts b/studio/data/projects/keys.ts index 7a3d357e9c6..dd9edab9b99 100644 --- a/studio/data/projects/keys.ts +++ b/studio/data/projects/keys.ts @@ -1,4 +1,6 @@ export const projectKeys = { list: () => ['projects'] as const, detail: (projectRef: string | undefined) => ['projects', projectRef, 'detail'] as const, + readonlyStatus: (projectRef: string | undefined) => + ['projects', projectRef, 'readonlyStatus'] as const, } diff --git a/studio/data/projects/project-readonly-status-query.ts b/studio/data/projects/project-readonly-status-query.ts new file mode 100644 index 00000000000..bcd6274f02c --- /dev/null +++ b/studio/data/projects/project-readonly-status-query.ts @@ -0,0 +1,55 @@ +import { useQuery, useQueryClient, UseQueryOptions } from '@tanstack/react-query' +import { get } from 'lib/common/fetch' +import { API_ADMIN_URL } from 'lib/constants' +import { useCallback } from 'react' +import { projectKeys } from './keys' + +export type ProjectReadOnlyStatusVariables = { projectRef?: string } +export type ProjectReadOnlyStatus = { + enabled: boolean + override_enabled: boolean + override_active_until: string +} + +export async function getProjectReadOnlyStatus( + { projectRef }: ProjectReadOnlyStatusVariables, + signal?: AbortSignal +) { + if (!projectRef) throw new Error('Project ref is required') + const data = await get(`${API_ADMIN_URL}/projects/${projectRef}/readonly`, { signal }) + if (data.error) throw data.error + return data as ProjectReadOnlyStatus +} + +export type ProjectReadOnlyStatusData = Awaited> +export type ProjectReadOnlyStatusError = unknown + +export const useProjectReadOnlyStatusQuery = ( + { projectRef }: ProjectReadOnlyStatusVariables, + { + enabled = true, + ...options + }: UseQueryOptions = {} +) => + useQuery( + projectKeys.readonlyStatus(projectRef), + ({ signal }) => getProjectReadOnlyStatus({ projectRef }, signal), + { + enabled: enabled && typeof projectRef !== 'undefined', + ...options, + } + ) + +export const useProjectReadOnlyStatusPrefetch = ({ + projectRef, +}: ProjectReadOnlyStatusVariables) => { + const client = useQueryClient() + + return useCallback(() => { + if (projectRef) { + client.prefetchQuery(projectKeys.readonlyStatus(projectRef), ({ signal }) => + getProjectReadOnlyStatus({ projectRef }, signal) + ) + } + }, [projectRef]) +} From c15f0391f93ed5d3247e888241c970ed816108f4 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 22 Jun 2023 18:09:15 +0800 Subject: [PATCH 067/694] fix BASE_PATH issues --- .../components/interfaces/Integrations/IntegrationPanels.tsx | 3 ++- .../Organization/IntegrationSettings/Integration.tsx | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/studio/components/interfaces/Integrations/IntegrationPanels.tsx b/studio/components/interfaces/Integrations/IntegrationPanels.tsx index e8a3352fded..ae9fdbde404 100644 --- a/studio/components/interfaces/Integrations/IntegrationPanels.tsx +++ b/studio/components/interfaces/Integrations/IntegrationPanels.tsx @@ -2,6 +2,7 @@ import { Markdown } from 'components/interfaces/Markdown' import { Integration, IntegrationProjectConnection } from 'data/integrations/integrations-query' import dayjs from 'dayjs' import { useStore } from 'hooks' +import { BASE_PATH } from 'lib/constants' import Image from 'next/image' import React from 'react' @@ -142,7 +143,7 @@ const IntegrationConnection = React.forwardRef ) : ( {`icon`}} cover From c10ad8f01e95d7c3ef03a7d9bd83f72fedd79405 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 22 Jun 2023 19:49:52 +0800 Subject: [PATCH 068/694] updating to use slug --- .../Integrations/IntegrationPanels.tsx | 2 +- .../interfaces/Integrations/ProjectLinker.tsx | 19 ++++++++++--------- .../IntegrationSettings.tsx | 6 +----- ...integration-connections-create-mutation.ts | 6 +++--- .../data/integrations/integrations-query.ts | 18 +++++++++--------- studio/data/integrations/keys.ts | 2 +- .../vercel-integration-create-mutation.ts | 8 ++++---- studio/pages/integrations/vercel.tsx | 9 +++++---- 8 files changed, 34 insertions(+), 36 deletions(-) diff --git a/studio/components/interfaces/Integrations/IntegrationPanels.tsx b/studio/components/interfaces/Integrations/IntegrationPanels.tsx index ae9fdbde404..429a06bfc50 100644 --- a/studio/components/interfaces/Integrations/IntegrationPanels.tsx +++ b/studio/components/interfaces/Integrations/IntegrationPanels.tsx @@ -40,7 +40,7 @@ const HandleIcon = ({ type }: { type: HandleIconType }) => { break case 'Supabase': - return Supabase + return Supabase break default: diff --git a/studio/components/interfaces/Integrations/ProjectLinker.tsx b/studio/components/interfaces/Integrations/ProjectLinker.tsx index 3b0553124f1..4f384ec30be 100644 --- a/studio/components/interfaces/Integrations/ProjectLinker.tsx +++ b/studio/components/interfaces/Integrations/ProjectLinker.tsx @@ -12,6 +12,7 @@ import { Button, IconArrowRight, IconPlus, IconX, Input, Listbox, Select, cn } f interface Project { id: string name: string + ref: string } // to do: move this somewhere @@ -37,7 +38,7 @@ const ProjectLinker = ({ }: ProjectLinkerProps) => { const { ui } = useStore() - const [supabaseProjectId, setSupabaseProjectId] = useState(UNDEFINED_SELECT_VALUE) + const [supabaseProjectRef, setSupabaseProjectRef] = useState(UNDEFINED_SELECT_VALUE) const [vercelProjectId, setVercelProjectId] = useState(UNDEFINED_SELECT_VALUE) // function addConnection() { @@ -73,8 +74,8 @@ const ProjectLinker = ({ organizationIntegrationId, connection: { foreign_project_id: vercelProjectId, - supabase_project_id: supabaseProjectId, - integrationId: INTEGRATION_INTERNAL_ID, + supabase_project_ref: supabaseProjectRef, + integration_id: INTEGRATION_INTERNAL_ID, metadata: { ...projectDetails, supabaseConfig: { @@ -129,16 +130,16 @@ const ProjectLinker = ({
  • setSupabaseProjectId(e)} + value={supabaseProjectRef ?? UNDEFINED_SELECT_VALUE} + onChange={(e) => setSupabaseProjectRef(e)} > - Choose a Supabase project + Choose project {supabaseProjects.map((project) => ( { return ( @@ -178,7 +179,7 @@ const ProjectLinker = ({ onChange={(e) => setVercelProjectId(e)} > - Choose a Vercel project + Choose Vercel project {filteredForeignProjects.map((project) => { return ( @@ -193,7 +194,7 @@ const ProjectLinker = ({ vercelIcon ) : ( {`icon`} { const { ui } = useStore() - const { slug } = useParams() - const { data } = useIntegrationsQuery({ orgId: ui.selectedOrganization?.id }) + const { data } = useIntegrationsQuery({ orgSlug: ui.selectedOrganization?.slug }) const org = ui.selectedOrganization diff --git a/studio/data/integrations/integration-connections-create-mutation.ts b/studio/data/integrations/integration-connections-create-mutation.ts index aa73ad05b9a..b6605601fd6 100644 --- a/studio/data/integrations/integration-connections-create-mutation.ts +++ b/studio/data/integrations/integration-connections-create-mutation.ts @@ -6,9 +6,9 @@ import { integrationKeys } from './keys' export type IntegrationConnectionsCreateVariables = { organizationIntegrationId: string connection: { - foreignProjectId: string - supabaseProjectId: string - integrationId: number + foreign_project_id: string + supabase_project_ref: string + integration_id: number metadata: any } orgId: number | undefined diff --git a/studio/data/integrations/integrations-query.ts b/studio/data/integrations/integrations-query.ts index 4467bbf9b9f..d0c01593a57 100644 --- a/studio/data/integrations/integrations-query.ts +++ b/studio/data/integrations/integrations-query.ts @@ -144,7 +144,7 @@ export type IntegrationProjectConnection = { } export type IntegrationsVariables = { - orgId?: number + orgSlug?: string } export type IntegrationProjectConnectionPayload = { @@ -180,12 +180,12 @@ export type Integration = { export type IntegrationsResponse = Integration[] -export async function getIntegrations({ orgId }: IntegrationsVariables, signal?: AbortSignal) { - if (!orgId) { - throw new Error('orgId is required') +export async function getIntegrations({ orgSlug }: IntegrationsVariables, signal?: AbortSignal) { + if (!orgSlug) { + throw new Error('orgSlug is required') } - const response = await get(`${API_URL}/integrations/${orgId}`, { + const response = await get(`${API_URL}/integrations/${orgSlug}`, { signal, }) if (response.error) { @@ -202,11 +202,11 @@ export type ProjectIntegrationConnectionsData = Awaited< export type IntegrationsError = unknown export const useIntegrationsQuery = ( - { orgId }: IntegrationsVariables, + { orgSlug }: IntegrationsVariables, { enabled = true, ...options }: UseQueryOptions = {} ) => useQuery( - integrationKeys.list(orgId), - ({ signal }) => getIntegrations({ orgId }, signal), - { enabled: enabled && typeof orgId !== 'undefined', ...options } + integrationKeys.list(orgSlug), + ({ signal }) => getIntegrations({ orgSlug }, signal), + { enabled: enabled && typeof orgSlug !== 'undefined', ...options } ) diff --git a/studio/data/integrations/keys.ts b/studio/data/integrations/keys.ts index b25c9329d41..7164ad8068f 100644 --- a/studio/data/integrations/keys.ts +++ b/studio/data/integrations/keys.ts @@ -1,5 +1,5 @@ export const integrationKeys = { - list: (orgId: number | undefined) => ['organizations', orgId, 'integrations'] as const, + list: (orgSlug: string | undefined) => ['organizations', orgSlug, 'integrations'] as const, vercelProjectList: (organization_integration_id: string | undefined) => ['organizations', organization_integration_id, 'vercel-projects'] as const, vercelConnectionsList: (organization_integration_id: string | undefined) => diff --git a/studio/data/integrations/vercel-integration-create-mutation.ts b/studio/data/integrations/vercel-integration-create-mutation.ts index 04781212e39..9165c33df2d 100644 --- a/studio/data/integrations/vercel-integration-create-mutation.ts +++ b/studio/data/integrations/vercel-integration-create-mutation.ts @@ -5,7 +5,7 @@ import { API_URL } from 'lib/constants' export type VercelIntegrationCreateVariables = { code: string configurationId: string - orgId: number + orgSlug: string metadata: { [key: string]: string } source: string // teamId is only present when a team is being installed @@ -16,16 +16,16 @@ export type VercelIntegrationCreateVariables = { export async function createVercelIntegration({ code, configurationId, - orgId, + orgSlug, metadata, source, teamId, }: VercelIntegrationCreateVariables) { - console.log('payload', { code, configurationId, orgId, metadata, source, teamId }) + console.log('payload', { code, configurationId, orgSlug, metadata, source, teamId }) const response = await post(`${API_URL}/integrations/vercel`, { code, configuration_id: configurationId, - organization_id: orgId, + organization_slug: orgSlug, metadata, source, teamId, diff --git a/studio/pages/integrations/vercel.tsx b/studio/pages/integrations/vercel.tsx index 2133b293df6..da33fc04467 100644 --- a/studio/pages/integrations/vercel.tsx +++ b/studio/pages/integrations/vercel.tsx @@ -30,8 +30,8 @@ const VercelIntegration: NextPageWithLayout = () => { }) function onInstall() { - const orgId = selectedOrg?.id - if (!orgId) { + const orgSlug = selectedOrg?.slug + if (!orgSlug) { return ui.setNotification({ category: 'error', message: 'Please select an organization' }) } @@ -55,7 +55,7 @@ const VercelIntegration: NextPageWithLayout = () => { mutate({ code, configurationId, - orgId, + orgSlug, metadata, source, teamId: teamId, @@ -69,7 +69,8 @@ const VercelIntegration: NextPageWithLayout = () => { () => supabaseProjectsData ?.filter((project) => project.organization_id === selectedOrg?.id) - .map((project) => ({ id: project.id.toString(), name: project.name })) ?? EMPTY_ARR, + .map((project) => ({ id: project.id.toString(), name: project.name, ref: project.ref })) ?? + EMPTY_ARR, [selectedOrg?.id, supabaseProjectsData] ) From 6c31d28f059c0e920486ef6f4323021264dae2fd Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 22 Jun 2023 19:53:55 +0800 Subject: [PATCH 069/694] fixed fitler issue --- .../IntegrationSettings/IntegrationSettings.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx b/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx index 88efe9e86d9..d7d2249b047 100644 --- a/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx +++ b/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx @@ -11,8 +11,12 @@ const IntegrationSettings = () => { const org = ui.selectedOrganization - const vercelIntegrations = data?.filter((integration) => integration.integration.id === 1) // vercel - const githubIntegrations = data?.filter((integration) => integration.integration.id === 2) // github + const vercelIntegrations = data?.filter( + (integration) => integration.integration.name === 'Vercel' + ) // vercel + const githubIntegrations = data?.filter( + (integration) => integration.integration.name === 'GitHub' + ) // github vercelIntegrations?.map((x) => { let data: any = { ...x } From 26be8af74591ab784960e25afe4b4f471ff21397 Mon Sep 17 00:00:00 2001 From: Greg Richardson Date: Thu, 22 Jun 2023 09:32:18 -0600 Subject: [PATCH 070/694] chore: change dashboard links to new url --- DEVELOPERS.md | 10 +- README.md | 5 +- apps/docs/components/MDX/database_setup.mdx | 6 +- apps/docs/components/MDX/project_setup.mdx | 6 +- .../MDX/social_provider_settings_supabase.mdx | 4 +- .../components/MDX/social_provider_setup.mdx | 4 +- .../components/MDX/storage_management.mdx | 2 +- apps/docs/docs/ref/api/api.mdx | 2 +- apps/docs/docs/ref/api/introduction.mdx | 2 +- apps/docs/docs/reference/api.mdx | 2 +- .../ai/examples/headless-vector-search.mdx | 4 +- .../examples/huggingface-image-captioning.mdx | 6 +- .../ai/examples/nextjs-vector-search.mdx | 6 +- apps/docs/pages/guides/ai/google-colab.mdx | 6 +- .../guides/ai/integrations/llamaindex.mdx | 2 +- .../guides/ai/quickstarts/face-similarity.mdx | 2 +- .../guides/ai/quickstarts/hello-world.mdx | 2 +- .../ai/quickstarts/text-deduplication.mdx | 2 +- apps/docs/pages/guides/ai/vector-columns.mdx | 2 +- apps/docs/pages/guides/api.mdx | 6 +- apps/docs/pages/guides/api/api-keys.mdx | 4 +- .../docs/pages/guides/api/creating-routes.mdx | 6 +- apps/docs/pages/guides/api/quickstart.mdx | 6 +- .../guides/api/rest/auto-generated-docs.mdx | 4 +- .../pages/guides/api/securing-your-api.mdx | 2 +- apps/docs/pages/guides/auth.mdx | 2 +- apps/docs/pages/guides/auth/auth-captcha.mdx | 2 +- .../guides/auth/auth-email-templates.mdx | 2 +- apps/docs/pages/guides/auth/auth-email.mdx | 6 +- .../guides/auth/auth-helpers/nextjs-pages.mdx | 2 +- .../pages/guides/auth/auth-helpers/nextjs.mdx | 4 +- .../pages/guides/auth/auth-helpers/remix.mdx | 4 +- .../guides/auth/auth-helpers/sveltekit.mdx | 4 +- .../pages/guides/auth/auth-magic-link.mdx | 4 +- .../pages/guides/auth/auth-password-reset.mdx | 8 +- .../guides/auth/phone-login/messagebird.mdx | 8 +- .../pages/guides/auth/phone-login/twilio.mdx | 8 +- .../pages/guides/auth/phone-login/vonage.mdx | 8 +- .../pages/guides/auth/quickstarts/nextjs.mdx | 6 +- .../pages/guides/auth/quickstarts/react.mdx | 6 +- .../pages/guides/auth/row-level-security.mdx | 2 +- .../guides/auth/server-side-rendering.mdx | 2 +- .../guides/auth/social-login/auth-apple.mdx | 2 +- .../auth/social-login/auth-bitbucket.mdx | 2 +- .../guides/auth/social-login/auth-discord.mdx | 2 +- .../auth/social-login/auth-facebook.mdx | 2 +- .../guides/auth/social-login/auth-github.mdx | 2 +- .../guides/auth/social-login/auth-gitlab.mdx | 2 +- .../guides/auth/social-login/auth-google.mdx | 2 +- .../auth/social-login/auth-linkedin.mdx | 2 +- .../guides/auth/social-login/auth-notion.mdx | 2 +- .../guides/auth/social-login/auth-slack.mdx | 2 +- .../guides/auth/social-login/auth-spotify.mdx | 2 +- .../guides/auth/social-login/auth-twitch.mdx | 2 +- .../guides/auth/social-login/auth-twitter.mdx | 2 +- .../guides/auth/social-login/auth-zoom.mdx | 2 +- .../pages/guides/auth/sso/auth-sso-saml.mdx | 10 +- .../guides/cli/managing-environments.mdx | 4 +- apps/docs/pages/guides/database.mdx | 2 +- apps/docs/pages/guides/database/arrays.mdx | 6 +- .../database/connecting-to-postgres.mdx | 4 +- .../docs/pages/guides/database/extensions.mdx | 2 +- .../pages/guides/database/extensions/http.mdx | 2 +- .../guides/database/extensions/hypopg.mdx | 2 +- .../guides/database/extensions/pg_graphql.mdx | 2 +- .../guides/database/extensions/pg_hashids.mdx | 2 +- .../database/extensions/pg_jsonschema.mdx | 2 +- .../database/extensions/pg_stat_monitor.mdx | 2 +- .../extensions/pg_stat_statements.mdx | 2 +- .../guides/database/extensions/pgaudit.mdx | 2 +- .../guides/database/extensions/pgcron.mdx | 2 +- .../guides/database/extensions/pgjwt.mdx | 2 +- .../guides/database/extensions/pgnet.mdx | 2 +- .../guides/database/extensions/pgrepack.mdx | 2 +- .../guides/database/extensions/pgroonga.mdx | 2 +- .../guides/database/extensions/pgrouting.mdx | 2 +- .../guides/database/extensions/pgsodium.mdx | 2 +- .../guides/database/extensions/pgtap.mdx | 2 +- .../guides/database/extensions/pgvector.mdx | 2 +- .../database/extensions/plpgsql_check.mdx | 2 +- .../pages/guides/database/extensions/plv8.mdx | 2 +- .../guides/database/extensions/postgis.mdx | 2 +- .../pages/guides/database/extensions/rum.mdx | 2 +- .../database/extensions/timescaledb.mdx | 2 +- .../guides/database/extensions/uuid-ossp.mdx | 2 +- .../guides/database/extensions/wrappers.mdx | 2 +- apps/docs/pages/guides/database/json.mdx | 4 +- .../guides/database/managing-passwords.mdx | 2 +- apps/docs/pages/guides/database/overview.mdx | 2 +- .../dropping-all-tables-in-schema.mdx | 2 +- .../database/postgres/first-row-in-group.mdx | 2 +- .../guides/database/postgres/indexes.mdx | 2 +- .../postgres/which-version-of-postgres.mdx | 2 +- .../pages/guides/database/replication.mdx | 4 +- apps/docs/pages/guides/database/tables.mdx | 2 +- apps/docs/pages/guides/database/webhooks.mdx | 2 +- .../docs/pages/guides/functions/debugging.mdx | 2 +- .../guides/functions/kysely-postgres.mdx | 2 +- .../guides/functions/troubleshooting.mdx | 4 +- .../getting-started/local-development.mdx | 6 +- .../getting-started/quickstarts/flutter.mdx | 6 +- .../getting-started/quickstarts/nextjs.mdx | 6 +- .../getting-started/quickstarts/nuxtjs.mdx | 6 +- .../getting-started/quickstarts/reactjs.mdx | 6 +- .../getting-started/quickstarts/redwoodjs.mdx | 4 +- .../getting-started/quickstarts/solidjs.mdx | 6 +- .../getting-started/quickstarts/sveltekit.mdx | 6 +- .../getting-started/quickstarts/vue.mdx | 6 +- .../tutorials/with-flutter.mdx | 2 +- .../pages/guides/integrations/appsmith.mdx | 2 +- apps/docs/pages/guides/integrations/auth0.mdx | 6 +- .../pages/guides/integrations/authsignal.mdx | 2 +- .../integrations/cloudflare-workers.mdx | 4 +- apps/docs/pages/guides/integrations/fezto.mdx | 2 +- .../pages/guides/integrations/forestadmin.mdx | 2 +- apps/docs/pages/guides/integrations/illa.mdx | 4 +- .../pages/guides/integrations/passage.mdx | 4 +- .../docs/pages/guides/integrations/picket.mdx | 4 +- .../pages/guides/integrations/plasmic.mdx | 2 +- .../pages/guides/integrations/snaplet.mdx | 2 +- .../docs/pages/guides/integrations/stytch.mdx | 4 +- .../pages/guides/integrations/supertokens.mdx | 4 +- .../docs/pages/guides/integrations/vercel.mdx | 2 +- apps/docs/pages/guides/platform.mdx | 2 +- .../pages/guides/platform/access-control.mdx | 4 +- apps/docs/pages/guides/platform/backups.mdx | 4 +- .../pages/guides/platform/compute-add-ons.mdx | 4 +- .../pages/guides/platform/custom-domains.mdx | 6 +- .../pages/guides/platform/database-size.mdx | 14 +- .../pages/guides/platform/going-into-prod.mdx | 10 +- apps/docs/pages/guides/platform/logs.mdx | 20 +- .../migrating-and-upgrading-projects.mdx | 12 +- .../guides/platform/network-restrictions.mdx | 2 +- .../pages/guides/platform/performance.mdx | 4 +- .../platform/shared-responsibility-model.mdx | 2 +- apps/docs/pages/guides/platform/spend-cap.mdx | 6 +- .../pages/guides/platform/ssl-enforcement.mdx | 2 +- apps/docs/pages/guides/platform/sso/azure.mdx | 10 +- .../docs/pages/guides/platform/sso/gsuite.mdx | 4 +- apps/docs/pages/guides/platform/sso/okta.mdx | 20 +- .../pages/guides/platform/troubleshooting.mdx | 16 +- .../realtime/bring-your-own-database.mdx | 2 +- .../guides/realtime/postgres-changes.mdx | 4 +- .../docs/pages/guides/realtime/quickstart.mdx | 2 +- apps/docs/pages/guides/realtime/quotas.mdx | 6 +- .../migrating-to-supabase/amazon-rds.mdx | 8 +- .../migrating-to-supabase/firebase-auth.mdx | 2 +- .../firebase-storage.mdx | 4 +- .../migrating-to-supabase/firestore-data.mdx | 2 +- .../migrating-to-supabase/heroku.mdx | 6 +- .../migrating-to-supabase/render.mdx | 8 +- apps/docs/pages/guides/self-hosting.mdx | 2 +- apps/docs/pages/guides/storage/cdn.mdx | 2 +- apps/docs/pages/guides/storage/quickstart.mdx | 8 +- .../auth-deep-dive/auth-deep-dive-jwts.mdx | 2 +- .../auth-deep-dive/auth-google-oauth.mdx | 2 +- .../learn/auth-deep-dive/auth-gotrue.mdx | 2 +- .../learn/auth-deep-dive/auth-policies.mdx | 4 +- .../auth-row-level-security.mdx | 2 +- .../_alternatives/supabase-vs-firebase.mdx | 2 +- .../2020-05-01-supabase-alpha-april-2020.mdx | 4 +- .../2020-06-01-supabase-alpha-may-2020.mdx | 2 +- .../2020-07-01-supabase-alpha-june-2020.mdx | 2 +- .../2020-07-10-alpha-launch-postmortem.mdx | 2 +- .../2020-08-02-supabase-alpha-july-2020.mdx | 2 +- apps/www/_blog/2020-08-05-supabase-auth.mdx | 2 +- .../2020-09-03-supabase-alpha-august-2020.mdx | 2 +- ...20-10-03-supabase-alpha-september-2020.mdx | 2 +- apps/www/_blog/2020-10-30-improved-dx.mdx | 2 +- ...2020-11-02-supabase-alpha-october-2020.mdx | 2 +- ...020-12-01-supabase-alpha-november-2020.mdx | 2 +- ...2021-01-02-supabase-beta-december-2020.mdx | 2 +- .../2021-02-02-supabase-beta-january-2021.mdx | 2 +- ...2021-02-27-cracking-postgres-interview.mdx | 2 +- ...2021-03-02-supabase-beta-february-2021.mdx | 2 +- .../2021-03-05-postgres-as-a-cron-server.mdx | 2 +- .../2021-03-11-using-supabase-replit.mdx | 2 +- apps/www/_blog/2021-03-29-pricing.mdx | 2 +- .../www/_blog/2021-03-30-supabase-storage.mdx | 2 +- apps/www/_blog/2021-03-31-supabase-cli.mdx | 2 +- .../_blog/2021-04-02-supabase-pgbouncer.mdx | 2 +- .../2021-04-06-supabase-beta-march-2021.mdx | 2 +- .../2021-05-03-supabase-beta-april-2021.mdx | 4 +- .../2021-06-02-supabase-beta-may-2021.mdx | 2 +- .../2021-07-02-supabase-beta-june-2021.mdx | 2 +- .../_blog/2021-07-26-supabase-postgres-13.mdx | 2 +- apps/www/_blog/2021-07-27-storage-beta.mdx | 2 +- ...8-supabase-auth-passwordless-sms-login.mdx | 2 +- ...021-07-29-supabase-reports-and-metrics.mdx | 2 +- .../2021-07-30-supabase-functions-updates.mdx | 2 +- .../2021-08-12-supabase-beta-july-2021.mdx | 2 +- .../2021-09-10-supabase-beta-august-2021.mdx | 2 +- .../2021-10-04-supabase-beta-sept-2021.mdx | 2 +- ...sh-time-to-value-in-less-than-24-hours.mdx | 2 +- .../_blog/2021-10-28-supabase-series-a.mdx | 2 +- .../2021-11-05-supabase-beta-october-2021.mdx | 2 +- .../2021-11-26-supabase-how-we-launch.mdx | 2 +- .../2021-11-28-whats-new-in-postgres-14.mdx | 2 +- ...5-beta-november-2021-launch-week-recap.mdx | 2 +- ...2022-01-20-supabase-beta-december-2021.mdx | 6 +- .../2022-02-22-supabase-beta-january-2022.mdx | 2 +- .../2022-03-29-graphql-now-available.mdx | 2 +- .../_blog/2022-03-30-supabase-enterprise.mdx | 2 +- .../2022-04-15-beta-update-march-2022.mdx | 2 +- .../_blog/2022-06-07-beta-update-may-2022.mdx | 6 +- ...022-06-15-loading-data-supabase-python.mdx | 2 +- ...sualizing-supabase-data-using-metabase.mdx | 4 +- ...0-flutter-tutorial-building-a-chat-app.mdx | 2 +- .../2022-07-05-beta-update-june-2022.mdx | 2 +- ...2-08-03-supabase-beta-update-july-2022.mdx | 4 +- ...idate-slackbot-to-consolidate-messages.mdx | 6 +- ...-15-supabase-cli-v1-and-admin-api-beta.mdx | 4 +- ...ltime-multiplayer-general-availability.mdx | 2 +- apps/www/_blog/2022-08-19-supabase-vault.mdx | 2 +- ...trello-board-with-supabase-and-angular.mdx | 2 +- ...09-07-supabase-beta-update-august-2022.mdx | 2 +- ...05-supabase-beta-update-september-2022.mdx | 2 +- ...1-02-supabase-beta-update-october-2022.mdx | 2 +- ...base-data-in-next-js-server-components.mdx | 8 +- .../_blog/2022-12-16-custom-domain-names.mdx | 2 +- ...2022-12-16-launch-week-6-community-day.mdx | 2 +- ...-12-16-postgres-point-in-time-recovery.mdx | 4 +- .../_blog/2022-12-16-vault-now-in-beta.mdx | 4 +- ...-09-supabase-beta-update-february-2023.mdx | 10 +- .../2023-04-13-supabase-auth-sso-pkce.mdx | 2 +- apps/www/_customers/mobbin.mdx | 2 +- apps/www/_customers/replenysh.mdx | 2 +- apps/www/components/Hero/Hero.tsx | 6 +- apps/www/pages/support-policy.mdx | 2 +- examples/ai/image_search/README.md | 2 +- examples/ai/llamaindex/llamaindex.ipynb | 372 +++++++++--------- examples/ai/vector_hello_world.ipynb | 2 +- examples/edge-functions/README.md | 4 +- .../huggingface-image-captioning/README.md | 6 +- .../slack-clone/nextjs-slack-clone/README.md | 8 +- examples/todo-list/nextjs-todo-list/README.md | 4 +- .../todo-list/sveltejs-todo-list/README.md | 4 +- .../angular-user-management/README.md | 2 +- .../expo-user-management/README.md | 84 ++-- .../nextjs-user-management/README.md | 4 +- .../react-user-management/README.md | 88 +++-- .../solid-user-management/README.md | 84 ++-- .../svelte-user-management/README.md | 84 ++-- .../sveltekit-user-management/README.md | 2 +- i18n/README.ar.md | 4 +- i18n/README.bg.md | 4 +- i18n/README.bn.md | 4 +- i18n/README.ca.md | 4 +- i18n/README.cs.md | 4 +- i18n/README.da.md | 4 +- i18n/README.de.md | 4 +- i18n/README.el.md | 4 +- i18n/README.es.md | 4 +- i18n/README.et.md | 4 +- i18n/README.fa.md | 4 +- i18n/README.fi.md | 4 +- i18n/README.fr.md | 4 +- i18n/README.gr.md | 4 +- i18n/README.gu.md | 4 +- i18n/README.he.md | 4 +- i18n/README.hi.md | 4 +- i18n/README.hu.md | 4 +- i18n/README.id.md | 4 +- i18n/README.it.md | 4 +- i18n/README.ja.md | 4 +- i18n/README.jp.md | 4 +- i18n/README.ko.md | 4 +- i18n/README.lt.md | 4 +- i18n/README.lv.md | 4 +- i18n/README.ms.md | 4 +- i18n/README.nb-no.md | 4 +- i18n/README.nb.md | 4 +- i18n/README.ne.md | 4 +- i18n/README.nl.md | 4 +- i18n/README.pl.md | 4 +- i18n/README.pt-PT.md | 4 +- i18n/README.pt-br.md | 4 +- i18n/README.pt.md | 4 +- i18n/README.ro.md | 4 +- i18n/README.ru.md | 4 +- i18n/README.si.md | 4 +- i18n/README.sk.md | 4 +- i18n/README.sl.md | 4 +- i18n/README.sq.md | 4 +- i18n/README.sr.md | 4 +- i18n/README.sv.md | 4 +- i18n/README.ta.md | 4 +- i18n/README.th.md | 4 +- i18n/README.tr.md | 4 +- i18n/README.uk.md | 4 +- i18n/README.vi-vn.md | 4 +- i18n/README.zh-cn.md | 4 +- i18n/README.zh-tw.md | 4 +- spec/examples/examples.yml | 2 +- spec/supabase_csharp_v0.yml | 2 +- spec/supabase_dart_v0.yml | 8 +- spec/supabase_dart_v1.yml | 2 +- spec/supabase_js_v1.yml | 8 +- spec/supabase_js_v2.yml | 2 +- spec/supabase_kt_v0.yml | 2 +- spec/supabase_py_v2.yml | 2 +- 301 files changed, 933 insertions(+), 850 deletions(-) diff --git a/DEVELOPERS.md b/DEVELOPERS.md index 1a4e1a1e27c..26618c6f400 100644 --- a/DEVELOPERS.md +++ b/DEVELOPERS.md @@ -69,11 +69,11 @@ To contribute code to [Supabase](https://supabase.com), you must fork the [Supab Then visit, and edit, any of the following sites: -| Site | Directory | Scope name | Description | Local development server | -| ---------------------------------------------- | ------------ | ---------- | ------------------------------------ | -------------------------- | -| [supabase.com](https://supabase.com) | `/apps/www` | www | The main website | http://localhost:3000 | -| [app.supabase.com](https://app.supabase.com) | `/studio` | studio | Studio dashboard | http://localhost:8082 | -| [supabase.com/docs](https://supabase.com/docs) | `/apps/docs` | docs | Guides and Reference (Next.js based) | http://localhost:3001/docs | +| Site | Directory | Scope name | Description | Local development server | +| -------------------------------------------------------- | ------------ | ---------- | ------------------------------------ | -------------------------- | +| [supabase.com](https://supabase.com) | `/apps/www` | www | The main website | http://localhost:3000 | +| [supabase.com/dashboard](https://supabase.com/dashboard) | `/studio` | studio | Studio dashboard | http://localhost:8082 | +| [supabase.com/docs](https://supabase.com/docs) | `/apps/docs` | docs | Guides and Reference (Next.js based) | http://localhost:3001/docs | #### Running sites individually diff --git a/README.md b/README.md index b71944fad9c..61f7e504e26 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ To see how to Contribute, visit [Getting Started](./DEVELOPERS.md) ## Status - [x] Alpha: We are testing Supabase with a closed set of customers -- [x] Public Alpha: Anyone can sign up over at [app.supabase.com](https://app.supabase.com). But go easy on us, there are a few kinks +- [x] Public Alpha: Anyone can sign up over at [supabase.com/dashboard](https://supabase.com/dashboard). But go easy on us, there are a few kinks - [x] Public Beta: Stable enough for most non-enterprise use-cases - [ ] Public: General Availability [[status](https://supabase.com/docs/guides/getting-started/features#feature-status)] @@ -56,7 +56,7 @@ Supabase is a combination of open source tools. We’re building the features of **Architecture** -Supabase is a [hosted platform](https://app.supabase.com). You can sign up and start using Supabase without installing anything. +Supabase is a [hosted platform](https://supabase.com/dashboard). You can sign up and start using Supabase without installing anything. You can also [self-host](https://supabase.com/docs/guides/hosting/overview) and [develop locally](https://supabase.com/docs/guides/local-development). ![Architecture](https://github.com/supabase/supabase/blob/master/apps/docs/public/img/supabase-architecture.png) @@ -260,4 +260,3 @@ Our approach for client libraries is modular. Each sub-library is a standalone i - [Ukrainian / Українська](/i18n/README.uk.md) - [Vietnamese / Tiếng Việt](/i18n/README.vi-vn.md) - [List of translations](/i18n/languages.md) - diff --git a/apps/docs/components/MDX/database_setup.mdx b/apps/docs/components/MDX/database_setup.mdx index 2a6e853f9c2..c54b9b32f84 100644 --- a/apps/docs/components/MDX/database_setup.mdx +++ b/apps/docs/components/MDX/database_setup.mdx @@ -12,7 +12,7 @@ Your database will be available in less than a minute. **Finding your credentials:** -You can find your project credentials inside the project [settings](https://app.supabase.com/project/_/settings/), including: +You can find your project credentials inside the project [settings](https://supabase.com/dashboard/project/_/settings/), including: -- [Database credentials](https://app.supabase.com/project/_/settings/database): connection strings and connection pooler details. -- [API credentials](https://app.supabase.com/project/_/settings/database): your serverless API URL and `anon` / `service_role` keys. +- [Database credentials](https://supabase.com/dashboard/project/_/settings/database): connection strings and connection pooler details. +- [API credentials](https://supabase.com/dashboard/project/_/settings/database): your serverless API URL and `anon` / `service_role` keys. diff --git a/apps/docs/components/MDX/project_setup.mdx b/apps/docs/components/MDX/project_setup.mdx index 2003a3a2220..d7b095e1288 100644 --- a/apps/docs/components/MDX/project_setup.mdx +++ b/apps/docs/components/MDX/project_setup.mdx @@ -8,7 +8,7 @@ Before we start building we're going to set up our Database and API. This is as ### Create a project -1. [Create a new project](https://app.supabase.com) in the Supabase Dashboard. +1. [Create a new project](https://supabase.com/dashboard) in the Supabase Dashboard. 1. Enter your project details. 1. Wait for the new database to launch. @@ -24,7 +24,7 @@ Now we are going to set up the database schema. We can use the "User Management > -1. Go to the [SQL Editor](https://app.supabase.com/project/_/sql) page in the Dashboard. +1. Go to the [SQL Editor](https://supabase.com/dashboard/project/_/sql) page in the Dashboard. 2. Click **User Management Starter**. 3. Click **Run**. @@ -41,5 +41,5 @@ Now we are going to set up the database schema. We can use the "User Management Now that you've created some database tables, you are ready to insert data using the auto-generated API. We just need to get the Project URL and `anon` key from the API settings. -1. Go to the [API Settings](https://app.supabase.com/project/_/settings/api) page in the Dashboard. +1. Go to the [API Settings](https://supabase.com/dashboard/project/_/settings/api) page in the Dashboard. 1. Find your Project `URL`, `anon`, and `service_role` keys on this page. diff --git a/apps/docs/components/MDX/social_provider_settings_supabase.mdx b/apps/docs/components/MDX/social_provider_settings_supabase.mdx index 38e0d9e5bfe..394673df620 100644 --- a/apps/docs/components/MDX/social_provider_settings_supabase.mdx +++ b/apps/docs/components/MDX/social_provider_settings_supabase.mdx @@ -1,6 +1,6 @@ -- Go to your [Supabase Project Dashboard](https://app.supabase.com) +- Go to your [Supabase Project Dashboard](https://supabase.com/dashboard) - In the left sidebar, click the `Authentication` icon (near the top) -- Click on [`Providers`](https://app.supabase.com/project/_/auth/providers) under the Configuration section +- Click on [`Providers`](https://supabase.com/dashboard/project/_/auth/providers) under the Configuration section - Click on **{props.provider}** from the accordion list to expand and turn **{props.provider} Enabled** to ON - Enter your **{props.provider} Client ID** and **{props.provider} Client Secret** saved in the previous step - Click `Save` diff --git a/apps/docs/components/MDX/social_provider_setup.mdx b/apps/docs/components/MDX/social_provider_setup.mdx index 4e32c3bf401..e6c1fe7e6dc 100644 --- a/apps/docs/components/MDX/social_provider_setup.mdx +++ b/apps/docs/components/MDX/social_provider_setup.mdx @@ -2,7 +2,7 @@ The next step requires a callback URL, which looks like this: `https://.supabase.co/auth/v1/callback` -- Go to your [Supabase Project Dashboard](https://app.supabase.com) +- Go to your [Supabase Project Dashboard](https://supabase.com/dashboard) - Click on the `Authentication` icon in the left sidebar -- Click on [`Providers`](https://app.supabase.com/project/_/auth/providers) under the Configuration section +- Click on [`Providers`](https://supabase.com/dashboard/project/_/auth/providers) under the Configuration section - Click on **{props.provider}** from the accordion list to expand and you'll find your **Redirect URL**, you can click `Copy` to copy it to the clipboard diff --git a/apps/docs/components/MDX/storage_management.mdx b/apps/docs/components/MDX/storage_management.mdx index e8f0184b88e..ce28a1684c8 100644 --- a/apps/docs/components/MDX/storage_management.mdx +++ b/apps/docs/components/MDX/storage_management.mdx @@ -7,7 +7,7 @@ triggers. Note that it is not sufficient to delete the objects from the `storage.objects` table because that would orphan and leak the actual storage objects in the S3 backend. Instead, invoke the storage API within Postgres via the `http` extension. -Enable the [http extension for the `extensions` schema](https://app.supabase.com/project/_/database/extensions) in the Dashboard. +Enable the [http extension for the `extensions` schema](https://supabase.com/dashboard/project/_/database/extensions) in the Dashboard. Then, define the following SQL functions in the SQL Editor to delete storage objects via the API: diff --git a/apps/docs/docs/ref/api/api.mdx b/apps/docs/docs/ref/api/api.mdx index 371041af0bd..70bb75ee9f6 100644 --- a/apps/docs/docs/ref/api/api.mdx +++ b/apps/docs/docs/ref/api/api.mdx @@ -15,7 +15,7 @@ The Management API is in `beta`. It is usable in it's current state, but it's li ## Authentication All API requests require a Supabase Personal token to be included in the Authorization header: `Authorization Bearer `API Settings` > `Exposed schemas` +6. Expose `docs` schema via API in Supabase Dashboard [settings](https://supabase.com/dashboard/project/_/settings/api) > `API Settings` > `Exposed schemas` ### Ingest your documentation diff --git a/apps/docs/pages/guides/ai/examples/huggingface-image-captioning.mdx b/apps/docs/pages/guides/ai/examples/huggingface-image-captioning.mdx index 1f891655d85..163422ee325 100644 --- a/apps/docs/pages/guides/ai/examples/huggingface-image-captioning.mdx +++ b/apps/docs/pages/guides/ai/examples/huggingface-image-captioning.mdx @@ -20,15 +20,15 @@ We can combine Hugging Face with [Supabase Storage](https://supabase.com/storage ## Setup -- Open your Supabase project dashboard or [create a new project](https://app.supabase.com/projects). -- [Create a new bucket](https://app.supabase.com/project/_/storage/buckets) called `images`. +- Open your Supabase project dashboard or [create a new project](https://supabase.com/dashboard/projects). +- [Create a new bucket](https://supabase.com/dashboard/project/_/storage/buckets) called `images`. - Generate TypeScript types from remote Database. - Create a new Database table called `image_caption`. - Create `id` column of type `uuid` which references `storage.objects.id`. - Create a `caption` column of type `text`. - Regenerate TypeScript types to include new `image_caption` table. - Deploy the function to Supabase: `supabase functions deploy huggingface-image-captioning`. -- Create the Database Webhook in the [Supabase Dashboard](https://app.supabase.com/project/_/database/hooks) to trigger the `huggingface-image-captioning` function anytime a record is added to the `storage.objects` table. +- Create the Database Webhook in the [Supabase Dashboard](https://supabase.com/dashboard/project/_/database/hooks) to trigger the `huggingface-image-captioning` function anytime a record is added to the `storage.objects` table. ## Generate TypeScript Types diff --git a/apps/docs/pages/guides/ai/examples/nextjs-vector-search.mdx b/apps/docs/pages/guides/ai/examples/nextjs-vector-search.mdx index b340a6607b6..017eb68ec95 100644 --- a/apps/docs/pages/guides/ai/examples/nextjs-vector-search.mdx +++ b/apps/docs/pages/guides/ai/examples/nextjs-vector-search.mdx @@ -22,13 +22,13 @@ We assume that you have a Next.js project with a collection of `.mdx` files nest ## Create a project -1. [Create a new project](https://app.supabase.com) in the Supabase Dashboard. +1. [Create a new project](https://supabase.com/dashboard) in the Supabase Dashboard. 1. Enter your project details. 1. Wait for the new database to launch. ## Prepare the database -Let's prepare the database schema. We can use the "OpenAI Vector Search" quickstart in the [SQL Editor](https://app.supabase.com/project/_/sql), or you can copy/paste the SQL below and run it yourself. +Let's prepare the database schema. We can use the "OpenAI Vector Search" quickstart in the [SQL Editor](https://supabase.com/dashboard/project/_/sql), or you can copy/paste the SQL below and run it yourself. -1. Go to the [SQL Editor](https://app.supabase.com/project/_/sql) page in the Dashboard. +1. Go to the [SQL Editor](https://supabase.com/dashboard/project/_/sql) page in the Dashboard. 2. Click **OpenAI Vector Search**. 3. Click **Run**. diff --git a/apps/docs/pages/guides/ai/google-colab.mdx b/apps/docs/pages/guides/ai/google-colab.mdx index c3e02029842..d6edee7ba26 100644 --- a/apps/docs/pages/guides/ai/google-colab.mdx +++ b/apps/docs/pages/guides/ai/google-colab.mdx @@ -17,7 +17,7 @@ export const meta = { Google Colab is a hosted Jupyter Notebook service. It provides free access to computing resources, including GPUs and TPUs, and is well-suited to machine learning, data science, and education. We can use Colab to manage collections using [Supabase Vecs](/docs/guides/ai/vecs-python-client). -In this tutorial we'll connect to a database running on the Supabase [platform](https://app.supabase.com/). If you don't already have a database, you can create one here: [database.new](https://database.new). +In this tutorial we'll connect to a database running on the Supabase [platform](https://supabase.com/dashboard/). If you don't already have a database, you can create one here: [database.new](https://database.new). ## Create a new notebook @@ -39,7 +39,7 @@ pip install vecs ## Connect to your database -Find the Postgres connection string for your Supabase project in the [database settings](https://app.supabase.com/_/settings/database) of the dashboard. Copy the "URI" format, which should look something like `postgresql:/postgres:@:5432/postgres` +Find the Postgres connection string for your Supabase project in the [database settings](https://supabase.com/dashboard/_/settings/database) of the dashboard. Copy the "URI" format, which should look something like `postgresql:/postgres:@:5432/postgres` Create a new code block below the install block (`ctrl+m b`) and add the following code using the Postgres URI you copied above: @@ -79,7 +79,7 @@ collection.upsert( ) ``` -This will create a table inside your database within the `vecs` schema, called `colab_collection`. You can view the inserted items in the [Table Editor](https://app.supabase.com/project/_/editor/), by selecting the `vecs` schema from the schema dropdown. +This will create a table inside your database within the `vecs` schema, called `colab_collection`. You can view the inserted items in the [Table Editor](https://supabase.com/dashboard/project/_/editor/), by selecting the `vecs` schema from the schema dropdown. ![Colab documents](/docs/img/ai/google-colab/colab-documents.png) diff --git a/apps/docs/pages/guides/ai/integrations/llamaindex.mdx b/apps/docs/pages/guides/ai/integrations/llamaindex.mdx index 59db32b9cd3..b1aa7f80b2a 100644 --- a/apps/docs/pages/guides/ai/integrations/llamaindex.mdx +++ b/apps/docs/pages/guides/ai/integrations/llamaindex.mdx @@ -52,7 +52,7 @@ Replace the `DB_CONNECTION` with your own connection string for your database, w Now all that's left is to step through the notebook. You can do this by clicking the "execute" button (`ctrl+enter`) at the top left of each code cell. The notebook guides you through the process of creating a collection, adding data to it, and querying it. -You can view the inserted items in the [Table Editor](https://app.supabase.com/project/_/editor/), by selecting the `vecs` schema from the schema dropdown. +You can view the inserted items in the [Table Editor](https://supabase.com/dashboard/project/_/editor/), by selecting the `vecs` schema from the schema dropdown. ![Colab documents](/docs/img/ai/google-colab/colab-documents.png) diff --git a/apps/docs/pages/guides/ai/quickstarts/face-similarity.mdx b/apps/docs/pages/guides/ai/quickstarts/face-similarity.mdx index 6996f4c1046..160ed479b6d 100644 --- a/apps/docs/pages/guides/ai/quickstarts/face-similarity.mdx +++ b/apps/docs/pages/guides/ai/quickstarts/face-similarity.mdx @@ -49,7 +49,7 @@ Replace the `DB_CONNECTION` with your own connection string for your database, w Now all that's left is to step through the notebook. You can do this by clicking the "execute" button (`ctrl+enter`) at the top left of each code cell. The notebook guides you through the process of creating a collection, adding data to it, and querying it. -You can view the inserted items in the [Table Editor](https://app.supabase.com/project/_/editor/), by selecting the `vecs` schema from the schema dropdown. +You can view the inserted items in the [Table Editor](https://supabase.com/dashboard/project/_/editor/), by selecting the `vecs` schema from the schema dropdown. ![Colab documents](/docs/img/ai/google-colab/colab-documents.png) diff --git a/apps/docs/pages/guides/ai/quickstarts/hello-world.mdx b/apps/docs/pages/guides/ai/quickstarts/hello-world.mdx index 7b678dc1d20..d612ed23d86 100644 --- a/apps/docs/pages/guides/ai/quickstarts/hello-world.mdx +++ b/apps/docs/pages/guides/ai/quickstarts/hello-world.mdx @@ -49,7 +49,7 @@ Replace the `DB_CONNECTION` with your own connection string for your database, w Now all that's left is to step through the notebook. You can do this by clicking the "execute" button (`ctrl+enter`) at the top left of each code cell. The notebook guides you through the process of creating a collection, adding data to it, and querying it. -You can view the inserted items in the [Table Editor](https://app.supabase.com/project/_/editor/), by selecting the `vecs` schema from the schema dropdown. +You can view the inserted items in the [Table Editor](https://supabase.com/dashboard/project/_/editor/), by selecting the `vecs` schema from the schema dropdown. ![Colab documents](/docs/img/ai/google-colab/colab-documents.png) diff --git a/apps/docs/pages/guides/ai/quickstarts/text-deduplication.mdx b/apps/docs/pages/guides/ai/quickstarts/text-deduplication.mdx index 8d20cf9cca4..d15cbbd1289 100644 --- a/apps/docs/pages/guides/ai/quickstarts/text-deduplication.mdx +++ b/apps/docs/pages/guides/ai/quickstarts/text-deduplication.mdx @@ -50,7 +50,7 @@ Replace the `DB_CONNECTION` with your own connection string for your database, w Now all that's left is to step through the notebook. You can do this by clicking the "execute" button (`ctrl+enter`) at the top left of each code cell. The notebook guides you through the process of creating a collection, adding data to it, and querying it. -You can view the inserted items in the [Table Editor](https://app.supabase.com/project/_/editor/), by selecting the `vecs` schema from the schema dropdown. +You can view the inserted items in the [Table Editor](https://supabase.com/dashboard/project/_/editor/), by selecting the `vecs` schema from the schema dropdown. ![Colab documents](/docs/img/ai/google-colab/colab-documents.png) diff --git a/apps/docs/pages/guides/ai/vector-columns.mdx b/apps/docs/pages/guides/ai/vector-columns.mdx index d941c164302..7c768606e0b 100644 --- a/apps/docs/pages/guides/ai/vector-columns.mdx +++ b/apps/docs/pages/guides/ai/vector-columns.mdx @@ -23,7 +23,7 @@ Vectors in Supabase are enabled via [pgvector](https://github.com/pgvector/pgvec > -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click on **Extensions** in the sidebar. 3. Search for "vector" and enable the extension. diff --git a/apps/docs/pages/guides/api.mdx b/apps/docs/pages/guides/api.mdx index 7ca9052585d..5ac4bc65ba3 100644 --- a/apps/docs/pages/guides/api.mdx +++ b/apps/docs/pages/guides/api.mdx @@ -50,7 +50,7 @@ Reference: ## GraphQL API [#graphql-api-overview] Supabase uses [pg_graphql](https://supabase.github.io/pg_graphql/) to expose a GraphQL API endpoint at `https://.supabase.co/graphql/v1/`. -You can introspect and query the GraphQL API of an existing Supabase project within Studio [here](https://app.supabase.com/project/_/api/graphiql), +You can introspect and query the GraphQL API of an existing Supabase project within Studio [here](https://supabase.com/dashboard/project/_/api/graphiql), or navigate there manually at `API Docs > GraphQL > GraphiQL`. The GraphQL interface is automatically reflected from your database's schema and supports: @@ -72,11 +72,11 @@ Reference: Supabase provides a Realtime API using [Realtime](https://github.com/supabase/realtime). You can use this to listen to database changes over websockets. Realtime leverages PostgreSQL's built-in logical replication. You can manage your Realtime API simply by managing Postgres publications. -Go to your project's [Replication section](https://app.supabase.com/project/_/database/replication) to get started. +Go to your project's [Replication section](https://supabase.com/dashboard/project/_/database/replication) to get started. ## API URL and Keys -You can find the API URL and Keys in the [Dashboard](https://app.supabase.com/project/_/settings/api). +You can find the API URL and Keys in the [Dashboard](https://supabase.com/dashboard/project/_/settings/api). -> Ensure you have [enabled replication](https://app.supabase.com/project/_/database/replication) on the table you are subscribing to. +> Ensure you have [enabled replication](https://supabase.com/dashboard/project/_/database/replication) on the table you are subscribing to. ## Migration Guide diff --git a/apps/docs/pages/guides/auth/auth-helpers/sveltekit.mdx b/apps/docs/pages/guides/auth/auth-helpers/sveltekit.mdx index 8137d96df44..a9d4a883784 100644 --- a/apps/docs/pages/guides/auth/auth-helpers/sveltekit.mdx +++ b/apps/docs/pages/guides/auth/auth-helpers/sveltekit.mdx @@ -21,10 +21,10 @@ npm install @supabase/auth-helpers-sveltekit ### Declare Environment Variables -Retrieve your project's URL and anon key from your [API settings](https://app.supabase.com/project/_/settings/api), and create a `.env.local` file with the following environment variables: +Retrieve your project's URL and anon key from your [API settings](https://supabase.com/dashboard/project/_/settings/api), and create a `.env.local` file with the following environment variables: ```bash .env.local -# Find these in your Supabase project settings https://app.supabase.com/project/_/settings/api +# Find these in your Supabase project settings https://supabase.com/dashboard/project/_/settings/api PUBLIC_SUPABASE_URL=https://your-project.supabase.co PUBLIC_SUPABASE_ANON_KEY=your-anon-key ``` diff --git a/apps/docs/pages/guides/auth/auth-magic-link.mdx b/apps/docs/pages/guides/auth/auth-magic-link.mdx index 89d960b7235..a47794fed45 100644 --- a/apps/docs/pages/guides/auth/auth-magic-link.mdx +++ b/apps/docs/pages/guides/auth/auth-magic-link.mdx @@ -17,8 +17,8 @@ Setting up Magic Link logins for your Supabase application. ## Add Magic Link into your Supabase Project -1. For [Site URL](https://app.supabase.com/project/_/auth/url-configuration), enter the final (hosted) URL of your app. -1. For [Auth Providers](https://app.supabase.com/project/_/auth/providers), **enable email provider**. +1. For [Site URL](https://supabase.com/dashboard/project/_/auth/url-configuration), enter the final (hosted) URL of your app. +1. For [Auth Providers](https://supabase.com/dashboard/project/_/auth/providers), **enable email provider**. ## Add login code to your client app diff --git a/apps/docs/pages/guides/auth/auth-password-reset.mdx b/apps/docs/pages/guides/auth/auth-password-reset.mdx index c4ecc97d2b7..1b81df20c2a 100644 --- a/apps/docs/pages/guides/auth/auth-password-reset.mdx +++ b/apps/docs/pages/guides/auth/auth-password-reset.mdx @@ -17,8 +17,8 @@ export const meta = { Supabase provides a convenient method [`.resetPasswordForEmail`](/docs/reference/javascript/auth-resetpasswordforemail) to reset a user password. This method takes a parameter of `redirectTo` which we will use to pass an absolute URL to the update password page. This URL must be saved in your -allowed [Redirect URLs](https://app.supabase.com/project/_/auth/url-configuration) list found at -[Authentication > Redirect Configuration](https://app.supabase.com/project/_/auth/url-configuration) or it won't +allowed [Redirect URLs](https://supabase.com/dashboard/project/_/auth/url-configuration) list found at +[Authentication > Redirect Configuration](https://supabase.com/dashboard/project/_/auth/url-configuration) or it won't redirect the user. ```ts @@ -45,8 +45,8 @@ await supabase.auth.updateUser({ password: new_password }) Supabase provides a convenient method [`.resetPasswordForEmail`](/docs/reference/javascript/auth-resetpasswordforemail) to reset a user password. This method takes a parameter of `redirectTo` which we will use to pass an absolute URL to the callback page along with a query parameter to the update password page. This URL must be saved in your -allowed [Redirect URLs](https://app.supabase.com/project/_/auth/url-configuration) list found at -[Authentication > Redirect Configuration](https://app.supabase.com/project/_/auth/url-configuration) or it won't +allowed [Redirect URLs](https://supabase.com/dashboard/project/_/auth/url-configuration) list found at +[Authentication > Redirect Configuration](https://supabase.com/dashboard/project/_/auth/url-configuration) or it won't redirect the user. ```ts diff --git a/apps/docs/pages/guides/auth/phone-login/messagebird.mdx b/apps/docs/pages/guides/auth/phone-login/messagebird.mdx index 38651a9876d..273b4870944 100644 --- a/apps/docs/pages/guides/auth/phone-login/messagebird.mdx +++ b/apps/docs/pages/guides/auth/phone-login/messagebird.mdx @@ -24,7 +24,7 @@ We'll cover: What you'll need: - A MessageBird account (sign up here: https://dashboard.messagebird.com/en/sign-up) -- A Supabase project (create one here: https://app.supabase.com) +- A Supabase project (create one here: https://supabase.com/dashboard) - A mobile phone capable of receiving SMS ## Steps @@ -49,7 +49,7 @@ You will need the following values to get started: - Live API Key / Test API Key - MessageBird originator -Now go to the Auth > Settings page in the Supabase dashboard (https://app.supabase.com/project/YOUR-PROJECT-REF/auth/settings). +Now go to the Auth > Settings page in the Supabase dashboard (https://supabase.com/dashboard/project/YOUR-PROJECT-REF/auth/settings). You should see an option to enable Phone Signup. @@ -68,7 +68,7 @@ Now the backend should be setup, we can proceed to add our client-side code! The SMS message sent to a phone containing an OTP code can be customized. This is useful if you need to mention a brand name or display a website address. -Go to Auth > Templates page in the Supabase dashboard (https://app.supabase.com/project/YOUR-PROJECT-REF/auth/templates). +Go to Auth > Templates page in the Supabase dashboard (https://supabase.com/dashboard/project/YOUR-PROJECT-REF/auth/templates). Use the variable `.Code` in the template to display the code. @@ -276,7 +276,7 @@ The user does not have a password therefore will need to sign in via this method ## Resources - [MessageBird Signup](https://dashboard.messagebird.com/en/sign-up) -- [Supabase Dashboard](https://app.supabase.com) +- [Supabase Dashboard](https://supabase.com/dashboard) - [Supabase Row Level Security](/docs/guides/auth#row-level-security) export const Page = ({ children }) => diff --git a/apps/docs/pages/guides/auth/phone-login/twilio.mdx b/apps/docs/pages/guides/auth/phone-login/twilio.mdx index 2b6fd7f2b18..d4bae16558c 100644 --- a/apps/docs/pages/guides/auth/phone-login/twilio.mdx +++ b/apps/docs/pages/guides/auth/phone-login/twilio.mdx @@ -25,7 +25,7 @@ We'll cover: What you'll need: - A Twilio account (sign up here: https://www.twilio.com/try-twilio) -- A Supabase project (create one here: https://app.supabase.com) +- A Supabase project (create one here: https://supabase.com/dashboard) - A mobile phone capable of receiving SMS ## Video @@ -68,7 +68,7 @@ You should now be able to see all three values you'll need to get started: ![All the credentials you'll need](/docs/img/guides/auth-twilio/6.png) -Now go to the Auth > Settings page in the Supabase dashboard (https://app.supabase.com/project/YOUR-PROJECT-REF/auth/settings). +Now go to the Auth > Settings page in the Supabase dashboard (https://supabase.com/dashboard/project/YOUR-PROJECT-REF/auth/settings). You should see an option to enable Phone Signup: @@ -86,7 +86,7 @@ Now the backend should be setup, we can proceed to add our client-side code! The SMS message sent to a phone containing an OTP code can be customized. This is useful if you need to mention a brand name or display a website address. -Go to Auth > Templates page in the Supabase dashboard (https://app.supabase.com/project/YOUR-PROJECT-REF/auth/templates). +Go to Auth > Templates page in the Supabase dashboard (https://supabase.com/dashboard/project/YOUR-PROJECT-REF/auth/templates). Use the variable `.Code` in the template to display the OTP code. Here's an example in the SMS template. @@ -350,7 +350,7 @@ let { data, error } = await supabase.auth.verifyOtp({ ## Resources - [Twilio Signup](https://www.twilio.com/try-twilio) -- [Supabase Dashboard](https://app.supabase.com) +- [Supabase Dashboard](https://supabase.com/dashboard) - [Supabase Row Level Security](/docs/guides/auth#row-level-security) export const Page = ({ children }) => diff --git a/apps/docs/pages/guides/auth/phone-login/vonage.mdx b/apps/docs/pages/guides/auth/phone-login/vonage.mdx index 5ebe1de41d0..0e6a1b86061 100644 --- a/apps/docs/pages/guides/auth/phone-login/vonage.mdx +++ b/apps/docs/pages/guides/auth/phone-login/vonage.mdx @@ -24,7 +24,7 @@ We'll cover: What you'll need: - A Vonage account (sign up here: https://dashboard.nexmo.com/sign-up) -- A Supabase project (create one here: https://app.supabase.com) +- A Supabase project (create one here: https://supabase.com/dashboard) - A mobile phone capable of receiving SMS ## Steps @@ -49,7 +49,7 @@ Select the country you want a number for. You will need a mobile phone number wi ### Configure Supabase -Now go to the Auth > Settings page in the Supabase dashboard (https://app.supabase.com/project/YOUR-PROJECT-REF/auth/settings). +Now go to the Auth > Settings page in the Supabase dashboard (https://supabase.com/dashboard/project/YOUR-PROJECT-REF/auth/settings). You should see an option to enable Phone Signup. @@ -61,7 +61,7 @@ Now the backend should be setup, we can proceed to add our client-side code! The SMS message sent to a phone containing an OTP code can be customized. This is useful if you need to mention a brand name or display a website address. -Go to Auth > Templates page in the Supabase dashboard (https://app.supabase.com/project/YOUR-PROJECT-REF/auth/templates). +Go to Auth > Templates page in the Supabase dashboard (https://supabase.com/dashboard/project/YOUR-PROJECT-REF/auth/templates). Use the variable `.Code` in the template to display the code. @@ -269,7 +269,7 @@ The user does not have a password therefore will need to sign in via this method ## Resources - [Vonage Signup](https://dashboard.nexmo.com/sign-up) -- [Supabase Dashboard](https://app.supabase.com) +- [Supabase Dashboard](https://supabase.com/dashboard) - [Supabase Row Level Security](/docs/guides/auth#row-level-security) export const Page = ({ children }) => diff --git a/apps/docs/pages/guides/auth/quickstarts/nextjs.mdx b/apps/docs/pages/guides/auth/quickstarts/nextjs.mdx index 104cf7c5b28..f57d831b083 100644 --- a/apps/docs/pages/guides/auth/quickstarts/nextjs.mdx +++ b/apps/docs/pages/guides/auth/quickstarts/nextjs.mdx @@ -12,9 +12,9 @@ export const meta = { - [Launch a new project](https://app.supabase.com) in the Supabase Dashboard. + [Launch a new project](https://supabase.com/dashboard) in the Supabase Dashboard. - Your new database has a table for storing your users. You can see that this table is currently empty by running some SQL in the [SQL Editor](https://app.supabase.com/project/_/sql). + Your new database has a table for storing your users. You can see that this table is currently empty by running some SQL in the [SQL Editor](https://supabase.com/dashboard/project/_/sql). @@ -52,7 +52,7 @@ export const meta = { - Rename `.env.local.example` to `.env.local` and populate with [your project's URL and Anon Key](https://app.supabase.com/project/_/settings/api). + Rename `.env.local.example` to `.env.local` and populate with [your project's URL and Anon Key](https://supabase.com/dashboard/project/_/settings/api). diff --git a/apps/docs/pages/guides/auth/quickstarts/react.mdx b/apps/docs/pages/guides/auth/quickstarts/react.mdx index 1ac392a873b..3dfdc081c80 100644 --- a/apps/docs/pages/guides/auth/quickstarts/react.mdx +++ b/apps/docs/pages/guides/auth/quickstarts/react.mdx @@ -12,9 +12,9 @@ export const meta = { - [Launch a new project](https://app.supabase.com) in the Supabase Dashboard. + [Launch a new project](https://supabase.com/dashboard) in the Supabase Dashboard. - Your new database has a table for storing your users. You can see that this table is currently empty by running some SQL in the [SQL Editor](https://app.supabase.com/project/_/sql). + Your new database has a table for storing your users. You can see that this table is currently empty by running some SQL in the [SQL Editor](https://supabase.com/dashboard/project/_/sql). @@ -68,7 +68,7 @@ export const meta = { - In `index.js`, create a Supabase client using your [Project URL and public API (anon) key](https://app.supabase.com/project/_/settings/api). + In `index.js`, create a Supabase client using your [Project URL and public API (anon) key](https://supabase.com/dashboard/project/_/settings/api). You can configure the Auth component to display whenever there is no session inside `supabase.auth.getSession()` diff --git a/apps/docs/pages/guides/auth/row-level-security.mdx b/apps/docs/pages/guides/auth/row-level-security.mdx index 3ae2fd0ac1d..cef4f4280e8 100644 --- a/apps/docs/pages/guides/auth/row-level-security.mdx +++ b/apps/docs/pages/guides/auth/row-level-security.mdx @@ -317,7 +317,7 @@ Initializing a client with a Service Key will not override RLS if a user token i ### Testing policies -To test policies on the database itself (i.e., from the [SQL Editor](https://app.supabase.com/project/_/sql) or from `psql`) without switching to your frontend and logging in as different users, you can utilize the following helper SQL procedures ([credits](https://github.com/supabase/supabase/issues/7311#issuecomment-1398648114)): +To test policies on the database itself (i.e., from the [SQL Editor](https://supabase.com/dashboard/project/_/sql) or from `psql`) without switching to your frontend and logging in as different users, you can utilize the following helper SQL procedures ([credits](https://github.com/supabase/supabase/issues/7311#issuecomment-1398648114)): ```sql grant anon, authenticated to postgres; diff --git a/apps/docs/pages/guides/auth/server-side-rendering.mdx b/apps/docs/pages/guides/auth/server-side-rendering.mdx index 9bcd4a75e41..362197b60ba 100644 --- a/apps/docs/pages/guides/auth/server-side-rendering.mdx +++ b/apps/docs/pages/guides/auth/server-side-rendering.mdx @@ -51,7 +51,7 @@ server redirects the user back to your single-page app. -You can configure [redirects URLs](https://app.supabase.com/project/_/auth/url-configuration) in the Supabase Dashboard. You can use [wildcard match patterns](/docs/guides/auth#redirect-urls-and-wildcards) +You can configure [redirects URLs](https://supabase.com/dashboard/project/_/auth/url-configuration) in the Supabase Dashboard. You can use [wildcard match patterns](/docs/guides/auth#redirect-urls-and-wildcards) like `*` and `**` to allow redirects to different forms of URLs. diff --git a/apps/docs/pages/guides/auth/social-login/auth-apple.mdx b/apps/docs/pages/guides/auth/social-login/auth-apple.mdx index 8f72a47a5d2..3f85b324278 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-apple.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-apple.mdx @@ -17,7 +17,7 @@ Apple OAuth consists of six broad steps: - Obtaining a `Services Id` - this will serve as the `client_id`. - Obtaining a `secret key` that will be used to get our `client_secret`. - Generating the `client_secret` using the `secret key`. -- Add your `client id` and `client secret` keys to your [Supabase Project](https://app.supabase.com). +- Add your `client id` and `client secret` keys to your [Supabase Project](https://supabase.com/dashboard). - Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js). ## Access your Apple Developer account diff --git a/apps/docs/pages/guides/auth/social-login/auth-bitbucket.mdx b/apps/docs/pages/guides/auth/social-login/auth-bitbucket.mdx index 57ae235d2bb..a1e9abf21d2 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-bitbucket.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-bitbucket.mdx @@ -13,7 +13,7 @@ To enable Bitbucket Auth for your project, you need to set up a BitBucket OAuth Setting up Bitbucket logins for your application consists of 3 parts: - Create and configure a Bitbucket OAuth Consumer on [Bitbucket](https://bitbucket.org) -- Add your Bitbucket OAuth Consumer keys to your [Supabase Project](https://app.supabase.com) +- Add your Bitbucket OAuth Consumer keys to your [Supabase Project](https://supabase.com/dashboard) - Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) ## Access your Bitbucket account diff --git a/apps/docs/pages/guides/auth/social-login/auth-discord.mdx b/apps/docs/pages/guides/auth/social-login/auth-discord.mdx index 061f93b43e2..3ee781c798f 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-discord.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-discord.mdx @@ -13,7 +13,7 @@ To enable Discord Auth for your project, you need to set up a Discord Applicatio Setting up Discord logins for your application consists of 3 parts: - Create and configure a Discord Application [Discord Developer Portal](https://discord.com/developers) -- Add your Discord OAuth Consumer keys to your [Supabase Project](https://app.supabase.com) +- Add your Discord OAuth Consumer keys to your [Supabase Project](https://supabase.com/dashboard) - Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) ## Access your Discord account diff --git a/apps/docs/pages/guides/auth/social-login/auth-facebook.mdx b/apps/docs/pages/guides/auth/social-login/auth-facebook.mdx index f5c7deac8df..d0dd5855c73 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-facebook.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-facebook.mdx @@ -13,7 +13,7 @@ To enable Facebook Auth for your project, you need to set up a Facebook OAuth ap Setting up Facebook logins for your application consists of 3 parts: - Create and configure a Facebook Application on the [Facebook Developers Site](https://developers.facebook.com) -- Add your Facebook keys to your [Supabase Project](https://app.supabase.com) +- Add your Facebook keys to your [Supabase Project](https://supabase.com/dashboard) - Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) ## Access your Facebook Developer account diff --git a/apps/docs/pages/guides/auth/social-login/auth-github.mdx b/apps/docs/pages/guides/auth/social-login/auth-github.mdx index 5ba9d43c440..87236125962 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-github.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-github.mdx @@ -13,7 +13,7 @@ To enable GitHub Auth for your project, you need to set up a GitHub OAuth applic Setting up GitHub logins for your application consists of 3 parts: - Create and configure a GitHub OAuth App on [GitHub](https://github.com) -- Add your GitHub OAuth keys to your [Supabase Project](https://app.supabase.com) +- Add your GitHub OAuth keys to your [Supabase Project](https://supabase.com/dashboard) - Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) ## Access your GitHub account diff --git a/apps/docs/pages/guides/auth/social-login/auth-gitlab.mdx b/apps/docs/pages/guides/auth/social-login/auth-gitlab.mdx index 8934a57b5db..5d4801f4c41 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-gitlab.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-gitlab.mdx @@ -13,7 +13,7 @@ To enable GitLab Auth for your project, you need to set up a GitLab OAuth applic Setting up GitLab logins for your application consists of 3 parts: - Create and configure a GitLab Application on [GitLab](https://gitlab.com) -- Add your GitLab Application keys to your [Supabase Project](https://app.supabase.com) +- Add your GitLab Application keys to your [Supabase Project](https://supabase.com/dashboard) - Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) ## Access your GitLab account diff --git a/apps/docs/pages/guides/auth/social-login/auth-google.mdx b/apps/docs/pages/guides/auth/social-login/auth-google.mdx index ef5d4ccffb0..7b73157b460 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-google.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-google.mdx @@ -13,7 +13,7 @@ To enable Google Auth for your project, you need to set up a Google OAuth applic Setting up Google logins for your application consists of 3 parts: - Create and configure a Google Project on the [Google Cloud Platform Console](https://console.cloud.google.com/home/dashboard) -- Add your Google OAuth keys to your [Supabase Project](https://app.supabase.com) +- Add your Google OAuth keys to your [Supabase Project](https://supabase.com/dashboard) - Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) ## Access your Google Cloud Platform account diff --git a/apps/docs/pages/guides/auth/social-login/auth-linkedin.mdx b/apps/docs/pages/guides/auth/social-login/auth-linkedin.mdx index 30dc5a41d73..d81b1f7ad79 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-linkedin.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-linkedin.mdx @@ -13,7 +13,7 @@ To enable LinkedIn Auth for your project, you need to set up a LinkedIn OAuth ap Setting up LinkedIn logins for your application consists of 3 parts: - Create and configure a LinkedIn Project and App on the [LinkedIn Developer Dashboard](https://www.linkedin.com/developers/apps). -- Add your LinkedIn `client_id` and `client_secret` to your [Supabase Project](https://app.supabase.com). +- Add your LinkedIn `client_id` and `client_secret` to your [Supabase Project](https://supabase.com/dashboard). - Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js). ## Access your LinkedIn Developer account diff --git a/apps/docs/pages/guides/auth/social-login/auth-notion.mdx b/apps/docs/pages/guides/auth/social-login/auth-notion.mdx index fcdecce78ee..df59c508485 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-notion.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-notion.mdx @@ -13,7 +13,7 @@ To enable Notion Auth for your project, you need to set up a Notion Application Setting up Notion logins for your application consists of 3 parts: - Create and configure a Notion Application [Notion Developer Portal](https://www.notion.so/my-integrations) -- Retrieve your OAuth client ID and OAuth client secret and add them to your [Supabase Project](https://app.supabase.com) +- Retrieve your OAuth client ID and OAuth client secret and add them to your [Supabase Project](https://supabase.com/dashboard) - Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) ## Create your notion integration diff --git a/apps/docs/pages/guides/auth/social-login/auth-slack.mdx b/apps/docs/pages/guides/auth/social-login/auth-slack.mdx index 78c4429aea1..48859c3a5ca 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-slack.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-slack.mdx @@ -13,7 +13,7 @@ To enable Slack Auth for your project, you need to set up a Slack OAuth applicat Setting up Slack logins for your application consists of 3 parts: - Create and configure a Slack Project and App on the [Slack Developer Dashboard](https://api.slack.com/apps). -- Add your Slack `API Key` and `API Secret Key` to your [Supabase Project](https://app.supabase.com). +- Add your Slack `API Key` and `API Secret Key` to your [Supabase Project](https://supabase.com/dashboard). - Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js). ## Access your Slack Developer account diff --git a/apps/docs/pages/guides/auth/social-login/auth-spotify.mdx b/apps/docs/pages/guides/auth/social-login/auth-spotify.mdx index ac6099c8c1b..f65374571f1 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-spotify.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-spotify.mdx @@ -13,7 +13,7 @@ To enable Spotify Auth for your project, you need to set up a Spotify OAuth appl Setting up Spotify logins for your application consists of 3 parts: - Create and configure a Spotify Project and App on the [Spotify Developer Dashboard](https://developer.spotify.com/dashboard/). -- Add your Spotify `API Key` and `API Secret Key` to your [Supabase Project](https://app.supabase.com). +- Add your Spotify `API Key` and `API Secret Key` to your [Supabase Project](https://supabase.com/dashboard). - Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js). ## Access your Spotify Developer account diff --git a/apps/docs/pages/guides/auth/social-login/auth-twitch.mdx b/apps/docs/pages/guides/auth/social-login/auth-twitch.mdx index 9b6b30acf26..6b4951f880d 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-twitch.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-twitch.mdx @@ -13,7 +13,7 @@ To enable Twitch Auth for your project, you need to set up a Twitch Application Setting up Twitch logins for your application consists of 3 parts: - Create and configure a Twitch Application [Twitch Developer Console](https://dev.twitch.tv/console) -- Add your Twitch OAuth Consumer keys to your [Supabase Project](https://app.supabase.com) +- Add your Twitch OAuth Consumer keys to your [Supabase Project](https://supabase.com/dashboard) - Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) ## Access your Twitch Developer account diff --git a/apps/docs/pages/guides/auth/social-login/auth-twitter.mdx b/apps/docs/pages/guides/auth/social-login/auth-twitter.mdx index a2ce6204ec2..d681313a3e3 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-twitter.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-twitter.mdx @@ -13,7 +13,7 @@ To enable Twitter Auth for your project, you need to set up a Twitter OAuth appl Setting up Twitter logins for your application consists of 3 parts: - Create and configure a Twitter Project and App on the [Twitter Developer Dashboard](https://developer.twitter.com/en/portal/dashboard). -- Add your Twitter `API Key` and `API Secret Key` to your [Supabase Project](https://app.supabase.com). +- Add your Twitter `API Key` and `API Secret Key` to your [Supabase Project](https://supabase.com/dashboard). - Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js). ## Access your Twitter Developer account diff --git a/apps/docs/pages/guides/auth/social-login/auth-zoom.mdx b/apps/docs/pages/guides/auth/social-login/auth-zoom.mdx index fe4c9bec315..9e2f9792dcc 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-zoom.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-zoom.mdx @@ -13,7 +13,7 @@ To enable Zoom Auth for your project, you need to set up a Zoom OAuth applicatio Setting up Zoom logins for your application consists of 3 parts: - Create and configure a Zoom OAuth App on [Zoom App Marketplace](https://marketplace.zoom.us/) -- Add your Zoom OAuth keys to your [Supabase Project](https://app.supabase.com) +- Add your Zoom OAuth keys to your [Supabase Project](https://supabase.com/dashboard) - Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) ## Access your Zoom Developer account diff --git a/apps/docs/pages/guides/auth/sso/auth-sso-saml.mdx b/apps/docs/pages/guides/auth/sso/auth-sso-saml.mdx index 72760555797..2fb4589052d 100644 --- a/apps/docs/pages/guides/auth/sso/auth-sso-saml.mdx +++ b/apps/docs/pages/guides/auth/sso/auth-sso-saml.mdx @@ -15,7 +15,7 @@ Supabase Auth supports enterprise-level Single Sign-On (SSO) for any identity pr - PingIdentity - OneLogin -If you're having issues with identity provider software not on this list, please [open a support ticket](https://app.supabase.com/support/new). +If you're having issues with identity provider software not on this list, please [open a support ticket](https://supabase.com/dashboard/support/new). ## Prerequisites @@ -23,7 +23,7 @@ This guide requires the use of the [Supabase CLI](/docs/guides/cli). Please make You can use the `supabase sso` [subcommands](/docs/reference/cli/supabase-sso) to manage your project's configuration. -SAML 2.0 support is disabled by default on Supabase projects. You can configure this on the [Auth Providers](https://app.supabase.com/project/_/auth/providers) page on your project. +SAML 2.0 support is disabled by default on Supabase projects. You can configure this on the [Auth Providers](https://supabase.com/dashboard/project/_/auth/providers) page on your project. Please note that SAML 2.0 support is offered on plans Pro and above. Check the [Pricing](https://supabase.com/pricing) page for more information. @@ -130,7 +130,7 @@ CREATE POLICY "View organization settings." ## Managing SAML 2.0 connections -Once you've enabled SAML 2.0 support on your project via the [Auth Providers](https://app.supabase.com/project/_/auth/providers) page in the dashboard, you can use the [Supabase CLI](/docs/reference/cli/supabase-sso) to add, update, remove and view information about identity providers. +Once you've enabled SAML 2.0 support on your project via the [Auth Providers](https://supabase.com/dashboard/project/_/auth/providers) page in the dashboard, you can use the [Supabase CLI](/docs/reference/cli/supabase-sso) to add, update, remove and view information about identity providers. ### Add a connection @@ -287,7 +287,7 @@ supabase sso remove --project-ref If successful, the details of the removed identity provider will be shown. All user accounts from that identity provider will be immediately logged out. User information will remain in the system, but it will no longer be possible for any of those accounts to be accessed in the future, even if you add the connection again. -If you need to reassign those user accounts to another identity provider, please [open a support ticket](https://app.supabase.com/support/new). +If you need to reassign those user accounts to another identity provider, please [open a support ticket](https://supabase.com/dashboard/support/new). A [list of all](/docs/reference/cli/supabase-sso-list) registered identity providers can be displayed by running: @@ -364,7 +364,7 @@ Should you run into this problem, it is most likely a misconfiguration issue **o At this time it is not possible to extract the RSA private key used by your project's Supabase Auth server. This is done to keep the private key as secure as possible, given that SAML does not offer an easy way to rotate keys without disrupting service. (Please use a SAML 2.0 Metadata URL whenever possible for this reason!) -If you really need access to the key, please [open a support ticket](https://app.supabase.com/support/new) and we'll try to support you as best as possible. +If you really need access to the key, please [open a support ticket](https://supabase.com/dashboard/support/new) and we'll try to support you as best as possible. export const Page = ({ children }) => diff --git a/apps/docs/pages/guides/cli/managing-environments.mdx b/apps/docs/pages/guides/cli/managing-environments.mdx index c3e41a404c4..8c8646cfe1c 100644 --- a/apps/docs/pages/guides/cli/managing-environments.mdx +++ b/apps/docs/pages/guides/cli/managing-environments.mdx @@ -23,7 +23,7 @@ Make sure you have these installed on your local machine: To get started: -- Create a [Supabase project](https://app.supabase.com) or use an existing one +- Create a [Supabase project](https://supabase.com/dashboard) or use an existing one - Initialize a local Git repository
    @@ -53,7 +53,7 @@ supabase link --project-ref $PROJECT_ID You can get your `$PROJECT_ID` from your project's dashboard URL: ``` -https://app.supabase.com/project/ +https://supabase.com/dashboard/project/ ``` If you're using an existing Supabase project, you might have made schema changes through the Dashboard. diff --git a/apps/docs/pages/guides/database.mdx b/apps/docs/pages/guides/database.mdx index 5bff7cc1a89..440277b9a8b 100644 --- a/apps/docs/pages/guides/database.mdx +++ b/apps/docs/pages/guides/database.mdx @@ -98,7 +98,7 @@ Read about resetting your database password [here](/docs/guides/database/managin ## Next steps - Read more about [Postgres](https://www.postgresql.org/about/) -- Sign in: [app.supabase.com](https://app.supabase.com) +- Sign in: [supabase.com/dashboard](https://supabase.com/dashboard) export const Page = ({ children }) => diff --git a/apps/docs/pages/guides/database/arrays.mdx b/apps/docs/pages/guides/database/arrays.mdx index 5bef947cfa9..0ac61fcd68c 100644 --- a/apps/docs/pages/guides/database/arrays.mdx +++ b/apps/docs/pages/guides/database/arrays.mdx @@ -20,7 +20,7 @@ Create a test table with a text array (an array of strings): > -1. Go to the [Table editor](https://app.supabase.com/project/_/editor) page in the Dashboard. +1. Go to the [Table editor](https://supabase.com/dashboard/project/_/editor) page in the Dashboard. 1. Click **New Table** and create a table with the name `arraytest`. 1. Click **Save**. 1. Click **New Column** and create a column with the name `textarray`, type `text`, and select **Define as array**. @@ -49,7 +49,7 @@ create table arraytest ( > -1. Go to the [Table editor](https://app.supabase.com/project/_/editor) page in the Dashboard. +1. Go to the [Table editor](https://supabase.com/dashboard/project/_/editor) page in the Dashboard. 1. Select the `arraytest` table. 1. Click **Insert row** and add `["Harry", "Larry", "Moe"]`. 1. Click **Save.** @@ -85,7 +85,7 @@ const { data, error } = await supabase > -1. Go to the [Table editor](https://app.supabase.com/project/_/editor) page in the Dashboard. +1. Go to the [Table editor](https://supabase.com/dashboard/project/_/editor) page in the Dashboard. 1. Select the `arraytest` table. You should see: diff --git a/apps/docs/pages/guides/database/connecting-to-postgres.mdx b/apps/docs/pages/guides/database/connecting-to-postgres.mdx index 10f810293f8..d63aa46aa2d 100644 --- a/apps/docs/pages/guides/database/connecting-to-postgres.mdx +++ b/apps/docs/pages/guides/database/connecting-to-postgres.mdx @@ -23,7 +23,7 @@ Supabase provides auto-updating [APIs](/docs/guides/database/api). This is the e ## Direct connections -Every Supabase project provides a full Postgres database. You can connect to the database using [any tool which supports Postgres](#integrations). You can find the connection string in the [Database settings](https://app.supabase.com/project/_/settings/database) inside the dashboard: +Every Supabase project provides a full Postgres database. You can connect to the database using [any tool which supports Postgres](#integrations). You can find the connection string in the [Database settings](https://supabase.com/dashboard/project/_/settings/database) inside the dashboard: 1. Go to the `Settings` section. 2. Click `Database`. @@ -38,7 +38,7 @@ Every Supabase project provides a full Postgres database. You can connect to the ## Connection Pooler -Every Supabase project comes with PgBouncer for connection pooling. A connection pooler is useful for managing a large number of _temporary_ connections. For example, if you are using [Prisma](/docs/guides/integrations/prisma), Drizzle, Kysely, or anything deployed to a Serverless environment (AWS Lambdas or Edge Functions). You can find the connection pool config in the [Database settings](https://app.supabase.com/project/_/settings/database) inside the dashboard: +Every Supabase project comes with PgBouncer for connection pooling. A connection pooler is useful for managing a large number of _temporary_ connections. For example, if you are using [Prisma](/docs/guides/integrations/prisma), Drizzle, Kysely, or anything deployed to a Serverless environment (AWS Lambdas or Edge Functions). You can find the connection pool config in the [Database settings](https://supabase.com/dashboard/project/_/settings/database) inside the dashboard: 1. Go to the `Settings` section. 2. Click `Database`. diff --git a/apps/docs/pages/guides/database/extensions.mdx b/apps/docs/pages/guides/database/extensions.mdx index 8b729b6ba73..68271fbc284 100644 --- a/apps/docs/pages/guides/database/extensions.mdx +++ b/apps/docs/pages/guides/database/extensions.mdx @@ -19,7 +19,7 @@ Supabase has pre-installed some of the most useful open source extensions. > -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click **Extensions** in the sidebar. 3. Enable or disable an extension. diff --git a/apps/docs/pages/guides/database/extensions/http.mdx b/apps/docs/pages/guides/database/extensions/http.mdx index 7f686ed8e7b..89ad11ae91f 100644 --- a/apps/docs/pages/guides/database/extensions/http.mdx +++ b/apps/docs/pages/guides/database/extensions/http.mdx @@ -45,7 +45,7 @@ You can use the `http` extension to make these network requests from Postgres. > -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click on **Extensions** in the sidebar. 3. Search for "http" and enable the extension. diff --git a/apps/docs/pages/guides/database/extensions/hypopg.mdx b/apps/docs/pages/guides/database/extensions/hypopg.mdx index 18688e276e4..b272e9e40e0 100644 --- a/apps/docs/pages/guides/database/extensions/hypopg.mdx +++ b/apps/docs/pages/guides/database/extensions/hypopg.mdx @@ -20,7 +20,7 @@ The motivation for HypoPG is to allow users to quickly search for an index to im > -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click on **Extensions** in the sidebar. 3. Search for "hypopg" and enable the extension. diff --git a/apps/docs/pages/guides/database/extensions/pg_graphql.mdx b/apps/docs/pages/guides/database/extensions/pg_graphql.mdx index e4a27cb523c..eee0cfb1103 100644 --- a/apps/docs/pages/guides/database/extensions/pg_graphql.mdx +++ b/apps/docs/pages/guides/database/extensions/pg_graphql.mdx @@ -24,7 +24,7 @@ For more information about how the SQL schema is reflected into a GraphQL schema > -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click on **Extensions** in the sidebar. 3. Search for "pg_graphql" and enable the extension. diff --git a/apps/docs/pages/guides/database/extensions/pg_hashids.mdx b/apps/docs/pages/guides/database/extensions/pg_hashids.mdx index ad02c19b1ff..2b413c1533f 100644 --- a/apps/docs/pages/guides/database/extensions/pg_hashids.mdx +++ b/apps/docs/pages/guides/database/extensions/pg_hashids.mdx @@ -18,7 +18,7 @@ export const meta = { > -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click on **Extensions** in the sidebar. 3. Search for "pg_hashids" and enable the extension. diff --git a/apps/docs/pages/guides/database/extensions/pg_jsonschema.mdx b/apps/docs/pages/guides/database/extensions/pg_jsonschema.mdx index 4cf54f21a19..1fba7fa77fc 100644 --- a/apps/docs/pages/guides/database/extensions/pg_jsonschema.mdx +++ b/apps/docs/pages/guides/database/extensions/pg_jsonschema.mdx @@ -18,7 +18,7 @@ export const meta = { > -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click on **Extensions** in the sidebar. 3. Search for "pg_jsonschema" and enable the extension. diff --git a/apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx b/apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx index 232bbb116e0..8e050767f7d 100644 --- a/apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx +++ b/apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx @@ -24,7 +24,7 @@ For more information on query optimization, check out the [query performance gui > -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click on **Extensions** in the sidebar. 3. Search for "pg_stat_monitor" and enable the extension. diff --git a/apps/docs/pages/guides/database/extensions/pg_stat_statements.mdx b/apps/docs/pages/guides/database/extensions/pg_stat_statements.mdx index cb64a901b0c..34cbb3af35b 100644 --- a/apps/docs/pages/guides/database/extensions/pg_stat_statements.mdx +++ b/apps/docs/pages/guides/database/extensions/pg_stat_statements.mdx @@ -34,7 +34,7 @@ For more information on query optimization, check out the [query performance gui > -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click on **Extensions** in the sidebar. 3. Search for "pg_stat_statements" and enable the extension. diff --git a/apps/docs/pages/guides/database/extensions/pgaudit.mdx b/apps/docs/pages/guides/database/extensions/pgaudit.mdx index 0352fb6d131..3b780c1e4e8 100644 --- a/apps/docs/pages/guides/database/extensions/pgaudit.mdx +++ b/apps/docs/pages/guides/database/extensions/pgaudit.mdx @@ -20,7 +20,7 @@ PGAudit grants fine grain control over which statements and objects are emitted > -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click on **Extensions** in the sidebar. 3. Search for "pgaudit" and enable the extension. diff --git a/apps/docs/pages/guides/database/extensions/pgcron.mdx b/apps/docs/pages/guides/database/extensions/pgcron.mdx index 8b4b5016c4d..72f7fe98256 100644 --- a/apps/docs/pages/guides/database/extensions/pgcron.mdx +++ b/apps/docs/pages/guides/database/extensions/pgcron.mdx @@ -21,7 +21,7 @@ The `pg_cron` extension is a simple cron-based job scheduler for PostgreSQL that > -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click on **Extensions** in the sidebar. 3. Search for "pg_cron" and enable the extension. diff --git a/apps/docs/pages/guides/database/extensions/pgjwt.mdx b/apps/docs/pages/guides/database/extensions/pgjwt.mdx index 1643f7e8ca4..fcc0bc9d427 100644 --- a/apps/docs/pages/guides/database/extensions/pgjwt.mdx +++ b/apps/docs/pages/guides/database/extensions/pgjwt.mdx @@ -18,7 +18,7 @@ The [pgjwt](https://github.com/michelp/pgjwt) (PostgreSQL JSON Web Token) extens > -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click on **Extensions** in the sidebar. 3. Search for "pgjwt" and enable the extension. diff --git a/apps/docs/pages/guides/database/extensions/pgnet.mdx b/apps/docs/pages/guides/database/extensions/pgnet.mdx index 5a93b7a48b5..0bd90aecd16 100644 --- a/apps/docs/pages/guides/database/extensions/pgnet.mdx +++ b/apps/docs/pages/guides/database/extensions/pgnet.mdx @@ -26,7 +26,7 @@ It differs from the `http` extension in that it is asynchronous by default. This > -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click on **Extensions** in the sidebar. 3. Search for "pg_net" and enable the extension. diff --git a/apps/docs/pages/guides/database/extensions/pgrepack.mdx b/apps/docs/pages/guides/database/extensions/pgrepack.mdx index bea7f7474b2..8fac1c675ff 100644 --- a/apps/docs/pages/guides/database/extensions/pgrepack.mdx +++ b/apps/docs/pages/guides/database/extensions/pgrepack.mdx @@ -35,7 +35,7 @@ Get started with pg_repack by enabling the extension in the Supabase Dashboard. > -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click on **Extensions** in the sidebar. 3. Search for "pg_repack" and enable the extension. diff --git a/apps/docs/pages/guides/database/extensions/pgroonga.mdx b/apps/docs/pages/guides/database/extensions/pgroonga.mdx index 669c5d7829b..e8256f4d3cb 100644 --- a/apps/docs/pages/guides/database/extensions/pgroonga.mdx +++ b/apps/docs/pages/guides/database/extensions/pgroonga.mdx @@ -18,7 +18,7 @@ export const meta = { > -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click on **Extensions** in the sidebar. 3. Search for "pgroonga" and enable the extension. diff --git a/apps/docs/pages/guides/database/extensions/pgrouting.mdx b/apps/docs/pages/guides/database/extensions/pgrouting.mdx index 73a047fb362..34b9612bb39 100644 --- a/apps/docs/pages/guides/database/extensions/pgrouting.mdx +++ b/apps/docs/pages/guides/database/extensions/pgrouting.mdx @@ -32,7 +32,7 @@ The core functionality of `pgRouting` is a set of path finding algorithms includ > -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click on **Extensions** in the sidebar. 3. Search for "pgrouting" and enable the extension. diff --git a/apps/docs/pages/guides/database/extensions/pgsodium.mdx b/apps/docs/pages/guides/database/extensions/pgsodium.mdx index 8e5f92ff5fe..15028024222 100644 --- a/apps/docs/pages/guides/database/extensions/pgsodium.mdx +++ b/apps/docs/pages/guides/database/extensions/pgsodium.mdx @@ -63,7 +63,7 @@ It also enables some Postgres specific features including: > -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click on **Extensions** in the sidebar. 3. Search for "pgsodium" and enable the extension. diff --git a/apps/docs/pages/guides/database/extensions/pgtap.mdx b/apps/docs/pages/guides/database/extensions/pgtap.mdx index 219eedd11ee..42d4521687e 100644 --- a/apps/docs/pages/guides/database/extensions/pgtap.mdx +++ b/apps/docs/pages/guides/database/extensions/pgtap.mdx @@ -25,7 +25,7 @@ Let's cover some basic concepts: > -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click on **Extensions** in the sidebar. 3. Search for "pgtap" and enable the extension. diff --git a/apps/docs/pages/guides/database/extensions/pgvector.mdx b/apps/docs/pages/guides/database/extensions/pgvector.mdx index e9ce3274f8d..b142920f358 100644 --- a/apps/docs/pages/guides/database/extensions/pgvector.mdx +++ b/apps/docs/pages/guides/database/extensions/pgvector.mdx @@ -33,7 +33,7 @@ This is particularly useful if you're building on top of OpenAI's [GPT-3](https: > -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click on **Extensions** in the sidebar. 3. Search for "vector" and enable the extension. diff --git a/apps/docs/pages/guides/database/extensions/plpgsql_check.mdx b/apps/docs/pages/guides/database/extensions/plpgsql_check.mdx index a064f463df6..647ca16fc03 100644 --- a/apps/docs/pages/guides/database/extensions/plpgsql_check.mdx +++ b/apps/docs/pages/guides/database/extensions/plpgsql_check.mdx @@ -18,7 +18,7 @@ export const meta = { > -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click on **Extensions** in the sidebar. 3. Search for "plpgsql_check" and enable the extension. diff --git a/apps/docs/pages/guides/database/extensions/plv8.mdx b/apps/docs/pages/guides/database/extensions/plv8.mdx index bac280e8d78..77c55e87d7d 100644 --- a/apps/docs/pages/guides/database/extensions/plv8.mdx +++ b/apps/docs/pages/guides/database/extensions/plv8.mdx @@ -25,7 +25,7 @@ It can be used for database functions, triggers, queries and more. > -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click on **Extensions** in the sidebar. 3. Search for "plv8" and enable the extension. diff --git a/apps/docs/pages/guides/database/extensions/postgis.mdx b/apps/docs/pages/guides/database/extensions/postgis.mdx index 9ff6e55db30..da0562db7af 100644 --- a/apps/docs/pages/guides/database/extensions/postgis.mdx +++ b/apps/docs/pages/guides/database/extensions/postgis.mdx @@ -26,7 +26,7 @@ You can get started with PostGIS by enabling the PostGIS extension in your Supab > -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click on **Extensions** in the sidebar. 3. Search for "postgis" and enable the extension. diff --git a/apps/docs/pages/guides/database/extensions/rum.mdx b/apps/docs/pages/guides/database/extensions/rum.mdx index bfe5ede32ee..bf83786732c 100644 --- a/apps/docs/pages/guides/database/extensions/rum.mdx +++ b/apps/docs/pages/guides/database/extensions/rum.mdx @@ -39,7 +39,7 @@ You can get started with rum by enabling the extension in your Supabase dashboar > -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click on **Extensions** in the sidebar. 3. Search for "rum" and enable the extension. diff --git a/apps/docs/pages/guides/database/extensions/timescaledb.mdx b/apps/docs/pages/guides/database/extensions/timescaledb.mdx index 265e8662ad4..b6daaed4814 100644 --- a/apps/docs/pages/guides/database/extensions/timescaledb.mdx +++ b/apps/docs/pages/guides/database/extensions/timescaledb.mdx @@ -20,7 +20,7 @@ export const meta = { > -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click on **Extensions** in the sidebar. 3. Search for "timescaledb" and enable the extension. diff --git a/apps/docs/pages/guides/database/extensions/uuid-ossp.mdx b/apps/docs/pages/guides/database/extensions/uuid-ossp.mdx index b270fdd581f..f07cde1ede4 100644 --- a/apps/docs/pages/guides/database/extensions/uuid-ossp.mdx +++ b/apps/docs/pages/guides/database/extensions/uuid-ossp.mdx @@ -23,7 +23,7 @@ This makes them particularly well suited as Primary Keys. It is occasionally ref > -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click on **Extensions** in the sidebar. 3. Search for "uuid-ossp" and enable the extension. diff --git a/apps/docs/pages/guides/database/extensions/wrappers.mdx b/apps/docs/pages/guides/database/extensions/wrappers.mdx index 34305abd1cb..5d99f88ea08 100644 --- a/apps/docs/pages/guides/database/extensions/wrappers.mdx +++ b/apps/docs/pages/guides/database/extensions/wrappers.mdx @@ -36,7 +36,7 @@ from > -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click on **Extensions** in the sidebar. 3. Search for "wrappers" and enable the extension. diff --git a/apps/docs/pages/guides/database/json.mdx b/apps/docs/pages/guides/database/json.mdx index 46e60985db4..2016d9854d1 100644 --- a/apps/docs/pages/guides/database/json.mdx +++ b/apps/docs/pages/guides/database/json.mdx @@ -46,7 +46,7 @@ create table books ( -1. Go to the [Table Editor](https://app.supabase.com/project/_/editor) page in the Dashboard. +1. Go to the [Table Editor](https://supabase.com/dashboard/project/_/editor) page in the Dashboard. 2. Click **New Table** and create a table called `books`. 3. Include a primary key with the following properties and click save: @@ -112,7 +112,7 @@ values -1. Go to the [Table Editor](https://app.supabase.com/project/_/editor) page in the Dashboard. +1. Go to the [Table Editor](https://supabase.com/dashboard/project/_/editor) page in the Dashboard. 2. Select the `books` table in the sidebar. 3. Click **+ Insert row** and add 5 rows with the following properties: diff --git a/apps/docs/pages/guides/database/managing-passwords.mdx b/apps/docs/pages/guides/database/managing-passwords.mdx index 79e51176195..f96c00437ac 100644 --- a/apps/docs/pages/guides/database/managing-passwords.mdx +++ b/apps/docs/pages/guides/database/managing-passwords.mdx @@ -13,7 +13,7 @@ If you use special symbols in your postgres password, you must remember to [perc ## Changing your project password When you created your project you were also asked to enter a password. This is actually the password for your database, specifically for the `postgres` user. -You can update this from the Dashboard under the [database settings](https://app.supabase.com/project/_/settings/database) page. +You can update this from the Dashboard under the [database settings](https://supabase.com/dashboard/project/_/settings/database) page. ## Creating a secure password diff --git a/apps/docs/pages/guides/database/overview.mdx b/apps/docs/pages/guides/database/overview.mdx index c4f59398be9..80ddf753488 100644 --- a/apps/docs/pages/guides/database/overview.mdx +++ b/apps/docs/pages/guides/database/overview.mdx @@ -100,7 +100,7 @@ Read about resetting your database password [here](/docs/guides/database/managin ## Next steps - Read more about [Postgres](https://www.postgresql.org/about/) -- Sign in: [app.supabase.com](https://app.supabase.com) +- Sign in: [supabase.com/dashboard](https://supabase.com/dashboard) export const Page = ({ children }) => diff --git a/apps/docs/pages/guides/database/postgres/dropping-all-tables-in-schema.mdx b/apps/docs/pages/guides/database/postgres/dropping-all-tables-in-schema.mdx index 602db8f9822..734c7b132e0 100644 --- a/apps/docs/pages/guides/database/postgres/dropping-all-tables-in-schema.mdx +++ b/apps/docs/pages/guides/database/postgres/dropping-all-tables-in-schema.mdx @@ -27,7 +27,7 @@ end $$; This query works by listing out all the tables in the given schema and then executing a `drop table` for each (hence the `for... loop`). -You can run this query using the [SQL Editor](https://app.supabase.com/project/_/sql) in the Supabase Dashboard, or via `psql` if you're [connecting directly to the database](/docs/guides/database/connecting-to-postgres#direct-connections). +You can run this query using the [SQL Editor](https://supabase.com/dashboard/project/_/sql) in the Supabase Dashboard, or via `psql` if you're [connecting directly to the database](/docs/guides/database/connecting-to-postgres#direct-connections). export const Page = ({ children }) => diff --git a/apps/docs/pages/guides/database/postgres/first-row-in-group.mdx b/apps/docs/pages/guides/database/postgres/first-row-in-group.mdx index ba0297f903c..362f987d34c 100644 --- a/apps/docs/pages/guides/database/postgres/first-row-in-group.mdx +++ b/apps/docs/pages/guides/database/postgres/first-row-in-group.mdx @@ -25,7 +25,7 @@ The expected output we want is: | 3 | Brighton | 34 | | 2 | Liverpool | 84 | -From the [SQL Editor](https://app.supabase.com/project/_/sql), you can run a query like: +From the [SQL Editor](https://supabase.com/dashboard/project/_/sql), you can run a query like: ```sql select distinct diff --git a/apps/docs/pages/guides/database/postgres/indexes.mdx b/apps/docs/pages/guides/database/postgres/indexes.mdx index 60e7a3e2eeb..33087ac1a8a 100644 --- a/apps/docs/pages/guides/database/postgres/indexes.mdx +++ b/apps/docs/pages/guides/database/postgres/indexes.mdx @@ -29,7 +29,7 @@ create table persons ( -All the queries in this guide can be run using the [SQL Editor](https://app.supabase.com/project/_/sql) in the Supabase Dashboard, or via `psql` if you're [connecting directly to the database](/docs/guides/database/connecting-to-postgres#direct-connections). +All the queries in this guide can be run using the [SQL Editor](https://supabase.com/dashboard/project/_/sql) in the Supabase Dashboard, or via `psql` if you're [connecting directly to the database](/docs/guides/database/connecting-to-postgres#direct-connections). diff --git a/apps/docs/pages/guides/database/postgres/which-version-of-postgres.mdx b/apps/docs/pages/guides/database/postgres/which-version-of-postgres.mdx index 3a04c7ce06a..28273954fbe 100644 --- a/apps/docs/pages/guides/database/postgres/which-version-of-postgres.mdx +++ b/apps/docs/pages/guides/database/postgres/which-version-of-postgres.mdx @@ -8,7 +8,7 @@ export const meta = { It's important to know which version of PostgreSQL you are running as each major version has different features and may cause breaking changes. You may also need to update your schema when [upgrading](https://www.postgresql.org/docs/current/pgupgrade.html) or downgrading to a major Postgres version. -Run the following query using the [SQL Editor](https://app.supabase.com/project/_/sql) in the Supabase Dashboard: +Run the following query using the [SQL Editor](https://supabase.com/dashboard/project/_/sql) in the Supabase Dashboard: ```sql select diff --git a/apps/docs/pages/guides/database/replication.mdx b/apps/docs/pages/guides/database/replication.mdx index ba9939d6793..6d32aebf95b 100644 --- a/apps/docs/pages/guides/database/replication.mdx +++ b/apps/docs/pages/guides/database/replication.mdx @@ -11,11 +11,11 @@ Replication is a technique for copying the data from one database to another. Su - Spreading out the "load." For example, if your database has a lot of reads, you might want to split it between two databases. - Reducing latency. For example, you may want one database in London to serve your European customers, and one in New York to serve the US. -Replication is done through _publications_, a method of choosing which changes to send to other systems (usually another Postgres database). Publications can be managed in the [Dashboard](https://app.supabase.com) or with SQL. +Replication is done through _publications_, a method of choosing which changes to send to other systems (usually another Postgres database). Publications can be managed in the [Dashboard](https://supabase.com/dashboard) or with SQL. ## Manage publications in the Dashboard -1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. 2. Click on **Replication** in the sidebar. 3. Control which database events are sent by toggling **Insert**, **Update**, and **Delete**. 4. Control which tables broadcast changes by selecting **Source** and toggling each table. diff --git a/apps/docs/pages/guides/database/tables.mdx b/apps/docs/pages/guides/database/tables.mdx index d8f7b5ca3bf..730b3fcd977 100644 --- a/apps/docs/pages/guides/database/tables.mdx +++ b/apps/docs/pages/guides/database/tables.mdx @@ -48,7 +48,7 @@ and run the SQL queries yourself. /> -1. Go to the [Table Editor](https://app.supabase.com/project/_/editor) page in the Dashboard. +1. Go to the [Table Editor](https://supabase.com/dashboard/project/_/editor) page in the Dashboard. 2. Click **New Table** and create a table with the name `todos`. 3. Click **Save**. 4. Click **New Column** and create a column with the name `task` and type `text`. diff --git a/apps/docs/pages/guides/database/webhooks.mdx b/apps/docs/pages/guides/database/webhooks.mdx index 9cada9989cb..f08bcb3b289 100644 --- a/apps/docs/pages/guides/database/webhooks.mdx +++ b/apps/docs/pages/guides/database/webhooks.mdx @@ -33,7 +33,7 @@ Database Webhooks were previously known as Function Hooks. ## Creating a webhook -1. Create a new [Database Webhook](https://app.supabase.com/project/_/database/hooks) in the Dashboard. +1. Create a new [Database Webhook](https://supabase.com/dashboard/project/_/database/hooks) in the Dashboard. 1. Give your Webhook a name. 1. Select the table you want to hook into. 1. Select one or more events (table inserts, updates, or deletes) you want to hook into. diff --git a/apps/docs/pages/guides/functions/debugging.mdx b/apps/docs/pages/guides/functions/debugging.mdx index 9b18d06b1fd..6b1d46d1eda 100644 --- a/apps/docs/pages/guides/functions/debugging.mdx +++ b/apps/docs/pages/guides/functions/debugging.mdx @@ -6,7 +6,7 @@ export const meta = { description: 'Debug Edge Functions in production.', } -You can debug your deployed Edge Functions using the ["Functions" section](https://app.supabase.com/project/_/functions) of the Dashboard. There are two debugging tools available: +You can debug your deployed Edge Functions using the ["Functions" section](https://supabase.com/dashboard/project/_/functions) of the Dashboard. There are two debugging tools available: - Invocations: shows the Request and Response for each execution. - Logs: shows any platform events, including deployments and errors. diff --git a/apps/docs/pages/guides/functions/kysely-postgres.mdx b/apps/docs/pages/guides/functions/kysely-postgres.mdx index 765946a81ef..3987a77e45d 100644 --- a/apps/docs/pages/guides/functions/kysely-postgres.mdx +++ b/apps/docs/pages/guides/functions/kysely-postgres.mdx @@ -24,7 +24,7 @@ Combining Kysely with Deno Postgres gives you a convenient developer experience Find the example on [GitHub](https://github.com/supabase/supabase/tree/master/examples/edge-functions/supabase/functions/kysely-postgres) -Get your database connection credentials from your [Supabase Dashboard](https://app.supabase.com/project/_/settings/database) and store them in an `.env` file: +Get your database connection credentials from your [Supabase Dashboard](https://supabase.com/dashboard/project/_/settings/database) and store them in an `.env` file: ```bash .env DB_HOSTNAME= diff --git a/apps/docs/pages/guides/functions/troubleshooting.mdx b/apps/docs/pages/guides/functions/troubleshooting.mdx index d083f360f18..5bdaad00dd9 100644 --- a/apps/docs/pages/guides/functions/troubleshooting.mdx +++ b/apps/docs/pages/guides/functions/troubleshooting.mdx @@ -8,7 +8,7 @@ export const meta = { ## Unable to call Edge Function -If you're unable to call your Edge Function or are experiencing any CORS issues, even though you followed the [CORS guide](/docs/guides/functions/cors), please head over to [app.supabase.com/project/\_/functions](https://app.supabase.com/project/_/functions), select your function from the list & click Logs. Do you see any errors listed there? +If you're unable to call your Edge Function or are experiencing any CORS issues, even though you followed the [CORS guide](/docs/guides/functions/cors), please head over to [supabase.com/dashboard/project/\_/functions](https://supabase.com/dashboard/project/_/functions), select your function from the list & click Logs. Do you see any errors listed there? There are two debugging tools available: Invocations and Logs. Invocations shows the Request and Response for each execution, while Logs shows any platform events, including deployments and errors. @@ -21,7 +21,7 @@ There are two debugging tools available: Invocations and Logs. Invocations shows ## Edge Function takes too long to respond -- Head over to [app.supabase.com/project/\_/functions](https://app.supabase.com/project/_/functions), select your function from the list & click Logs. +- Head over to [supabase.com/dashboard/project/\_/functions](https://supabase.com/dashboard/project/_/functions), select your function from the list & click Logs. - In the looks, look for the `booted` event and check if they have consistent boot times. - If the boot times are similar, it's likely an issue with your function's code, like a large dependency etc. - If only some of the `booted` events are slow, please find the affected `region` in the metadata and submit a support request via the "Help" button at the top. diff --git a/apps/docs/pages/guides/getting-started/local-development.mdx b/apps/docs/pages/guides/getting-started/local-development.mdx index 58c08b547b6..07f364c69de 100644 --- a/apps/docs/pages/guides/getting-started/local-development.mdx +++ b/apps/docs/pages/guides/getting-started/local-development.mdx @@ -369,7 +369,7 @@ The last step is deploying these changes to a live Supabase project. ## Deploy your project -You've been developing your project locally, making changes to your tables via migrations. It's time to deploy your project to the Supabase Platform and start scaling up to millions of users! Head over to [Supabase](https://app.supabase.com) and create a new project to deploy to. +You've been developing your project locally, making changes to your tables via migrations. It's time to deploy your project to the Supabase Platform and start scaling up to millions of users! Head over to [Supabase](https://supabase.com/dashboard) and create a new project to deploy to. ### Link your project @@ -377,7 +377,7 @@ Associate your project with your remote project using [`supabase link`](/docs/re ```bash supabase link --project-ref -# You can get from your project's dashboard URL: https://app.supabase.com/project/ +# You can get from your project's dashboard URL: https://supabase.com/dashboard/project/ supabase db remote commit # Capture any changes that you have made to your remote database before you went through the steps above @@ -401,7 +401,7 @@ Deploy any local database migrations using [`db push`](/docs/reference/cli/usage supabase db push ``` -Visiting your live project on [Supabase](https://app.supabase.com), you'll see a new `employees` table, complete with the `department` column you added in the second migration above. +Visiting your live project on [Supabase](https://supabase.com/dashboard), you'll see a new `employees` table, complete with the `department` column you added in the second migration above. ### Deploy Edge Functions diff --git a/apps/docs/pages/guides/getting-started/quickstarts/flutter.mdx b/apps/docs/pages/guides/getting-started/quickstarts/flutter.mdx index ef3ad59dc21..56fa3a0e891 100644 --- a/apps/docs/pages/guides/getting-started/quickstarts/flutter.mdx +++ b/apps/docs/pages/guides/getting-started/quickstarts/flutter.mdx @@ -13,9 +13,9 @@ export const meta = { - [Create a new project](https://app.supabase.com) in the Supabase Dashboard. + [Create a new project](https://supabase.com/dashboard) in the Supabase Dashboard. - After your project is ready, create a table in your Supabase database using the [SQL Editor](https://app.supabase.com/project/_/sql) in the Dashboard. Use the following SQL statement to create a `countries` table with some sample data. + After your project is ready, create a table in your Supabase database using the [SQL Editor](https://supabase.com/dashboard/project/_/sql) in the Dashboard. Use the following SQL statement to create a `countries` table with some sample data. @@ -79,7 +79,7 @@ export const meta = { - Open `lib/main.dart` and edit the main function to initialize Supabase using your [project URL and public API (anon) key](https://app.supabase.com/project/_/settings/api). + Open `lib/main.dart` and edit the main function to initialize Supabase using your [project URL and public API (anon) key](https://supabase.com/dashboard/project/_/settings/api). diff --git a/apps/docs/pages/guides/getting-started/quickstarts/nextjs.mdx b/apps/docs/pages/guides/getting-started/quickstarts/nextjs.mdx index b8f12ac7d8a..b586d9ff914 100644 --- a/apps/docs/pages/guides/getting-started/quickstarts/nextjs.mdx +++ b/apps/docs/pages/guides/getting-started/quickstarts/nextjs.mdx @@ -13,9 +13,9 @@ export const meta = { - [Create a new project](https://app.supabase.com) in the Supabase Dashboard. + [Create a new project](https://supabase.com/dashboard) in the Supabase Dashboard. - After your project is ready, create a table in your Supabase database using the [SQL Editor](https://app.supabase.com/project/_/sql) in the Dashboard. + After your project is ready, create a table in your Supabase database using the [SQL Editor](https://supabase.com/dashboard/project/_/sql) in the Dashboard. Use the following SQL statement to create a `countries` table with some sample data. @@ -64,7 +64,7 @@ export const meta = { - Rename `.env.local.example` to `.env.local` and populate with [your project's URL and Anon Key](https://app.supabase.com/project/_/settings/api). + Rename `.env.local.example` to `.env.local` and populate with [your project's URL and Anon Key](https://supabase.com/dashboard/project/_/settings/api). diff --git a/apps/docs/pages/guides/getting-started/quickstarts/nuxtjs.mdx b/apps/docs/pages/guides/getting-started/quickstarts/nuxtjs.mdx index 60c3a3ee0f5..5c49766f513 100644 --- a/apps/docs/pages/guides/getting-started/quickstarts/nuxtjs.mdx +++ b/apps/docs/pages/guides/getting-started/quickstarts/nuxtjs.mdx @@ -13,9 +13,9 @@ export const meta = { - [Create a new project](https://app.supabase.com) in the Supabase Dashboard. + [Create a new project](https://supabase.com/dashboard) in the Supabase Dashboard. - After your project is ready, create a table in your Supabase database using the [SQL Editor](https://app.supabase.com/project/_/sql) in the Dashboard. Use the following SQL statement to create a `countries` table with some sample data. + After your project is ready, create a table in your Supabase database using the [SQL Editor](https://supabase.com/dashboard/project/_/sql) in the Dashboard. Use the following SQL statement to create a `countries` table with some sample data. @@ -78,7 +78,7 @@ export const meta = { - In `src/App.vue`, create a Supabase client using your [Project URL and public API (anon) key](https://app.supabase.com/project/_/settings/api). + In `src/App.vue`, create a Supabase client using your [Project URL and public API (anon) key](https://supabase.com/dashboard/project/_/settings/api). Replace the existing content in your `src/App.vue` file with the following code. diff --git a/apps/docs/pages/guides/getting-started/quickstarts/reactjs.mdx b/apps/docs/pages/guides/getting-started/quickstarts/reactjs.mdx index 02422ea1927..e56d031baa0 100644 --- a/apps/docs/pages/guides/getting-started/quickstarts/reactjs.mdx +++ b/apps/docs/pages/guides/getting-started/quickstarts/reactjs.mdx @@ -13,9 +13,9 @@ export const meta = { - [Create a new project](https://app.supabase.com) in the Supabase Dashboard. + [Create a new project](https://supabase.com/dashboard) in the Supabase Dashboard. - After your project is ready, create a table in your Supabase database using the [SQL Editor](https://app.supabase.com/project/_/sql) in the Dashboard. Use the following SQL statement to create a `countries` table with some sample data. + After your project is ready, create a table in your Supabase database using the [SQL Editor](https://supabase.com/dashboard/project/_/sql) in the Dashboard. Use the following SQL statement to create a `countries` table with some sample data. @@ -77,7 +77,7 @@ export const meta = { - In `App.jsx`, create a Supabase client using your [Project URL and public API (anon) key](https://app.supabase.com/project/_/settings/api). + In `App.jsx`, create a Supabase client using your [Project URL and public API (anon) key](https://supabase.com/dashboard/project/_/settings/api). Add a `getCountries` function to fetch the data and display the query result to the page. diff --git a/apps/docs/pages/guides/getting-started/quickstarts/redwoodjs.mdx b/apps/docs/pages/guides/getting-started/quickstarts/redwoodjs.mdx index 9398ef662c5..3c0a0f5f9f3 100644 --- a/apps/docs/pages/guides/getting-started/quickstarts/redwoodjs.mdx +++ b/apps/docs/pages/guides/getting-started/quickstarts/redwoodjs.mdx @@ -12,7 +12,7 @@ export const meta = { - [Create a new project](https://app.supabase.com) in the Supabase Dashboard. + [Create a new project](https://supabase.com/dashboard) in the Supabase Dashboard. Be sure to make note of the Database Password you used as you will need this later to connect to your database. @@ -27,7 +27,7 @@ export const meta = { - After your project is ready, gather the following information about your [database connections](https://app.supabase.com/project/_/settings/database): + After your project is ready, gather the following information about your [database connections](https://supabase.com/dashboard/project/_/settings/database): * Connection String (port 5432) * Connection Pooling / Connection String (port 6543) diff --git a/apps/docs/pages/guides/getting-started/quickstarts/solidjs.mdx b/apps/docs/pages/guides/getting-started/quickstarts/solidjs.mdx index 29890f4e269..76a7819cc8d 100644 --- a/apps/docs/pages/guides/getting-started/quickstarts/solidjs.mdx +++ b/apps/docs/pages/guides/getting-started/quickstarts/solidjs.mdx @@ -13,9 +13,9 @@ export const meta = { - [Create a new project](https://app.supabase.com) in the Supabase Dashboard. + [Create a new project](https://supabase.com/dashboard) in the Supabase Dashboard. - After your project is ready, create a table in your Supabase database using the [SQL Editor](https://app.supabase.com/project/_/sql) in the Dashboard. Use the following SQL statement to create a `countries` table with some sample data. + After your project is ready, create a table in your Supabase database using the [SQL Editor](https://supabase.com/dashboard/project/_/sql) in the Dashboard. Use the following SQL statement to create a `countries` table with some sample data. @@ -77,7 +77,7 @@ export const meta = { - In `App.jsx`, create a Supabase client using your [Project URL and public API (anon) key](https://app.supabase.com/project/_/settings/api). + In `App.jsx`, create a Supabase client using your [Project URL and public API (anon) key](https://supabase.com/dashboard/project/_/settings/api). Add a `getCountries` function to fetch the data and display the query result to the page. diff --git a/apps/docs/pages/guides/getting-started/quickstarts/sveltekit.mdx b/apps/docs/pages/guides/getting-started/quickstarts/sveltekit.mdx index f4989365455..bedaa50314c 100644 --- a/apps/docs/pages/guides/getting-started/quickstarts/sveltekit.mdx +++ b/apps/docs/pages/guides/getting-started/quickstarts/sveltekit.mdx @@ -13,9 +13,9 @@ export const meta = { - [Create a new project](https://app.supabase.com) in the Supabase Dashboard. + [Create a new project](https://supabase.com/dashboard) in the Supabase Dashboard. - After your project is ready, create a table in your Supabase database using the [SQL Editor](https://app.supabase.com/project/_/sql) in the Dashboard. Use the following SQL statement to create a `countries` table with some sample data. + After your project is ready, create a table in your Supabase database using the [SQL Editor](https://supabase.com/dashboard/project/_/sql) in the Dashboard. Use the following SQL statement to create a `countries` table with some sample data. @@ -77,7 +77,7 @@ export const meta = { - Create a `/src/lib` directory in your SvelteKit app, create a file called `supabaseClient.js` and add the following code to initialize the Supabase client with your [project URL and public API (anon) key](https://app.supabase.com/project/_/settings/api). + Create a `/src/lib` directory in your SvelteKit app, create a file called `supabaseClient.js` and add the following code to initialize the Supabase client with your [project URL and public API (anon) key](https://supabase.com/dashboard/project/_/settings/api). diff --git a/apps/docs/pages/guides/getting-started/quickstarts/vue.mdx b/apps/docs/pages/guides/getting-started/quickstarts/vue.mdx index b353d6ef35d..adb2715d03c 100644 --- a/apps/docs/pages/guides/getting-started/quickstarts/vue.mdx +++ b/apps/docs/pages/guides/getting-started/quickstarts/vue.mdx @@ -13,9 +13,9 @@ export const meta = { - [Create a new project](https://app.supabase.com) in the Supabase Dashboard. + [Create a new project](https://supabase.com/dashboard) in the Supabase Dashboard. - After your project is ready, create a table in your Supabase database using the [SQL Editor](https://app.supabase.com/project/_/sql) in the Dashboard. Use the following SQL statement to create a `countries` table with some sample data. + After your project is ready, create a table in your Supabase database using the [SQL Editor](https://supabase.com/dashboard/project/_/sql) in the Dashboard. Use the following SQL statement to create a `countries` table with some sample data. @@ -77,7 +77,7 @@ export const meta = { - Create a `/src/lib` directory in your Vue app, create a file called `supabaseClient.js` and add the following code to initialize the Supabase client with your [project URL and public API (anon) key](https://app.supabase.com/project/_/settings/api). + Create a `/src/lib` directory in your Vue app, create a file called `supabaseClient.js` and add the following code to initialize the Supabase client with your [project URL and public API (anon) key](https://supabase.com/dashboard/project/_/settings/api). diff --git a/apps/docs/pages/guides/getting-started/tutorials/with-flutter.mdx b/apps/docs/pages/guides/getting-started/tutorials/with-flutter.mdx index 70e6ef4c153..36cd58b94e3 100644 --- a/apps/docs/pages/guides/getting-started/tutorials/with-flutter.mdx +++ b/apps/docs/pages/guides/getting-started/tutorials/with-flutter.mdx @@ -48,7 +48,7 @@ We can setup deep links with just a minor tweak on our Flutter application. We will use `io.supabase.flutterquickstart` as the scheme, and `login-callback` as the host for our deep link in this example, but you can change it to whatever you would like. -First, add `io.supabase.flutterquickstart://login-callback/` as a new [redirect URL](https://app.supabase.com/project/_/auth/url-configuration) in the Dashboard. +First, add `io.supabase.flutterquickstart://login-callback/` as a new [redirect URL](https://supabase.com/dashboard/project/_/auth/url-configuration) in the Dashboard. ![Supabase console deep link setting](/docs/img/deeplink-setting.png) diff --git a/apps/docs/pages/guides/integrations/appsmith.mdx b/apps/docs/pages/guides/integrations/appsmith.mdx index f65602ef9fc..fcc582c185a 100644 --- a/apps/docs/pages/guides/integrations/appsmith.mdx +++ b/apps/docs/pages/guides/integrations/appsmith.mdx @@ -17,7 +17,7 @@ Let’s get started! ## Step 1: Set up your Backend on Supabase -- On the [Supabase dashboard](https://app.supabase.com), click `New project` and set the name to **Support Dashboard** +- On the [Supabase dashboard](https://supabase.com/dashboard), click `New project` and set the name to **Support Dashboard** ![create-project-supabase-01](/docs/img/guides/integrations/appsmith/create-project-supabase-01.png) diff --git a/apps/docs/pages/guides/integrations/auth0.mdx b/apps/docs/pages/guides/integrations/auth0.mdx index f22ce35ba82..c379072a409 100644 --- a/apps/docs/pages/guides/integrations/auth0.mdx +++ b/apps/docs/pages/guides/integrations/auth0.mdx @@ -21,7 +21,7 @@ The full code example for this guide can be found [here](https://github.com/dijo If you don’t have an Auth0 account, create one [here](https://auth0.com/signup). -You will also need a Supabase account, which can be created by signing in [here](https://app.supabase.com/). +You will also need a Supabase account, which can be created by signing in [here](https://supabase.com/dashboard/). ## Step 1: Creating an Auth0 tenant @@ -61,7 +61,7 @@ Click `Save` to update the settings. ## Step 3: Creating a Supabase project -From your [Supabase dashboard](https://app.supabase.com/), click `New project`. +From your [Supabase dashboard](https://supabase.com/dashboard/), click `New project`. Enter a `Name` for your Supabase project. @@ -75,7 +75,7 @@ Click `Create new project`. ## Step 4: Creating data in Supabase -From the sidebar menu in the [Supabase dashboard](https://app.supabase.com/), click `Table editor`, then `New table`. +From the sidebar menu in the [Supabase dashboard](https://supabase.com/dashboard/), click `Table editor`, then `New table`. Enter `todo` as the `Name` field. diff --git a/apps/docs/pages/guides/integrations/authsignal.mdx b/apps/docs/pages/guides/integrations/authsignal.mdx index 65d83b22d01..3782ff36d3a 100644 --- a/apps/docs/pages/guides/integrations/authsignal.mdx +++ b/apps/docs/pages/guides/integrations/authsignal.mdx @@ -42,7 +42,7 @@ Finally, to configure the sign-in action to always challenge, go [here](https:// ## Step 2: Creating a Supabase project -From your [Supabase dashboard](https://app.supabase.com/), click `New project`. +From your [Supabase dashboard](https://supabase.com/dashboard/), click `New project`. Enter a `Name` for your Supabase project and enter or generate a secure `Database Password`, then click `Create new project`. diff --git a/apps/docs/pages/guides/integrations/cloudflare-workers.mdx b/apps/docs/pages/guides/integrations/cloudflare-workers.mdx index 352e8d9590f..1e84255cc52 100644 --- a/apps/docs/pages/guides/integrations/cloudflare-workers.mdx +++ b/apps/docs/pages/guides/integrations/cloudflare-workers.mdx @@ -29,7 +29,7 @@ You should now see the database integration options. On the Supabase card, click After reviewing and accepting the terms, you will be shown the option to connect and a Supabase popup should appear. -Follow the flow by selecting your Supabase Org and the Project you wish to connect to. If you don't have any projects yet, head over to the [Supabase Dashboard](https://app.supabase.com) to create one. +Follow the flow by selecting your Supabase Org and the Project you wish to connect to. If you don't have any projects yet, head over to the [Supabase Dashboard](https://supabase.com/dashboard) to create one. ![Cloudflare Dashboard 5](/docs/img/guides/integrations/cloudflare-integration/5.png) @@ -68,7 +68,7 @@ export default { } ``` -The snippet above assumes you already have a `countries` table. Run the following in the [SQL Editor in the Supabase Dashboard](https://app.supabase.com/project/_/sql) if you wish to install this demo schema: +The snippet above assumes you already have a `countries` table. Run the following in the [SQL Editor in the Supabase Dashboard](https://supabase.com/dashboard/project/_/sql) if you wish to install this demo schema: ```sql create table countries ( diff --git a/apps/docs/pages/guides/integrations/fezto.mdx b/apps/docs/pages/guides/integrations/fezto.mdx index 60007bc3ed3..7d4aea901e3 100644 --- a/apps/docs/pages/guides/integrations/fezto.mdx +++ b/apps/docs/pages/guides/integrations/fezto.mdx @@ -20,7 +20,7 @@ export const meta = { # Setup -In the [Supabase control panel](https://app.supabase.com/), open your project and click the Settings cog icon, and then "API". +In the [Supabase control panel](https://supabase.com/dashboard/), open your project and click the Settings cog icon, and then "API". You will need: 1. From the Project URL copy the project ID from https://your-project-id.supabase.co diff --git a/apps/docs/pages/guides/integrations/forestadmin.mdx b/apps/docs/pages/guides/integrations/forestadmin.mdx index 910a42f3473..9cad5468d67 100644 --- a/apps/docs/pages/guides/integrations/forestadmin.mdx +++ b/apps/docs/pages/guides/integrations/forestadmin.mdx @@ -23,7 +23,7 @@ If you already have a Supabase project set up, simply go to the Project Settings ![supabase-db-credentials](/docs/img/guides/integrations/forestadmin/supabase-db-credentials.png) -If you don't have anything set up on Supabase yet, you can [create a Project](https://app.supabase.com/new/_) in just a few seconds. Once done, just go to the Database tab and create your first table. +If you don't have anything set up on Supabase yet, you can [create a Project](https://supabase.com/dashboard/new/_) in just a few seconds. Once done, just go to the Database tab and create your first table. ![supabase-db-create-table](/docs/img/guides/integrations/forestadmin/supabase-db-create-table.png) diff --git a/apps/docs/pages/guides/integrations/illa.mdx b/apps/docs/pages/guides/integrations/illa.mdx index 3dbe3b53616..e06768370cc 100644 --- a/apps/docs/pages/guides/integrations/illa.mdx +++ b/apps/docs/pages/guides/integrations/illa.mdx @@ -11,7 +11,7 @@ This tutorial outlines the process of creating an Admin Panel using ILLA Builder ### Step 1: Set up your Back end on Supabase -On the [Supabase dashboard](https://app.supabase.com/projects), click `New project` and set the name to adminPanel. +On the [Supabase dashboard](https://supabase.com/dashboard/projects), click `New project` and set the name to adminPanel. ![Create Supabase Project for ILLA Admin Panel](/docs/img/guides/integrations/illa/supabase-illa-project.png) @@ -41,7 +41,7 @@ As seen in the below screenshot, we have built a simple admin panel. ### Step 3: Connect to Supabase and config CRUD -Note down the database connection information under [Project Settings](https://app.supabase.com/project/hdcfnsxpwwgboqomdrhp/settings/database) in Supabase. +Note down the database connection information under [Project Settings](https://supabase.com/dashboard/project/hdcfnsxpwwgboqomdrhp/settings/database) in Supabase. ![Note information in supabase](/docs/img/guides/integrations/illa/supabase-information.png) diff --git a/apps/docs/pages/guides/integrations/passage.mdx b/apps/docs/pages/guides/integrations/passage.mdx index 46ebc61ba1e..11645eec8a2 100644 --- a/apps/docs/pages/guides/integrations/passage.mdx +++ b/apps/docs/pages/guides/integrations/passage.mdx @@ -15,7 +15,7 @@ The full code example for this guide can be found [here](https://github.com/pass Next.js is a web application framework built on top of React. We will be using it for this example, as it allows us to write server-side logic within our application. Passage’s [frontend elements](https://docs.passage.id/frontend/passage-element) and [Node.js SDK](https://docs.passage.id/backend/overview/node) are designed to work for Next.js. -For this guide, you will need a Passage account which can be created [here](https://console.passage.id/register), and a Supabase account which can be created [here](https://app.supabase.com/). +For this guide, you will need a Passage account which can be created [here](https://console.passage.id/register), and a Supabase account which can be created [here](https://supabase.com/dashboard/). ## 1. Create a Passage application In the [Passage Console](https://console.passage.id), create a new application with the following configuration: @@ -31,7 +31,7 @@ In the [Passage Console](https://console.passage.id), create a new application w ## 2. Create and configure a Supabase project #### Create a new project -In the [Supabase dashboard](https://app.supabase.com/), click `New Project`. +In the [Supabase dashboard](https://supabase.com/dashboard/), click `New Project`. Enter a name for your project and create a secure database password. #### Create a table schema diff --git a/apps/docs/pages/guides/integrations/picket.mdx b/apps/docs/pages/guides/integrations/picket.mdx index 55f7c755e57..32c7eeb4155 100644 --- a/apps/docs/pages/guides/integrations/picket.mdx +++ b/apps/docs/pages/guides/integrations/picket.mdx @@ -34,7 +34,7 @@ We're done for now! We'll revisit this project when we are setting up environmen ## Step 2: Create a Supabase Project -From your [Supabase dashboard](https://app.supabase.com/), click `New project`. +From your [Supabase dashboard](https://supabase.com/dashboard/), click `New project`. Enter a `Name` for your Supabase project. @@ -50,7 +50,7 @@ Click `Create new project`. ### Create a `todos` Table -From the sidebar menu in the [Supabase dashboard](https://app.supabase.com/), click `Table editor`, then `New table`. +From the sidebar menu in the [Supabase dashboard](https://supabase.com/dashboard/), click `Table editor`, then `New table`. Enter `todos` as the `Name` field. diff --git a/apps/docs/pages/guides/integrations/plasmic.mdx b/apps/docs/pages/guides/integrations/plasmic.mdx index 38440d5f194..b9aff882039 100644 --- a/apps/docs/pages/guides/integrations/plasmic.mdx +++ b/apps/docs/pages/guides/integrations/plasmic.mdx @@ -27,7 +27,7 @@ At a high level, ## Step 1: Set up your Backend on Supabase -- On the [Supabase dashboard](https://app.supabase.com/), click `New project` and set the name of the project. +- On the [Supabase dashboard](https://supabase.com/dashboard/), click `New project` and set the name of the project. By default, Supabase will already be set up for user signups with email, with users being stored in a `users` table. ![create-project-supabase](/docs/img/guides/integrations/plasmic/create-project-supabase-01.png) diff --git a/apps/docs/pages/guides/integrations/snaplet.mdx b/apps/docs/pages/guides/integrations/snaplet.mdx index 74297c2670b..4ebd21ea77e 100644 --- a/apps/docs/pages/guides/integrations/snaplet.mdx +++ b/apps/docs/pages/guides/integrations/snaplet.mdx @@ -74,7 +74,7 @@ Create a snapshot of your production database. This is what you’re going to re Your data target is where you want Snaplet to restore the captured snapshot of your production project. This would most likely be either your staging or developer Supabase project. If you don’t already have a developer database setup on Supabase, create a new data target by setting up a new project on Supabase. To create a new project, follow the steps below: -1. Go to [app.supabase.com](https://app.supabase.com/) +1. Go to [supabase.com/dashboard](https://supabase.com/dashboard/) 2. Click on “new project” 3. Enter your project details 4. Wait for the new database to launch diff --git a/apps/docs/pages/guides/integrations/stytch.mdx b/apps/docs/pages/guides/integrations/stytch.mdx index a76eacfeaa3..9b8b25f2516 100644 --- a/apps/docs/pages/guides/integrations/stytch.mdx +++ b/apps/docs/pages/guides/integrations/stytch.mdx @@ -39,7 +39,7 @@ After pressing **Confirm**, the redirect URLs dashboard will update to show your ## Step 2: Create a Supabase project -From your [Supabase dashboard](https://app.supabase.com/), click **New project**. +From your [Supabase dashboard](https://supabase.com/dashboard/), click **New project**. Enter a `Name` for your Supabase project. @@ -51,7 +51,7 @@ Click **Create new project**. It may take a couple minutes for your project to b ## Step 3: Creating data in Supabase -Once your Supabase project is provisioned, click Table editor, then New table. This tool is available from the sidebar menu in the [Supabase dashboard](https://app.supabase.com/). +Once your Supabase project is provisioned, click Table editor, then New table. This tool is available from the sidebar menu in the [Supabase dashboard](https://supabase.com/dashboard/). Enter `expenses` as the **Name** field. diff --git a/apps/docs/pages/guides/integrations/supertokens.mdx b/apps/docs/pages/guides/integrations/supertokens.mdx index 1d23791f1d9..d38b4c56f4f 100644 --- a/apps/docs/pages/guides/integrations/supertokens.mdx +++ b/apps/docs/pages/guides/integrations/supertokens.mdx @@ -19,7 +19,7 @@ You can find a demo app using SuperTokens, Supabase and Nexts.js on [Github](htt ## Step 1: Create a new Supabase project -From your [Supabase dashboard](https://app.supabase.com/), click `New project`. +From your [Supabase dashboard](https://supabase.com/dashboard/), click `New project`. Enter a `Name` for your Supabase project. @@ -33,7 +33,7 @@ Click `Create new project`. ## Step 2: Creating tables in Supabase -From the sidebar menu in the [Supabase dashboard](https://app.supabase.com/), click `Table editor`, then `New table`. +From the sidebar menu in the [Supabase dashboard](https://supabase.com/dashboard/), click `Table editor`, then `New table`. Enter `users` as the `Name` field. diff --git a/apps/docs/pages/guides/integrations/vercel.mdx b/apps/docs/pages/guides/integrations/vercel.mdx index dc147aa119e..451eba1fe63 100644 --- a/apps/docs/pages/guides/integrations/vercel.mdx +++ b/apps/docs/pages/guides/integrations/vercel.mdx @@ -13,7 +13,7 @@ If you don’t have a Vercel account, create one [here](https://vercel.com/signu ## Step 1: Create a Supabase project -This guide could use an existing Supabase project, but to create the `todo` demo from scratch, navigate to [Supabase](https://app.supabase.com/), click `Sign In` and authenticate with GitHub to login or register a new account. +This guide could use an existing Supabase project, but to create the `todo` demo from scratch, navigate to [Supabase](https://supabase.com/dashboard/), click `Sign In` and authenticate with GitHub to login or register a new account. From the Supabase dashboard, click `New project` and select an organization. diff --git a/apps/docs/pages/guides/platform.mdx b/apps/docs/pages/guides/platform.mdx index 7a38fa2b167..9740bc439b6 100644 --- a/apps/docs/pages/guides/platform.mdx +++ b/apps/docs/pages/guides/platform.mdx @@ -9,7 +9,7 @@ export const meta = { Supabase is a hosted platform which makes it very simple to get started without needing to manage any infrastructure. -Visit [app.supabase.com](https://app.supabase.com) and sign in to start creating projects. +Visit [supabase.com/dashboard](https://supabase.com/dashboard) and sign in to start creating projects. ## Projects diff --git a/apps/docs/pages/guides/platform/access-control.mdx b/apps/docs/pages/guides/platform/access-control.mdx index fd33555ad4e..9ec8c238436 100644 --- a/apps/docs/pages/guides/platform/access-control.mdx +++ b/apps/docs/pages/guides/platform/access-control.mdx @@ -22,12 +22,12 @@ Create a separate organization if you need to restrict access to certain project ## Manage team members To invite others to collaborate, visit your organization's team settings in the -[Dashboard](https://app.supabase.com/projects) to send an invite link to +[Dashboard](https://supabase.com/dashboard/projects) to send an invite link to another user's email. The invite expires after 24 hours. ### Transferring ownership of an organization -Each Supabase organization can have one or more owners. If you no longer want be an owner of an organization, click **Leave team** in the members view (`https://app.supabase.com/org//settings#team`) of your organization. +Each Supabase organization can have one or more owners. If you no longer want be an owner of an organization, click **Leave team** in the members view (`https://supabase.com/dashboard/org//settings#team`) of your organization. However, you can only leave an organization when there is _at least one other owner_. If you are transferring ownership of your organization to someone else, you will need to invite the new member with the **Owner** role. You can leave the organization after they've accepted the invitation. diff --git a/apps/docs/pages/guides/platform/backups.mdx b/apps/docs/pages/guides/platform/backups.mdx index 21aef92557b..3385c859537 100644 --- a/apps/docs/pages/guides/platform/backups.mdx +++ b/apps/docs/pages/guides/platform/backups.mdx @@ -43,7 +43,7 @@ The PostgreSQL utility [pg_dumpall](https://www.postgresql.org/docs/current/app- ![Scheduled backups dashboard](/docs/img/backups-daily-dashboard.png) -You can access daily backups in the [Scheduled backups](https://app.supabase.com/project/_/database/backups/scheduled) settings in the Dashboard. Pro plan projects can access the last 7 days' worth of daily backups while Enterprise plan projects can access up to 30 days' worth of daily backups. Users can restore their project to any one of the backups or download them as a zipped SQL file. +You can access daily backups in the [Scheduled backups](https://supabase.com/dashboard/project/_/database/backups/scheduled) settings in the Dashboard. Pro plan projects can access the last 7 days' worth of daily backups while Enterprise plan projects can access up to 30 days' worth of daily backups. Users can restore their project to any one of the backups or download them as a zipped SQL file. ### Restoration Process [#daily-backups-restoration-process] @@ -77,7 +77,7 @@ By default, WAL files are backed up at two minute intervals. If these files cros ![PITR dashboard](/docs/img/backups-pitr-dashboard.png) -You can access PITR in the [Point in Time](https://app.supabase.com/project/_/database/backups/pitr) settings in the Dashboard. The recovery period of a project is indicated by the earliest and latest points of recoveries displayed in your preferred timezone. If need be, the maximum amount of this recovery period can be modified accordingly. +You can access PITR in the [Point in Time](https://supabase.com/dashboard/project/_/database/backups/pitr) settings in the Dashboard. The recovery period of a project is indicated by the earliest and latest points of recoveries displayed in your preferred timezone. If need be, the maximum amount of this recovery period can be modified accordingly. Note that the latest restore point of the project could be significantly far from the current time. This occurs when there has not been any recent activity in the database, and therefore no WAL file backups have been made recently. This is perfectly fine as the state of the database at the latest point of recovery would still be indicative of the state of the database at the current time given that no transactions have been made in between. diff --git a/apps/docs/pages/guides/platform/compute-add-ons.mdx b/apps/docs/pages/guides/platform/compute-add-ons.mdx index 1ef540c6ee7..d3bd4ad528a 100644 --- a/apps/docs/pages/guides/platform/compute-add-ons.mdx +++ b/apps/docs/pages/guides/platform/compute-add-ons.mdx @@ -31,7 +31,7 @@ All Postgres instances on Supabase are dedicated applications running inside ded ## Compute upgrades [#upgrades] -When considering compute upgrades, assess whether your bottlenecks are hardware-constrained or software-constrained. For example, you may want to look into [optimizing the number of connections](/docs/guides/platform/performance#optimizing-the-number-of-connections) or [examining query performance](/docs/guides/platform/performance#examining-query-performance). When you're happy with your Postgres instance's performance, then you can focus on additional compute resources. For example, you can load test your application in staging to understand your compute requirements. You can also start out on a smaller tier, [create a report](https://app.supabase.com/project/_/reports) in the Dashboard to monitor your CPU utilization, and upgrade later as needed +When considering compute upgrades, assess whether your bottlenecks are hardware-constrained or software-constrained. For example, you may want to look into [optimizing the number of connections](/docs/guides/platform/performance#optimizing-the-number-of-connections) or [examining query performance](/docs/guides/platform/performance#examining-query-performance). When you're happy with your Postgres instance's performance, then you can focus on additional compute resources. For example, you can load test your application in staging to understand your compute requirements. You can also start out on a smaller tier, [create a report](https://supabase.com/dashboard/project/_/reports) in the Dashboard to monitor your CPU utilization, and upgrade later as needed ## Disk IO @@ -58,7 +58,7 @@ Smaller compute instances can burst up to their largest throughput and IOPS for If you need consistent disk performance, choose the 4XL or larger compute add-on which has the same baseline and maximum disk throughput and IOPS. -If you're unsure of how much throughput or IOPS your application requires, you can load test your project and inspect these [metrics in the Dashboard](https://app.supabase.com/project/_/reports). If the `Disk IO % consumed` stat is more than 1%, it indicates that your workload has burst beyond the baseline IO throughput during the day. If this metric goes to 100%, the workload has used up all available disk budget and will revert to baseline performance. Projects that use any disk budget are good candidates for upgrading to a larger compute add-on with higher baseline throughput. +If you're unsure of how much throughput or IOPS your application requires, you can load test your project and inspect these [metrics in the Dashboard](https://supabase.com/dashboard/project/_/reports). If the `Disk IO % consumed` stat is more than 1%, it indicates that your workload has burst beyond the baseline IO throughput during the day. If this metric goes to 100%, the workload has used up all available disk budget and will revert to baseline performance. Projects that use any disk budget are good candidates for upgrading to a larger compute add-on with higher baseline throughput. export const Page = ({ children }) => diff --git a/apps/docs/pages/guides/platform/custom-domains.mdx b/apps/docs/pages/guides/platform/custom-domains.mdx index f968556bde6..d885515b0e7 100644 --- a/apps/docs/pages/guides/platform/custom-domains.mdx +++ b/apps/docs/pages/guides/platform/custom-domains.mdx @@ -7,7 +7,7 @@ export const meta = { video: 'https://www.youtube.com/v/6rcGnW_Mh-0', } -Custom domains allow you to present a branded experience to your users. Custom domains are available as a [add-on for projects on a paid plan](https://app.supabase.com/project/_/settings/billing/subscription?panel=customDomain). Setting up a custom domain requires [Owner or Admin permissions](/docs/guides/platform/access-control#manage-team-members) for the project. Currently, you must use a subdomain (e.g., `api.example.com`, rather than `example.com`) for the purposes of this guide. +Custom domains allow you to present a branded experience to your users. Custom domains are available as a [add-on for projects on a paid plan](https://supabase.com/dashboard/project/_/settings/billing/subscription?panel=customDomain). Setting up a custom domain requires [Owner or Admin permissions](/docs/guides/platform/access-control#manage-team-members) for the project. Currently, you must use a subdomain (e.g., `api.example.com`, rather than `example.com`) for the purposes of this guide.
    -
    - -## Install `supabase-js` Client - -```bash -npm install @supabase/supabase-js -``` - -## Cursor Positions - -[Broadcast](/docs/guides/realtime/broadcast) allows a client to send messages and multiple clients to receive the messages. The broadcasted messages are ephemeral. They are not persisted to the database and are directly relayed through the Realtime servers. This is ideal for sending information like cursor positions where minimal latency is important, but persisting them is not. - -In [multiplayer.dev](https://multiplayer.dev), client's cursor positions are sent to other clients in the room. However, cursor positions will be randomly generated for this example. - -You need to get the public `anon` access token from your project's [API settings](https://supabase.com/dashboard/project/_/settings/api). Then you can set up the Supabase client and start sending a client's cursor positions to other clients in channel `room1`: - -```js -const { createClient } = require('@supabase/supabase-js') - -const supabase = createClient('https://your-project-ref.supabase.co', 'anon-key', { - realtime: { - params: { - eventsPerSecond: 10, - }, - }, -}) - -// Channel name can be any string. -// Create channels with the same name for both the broadcasting and receiving clients. -const channel = supabase.channel('room1') - -// Subscribe registers your client with the server -channel.subscribe((status) => { - if (status === 'SUBSCRIBED') { - // now you can start broadcasting cursor positions - setInterval(() => { - channel.send({ - type: 'broadcast', - event: 'cursor-pos', - payload: { x: Math.random(), y: Math.random() }, - }) - console.log(status) - }, 100) - } -}) -``` - - - -JavaScript client has a default rate limit of 1 Realtime event every 100 milliseconds that's configured by `eventsPerSecond`. - - - -Another client can subscribe to channel `room1` and receive cursor positions: - -```js -// Supabase client setup - -// Listen to broadcast messages. -supabase - .channel('room1') - .on('broadcast', { event: 'cursor-pos' }, (payload) => console.log(payload)) - .subscribe((status) => { - if (status === 'SUBSCRIBED') { - // your callback function will now be called with the messages broadcast by the other client - } - }) -``` - - - -`type` must be `broadcast` and the `event` must match for clients subscribed to the channel. - - - -## Roundtrip Latency - -You can also configure the channel so that the server must return an acknowledgement that it received the `broadcast` message. This is useful if you want to measure the roundtrip latency: - -```js -// Supabase client setup - -const channel = supabase.channel('calc-latency', { - config: { - broadcast: { ack: true }, - }, -}) - -channel.subscribe(async (status) => { - if (status === 'SUBSCRIBED') { - const begin = performance.now() - - await channel.send({ - type: 'broadcast', - event: 'latency', - payload: {}, - }) - - const end = performance.now() - - console.log(`Latency is ${end - begin} milliseconds`) - } -}) -``` - -## Track and Display Which Users Are Online - -[Presence](/docs/guides/realtime/presence) stores and synchronize shared state across clients. The `sync` event is triggered whenever the shared state changes. The `join` event is triggered when new clients join the channel and `leave` event is triggered when clients leave. - -Each client can use the channel's `track` method to store an object in shared state. Each client can only track one object, and if `track` is called again by the same client, then the new object overwrites the previously tracked object in the shared state. You can use one client to track and display users who are online: - -```js -// Supabase client setup - -const channel = supabase.channel('online-users', { - config: { - presence: { - key: 'user1', - }, - }, -}) - -channel.on('presence', { event: 'sync' }, () => { - console.log('Online users: ', channel.presenceState()) -}) - -channel.on('presence', { event: 'join' }, ({ newPresences }) => { - console.log('New users have joined: ', newPresences) -}) - -channel.on('presence', { event: 'leave' }, ({ leftPresences }) => { - console.log('Users have left: ', leftPresences) -}) - -channel.subscribe(async (status) => { - if (status === 'SUBSCRIBED') { - const status = await channel.track({ online_at: new Date().toISOString() }) - console.log(status) - } -}) -``` - -Then you can use another client to add another user to the channel's Presence state: - -```js -// Supabase client setup - -const channel = supabase.channel('online-users', { - config: { - presence: { - key: 'user2', - }, - }, -}) - -// Presence event handlers setup - -channel.subscribe(async (status) => { - if (status === 'SUBSCRIBED') { - const status = await channel.track({ online_at: new Date().toISOString() }) - console.log(status) - } -}) -``` - -If a channel is set up without a presence key, the server generates a random UUID. `type` must be `presence` and `event` must be either `sync`, `join`, or `leave`. - -## Insert and Receive Persisted Messages - -[Postgres Changes](/docs/guides/realtime#postgres-changes) enables your client to insert, update, or delete database records and send the changes to clients. Create a `messages` table to keep track of messages created by users in specific rooms: - -```sql -create table messages ( - id serial primary key, - message text, - user_id text, - room_id text, - created_at timestamptz default now() -) - -alter table messages enable row level security; - -create policy "anon_ins_policy" -ON messages -for insert -to anon -with check (true); - -create policy "anon_sel_policy" -ON messages -for select -to anon -using (true); -``` - -If it doesn't already exist, create a `supabase_realtime` publication and add `messages` table to the publication: - -```sql -begin; - -- remove the supabase_realtime publication - drop publication if exists supabase_realtime; - - -- re-create the supabase_realtime publication with no tables and only for insert - create publication supabase_realtime with (publish = 'insert'); -commit; - --- add a table to the publication -alter publication supabase_realtime add table messages; -``` - -You can then have a client listen for changes on the `messages` table for a specific room and send and receive persisted messages: - -```js -// Supabase client setup - -const channel = supabase.channel('db-messages') - -const roomId = 'room1' -const userId = 'user1' - -channel.on( - 'postgres_changes', - { - event: 'INSERT', - schema: 'public', - table: 'messages', - filter: `room_id=eq.${roomId}`, - }, - (payload) => console.log(payload) -) - -channel.subscribe(async (status) => { - if (status === 'SUBSCRIBED') { - const res = await supabase.from('messages').insert({ - room_id: roomId, - user_id: userId, - message: 'Welcome to Realtime!', - }) - console.log(res) - } -}) -``` - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx b/apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx new file mode 100644 index 00000000000..8b78dabc533 --- /dev/null +++ b/apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx @@ -0,0 +1,275 @@ +import Layout from '~/layouts/DefaultGuideLayout' +import StepHikeCompact from '~/components/StepHikeCompact' + +export const meta = { + title: 'Broadcast', + subtitle: "Get up and running with Realtime's Broadcast feature", + breadcrumb: 'Realtime Broadcast Quickstart', +} + +Realtime Broadcast follows the [publish-subscribe pattern](https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern) where a client publishes messages to a channel based on a unique topic. For example, a user could send a message to a channel with topic `room-1`. + +Other clients can receive the message in real-time by subscribing to the channel with topic `room-1`. These clients can continue to receive messages as long as they continue to be online and subscribed to the same channel topic. + +A common use-case is sharing a user's cursor position with other clients in an online game. + +## Quick start + +Let's explore how to implement Realtime Broadcast so you can integrate it into your use case. + + + + + + + + Install the Supabase JavaScript client. + + + + + + ```bash + npm install @supabase/supabase-js + ``` + + + + + + + + + + This client will be used to listen for messages. + + Go to your Supabase project's [API Settings](https://supabase.com/dashboard/project/_/settings/api) and grab the `URL` and `anon` public API key. + + + + + + ```js + import { + createClient + } from '@supabase/supabase-js' + + const clientA = createClient( + 'https://.supabase.co', + '' + ) + ``` + + + + + + + + + + A channel's topic can be anything except for `'realtime'`. + + + + + + ```js + const channelA = clientA.channel('room-1') + ``` + + + + + + + + + + Specify the Broadcast event you want the `on` handler to listen for. The event name can be anything. + + + + + + ```js + channelA + .on( + 'broadcast', + { event: 'test' }, + (payload) => console.log(payload) + ) + .subscribe() + ``` + + + + + + + + + + This client will be used to send a message. + + + + + + ```js + const clientB = createClient( + 'https://.supabase.co', + '' + ) + ``` + + + + + + + + + + This channel's topic must match `channelA`'s. + + + + + + ```js + const channelB = clientB.channel('room-1') + ``` + + + + + + + + + + Subscribe to channel and send a message. + + The payload's `event` must match channelA's `event` in the `on` handler. + + + + + + ```js + channelB.subscribe((status) => { + if (status === 'SUBSCRIBED') { + channelB.send({ + type: 'broadcast', + event: 'test', + payload: { + message: 'hello, world' + }, + }) + } + }) + ``` + + + + + + + + + + `clientA` receives the message `clientB` sent. + + + + + + + +## Broadcast options + +There are additional Broadcast functionality that you can enable when creating a channel. + +### Self-send messages + +You can have a client send a message and then receive it by setting Broadcast's `self` config to `true`. + +```js +const channelC = clientC.channel('room-2', { + config: { + broadcast: { + self: true, + }, + }, +}) + +channelC.on('broadcast', { event: 'test-my-messages' }, (payload) => console.log(payload)) + +channelC.subscribe((status) => { + if (status === 'SUBSCRIBED') { + channelC.send({ + type: 'broadcast', + event: 'test-my-messages', + payload: { message: 'talking to myself' }, + }) + } +}) +``` + +### Acknowledge messages + +You can confirm that Realtime received your message by setting Broadcast's `ack` config to `true`. + +```js +const channelD = clientD.channel('room-3', { + config: { + broadcast: { + ack: true, + }, + }, +}) + +channelD.subscribe(async (status) => { + if (status === 'SUBSCRIBED') { + const resp = await channelD.send({ + type: 'broadcast', + event: 'acknowledge', + payload: {}, + }) + + console.log('resp', resp) + } +}) +``` + +If the `ack` config is not set to `true` when creating the channel, the promise returned by call to `channelD.send` will resolve immediately. + +## Client-side rate limit + +There is a default client-side rate limit that enables you to send 10 messages per second, or one message every 100 milliseconds. You can customize this when creating the client: + +```js +import { createClient } from '@supabase/supabase-js' + +const clientE = createClient('https://.supabase.co', '', { + realtime: { + params: { + eventsPerSecond: 20, + }, + }, +}) +``` + +By setting `eventsPerSecond` to 20, you can send one message every 50 milliseconds on a per client basis. + +Learn more by visiting the [Quotas](/docs/guides/realtime/quotas) section. + +## More Realtime Quickstarts + +- [Presence Quickstart](/docs/guides/realtime/quickstarts/presence) +- [Postgres Changes Quickstart](/docs/guides/realtime/quickstarts/postgres-changes) + +export const Page = ({ children }) => + +export default Page diff --git a/apps/docs/pages/guides/realtime/postgres-changes.mdx b/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx similarity index 54% rename from apps/docs/pages/guides/realtime/postgres-changes.mdx rename to apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx index 523855cd8ca..3a4e207b25f 100644 --- a/apps/docs/pages/guides/realtime/postgres-changes.mdx +++ b/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx @@ -12,108 +12,267 @@ Anyone with access to a valid JWT signed with the project's JWT secret is able t Clients can choose to receive `INSERT`, `UPDATE`, `DELETE`, or `*` (all) changes for all changes in a schema, a table in a schema, or a column's value in a table. Your clients should only listen to tables in the `public` schema and you must first enable the tables you want your clients to listen to. -Postgres Changes works out of the box for tables in the `public` schema. You can listen to tables in your private schemas by granting table `SELECT` permissions to the database role found in your access token. You can run a query similar to the following: +## Quick start -```sql -grant -select - on "private_schema"."table" to authenticated; -``` +Let's explore how to implement Realtime Postgres Changes so you can integrate it into your use case. - - We strongly encourage you to enable RLS and create policies for tables in private schemas. - Otherwise, any role you grant access to will have unfettered read access to the table. - + -## Replication Setup + + -You can do this in the [Replication](https://supabase.com/dashboard/project/_/database/replication) section in the Dashboard or with the [SQL editor](https://supabase.com/dashboard/project/_/sql): + [Create a new project](https://app.supabase.com) in the Supabase Dashboard. -```sql -begin; + After your project is ready, create a table in your Supabase database. You can do this with either the Table interface or the [SQL Editor](https://app.supabase.com/project/_/sql). --- remove the supabase_realtime publication -drop - publication if exists supabase_realtime; + --- re-create the supabase_realtime publication with no tables -create publication supabase_realtime; + -commit; + + --- add a table to the publication -alter - publication supabase_realtime add table messages; -``` + ```sql + -- Create a table called "todos" + -- with a column to store tasks. + create table todos ( + id serial primary key, + task text + ); + ``` -### Full `old` Record + + -By default, only `new` record changes are sent but if you want to receive the `old` record (previous values) whenever you `UPDATE` or `DELETE` a record, -you can set the `replica identity` of your table to `full`: + -```sql -alter table - messages replica identity full; -``` + + - + -RLS policies are not applied to `DELETE` statements. When RLS is enabled and `replica identity` is set to `full` on a table, the `old` record contains only the primary key(s). + -
    + -## Schema Changes + -To listen to all changes in the `public` schema: + Let's turn on Row Level Security for this table and allow anonymous access. -```js -const { createClient } = require('@supabase/supabase-js') + -const supabase = createClient(process.env.SUPABASE_URL, process.env.SUPABASE_KEY) + -/* - Channel name can be any string. - Event name can can be one of: - - INSERT - - UPDATE - - DELETE - - * -*/ -const channel = supabase - .channel('schema-db-changes') - .on( - 'postgres_changes', - { - event: '*', - schema: 'public', - }, - (payload) => console.log(payload) - ) - .subscribe() -``` + ```sql + -- Turn on security + alter table "todos" + enable row level security; -## Table Changes + -- Allow anonymous access + create policy "Allow anonymous access" + on todos + for select + to anon + using (true); + ``` -To listen to changes on a table in the `public` schema: + -```js -// Supabase client setup + -const channel = supabase - .channel('table-db-changes') - .on( - 'postgres_changes', - { - event: 'INSERT', - schema: 'public', - table: 'messages', - }, - (payload) => console.log(payload) - ) - .subscribe() -``` + + + -## Filter Changes + Go to your project's [Replication settings](https://supabase.com/dashboard/project/_/database/replication), and under `supabase_realtime`, toggle on the tables you want to listen to. + + + + + + + + + + Install the Supabase JavaScript client. + + + + + + ```bash + npm install @supabase/supabase-js + ``` + + + + + + + + + + This client will be used to listen to Postgres changes. + + + + + + ```js + import { + createClient + } from '@supabase/supabase-js' + + const client = createClient( + 'https://.supabase.co', + '' + ) + ``` + + + + + + + + + Listen to all changes in the `public` schema. + + + + + + ```js + /* + Channel name can be any string except 'realtime'. + Event name can can be one of: + - INSERT + - UPDATE + - DELETE + - * + */ + const channelA = client + .channel('schema-db-changes') + .on( + 'postgres_changes', + { + event: '*', + schema: 'public', + }, + (payload) => console.log(payload) + ) + .subscribe() + ``` + + + + + + Listen to all changes in the `todos` table. + + + + + + ```js + /* + Channel name can be any string except 'realtime'. + Event name can can be one of: + - INSERT + - UPDATE + - DELETE + - * + */ + const channelB = client + .channel('table-db-changes') + .on( + 'postgres_changes', + { + event: 'INSERT', + schema: 'public', + table: 'todos', + }, + (payload) => console.log(payload) + ) + .subscribe() + ``` + + + + + + Listen to changes in the `todos` table when a column's value equals a client-specified value. + + + + + + ```js + /* + Channel name can be any string except 'realtime'. + Event name can can be one of: + - INSERT + - UPDATE + - DELETE + - * + */ + const channelC = client + .channel('table-filter-changes') + .on( + 'postgres_changes', + { + event: 'INSERT', + schema: 'public', + table: 'todos', + filter: 'id=eq.1', + }, + (payload) => console.log(payload) + ) + .subscribe() + ``` + + + + + + Check out the full list of available filters [here](/docs/guides/realtime/quickstarts/postgres-changes#available-filters). + + + + + + + + + Now we can add some data to our table which will trigger `channelA`, `channelB`, and `channelC` event handlers. + + + + + + ```sql + insert into todos (task) + values + ('Change!'); + ``` + + + + + + + +## Available filters Realtime offers filters so you can specify the data your client receives at a more granular level. @@ -122,8 +281,6 @@ Realtime offers filters so you can specify the data your client receives at a mo To listen to changes when a column's value in a table equals a client-specified value: ```js -// Supabase client setup - const channel = supabase .channel('changes') .on( @@ -146,8 +303,6 @@ const channel = supabase To listen to changes when a column's value in a table does not equal a client-specified value: ```js -// Supabase client setup - const channel = supabase .channel('changes') .on( @@ -170,8 +325,6 @@ const channel = supabase To listen to changes when a column's value in a table is less than a client-specified value: ```js -// Supabase client setup - const channel = supabase .channel('changes') .on( @@ -196,8 +349,6 @@ const channel = supabase To listen to changes when a column's value in a table is less than or equal to a client-specified value: ```js -// Supabase client setup - const channel = supabase .channel('changes') .on( @@ -222,8 +373,6 @@ const channel = supabase To listen to changes when a column's value in a table is greater than a client-specified value: ```js -// Supabase client setup - const channel = supabase .channel('changes') .on( @@ -249,8 +398,6 @@ const channel = supabase To listen to changes when a column's value in a table is greater than or equal to a client-specified value: ```js -// Supabase client setup - const channel = supabase .channel('changes') .on( @@ -276,8 +423,6 @@ const channel = supabase To listen to changes when a column's value in a table equals any client-specified values: ```js -// Supabase client setup - const channel = supabase .channel('changes') .on( @@ -297,13 +442,11 @@ const channel = supabase This filter uses Postgres' `= ANY`. Realtime allows a maximum of 100 values for this filter. -## Combination Changes +## Combination changes To listen to different events and schema/tables/filters combinations with the same channel: ```js -// Supabase client setup - const channel = supabase .channel('db-changes') .on( @@ -328,11 +471,40 @@ const channel = supabase .subscribe() ``` -## Custom Tokens +## Full `old` record + +By default, only `new` record changes are sent but if you want to receive the `old` record (previous values) whenever you `UPDATE` or `DELETE` a record, +you can set the `replica identity` of your table to `full`: + +```sql +alter table + messages replica identity full; +``` + + + +RLS policies are not applied to `DELETE` statements. When RLS is enabled and `replica identity` is set to `full` on a table, the `old` record contains only the primary key(s). + + + +## Private schemas + +Postgres Changes works out of the box for tables in the `public` schema. You can listen to tables in your private schemas by granting table `SELECT` permissions to the database role found in your access token. You can run a query similar to the following: + +```sql +grant select on "non_private_schema"."some_table" to authenticated; +``` + + + We strongly encourage you to enable RLS and create policies for tables in private schemas. + Otherwise, any role you grant access to will have unfettered read access to the table. + + +## Custom tokens You may choose to sign your own tokens to customize claims that can be checked in your RLS policies. -Your project JWT secret is found with your [Project API keys](https://supabase.com/dashboard/project/_/settings/api) in your dashboard. +Your project JWT secret is found with your [Project API keys](https://app.supabase.com/project/_/settings/api) in your dashboard. Do not expose the `service_role` token on the client because the role is authorized to bypass @@ -364,7 +536,7 @@ const channel = supabase .subscribe() ``` -### Refreshed Tokens +### Refreshed tokens You will need to refresh tokens on your own, but once generated, you can pass them to Realtime. @@ -376,6 +548,11 @@ For example, if you're using the `supabase-js` `v2` client then you can pass you supabase.realtime.setAuth('fresh-token') ``` +## More Realtime Quickstarts + +- [Broadcast Quickstart](/docs/guides/realtime/quickstarts/broadcast) +- [Presence Quickstart](/docs/guides/realtime/quickstarts/presence) + export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/realtime/quickstarts/presence.mdx b/apps/docs/pages/guides/realtime/quickstarts/presence.mdx new file mode 100644 index 00000000000..ad89bc70f83 --- /dev/null +++ b/apps/docs/pages/guides/realtime/quickstarts/presence.mdx @@ -0,0 +1,273 @@ +import Layout from '~/layouts/DefaultGuideLayout' +import StepHikeCompact from '~/components/StepHikeCompact' + +export const meta = { + title: 'Presence', + subtitle: "Get up and running with Realtime's Presence feature", + breadcrumb: 'Realtime Presence Quickstart', +} + +Presence utilizes an in-memory conflict-free replicated data type (CRDT) to track and synchronize shared state in an eventually consistent manner. It computes the difference between existing state and new state changes and sends the necessary updates to clients via Broadcast. + +When a new client subscribes to a channel, it will immediately receive the channel's latest state in a single message instead of waiting for all other clients to send their individual states. + +Clients are free to come-and-go as they please, and as long as they are all subscribed to the same channel then they will all have the same Presence state as each other. + +The neat thing about Presence is that if a client is suddenly disconnected (for example, they go offline), their state will be automatically removed from the shared state. If you've ever tried to build an “I'm online” feature which handles unexpected disconnects, you'll appreciate how useful this is. + +## Quick start + +Let's explore how to implement Realtime Presence so you can integrate it into your use case. + + + + + + + + Install the Supabase JavaScript client. + + + + + + ```bash + npm install @supabase/supabase-js + ``` + + + + + + + + + + This client will be used to track Presence state as new clients join and leave the channel. + + Go to your Supabase project's [API Settings](https://supabase.com/dashboard/project/_/settings/api) and grab the `URL` and `anon` public API key. + + + + + + ```js + import { + createClient + } from '@supabase/supabase-js' + + const clientA = createClient( + 'https://.supabase.co', + '' + ) + ``` + + + + + + + + + + A channel's topic can be anything except for `'realtime'`. + + + + + + ```js + const channelA = clientA.channel('room-1') + ``` + + + + + + + + + + Listen to the `sync`, `join`, and `leave` events triggered whenever any client joins or leaves the channel or changes their slice of state. + + Once `clientA` successfully tracks its state, it will trigger its own `sync` and `join` event handlers. + + + + + + ```js + channelA + .on( + 'presence', + { event: 'sync' }, + () => { + const newState = channelA.presenceState() + console.log('sync', newState) + } + ) + .on( + 'presence', + { event: 'join' }, + ({ key, newPresences }) => { + console.log('join', key, newPresences) + } + ) + .on( + 'presence', + { event: 'leave' }, + ({ key, leftPresences }) => { + console.log('leave', key, leftPresences) + } + ) + .subscribe(async (status) => { + if (status === 'SUBSCRIBED') { + const presenceTrackStatus = await channelA.track({ + user: 'user-1', + online_at: new Date().toISOString(), + }) + console.log(presenceTrackStatus) + } + }) + ``` + + + + + + + + + + This client will add to and remove from shared state so other clients can be notified of changes to Presence state. + + + + + + ```js + const clientB = createClient( + 'https://.supabase.co', + '' + ) + ``` + + + + + + + + + + This channel's topic must match `channelA`'s. + + + + + + ```js + const channelB = clientB.channel('room-1') + ``` + + + + + + + + + + Subscribe to channel and add to state. + + This will trigger `clientA`'s `sync` and `join` event handlers. + + + + + + ```js + channelB.subscribe(async (status) => { + if (status === 'SUBSCRIBED') { + const presenceTrackStatus = await channelA.track({ + user: 'user-2', + online_at: new Date().toISOString(), + }) + console.log(presenceTrackStatus) + } + }) + ``` + + + + + + + + + + This will trigger `clientA`'s `sync` and `leave` event handlers. + + + + + + ```js + const untrackPresence = async () => { + const presenceUntrackStatus = await channelB.untrack() + console.log(presenceUntrackStatus) + } + + untrackPresence() + ``` + + + + + + + +## Presence Key + +By default, Presence will generate an `UUIDv1` key on the server to uniquely track a client channel's state but you may pass Presence a custom key when creating the channel. + +```js +import { createClient } from '@supabase/supabase-js' + +const channelC = supabase.channel('test', { + config: { + presence: { + key: 'userId-123', + }, + }, +}) +``` + +## Client-Side Rate Limit + +There is a default client-side rate limit that enables you to send 10 messages per second, or one message every 100 milliseconds. You can customize this when creating the client: + +```js +import { createClient } from '@supabase/supabase-js' + +const supabase = createClient('https://.supabase.co', '', { + realtime: { + params: { + eventsPerSecond: 5, + }, + }, +}) +``` + +By setting `eventsPerSecond` to 5, you can send one message every 200 milliseconds on a per client basis. + +Learn more by visiting the [Quotas](/docs/guides/realtime/quotas) section. + +## More Realtime Quickstarts + +- [Broadcast Quickstart](/docs/guides/realtime/quickstarts/broadcast) +- [Postgres Changes Quickstart](/docs/guides/realtime/quickstarts/postgres-changes) + +export const Page = ({ children }) => + +export default Page diff --git a/apps/docs/pages/guides/realtime/quotas.mdx b/apps/docs/pages/guides/realtime/quotas.mdx index a27fc95755c..8f9ec1e6121 100644 --- a/apps/docs/pages/guides/realtime/quotas.mdx +++ b/apps/docs/pages/guides/realtime/quotas.mdx @@ -32,7 +32,7 @@ Beyond the Free and Pro plan you can customize your quotas by [contacting suppor Some basic WebSocket message rate limiting is implemented client-side. -For example, the [multiplayer.dev demo](/docs/guides/realtime/quickstart#cursor-positions) instantiates the Supabase client with an `eventsPerSecond` parameter. +For example, the [multiplayer.dev](https://multiplayer.dev) instantiates the Supabase client with an `eventsPerSecond` parameter. ## Quota Errors diff --git a/apps/docs/pages/guides/storage/quickstart.mdx b/apps/docs/pages/guides/storage/quickstart.mdx index 15421921b23..090dabb2690 100644 --- a/apps/docs/pages/guides/storage/quickstart.mdx +++ b/apps/docs/pages/guides/storage/quickstart.mdx @@ -7,7 +7,7 @@ export const meta = { sidebar_label: 'Quickstart', } -This guide shows the basic functionality of Supabase Storage. Find a full [example application on GitHub](https://github.com/supabase/supabase/tree/master/examples/user-management/nextjs-ts-user-management) or deploy it with [Vercel for a preview](https://vercel.com/new/git/external?repository-url=https%3A%2F%2Fgithub.com%2Fsupabase%2Fsupabase%2Ftree%2Fmaster%2Fexamples%2Fuser-management%2Fnextjs-ts-user-management&project-name=supabase-user-management&repository-name=supabase-user-management&demo-title=Supabase%20User%20Management&demo-description=An%20example%20web%20app%20using%20Supabase%20and%20Next.js&demo-url=https%3A%2F%2Fsupabase-nextjs-ts-user-management.vercel.app&demo-image=https%3A%2F%2Fi.imgur.com%2FZ3HkQqe.png&integration-ids=oac_jUduyjQgOyzev1fjrW83NYOv&external-id=nextjs-user-management). +This guide shows the basic functionality of Supabase Storage. Find a full [example application on GitHub](https://github.com/supabase/supabase/tree/master/examples/user-management/nextjs-user-management) or deploy it with [Vercel for a preview](https://vercel.com/new/git/external?repository-url=https%3A%2F%2Fgithub.com%2Fsupabase%2Fsupabase%2Ftree%2Fmaster%2Fexamples%2Fuser-management%2Fnextjs-ts-user-management&project-name=supabase-user-management&repository-name=supabase-user-management&demo-title=Supabase%20User%20Management&demo-description=An%20example%20web%20app%20using%20Supabase%20and%20Next.js&demo-url=https%3A%2F%2Fsupabase-nextjs-ts-user-management.vercel.app&demo-image=https%3A%2F%2Fi.imgur.com%2FZ3HkQqe.png&integration-ids=oac_jUduyjQgOyzev1fjrW83NYOv&external-id=nextjs-user-management). diff --git a/apps/www/lib/redirects.js b/apps/www/lib/redirects.js index e41861d6bcf..17b3d26ff4e 100644 --- a/apps/www/lib/redirects.js +++ b/apps/www/lib/redirects.js @@ -2041,4 +2041,24 @@ module.exports = [ source: '/docs/guides/realtime/extensions/postgres-changes', destination: '/docs/guides/realtime/postgres-changes', }, + { + permanent: true, + source: '/docs/guides/realtime/broadcast', + destination: '/docs/guides/realtime/quickstarts/broadcast', + }, + { + permanent: true, + source: '/docs/guides/realtime/presence', + destination: '/docs/guides/realtime/quickstarts/presence', + }, + { + permanent: true, + source: '/docs/guides/realtime/postgres-changes', + destination: '/docs/guides/realtime/quickstarts/postgres-changes', + }, + { + permanent: true, + source: '/docs/guides/realtime/quickstart', + destination: '/docs/guides/realtime/quickstarts/broadcast', + }, ] From 6c86f0b6a92ddc56d75d789ebd133b360f14c8d3 Mon Sep 17 00:00:00 2001 From: Wen Bo Xie <5532241+w3b6x9@users.noreply.github.com> Date: Thu, 29 Jun 2023 13:55:06 -0700 Subject: [PATCH 174/694] Update apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx Co-authored-by: Greg Richardson --- apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx b/apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx index 8b78dabc533..db4089fb156 100644 --- a/apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx +++ b/apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx @@ -11,7 +11,7 @@ Realtime Broadcast follows the [publish-subscribe pattern](https://en.wikipedia. Other clients can receive the message in real-time by subscribing to the channel with topic `room-1`. These clients can continue to receive messages as long as they continue to be online and subscribed to the same channel topic. -A common use-case is sharing a user's cursor position with other clients in an online game. +An example use-case is sharing a user's cursor position with other clients in an online tool or game. ## Quick start From e1fae4eeb8d623f8007a9e227f57418c84ec488b Mon Sep 17 00:00:00 2001 From: Wen Bo Xie <5532241+w3b6x9@users.noreply.github.com> Date: Thu, 29 Jun 2023 13:56:56 -0700 Subject: [PATCH 175/694] Update apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx Co-authored-by: Greg Richardson --- apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx b/apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx index db4089fb156..7f740d219b3 100644 --- a/apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx +++ b/apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx @@ -193,7 +193,7 @@ There are additional Broadcast functionality that you can enable when creating a ### Self-send messages -You can have a client send a message and then receive it by setting Broadcast's `self` config to `true`. +You can have a client broadcast a message and then receive the same message by setting Broadcast's `self` config to `true`. Without this, broadcast messages are only sent to other clients. ```js const channelC = clientC.channel('room-2', { From e1165dc7ddd4d20bd05dd355ff9392f79482fbda Mon Sep 17 00:00:00 2001 From: Wen Bo Xie <5532241+w3b6x9@users.noreply.github.com> Date: Thu, 29 Jun 2023 13:57:20 -0700 Subject: [PATCH 176/694] Update apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx Co-authored-by: Greg Richardson --- apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx b/apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx index 7f740d219b3..64793b52aa2 100644 --- a/apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx +++ b/apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx @@ -243,7 +243,7 @@ channelD.subscribe(async (status) => { }) ``` -If the `ack` config is not set to `true` when creating the channel, the promise returned by call to `channelD.send` will resolve immediately. +Use this to guarantee that the server has received the message before resolving `channelD.send`'s promise. If the `ack` config is not set to `true` when creating the channel, the promise returned by `channelD.send` will resolve immediately. ## Client-side rate limit From e0eeba7e67378d3b3171e6d4c007e890199c7d9b Mon Sep 17 00:00:00 2001 From: Wen Bo Xie <5532241+w3b6x9@users.noreply.github.com> Date: Thu, 29 Jun 2023 14:03:42 -0700 Subject: [PATCH 177/694] Update apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx Co-authored-by: Greg Richardson --- apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx b/apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx index 64793b52aa2..3ebbec99d55 100644 --- a/apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx +++ b/apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx @@ -247,7 +247,7 @@ Use this to guarantee that the server has received the message before resolving ## Client-side rate limit -There is a default client-side rate limit that enables you to send 10 messages per second, or one message every 100 milliseconds. You can customize this when creating the client: +By default the client will rate limit itself at 10 messages per second (1 message every 100 milliseconds). You can customize this when creating the client: ```js import { createClient } from '@supabase/supabase-js' From fee6b8916830e716ba17c9ebe1e9af959df61818 Mon Sep 17 00:00:00 2001 From: Wen Bo Xie <5532241+w3b6x9@users.noreply.github.com> Date: Thu, 29 Jun 2023 14:04:03 -0700 Subject: [PATCH 178/694] Update apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx Co-authored-by: Greg Richardson --- .../docs/pages/guides/realtime/quickstarts/postgres-changes.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx b/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx index 3a4e207b25f..a8264c5807a 100644 --- a/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx +++ b/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx @@ -67,7 +67,7 @@ Let's explore how to implement Realtime Postgres Changes so you can integrate it - Let's turn on Row Level Security for this table and allow anonymous access. + In this example we'll turn on [Row Level Security](/docs/guides/auth/row-level-security) for this table and allow anonymous access. In production, be sure to secure your application with the appropriate permissions. From 11105201f02d6ee74b08e2d5e372b577e09faefa Mon Sep 17 00:00:00 2001 From: Wen Bo Xie <5532241+w3b6x9@users.noreply.github.com> Date: Thu, 29 Jun 2023 14:04:21 -0700 Subject: [PATCH 179/694] Update apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx Co-authored-by: Greg Richardson --- .../pages/guides/realtime/quickstarts/postgres-changes.mdx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx b/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx index a8264c5807a..2842472f0ad 100644 --- a/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx +++ b/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx @@ -496,8 +496,9 @@ grant select on "non_private_schema"."some_table" to authenticated; ``` - We strongly encourage you to enable RLS and create policies for tables in private schemas. - Otherwise, any role you grant access to will have unfettered read access to the table. + +We strongly encourage you to enable RLS and create policies for tables in private schemas. Otherwise, any role you grant access to will have unfettered read access to the table. + ## Custom tokens From 6384bd4d862ab4109552b070f311c2c2d9bd1f6a Mon Sep 17 00:00:00 2001 From: Wen Bo Xie <5532241+w3b6x9@users.noreply.github.com> Date: Thu, 29 Jun 2023 14:04:42 -0700 Subject: [PATCH 180/694] Update apps/docs/pages/guides/realtime/quickstarts/presence.mdx Co-authored-by: Greg Richardson --- apps/docs/pages/guides/realtime/quickstarts/presence.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/docs/pages/guides/realtime/quickstarts/presence.mdx b/apps/docs/pages/guides/realtime/quickstarts/presence.mdx index ad89bc70f83..0349f3c61c7 100644 --- a/apps/docs/pages/guides/realtime/quickstarts/presence.mdx +++ b/apps/docs/pages/guides/realtime/quickstarts/presence.mdx @@ -6,6 +6,7 @@ export const meta = { subtitle: "Get up and running with Realtime's Presence feature", breadcrumb: 'Realtime Presence Quickstart', } +Presence can be used to share state between clients. Each client maintains their own piece of state within the shared state. Presence utilizes an in-memory conflict-free replicated data type (CRDT) to track and synchronize shared state in an eventually consistent manner. It computes the difference between existing state and new state changes and sends the necessary updates to clients via Broadcast. From 66d8d36a3b4333aef31655c2a9e722e9a27fb3c7 Mon Sep 17 00:00:00 2001 From: Wen Bo Xie <5532241+w3b6x9@users.noreply.github.com> Date: Thu, 29 Jun 2023 14:04:56 -0700 Subject: [PATCH 181/694] Update apps/docs/pages/guides/realtime/quickstarts/presence.mdx Co-authored-by: Greg Richardson --- apps/docs/pages/guides/realtime/quickstarts/presence.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/pages/guides/realtime/quickstarts/presence.mdx b/apps/docs/pages/guides/realtime/quickstarts/presence.mdx index 0349f3c61c7..fa152acec7b 100644 --- a/apps/docs/pages/guides/realtime/quickstarts/presence.mdx +++ b/apps/docs/pages/guides/realtime/quickstarts/presence.mdx @@ -246,7 +246,7 @@ const channelC = supabase.channel('test', { ## Client-Side Rate Limit -There is a default client-side rate limit that enables you to send 10 messages per second, or one message every 100 milliseconds. You can customize this when creating the client: +By default the client will rate limit itself at 10 messages per second (1 message every 100 milliseconds). You can customize this when creating the client: ```js import { createClient } from '@supabase/supabase-js' From a36a08a0f3c7ca209a57020175b554d764242116 Mon Sep 17 00:00:00 2001 From: Wen Bo Xie <5532241+w3b6x9@users.noreply.github.com> Date: Thu, 29 Jun 2023 14:05:15 -0700 Subject: [PATCH 182/694] Update apps/docs/pages/guides/realtime/quickstarts/presence.mdx Co-authored-by: Greg Richardson --- apps/docs/pages/guides/realtime/quickstarts/presence.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/pages/guides/realtime/quickstarts/presence.mdx b/apps/docs/pages/guides/realtime/quickstarts/presence.mdx index fa152acec7b..6a8fc72d914 100644 --- a/apps/docs/pages/guides/realtime/quickstarts/presence.mdx +++ b/apps/docs/pages/guides/realtime/quickstarts/presence.mdx @@ -91,7 +91,7 @@ Let's explore how to implement Realtime Presence so you can integrate it into yo Listen to the `sync`, `join`, and `leave` events triggered whenever any client joins or leaves the channel or changes their slice of state. - Once `clientA` successfully tracks its state, it will trigger its own `sync` and `join` event handlers. + To begin tracking state, `clientA` calls `channelA.track()`, passing in the desired state to share. Once `clientA` successfully tracks its state, it will automatically trigger its own `sync` and `join` event handlers.
    From ee1d97d419ada3914a655b47406a712994afbecf Mon Sep 17 00:00:00 2001 From: Wen Bo Xie <5532241+w3b6x9@users.noreply.github.com> Date: Thu, 29 Jun 2023 14:05:35 -0700 Subject: [PATCH 183/694] Update apps/docs/pages/guides/realtime/quickstarts/presence.mdx Co-authored-by: Greg Richardson --- apps/docs/pages/guides/realtime/quickstarts/presence.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/pages/guides/realtime/quickstarts/presence.mdx b/apps/docs/pages/guides/realtime/quickstarts/presence.mdx index 6a8fc72d914..f001fc2ae5b 100644 --- a/apps/docs/pages/guides/realtime/quickstarts/presence.mdx +++ b/apps/docs/pages/guides/realtime/quickstarts/presence.mdx @@ -230,7 +230,7 @@ Let's explore how to implement Realtime Presence so you can integrate it into yo ## Presence Key -By default, Presence will generate an `UUIDv1` key on the server to uniquely track a client channel's state but you may pass Presence a custom key when creating the channel. +By default, Presence will generate a unique `UUIDv1` key on the server to track a client channel's state. If you prefer, you can provide a custom key when creating the channel. This key should be unique among clients. ```js import { createClient } from '@supabase/supabase-js' From bf6ae77345bb20d5812764a1f06ab62cf78d84a6 Mon Sep 17 00:00:00 2001 From: Wen Bo Xie <5532241+w3b6x9@users.noreply.github.com> Date: Thu, 29 Jun 2023 14:05:52 -0700 Subject: [PATCH 184/694] Update apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx Co-authored-by: Greg Richardson --- .../pages/guides/realtime/quickstarts/postgres-changes.mdx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx b/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx index 2842472f0ad..ec6b3c08961 100644 --- a/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx +++ b/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx @@ -146,7 +146,12 @@ Let's explore how to implement Realtime Postgres Changes so you can integrate it - Listen to all changes in the `public` schema. + Listen to changes on all tables in the `public` schema by setting the `schema` property to 'public' and event name to `*`. The event name can be one of: + - `INSERT` + - `UPDATE` + - `DELETE` + - `*` + The channel name can be any string except 'realtime'. From 4ef51d46ab510b4669e5e16d6cfc6230e4348b82 Mon Sep 17 00:00:00 2001 From: Wen Bo Xie <5532241+w3b6x9@users.noreply.github.com> Date: Thu, 29 Jun 2023 14:06:13 -0700 Subject: [PATCH 185/694] Update apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx Co-authored-by: Greg Richardson --- .../pages/guides/realtime/quickstarts/postgres-changes.mdx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx b/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx index ec6b3c08961..e747c47a464 100644 --- a/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx +++ b/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx @@ -478,8 +478,7 @@ const channel = supabase ## Full `old` record -By default, only `new` record changes are sent but if you want to receive the `old` record (previous values) whenever you `UPDATE` or `DELETE` a record, -you can set the `replica identity` of your table to `full`: +By default, only `new` record changes are sent but if you want to receive the `old` record (previous values) whenever you `UPDATE` or `DELETE` a record, you can set the `replica identity` of your table to `full`: ```sql alter table From 1998ffa307fe68f8700f1717b7205d0851615fb8 Mon Sep 17 00:00:00 2001 From: Wen Bo Xie <5532241+w3b6x9@users.noreply.github.com> Date: Thu, 29 Jun 2023 14:07:12 -0700 Subject: [PATCH 186/694] Update apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx Co-authored-by: Greg Richardson --- .../guides/realtime/quickstarts/postgres-changes.mdx | 8 -------- 1 file changed, 8 deletions(-) diff --git a/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx b/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx index e747c47a464..1fbce05035f 100644 --- a/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx +++ b/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx @@ -190,14 +190,6 @@ Let's explore how to implement Realtime Postgres Changes so you can integrate it ```js - /* - Channel name can be any string except 'realtime'. - Event name can can be one of: - - INSERT - - UPDATE - - DELETE - - * - */ const channelB = client .channel('table-db-changes') .on( From f039c2493c09380aa57a20b4dd1137ed17531084 Mon Sep 17 00:00:00 2001 From: Wen Bo Xie <5532241+w3b6x9@users.noreply.github.com> Date: Thu, 29 Jun 2023 14:07:23 -0700 Subject: [PATCH 187/694] Update apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx Co-authored-by: Greg Richardson --- .../guides/realtime/quickstarts/postgres-changes.mdx | 8 -------- 1 file changed, 8 deletions(-) diff --git a/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx b/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx index 1fbce05035f..c03e28eee9c 100644 --- a/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx +++ b/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx @@ -158,14 +158,6 @@ Let's explore how to implement Realtime Postgres Changes so you can integrate it ```js - /* - Channel name can be any string except 'realtime'. - Event name can can be one of: - - INSERT - - UPDATE - - DELETE - - * - */ const channelA = client .channel('schema-db-changes') .on( From 8edffa103583f556ded0779a520f8ff2ebcb1bd3 Mon Sep 17 00:00:00 2001 From: Wen Bo Xie <5532241+w3b6x9@users.noreply.github.com> Date: Thu, 29 Jun 2023 14:07:36 -0700 Subject: [PATCH 188/694] Update apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx Co-authored-by: Greg Richardson --- .../docs/pages/guides/realtime/quickstarts/postgres-changes.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx b/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx index c03e28eee9c..b4f59986a05 100644 --- a/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx +++ b/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx @@ -175,7 +175,7 @@ Let's explore how to implement Realtime Postgres Changes so you can integrate it - Listen to all changes in the `todos` table. + Listen to just inserts in the `todos` table by setting the `table` property to 'todos' and event name to `INSERT`. From 780e8628c0487bb6333b5bf0288c2d180d79309b Mon Sep 17 00:00:00 2001 From: Wen Bo Xie <5532241+w3b6x9@users.noreply.github.com> Date: Thu, 29 Jun 2023 14:07:47 -0700 Subject: [PATCH 189/694] Update apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx Co-authored-by: Greg Richardson --- .../guides/realtime/quickstarts/postgres-changes.mdx | 8 -------- 1 file changed, 8 deletions(-) diff --git a/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx b/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx index b4f59986a05..4afc348a2e5 100644 --- a/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx +++ b/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx @@ -207,14 +207,6 @@ Let's explore how to implement Realtime Postgres Changes so you can integrate it ```js - /* - Channel name can be any string except 'realtime'. - Event name can can be one of: - - INSERT - - UPDATE - - DELETE - - * - */ const channelC = client .channel('table-filter-changes') .on( From c9cd7c69d5cf06f199736dd3a10ddb9333477f5b Mon Sep 17 00:00:00 2001 From: Wen Bo Xie <5532241+w3b6x9@users.noreply.github.com> Date: Thu, 29 Jun 2023 14:08:08 -0700 Subject: [PATCH 190/694] Update apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx Co-authored-by: Greg Richardson --- .../docs/pages/guides/realtime/quickstarts/postgres-changes.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx b/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx index 4afc348a2e5..9bbd62e43bf 100644 --- a/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx +++ b/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx @@ -200,7 +200,7 @@ Let's explore how to implement Realtime Postgres Changes so you can integrate it - Listen to changes in the `todos` table when a column's value equals a client-specified value. + Listen to changes in the `todos` table when a column's value equals a specified value. In this example, we only listen to inserts on `todos` where the row `id` is 1. From dbb4cb0b0f1dfdecd8dd2c062b2b784edeefb01e Mon Sep 17 00:00:00 2001 From: Wen Bo Xie <5532241+w3b6x9@users.noreply.github.com> Date: Thu, 29 Jun 2023 14:08:28 -0700 Subject: [PATCH 191/694] Update apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx Co-authored-by: Greg Richardson --- .../docs/pages/guides/realtime/quickstarts/postgres-changes.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx b/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx index 9bbd62e43bf..0a0d89a1bfd 100644 --- a/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx +++ b/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx @@ -226,7 +226,7 @@ Let's explore how to implement Realtime Postgres Changes so you can integrate it - Check out the full list of available filters [here](/docs/guides/realtime/quickstarts/postgres-changes#available-filters). + Check out the [full list of available filters](/docs/guides/realtime/quickstarts/postgres-changes#available-filters). From a04bdb4d40fb666ebf8a7663d8297078551ccab4 Mon Sep 17 00:00:00 2001 From: Wen Bo Xie Date: Thu, 29 Jun 2023 14:36:55 -0700 Subject: [PATCH 192/694] docs: change Realtime header from Quickstarts to Features --- .../NavigationMenu/NavigationMenu.constants.ts | 8 ++++---- apps/docs/pages/guides/realtime.mdx | 6 +++--- .../realtime/{quickstarts => }/broadcast.mdx | 4 ++-- apps/docs/pages/guides/realtime/concepts.mdx | 6 +++--- .../{quickstarts => }/postgres-changes.mdx | 11 ++++++----- .../realtime/{quickstarts => }/presence.mdx | 5 +++-- apps/www/lib/redirects.js | 17 +---------------- 7 files changed, 22 insertions(+), 35 deletions(-) rename apps/docs/pages/guides/realtime/{quickstarts => }/broadcast.mdx (97%) rename apps/docs/pages/guides/realtime/{quickstarts => }/postgres-changes.mdx (97%) rename apps/docs/pages/guides/realtime/{quickstarts => }/presence.mdx (97%) diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index 995a6ac6e18..1a08ecc0efe 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -809,14 +809,14 @@ export const realtime: NavMenuConstant = { url: '/guides/realtime/concepts', }, { - name: 'Quickstarts', + name: 'Features', url: undefined, items: [ - { name: 'Broadcast', url: '/guides/realtime/quickstarts/broadcast' }, - { name: 'Presence', url: '/guides/realtime/quickstarts/presence' }, + { name: 'Broadcast', url: '/guides/realtime/broadcast' }, + { name: 'Presence', url: '/guides/realtime/presence' }, { name: 'Postgres Changes', - url: '/guides/realtime/quickstarts/postgres-changes', + url: '/guides/realtime/postgres-changes', }, ], }, diff --git a/apps/docs/pages/guides/realtime.mdx b/apps/docs/pages/guides/realtime.mdx index 2c3dbdc0c91..b11c3a56049 100644 --- a/apps/docs/pages/guides/realtime.mdx +++ b/apps/docs/pages/guides/realtime.mdx @@ -9,9 +9,9 @@ export const meta = { Supabase provides a globally distributed cluster of [Realtime](https://github.com/supabase/realtime) servers that enable the following functionality: -- [Broadcast](/docs/guides/realtime/quickstarts/broadcast): Send ephemeral messages from client to clients with low latency. -- [Presence](/docs/guides/realtime/quickstarts/presence): Track and synchronize shared state between clients. -- [Postgres Changes](/docs/guides/realtime/quickstarts/postgres-changes): Listen to Postgres database changes and send them to authorized clients. +- [Broadcast](/docs/guides/realtime/broadcast): Send ephemeral messages from client to clients with low latency. +- [Presence](/docs/guides/realtime/presence): Track and synchronize shared state between clients. +- [Postgres Changes](/docs/guides/realtime/postgres-changes): Listen to Postgres database changes and send them to authorized clients. A [channel](https://hexdocs.pm/phoenix/channels.html) is the basic building block of Realtime and narrows the scope of data flow to subscribed clients. You can think of a channel as a chatroom where participants are able to see who's online and send and receive messages; similar to a Discord or Slack channel. diff --git a/apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx b/apps/docs/pages/guides/realtime/broadcast.mdx similarity index 97% rename from apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx rename to apps/docs/pages/guides/realtime/broadcast.mdx index 3ebbec99d55..11468464e77 100644 --- a/apps/docs/pages/guides/realtime/quickstarts/broadcast.mdx +++ b/apps/docs/pages/guides/realtime/broadcast.mdx @@ -267,8 +267,8 @@ Learn more by visiting the [Quotas](/docs/guides/realtime/quotas) section. ## More Realtime Quickstarts -- [Presence Quickstart](/docs/guides/realtime/quickstarts/presence) -- [Postgres Changes Quickstart](/docs/guides/realtime/quickstarts/postgres-changes) +- [Presence Quickstart](/docs/guides/realtime/presence) +- [Postgres Changes Quickstart](/docs/guides/realtime/postgres-changes) export const Page = ({ children }) => diff --git a/apps/docs/pages/guides/realtime/concepts.mdx b/apps/docs/pages/guides/realtime/concepts.mdx index 46cce126a11..af4dee031bd 100644 --- a/apps/docs/pages/guides/realtime/concepts.mdx +++ b/apps/docs/pages/guides/realtime/concepts.mdx @@ -9,9 +9,9 @@ export const meta = { Supabase Realtime lets you to build real-time applications with collaborative/multiplayer functionality. It includes 3 core features: -- [Broadcast](/docs/guides/realtime/quickstarts/broadcast): sends rapid, ephemeral messages to other connected clients. You can use it to track mouse movements, for example. -- [Presence](/docs/guides/realtime/quickstarts/presence): sends user state between connected clients. You can use it to show an "online" status, which disappears when a user is disconnected. -- [Postgres Changes](/docs/guides/realtime/quickstarts/postgres-changes): receives database changes in real-time. +- [Broadcast](/docs/guides/realtime/broadcast): sends rapid, ephemeral messages to other connected clients. You can use it to track mouse movements, for example. +- [Presence](/docs/guides/realtime/presence): sends user state between connected clients. You can use it to show an "online" status, which disappears when a user is disconnected. +- [Postgres Changes](/docs/guides/realtime/postgres-changes): receives database changes in real-time. ## Channels diff --git a/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx b/apps/docs/pages/guides/realtime/postgres-changes.mdx similarity index 97% rename from apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx rename to apps/docs/pages/guides/realtime/postgres-changes.mdx index 0a0d89a1bfd..fff858d3903 100644 --- a/apps/docs/pages/guides/realtime/quickstarts/postgres-changes.mdx +++ b/apps/docs/pages/guides/realtime/postgres-changes.mdx @@ -1,9 +1,10 @@ import Layout from '~/layouts/DefaultGuideLayout' +import StepHikeCompact from '~/components/StepHikeCompact' export const meta = { - id: 'postgres-changes', title: 'Postgres Changes', - description: "Getting started with Realtime's Postgres Changes feature", + subtitle: "Get up and running with Realtime's Postgres Changes feature", + breadcrumb: 'Realtime Postgres Changes Quickstart', } Realtime's Postgres Changes feature listens for database changes and sends them to clients. Clients are required to subscribe with a JWT dictating which changes they are allowed to receive based on the database's [Row Level Security](/docs/guides/auth/row-level-security). @@ -226,7 +227,7 @@ Let's explore how to implement Realtime Postgres Changes so you can integrate it - Check out the [full list of available filters](/docs/guides/realtime/quickstarts/postgres-changes#available-filters). + Check out the [full list of available filters](/docs/guides/realtime/postgres-changes#available-filters). @@ -531,8 +532,8 @@ supabase.realtime.setAuth('fresh-token') ## More Realtime Quickstarts -- [Broadcast Quickstart](/docs/guides/realtime/quickstarts/broadcast) -- [Presence Quickstart](/docs/guides/realtime/quickstarts/presence) +- [Broadcast Quickstart](/docs/guides/realtime/broadcast) +- [Presence Quickstart](/docs/guides/realtime/presence) export const Page = ({ children }) => diff --git a/apps/docs/pages/guides/realtime/quickstarts/presence.mdx b/apps/docs/pages/guides/realtime/presence.mdx similarity index 97% rename from apps/docs/pages/guides/realtime/quickstarts/presence.mdx rename to apps/docs/pages/guides/realtime/presence.mdx index f001fc2ae5b..311e6aec849 100644 --- a/apps/docs/pages/guides/realtime/quickstarts/presence.mdx +++ b/apps/docs/pages/guides/realtime/presence.mdx @@ -6,6 +6,7 @@ export const meta = { subtitle: "Get up and running with Realtime's Presence feature", breadcrumb: 'Realtime Presence Quickstart', } + Presence can be used to share state between clients. Each client maintains their own piece of state within the shared state. Presence utilizes an in-memory conflict-free replicated data type (CRDT) to track and synchronize shared state in an eventually consistent manner. It computes the difference between existing state and new state changes and sends the necessary updates to clients via Broadcast. @@ -266,8 +267,8 @@ Learn more by visiting the [Quotas](/docs/guides/realtime/quotas) section. ## More Realtime Quickstarts -- [Broadcast Quickstart](/docs/guides/realtime/quickstarts/broadcast) -- [Postgres Changes Quickstart](/docs/guides/realtime/quickstarts/postgres-changes) +- [Broadcast Quickstart](/docs/guides/realtime/broadcast) +- [Postgres Changes Quickstart](/docs/guides/realtime/postgres-changes) export const Page = ({ children }) => diff --git a/apps/www/lib/redirects.js b/apps/www/lib/redirects.js index 17b3d26ff4e..e32c48b1759 100644 --- a/apps/www/lib/redirects.js +++ b/apps/www/lib/redirects.js @@ -2041,24 +2041,9 @@ module.exports = [ source: '/docs/guides/realtime/extensions/postgres-changes', destination: '/docs/guides/realtime/postgres-changes', }, - { - permanent: true, - source: '/docs/guides/realtime/broadcast', - destination: '/docs/guides/realtime/quickstarts/broadcast', - }, - { - permanent: true, - source: '/docs/guides/realtime/presence', - destination: '/docs/guides/realtime/quickstarts/presence', - }, - { - permanent: true, - source: '/docs/guides/realtime/postgres-changes', - destination: '/docs/guides/realtime/quickstarts/postgres-changes', - }, { permanent: true, source: '/docs/guides/realtime/quickstart', - destination: '/docs/guides/realtime/quickstarts/broadcast', + destination: '/docs/guides/realtime', }, ] From 543c4320849355a519619f75dcffa8b99b6b4d45 Mon Sep 17 00:00:00 2001 From: Greg Richardson Date: Thu, 29 Jun 2023 17:57:46 -0600 Subject: [PATCH 193/694] docs(realtime): line break in postgres changes quickstart --- apps/docs/pages/guides/realtime/postgres-changes.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/docs/pages/guides/realtime/postgres-changes.mdx b/apps/docs/pages/guides/realtime/postgres-changes.mdx index fff858d3903..57b1d355830 100644 --- a/apps/docs/pages/guides/realtime/postgres-changes.mdx +++ b/apps/docs/pages/guides/realtime/postgres-changes.mdx @@ -152,6 +152,7 @@ Let's explore how to implement Realtime Postgres Changes so you can integrate it - `UPDATE` - `DELETE` - `*` + The channel name can be any string except 'realtime'.
    From 4dbc8db3c2ecfae427f8a21201314e79e2dcfba0 Mon Sep 17 00:00:00 2001 From: Wen Bo Xie Date: Thu, 29 Jun 2023 17:12:47 -0700 Subject: [PATCH 194/694] docs: update realtime broadcast listening language --- apps/docs/pages/guides/realtime/broadcast.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/pages/guides/realtime/broadcast.mdx b/apps/docs/pages/guides/realtime/broadcast.mdx index 11468464e77..90055d2c2ae 100644 --- a/apps/docs/pages/guides/realtime/broadcast.mdx +++ b/apps/docs/pages/guides/realtime/broadcast.mdx @@ -86,7 +86,7 @@ Let's explore how to implement Realtime Broadcast so you can integrate it into y - Specify the Broadcast event you want the `on` handler to listen for. The event name can be anything. + Specify the Broadcast event you want the `on` handler to listen for. This event name can be anything you want. We'll send a broadcast message with this event name later on. From 698e2a47f035319b8029a5b33cdf22e34149c2ff Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Fri, 30 Jun 2023 11:23:29 +0800 Subject: [PATCH 195/694] revert --- packages/ui/src/components/Tabs/Tabs.tsx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/packages/ui/src/components/Tabs/Tabs.tsx b/packages/ui/src/components/Tabs/Tabs.tsx index 04e59aa1cd0..3466dc5d262 100644 --- a/packages/ui/src/components/Tabs/Tabs.tsx +++ b/packages/ui/src/components/Tabs/Tabs.tsx @@ -54,13 +54,6 @@ const Tabs: React.FC & TabsSubComponents = ({ let __styles = styleHandler('tabs') - if (children && !Array.isArray(children)) { - children = [children] - } - - // Exclude children that are just conditional elements - children = children.filter((it) => it) - const tabIds = children.map((tab) => tab.props.id) const { groupActiveId, setGroupActiveId } = useTabGroup(tabIds) From cad16f81293ef7ee23c2880aeb35391beee9fb18 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Fri, 30 Jun 2023 11:43:03 +0800 Subject: [PATCH 196/694] start moving pages into Scaffold --- .../BillingSettings/BillingSettings.tsx | 55 +++++++++---------- .../GeneralSettings/GeneralSettings.tsx | 5 +- .../InvoicesSettings/InvoicesSettings.tsx | 5 +- .../TeamSettings/TeamSettings.tsx | 9 ++- studio/components/layouts/Scaffold.tsx | 16 ++++++ 5 files changed, 53 insertions(+), 37 deletions(-) diff --git a/studio/components/interfaces/Organization/BillingSettings/BillingSettings.tsx b/studio/components/interfaces/Organization/BillingSettings/BillingSettings.tsx index ca01db97c3f..40eaecf3406 100644 --- a/studio/components/interfaces/Organization/BillingSettings/BillingSettings.tsx +++ b/studio/components/interfaces/Organization/BillingSettings/BillingSettings.tsx @@ -13,6 +13,7 @@ import PaymentMethods from './PaymentMethods' import ProjectsSummary from './ProjectsSummary' import TaxID from './TaxID/TaxID' import OrganizationBillingMigrationPanel from '../GeneralSettings/OrganizationBillingMigrationPanel' +import { ScaffoldContainer, ScaffoldContainerLegacy } from 'components/layouts/Scaffold' const BillingSettings = () => { const { ui } = useStore() @@ -101,36 +102,34 @@ const BillingSettings = () => { }, [slug]) return ( -
    -
    - {orgBillingMigrationEnabled && canMigrateOrganization && !subscription_id && ( - - )} - - - getPaymentMethods()} - onPaymentMethodAdded={() => getPaymentMethods()} - /> + + {orgBillingMigrationEnabled && canMigrateOrganization && !subscription_id && ( + + )} + + + getPaymentMethods()} + onPaymentMethodAdded={() => getPaymentMethods()} + /> - + - setCustomer({ ...customer, address })} - /> - setTaxIds(ids)} - /> -
    -
    + setCustomer({ ...customer, address })} + /> + setTaxIds(ids)} + /> + ) } diff --git a/studio/components/interfaces/Organization/GeneralSettings/GeneralSettings.tsx b/studio/components/interfaces/Organization/GeneralSettings/GeneralSettings.tsx index 6cc42c37052..4ea517246b1 100644 --- a/studio/components/interfaces/Organization/GeneralSettings/GeneralSettings.tsx +++ b/studio/components/interfaces/Organization/GeneralSettings/GeneralSettings.tsx @@ -19,6 +19,7 @@ import { checkPermissions, useFlag, useSelectedOrganization, useStore } from 'ho import { patch } from 'lib/common/fetch' import { API_URL } from 'lib/constants' import OrganizationDeletePanel from './OrganizationDeletePanel' +import { ScaffoldContainerLegacy } from 'components/layouts/Scaffold' const GeneralSettings = () => { const queryClient = useQueryClient() @@ -69,7 +70,7 @@ const GeneralSettings = () => { } return ( -
    +
    {({ isSubmitting, handleReset, values, initialValues, resetForm }: any) => { const hasChanges = JSON.stringify(values) !== JSON.stringify(initialValues) @@ -190,7 +191,7 @@ const GeneralSettings = () => {
    {canDeleteOrganization && } -
    + ) } diff --git a/studio/components/interfaces/Organization/InvoicesSettings/InvoicesSettings.tsx b/studio/components/interfaces/Organization/InvoicesSettings/InvoicesSettings.tsx index 80d8403c1be..4dd18fd7173 100644 --- a/studio/components/interfaces/Organization/InvoicesSettings/InvoicesSettings.tsx +++ b/studio/components/interfaces/Organization/InvoicesSettings/InvoicesSettings.tsx @@ -10,6 +10,7 @@ import { checkPermissions, useSelectedOrganization, useStore } from 'hooks' import { get, head } from 'lib/common/fetch' import { API_URL } from 'lib/constants' import { Button, IconChevronLeft, IconChevronRight, IconDownload, IconFileText, Loading } from 'ui' +import { ScaffoldContainerLegacy } from 'components/layouts/Scaffold' const PAGE_LIMIT = 10 @@ -93,7 +94,7 @@ const InvoicesSettings = () => { } return ( -
    + { } /> - + ) } diff --git a/studio/components/interfaces/Organization/TeamSettings/TeamSettings.tsx b/studio/components/interfaces/Organization/TeamSettings/TeamSettings.tsx index b490d2081cc..0dc3dabf59a 100644 --- a/studio/components/interfaces/Organization/TeamSettings/TeamSettings.tsx +++ b/studio/components/interfaces/Organization/TeamSettings/TeamSettings.tsx @@ -14,6 +14,7 @@ import { useProfile } from 'lib/profile' import InviteMemberButton from './InviteMemberButton' import MembersView from './MembersView' import { hasMultipleOwners, useGetRolesManagementPermissions } from './TeamSettings.utils' +import { ScaffoldContainerLegacy } from 'components/layouts/Scaffold' const TeamSettings = () => { const { ui } = useStore() @@ -70,8 +71,8 @@ const TeamSettings = () => { } return ( - <> -
    + +
    } @@ -126,11 +127,9 @@ const TeamSettings = () => {
    - -
    - + ) } diff --git a/studio/components/layouts/Scaffold.tsx b/studio/components/layouts/Scaffold.tsx index c0367141f76..1d11c68bc58 100644 --- a/studio/components/layouts/Scaffold.tsx +++ b/studio/components/layouts/Scaffold.tsx @@ -65,6 +65,20 @@ const ScaffoldSectionContent = React.forwardRef< ) }) +// For older layouts +const ScaffoldContainerLegacy = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => { + return ( +
    + ) +}) + ScaffoldHeader.displayName = 'ScaffoldHeader' ScaffoldTitle.displayName = 'ScaffoldTitle' ScaffoldContainer.displayName = 'ScaffoldContainer' @@ -72,6 +86,7 @@ ScaffoldDivider.displayName = 'ScaffoldDivider' ScaffoldSection.displayName = 'ScaffoldSection' ScaffoldSectionDetail.displayName = 'ScaffoldSectionDetail' ScaffoldSectionContent.displayName = 'ScaffoldSectionContent' +ScaffoldContainerLegacy.displayName = 'ScaffoldContainerLegacy' export { ScaffoldHeader, @@ -81,4 +96,5 @@ export { ScaffoldSection, ScaffoldSectionDetail, ScaffoldSectionContent, + ScaffoldContainerLegacy, } From 48b98e52cd9dde0a2583470ffadbc7895391f8da Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Fri, 30 Jun 2023 11:48:27 +0800 Subject: [PATCH 197/694] copy update --- .../IntegrationSettings/IntegrationSettings.tsx | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx b/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx index 4fc51f51cc6..96d9e1d7653 100644 --- a/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx +++ b/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx @@ -55,17 +55,19 @@ You can change the scope of the access for Supabase by configuring here. detail={` ## GitHub Connections -Conect any of your GitHub repositories to a project. +Connect any of your GitHub repositories to a project. `} description={` -### How do GitHub connections work? +GitHub connections are coming soon. -Supabase will keep the right environment variables up to date in each of the projects you assign to a Supabase project. -You can also link multiple Vercel Projects to the same Supabase project. +### How will GitHub connections work? + +You will be able to connect a GitHub repository to a Supabase project. +The GitHub app will watch for changes in your repository such as file changes, branch changes as well as pull request activity. + +These connections will be part of a GitHub workflow that is currently in deveopment. `} note={` -Your Vercel connection has access to 7 Vercel Projects. -You can change the scope of the access for Supabase by configuring here. `} integrations={githubIntegrations} /> From 1a83727c6194ff73632f981f9b9886fd3ab9e460 Mon Sep 17 00:00:00 2001 From: Alaister Young Date: Fri, 30 Jun 2023 14:07:08 +1000 Subject: [PATCH 198/694] hotfix: EmptyState useCheckPermissions --- studio/components/interfaces/TableGridEditor/EmptyState.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/studio/components/interfaces/TableGridEditor/EmptyState.tsx b/studio/components/interfaces/TableGridEditor/EmptyState.tsx index 3667bf1e4ef..ef92fbf19e3 100644 --- a/studio/components/interfaces/TableGridEditor/EmptyState.tsx +++ b/studio/components/interfaces/TableGridEditor/EmptyState.tsx @@ -1,7 +1,7 @@ import { FC } from 'react' import { observer } from 'mobx-react-lite' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { checkPermissions, useLocalStorage, useStore } from 'hooks' +import { useCheckPermissions, useLocalStorage, useStore } from 'hooks' import { useEntityTypesQuery } from 'data/entity-types/entity-types-infinite-query' import ProductEmptyState from 'components/to-be-cleaned/ProductEmptyState' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' @@ -15,7 +15,7 @@ const EmptyState: FC = ({ selectedSchema, onAddTable }) => { const { meta } = useStore() const isProtectedSchema = meta.excludedSchemas.includes(selectedSchema) const canCreateTables = - !isProtectedSchema && checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'tables') + useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'tables') && !isProtectedSchema const [sort] = useLocalStorage<'alphabetical' | 'grouped-alphabetical'>( 'table-editor-sort', From ec5dfdcecae1849b02a8674cec48a0a4ef4b9223 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Fri, 30 Jun 2023 12:32:03 +0800 Subject: [PATCH 199/694] more layout updates --- .../interfaces/Integrations/ProjectLinker.tsx | 2 +- .../IntegrationSettings/Integration.tsx | 13 -- .../Organization/OAuthApps/OAuthApps.tsx | 173 +++++++++--------- .../Organization/TeamSettings/MembersView.tsx | 2 +- .../TeamSettings/TeamSettings.tsx | 19 +- studio/components/layouts/Scaffold.tsx | 31 +++- studio/components/ui/AlertError.tsx | 4 +- 7 files changed, 133 insertions(+), 111 deletions(-) diff --git a/studio/components/interfaces/Integrations/ProjectLinker.tsx b/studio/components/interfaces/Integrations/ProjectLinker.tsx index 900efeb8a6c..898e42223e7 100644 --- a/studio/components/interfaces/Integrations/ProjectLinker.tsx +++ b/studio/components/interfaces/Integrations/ProjectLinker.tsx @@ -210,7 +210,7 @@ const ProjectLinker = ({
    { return ` diff --git a/studio/components/interfaces/Organization/IntegrationSettings/Integration.tsx b/studio/components/interfaces/Organization/IntegrationSettings/Integration.tsx index 84a8d2bdee5..f67e692fefc 100644 --- a/studio/components/interfaces/Organization/IntegrationSettings/Integration.tsx +++ b/studio/components/interfaces/Organization/IntegrationSettings/Integration.tsx @@ -109,19 +109,6 @@ Repository connections for ${title?.toLowerCase()} size="large" overlay={ <> - - - - } - > -
    Refresh Enviroment Variables
    -
    - Reapply env vars in vercel. -
    -
    - } onSelect={() => diff --git a/studio/components/interfaces/Organization/OAuthApps/OAuthApps.tsx b/studio/components/interfaces/Organization/OAuthApps/OAuthApps.tsx index 416679f43e1..79919216744 100644 --- a/studio/components/interfaces/Organization/OAuthApps/OAuthApps.tsx +++ b/studio/components/interfaces/Organization/OAuthApps/OAuthApps.tsx @@ -13,6 +13,7 @@ import PublishAppModal from './PublishAppSidePanel' import { AuthorizedApp, useAuthorizedAppsQuery } from 'data/oauth/authorized-apps-query' import AuthorizedAppRow from './AuthorizedAppRow' import RevokeAppModal from './RevokeAppModal' +import { ScaffoldContainerLegacy } from 'components/layouts/Scaffold' // [Joshen] Note on nav UX // Kang Ming mentioned that it might be better to split Published Apps and Authorized Apps into 2 separate tabs @@ -51,7 +52,7 @@ const OAuthApps = () => { return ( <> -
    +
    @@ -65,95 +66,93 @@ const OAuthApps = () => {
    -
    - {isLoadingPublishedApps && ( -
    - - - + {isLoadingPublishedApps && ( +
    + + + +
    + )} + + {isErrorPublishedApps && ( + + )} + + {createdApp !== undefined && ( + +
    +
    - )} - - {isErrorPublishedApps && ( - - )} - - {createdApp !== undefined && ( - -
    -
    , - Name, - Client ID, - Client Secret, - Created at, - , - ]} - body={ - sortedPublishedApps?.map((app) => ( - { - setShowPublishModal(true) - setSelectedAppToUpdate(app) - }} - onSelectDelete={() => setSelectedAppToDelete(app)} - /> - )) ?? [] - } - /> - )} - - )} - + {isSuccessPublishedApps && ( + <> + {(publishedApps?.length ?? 0) === 0 ? ( +
    +

    You do not have any published applications yet

    +
    + ) : ( +
    , + Name, + Client ID, + Client Secret, + Created at, + , + ]} + body={ + sortedPublishedApps?.map((app) => ( + { + setShowPublishModal(true) + setSelectedAppToUpdate(app) + }} + onSelectDelete={() => setSelectedAppToDelete(app)} + /> + )) ?? [] + } + /> + )} + + )}
    @@ -204,7 +203,7 @@ const OAuthApps = () => { )}
    - + { return ( <> -
    +
    { const { ui } = useStore() @@ -72,8 +77,8 @@ const TeamSettings = () => { return ( -
    -
    + + } size="small" @@ -83,7 +88,7 @@ const TeamSettings = () => { id="email" placeholder="Filter members" /> -
    + {canAddMembers && profile !== undefined && (
    { )}
    -
    -
    + + -
    +
    ) } diff --git a/studio/components/layouts/Scaffold.tsx b/studio/components/layouts/Scaffold.tsx index 1d11c68bc58..92c695d0e85 100644 --- a/studio/components/layouts/Scaffold.tsx +++ b/studio/components/layouts/Scaffold.tsx @@ -65,6 +65,29 @@ const ScaffoldSectionContent = React.forwardRef< ) }) +// Table and filters +const ScaffoldFilterAndContent = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => { + return
    +}) + +// Actions Group +const ScaffoldActionsContainer = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => { + return
    +}) + +// Actions Group +const ScaffoldActionsGroup = React.forwardRef>( + ({ className, ...props }, ref) => { + return
    + } +) + // For older layouts const ScaffoldContainerLegacy = React.forwardRef< HTMLDivElement, @@ -74,7 +97,7 @@ const ScaffoldContainerLegacy = React.forwardRef<
    ) }) @@ -86,6 +109,9 @@ ScaffoldDivider.displayName = 'ScaffoldDivider' ScaffoldSection.displayName = 'ScaffoldSection' ScaffoldSectionDetail.displayName = 'ScaffoldSectionDetail' ScaffoldSectionContent.displayName = 'ScaffoldSectionContent' +ScaffoldFilterAndContent.displayName = 'ScaffoldFilterAndContent' +ScaffoldActionsContainer.displayName = 'ScaffoldActionsContainer' +ScaffoldActionsGroup.displayName = 'ScaffoldActionsGroup' ScaffoldContainerLegacy.displayName = 'ScaffoldContainerLegacy' export { @@ -96,5 +122,8 @@ export { ScaffoldSection, ScaffoldSectionDetail, ScaffoldSectionContent, + ScaffoldFilterAndContent, + ScaffoldActionsContainer, + ScaffoldActionsGroup, ScaffoldContainerLegacy, } diff --git a/studio/components/ui/AlertError.tsx b/studio/components/ui/AlertError.tsx index b8a8a614d9f..7b6af8e4c98 100644 --- a/studio/components/ui/AlertError.tsx +++ b/studio/components/ui/AlertError.tsx @@ -6,11 +6,12 @@ export interface AlertErrorProps { ref?: string subject?: string error?: ResponseError | null + className?: string } // [Joshen] To standardize the language for all error UIs -const AlertError = ({ ref, subject, error }: AlertErrorProps) => { +const AlertError = ({ ref, subject, error, className }: AlertErrorProps) => { const subjectString = subject?.replace(/ /g, '%20') let href = `/support/new?category=dashboard_bug` @@ -21,6 +22,7 @@ const AlertError = ({ ref, subject, error }: AlertErrorProps) => { return ( Date: Fri, 30 Jun 2023 15:15:09 +1000 Subject: [PATCH 200/694] chore: checkPermissions -> useCheckPermissions --- studio/__mocks__/hooks.js | 1 - .../components/grid/components/header/Header.tsx | 4 ++-- .../interfaces/App/CommandMenuWrapper.tsx | 4 ++-- .../Auth/AuthProvidersForm/ProviderForm.tsx | 4 ++-- .../interfaces/Auth/AutoSchemaForm.tsx | 4 ++-- .../Auth/EmailTemplates/TemplateEditor.tsx | 4 ++-- .../Auth/Policies/PolicyTableRow/PolicyRow.tsx | 4 ++-- .../PolicyTableRow/PolicyTableRowHeader.tsx | 6 +++--- .../Auth/RedirectUrls/RedirectUrls.tsx | 4 ++-- .../interfaces/Auth/SiteUrl/SiteUrl.tsx | 4 ++-- .../interfaces/Auth/SmtpForm/SmtpForm.tsx | 4 ++-- .../interfaces/Auth/Users/CreateUserModal.tsx | 4 ++-- .../interfaces/Auth/Users/InviteUserModal.tsx | 4 ++-- .../interfaces/Auth/Users/UsersList.tsx | 6 +++--- .../AddOns/ComputeInstanceSidePanel.tsx | 7 +++++-- .../AddOns/CustomDomainSidePanel.tsx | 4 ++-- .../Subscription/AddOns/PITRSidePanel.tsx | 4 ++-- .../CostControl/SpendCapSidePanel.tsx | 7 +++++-- .../Subscription/Tier/PaymentMethodSelection.tsx | 4 ++-- .../Tier/SubscriptionPaymentMethod.tsx | 4 ++-- .../Subscription/Tier/TierUpdateSidePanel.tsx | 4 ++-- .../interfaces/Database/Backups/BackupItem.tsx | 4 ++-- .../interfaces/Database/Backups/BackupsList.tsx | 4 ++-- .../Database/Backups/PITR/PITRNotice.tsx | 9 ++++++--- .../Database/Backups/PITR/PITRStatus.tsx | 4 ++-- .../Database/Extensions/ExtensionCard.tsx | 4 ++-- .../Database/Extensions/Extensions.tsx | 4 ++-- .../Functions/FunctionsList/FunctionList.tsx | 7 +++++-- .../Functions/FunctionsList/FunctionsList.tsx | 7 +++++-- .../Database/Hooks/HooksList/HookList.tsx | 4 ++-- .../Database/Hooks/HooksList/HooksList.tsx | 4 ++-- .../Database/Publications/PublicationsList.tsx | 4 ++-- .../Publications/PublicationsTableItem.tsx | 4 ++-- .../Database/Publications/PublicationsTables.tsx | 4 ++-- .../interfaces/Database/Roles/RolesList.tsx | 4 ++-- .../interfaces/Database/Tables/ColumnList.tsx | 4 ++-- .../interfaces/Database/Tables/TableList.tsx | 4 ++-- .../Triggers/TriggersList/TriggerList.tsx | 4 ++-- .../Triggers/TriggersList/TriggersList.tsx | 4 ++-- .../Database/Wrappers/CreateWrapper.tsx | 4 ++-- .../interfaces/Database/Wrappers/EditWrapper.tsx | 4 ++-- .../interfaces/Database/Wrappers/WrapperRow.tsx | 4 ++-- .../Database/Wrappers/WrappersDisabledState.tsx | 7 +++++-- .../Database/Wrappers/WrappersDropdown.tsx | 4 ++-- .../components/interfaces/Docs/LangSelector.tsx | 4 ++-- .../EdgeFunctionDetails/EdgeFunctionDetails.tsx | 4 ++-- .../interfaces/Home/NewProjectPanel/APIKeys.tsx | 4 ++-- .../BillingAddress/BillingAddress.tsx | 9 ++++++--- .../BillingSettings/BillingEmail.tsx | 6 +++--- .../BillingSettings/BillingSettings.tsx | 4 ++-- .../BillingSettings/PaymentMethods.tsx | 6 +++--- .../Organization/BillingSettings/TaxID/TaxID.tsx | 6 +++--- .../GeneralSettings/DeleteOrganizationButton.tsx | 4 ++-- .../GeneralSettings/GeneralSettings.tsx | 6 +++--- .../MigrateOrganizationBillingButton.tsx | 4 ++-- .../InvoicesSettings/InvoicesSettings.tsx | 4 ++-- .../TeamSettings/InviteMemberButton.tsx | 16 ++++++++++------ .../Organization/TeamSettings/MemberActions.tsx | 6 +++--- .../interfaces/Settings/API/JWTSettings.tsx | 6 +++--- .../interfaces/Settings/API/PostgrestConfig.tsx | 4 ++-- .../Settings/Database/ConnectionPooling.tsx | 4 ++-- .../DatabaseSettings/ResetDbPassword.tsx | 4 ++-- .../Settings/Database/DiskSizeConfiguration.tsx | 4 ++-- .../NetworkRestrictions/NetworkRestrictions.tsx | 4 ++-- .../Settings/Database/SSLConfiguration.tsx | 4 ++-- .../CustomDomainsConfigureHostname.tsx | 4 ++-- .../DeleteProjectPanel/DeleteProjectButton.tsx | 4 ++-- .../interfaces/Settings/General/General.tsx | 4 ++-- .../Infrastructure/PauseProjectButton.tsx | 4 ++-- .../Infrastructure/RestartServerButton.tsx | 4 ++-- .../Vault/Keys/EncryptionKeysManagement.tsx | 4 ++-- .../Settings/Vault/Secrets/SecretRow.tsx | 4 ++-- .../Settings/Vault/Secrets/SecretsManagement.tsx | 4 ++-- .../interfaces/Settings/Vault/VaultToggle.tsx | 4 ++-- .../TableGridEditor/TableGridEditor.tsx | 12 ++++++------ studio/components/layouts/FunctionsLayout.tsx | 4 ++-- .../layouts/ProjectLayout/ProjectPausedState.tsx | 4 ++-- .../layouts/StorageLayout/BucketRow.tsx | 4 ++-- .../layouts/StorageLayout/StorageMenu.tsx | 4 ++-- .../TableEditorLayout/TableEditorLayout.tsx | 4 ++-- .../TableEditorLayout/TableEditorMenu.tsx | 4 ++-- .../components/to-be-cleaned/Docs/Description.js | 4 ++-- .../StorageExplorer/FileExplorerHeader.tsx | 4 ++-- .../Storage/StorageExplorer/FileExplorerRow.tsx | 4 ++-- .../StorageExplorer/FolderContextMenu.tsx | 4 ++-- .../Storage/StorageExplorer/ItemContextMenu.tsx | 4 ++-- .../Storage/StorageExplorer/PreviewPane.tsx | 4 ++-- .../Storage/StorageSettings/StorageSettings.tsx | 4 ++-- .../ui/ProjectSettings/DisplayApiSettings.tsx | 4 ++-- studio/components/ui/UpgradeToPro.tsx | 10 +++++++--- studio/hooks/misc/useCheckPermissions.ts | 5 ----- studio/pages/project/[ref]/auth/policies.tsx | 4 ++-- studio/pages/project/[ref]/auth/providers.tsx | 4 ++-- studio/pages/project/[ref]/auth/templates.tsx | 4 ++-- .../project/[ref]/auth/url-configuration.tsx | 4 ++-- studio/pages/project/[ref]/auth/users.tsx | 4 ++-- .../project/[ref]/database/backups/pitr.tsx | 4 ++-- .../project/[ref]/database/backups/scheduled.tsx | 4 ++-- .../pages/project/[ref]/database/extensions.tsx | 7 +++++-- .../pages/project/[ref]/database/functions.tsx | 4 ++-- .../pages/project/[ref]/database/hooks/index.tsx | 6 +++--- .../pages/project/[ref]/database/replication.tsx | 4 ++-- studio/pages/project/[ref]/database/triggers.tsx | 4 ++-- .../project/[ref]/database/wrappers/[id].tsx | 4 ++-- .../project/[ref]/database/wrappers/index.tsx | 4 ++-- .../project/[ref]/database/wrappers/new.tsx | 4 ++-- .../[ref]/functions/[functionSlug]/index.tsx | 8 +++++--- studio/pages/project/[ref]/settings/auth.tsx | 4 ++-- 108 files changed, 267 insertions(+), 239 deletions(-) diff --git a/studio/__mocks__/hooks.js b/studio/__mocks__/hooks.js index 0b0c07a3e57..e5fbfee3462 100644 --- a/studio/__mocks__/hooks.js +++ b/studio/__mocks__/hooks.js @@ -1,5 +1,4 @@ export const useFlag = jest.fn().mockReturnValue(true) -export const checkPermissions = jest.fn().mockReturnValue(true) export const useCheckPermissions = jest.fn().mockReturnValue(true) const { useStore: _useStore, StoreProvider: _StoreProvider } = jest.requireActual('hooks') diff --git a/studio/components/grid/components/header/Header.tsx b/studio/components/grid/components/header/Header.tsx index 86aad589319..db30a9924d1 100644 --- a/studio/components/grid/components/header/Header.tsx +++ b/studio/components/grid/components/header/Header.tsx @@ -13,7 +13,7 @@ import { } from 'ui' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { checkPermissions, useStore, useUrlState } from 'hooks' +import { useCheckPermissions, useStore, useUrlState } from 'hooks' import FilterDropdown from './filter' import SortPopover from './sort' import RefreshButton from './RefreshButton' @@ -106,7 +106,7 @@ const DefaultHeader = ({ const canAddNew = onAddRow !== undefined || onAddColumn !== undefined // [Joshen] Using this logic to block both column and row creation/update/delete - const canCreateColumns = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'columns') + const canCreateColumns = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'columns') const [{ filter: filters, sort: sorts }, setParams] = useUrlState({ arrayKeys: ['sort', 'filter'], diff --git a/studio/components/interfaces/App/CommandMenuWrapper.tsx b/studio/components/interfaces/App/CommandMenuWrapper.tsx index c144d66e646..e94fe6797d1 100644 --- a/studio/components/interfaces/App/CommandMenuWrapper.tsx +++ b/studio/components/interfaces/App/CommandMenuWrapper.tsx @@ -8,7 +8,7 @@ import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectConte import { useProjectApiQuery } from 'data/config/project-api-query' import { SqlSnippet } from 'data/content/sql-snippets-query' import { useEntityDefinitionsQuery } from 'data/database/entity-definitions-query' -import { checkPermissions, useFlag, useSelectedOrganization, useStore } from 'hooks' +import { useCheckPermissions, useFlag, useSelectedOrganization, useStore } from 'hooks' import { uuidv4 } from 'lib/helpers' import { useProfile } from 'lib/profile' import { useSqlEditorStateSnapshot } from 'state/sql-editor' @@ -27,7 +27,7 @@ const CommandMenuWrapper = ({ children }: PropsWithChildren<{}>) => { const { profile } = useProfile() const { data: settings } = useProjectApiQuery({ projectRef: ref }) - const canCreateSQLSnippet = checkPermissions(PermissionAction.CREATE, 'user_content', { + const canCreateSQLSnippet = useCheckPermissions(PermissionAction.CREATE, 'user_content', { resource: { type: 'sql', owner_id: profile?.id }, subject: { id: profile?.id }, }) diff --git a/studio/components/interfaces/Auth/AuthProvidersForm/ProviderForm.tsx b/studio/components/interfaces/Auth/AuthProvidersForm/ProviderForm.tsx index cab31f81782..0851c3e397f 100644 --- a/studio/components/interfaces/Auth/AuthProvidersForm/ProviderForm.tsx +++ b/studio/components/interfaces/Auth/AuthProvidersForm/ProviderForm.tsx @@ -7,7 +7,7 @@ import { Alert, Button, Collapsible, Form, IconCheck, IconChevronUp, Input } fro import { useParams } from 'common' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' import { useCustomDomainsQuery } from 'data/custom-domains/custom-domains-query' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import { BASE_PATH } from 'lib/constants' import { ProviderCollapsibleClasses } from './AuthProvidersForm.constants' import { Provider } from './AuthProvidersForm.types' @@ -23,7 +23,7 @@ const ProviderForm = ({ provider }: ProviderFormProps) => { const { project: selectedProject } = useProjectContext() const { ref } = useParams() const doubleNegativeKeys = ['MAILER_AUTOCONFIRM', 'SMS_AUTOCONFIRM'] - const canUpdateConfig = checkPermissions(PermissionAction.UPDATE, 'custom_config_gotrue') + const canUpdateConfig = useCheckPermissions(PermissionAction.UPDATE, 'custom_config_gotrue') const { data: customDomainData } = useCustomDomainsQuery({ projectRef: ref }) diff --git a/studio/components/interfaces/Auth/AutoSchemaForm.tsx b/studio/components/interfaces/Auth/AutoSchemaForm.tsx index 614fe8ba38e..72722a74e46 100644 --- a/studio/components/interfaces/Auth/AutoSchemaForm.tsx +++ b/studio/components/interfaces/Auth/AutoSchemaForm.tsx @@ -4,7 +4,7 @@ import { boolean, number, object, string } from 'yup' import { PermissionAction } from '@supabase/shared-types/out/constants' import { Button, Form, Input, IconEye, IconEyeOff, InputNumber, Toggle, Radio } from 'ui' -import { useStore, checkPermissions } from 'hooks' +import { useStore, useCheckPermissions } from 'hooks' import { FormActions, FormHeader, @@ -20,7 +20,7 @@ const AutoSchemaForm = observer(() => { const formId = 'auth-config-general-form' const [hidden, setHidden] = useState(true) - const canUpdateConfig = checkPermissions(PermissionAction.UPDATE, 'custom_config_gotrue') + const canUpdateConfig = useCheckPermissions(PermissionAction.UPDATE, 'custom_config_gotrue') const INITIAL_VALUES = { DISABLE_SIGNUP: !authConfig.config.DISABLE_SIGNUP, diff --git a/studio/components/interfaces/Auth/EmailTemplates/TemplateEditor.tsx b/studio/components/interfaces/Auth/EmailTemplates/TemplateEditor.tsx index 1dd3ab709bf..d1e9e700792 100644 --- a/studio/components/interfaces/Auth/EmailTemplates/TemplateEditor.tsx +++ b/studio/components/interfaces/Auth/EmailTemplates/TemplateEditor.tsx @@ -4,7 +4,7 @@ import { observer } from 'mobx-react-lite' import { Input, Form } from 'ui' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { useStore, checkPermissions } from 'hooks' +import { useStore, useCheckPermissions } from 'hooks' import { FormSchema } from 'types' import { FormActions, FormSection, FormSectionContent, FormSectionLabel } from 'components/ui/Forms' import CodeEditor from 'components/ui/CodeEditor' @@ -23,7 +23,7 @@ const TemplateEditor: FC = ({ template }) => { const formId = `auth-config-email-templates-${id}` const INITIAL_VALUES: { [x: string]: string } = {} - const canUpdateConfig = checkPermissions(PermissionAction.UPDATE, 'custom_config_gotrue') + const canUpdateConfig = useCheckPermissions(PermissionAction.UPDATE, 'custom_config_gotrue') useEffect(() => { if (isLoaded) { diff --git a/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx b/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx index 41518f2742e..aa9dcb9cc88 100644 --- a/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx +++ b/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx @@ -4,7 +4,7 @@ import { Button, Dropdown, IconEdit, IconTrash, IconMoreVertical } from 'ui' import type { PostgresPolicy } from '@supabase/postgres-meta' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { checkPermissions } from 'hooks' +import { useCheckPermissions } from 'hooks' import Panel from 'components/ui/Panel' interface Props { @@ -18,7 +18,7 @@ const PolicyRow: FC = ({ onSelectEditPolicy = () => {}, onSelectDeletePolicy = () => {}, }) => { - const canUpdatePolicies = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'policies') + const canUpdatePolicies = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'policies') return ( = ({ }) => { const router = useRouter() const { ref } = router.query - const canToggleRLS = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'tables') - const canCreatePolicies = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'policies') + const canToggleRLS = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'tables') + const canCreatePolicies = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'policies') return (
    diff --git a/studio/components/interfaces/Auth/RedirectUrls/RedirectUrls.tsx b/studio/components/interfaces/Auth/RedirectUrls/RedirectUrls.tsx index 178ad63bd38..19ed2369767 100644 --- a/studio/components/interfaces/Auth/RedirectUrls/RedirectUrls.tsx +++ b/studio/components/interfaces/Auth/RedirectUrls/RedirectUrls.tsx @@ -5,7 +5,7 @@ import * as Tooltip from '@radix-ui/react-tooltip' import { Button, Form, Input, Modal } from 'ui' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import { FormHeader } from 'components/ui/Forms' import { urlRegex } from '../Auth.constants' import RedirectUrlList from './RedirectUrlList' @@ -21,7 +21,7 @@ const RedirectUrls = () => { const [isDeleting, setIsDeleting] = useState(false) const [selectedUrlToDelete, setSelectedUrlToDelete] = useState() - const canUpdateConfig = checkPermissions(PermissionAction.UPDATE, 'custom_config_gotrue') + const canUpdateConfig = useCheckPermissions(PermissionAction.UPDATE, 'custom_config_gotrue') const newUrlSchema = object({ url: string().matches(urlRegex, 'URL is not valid').required(), diff --git a/studio/components/interfaces/Auth/SiteUrl/SiteUrl.tsx b/studio/components/interfaces/Auth/SiteUrl/SiteUrl.tsx index 1ad738c80be..da893178403 100644 --- a/studio/components/interfaces/Auth/SiteUrl/SiteUrl.tsx +++ b/studio/components/interfaces/Auth/SiteUrl/SiteUrl.tsx @@ -12,7 +12,7 @@ import { FormSectionContent, FormSectionLabel, } from 'components/ui/Forms' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' const SiteUrl = observer(() => { const { authConfig, ui } = useStore() @@ -21,7 +21,7 @@ const SiteUrl = observer(() => { const formId = 'auth-config-general-form' const [hidden, setHidden] = useState(true) - const canUpdateConfig = checkPermissions(PermissionAction.UPDATE, 'custom_config_gotrue') + const canUpdateConfig = useCheckPermissions(PermissionAction.UPDATE, 'custom_config_gotrue') const INITIAL_VALUES = { DISABLE_SIGNUP: !authConfig.config.DISABLE_SIGNUP, diff --git a/studio/components/interfaces/Auth/SmtpForm/SmtpForm.tsx b/studio/components/interfaces/Auth/SmtpForm/SmtpForm.tsx index 8d658333d9b..26cba0e4739 100644 --- a/studio/components/interfaces/Auth/SmtpForm/SmtpForm.tsx +++ b/studio/components/interfaces/Auth/SmtpForm/SmtpForm.tsx @@ -12,7 +12,7 @@ import { FormSectionContent, FormSectionLabel, } from 'components/ui/Forms' -import { useStore, checkPermissions } from 'hooks' +import { useStore, useCheckPermissions } from 'hooks' import { urlRegex } from './../Auth.constants' import { defaultDisabledSmtpFormValues } from './SmtpForm.constants' import { generateFormValues, isSmtpEnabled } from './SmtpForm.utils' @@ -26,7 +26,7 @@ const SmtpForm = () => { const formId = 'auth-config-smtp-form' const initialValues = generateFormValues(authConfig.config) - const canUpdateConfig = checkPermissions(PermissionAction.UPDATE, 'custom_config_gotrue') + const canUpdateConfig = useCheckPermissions(PermissionAction.UPDATE, 'custom_config_gotrue') useEffect(() => { if (isLoaded && isSmtpEnabled(config)) { diff --git a/studio/components/interfaces/Auth/Users/CreateUserModal.tsx b/studio/components/interfaces/Auth/Users/CreateUserModal.tsx index 94698aca740..527b09d4f16 100644 --- a/studio/components/interfaces/Auth/Users/CreateUserModal.tsx +++ b/studio/components/interfaces/Auth/Users/CreateUserModal.tsx @@ -5,7 +5,7 @@ import { Button, Checkbox, Form, IconLock, IconMail, Input, Loading, Modal } fro import { useUserCreateMutation } from 'data/auth/user-create-mutation' import { useProjectApiQuery } from 'data/config/project-api-query' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import { PageContext } from 'pages/project/[ref]/auth/users' export type CreateUserModalProps = { @@ -21,7 +21,7 @@ const CreateUserModal = ({ visible, setVisible }: CreateUserModalProps) => { const { data, isLoading, isSuccess } = useProjectApiQuery({ projectRef }, { enabled: visible }) const handleToggle = () => setVisible(!visible) - const canCreateUsers = checkPermissions(PermissionAction.AUTH_EXECUTE, 'create_user') + const canCreateUsers = useCheckPermissions(PermissionAction.AUTH_EXECUTE, 'create_user') const validate = (values: any) => { const errors: any = {} diff --git a/studio/components/interfaces/Auth/Users/InviteUserModal.tsx b/studio/components/interfaces/Auth/Users/InviteUserModal.tsx index 2ec628eb448..f64c1723ccb 100644 --- a/studio/components/interfaces/Auth/Users/InviteUserModal.tsx +++ b/studio/components/interfaces/Auth/Users/InviteUserModal.tsx @@ -3,7 +3,7 @@ import { observer } from 'mobx-react-lite' import { useContext } from 'react' import { Button, Form, IconMail, Input, Modal } from 'ui' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import { post } from 'lib/common/fetch' import { API_URL } from 'lib/constants' import { PageContext } from 'pages/project/[ref]/auth/users' @@ -18,7 +18,7 @@ const InviteUserModal = ({ visible, setVisible }: InviteUserModalProps) => { const PageState: any = useContext(PageContext) const handleToggle = () => setVisible(!visible) - const canInviteUsers = checkPermissions(PermissionAction.AUTH_EXECUTE, 'invite_user') + const canInviteUsers = useCheckPermissions(PermissionAction.AUTH_EXECUTE, 'invite_user') const validate = (values: any) => { const errors: any = {} diff --git a/studio/components/interfaces/Auth/Users/UsersList.tsx b/studio/components/interfaces/Auth/Users/UsersList.tsx index cd583dd76c3..652858cb5f1 100644 --- a/studio/components/interfaces/Auth/Users/UsersList.tsx +++ b/studio/components/interfaces/Auth/Users/UsersList.tsx @@ -6,15 +6,15 @@ import { PageContext } from 'pages/project/[ref]/auth/users' import Table from 'components/to-be-cleaned/Table' import UserListItem from './UsersListItem' import UsersPagination from './UsersPagination' -import { checkPermissions } from 'hooks' +import { useCheckPermissions } from 'hooks' import { PermissionAction } from '@supabase/shared-types/out/constants' const UsersList = ({}) => { const PageState: any = useContext(PageContext) // Check once on the top level, rather than checking for every row - const canRemoveUser = checkPermissions(PermissionAction.TENANT_SQL_DELETE, 'auth.users') - const canRemoveMFAFactors = checkPermissions( + const canRemoveUser = useCheckPermissions(PermissionAction.TENANT_SQL_DELETE, 'auth.users') + const canRemoveMFAFactors = useCheckPermissions( PermissionAction.TENANT_SQL_DELETE, 'auth.mfa_factors' ) diff --git a/studio/components/interfaces/BillingV2/Subscription/AddOns/ComputeInstanceSidePanel.tsx b/studio/components/interfaces/BillingV2/Subscription/AddOns/ComputeInstanceSidePanel.tsx index 955d6a82d8b..f6bdf2517a6 100644 --- a/studio/components/interfaces/BillingV2/Subscription/AddOns/ComputeInstanceSidePanel.tsx +++ b/studio/components/interfaces/BillingV2/Subscription/AddOns/ComputeInstanceSidePanel.tsx @@ -12,7 +12,7 @@ import { useProjectAddonRemoveMutation } from 'data/subscriptions/project-addon- import { useProjectAddonUpdateMutation } from 'data/subscriptions/project-addon-update-mutation' import { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query' import { useProjectSubscriptionV2Query } from 'data/subscriptions/project-subscription-v2-query' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import { BASE_PATH, PROJECT_STATUS } from 'lib/constants' import Telemetry from 'lib/telemetry' import { useSubscriptionPageStateSnapshot } from 'state/subscription-page' @@ -51,7 +51,10 @@ const ComputeInstanceSidePanel = () => { const [selectedCategory, setSelectedCategory] = useState<'micro' | 'optimized'>('micro') const [selectedOption, setSelectedOption] = useState('ci_micro') - const canUpdateCompute = checkPermissions(PermissionAction.BILLING_WRITE, 'stripe.subscriptions') + const canUpdateCompute = useCheckPermissions( + PermissionAction.BILLING_WRITE, + 'stripe.subscriptions' + ) const snap = useSubscriptionPageStateSnapshot() const visible = snap.panelKey === 'computeInstance' diff --git a/studio/components/interfaces/BillingV2/Subscription/AddOns/CustomDomainSidePanel.tsx b/studio/components/interfaces/BillingV2/Subscription/AddOns/CustomDomainSidePanel.tsx index 46c5be4a06f..3dc20f0aa3b 100644 --- a/studio/components/interfaces/BillingV2/Subscription/AddOns/CustomDomainSidePanel.tsx +++ b/studio/components/interfaces/BillingV2/Subscription/AddOns/CustomDomainSidePanel.tsx @@ -5,7 +5,7 @@ import { useProjectAddonRemoveMutation } from 'data/subscriptions/project-addon- import { useProjectAddonUpdateMutation } from 'data/subscriptions/project-addon-update-mutation' import { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query' import { useProjectSubscriptionV2Query } from 'data/subscriptions/project-subscription-v2-query' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import Link from 'next/link' import { useEffect, useState } from 'react' import { useSubscriptionPageStateSnapshot } from 'state/subscription-page' @@ -21,7 +21,7 @@ const CustomDomainSidePanel = () => { const [isSubmitting, setIsSubmitting] = useState(false) const [selectedOption, setSelectedOption] = useState('cd_none') - const canUpdateCustomDomain = checkPermissions( + const canUpdateCustomDomain = useCheckPermissions( PermissionAction.BILLING_WRITE, 'stripe.subscriptions' ) diff --git a/studio/components/interfaces/BillingV2/Subscription/AddOns/PITRSidePanel.tsx b/studio/components/interfaces/BillingV2/Subscription/AddOns/PITRSidePanel.tsx index b944e79cd6b..3fe86f26c81 100644 --- a/studio/components/interfaces/BillingV2/Subscription/AddOns/PITRSidePanel.tsx +++ b/studio/components/interfaces/BillingV2/Subscription/AddOns/PITRSidePanel.tsx @@ -5,7 +5,7 @@ import { useProjectAddonRemoveMutation } from 'data/subscriptions/project-addon- import { useProjectAddonUpdateMutation } from 'data/subscriptions/project-addon-update-mutation' import { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query' import { useProjectSubscriptionV2Query } from 'data/subscriptions/project-subscription-v2-query' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import { BASE_PATH } from 'lib/constants' import Link from 'next/link' import { useEffect, useState } from 'react' @@ -44,7 +44,7 @@ const PITRSidePanel = () => { const [selectedCategory, setSelectedCategory] = useState<'on' | 'off'>('off') const [selectedOption, setSelectedOption] = useState('pitr_0') - const canUpdatePitr = checkPermissions(PermissionAction.BILLING_WRITE, 'stripe.subscriptions') + const canUpdatePitr = useCheckPermissions(PermissionAction.BILLING_WRITE, 'stripe.subscriptions') const snap = useSubscriptionPageStateSnapshot() const visible = snap.panelKey === 'pitr' diff --git a/studio/components/interfaces/BillingV2/Subscription/CostControl/SpendCapSidePanel.tsx b/studio/components/interfaces/BillingV2/Subscription/CostControl/SpendCapSidePanel.tsx index 3a8bb65b1e2..8e150368483 100644 --- a/studio/components/interfaces/BillingV2/Subscription/CostControl/SpendCapSidePanel.tsx +++ b/studio/components/interfaces/BillingV2/Subscription/CostControl/SpendCapSidePanel.tsx @@ -3,7 +3,7 @@ import { useParams, useTheme } from 'common' import Table from 'components/to-be-cleaned/Table' import { useProjectSubscriptionUpdateMutation } from 'data/subscriptions/project-subscription-update-mutation' import { useProjectSubscriptionV2Query } from 'data/subscriptions/project-subscription-v2-query' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import { BASE_PATH, PRICING_TIER_PRODUCT_IDS } from 'lib/constants' import Link from 'next/link' import { useEffect, useState } from 'react' @@ -44,7 +44,10 @@ const SpendCapSidePanel = () => { const [isSubmitting, setIsSubmitting] = useState(false) const [selectedOption, setSelectedOption] = useState<'on' | 'off'>() - const canUpdateSpendCap = checkPermissions(PermissionAction.BILLING_WRITE, 'stripe.subscriptions') + const canUpdateSpendCap = useCheckPermissions( + PermissionAction.BILLING_WRITE, + 'stripe.subscriptions' + ) const snap = useSubscriptionPageStateSnapshot() const visible = snap.panelKey === 'costControl' diff --git a/studio/components/interfaces/BillingV2/Subscription/Tier/PaymentMethodSelection.tsx b/studio/components/interfaces/BillingV2/Subscription/Tier/PaymentMethodSelection.tsx index f0716fe15f5..877d1cc9f94 100644 --- a/studio/components/interfaces/BillingV2/Subscription/Tier/PaymentMethodSelection.tsx +++ b/studio/components/interfaces/BillingV2/Subscription/Tier/PaymentMethodSelection.tsx @@ -5,7 +5,7 @@ import { useEffect, useMemo, useState } from 'react' import { useParams } from 'common' import { useOrganizationCustomerProfileQuery } from 'data/organizations/organization-customer-profile-query' import { useOrganizationPaymentMethodsQuery } from 'data/organizations/organization-payment-methods-query' -import { checkPermissions, useSelectedOrganization, useStore } from 'hooks' +import { useCheckPermissions, useSelectedOrganization, useStore } from 'hooks' import { BASE_PATH } from 'lib/constants' import { getURL } from 'lib/helpers' import { Button, IconAlertCircle, IconCreditCard, IconLoader, IconPlus, Listbox } from 'ui' @@ -37,7 +37,7 @@ const PaymentMethodSelection = ({ const { data: customerProfile, isSuccess: loadedCustomerProfile } = useOrganizationCustomerProfileQuery({ slug }) - const canUpdatePaymentMethods = checkPermissions( + const canUpdatePaymentMethods = useCheckPermissions( PermissionAction.BILLING_WRITE, 'stripe.payment_methods' ) diff --git a/studio/components/interfaces/BillingV2/Subscription/Tier/SubscriptionPaymentMethod.tsx b/studio/components/interfaces/BillingV2/Subscription/Tier/SubscriptionPaymentMethod.tsx index 5d976888e09..ae705f20c2a 100644 --- a/studio/components/interfaces/BillingV2/Subscription/Tier/SubscriptionPaymentMethod.tsx +++ b/studio/components/interfaces/BillingV2/Subscription/Tier/SubscriptionPaymentMethod.tsx @@ -9,7 +9,7 @@ import { updateSubscriptionTier, } from 'data/subscriptions/project-subscription-update-mutation' import { ProjectSubscriptionResponse } from 'data/subscriptions/project-subscription-v2-query' -import { checkPermissions, useSelectedOrganization, useStore } from 'hooks' +import { useCheckPermissions, useSelectedOrganization, useStore } from 'hooks' import { BASE_PATH } from 'lib/constants' import Link from 'next/link' import { Button, IconCreditCard, Modal } from 'ui' @@ -30,7 +30,7 @@ const SubscriptionPaymentMethod = ({ const selectedOrganization = useSelectedOrganization() const currentOrgSlug = selectedOrganization?.slug - const canUpdatePaymentMethod = checkPermissions( + const canUpdatePaymentMethod = useCheckPermissions( PermissionAction.BILLING_WRITE, 'stripe.subscriptions' ) diff --git a/studio/components/interfaces/BillingV2/Subscription/Tier/TierUpdateSidePanel.tsx b/studio/components/interfaces/BillingV2/Subscription/Tier/TierUpdateSidePanel.tsx index 4e70127394f..5c6d5675bec 100644 --- a/studio/components/interfaces/BillingV2/Subscription/Tier/TierUpdateSidePanel.tsx +++ b/studio/components/interfaces/BillingV2/Subscription/Tier/TierUpdateSidePanel.tsx @@ -11,7 +11,7 @@ import { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query' import { useProjectPlansQuery } from 'data/subscriptions/project-plans-query' import { useProjectSubscriptionUpdateMutation } from 'data/subscriptions/project-subscription-update-mutation' import { useProjectSubscriptionV2Query } from 'data/subscriptions/project-subscription-v2-query' -import { checkPermissions, useSelectedOrganization, useStore } from 'hooks' +import { useCheckPermissions, useSelectedOrganization, useStore } from 'hooks' import { PRICING_TIER_PRODUCT_IDS } from 'lib/constants' import Telemetry from 'lib/telemetry' import { useRouter } from 'next/router' @@ -36,7 +36,7 @@ const TierUpdateSidePanel = () => { const [showDowngradeError, setShowDowngradeError] = useState(false) const [selectedTier, setSelectedTier] = useState<'tier_free' | 'tier_pro' | 'tier_team'>() - const canUpdateSubscription = checkPermissions( + const canUpdateSubscription = useCheckPermissions( PermissionAction.BILLING_WRITE, 'stripe.subscriptions' ) diff --git a/studio/components/interfaces/Database/Backups/BackupItem.tsx b/studio/components/interfaces/Database/Backups/BackupItem.tsx index 79ab41f9275..473f4b837cb 100644 --- a/studio/components/interfaces/Database/Backups/BackupItem.tsx +++ b/studio/components/interfaces/Database/Backups/BackupItem.tsx @@ -6,7 +6,7 @@ import { FC, useState } from 'react' import { confirmAlert } from 'components/to-be-cleaned/ModalsDeprecated/ConfirmModal' import { setProjectStatus } from 'data/projects/projects-query' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import { post } from 'lib/common/fetch' import { API_URL, PROJECT_STATUS } from 'lib/constants' import { Badge, Button, IconDownload } from 'ui' @@ -25,7 +25,7 @@ const BackupItem: FC = ({ projectRef, backup, index }) => { const [isDownloading, setDownloading] = useState(false) const [isRestoring, setRestoring] = useState(false) - const canTriggerScheduledBackups = checkPermissions( + const canTriggerScheduledBackups = useCheckPermissions( PermissionAction.INFRA_EXECUTE, 'queue_job.restore.prepare' ) diff --git a/studio/components/interfaces/Database/Backups/BackupsList.tsx b/studio/components/interfaces/Database/Backups/BackupsList.tsx index 8b402c75b84..fd379d00293 100644 --- a/studio/components/interfaces/Database/Backups/BackupsList.tsx +++ b/studio/components/interfaces/Database/Backups/BackupsList.tsx @@ -6,7 +6,7 @@ import InformationBox from 'components/ui/InformationBox' import Loading from 'components/ui/Loading' import Panel from 'components/ui/Panel' import UpgradeToPro from 'components/ui/UpgradeToPro' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import { IconAlertCircle, IconClock } from 'ui' import BackupItem from './BackupItem' import BackupsEmpty from './BackupsEmpty' @@ -16,7 +16,7 @@ const BackupsList = () => { const { project: selectedProject } = useProjectContext() const { backups } = useStore() const projectRef = selectedProject?.ref || 'default' - const canTriggerScheduledBackups = checkPermissions( + const canTriggerScheduledBackups = useCheckPermissions( PermissionAction.INFRA_EXECUTE, 'queue_job.restore.prepare' ) diff --git a/studio/components/interfaces/Database/Backups/PITR/PITRNotice.tsx b/studio/components/interfaces/Database/Backups/PITR/PITRNotice.tsx index 88e43844ae3..9a1e23206e7 100644 --- a/studio/components/interfaces/Database/Backups/PITR/PITRNotice.tsx +++ b/studio/components/interfaces/Database/Backups/PITR/PITRNotice.tsx @@ -2,7 +2,7 @@ import Link from 'next/link' import { Button, IconCalendar } from 'ui' import { FormPanel } from 'components/ui/Forms' import * as Tooltip from '@radix-ui/react-tooltip' -import { checkPermissions } from 'hooks' +import { useCheckPermissions } from 'hooks' import { useParams } from 'common/hooks' import { getPITRRetentionDuration } from './PITR.utils' import { PermissionAction } from '@supabase/shared-types/out/constants' @@ -13,7 +13,7 @@ const PITRNotice = ({}) => { const { data: addonsResponse } = useProjectAddonsQuery({ projectRef }) const retentionPeriod = getPITRRetentionDuration(addonsResponse?.selected_addons ?? []) - const canUpdateSubscription = checkPermissions( + const canUpdateSubscription = useCheckPermissions( PermissionAction.BILLING_WRITE, 'stripe.subscriptions' ) @@ -28,7 +28,10 @@ const PITRNotice = ({}) => { - + diff --git a/studio/components/interfaces/Database/Backups/PITR/PITRStatus.tsx b/studio/components/interfaces/Database/Backups/PITR/PITRStatus.tsx index 86983a22ba6..93fd29b5a17 100644 --- a/studio/components/interfaces/Database/Backups/PITR/PITRStatus.tsx +++ b/studio/components/interfaces/Database/Backups/PITR/PITRStatus.tsx @@ -4,7 +4,7 @@ import { observer } from 'mobx-react-lite' import { Button, IconAlertCircle } from 'ui' import * as Tooltip from '@radix-ui/react-tooltip' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import { Timezone } from './PITR.types' import { FormPanel } from 'components/ui/Forms' import TimezoneSelection from './TimezoneSelection' @@ -31,7 +31,7 @@ const PITRStatus: FC = ({ selectedTimezone, onUpdateTimezone, onSetConfig .tz(selectedTimezone?.utc[0]) .format('DD MMM YYYY, HH:mm:ss') - const canTriggerPhysicalBackup = checkPermissions( + const canTriggerPhysicalBackup = useCheckPermissions( PermissionAction.INFRA_EXECUTE, 'queue_job.walg.prepare_restore' ) diff --git a/studio/components/interfaces/Database/Extensions/ExtensionCard.tsx b/studio/components/interfaces/Database/Extensions/ExtensionCard.tsx index f7f3337f962..4115bd71ec5 100644 --- a/studio/components/interfaces/Database/Extensions/ExtensionCard.tsx +++ b/studio/components/interfaces/Database/Extensions/ExtensionCard.tsx @@ -3,7 +3,7 @@ import { observer } from 'mobx-react-lite' import { Badge, IconLoader, Toggle } from 'ui' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import { confirmAlert } from 'components/to-be-cleaned/ModalsDeprecated/ConfirmModal' import EnableExtensionModal from './EnableExtensionModal' @@ -18,7 +18,7 @@ const ExtensionCard: FC = ({ extension }) => { const [loading, setLoading] = useState(false) const [showConfirmEnableModal, setShowConfirmEnableModal] = useState(false) - const canUpdateExtensions = checkPermissions( + const canUpdateExtensions = useCheckPermissions( PermissionAction.TENANT_SQL_ADMIN_WRITE, 'extensions' ) diff --git a/studio/components/interfaces/Database/Extensions/Extensions.tsx b/studio/components/interfaces/Database/Extensions/Extensions.tsx index 48164cf331f..c6d771b111d 100644 --- a/studio/components/interfaces/Database/Extensions/Extensions.tsx +++ b/studio/components/interfaces/Database/Extensions/Extensions.tsx @@ -4,7 +4,7 @@ import { partition, isNull } from 'lodash' import { Input, IconSearch, IconAlertCircle, Button, IconBookOpen } from 'ui' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { useStore, checkPermissions } from 'hooks' +import { useStore, useCheckPermissions } from 'hooks' import { useParams } from 'common/hooks' import ExtensionCard from './ExtensionCard' import { HIDDEN_EXTENSIONS } from './Extensions.constants' @@ -31,7 +31,7 @@ const Extensions: FC = ({}) => { (ext: any) => !isNull(ext.installed_version) ) - const canUpdateExtensions = checkPermissions( + const canUpdateExtensions = useCheckPermissions( PermissionAction.TENANT_SQL_ADMIN_WRITE, 'extensions' ) diff --git a/studio/components/interfaces/Database/Functions/FunctionsList/FunctionList.tsx b/studio/components/interfaces/Database/Functions/FunctionsList/FunctionList.tsx index 025e271ef86..84da9135f79 100644 --- a/studio/components/interfaces/Database/Functions/FunctionsList/FunctionList.tsx +++ b/studio/components/interfaces/Database/Functions/FunctionsList/FunctionList.tsx @@ -7,7 +7,7 @@ import { FC } from 'react' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' import Table from 'components/to-be-cleaned/Table' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import { Button, Dropdown, IconEdit3, IconFileText, IconMoreVertical, IconTrash } from 'ui' interface Props { @@ -34,7 +34,10 @@ const FunctionList: FC = ({ const isApiDocumentAvailable = schema == 'public' const projectRef = selectedProject?.ref - const canUpdateFunctions = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'functions') + const canUpdateFunctions = useCheckPermissions( + PermissionAction.TENANT_SQL_ADMIN_WRITE, + 'functions' + ) function onEdit(func: any) { editFunction(func) diff --git a/studio/components/interfaces/Database/Functions/FunctionsList/FunctionsList.tsx b/studio/components/interfaces/Database/Functions/FunctionsList/FunctionsList.tsx index b5571b31790..14432ade492 100644 --- a/studio/components/interfaces/Database/Functions/FunctionsList/FunctionsList.tsx +++ b/studio/components/interfaces/Database/Functions/FunctionsList/FunctionsList.tsx @@ -6,7 +6,7 @@ import * as Tooltip from '@radix-ui/react-tooltip' import { PostgresFunction } from '@supabase/postgres-meta' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import AlphaPreview from 'components/to-be-cleaned/AlphaPreview' import ProductEmptyState from 'components/to-be-cleaned/ProductEmptyState' import SchemaTable from './SchemaTable' @@ -32,7 +32,10 @@ const FunctionsList: FC = ({ includes(x.name?.toLowerCase(), filterString.toLowerCase()) ) const filteredFunctionSchemas = lodashMap(uniqBy(filteredFunctions, 'schema'), 'schema') - const canCreateFunctions = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'functions') + const canCreateFunctions = useCheckPermissions( + PermissionAction.TENANT_SQL_ADMIN_WRITE, + 'functions' + ) if (meta.functions.isLoading) { return ( diff --git a/studio/components/interfaces/Database/Hooks/HooksList/HookList.tsx b/studio/components/interfaces/Database/Hooks/HooksList/HookList.tsx index df502f33d71..b023527e7a0 100644 --- a/studio/components/interfaces/Database/Hooks/HooksList/HookList.tsx +++ b/studio/components/interfaces/Database/Hooks/HooksList/HookList.tsx @@ -7,7 +7,7 @@ import { useParams } from 'common/hooks' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' import Table from 'components/to-be-cleaned/Table' import { useDatabaseHooks } from 'data/database-triggers/database-triggers-query' -import { checkPermissions } from 'hooks' +import { useCheckPermissions } from 'hooks' import { BASE_PATH } from 'lib/constants' import { Badge, Button, Dropdown, IconEdit3, IconMoreVertical, IconTrash } from 'ui' @@ -35,7 +35,7 @@ const HookList = ({ schema, filterString, editHook = noop, deleteHook = noop }: x.schema === schema && x.function_args.length >= 2 ) - const canUpdateWebhook = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'triggers') + const canUpdateWebhook = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'triggers') return ( <> diff --git a/studio/components/interfaces/Database/Hooks/HooksList/HooksList.tsx b/studio/components/interfaces/Database/Hooks/HooksList/HooksList.tsx index e7330f12d3e..ec66dbfa62c 100644 --- a/studio/components/interfaces/Database/Hooks/HooksList/HooksList.tsx +++ b/studio/components/interfaces/Database/Hooks/HooksList/HooksList.tsx @@ -6,7 +6,7 @@ import * as Tooltip from '@radix-ui/react-tooltip' import { Button, Input, IconSearch, IconExternalLink } from 'ui' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { checkPermissions } from 'hooks' +import { useCheckPermissions } from 'hooks' import SchemaTable from './SchemaTable' import AlphaPreview from 'components/to-be-cleaned/AlphaPreview' import ProductEmptyState from 'components/to-be-cleaned/ProductEmptyState' @@ -44,7 +44,7 @@ const HooksList = ({ includes(x.name.toLowerCase(), filterString.toLowerCase()) ) const filteredHookSchemas = lodashMap(uniqBy(filteredHooks, 'schema'), 'schema') - const canCreateWebhooks = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'triggers') + const canCreateWebhooks = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'triggers') return ( <> diff --git a/studio/components/interfaces/Database/Publications/PublicationsList.tsx b/studio/components/interfaces/Database/Publications/PublicationsList.tsx index ce030e980f3..385235c3f96 100644 --- a/studio/components/interfaces/Database/Publications/PublicationsList.tsx +++ b/studio/components/interfaces/Database/Publications/PublicationsList.tsx @@ -3,7 +3,7 @@ import { observer } from 'mobx-react-lite' import { PermissionAction } from '@supabase/shared-types/out/constants' import { Button, Input, Toggle, IconSearch, IconAlertCircle } from 'ui' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import { confirmAlert } from 'components/to-be-cleaned/ModalsDeprecated/ConfirmModal' import Table from 'components/to-be-cleaned/Table' import NoSearchResults from 'components/ui/NoSearchResults' @@ -17,7 +17,7 @@ const PublicationsList: FC = ({ onSelectPublication = () => {} }) => { const { ui, meta } = useStore() const [filterString, setFilterString] = useState('') - const canUpdatePublications = checkPermissions( + const canUpdatePublications = useCheckPermissions( PermissionAction.TENANT_SQL_ADMIN_WRITE, 'publications' ) diff --git a/studio/components/interfaces/Database/Publications/PublicationsTableItem.tsx b/studio/components/interfaces/Database/Publications/PublicationsTableItem.tsx index 5c30d1f31cc..1a0c0ef867c 100644 --- a/studio/components/interfaces/Database/Publications/PublicationsTableItem.tsx +++ b/studio/components/interfaces/Database/Publications/PublicationsTableItem.tsx @@ -4,7 +4,7 @@ import { Badge, Toggle } from 'ui' import type { PostgresPublication, PostgresTable } from '@supabase/postgres-meta' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import Table from 'components/to-be-cleaned/Table' interface Props { @@ -21,7 +21,7 @@ const PublicationsTableItem: FC = ({ table, selectedPublication }) => { selectedPublication.tables?.find((x: any) => x.id == table.id) != undefined ) - const canUpdatePublications = checkPermissions( + const canUpdatePublications = useCheckPermissions( PermissionAction.TENANT_SQL_ADMIN_WRITE, 'publications' ) diff --git a/studio/components/interfaces/Database/Publications/PublicationsTables.tsx b/studio/components/interfaces/Database/Publications/PublicationsTables.tsx index 73d2f67bbd5..a24f038b8a9 100644 --- a/studio/components/interfaces/Database/Publications/PublicationsTables.tsx +++ b/studio/components/interfaces/Database/Publications/PublicationsTables.tsx @@ -4,7 +4,7 @@ import { Button, Input, IconChevronLeft, IconSearch, IconAlertCircle } from 'ui' import type { PostgresPublication } from '@supabase/postgres-meta' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import PublicationsTableItem from './PublicationsTableItem' import Table from 'components/to-be-cleaned/Table' import NoSearchResults from 'components/to-be-cleaned/NoSearchResults' @@ -19,7 +19,7 @@ const PublicationsTables: FC = ({ selectedPublication, onSelectBack }) => const { meta } = useStore() const [filterString, setFilterString] = useState('') - const canUpdatePublications = checkPermissions( + const canUpdatePublications = useCheckPermissions( PermissionAction.TENANT_SQL_ADMIN_WRITE, 'publications' ) diff --git a/studio/components/interfaces/Database/Roles/RolesList.tsx b/studio/components/interfaces/Database/Roles/RolesList.tsx index 09b4d1d24d2..85c2cd4ec62 100644 --- a/studio/components/interfaces/Database/Roles/RolesList.tsx +++ b/studio/components/interfaces/Database/Roles/RolesList.tsx @@ -6,7 +6,7 @@ import { PostgresRole } from '@supabase/postgres-meta' import { Button, Input, IconPlus, IconSearch, IconX, Badge } from 'ui' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import SparkBar from 'components/ui/SparkBar' import { FormHeader } from 'components/ui/Forms' import RoleRow from './RoleRow' @@ -24,7 +24,7 @@ const RolesList = ({}) => { const [isCreatingRole, setIsCreatingRole] = useState(false) const [selectedRoleToDelete, setSelectedRoleToDelete] = useState() - const canUpdateRoles = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'roles') + const canUpdateRoles = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'roles') useEffect(() => { const getMaxConnectionLimit = async () => { diff --git a/studio/components/interfaces/Database/Tables/ColumnList.tsx b/studio/components/interfaces/Database/Tables/ColumnList.tsx index 447e4a82750..03b9a1ff1c4 100644 --- a/studio/components/interfaces/Database/Tables/ColumnList.tsx +++ b/studio/components/interfaces/Database/Tables/ColumnList.tsx @@ -5,7 +5,7 @@ import { Input, Button, IconSearch, IconPlus, IconChevronLeft, IconEdit3, IconTr import type { PostgresTable } from '@supabase/postgres-meta' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { useStore, checkPermissions } from 'hooks' +import { useStore, useCheckPermissions } from 'hooks' import Table from 'components/to-be-cleaned/Table' import NoSearchResults from 'components/to-be-cleaned/NoSearchResults' @@ -32,7 +32,7 @@ const ColumnList: FC = ({ : selectedTable.columns?.filter((column: any) => column.name.includes(filterString))) ?? [] const isLocked = meta.excludedSchemas.includes(selectedTable.schema ?? '') - const canUpdateColumns = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'columns') + const canUpdateColumns = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'columns') return ( <> diff --git a/studio/components/interfaces/Database/Tables/TableList.tsx b/studio/components/interfaces/Database/Tables/TableList.tsx index ecf88deec88..075c2873ecd 100644 --- a/studio/components/interfaces/Database/Tables/TableList.tsx +++ b/studio/components/interfaces/Database/Tables/TableList.tsx @@ -16,7 +16,7 @@ import { partition } from 'lodash' import * as Tooltip from '@radix-ui/react-tooltip' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { useStore, checkPermissions } from 'hooks' +import { useStore, useCheckPermissions } from 'hooks' import Table from 'components/to-be-cleaned/Table' import NoSearchResults from 'components/to-be-cleaned/NoSearchResults' import type { PostgresTable, PostgresSchema } from '@supabase/postgres-meta' @@ -42,7 +42,7 @@ const TableList: FC = ({ const { meta } = useStore() const { isLoading } = meta.tables const [filterString, setFilterString] = useState('') - const canUpdateTables = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'tables') + const canUpdateTables = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'tables') const schemas: PostgresSchema[] = meta.schemas.list() const [protectedSchemas, openSchemas] = partition(schemas, (schema) => diff --git a/studio/components/interfaces/Database/Triggers/TriggersList/TriggerList.tsx b/studio/components/interfaces/Database/Triggers/TriggersList/TriggerList.tsx index 659ff35ba08..51212f9b822 100644 --- a/studio/components/interfaces/Database/Triggers/TriggersList/TriggerList.tsx +++ b/studio/components/interfaces/Database/Triggers/TriggersList/TriggerList.tsx @@ -5,7 +5,7 @@ import * as Tooltip from '@radix-ui/react-tooltip' import { PermissionAction } from '@supabase/shared-types/out/constants' import { Badge, Button, Dropdown, IconMoreVertical, IconTrash, IconEdit3 } from 'ui' -import { useStore, checkPermissions } from 'hooks' +import { useStore, useCheckPermissions } from 'hooks' import Table from 'components/to-be-cleaned/Table' interface Props { @@ -23,7 +23,7 @@ const TriggerList: FC = ({ filterString, schema, editTrigger, deleteTrigg ) const _triggers = filteredTriggers.filter((x: any) => x.schema == schema) - const canUpdateTriggers = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'triggers') + const canUpdateTriggers = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'triggers') function onEdit(trigger: any) { editTrigger(trigger) diff --git a/studio/components/interfaces/Database/Triggers/TriggersList/TriggersList.tsx b/studio/components/interfaces/Database/Triggers/TriggersList/TriggersList.tsx index 75fa2be96dc..1f39f35c974 100644 --- a/studio/components/interfaces/Database/Triggers/TriggersList/TriggersList.tsx +++ b/studio/components/interfaces/Database/Triggers/TriggersList/TriggersList.tsx @@ -5,7 +5,7 @@ import * as Tooltip from '@radix-ui/react-tooltip' import { Button, Input, IconSearch, IconLoader } from 'ui' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import SchemaTable from './SchemaTable' import AlphaPreview from 'components/to-be-cleaned/AlphaPreview' import ProductEmptyState from 'components/to-be-cleaned/ProductEmptyState' @@ -23,7 +23,7 @@ const TriggersList: FC = ({ includes(x.name.toLowerCase(), filterString.toLowerCase()) ) const filteredTriggerSchemas = lodashMap(uniqBy(filteredTriggers, 'schema'), 'schema') - const canCreateTriggers = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'triggers') + const canCreateTriggers = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'triggers') if (meta.triggers.isLoading) { return ( diff --git a/studio/components/interfaces/Database/Wrappers/CreateWrapper.tsx b/studio/components/interfaces/Database/Wrappers/CreateWrapper.tsx index b2693a6ee2b..84e100f16e9 100644 --- a/studio/components/interfaces/Database/Wrappers/CreateWrapper.tsx +++ b/studio/components/interfaces/Database/Wrappers/CreateWrapper.tsx @@ -6,7 +6,7 @@ import { observer } from 'mobx-react-lite' import { Button, Form, Input, IconArrowLeft, IconExternalLink, IconEdit, IconTrash } from 'ui' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import { useParams } from 'common/hooks' import { FormPanel, @@ -37,7 +37,7 @@ const CreateWrapper = () => { const [selectedTableToEdit, setSelectedTableToEdit] = useState() const [formErrors, setFormErrors] = useState<{ [k: string]: string }>({}) - const canCreateWrapper = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'wrappers') + const canCreateWrapper = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'wrappers') const wrapperMeta = WRAPPERS.find((wrapper) => wrapper.name === type) const initialValues = diff --git a/studio/components/interfaces/Database/Wrappers/EditWrapper.tsx b/studio/components/interfaces/Database/Wrappers/EditWrapper.tsx index bb82a567cdf..8c26b54fe79 100644 --- a/studio/components/interfaces/Database/Wrappers/EditWrapper.tsx +++ b/studio/components/interfaces/Database/Wrappers/EditWrapper.tsx @@ -16,7 +16,7 @@ import { import { PermissionAction } from '@supabase/shared-types/out/constants' import { VaultSecret } from 'types' -import { checkPermissions, useImmutableValue, useStore } from 'hooks' +import { useCheckPermissions, useImmutableValue, useStore } from 'hooks' import { useParams } from 'common/hooks' import { useFDWsQuery } from 'data/fdw/fdws-query' import { useFDWUpdateMutation } from 'data/fdw/fdw-update-mutation' @@ -65,7 +65,7 @@ const EditWrapper = () => { const [selectedTableToEdit, setSelectedTableToEdit] = useState() const [formErrors, setFormErrors] = useState<{ [k: string]: string }>({}) - const canUpdateWrapper = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'wrappers') + const canUpdateWrapper = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'wrappers') const initialValues = wrapperMeta !== undefined diff --git a/studio/components/interfaces/Database/Wrappers/WrapperRow.tsx b/studio/components/interfaces/Database/Wrappers/WrapperRow.tsx index d22d91b727f..411c23e0ac3 100644 --- a/studio/components/interfaces/Database/Wrappers/WrapperRow.tsx +++ b/studio/components/interfaces/Database/Wrappers/WrapperRow.tsx @@ -6,7 +6,7 @@ import * as Tooltip from '@radix-ui/react-tooltip' import { PermissionAction } from '@supabase/shared-types/out/constants' import { Collapsible, IconChevronUp, Button, IconExternalLink, IconTrash, IconEdit } from 'ui' -import { useStore, checkPermissions } from 'hooks' +import { useStore, useCheckPermissions } from 'hooks' import { useParams } from 'common/hooks' import { WrapperMeta } from './Wrappers.types' import { FDW } from 'data/fdw/fdws-query' @@ -27,7 +27,7 @@ const WrapperRow: FC = ({ wrappers = [], wrapperMeta, isOpen, onOpen }) = const { project } = useProjectContext() const { mutateAsync: deleteFDW } = useFDWDeleteMutation() - const canManageWrappers = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'wrappers') + const canManageWrappers = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'wrappers') const onDeleteWrapper = (wrapper: any) => { confirmAlert({ diff --git a/studio/components/interfaces/Database/Wrappers/WrappersDisabledState.tsx b/studio/components/interfaces/Database/Wrappers/WrappersDisabledState.tsx index f21bf7bbe6b..7a74cdb78ec 100644 --- a/studio/components/interfaces/Database/Wrappers/WrappersDisabledState.tsx +++ b/studio/components/interfaces/Database/Wrappers/WrappersDisabledState.tsx @@ -5,7 +5,7 @@ import { observer } from 'mobx-react-lite' import * as Tooltip from '@radix-ui/react-tooltip' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import { useParams } from 'common/hooks' import { BASE_PATH } from 'lib/constants' import { useTheme } from 'common' @@ -19,7 +19,10 @@ const WrappersDisabledState = () => { const isNotAvailable = wrappersExtension === undefined || vaultExtension === undefined const [isEnabling, setIsEnabling] = useState(false) - const canToggleWrappers = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'extensions') + const canToggleWrappers = useCheckPermissions( + PermissionAction.TENANT_SQL_ADMIN_WRITE, + 'extensions' + ) const onEnableWrappers = async () => { if (wrappersExtension === undefined || vaultExtension === undefined) return diff --git a/studio/components/interfaces/Database/Wrappers/WrappersDropdown.tsx b/studio/components/interfaces/Database/Wrappers/WrappersDropdown.tsx index 33b5cd693ed..5fdab17e076 100644 --- a/studio/components/interfaces/Database/Wrappers/WrappersDropdown.tsx +++ b/studio/components/interfaces/Database/Wrappers/WrappersDropdown.tsx @@ -6,7 +6,7 @@ import { Button, Dropdown, IconPlus } from 'ui' import * as Tooltip from '@radix-ui/react-tooltip' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { checkPermissions } from 'hooks' +import { useCheckPermissions } from 'hooks' import { useParams } from 'common/hooks' import { WRAPPERS } from './Wrappers.constants' @@ -17,7 +17,7 @@ interface Props { const WrapperDropdown: FC = ({ buttonText = 'Add wrapper', align = 'end' }) => { const { ref } = useParams() - const canManageWrappers = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'wrappers') + const canManageWrappers = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'wrappers') if (!canManageWrappers) { return ( diff --git a/studio/components/interfaces/Docs/LangSelector.tsx b/studio/components/interfaces/Docs/LangSelector.tsx index a0e05272874..e9bf2158ef0 100644 --- a/studio/components/interfaces/Docs/LangSelector.tsx +++ b/studio/components/interfaces/Docs/LangSelector.tsx @@ -1,6 +1,6 @@ import { FC } from 'react' import { Button, Dropdown, IconKey } from 'ui' -import { checkPermissions } from 'hooks' +import { useCheckPermissions } from 'hooks' import { PermissionAction } from '@supabase/shared-types/out/constants' import { showApiKey } from 'components/interfaces/Docs/Docs.types' @@ -24,7 +24,7 @@ const LangSelector: FC = ({ apiKey, autoApiService, }) => { - const canReadServiceKey = checkPermissions( + const canReadServiceKey = useCheckPermissions( PermissionAction.READ, 'service_api_keys.service_role_key' ) diff --git a/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionDetails.tsx b/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionDetails.tsx index a3d970c4fa1..60a433db257 100644 --- a/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionDetails.tsx +++ b/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionDetails.tsx @@ -17,7 +17,7 @@ import { IconExternalLink, } from 'ui' -import { useStore, checkPermissions } from 'hooks' +import { useStore, useCheckPermissions } from 'hooks' import { useParams } from 'common/hooks' import Panel from 'components/ui/Panel' import CommandRender from '../CommandRender' @@ -51,7 +51,7 @@ const EdgeFunctionDetails: FC = () => { const { mutateAsync: deleteEdgeFunction, isLoading: isDeleting } = useEdgeFunctionDeleteMutation() const formId = 'edge-function-update-form' - const canUpdateEdgeFunction = checkPermissions(PermissionAction.FUNCTIONS_WRITE, '*') + const canUpdateEdgeFunction = useCheckPermissions(PermissionAction.FUNCTIONS_WRITE, '*') // Get the API service const apiService = settings?.autoApiService diff --git a/studio/components/interfaces/Home/NewProjectPanel/APIKeys.tsx b/studio/components/interfaces/Home/NewProjectPanel/APIKeys.tsx index 42b39dbac4b..815ac8cec05 100644 --- a/studio/components/interfaces/Home/NewProjectPanel/APIKeys.tsx +++ b/studio/components/interfaces/Home/NewProjectPanel/APIKeys.tsx @@ -6,7 +6,7 @@ import { IconAlertCircle, IconLoader, Input } from 'ui' import { useProjectApiQuery } from 'data/config/project-api-query' import { useJwtSecretUpdatingStatusQuery } from 'data/config/jwt-secret-updating-status-query' -import { checkPermissions } from 'hooks' +import { useCheckPermissions } from 'hooks' import { useParams } from 'common/hooks' import Snippets from 'components/to-be-cleaned/Docs/Snippets' import Panel from 'components/ui/Panel' @@ -36,7 +36,7 @@ const APIKeys = () => { } = useJwtSecretUpdatingStatusQuery({ projectRef }) const jwtSecretUpdateStatus = data?.jwtSecretUpdateStatus - const canReadAPIKeys = checkPermissions(PermissionAction.READ, 'service_api_keys') + const canReadAPIKeys = useCheckPermissions(PermissionAction.READ, 'service_api_keys') // Get the API service const apiService = settings?.autoApiService diff --git a/studio/components/interfaces/Organization/BillingSettings/BillingAddress/BillingAddress.tsx b/studio/components/interfaces/Organization/BillingSettings/BillingAddress/BillingAddress.tsx index 9a95fc2ee29..510117e4e2c 100644 --- a/studio/components/interfaces/Organization/BillingSettings/BillingAddress/BillingAddress.tsx +++ b/studio/components/interfaces/Organization/BillingSettings/BillingAddress/BillingAddress.tsx @@ -5,7 +5,7 @@ import { Button, Form, Input, Listbox } from 'ui' import NoPermission from 'components/ui/NoPermission' import Panel from 'components/ui/Panel' -import { checkPermissions, useSelectedOrganization, useStore } from 'hooks' +import { useCheckPermissions, useSelectedOrganization, useStore } from 'hooks' import { patch } from 'lib/common/fetch' import { API_URL } from 'lib/constants' import { COUNTRIES } from './BillingAddress.constants' @@ -22,8 +22,11 @@ const BillingAddress = ({ loading, address, onAddressUpdated }: BillingAddressPr const orgSlug = selectedOrganization?.slug ?? '' const { city, country, line1, line2, postal_code, state } = address - const canReadBillingAddress = checkPermissions(PermissionAction.BILLING_READ, 'stripe.customer') - const canUpdateBillingAddress = checkPermissions( + const canReadBillingAddress = useCheckPermissions( + PermissionAction.BILLING_READ, + 'stripe.customer' + ) + const canUpdateBillingAddress = useCheckPermissions( PermissionAction.BILLING_WRITE, 'stripe.customer' ) diff --git a/studio/components/interfaces/Organization/BillingSettings/BillingEmail.tsx b/studio/components/interfaces/Organization/BillingSettings/BillingEmail.tsx index 7fa6c9c14b0..42ecf17386e 100644 --- a/studio/components/interfaces/Organization/BillingSettings/BillingEmail.tsx +++ b/studio/components/interfaces/Organization/BillingSettings/BillingEmail.tsx @@ -5,7 +5,7 @@ import { useEffect } from 'react' import { useParams } from 'common/hooks' import { FormActions, FormPanel, FormSection, FormSectionContent } from 'components/ui/Forms' import { invalidateOrganizationsQuery } from 'data/organizations/organizations-query' -import { checkPermissions, useSelectedOrganization, useStore } from 'hooks' +import { useCheckPermissions, useSelectedOrganization, useStore } from 'hooks' import { patch } from 'lib/common/fetch' import { API_URL } from 'lib/constants' import { Form, Input } from 'ui' @@ -22,8 +22,8 @@ const BillingEmail = () => { billing_email: billing_email ?? '', } - const canUpdateOrganization = checkPermissions(PermissionAction.UPDATE, 'organizations') - const canReadBillingEmail = checkPermissions(PermissionAction.READ, 'organizations') + const canUpdateOrganization = useCheckPermissions(PermissionAction.UPDATE, 'organizations') + const canReadBillingEmail = useCheckPermissions(PermissionAction.READ, 'organizations') const onUpdateOrganization = async (values: any, { setSubmitting, resetForm }: any) => { if (!canUpdateOrganization) { diff --git a/studio/components/interfaces/Organization/BillingSettings/BillingSettings.tsx b/studio/components/interfaces/Organization/BillingSettings/BillingSettings.tsx index ca01db97c3f..fb96137ff51 100644 --- a/studio/components/interfaces/Organization/BillingSettings/BillingSettings.tsx +++ b/studio/components/interfaces/Organization/BillingSettings/BillingSettings.tsx @@ -2,7 +2,7 @@ import { useEffect, useState } from 'react' import { useParams } from 'common/hooks' import { useProjectsQuery } from 'data/projects/projects-query' -import { checkPermissions, useFlag, useSelectedOrganization, useStore } from 'hooks' +import { useCheckPermissions, useFlag, useSelectedOrganization, useStore } from 'hooks' import { PermissionAction } from '@supabase/shared-types/out/constants' import { get } from 'lib/common/fetch' import { API_URL } from 'lib/constants' @@ -42,7 +42,7 @@ const BillingSettings = () => { : customerBalance const orgBillingMigrationEnabled = useFlag('orgBillingMigration') - const canMigrateOrganization = checkPermissions(PermissionAction.UPDATE, 'organizations') + const canMigrateOrganization = useCheckPermissions(PermissionAction.UPDATE, 'organizations') const selectedOrganization = useSelectedOrganization() const { subscription_id } = selectedOrganization ?? {} diff --git a/studio/components/interfaces/Organization/BillingSettings/PaymentMethods.tsx b/studio/components/interfaces/Organization/BillingSettings/PaymentMethods.tsx index d74754969c9..d0aeeeb3416 100644 --- a/studio/components/interfaces/Organization/BillingSettings/PaymentMethods.tsx +++ b/studio/components/interfaces/Organization/BillingSettings/PaymentMethods.tsx @@ -17,7 +17,7 @@ import { import { AddNewPaymentMethodModal } from 'components/interfaces/Billing' import NoPermission from 'components/ui/NoPermission' import Panel from 'components/ui/Panel' -import { checkPermissions, useSelectedOrganization, useStore } from 'hooks' +import { useCheckPermissions, useSelectedOrganization, useStore } from 'hooks' import { delete_, patch } from 'lib/common/fetch' import { API_URL, BASE_PATH } from 'lib/constants' import { getURL } from 'lib/helpers' @@ -48,11 +48,11 @@ const PaymentMethods = ({ const [showAddPaymentMethodModal, setShowAddPaymentMethodModal] = useState(false) const [isUpdatingPaymentMethod, setIsUpdatingPaymentMethod] = useState(false) - const canReadPaymentMethods = checkPermissions( + const canReadPaymentMethods = useCheckPermissions( PermissionAction.BILLING_READ, 'stripe.payment_methods' ) - const canUpdatePaymentMethods = checkPermissions( + const canUpdatePaymentMethods = useCheckPermissions( PermissionAction.BILLING_WRITE, 'stripe.payment_methods' ) diff --git a/studio/components/interfaces/Organization/BillingSettings/TaxID/TaxID.tsx b/studio/components/interfaces/Organization/BillingSettings/TaxID/TaxID.tsx index 0a7dc257ebd..3566af3da31 100644 --- a/studio/components/interfaces/Organization/BillingSettings/TaxID/TaxID.tsx +++ b/studio/components/interfaces/Organization/BillingSettings/TaxID/TaxID.tsx @@ -5,7 +5,7 @@ import { Button, IconPlus, IconX, Input, Listbox } from 'ui' import NoPermission from 'components/ui/NoPermission' import Panel from 'components/ui/Panel' -import { checkPermissions, useSelectedOrganization, useStore } from 'hooks' +import { useCheckPermissions, useSelectedOrganization, useStore } from 'hooks' import { delete_, post } from 'lib/common/fetch' import { API_URL } from 'lib/constants' import { uuidv4 } from 'lib/helpers' @@ -51,8 +51,8 @@ const TaxID = ({ loading, taxIds, onTaxIdsUpdated }: TaxIDProps) => { }, [taxIds]) const hasChanges = !isEqual(taxIdValues, formattedTaxIds) - const canReadTaxIds = checkPermissions(PermissionAction.BILLING_READ, 'stripe.tax_ids') - const canUpdateTaxIds = checkPermissions(PermissionAction.BILLING_WRITE, 'stripe.tax_ids') + const canReadTaxIds = useCheckPermissions(PermissionAction.BILLING_READ, 'stripe.tax_ids') + const canUpdateTaxIds = useCheckPermissions(PermissionAction.BILLING_WRITE, 'stripe.tax_ids') const onUpdateTaxId = (id: string, key: string, value: string) => { const updatedTaxIds = taxIdValues.map((taxId: any) => { diff --git a/studio/components/interfaces/Organization/GeneralSettings/DeleteOrganizationButton.tsx b/studio/components/interfaces/Organization/GeneralSettings/DeleteOrganizationButton.tsx index 0f101f4871f..55f3c6ed20f 100644 --- a/studio/components/interfaces/Organization/GeneralSettings/DeleteOrganizationButton.tsx +++ b/studio/components/interfaces/Organization/GeneralSettings/DeleteOrganizationButton.tsx @@ -5,7 +5,7 @@ import { useState } from 'react' import { Button, Form, Input, Modal } from 'ui' import { invalidateOrganizationsQuery } from 'data/organizations/organizations-query' -import { checkPermissions, useSelectedOrganization, useStore } from 'hooks' +import { useCheckPermissions, useSelectedOrganization, useStore } from 'hooks' import { delete_ } from 'lib/common/fetch' import { API_URL } from 'lib/constants' @@ -20,7 +20,7 @@ const DeleteOrganizationButton = () => { const [isOpen, setIsOpen] = useState(false) const [value, setValue] = useState('') - const canDeleteOrganization = checkPermissions(PermissionAction.UPDATE, 'organizations') + const canDeleteOrganization = useCheckPermissions(PermissionAction.UPDATE, 'organizations') const onValidate = (values: any) => { const errors: any = {} diff --git a/studio/components/interfaces/Organization/GeneralSettings/GeneralSettings.tsx b/studio/components/interfaces/Organization/GeneralSettings/GeneralSettings.tsx index 6cc42c37052..67c39a663b8 100644 --- a/studio/components/interfaces/Organization/GeneralSettings/GeneralSettings.tsx +++ b/studio/components/interfaces/Organization/GeneralSettings/GeneralSettings.tsx @@ -15,7 +15,7 @@ import { FormSectionLabel, } from 'components/ui/Forms' import { invalidateOrganizationsQuery } from 'data/organizations/organizations-query' -import { checkPermissions, useFlag, useSelectedOrganization, useStore } from 'hooks' +import { useCheckPermissions, useFlag, useSelectedOrganization, useStore } from 'hooks' import { patch } from 'lib/common/fetch' import { API_URL } from 'lib/constants' import OrganizationDeletePanel from './OrganizationDeletePanel' @@ -35,8 +35,8 @@ const GeneralSettings = () => { const showCMDK = useFlag('dashboardCmdk') const allowCMDKDataOptIn = useFlag('dashboardCmdkDataOptIn') - const canUpdateOrganization = checkPermissions(PermissionAction.UPDATE, 'organizations') - const canDeleteOrganization = checkPermissions(PermissionAction.UPDATE, 'organizations') + const canUpdateOrganization = useCheckPermissions(PermissionAction.UPDATE, 'organizations') + const canDeleteOrganization = useCheckPermissions(PermissionAction.UPDATE, 'organizations') const onUpdateOrganization = async (values: any, { setSubmitting, resetForm }: any) => { if (!canUpdateOrganization) { return ui.setNotification({ diff --git a/studio/components/interfaces/Organization/GeneralSettings/MigrateOrganizationBillingButton.tsx b/studio/components/interfaces/Organization/GeneralSettings/MigrateOrganizationBillingButton.tsx index 49024811da5..f54d883d63b 100644 --- a/studio/components/interfaces/Organization/GeneralSettings/MigrateOrganizationBillingButton.tsx +++ b/studio/components/interfaces/Organization/GeneralSettings/MigrateOrganizationBillingButton.tsx @@ -3,7 +3,7 @@ import { observer } from 'mobx-react-lite' import { Button, Form, Modal, Listbox, Loading, Alert, IconHelpCircle, Toggle } from 'ui' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { useStore, checkPermissions, useSelectedOrganization } from 'hooks' +import { useStore, useCheckPermissions, useSelectedOrganization } from 'hooks' import { PRICING_TIER_LABELS_ORG } from 'lib/constants' import { useOrganizationBillingMigrationMutation } from 'data/organizations/organization-migrate-billing-mutation' import { useOrganizationBillingMigrationPreview } from 'data/organizations/organization-migrate-billing-preview-query' @@ -62,7 +62,7 @@ const MigrateOrganizationBillingButton = observer(() => { } }, [isOpen]) - const canMigrateOrganization = checkPermissions(PermissionAction.UPDATE, 'organizations') + const canMigrateOrganization = useCheckPermissions(PermissionAction.UPDATE, 'organizations') const toggle = () => { setIsOpen(!isOpen) diff --git a/studio/components/interfaces/Organization/InvoicesSettings/InvoicesSettings.tsx b/studio/components/interfaces/Organization/InvoicesSettings/InvoicesSettings.tsx index 80d8403c1be..79c58e9a894 100644 --- a/studio/components/interfaces/Organization/InvoicesSettings/InvoicesSettings.tsx +++ b/studio/components/interfaces/Organization/InvoicesSettings/InvoicesSettings.tsx @@ -6,7 +6,7 @@ import InvoiceStatusBadge from 'components/interfaces/Billing/InvoiceStatusBadge import { Invoice, InvoiceStatus } from 'components/interfaces/Billing/Invoices.types' import Table from 'components/to-be-cleaned/Table' import NoPermission from 'components/ui/NoPermission' -import { checkPermissions, useSelectedOrganization, useStore } from 'hooks' +import { useCheckPermissions, useSelectedOrganization, useStore } from 'hooks' import { get, head } from 'lib/common/fetch' import { API_URL } from 'lib/constants' import { Button, IconChevronLeft, IconChevronRight, IconDownload, IconFileText, Loading } from 'ui' @@ -27,7 +27,7 @@ const InvoicesSettings = () => { const { stripe_customer_id, slug } = selectedOrganization ?? {} const offset = (page - 1) * PAGE_LIMIT - const canReadInvoices = checkPermissions(PermissionAction.READ, 'invoices') + const canReadInvoices = useCheckPermissions(PermissionAction.READ, 'invoices') useEffect(() => { if (!canReadInvoices || !stripe_customer_id || !slug) return diff --git a/studio/components/interfaces/Organization/TeamSettings/InviteMemberButton.tsx b/studio/components/interfaces/Organization/TeamSettings/InviteMemberButton.tsx index 4ac9ce6acbe..d9bf01381cc 100644 --- a/studio/components/interfaces/Organization/TeamSettings/InviteMemberButton.tsx +++ b/studio/components/interfaces/Organization/TeamSettings/InviteMemberButton.tsx @@ -1,14 +1,14 @@ +import * as Tooltip from '@radix-ui/react-tooltip' import { isNil } from 'lodash' import { useEffect, useState } from 'react' import { object, string } from 'yup' -import * as Tooltip from '@radix-ui/react-tooltip' -import { Button, Form, IconMail, Input, Listbox, Modal } from 'ui' -import { Member, Role } from 'types' -import { checkPermissions, useStore } from 'hooks' -import { useParams } from 'common/hooks' import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common/hooks' import { useOrganizationMemberInviteCreateMutation } from 'data/organizations/organization-member-invite-create-mutation' +import { doPermissionsCheck, useGetPermissions, useStore } from 'hooks' +import { Member, Role } from 'types' +import { Button, Form, IconMail, Input, Listbox, Modal } from 'ui' export interface InviteMemberButtonProps { userId: number @@ -28,8 +28,12 @@ const InviteMemberButton = ({ const [isOpen, setIsOpen] = useState(false) + const { permissions: allPermissions } = useGetPermissions() + const canInviteMembers = roles.some(({ id: role_id }) => - checkPermissions(PermissionAction.CREATE, 'user_invites', { resource: { role_id } }) + doPermissionsCheck(allPermissions, PermissionAction.CREATE, 'user_invites', { + resource: { role_id }, + }) ) const initialValues = { email: '', role: '' } diff --git a/studio/components/interfaces/Organization/TeamSettings/MemberActions.tsx b/studio/components/interfaces/Organization/TeamSettings/MemberActions.tsx index 0038fdf50ea..d49a715f289 100644 --- a/studio/components/interfaces/Organization/TeamSettings/MemberActions.tsx +++ b/studio/components/interfaces/Organization/TeamSettings/MemberActions.tsx @@ -9,7 +9,7 @@ import { useOrganizationMemberDeleteMutation } from 'data/organizations/organiza import { useOrganizationMemberInviteCreateMutation } from 'data/organizations/organization-member-invite-create-mutation' import { useOrganizationMemberInviteDeleteMutation } from 'data/organizations/organization-member-invite-delete-mutation' import { usePermissionsQuery } from 'data/permissions/permissions-query' -import { checkPermissions, useSelectedOrganization, useStore } from 'hooks' +import { useCheckPermissions, useSelectedOrganization, useStore } from 'hooks' import { Member, Role } from 'types' import { Button, Dropdown, IconMoreHorizontal, IconTrash } from 'ui' import { isInviteExpired } from '../Organization.utils' @@ -36,10 +36,10 @@ const MemberActions: FC = ({ member, roles }) => { const roleId = member.role_ids?.[0] ?? -1 const canRemoveMember = rolesRemovable.includes((member?.role_ids ?? [-1])[0]) - const canResendInvite = checkPermissions(PermissionAction.CREATE, 'user_invites', { + const canResendInvite = useCheckPermissions(PermissionAction.CREATE, 'user_invites', { resource: { role_id: roleId }, }) - const canRevokeInvite = checkPermissions(PermissionAction.DELETE, 'user_invites', { + const canRevokeInvite = useCheckPermissions(PermissionAction.DELETE, 'user_invites', { resource: { role_id: roleId }, }) diff --git a/studio/components/interfaces/Settings/API/JWTSettings.tsx b/studio/components/interfaces/Settings/API/JWTSettings.tsx index d9853359b33..e93d4e12f74 100644 --- a/studio/components/interfaces/Settings/API/JWTSettings.tsx +++ b/studio/components/interfaces/Settings/API/JWTSettings.tsx @@ -23,7 +23,7 @@ import { import { PermissionAction } from '@supabase/shared-types/out/constants' import { uuidv4 } from 'lib/helpers' -import { useStore, checkPermissions } from 'hooks' +import { useStore, useCheckPermissions } from 'hooks' import { useParams } from 'common/hooks' import { useJwtSecretUpdatingStatusQuery } from 'data/config/jwt-secret-updating-status-query' import { useJwtSecretUpdateMutation } from 'data/config/jwt-secret-update-mutation' @@ -48,8 +48,8 @@ const JWTSettings: FC = ({}) => { const [isSubmittingJwtSecretUpdateRequest, setIsSubmittingJwtSecretUpdateRequest] = useState(false) - const canReadJWTSecret = checkPermissions(PermissionAction.READ, 'field.jwt_secret') - const canGenerateNewJWTSecret = checkPermissions( + const canReadJWTSecret = useCheckPermissions(PermissionAction.READ, 'field.jwt_secret') + const canGenerateNewJWTSecret = useCheckPermissions( PermissionAction.INFRA_EXECUTE, 'queue_job.projects.update_jwt' ) diff --git a/studio/components/interfaces/Settings/API/PostgrestConfig.tsx b/studio/components/interfaces/Settings/API/PostgrestConfig.tsx index f52a9da6473..1328b337b0f 100644 --- a/studio/components/interfaces/Settings/API/PostgrestConfig.tsx +++ b/studio/components/interfaces/Settings/API/PostgrestConfig.tsx @@ -4,7 +4,7 @@ import { observer } from 'mobx-react-lite' import { Input, Form, IconAlertCircle, InputNumber } from 'ui' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import { useParams } from 'common/hooks' import { useProjectPostgrestConfigQuery } from 'data/config/project-postgrest-config-query' import { useProjectPostgrestConfigUpdateMutation } from 'data/config/project-postgrest-config-update-mutation' @@ -37,7 +37,7 @@ const PostgrestConfig: FC = ({}) => { db_extra_search_path: '', } - const canUpdatePostgrestConfig = checkPermissions( + const canUpdatePostgrestConfig = useCheckPermissions( PermissionAction.UPDATE, 'custom_config_postgrest' ) diff --git a/studio/components/interfaces/Settings/Database/ConnectionPooling.tsx b/studio/components/interfaces/Settings/Database/ConnectionPooling.tsx index 13385ecd934..95c8ba477a4 100644 --- a/studio/components/interfaces/Settings/Database/ConnectionPooling.tsx +++ b/studio/components/interfaces/Settings/Database/ConnectionPooling.tsx @@ -7,7 +7,7 @@ import SchemaFormPanel from 'components/to-be-cleaned/forms/SchemaFormPanel' import Divider from 'components/ui/Divider' import Panel from 'components/ui/Panel' import ShimmeringLoader from 'components/ui/ShimmeringLoader' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import { patch } from 'lib/common/fetch' import { API_URL } from 'lib/constants' import { pluckObjectFields } from 'lib/helpers' @@ -123,7 +123,7 @@ interface ConfigProps { export const PgbouncerConfig: FC = ({ projectRef, bouncerInfo, connectionInfo }) => { const { ui } = useStore() - const canUpdateConnectionPoolingConfiguration = checkPermissions( + const canUpdateConnectionPoolingConfiguration = useCheckPermissions( PermissionAction.UPDATE, 'projects' ) diff --git a/studio/components/interfaces/Settings/Database/DatabaseSettings/ResetDbPassword.tsx b/studio/components/interfaces/Settings/Database/DatabaseSettings/ResetDbPassword.tsx index 098c514f2f7..73b3de9eec1 100644 --- a/studio/components/interfaces/Settings/Database/DatabaseSettings/ResetDbPassword.tsx +++ b/studio/components/interfaces/Settings/Database/DatabaseSettings/ResetDbPassword.tsx @@ -5,7 +5,7 @@ import generator from 'generate-password' import { Input, Button, Modal } from 'ui' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import { useParams } from 'common/hooks' import { patch } from 'lib/common/fetch' import { passwordStrength } from 'lib/helpers' @@ -19,7 +19,7 @@ const ResetDbPassword: FC = ({ disabled = false }) => { const { ui, app, meta } = useStore() const { ref } = useParams() - const canResetDbPassword = checkPermissions(PermissionAction.UPDATE, 'projects') + const canResetDbPassword = useCheckPermissions(PermissionAction.UPDATE, 'projects') const [showResetDbPass, setShowResetDbPass] = useState(false) const [isUpdatingPassword, setIsUpdatingPassword] = useState(false) diff --git a/studio/components/interfaces/Settings/Database/DiskSizeConfiguration.tsx b/studio/components/interfaces/Settings/Database/DiskSizeConfiguration.tsx index e99285afbc8..b7c73169bd3 100644 --- a/studio/components/interfaces/Settings/Database/DiskSizeConfiguration.tsx +++ b/studio/components/interfaces/Settings/Database/DiskSizeConfiguration.tsx @@ -6,7 +6,7 @@ import Panel from 'components/ui/Panel' import { useProjectDiskResizeMutation } from 'data/config/project-disk-resize-mutation' import { useProjectSubscriptionV2Query } from 'data/subscriptions/project-subscription-v2-query' import { useProjectUsageQuery } from 'data/usage/project-usage-query' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import Link from 'next/link' import { useEffect, useState } from 'react' import { Alert, Button, Form, InputNumber, Modal } from 'ui' @@ -20,7 +20,7 @@ const DiskSizeConfiguration = ({ disabled = false }: DiskSizeConfigurationProps) const { ui } = useStore() const { ref: projectRef } = useParams() - const canUpdateDiskSizeConfig = checkPermissions(PermissionAction.UPDATE, 'projects') + const canUpdateDiskSizeConfig = useCheckPermissions(PermissionAction.UPDATE, 'projects') const [showResetDbPass, setShowResetDbPass] = useState(false) const [isUpdatingDiskSize, setIsUpdatingDiskSize] = useState(false) diff --git a/studio/components/interfaces/Settings/Database/NetworkRestrictions/NetworkRestrictions.tsx b/studio/components/interfaces/Settings/Database/NetworkRestrictions/NetworkRestrictions.tsx index b0391bea62f..16f5414552e 100644 --- a/studio/components/interfaces/Settings/Database/NetworkRestrictions/NetworkRestrictions.tsx +++ b/studio/components/interfaces/Settings/Database/NetworkRestrictions/NetworkRestrictions.tsx @@ -4,7 +4,7 @@ import * as Tooltip from '@radix-ui/react-tooltip' import { Button, IconAlertCircle, IconExternalLink, IconGlobe, IconLock } from 'ui' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { checkPermissions } from 'hooks' +import { useCheckPermissions } from 'hooks' import { useParams } from 'common/hooks' import Panel from 'components/ui/Panel' import { FormPanel, FormHeader } from 'components/ui/Forms' @@ -84,7 +84,7 @@ const NetworkRestrictions = ({}) => { const [selectedRestrictionToRemove, setSelectedRestrictionToRemove] = useState() const { data, isLoading } = useNetworkRestrictionsQuery({ projectRef: ref }) - const canUpdateNetworkRestrictions = checkPermissions(PermissionAction.UPDATE, 'projects') + const canUpdateNetworkRestrictions = useCheckPermissions(PermissionAction.UPDATE, 'projects') const hasAccessToRestrictions = data?.entitlement === 'allowed' const restrictedIps = data?.config?.dbAllowedCidrs ?? [] diff --git a/studio/components/interfaces/Settings/Database/SSLConfiguration.tsx b/studio/components/interfaces/Settings/Database/SSLConfiguration.tsx index 1970db56306..d6dfc2bd7b5 100644 --- a/studio/components/interfaces/Settings/Database/SSLConfiguration.tsx +++ b/studio/components/interfaces/Settings/Database/SSLConfiguration.tsx @@ -4,7 +4,7 @@ import * as Tooltip from '@radix-ui/react-tooltip' import { Button, IconDownload, Toggle, IconLoader, Alert, IconExternalLink } from 'ui' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { checkPermissions, useStore, useFlag } from 'hooks' +import { useCheckPermissions, useStore, useFlag } from 'hooks' import { useParams } from 'common/hooks' import { FormHeader, @@ -34,7 +34,7 @@ const SSLConfiguration = () => { }) const { mutateAsync: updateSSLEnforcement } = useSSLEnforcementUpdateMutation() - const canUpdateSSLEnforcement = checkPermissions(PermissionAction.UPDATE, 'projects') + const canUpdateSSLEnforcement = useCheckPermissions(PermissionAction.UPDATE, 'projects') const hasAccessToSSLEnforcement = !sslEnforcementConfiguration?.isNotAllowed const env = process.env.NEXT_PUBLIC_ENVIRONMENT === 'prod' ? 'prod' : 'staging' diff --git a/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainsConfigureHostname.tsx b/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainsConfigureHostname.tsx index 4a3349638cc..75c54228551 100644 --- a/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainsConfigureHostname.tsx +++ b/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainsConfigureHostname.tsx @@ -4,7 +4,7 @@ import { observer } from 'mobx-react-lite' import { Button, Form, IconExternalLink, Input } from 'ui' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import { useParams } from 'common/hooks' import { FormActions, @@ -28,7 +28,7 @@ const CustomDomainsConfigureHostname = () => { const FORM_ID = 'custom-domains-form' const endpoint = settings?.autoApiService.endpoint - const canConfigureCustomDomain = checkPermissions(PermissionAction.UPDATE, 'projects') + const canConfigureCustomDomain = useCheckPermissions(PermissionAction.UPDATE, 'projects') const verifyCNAME = async (domain: string): Promise => { const res = await fetch(`https://1.1.1.1/dns-query?name=${domain}`, { diff --git a/studio/components/interfaces/Settings/General/DeleteProjectPanel/DeleteProjectButton.tsx b/studio/components/interfaces/Settings/General/DeleteProjectPanel/DeleteProjectButton.tsx index b630039ef37..915c12b0dc5 100644 --- a/studio/components/interfaces/Settings/General/DeleteProjectPanel/DeleteProjectButton.tsx +++ b/studio/components/interfaces/Settings/General/DeleteProjectPanel/DeleteProjectButton.tsx @@ -9,7 +9,7 @@ import { CANCELLATION_REASONS } from 'components/interfaces/BillingV2/Billing.co import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' import TextConfirmModal from 'components/ui/Modals/TextConfirmModal' import { invalidateProjectsQuery } from 'data/projects/projects-query' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import { delete_, post } from 'lib/common/fetch' import { API_URL, PRICING_TIER_PRODUCT_IDS } from 'lib/constants' @@ -39,7 +39,7 @@ const DeleteProjectButton = ({ type = 'danger' }: DeleteProjectButtonProps) => { } }, [isOpen]) - const canDeleteProject = checkPermissions(PermissionAction.UPDATE, 'projects') + const canDeleteProject = useCheckPermissions(PermissionAction.UPDATE, 'projects') const toggle = () => { if (loading) return diff --git a/studio/components/interfaces/Settings/General/General.tsx b/studio/components/interfaces/Settings/General/General.tsx index a1630be4b42..9fcbdac5795 100644 --- a/studio/components/interfaces/Settings/General/General.tsx +++ b/studio/components/interfaces/Settings/General/General.tsx @@ -12,7 +12,7 @@ import { FormSectionLabel, } from 'components/ui/Forms' import { invalidateProjectsQuery } from 'data/projects/projects-query' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import { patch } from 'lib/common/fetch' import { API_URL } from 'lib/constants' @@ -23,7 +23,7 @@ const General = () => { const formId = 'project-general-settings' const initialValues = { name: project?.name ?? '', ref: project?.ref ?? '' } - const canUpdateProject = checkPermissions(PermissionAction.UPDATE, 'projects') + const canUpdateProject = useCheckPermissions(PermissionAction.UPDATE, 'projects') const onSubmit = async (values: any, { resetForm }: any) => { const response = await patch(`${API_URL}/projects/${project?.ref}`, { diff --git a/studio/components/interfaces/Settings/General/Infrastructure/PauseProjectButton.tsx b/studio/components/interfaces/Settings/General/Infrastructure/PauseProjectButton.tsx index 55f1736fccd..fdd25f07510 100644 --- a/studio/components/interfaces/Settings/General/Infrastructure/PauseProjectButton.tsx +++ b/studio/components/interfaces/Settings/General/Infrastructure/PauseProjectButton.tsx @@ -8,7 +8,7 @@ import { FC, useState } from 'react' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' import ConfirmModal from 'components/ui/Dialogs/ConfirmDialog' import { setProjectStatus } from 'data/projects/projects-query' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import { post } from 'lib/common/fetch' import { API_URL, PROJECT_STATUS } from 'lib/constants' import { Button, IconPause } from 'ui' @@ -30,7 +30,7 @@ const PauseProjectButton: FC = observer(({ projectRef, projectId }) => { const closeModal = () => setIsModalOpen(false) const isPaused = project?.status === PROJECT_STATUS.INACTIVE - const canPauseProject = checkPermissions( + const canPauseProject = useCheckPermissions( PermissionAction.INFRA_EXECUTE, 'queue_jobs.projects.pause' ) diff --git a/studio/components/interfaces/Settings/General/Infrastructure/RestartServerButton.tsx b/studio/components/interfaces/Settings/General/Infrastructure/RestartServerButton.tsx index c11859ad691..2435d800eea 100644 --- a/studio/components/interfaces/Settings/General/Infrastructure/RestartServerButton.tsx +++ b/studio/components/interfaces/Settings/General/Infrastructure/RestartServerButton.tsx @@ -8,7 +8,7 @@ import { Button, Dropdown, IconChevronDown } from 'ui' import ConfirmModal from 'components/ui/Dialogs/ConfirmDialog' import { setProjectPostgrestStatus } from 'data/projects/projects-query' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import { post } from 'lib/common/fetch' import { API_URL } from 'lib/constants' import { Project } from 'types' @@ -27,7 +27,7 @@ const RestartServerButton = ({ project }: RestartServerButtonProps) => { const projectRef = project.ref const projectRegion = project.region - const canRestartProject = checkPermissions(PermissionAction.INFRA_EXECUTE, 'reboot') + const canRestartProject = useCheckPermissions(PermissionAction.INFRA_EXECUTE, 'reboot') const requestProjectRestart = async () => { if (!canRestartProject) { diff --git a/studio/components/interfaces/Settings/Vault/Keys/EncryptionKeysManagement.tsx b/studio/components/interfaces/Settings/Vault/Keys/EncryptionKeysManagement.tsx index 01e4a6d527f..1d743178e1c 100644 --- a/studio/components/interfaces/Settings/Vault/Keys/EncryptionKeysManagement.tsx +++ b/studio/components/interfaces/Settings/Vault/Keys/EncryptionKeysManagement.tsx @@ -18,7 +18,7 @@ import { IconExternalLink, } from 'ui' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { useStore, checkPermissions } from 'hooks' +import { useStore, useCheckPermissions } from 'hooks' import { useParams } from 'common/hooks' import Divider from 'components/ui/Divider' @@ -36,7 +36,7 @@ const EncryptionKeysManagement: FC = ({}) => { const [selectedKeyToRemove, setSelectedKeyToRemove] = useState() const [isDeletingKey, setIsDeletingKey] = useState(false) - const canManageKeys = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'tables') + const canManageKeys = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'tables') useEffect(() => { if (id !== undefined) setSearchValue(id) diff --git a/studio/components/interfaces/Settings/Vault/Secrets/SecretRow.tsx b/studio/components/interfaces/Settings/Vault/Secrets/SecretRow.tsx index a4b2cf56e7b..c0a9419c7e8 100644 --- a/studio/components/interfaces/Settings/Vault/Secrets/SecretRow.tsx +++ b/studio/components/interfaces/Settings/Vault/Secrets/SecretRow.tsx @@ -16,7 +16,7 @@ import { import * as Tooltip from '@radix-ui/react-tooltip' import { PermissionAction } from '@supabase/shared-types/out/constants' import { VaultSecret } from 'types' -import { useStore, checkPermissions } from 'hooks' +import { useStore, useCheckPermissions } from 'hooks' import { useParams } from 'common/hooks' interface Props { @@ -33,7 +33,7 @@ const SecretRow: FC = ({ secret, onSelectEdit, onSelectRemove }) => { const [revealedValue, setRevealedValue] = useState() const name = secret?.name ?? 'No name provided' - const canManageSecrets = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'tables') + const canManageSecrets = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'tables') const revealSecret = async () => { setIsLoading(true) diff --git a/studio/components/interfaces/Settings/Vault/Secrets/SecretsManagement.tsx b/studio/components/interfaces/Settings/Vault/Secrets/SecretsManagement.tsx index e5dfe455fe0..88954ad8984 100644 --- a/studio/components/interfaces/Settings/Vault/Secrets/SecretsManagement.tsx +++ b/studio/components/interfaces/Settings/Vault/Secrets/SecretsManagement.tsx @@ -5,7 +5,7 @@ import { FC, Fragment, useState, useEffect } from 'react' import { IconSearch, Input, Button, Listbox, IconLoader, IconExternalLink, IconX } from 'ui' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { useStore, checkPermissions } from 'hooks' +import { useStore, useCheckPermissions } from 'hooks' import { useParams } from 'common/hooks' import SecretRow from './SecretRow' import EditSecretModal from './EditSecretModal' @@ -25,7 +25,7 @@ const SecretsManagement: FC = ({}) => { const [selectedSecretToEdit, setSelectedSecretToEdit] = useState() const [selectedSecretToRemove, setSelectedSecretToRemove] = useState() - const canManageSecrets = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'tables') + const canManageSecrets = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'tables') useEffect(() => { if (search !== undefined) setSearchValue(search) diff --git a/studio/components/interfaces/Settings/Vault/VaultToggle.tsx b/studio/components/interfaces/Settings/Vault/VaultToggle.tsx index f8a187ecc90..e96511cf63c 100644 --- a/studio/components/interfaces/Settings/Vault/VaultToggle.tsx +++ b/studio/components/interfaces/Settings/Vault/VaultToggle.tsx @@ -5,7 +5,7 @@ import * as Tooltip from '@radix-ui/react-tooltip' import { Button, IconExternalLink } from 'ui' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import { useParams } from 'common/hooks' import { BASE_PATH } from 'lib/constants' import { useTheme } from 'common' @@ -17,7 +17,7 @@ const VaultToggle: FC = () => { const { ref } = useParams() const { isDarkMode } = useTheme() const [isEnabling, setIsEnabling] = useState(false) - const canToggleVault = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'extensions') + const canToggleVault = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'extensions') const vaultExtension = meta.extensions.byId('supabase_vault') const isNotAvailable = vaultExtension === undefined diff --git a/studio/components/interfaces/TableGridEditor/TableGridEditor.tsx b/studio/components/interfaces/TableGridEditor/TableGridEditor.tsx index 56a81b2c554..61fb02e7fd4 100644 --- a/studio/components/interfaces/TableGridEditor/TableGridEditor.tsx +++ b/studio/components/interfaces/TableGridEditor/TableGridEditor.tsx @@ -7,7 +7,7 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { QueryKey, useQueryClient } from '@tanstack/react-query' import { SchemaView } from 'types' -import { checkPermissions, useFlag, useStore, useUrlState } from 'hooks' +import { useCheckPermissions, useFlag, useStore, useUrlState } from 'hooks' import useEntityType from 'hooks/misc/useEntityType' import { useParams } from 'common/hooks' import GridHeaderActions from './GridHeaderActions' @@ -116,9 +116,10 @@ const TableGridEditor = ({ } } - const isReadOnly = - !checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'tables') && - !checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'columns') + const canEditTables = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'tables') + const canEditColumns = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'columns') + + const isReadOnly = !canEditTables && !canEditColumns const getEncryptedColumns = async (table: any) => { const columns = await vault.listEncryptedColumns(table.schema, table.name) @@ -214,7 +215,6 @@ const TableGridEditor = ({ const isTableSelected = entityType?.type === ENTITY_TYPE.TABLE const isForeignTableSelected = entityType?.type === ENTITY_TYPE.FOREIGN_TABLE const isLocked = meta.excludedSchemas.includes(entityType?.schema ?? '') - const canUpdateTables = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'tables') const canEditViaTableEditor = isTableSelected && !isLocked // [Joshen] We can tweak below to eventually support composite keys as the data @@ -351,7 +351,7 @@ const TableGridEditor = ({ theme={theme} gridProps={{ height: '100%' }} storageRef={projectRef} - editable={!isReadOnly && canUpdateTables && canEditViaTableEditor} + editable={!isReadOnly && canEditTables && canEditViaTableEditor} schema={selectedTable.schema} table={gridTable} refreshDocs={refreshDocs} diff --git a/studio/components/layouts/FunctionsLayout.tsx b/studio/components/layouts/FunctionsLayout.tsx index 8c5c69d1d2e..815aff90c2f 100644 --- a/studio/components/layouts/FunctionsLayout.tsx +++ b/studio/components/layouts/FunctionsLayout.tsx @@ -4,7 +4,7 @@ import { observer } from 'mobx-react-lite' import { Button, IconExternalLink, IconCode, Modal, IconTerminal } from 'ui' import ProjectLayout from './' -import { checkPermissions, withAuth } from 'hooks' +import { useCheckPermissions, withAuth } from 'hooks' import { useParams } from 'common/hooks' import FunctionsNav from '../interfaces/Functions/FunctionsNav' import NoPermission from 'components/ui/NoPermission' @@ -24,7 +24,7 @@ const FunctionsLayout: FC = ({ title, children }) => { const { data: functions, isLoading } = useEdgeFunctionsQuery({ projectRef: ref }) const { data: selectedFunction } = useEdgeFunctionQuery({ projectRef: ref, slug: functionSlug }) - const canReadFunctions = checkPermissions(PermissionAction.FUNCTIONS_READ, '*') + const canReadFunctions = useCheckPermissions(PermissionAction.FUNCTIONS_READ, '*') if (!canReadFunctions) { return ( diff --git a/studio/components/layouts/ProjectLayout/ProjectPausedState.tsx b/studio/components/layouts/ProjectLayout/ProjectPausedState.tsx index b4f140347ca..adadffcaae4 100644 --- a/studio/components/layouts/ProjectLayout/ProjectPausedState.tsx +++ b/studio/components/layouts/ProjectLayout/ProjectPausedState.tsx @@ -8,7 +8,7 @@ import { useParams } from 'common' import ConfirmModal from 'components/ui/Dialogs/ConfirmDialog' import { useFreeProjectLimitCheckQuery } from 'data/organizations/free-project-limit-check-query' import { setProjectStatus } from 'data/projects/projects-query' -import { checkPermissions, useFlag, useSelectedOrganization, useStore } from 'hooks' +import { useCheckPermissions, useFlag, useSelectedOrganization, useStore } from 'hooks' import { post } from 'lib/common/fetch' import { API_URL, PROJECT_STATUS } from 'lib/constants' import { Button, IconPauseCircle, Modal } from 'ui' @@ -33,7 +33,7 @@ const ProjectPausedState = ({ product }: ProjectPausedStateProps) => { const [showConfirmRestore, setShowConfirmRestore] = useState(false) const [showFreeProjectLimitWarning, setShowFreeProjectLimitWarning] = useState(false) - const canResumeProject = checkPermissions( + const canResumeProject = useCheckPermissions( PermissionAction.INFRA_EXECUTE, 'queue_jobs.projects.initialize_or_resume' ) diff --git a/studio/components/layouts/StorageLayout/BucketRow.tsx b/studio/components/layouts/StorageLayout/BucketRow.tsx index 6afb956a349..dc79e48b408 100644 --- a/studio/components/layouts/StorageLayout/BucketRow.tsx +++ b/studio/components/layouts/StorageLayout/BucketRow.tsx @@ -5,7 +5,7 @@ import Link from 'next/link' import { Badge, Button, Dropdown, IconChevronDown, IconEdit2, IconLoader, IconTrash } from 'ui' import { Bucket } from 'data/storage/buckets-query' -import { checkPermissions } from 'hooks' +import { useCheckPermissions } from 'hooks' export interface BucketRowProps { bucket: Bucket @@ -22,7 +22,7 @@ const BucketRow = ({ onSelectDeleteBucket = noop, onSelectEditBucket = noop, }: BucketRowProps) => { - const canUpdateBuckets = checkPermissions(PermissionAction.STORAGE_ADMIN_WRITE, '*') + const canUpdateBuckets = useCheckPermissions(PermissionAction.STORAGE_ADMIN_WRITE, '*') return (
    { const { ref, bucketId } = useParams() const [showCreateBucketModal, setShowCreateBucketModal] = useState(false) const [selectedBucketToEdit, setSelectedBucketToEdit] = useState() - const canCreateBuckets = checkPermissions(PermissionAction.STORAGE_ADMIN_WRITE, '*') + const canCreateBuckets = useCheckPermissions(PermissionAction.STORAGE_ADMIN_WRITE, '*') const page = router.pathname.split('/')[4] as | undefined diff --git a/studio/components/layouts/TableEditorLayout/TableEditorLayout.tsx b/studio/components/layouts/TableEditorLayout/TableEditorLayout.tsx index 4479159c2c0..2cf50e4643f 100644 --- a/studio/components/layouts/TableEditorLayout/TableEditorLayout.tsx +++ b/studio/components/layouts/TableEditorLayout/TableEditorLayout.tsx @@ -9,7 +9,7 @@ import Connecting from 'components/ui/Loading/Loading' import NoPermission from 'components/ui/NoPermission' import { ENTITY_TYPE } from 'data/entity-types/entity-type-constants' import { Entity } from 'data/entity-types/entity-type-query' -import { checkPermissions, useSelectedProject, useStore } from 'hooks' +import { useCheckPermissions, useSelectedProject, useStore } from 'hooks' import useEntityType from 'hooks/misc/useEntityType' import useLatest from 'hooks/misc/useLatest' import { useIsTableLoaded, useTableEditorStateSnapshot } from 'state/table-editor' @@ -44,7 +44,7 @@ const TableEditorLayout = ({ const id = _id ? Number(_id) : undefined const snap = useTableEditorStateSnapshot() - const canReadTables = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_READ, 'tables') + const canReadTables = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_READ, 'tables') const vaultExtension = meta.extensions.byId('supabase_vault') const isVaultEnabled = vaultExtension !== undefined && vaultExtension.installed_version !== null diff --git a/studio/components/layouts/TableEditorLayout/TableEditorMenu.tsx b/studio/components/layouts/TableEditorLayout/TableEditorMenu.tsx index 4c6e3d1c8b2..1e8f7e114e6 100644 --- a/studio/components/layouts/TableEditorLayout/TableEditorMenu.tsx +++ b/studio/components/layouts/TableEditorLayout/TableEditorMenu.tsx @@ -20,7 +20,7 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import type { PostgresSchema } from '@supabase/postgres-meta' import { useParams } from 'common/hooks' -import { checkPermissions, useStore, useLocalStorage } from 'hooks' +import { useCheckPermissions, useStore, useLocalStorage } from 'hooks' import { useEntityTypesQuery } from 'data/entity-types/entity-types-infinite-query' import { Entity } from 'data/entity-types/entity-type-query' import { useProjectContext } from '../ProjectLayout/ProjectContext' @@ -85,7 +85,7 @@ const TableEditorMenu = ({ const schemas: PostgresSchema[] = meta.schemas.list() const schema = schemas.find((schema) => schema.name === selectedSchema) - const canCreateTables = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'tables') + const canCreateTables = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'tables') const isLoadingTableMetadata = id ? !meta.tables.byId(id) : true diff --git a/studio/components/to-be-cleaned/Docs/Description.js b/studio/components/to-be-cleaned/Docs/Description.js index ec37ba6e9b1..fc942ac6c50 100644 --- a/studio/components/to-be-cleaned/Docs/Description.js +++ b/studio/components/to-be-cleaned/Docs/Description.js @@ -2,7 +2,7 @@ import { useState } from 'react' import { Button, IconLoader } from 'ui' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { useStore, checkPermissions } from 'hooks' +import { useStore, useCheckPermissions } from 'hooks' import AutoTextArea from 'components/to-be-cleaned/forms/AutoTextArea' import { timeout } from 'lib/helpers' @@ -32,7 +32,7 @@ export default function Description({ content, metadata, onChange = () => {} }) const hasChanged = value != contentText const animateCss = `transition duration-150` - const canUpdateDescription = checkPermissions(PermissionAction.TENANT_SQL_QUERY, '*') + const canUpdateDescription = useCheckPermissions(PermissionAction.TENANT_SQL_QUERY, '*') const updateDescription = async () => { if (isUpdating || !canUpdateDescription) return false diff --git a/studio/components/to-be-cleaned/Storage/StorageExplorer/FileExplorerHeader.tsx b/studio/components/to-be-cleaned/Storage/StorageExplorer/FileExplorerHeader.tsx index 9e121416c62..bfd8d6a21c4 100644 --- a/studio/components/to-be-cleaned/Storage/StorageExplorer/FileExplorerHeader.tsx +++ b/studio/components/to-be-cleaned/Storage/StorageExplorer/FileExplorerHeader.tsx @@ -21,7 +21,7 @@ import { import * as Tooltip from '@radix-ui/react-tooltip' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { checkPermissions } from 'hooks' +import { useCheckPermissions } from 'hooks' import { useStorageStore } from 'localStores/storageExplorer/StorageExplorerStore' import { STORAGE_VIEWS, STORAGE_SORT_BY, STORAGE_SORT_BY_ORDER } from '../Storage.constants' @@ -141,7 +141,7 @@ const FileExplorerHeader: FC = ({ const breadcrumbs = columns.map((column: any) => column.name) const backDisabled = columns.length <= 1 - const canUpdateStorage = checkPermissions(PermissionAction.STORAGE_ADMIN_WRITE, '*') + const canUpdateStorage = useCheckPermissions(PermissionAction.STORAGE_ADMIN_WRITE, '*') useEffect(() => { if (itemSearchString) setSearchString(itemSearchString) diff --git a/studio/components/to-be-cleaned/Storage/StorageExplorer/FileExplorerRow.tsx b/studio/components/to-be-cleaned/Storage/StorageExplorer/FileExplorerRow.tsx index 19567f7484b..ab905d4f326 100644 --- a/studio/components/to-be-cleaned/Storage/StorageExplorer/FileExplorerRow.tsx +++ b/studio/components/to-be-cleaned/Storage/StorageExplorer/FileExplorerRow.tsx @@ -21,7 +21,7 @@ import * as Tooltip from '@radix-ui/react-tooltip' import { useContextMenu } from 'react-contexify' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { checkPermissions } from 'hooks' +import { useCheckPermissions } from 'hooks' import { STORAGE_VIEWS, STORAGE_ROW_TYPES, @@ -119,7 +119,7 @@ const FileExplorerRow = ({ const isOpened = openedFolders.length > columnIndex ? isEqual(openedFolders[columnIndex], item) : false const isPreviewed = !isEmpty(selectedFilePreview) && isEqual(selectedFilePreview.id, item.id) - const canUpdateFiles = checkPermissions(PermissionAction.STORAGE_ADMIN_WRITE, '*') + const canUpdateFiles = useCheckPermissions(PermissionAction.STORAGE_ADMIN_WRITE, '*') const { show } = useContextMenu() diff --git a/studio/components/to-be-cleaned/Storage/StorageExplorer/FolderContextMenu.tsx b/studio/components/to-be-cleaned/Storage/StorageExplorer/FolderContextMenu.tsx index 5dea1dd1b93..541d3437f0c 100644 --- a/studio/components/to-be-cleaned/Storage/StorageExplorer/FolderContextMenu.tsx +++ b/studio/components/to-be-cleaned/Storage/StorageExplorer/FolderContextMenu.tsx @@ -4,7 +4,7 @@ import 'react-contexify/dist/ReactContexify.css' import { IconEdit, IconDownload, IconTrash2 } from 'ui' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { checkPermissions } from 'hooks' +import { useCheckPermissions } from 'hooks' import { useStorageStore } from 'localStores/storageExplorer/StorageExplorerStore' interface Props { @@ -14,7 +14,7 @@ interface Props { const FolderContextMenu: FC = ({ id = '' }) => { const storageExplorerStore = useStorageStore() const { downloadFolder, setSelectedItemToRename, setSelectedItemsToDelete } = storageExplorerStore - const canUpdateFiles = checkPermissions(PermissionAction.STORAGE_ADMIN_WRITE, '*') + const canUpdateFiles = useCheckPermissions(PermissionAction.STORAGE_ADMIN_WRITE, '*') return ( diff --git a/studio/components/to-be-cleaned/Storage/StorageExplorer/ItemContextMenu.tsx b/studio/components/to-be-cleaned/Storage/StorageExplorer/ItemContextMenu.tsx index e04d39f146c..beede269ab7 100644 --- a/studio/components/to-be-cleaned/Storage/StorageExplorer/ItemContextMenu.tsx +++ b/studio/components/to-be-cleaned/Storage/StorageExplorer/ItemContextMenu.tsx @@ -4,7 +4,7 @@ import 'react-contexify/dist/ReactContexify.css' import { PermissionAction } from '@supabase/shared-types/out/constants' import { IconClipboard, IconEdit, IconMove, IconDownload, IconTrash2, IconChevronRight } from 'ui' -import { checkPermissions } from 'hooks' +import { useCheckPermissions } from 'hooks' import { URL_EXPIRY_DURATION } from '../Storage.constants' import { useStorageStore } from 'localStores/storageExplorer/StorageExplorerStore' import { noop } from 'lodash' @@ -26,7 +26,7 @@ const ItemContextMenu = ({ id = '', onCopyUrl = noop }: ItemContextMenuProps) => setSelectedFileCustomExpiry, } = storageExplorerStore const isPublic = selectedBucket.public - const canUpdateFiles = checkPermissions(PermissionAction.STORAGE_ADMIN_WRITE, '*') + const canUpdateFiles = useCheckPermissions(PermissionAction.STORAGE_ADMIN_WRITE, '*') const onHandleClick = async (event: any, item: any, expiresIn?: number) => { if (item.isCorrupted) return diff --git a/studio/components/to-be-cleaned/Storage/StorageExplorer/PreviewPane.tsx b/studio/components/to-be-cleaned/Storage/StorageExplorer/PreviewPane.tsx index cb4deb1bea3..a50d04e58f6 100644 --- a/studio/components/to-be-cleaned/Storage/StorageExplorer/PreviewPane.tsx +++ b/studio/components/to-be-cleaned/Storage/StorageExplorer/PreviewPane.tsx @@ -17,7 +17,7 @@ import { Transition } from '@headlessui/react' import * as Tooltip from '@radix-ui/react-tooltip' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { checkPermissions } from 'hooks' +import { useCheckPermissions } from 'hooks' import { URL_EXPIRY_DURATION } from '../Storage.constants' import { useStorageStore } from 'localStores/storageExplorer/StorageExplorerStore' @@ -116,7 +116,7 @@ const PreviewPane = ({ onCopyUrl }: PreviewPaneProps) => { const mimeType = file.metadata ? file.metadata.mimetype : null const createdAt = file.created_at ? new Date(file.created_at).toLocaleString() : 'Unknown' const updatedAt = file.updated_at ? new Date(file.updated_at).toLocaleString() : 'Unknown' - const canUpdateFiles = checkPermissions(PermissionAction.STORAGE_ADMIN_WRITE, '*') + const canUpdateFiles = useCheckPermissions(PermissionAction.STORAGE_ADMIN_WRITE, '*') return ( <> diff --git a/studio/components/to-be-cleaned/Storage/StorageSettings/StorageSettings.tsx b/studio/components/to-be-cleaned/Storage/StorageSettings/StorageSettings.tsx index 2da515fa150..6fe14d00574 100644 --- a/studio/components/to-be-cleaned/Storage/StorageSettings/StorageSettings.tsx +++ b/studio/components/to-be-cleaned/Storage/StorageSettings/StorageSettings.tsx @@ -1,7 +1,7 @@ import { useState } from 'react' import { Button, Form, IconClock, Input, Listbox } from 'ui' -import { checkPermissions, useStore } from 'hooks' +import { useCheckPermissions, useStore } from 'hooks' import { IS_PLATFORM } from 'lib/constants' import { useProjectStorageConfigQuery } from 'data/config/project-storage-config-query' import { useProjectStorageConfigUpdateUpdateMutation } from 'data/config/project-storage-config-update-mutation' @@ -44,7 +44,7 @@ const StorageConfig = ({ config, projectRef }: any) => { const [selectedUnit, setSelectedUnit] = useState(unit) let initialValues = { fileSizeLimit: value, unformattedFileSizeLimit: fileSizeLimit } - const canUpdateStorageSettings = checkPermissions(PermissionAction.STORAGE_ADMIN_WRITE, '*') + const canUpdateStorageSettings = useCheckPermissions(PermissionAction.STORAGE_ADMIN_WRITE, '*') const formattedMaxSizeBytes = `${new Intl.NumberFormat('en-US').format( STORAGE_FILE_SIZE_LIMIT_MAX_BYTES diff --git a/studio/components/ui/ProjectSettings/DisplayApiSettings.tsx b/studio/components/ui/ProjectSettings/DisplayApiSettings.tsx index fce70a3dc2b..a19d5f34d48 100644 --- a/studio/components/ui/ProjectSettings/DisplayApiSettings.tsx +++ b/studio/components/ui/ProjectSettings/DisplayApiSettings.tsx @@ -6,7 +6,7 @@ import { useParams } from 'common/hooks' import Panel from 'components/ui/Panel' import { useJwtSecretUpdatingStatusQuery } from 'data/config/jwt-secret-updating-status-query' import { useProjectSettingsQuery } from 'data/config/project-settings-query' -import { checkPermissions } from 'hooks' +import { useCheckPermissions } from 'hooks' import { DEFAULT_PROJECT_API_SERVICE_ID } from 'lib/constants' const DisplayApiSettings = () => { @@ -24,7 +24,7 @@ const DisplayApiSettings = () => { } = useJwtSecretUpdatingStatusQuery({ projectRef }) const jwtSecretUpdateStatus = data?.jwtSecretUpdateStatus - const canReadAPIKeys = checkPermissions(PermissionAction.READ, 'service_api_keys') + const canReadAPIKeys = useCheckPermissions(PermissionAction.READ, 'service_api_keys') const isNotUpdatingJwtSecret = jwtSecretUpdateStatus === undefined || jwtSecretUpdateStatus === JwtSecretUpdateStatus.Updated diff --git a/studio/components/ui/UpgradeToPro.tsx b/studio/components/ui/UpgradeToPro.tsx index fe0a055afa9..2c6e6031b12 100644 --- a/studio/components/ui/UpgradeToPro.tsx +++ b/studio/components/ui/UpgradeToPro.tsx @@ -5,7 +5,7 @@ import { FC, ReactNode } from 'react' import { useParams } from 'common/hooks' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' -import { checkPermissions, useFlag } from 'hooks' +import { useCheckPermissions, useFlag } from 'hooks' import { PRICING_TIER_PRODUCT_IDS } from 'lib/constants' import { Button } from 'ui' @@ -21,7 +21,7 @@ const UpgradeToPro: FC = ({ icon, primaryText, projectRef, secondaryText const { project } = useProjectContext() const tier = project?.subscription_tier - const canUpdateSubscription = checkPermissions( + const canUpdateSubscription = useCheckPermissions( PermissionAction.BILLING_WRITE, 'stripe.subscriptions' ) @@ -47,7 +47,11 @@ const UpgradeToPro: FC = ({ icon, primaryText, projectRef, secondaryText