Skip to content

Commit 812607b

Browse files
Merge pull request #2746 from appwrite/feat-profiles-api-keys
2 parents b47251a + 4cca5fb commit 812607b

17 files changed

Lines changed: 241 additions & 18 deletions

src/lib/components/navbar.svelte

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
IconCreditCard,
3535
IconCurrencyDollar,
3636
IconGlobeAlt,
37+
IconKey,
3738
IconLogoutRight,
3839
IconMenuAlt4,
3940
IconMode,
@@ -340,6 +341,21 @@
340341
)}
341342
on:click={() => toggle()}>
342343
Domains</ActionMenu.Item.Anchor>
344+
345+
{#if currentProject}
346+
<ActionMenu.Item.Anchor
347+
size="l"
348+
trailingIcon={IconKey}
349+
href={resolve(
350+
'/(console)/project-[region]-[project]/settings/api-keys',
351+
{
352+
region: currentProject.region,
353+
project: currentProject.$id
354+
}
355+
)}
356+
on:click={() => toggle()}>
357+
API keys</ActionMenu.Item.Anchor>
358+
{/if}
343359
<Divider />
344360
{/if}
345361

@@ -402,6 +418,21 @@
402418
leadingIcon: IconUser,
403419
href: resolve('/(console)/account')
404420
},
421+
...(resolvedProfile.showExtendedAccountsMenu && currentProject
422+
? [
423+
{
424+
name: 'API keys',
425+
leadingIcon: IconKey,
426+
href: resolve(
427+
'/(console)/project-[region]-[project]/settings/api-keys',
428+
{
429+
region: currentProject.region,
430+
project: currentProject.$id
431+
}
432+
)
433+
}
434+
]
435+
: []),
405436
{
406437
name: 'Sign out',
407438
leadingIcon: IconLogoutRight,

src/routes/(console)/project-[region]-[project]/overview/(components)/create.svelte

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script lang="ts">
2-
import { base } from '$app/paths';
2+
import { resolve } from '$app/paths';
33
import { InputText } from '$lib/elements/forms/index.js';
44
import { Wizard } from '$lib/layout';
55
import { Fieldset, Layout, Typography } from '@appwrite.io/pink-svelte';
@@ -17,6 +17,11 @@
1717
import { page } from '$app/state';
1818
import { copy } from '$lib/helpers/copy';
1919
20+
export let basePath: string = resolve('/(console)/project-[region]-[project]/overview', {
21+
project: page.params.project,
22+
region: page.params.region
23+
});
24+
2025
const projectId = page.params.project;
2126
2227
let showExitModal = false;
@@ -41,9 +46,7 @@
4146
}
4247
4348
trackEvent(Submit.KeyCreate);
44-
await goto(
45-
`${base}/project-${page.params.region}-${page.params.project}/overview/api-keys/${$id}`
46-
);
49+
await goto(`${basePath}/api-keys/${$id}`);
4750
addNotification({
4851
message: `API key has been created`,
4952
type: 'success',
@@ -74,7 +77,7 @@
7477

7578
<Wizard
7679
title="Create API key"
77-
href={`${base}/project-${page.params.region}-${page.params.project}/overview/api-keys/`}
80+
href={`${basePath}/api-keys/`}
7881
bind:showExitModal
7982
column
8083
columnSize="s"

src/routes/(console)/project-[region]-[project]/overview/(components)/delete.svelte

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
export let showDelete = false;
1313
export let keyType: 'api' | 'dev' = 'api';
1414
export let key: Models.DevKey | Models.Key;
15+
export let basePath: string = `${base}/project-${page.params.region}-${page.params.project}/overview`;
1516
1617
const projectId = page.params.project;
1718
@@ -42,9 +43,7 @@
4243
message: `${key.name} has been deleted`
4344
});
4445
trackEvent(event);
45-
await goto(
46-
`${base}/project-${page.params.region}-${page.params.project}/overview/${slug}`
47-
);
46+
await goto(`${basePath}/${slug}`);
4847
} catch (e) {
4948
error = e.message;
5049
trackError(e, event);

src/routes/(console)/project-[region]-[project]/overview/(components)/deleteBatch.svelte

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
export let showDelete = false;
1212
export let keyIds: string[] = [];
1313
export let keyType: 'api' | 'dev' = 'api';
14+
export let basePath: string = `${base}/project-${page.params.region}-${page.params.project}/overview`;
1415
1516
let error: string;
1617
@@ -47,9 +48,7 @@
4748
});
4849
4950
trackEvent(event);
50-
await goto(
51-
`${base}/project-${page.params.region}-${page.params.project}/overview/${slug}`
52-
);
51+
await goto(`${basePath}/${slug}`);
5352
} catch (e) {
5453
error = e.message;
5554
trackError(e, event);

src/routes/(console)/project-[region]-[project]/overview/(components)/keyDetails.svelte

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
<script lang="ts">
2+
import { base } from '$app/paths';
23
import { invalidate } from '$app/navigation';
34
import { Submit, trackEvent, trackError } from '$lib/actions/analytics';
45
import { Box, CardGrid } from '$lib/components';
@@ -23,6 +24,7 @@
2324
2425
export let key: Models.DevKey | Models.Key;
2526
export let keyType: 'api' | 'dev' = 'api';
27+
export let basePath: string = `${base}/project-${page.params.region}-${page.params.project}/overview`;
2628
2729
let name: string = null;
2830
let scopes: string[] = null;
@@ -190,7 +192,7 @@
190192
</Form>
191193
{/if}
192194

193-
<UpdateExpirationDate {keyType} {key} />
195+
<UpdateExpirationDate {keyType} {key} {basePath} />
194196

195197
<CardGrid>
196198
<svelte:fragment slot="title">Delete {label} key</svelte:fragment>
@@ -212,4 +214,4 @@
212214
</CardGrid>
213215
</Container>
214216

215-
<Delete {keyType} {key} bind:showDelete />
217+
<Delete {keyType} {key} {basePath} bind:showDelete />

src/routes/(console)/project-[region]-[project]/overview/(components)/table.svelte

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@
1515
1616
let {
1717
keyType = 'api',
18-
keys
18+
keys,
19+
basePath = `${base}/project-${page.params.region}-${page.params.project}/overview`
1920
}: {
2021
keyType?: 'api' | 'dev';
2122
keys: Models.KeyList | Models.DevKeyList;
23+
basePath?: string;
2224
} = $props();
2325
2426
let selectedKeys = $state([]);
@@ -126,13 +128,11 @@
126128
description={getDescription()}
127129
on:click={async () => {
128130
if (isApiKey) {
129-
await goto(
130-
`${base}/project-${page.params.region}-${page.params.project}/overview/${slug}/create`
131-
);
131+
await goto(`${basePath}/${slug}/create`);
132132
} else {
133133
$showDevKeysCreateModal = true;
134134
}
135135
}} />
136136
{/if}
137137

138-
<DeleteBatch {keyType} bind:keyIds={selectedKeys} bind:showDelete={showDeleteModal} />
138+
<DeleteBatch {keyType} {basePath} bind:keyIds={selectedKeys} bind:showDelete={showDeleteModal} />

src/routes/(console)/project-[region]-[project]/overview/(components)/updateExpirationDate.svelte

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
1515
export let keyType: 'api' | 'dev' = 'api';
1616
export let key: Models.DevKey | Models.Key;
17+
export let basePath: string = undefined;
1718
1819
const projectId = page.params.project;
1920
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<script lang="ts">
2+
import { resolvedProfile } from '$lib/profiles/index.svelte';
3+
import { getPageTitle } from '../../store';
4+
import { page } from '$app/state';
5+
</script>
6+
7+
<svelte:head>
8+
<title>{getPageTitle(page.data?.project?.name, 'API Keys', resolvedProfile.platform)}</title>
9+
</svelte:head>
10+
11+
<slot />
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<script lang="ts">
2+
import { base } from '$app/paths';
3+
import { page } from '$app/state';
4+
import type { PageData } from './$types';
5+
import Table from '../../overview/(components)/table.svelte';
6+
import { Button } from '$lib/elements/forms';
7+
import { Container, ResponsiveContainerHeader } from '$lib/layout';
8+
import { Icon } from '@appwrite.io/pink-svelte';
9+
import { IconPlus } from '@appwrite.io/pink-icons-svelte';
10+
import { canWriteKeys } from '$lib/stores/roles';
11+
12+
export let data: PageData;
13+
14+
const basePath = `${base}/project-${page.params.region}-${page.params.project}/settings`;
15+
</script>
16+
17+
<Container>
18+
<ResponsiveContainerHeader hideView analyticsSource="settings_api_keys">
19+
{#if $canWriteKeys}
20+
<Button href={`${basePath}/api-keys/create`}>
21+
<Icon icon={IconPlus} size="s" />
22+
Create API key
23+
</Button>
24+
{/if}
25+
</ResponsiveContainerHeader>
26+
<Table keys={data.keys} {basePath} />
27+
</Container>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { Dependencies } from '$lib/constants';
2+
import { sdk } from '$lib/stores/sdk';
3+
import type { PageLoad } from './$types';
4+
5+
export const load: PageLoad = async ({ params, depends }) => {
6+
depends(Dependencies.KEYS);
7+
return {
8+
keys: await sdk.forConsole.projects.listKeys({
9+
projectId: params.project
10+
})
11+
};
12+
};

0 commit comments

Comments
 (0)