diff --git a/src/lib/stores/waitlist.ts b/src/lib/stores/waitlist.ts new file mode 100644 index 0000000000..773b04a241 --- /dev/null +++ b/src/lib/stores/waitlist.ts @@ -0,0 +1,30 @@ +import { get } from 'svelte/store'; +import { user } from '$lib/stores/user'; +import { sdk } from '$lib/stores/sdk'; +const userPreferences = () => get(user)?.prefs; + +export const joinWaitlistSites = () => { + const prefs = userPreferences(); + const newPrefs = { + ...prefs, + joinWaitlistSites: true + }; + + sdk.forConsole.account.updatePrefs(newPrefs); + + if (sessionStorage) { + sessionStorage.setItem('joinWaitlistSites', 'true'); + } +}; + +export const isOnWaitlistSites = (): boolean => { + const prefs = userPreferences(); + const joinedInPrefs = 'joinWaitlistSites' in prefs; + + let joinedInSession = false; + if (sessionStorage) { + joinedInSession = sessionStorage.getItem('joinWaitlistSites') === 'true'; + } + + return joinedInSession || joinedInPrefs; +}; diff --git a/src/routes/(console)/project-[region]-[project]/sites/+layout.ts b/src/routes/(console)/project-[region]-[project]/sites/+layout.ts index d3a0db12fc..349329e337 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/+layout.ts +++ b/src/routes/(console)/project-[region]-[project]/sites/+layout.ts @@ -1,12 +1,16 @@ import Breadcrumbs from './breadcrumbs.svelte'; import Header from './header.svelte'; import { Dependencies } from '$lib/constants'; +import { isCloud } from '$lib/system'; -export const load = async ({ depends }) => { +export const load = async ({ depends, parent }) => { + const { organization } = await parent(); depends(Dependencies.SITES); + const sitesLive = !isCloud || organization.$id === 'appwriteOfficials'; return { - header: Header, - breadcrumbs: Breadcrumbs + header: sitesLive ? Header : undefined, + breadcrumbs: Breadcrumbs, + sitesLive }; }; diff --git a/src/routes/(console)/project-[region]-[project]/sites/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/+page.svelte index 2f2069920b..a6a0bcef04 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/+page.svelte @@ -29,10 +29,13 @@ import { Dependencies } from '$lib/constants'; import { sdk } from '$lib/stores/sdk'; import { isSmallViewport } from '$lib/stores/viewport'; + import { isOnWaitlistSites, joinWaitlistSites } from '$lib/stores/waitlist'; + import { addNotification } from '$lib/stores/notifications'; export let data; let show = false; + let isOnWaitlist = isOnWaitlistSites(); $: $registerCommands([ { @@ -68,6 +71,16 @@ ? EmptyLightMobile : EmptyLight; $: imgClass = $isSmallViewport ? 'mobile' : 'desktop'; + + function addToWaitlist() { + joinWaitlistSites(); + addNotification({ + type: 'success', + title: 'Waitlist joined', + message: "We'll let you know as soon as Appwrite Sites is ready for you." + }); + isOnWaitlist = true; + } @@ -120,18 +133,37 @@ - + {#if isOnWaitlist} - Appwrite Sites is in high demand + You've successfully joined the Sites waitlist -
- - To ensure a smooth experience for everyone, we’re rolling out access - gradually. - -
-
+ + We can't wait for you to try out Sites on Cloud. You will get access + soon. + + {:else} + + + Appwrite Sites is in high demand + + +
+ + To ensure a smooth experience for everyone, we’re rolling out + access gradually. Join the waitlist and be one of the first to + deploy with Sites. + +
+ +
+ +
+
+ {/if}
diff --git a/src/routes/(console)/project-[region]-[project]/sites/+page.ts b/src/routes/(console)/project-[region]-[project]/sites/+page.ts index b76ee678e3..1bde59c409 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/+page.ts +++ b/src/routes/(console)/project-[region]-[project]/sites/+page.ts @@ -2,8 +2,11 @@ import { Query, type Models } from '@appwrite.io/console'; import { sdk } from '$lib/stores/sdk'; import { getLimit, getPage, getSearch, getView, pageToOffset, View } from '$lib/helpers/load'; import { CARD_LIMIT, Dependencies } from '$lib/constants'; +import type { PageLoad } from './$types'; + +export const load: PageLoad = async ({ url, depends, route, params, parent }) => { + const { sitesLive } = await parent(); -export const load = async ({ url, depends, route, params }) => { depends(Dependencies.SITES); const page = getPage(url); const search = getSearch(url); @@ -11,8 +14,6 @@ export const load = async ({ url, depends, route, params }) => { const offset = pageToOffset(page, limit); const view = getView(url, route, View.Grid, View.Grid); - const sitesLive = false; - if (!sitesLive) return { sitesLive,