Skip to content

Commit 93969d8

Browse files
authored
Merge pull request #2924 from appwrite/feat-user-impersonation-card
feat: new user impersonation card
2 parents 1e7e199 + 470e322 commit 93969d8

5 files changed

Lines changed: 90 additions & 3 deletions

File tree

bun.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
},
2121
"dependencies": {
2222
"@ai-sdk/svelte": "^1.1.24",
23-
"@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@9163640",
23+
"@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@69509a7",
2424
"@appwrite.io/pink-icons": "0.25.0",
2525
"@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3",
2626
"@appwrite.io/pink-legacy": "^1.0.3",

src/lib/actions/analytics.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ export enum Submit {
235235
UserUpdatePassword = 'submit_user_update_password',
236236
UserUpdatePhone = 'submit_user_update_phone',
237237
UserUpdateMfa = 'submit_user_update_mfa',
238+
UserUpdateImpersonation = 'submit_user_update_impersonation',
238239
UserUpdatePreferences = 'submit_user_update_preferences',
239240
UserUpdateStatus = 'submit_user_update_status',
240241
UserUpdateVerificationEmail = 'submit_user_update_verification_email',

src/routes/(console)/project-[region]-[project]/auth/user-[user]/+page.svelte

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import UpdateName from './updateName.svelte';
88
import UpdatePassword from './updatePassword.svelte';
99
import UpdatePhone from './updatePhone.svelte';
10+
import UpdateImpersonation from './updateImpersonation.svelte';
1011
import UpdatePrefs from './updatePrefs.svelte';
1112
import UpdateStatus from './updateStatus.svelte';
1213
import type { PageData } from './$types';
@@ -22,6 +23,7 @@
2223
<UpdatePassword />
2324
<UpdateLabels />
2425
<UpdatePrefs />
26+
<UpdateImpersonation />
2527
<UpdateMfa />
2628
<DangerZone project={data.project} />
2729
</Container>
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
<script lang="ts">
2+
import { invalidate } from '$app/navigation';
3+
import { page } from '$app/state';
4+
import { Submit, trackError, trackEvent } from '$lib/actions/analytics';
5+
import { CardGrid } from '$lib/components';
6+
import { Dependencies } from '$lib/constants';
7+
import { Button, Form } from '$lib/elements/forms';
8+
import { addNotification } from '$lib/stores/notifications';
9+
import { sdk } from '$lib/stores/sdk';
10+
import { Alert, Layout, Link, Selector, Typography } from '@appwrite.io/pink-svelte';
11+
import { onMount } from 'svelte';
12+
import { user } from './store';
13+
14+
let impersonator = false;
15+
16+
$: currentImpersonator = Boolean($user?.impersonator);
17+
18+
onMount(() => {
19+
impersonator = currentImpersonator;
20+
});
21+
22+
async function updateImpersonator() {
23+
try {
24+
await sdk.forProject(page.params.region, page.params.project).users.updateImpersonator({
25+
userId: $user.$id,
26+
impersonator
27+
});
28+
29+
await invalidate(Dependencies.USER);
30+
31+
addNotification({
32+
message: `Impersonation capability has been ${impersonator ? 'enabled' : 'disabled'}`,
33+
type: 'success'
34+
});
35+
trackEvent(Submit.UserUpdateImpersonation);
36+
} catch (error) {
37+
impersonator = currentImpersonator;
38+
39+
addNotification({
40+
message: error.message,
41+
type: 'error'
42+
});
43+
trackError(error, Submit.UserUpdateImpersonation);
44+
}
45+
}
46+
</script>
47+
48+
<Form onSubmit={updateImpersonator}>
49+
<CardGrid>
50+
<svelte:fragment slot="title">User impersonation</svelte:fragment>
51+
<svelte:fragment slot="aside">
52+
<Layout.Stack gap="m">
53+
<Selector.Switch
54+
id="user-impersonation"
55+
bind:checked={impersonator}
56+
label="User impersonation">
57+
<svelte:fragment slot="description">
58+
<div class="u-margin-block-start-8">
59+
<Typography.Text variant="m-400">
60+
Enabling this option allows this user to impersonate other users
61+
through your app using the Appwrite Client SDK.
62+
<Link.Anchor
63+
target="_blank"
64+
rel="noopener noreferrer"
65+
href="https://appwrite.io/docs/products/auth">
66+
Learn more.
67+
</Link.Anchor>
68+
</Typography.Text>
69+
</div>
70+
</svelte:fragment>
71+
</Selector.Switch>
72+
73+
<Alert.Inline status="info">
74+
Only grant this permission to trusted operator or support accounts. Actions are
75+
logged under the account that initiated impersonation.
76+
</Alert.Inline>
77+
</Layout.Stack>
78+
</svelte:fragment>
79+
80+
<svelte:fragment slot="actions">
81+
<Button disabled={impersonator === currentImpersonator} submit>Update</Button>
82+
</svelte:fragment>
83+
</CardGrid>
84+
</Form>

0 commit comments

Comments
 (0)