diff --git a/docker/.env.example b/docker/.env.example index 8a12be00005..81009f30577 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -3,8 +3,8 @@ POSTGRES_PASSWORD=your-super-secret-and-long-postgres-password JWT_SECRET=your-super-secret-jwt-token-with-at-least-32-characters-long -ANON_KEY=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoiYW5vbiIsImlhdCI6MTYyNzIwODU0MCwiZXhwIjoxOTc0MzYzNzQwfQ.zcaQfHd3VA7XgJmdGfmV86OLVJT9s2MTmSy-e69BpUY -SERVICE_ROLE_KEY=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoic2VydmljZV9yb2xlIiwiaWF0IjoxNjI3MjA4NTQwLCJleHAiOjE5NzQzNjM3NDB9.pkT3PNpO4DtO45Ac5HK_TKCx8sGLgNtV__pr_ZrRSAU +ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE +SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q # Auth diff --git a/docker/volumes/api/kong.yml b/docker/volumes/api/kong.yml index 13a2caa42be..aab2fe55aa0 100644 --- a/docker/volumes/api/kong.yml +++ b/docker/volumes/api/kong.yml @@ -6,10 +6,10 @@ _format_version: "1.1" consumers: - username: anon keyauth_credentials: - - key: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoiYW5vbiIsImlhdCI6MTYyNzIwODU0MCwiZXhwIjoxOTc0MzYzNzQwfQ.zcaQfHd3VA7XgJmdGfmV86OLVJT9s2MTmSy-e69BpUY + - key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE - username: service_role keyauth_credentials: - - key: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoic2VydmljZV9yb2xlIiwiaWF0IjoxNjI3MjA4NTQwLCJleHAiOjE5NzQzNjM3NDB9.pkT3PNpO4DtO45Ac5HK_TKCx8sGLgNtV__pr_ZrRSAU + - key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q ### ### Access Control List diff --git a/studio/.env b/studio/.env index 6b71a62226e..65f8221f719 100644 --- a/studio/.env +++ b/studio/.env @@ -2,5 +2,5 @@ STUDIO_PG_META_URL=http://localhost:8000/pg POSTGRES_PASSWORD=your-super-secret-and-long-postgres-password SUPABASE_URL=http://localhost:8000 -SUPABASE_ANON_KEY=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoiYW5vbiIsImlhdCI6MTYyNzIwODU0MCwiZXhwIjoxOTc0MzYzNzQwfQ.zcaQfHd3VA7XgJmdGfmV86OLVJT9s2MTmSy-e69BpUY -SUPABASE_SERVICE_KEY=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoic2VydmljZV9yb2xlIiwiaWF0IjoxNjI3MjA4NTQwLCJleHAiOjE5NzQzNjM3NDB9.pkT3PNpO4DtO45Ac5HK_TKCx8sGLgNtV__pr_ZrRSAU \ No newline at end of file +SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE +SUPABASE_SERVICE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q \ No newline at end of file diff --git a/studio/pages/new/index.tsx b/studio/pages/new/index.tsx index e095e1b1648..8d2cf5477e1 100644 --- a/studio/pages/new/index.tsx +++ b/studio/pages/new/index.tsx @@ -1,7 +1,7 @@ import { useState } from 'react' import { observer } from 'mobx-react-lite' import { Button, Typography } from '@supabase/ui' -import Router from 'next/router' +import { useRouter } from 'next/router' import { API_URL } from 'lib/constants' import { useStore, withAuth } from 'hooks' @@ -15,6 +15,8 @@ import Panel from 'components/to-be-cleaned/Panel' */ const Wizard = () => { const { ui, app } = useStore() + const router = useRouter() + const [orgName, setOrgName] = useState('') const [newOrgLoading, setNewOrgLoading] = useState(false) @@ -49,11 +51,7 @@ const Wizard = () => { } else { const org = response app.onOrgAdded(org) - - // Router.push('/new/[slug]', `/new/${org.slug}`) - // Using window.location.href for now as organization metadata needs to refresh - // We do not get is_owner nor stripe_customer_id from the response here - window.location.href = `/new/${org.slug}` + router.push(`/new/${org.slug}`) } } @@ -70,7 +68,7 @@ const Wizard = () => { ]} footer={[
-
diff --git a/studio/stores/app/AppStore.ts b/studio/stores/app/AppStore.ts index b50a0bebfd0..4ce562ef5b8 100644 --- a/studio/stores/app/AppStore.ts +++ b/studio/stores/app/AppStore.ts @@ -1,6 +1,6 @@ import { cloneDeep } from 'lodash' import { values } from 'mobx' -import { Project } from 'types' +import { Organization, Project } from 'types' import { API_URL, STRIPE_PRODUCT_IDS } from 'lib/constants' import { IRootStore } from '../RootStore' @@ -71,19 +71,23 @@ export default class AppStore implements IAppStore { } } - onOrgUpdated(org: any) { - if (org && org.id) { - this.organizations.data[org.id] = { ...org } + onOrgUpdated(updatedOrg: Organization) { + if (updatedOrg && updatedOrg.id) { + const originalOrg = this.organizations.data[updatedOrg.id] + this.organizations.data[updatedOrg.id] = { + ...originalOrg, + ...updatedOrg, + } } } - onOrgAdded(org: any) { + onOrgAdded(org: Organization) { if (org && org.id) { - this.organizations.data[org.id] = { ...org } + this.organizations.data[org.id] = org } } - onOrgDeleted(org: any) { + onOrgDeleted(org: Organization) { if (org && org.id) { const projects = values(this.projects.data) // cleanup projects saved queries diff --git a/studio/types/base.ts b/studio/types/base.ts index 08799a0c9c0..f4ebb0b542f 100644 --- a/studio/types/base.ts +++ b/studio/types/base.ts @@ -4,9 +4,13 @@ export interface Organization { name: string billing_email: string project_limit: number - stripe_customer_id?: string - total_free_projects?: number + members: any[] + projects: any[] is_owner?: boolean + stripe_customer_id?: string + stripe_customer_object?: any + total_free_projects?: number + total_paid_projects?: number } export interface Project { diff --git a/tests/jest-env.js b/tests/jest-env.js index 04916049a19..66cd730acd9 100644 --- a/tests/jest-env.js +++ b/tests/jest-env.js @@ -1,5 +1,5 @@ process.env.SUPABASE_URL = 'http://localhost:8000' process.env.SUPABASE_KEY_ANON = - 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoiYW5vbiIsImlhdCI6MTYyNzIwODU0MCwiZXhwIjoxOTc0MzYzNzQwfQ.zcaQfHd3VA7XgJmdGfmV86OLVJT9s2MTmSy-e69BpUY' + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE' process.env.SUPABASE_KEY_ADMIN = - 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoic2VydmljZV9yb2xlIiwiaWF0IjoxNjI3MjA4NTQwLCJleHAiOjE5NzQzNjM3NDB9.pkT3PNpO4DtO45Ac5HK_TKCx8sGLgNtV__pr_ZrRSAU' \ No newline at end of file + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q' \ No newline at end of file diff --git a/web/spec/supabase.yml b/web/spec/supabase.yml index 31c5b301490..25c6d0bb9d4 100644 --- a/web/spec/supabase.yml +++ b/web/spec/supabase.yml @@ -716,6 +716,48 @@ pages: console.log(event, session) }) ``` + - name: Listen to sign in + js: | + ```js + supabase.auth.onAuthStateChange((event, session) => { + if (event == 'SIGNED_IN') console.log('SIGNED_IN', session) + }) + ``` + - name: Listen to sign out + js: | + ```js + supabase.auth.onAuthStateChange((event, session) => { + if (event == 'SIGNED_OUT') console.log('SIGNED_OUT', session) + }) + ``` + - name: Listen to token refresh + js: | + ```js + supabase.auth.onAuthStateChange((event, session) => { + if (event == 'TOKEN_REFRESHED') console.log('TOKEN_REFRESHED', session) + }) + ``` + - name: Listen to user updates + js: | + ```js + supabase.auth.onAuthStateChange((event, session) => { + if (event == 'USER_UPDATED') console.log('USER_UPDATED', session) + }) + ``` + - name: Listen to user deleted + js: | + ```js + supabase.auth.onAuthStateChange((event, session) => { + if (event == 'USER_DELETED') console.log('USER_DELETED', session) + }) + ``` + - name: Listen to password recovery events + js: | + ```js + supabase.auth.onAuthStateChange((event, session) => { + if (event == 'PASSWORD_RECOVERY') console.log('PASSWORD_RECOVERY', session) + }) + ``` auth.api.getUser(): title: 'getUser()' $ref: '@supabase/gotrue-js.GoTrueApi.getUser' diff --git a/www/components/Nav/index.tsx b/www/components/Nav/index.tsx index 2b7984e661d..4d92d7ca914 100644 --- a/www/components/Nav/index.tsx +++ b/www/components/Nav/index.tsx @@ -253,7 +253,7 @@ const Nav = (props: Props) => { - +