Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,4 @@ PUBLIC_APPWRITE_MULTI_REGION=false
PUBLIC_APPWRITE_ENDPOINT=http://localhost/v1
PUBLIC_STRIPE_KEY=
PUBLIC_GROWTH_ENDPOINT=
PUBLIC_CONSOLE_EMAIL_VERIFICATION=false
PUBLIC_CONSOLE_MOCK_AI_SUGGESTIONS=true
4 changes: 0 additions & 4 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ jobs:
"PUBLIC_CONSOLE_MODE=cloud"
"PUBLIC_CONSOLE_FEATURE_FLAGS="
"PUBLIC_APPWRITE_MULTI_REGION=true"
"PUBLIC_CONSOLE_EMAIL_VERIFICATION=true"
"PUBLIC_CONSOLE_MOCK_AI_SUGGESTIONS=false"
"PUBLIC_GROWTH_ENDPOINT=${{ secrets.PUBLIC_GROWTH_ENDPOINT }}"
"PUBLIC_STRIPE_KEY=${{ secrets.PUBLIC_STRIPE_KEY }}"
Expand Down Expand Up @@ -83,7 +82,6 @@ jobs:
"PUBLIC_CONSOLE_MODE=cloud"
"PUBLIC_CONSOLE_FEATURE_FLAGS="
"PUBLIC_APPWRITE_MULTI_REGION=true"
"PUBLIC_CONSOLE_EMAIL_VERIFICATION=true"
"PUBLIC_CONSOLE_MOCK_AI_SUGGESTIONS=false"
"PUBLIC_GROWTH_ENDPOINT=${{ secrets.PUBLIC_GROWTH_ENDPOINT }}"
"PUBLIC_STRIPE_KEY=${{ secrets.PUBLIC_STRIPE_KEY_STAGE }}"
Expand Down Expand Up @@ -122,7 +120,6 @@ jobs:
build-args: |
"PUBLIC_CONSOLE_MODE=self-hosted"
"PUBLIC_APPWRITE_MULTI_REGION=false"
"PUBLIC_CONSOLE_EMAIL_VERIFICATION=false"
"PUBLIC_CONSOLE_MOCK_AI_SUGGESTIONS=true"
"PUBLIC_CONSOLE_FEATURE_FLAGS="
"PUBLIC_GROWTH_ENDPOINT=${{ secrets.PUBLIC_GROWTH_ENDPOINT }}"
Expand Down Expand Up @@ -162,7 +159,6 @@ jobs:
build-args: |
"PUBLIC_CONSOLE_MODE=cloud"
"PUBLIC_APPWRITE_MULTI_REGION=false"
"PUBLIC_CONSOLE_EMAIL_VERIFICATION=true"
"PUBLIC_CONSOLE_MOCK_AI_SUGGESTIONS=false"
"PUBLIC_CONSOLE_FEATURE_FLAGS="
"PUBLIC_STRIPE_KEY=${{ secrets.PUBLIC_STRIPE_KEY_STAGE }}"
Expand Down
2 changes: 0 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ ADD ./static /app/static
ARG PUBLIC_CONSOLE_MODE
ARG PUBLIC_CONSOLE_FEATURE_FLAGS
ARG PUBLIC_APPWRITE_MULTI_REGION
ARG PUBLIC_CONSOLE_EMAIL_VERIFICATION
ARG PUBLIC_CONSOLE_MOCK_AI_SUGGESTIONS
ARG PUBLIC_APPWRITE_ENDPOINT
ARG PUBLIC_GROWTH_ENDPOINT
Expand All @@ -36,7 +35,6 @@ ENV PUBLIC_GROWTH_ENDPOINT=$PUBLIC_GROWTH_ENDPOINT
ENV PUBLIC_CONSOLE_MODE=$PUBLIC_CONSOLE_MODE
ENV PUBLIC_CONSOLE_FEATURE_FLAGS=$PUBLIC_CONSOLE_FEATURE_FLAGS
ENV PUBLIC_APPWRITE_MULTI_REGION=$PUBLIC_APPWRITE_MULTI_REGION
ENV PUBLIC_CONSOLE_EMAIL_VERIFICATION=$PUBLIC_CONSOLE_EMAIL_VERIFICATION
ENV PUBLIC_CONSOLE_MOCK_AI_SUGGESTIONS=$PUBLIC_CONSOLE_MOCK_AI_SUGGESTIONS
ENV PUBLIC_STRIPE_KEY=$PUBLIC_STRIPE_KEY
ENV SENTRY_AUTH_TOKEN=$SENTRY_AUTH_TOKEN
Expand Down
1 change: 0 additions & 1 deletion build.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ async function main() {
logEnv('MULTI REGION', env?.PUBLIC_APPWRITE_MULTI_REGION);
logEnv('APPWRITE ENDPOINT', env?.PUBLIC_APPWRITE_ENDPOINT, 'relative');
logEnv('GROWTH ENDPOINT', env?.PUBLIC_GROWTH_ENDPOINT);
logEnv('CONSOLE EMAIL VERIFICATION', env?.PUBLIC_CONSOLE_EMAIL_VERIFICATION);
logEnv('CONSOLE MOCK AI SUGGESTIONS', env?.PUBLIC_CONSOLE_MOCK_AI_SUGGESTIONS);
log();
logDelimiter();
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
},
"dependencies": {
"@ai-sdk/svelte": "^1.1.24",
"@appwrite.io/console": "https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@fe3277e",
"@appwrite.io/console": "https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@2751",
"@appwrite.io/pink-icons": "0.25.0",
"@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@50b60cc",
"@appwrite.io/pink-legacy": "^1.0.3",
Expand Down
10 changes: 5 additions & 5 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion src/lib/system.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ export const VARS = {
APPWRITE_ENDPOINT: env.PUBLIC_APPWRITE_ENDPOINT ?? undefined,
GROWTH_ENDPOINT: env.PUBLIC_GROWTH_ENDPOINT ?? undefined,
PUBLIC_STRIPE_KEY: env.PUBLIC_STRIPE_KEY ?? undefined,
EMAIL_VERIFICATION: env.PUBLIC_CONSOLE_EMAIL_VERIFICATION === 'true',
MOCK_AI_SUGGESTIONS: (env.PUBLIC_CONSOLE_MOCK_AI_SUGGESTIONS ?? 'true') === 'true'
};

Expand Down
8 changes: 4 additions & 4 deletions src/routes/(console)/+layout.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,20 @@ import type { Plan, PlanList } from '$lib/sdk/billing';
import { Query } from '@appwrite.io/console';

export const load: LayoutLoad = async ({ depends, parent }) => {
const { organizations } = await parent();
const { organizations, consoleVariables } = await parent();

depends(Dependencies.RUNTIMES);
depends(Dependencies.CONSOLE_VARIABLES);
depends(Dependencies.ORGANIZATION);

const { endpoint, project } = sdk.forConsole.client.config;
const [preferences, plansArray, versionData, consoleVariables] = await Promise.all([
const [preferences, plansArray, versionData, variables] = await Promise.all([
sdk.forConsole.account.getPrefs(),
isCloud ? sdk.forConsole.billing.getPlansInfo() : null,
fetch(`${endpoint}/health/version`, {
headers: { 'X-Appwrite-Project': project }
}).then((response) => response.json() as { version?: string }),
sdk.forConsole.console.variables()
consoleVariables ? consoleVariables : sdk.forConsole.console.variables()
]);

const plansInfo = toPlanMap(plansArray);
Expand Down Expand Up @@ -50,7 +50,7 @@ export const load: LayoutLoad = async ({ depends, parent }) => {
preferences,
currentOrgId,
organizations,
consoleVariables,
consoleVariables: variables,
version: versionData?.version ?? null,
allProjectsCount: projectsCount
};
Expand Down
2 changes: 1 addition & 1 deletion src/routes/(console)/account/updateMfa.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
if (userId && secret) {
history.replaceState(null, '', cleanUrl);
try {
await sdk.forConsole.account.updateVerification({ userId, secret });
await sdk.forConsole.account.updateEmailVerification({ userId, secret });
// Don't show notification here - the modal will handle it
await Promise.all([
invalidate(Dependencies.ACCOUNT),
Expand Down
8 changes: 4 additions & 4 deletions src/routes/(console)/verify-email/+page.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ import type { PageLoad } from './$types';
import { Dependencies } from '$lib/constants';
import { sdk } from '$lib/stores/sdk';
import { addNotification } from '$lib/stores/notifications';
import { VARS } from '$lib/system';

export const load: PageLoad = async ({ parent, depends, url }) => {
if (!VARS.EMAIL_VERIFICATION) {
const { account, consoleVariables } = await parent();

if (!consoleVariables._APP_REQUIRE_CONSOLE_VERIFICATION) {
redirect(303, resolve('/'));
}

const { account } = await parent();
depends(Dependencies.ACCOUNT);

const user = url.searchParams.get('userId') ?? null;
Expand All @@ -21,7 +21,7 @@ export const load: PageLoad = async ({ parent, depends, url }) => {
redirect(303, resolve('/'));
} else if (user && secret) {
try {
await sdk.forConsole.account.updateVerification({
await sdk.forConsole.account.updateEmailVerification({
userId: user,
secret
});
Expand Down
27 changes: 23 additions & 4 deletions src/routes/+layout.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@ import { sdk } from '$lib/stores/sdk';
import { redirect } from '@sveltejs/kit';
import { Dependencies } from '$lib/constants';
import type { LayoutLoad } from './$types';
import { redirectTo } from './store';
import { isEmailVerificationRequired, redirectTo } from './store';
import { base, resolve } from '$app/paths';
import type { Account } from '$lib/stores/user';
import type { AppwriteException } from '@appwrite.io/console';
import { isCloud, VARS } from '$lib/system';
import type { AppwriteException, Models } from '@appwrite.io/console';
import { isCloud } from '$lib/system';
import { checkPricingRefAndRedirect } from '$lib/helpers/pricingRedirect';
import { get } from 'svelte/store';

export const ssr = false;

Expand All @@ -23,13 +24,30 @@ export const load: LayoutLoad = async ({ depends, url, route }) => {
.then((response) => [response, null])
.catch((error) => [null, error])) as [Account, AppwriteException];

let isVerificationNeeded = false;
let consoleVariables: Models.ConsoleVariables | null = null;

// cached so we don't always load the variables!
const writableStoreValue = get(isEmailVerificationRequired);
if (writableStoreValue === null) {
try {
consoleVariables = await sdk.forConsole.console.variables();
isVerificationNeeded = consoleVariables._APP_REQUIRE_CONSOLE_VERIFICATION;
isEmailVerificationRequired.set(isVerificationNeeded);
} catch (error) {
// ignore
}
} else {
isVerificationNeeded = writableStoreValue;
}

if (url.searchParams.has('forceRedirect')) {
redirectTo.set(url.searchParams.get('forceRedirect') || null);
url.searchParams.delete('forceRedirect');
}

if (account) {
if (isCloud && !account.emailVerification && VARS.EMAIL_VERIFICATION) {
if (isCloud && !account.emailVerification && isVerificationNeeded) {
const isConsoleRoute = route.id?.startsWith('/(console)');
const isVerifyEmailPage = url.pathname === resolve('/verify-email');

Expand All @@ -40,6 +58,7 @@ export const load: LayoutLoad = async ({ depends, url, route }) => {

return {
account: account,
consoleVariables,
organizations: !isCloud
? await sdk.forConsole.teams.list()
: await sdk.forConsole.billing.listOrganization()
Expand Down
6 changes: 4 additions & 2 deletions src/routes/store.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import { browser } from '$app/environment';
import { writable } from 'svelte/store';

export const requestedMigration = writable<Record<string, string> | null>(null);
export const redirectTo = writable<string | null>(null);
export const loading = writable(true);
export const redirectTo = writable<string | null>(null);
export const requestedMigration = writable<Record<string, string> | null>(null);

export const isEmailVerificationRequired = writable<boolean | null>(null);

loading.subscribe((value) => {
if (browser) globalThis.document.body.dataset.loading = value ? 'true' : 'false';
Expand Down