Skip to content

Commit 72fa7a8

Browse files
committed
Merge branch 'main' into fix-ai-alert
2 parents 1658101 + b534a7c commit 72fa7a8

File tree

29 files changed

+295
-351
lines changed

29 files changed

+295
-351
lines changed

src/global.d.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,14 @@
11
/// <reference types="@sveltejs/kit" />
22
interface Window {}
3+
4+
namespace App {
5+
interface Error {
6+
type?: string;
7+
}
8+
9+
interface HandleClientError {
10+
message: string;
11+
status?: number;
12+
type?: string;
13+
}
14+
}

src/hooks.client.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,17 @@ Sentry.init({
1313

1414
export const handleError: HandleClientError = ({ error, message, status }) => {
1515
console.error(error);
16+
17+
let type;
1618
if (error instanceof AppwriteException) {
1719
status = error.code === 0 ? undefined : error.code;
1820
message = error.message;
21+
type = error.type;
1922
}
2023

2124
return {
2225
message,
23-
status
26+
status,
27+
type
2428
};
2529
};
Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,44 @@
1-
<script>
1+
<script lang="ts">
22
import { page } from '$app/state';
33
import { Container } from '$lib/layout';
4-
import { Typography } from '@appwrite.io/pink-svelte';
4+
import { Card, Link, Typography } from '@appwrite.io/pink-svelte';
5+
import SupportWizard from '$routes/(console)/supportWizard.svelte';
6+
import { capitalize } from '$lib/helpers/string';
7+
import { currentPlan } from '$lib/stores/organization';
8+
import { wizard } from '$lib/stores/wizard';
9+
function getResource(id: string) {
10+
id = id.replace('/(console)/project-[region]-[project]/', '');
11+
let parts = id.split('/');
12+
const resource = parts[0];
13+
14+
return resource === 'settings' ? 'project' : resource;
15+
}
516
</script>
617

718
<Container>
8-
<Typography.Title size="xl"
9-
>{'status' in page.error
10-
? page.error.status || 'Invalid Argument'
11-
: 'Invalid Argument'}</Typography.Title>
12-
<p class="body-text-2 u-bold u-margin-block-start-4">{page.error.message}</p>
19+
{#if page.error.type === 'general_resource_blocked'}
20+
{@const resource = getResource(page.route.id)}
21+
<Card.Base>
22+
<Typography.Title size="s">Your {capitalize(resource)} is paused</Typography.Title>
23+
<p class="text-red-500">
24+
We've detected unusual activity and temporarily paused your {resource}. If you
25+
believe this is a mistake or need urgent access, please contact
26+
{#if $currentPlan?.premiumSupport}
27+
<Link.Button
28+
on:click={() => {
29+
wizard.start(SupportWizard);
30+
}}>support</Link.Button
31+
>.
32+
{:else}
33+
34+
{/if}
35+
</p>
36+
</Card.Base>
37+
{:else}
38+
<Typography.Title size="xl"
39+
>{'status' in page.error
40+
? page.error.status || 'Invalid Argument'
41+
: 'Invalid Argument'}</Typography.Title>
42+
<p class="body-text-2 u-bold u-margin-block-start-4">{page.error.message}</p>
43+
{/if}
1344
</Container>
Lines changed: 39 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { Dependencies } from '$lib/constants';
22
import { sdk } from '$lib/stores/sdk';
3-
import { error } from '@sveltejs/kit';
43
import type { LayoutLoad } from './$types';
54
import { preferences } from '$lib/stores/preferences';
65
import { failedInvoice } from '$lib/stores/billing';
@@ -17,50 +16,46 @@ export const load: LayoutLoad = async ({ params, depends }) => {
1716
depends(Dependencies.PROJECT);
1817
let currentPlan: Plan = null;
1918

20-
try {
21-
const project = await sdk.forConsole.projects.get(params.project);
22-
const [organization, prefs, regionalConsoleVariables, _] = await Promise.all([
23-
sdk.forConsole.teams.get(project.teamId) as Promise<Organization>,
24-
sdk.forConsole.account.getPrefs(),
25-
sdk.forConsoleIn(project.region).console.variables(),
26-
loadAvailableRegions(project.teamId)
27-
]);
28-
if (prefs?.organization !== project.teamId) {
29-
sdk.forConsole.account.updatePrefs({
30-
...prefs,
31-
organization: project.teamId
32-
});
33-
}
34-
await preferences.loadTeamPrefs(project.teamId);
35-
let roles = isCloud ? [] : defaultRoles;
36-
let scopes = isCloud ? [] : defaultScopes;
37-
if (isCloud) {
38-
currentPlan = await sdk.forConsole.billing.getOrganizationPlan(project.teamId);
39-
const res = await sdk.forConsole.billing.getRoles(project.teamId);
40-
roles = res.roles;
41-
scopes = res.scopes;
42-
if (scopes.includes('billing.read')) {
43-
await failedInvoice.load(project.teamId);
44-
if (get(failedInvoice)) {
45-
headerAlert.add({
46-
show: true,
47-
component: PaymentFailed,
48-
id: 'paymentFailed',
49-
importance: 1
50-
});
51-
}
19+
const project = await sdk.forConsole.projects.get(params.project);
20+
const [organization, prefs, regionalConsoleVariables, _] = await Promise.all([
21+
sdk.forConsole.teams.get(project.teamId) as Promise<Organization>,
22+
sdk.forConsole.account.getPrefs(),
23+
sdk.forConsoleIn(project.region).console.variables(),
24+
loadAvailableRegions(project.teamId)
25+
]);
26+
if (prefs?.organization !== project.teamId) {
27+
sdk.forConsole.account.updatePrefs({
28+
...prefs,
29+
organization: project.teamId
30+
});
31+
}
32+
await preferences.loadTeamPrefs(project.teamId);
33+
let roles = isCloud ? [] : defaultRoles;
34+
let scopes = isCloud ? [] : defaultScopes;
35+
if (isCloud) {
36+
currentPlan = await sdk.forConsole.billing.getOrganizationPlan(project.teamId);
37+
const res = await sdk.forConsole.billing.getRoles(project.teamId);
38+
roles = res.roles;
39+
scopes = res.scopes;
40+
if (scopes.includes('billing.read')) {
41+
await failedInvoice.load(project.teamId);
42+
if (get(failedInvoice)) {
43+
headerAlert.add({
44+
show: true,
45+
component: PaymentFailed,
46+
id: 'paymentFailed',
47+
importance: 1
48+
});
5249
}
5350
}
54-
55-
return {
56-
project,
57-
organization,
58-
regionalConsoleVariables,
59-
roles,
60-
scopes,
61-
currentPlan
62-
};
63-
} catch (e) {
64-
error(e.code, e.message);
6551
}
52+
53+
return {
54+
project,
55+
organization,
56+
regionalConsoleVariables,
57+
roles,
58+
scopes,
59+
currentPlan
60+
};
6661
};

src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/+layout.ts

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,12 @@ import Header from './header.svelte';
33
import { sdk } from '$lib/stores/sdk';
44
import type { LayoutLoad } from './$types';
55
import { Dependencies } from '$lib/constants';
6-
import { error } from '@sveltejs/kit';
76

87
export const load: LayoutLoad = async ({ params, depends }) => {
98
depends(Dependencies.TEAM);
10-
try {
11-
return {
12-
header: Header,
13-
breadcrumbs: Breadcrumbs,
14-
team: await sdk.forProject(params.region, params.project).teams.get(params.team)
15-
};
16-
} catch (e) {
17-
error(e.code, e.message);
18-
}
9+
return {
10+
header: Header,
11+
breadcrumbs: Breadcrumbs,
12+
team: await sdk.forProject(params.region, params.project).teams.get(params.team)
13+
};
1914
};

src/routes/(console)/project-[region]-[project]/auth/usage/[[period]]/+page.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,10 @@ import { isValueOfStringEnum } from '$lib/helpers/types';
22
import { sdk } from '$lib/stores/sdk';
33
import { UserUsageRange } from '@appwrite.io/console';
44
import type { PageLoad } from './$types';
5-
import { error } from '@sveltejs/kit';
65

76
export const load: PageLoad = async ({ params }) => {
87
const period = isValueOfStringEnum(UserUsageRange, params.period)
98
? params.period
109
: UserUsageRange.ThirtyDays;
11-
try {
12-
return sdk.forProject(params.region, params.project).users.getUsage(period);
13-
} catch (e) {
14-
error(e.code, e.message);
15-
}
10+
return sdk.forProject(params.region, params.project).users.getUsage(period);
1611
};

src/routes/(console)/project-[region]-[project]/auth/user-[user]/+layout.ts

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,19 @@ import Breadcrumbs from './breadcrumbs.svelte';
33
import Header from './header.svelte';
44
import { sdk } from '$lib/stores/sdk';
55
import { Dependencies } from '$lib/constants';
6-
import { error } from '@sveltejs/kit';
76

87
export const load: LayoutLoad = async ({ params, depends }) => {
98
depends(Dependencies.USER);
109

11-
try {
12-
const [user, userFactors] = await Promise.all([
13-
sdk.forProject(params.region, params.project).users.get(params.user),
14-
sdk.forProject(params.region, params.project).users.listMfaFactors(params.user)
15-
]);
10+
const [user, userFactors] = await Promise.all([
11+
sdk.forProject(params.region, params.project).users.get(params.user),
12+
sdk.forProject(params.region, params.project).users.listMfaFactors(params.user)
13+
]);
1614

17-
return {
18-
header: Header,
19-
breadcrumbs: Breadcrumbs,
20-
user,
21-
userFactors
22-
};
23-
} catch (e) {
24-
error(e.code, e.message);
25-
}
15+
return {
16+
header: Header,
17+
breadcrumbs: Breadcrumbs,
18+
user,
19+
userFactors
20+
};
2621
};

src/routes/(console)/project-[region]-[project]/databases/+page.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ export const load: PageLoad = async ({ url, route, depends, params, parent }) =>
2828
search,
2929
currentPlan
3030
);
31-
3231
return {
3332
offset,
3433
limit,
Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,15 @@
11
import { sdk } from '$lib/stores/sdk';
22
import { Dependencies } from '$lib/constants';
3-
import { error } from '@sveltejs/kit';
43
import type { LayoutLoad } from './$types';
54
import Breadcrumbs from './breadcrumbs.svelte';
65
import Header from './header.svelte';
76

87
export const load: LayoutLoad = async ({ params, depends }) => {
98
depends(Dependencies.DATABASE);
109

11-
try {
12-
return {
13-
header: Header,
14-
breadcrumbs: Breadcrumbs,
15-
database: await sdk
16-
.forProject(params.region, params.project)
17-
.databases.get(params.database)
18-
};
19-
} catch (e) {
20-
error(e.code, e.message);
21-
}
10+
return {
11+
header: Header,
12+
breadcrumbs: Breadcrumbs,
13+
database: await sdk.forProject(params.region, params.project).databases.get(params.database)
14+
};
2215
};

src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/+layout.ts

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,26 @@ import { Dependencies } from '$lib/constants';
33
import type { LayoutLoad } from './$types';
44
import Breadcrumbs from './breadcrumbs.svelte';
55
import Header from './header.svelte';
6-
import { error } from '@sveltejs/kit';
76
import SubNavigation from './subNavigation.svelte';
87
import { Query } from '@appwrite.io/console';
98

109
export const load: LayoutLoad = async ({ params, depends }) => {
1110
depends(Dependencies.COLLECTION);
12-
try {
13-
const [collection, allCollections] = await Promise.all([
14-
sdk
15-
.forProject(params.region, params.project)
16-
.databases.getCollection(params.database, params.collection),
17-
sdk
18-
.forProject(params.region, params.project)
19-
.databases.listCollections(params.database, [Query.orderDesc(''), Query.limit(100)])
20-
]);
2111

22-
return {
23-
header: Header,
24-
breadcrumbs: Breadcrumbs,
25-
subNavigation: SubNavigation,
26-
collection,
27-
allCollections
28-
};
29-
} catch (e) {
30-
error(e.code, e.message);
31-
}
12+
const [collection, allCollections] = await Promise.all([
13+
sdk
14+
.forProject(params.region, params.project)
15+
.databases.getCollection(params.database, params.collection),
16+
sdk
17+
.forProject(params.region, params.project)
18+
.databases.listCollections(params.database, [Query.orderDesc(''), Query.limit(100)])
19+
]);
20+
21+
return {
22+
header: Header,
23+
breadcrumbs: Breadcrumbs,
24+
subNavigation: SubNavigation,
25+
collection,
26+
allCollections
27+
};
3228
};

0 commit comments

Comments
 (0)