|
2 | 2 | import { invalidate } from '$app/navigation'; |
3 | 3 | import { page } from '$app/state'; |
4 | 4 | import { Submit, trackEvent, trackError } from '$lib/actions/analytics'; |
5 | | - import Confirm from '$lib/components/confirm.svelte'; |
| 5 | + import Modal from '$lib/components/modal.svelte'; |
| 6 | + import { Secret } from '$lib/components'; |
6 | 7 | import { Dependencies } from '$lib/constants'; |
| 8 | + import { Button, InputPassword } from '$lib/elements/forms'; |
7 | 9 | import { addNotification } from '$lib/stores/notifications'; |
8 | 10 | import { sdk } from '$lib/stores/sdk'; |
9 | | - import { webhook } from './store'; |
| 11 | + import { Layout, Typography } from '@appwrite.io/pink-svelte'; |
| 12 | + import type { Models } from '@appwrite.io/console'; |
| 13 | + import { get } from 'svelte/store'; |
| 14 | + import { webhook as webhookStore } from './store'; |
| 15 | +
|
| 16 | + type WebhooksWithCustomSecret = { |
| 17 | + updateSecret(params: { webhookId: string; secret?: string }): Promise<Models.Webhook>; |
| 18 | + }; |
10 | 19 |
|
11 | 20 | export let show = false; |
| 21 | +
|
12 | 22 | const projectId = page.params.project; |
| 23 | + let secret = ''; |
| 24 | + let revealedSecret = ''; |
| 25 | +
|
| 26 | + $: if (!show) { |
| 27 | + secret = ''; |
| 28 | + revealedSecret = ''; |
| 29 | + } |
13 | 30 |
|
14 | 31 | async function regenerate() { |
15 | 32 | try { |
16 | | - await sdk.forProject(page.params.region, projectId).webhooks.updateSecret({ |
17 | | - webhookId: $webhook.$id |
| 33 | + const currentWebhook = get(webhookStore); |
| 34 | + const customSecret = secret.trim(); |
| 35 | + const updatedWebhook = await ( |
| 36 | + sdk.forProject(page.params.region, projectId).webhooks as WebhooksWithCustomSecret |
| 37 | + ).updateSecret({ |
| 38 | + webhookId: currentWebhook.$id, |
| 39 | + secret: customSecret || undefined |
18 | 40 | }); |
19 | 41 | await invalidate(Dependencies.WEBHOOK); |
20 | | - show = false; |
| 42 | + revealedSecret = customSecret || updatedWebhook.secret; |
21 | 43 | addNotification({ |
22 | 44 | type: 'success', |
23 | | - message: 'Key has been regenerated' |
| 45 | + message: customSecret ? 'Key has been updated' : 'Key has been regenerated' |
24 | 46 | }); |
25 | 47 | trackEvent(Submit.WebhookUpdateSignature); |
26 | 48 | } catch (error) { |
|
33 | 55 | } |
34 | 56 | </script> |
35 | 57 |
|
36 | | -<Confirm title="Regenerate Key" bind:open={show} onSubmit={regenerate} action="Regenerate"> |
37 | | - Are you sure you want to generate a new Signature key? |
38 | | - <b>You will not be able to recover the current key.</b> |
39 | | -</Confirm> |
| 58 | +<Modal title="Update Key" bind:show onSubmit={regenerate}> |
| 59 | + <Layout.Stack gap="l"> |
| 60 | + {#if revealedSecret} |
| 61 | + <Typography.Text> |
| 62 | + Copy this signature key now. For security reasons, you will not be able to view it |
| 63 | + again after closing this dialog. |
| 64 | + </Typography.Text> |
| 65 | + <Secret label="Key" copyEvent="signature" bind:value={revealedSecret} /> |
| 66 | + {:else} |
| 67 | + <Typography.Text> |
| 68 | + Enter a custom signing key, or leave the field empty to generate a new one. |
| 69 | + </Typography.Text> |
| 70 | + <Typography.Text variant="m-400"> |
| 71 | + You will not be able to recover the current key after this change. |
| 72 | + </Typography.Text> |
| 73 | + <InputPassword |
| 74 | + id="webhook-secret" |
| 75 | + label="Custom key" |
| 76 | + placeholder="Leave empty to auto-generate" |
| 77 | + minlength={0} |
| 78 | + autocomplete |
| 79 | + bind:value={secret} /> |
| 80 | + {/if} |
| 81 | + </Layout.Stack> |
| 82 | + |
| 83 | + <svelte:fragment slot="footer"> |
| 84 | + {#if revealedSecret} |
| 85 | + <Button on:click={() => (show = false)}>Done</Button> |
| 86 | + {:else} |
| 87 | + <Button text on:click={() => (show = false)}>Cancel</Button> |
| 88 | + <Button submit>{secret.trim() ? 'Update key' : 'Regenerate key'}</Button> |
| 89 | + {/if} |
| 90 | + </svelte:fragment> |
| 91 | +</Modal> |
0 commit comments