diff --git a/package.json b/package.json index f6ed453a6..c3c00c4cb 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ }, "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@7f8fe13", + "@appwrite.io/console": "https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@c2f54c6", "@appwrite.io/pink": "0.25.0", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@d68e5e4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 04c8b909d..48b370384 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,8 +12,8 @@ importers: specifier: ^1.1.24 version: 1.1.24(svelte@5.25.3)(zod@3.24.3) '@appwrite.io/console': - specifier: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@7f8fe13 - version: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@7f8fe13 + specifier: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@c2f54c6 + version: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@c2f54c6 '@appwrite.io/pink': specifier: 0.25.0 version: 0.25.0 @@ -254,8 +254,8 @@ packages: '@analytics/type-utils@0.6.2': resolution: {integrity: sha512-TD+xbmsBLyYy/IxFimW/YL/9L2IEnM7/EoV9Aeh56U64Ify8o27HJcKjo38XY9Tcn0uOq1AX3thkKgvtWvwFQg==} - '@appwrite.io/console@https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@7f8fe13': - resolution: {tarball: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@7f8fe13} + '@appwrite.io/console@https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@c2f54c6': + resolution: {tarball: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@c2f54c6} version: 1.2.1 '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@d68e5e4': @@ -3625,7 +3625,7 @@ snapshots: '@analytics/type-utils@0.6.2': {} - '@appwrite.io/console@https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@7f8fe13': {} + '@appwrite.io/console@https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@c2f54c6': {} '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@d68e5e4(svelte@5.25.3)': dependencies: diff --git a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/file-[file]/+page.svelte b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/file-[file]/+page.svelte index 92c181d80..87f7ac765 100644 --- a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/file-[file]/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/file-[file]/+page.svelte @@ -52,7 +52,6 @@ let showManageToken = false; let tokenDeleteMode = false; let showCopyUrlModal = false; - let tokenPermissionsMode = false; let selectedFileToken: Models.ResourceToken | null = null; const getPreview = (fileId: string) => @@ -126,9 +125,7 @@ try { await sdk .forProject(page.params.region, page.params.project) - .tokens.createFileToken($file.bucketId, $file.$id, expiry, [ - Permission.read(Role.any()) - ]); + .tokens.createFileToken($file.bucketId, $file.$id, expiry); await invalidate(Dependencies.FILE_TOKENS); addNotification({ @@ -151,11 +148,7 @@ try { await sdk .forProject(page.params.region, page.params.project) - .tokens.update( - selectedFileToken.$id, - fileToken.expire ? fileToken.expire : null, - fileToken.$permissions - ); + .tokens.update(selectedFileToken.$id, fileToken.expire ? fileToken.expire : null); await invalidate(Dependencies.FILE_TOKENS); addNotification({ message: 'File token updated', @@ -173,23 +166,6 @@ } } - function getPermissionGroups(token: Models.ResourceToken): string { - const map = { - read: 'Read', - update: 'Update', - delete: 'Delete' - }; - - const groups = token.$permissions.reduce((set, perm) => { - const match = perm.match(/^(\w+)\(/); - const key = match?.[1]; - if (key && map[key]) set.add(map[key]); - return set; - }, new Set()); - - return [...groups].join(', '); - } - function getExpiryDetails(token: Models.ResourceToken): { status: 'success' | 'warning' | 'error' | null; message: string | null; @@ -301,16 +277,6 @@ ? cleanFormattedDate(token.accessedAt, true) : 'Never'} - - {#if token.$permissions.length} - - {getPermissionGroups(token)} - - {:else} - none - {/if} - - @@ -322,8 +288,8 @@ { - toggle(); + on:click={(e) => { + toggle(e); showCopyUrlModal = true; selectedFileToken = token; }} @@ -333,28 +299,18 @@ { - toggle(); + on:click={(e) => { + toggle(e); showManageToken = true; selectedFileToken = token; }}> Edit expiry - { - toggle(); - showManageToken = true; - tokenPermissionsMode = true; - selectedFileToken = token; - }}> - Edit permissions - { - toggle(); + toggle(e); tokenDeleteMode = true; showManageToken = true; selectedFileToken = token; @@ -439,7 +395,6 @@ bind:show={showManageToken} bind:isDelete={tokenDeleteMode} bind:fileToken={selectedFileToken} - bind:isUpdatePermissions={tokenPermissionsMode} on:created={({ detail: expiry }) => createFileToken(expiry)} on:updated={({ detail: token }) => updateFileToken(token)} on:deleted={async () => await deleteFileToken(selectedFileToken)} /> diff --git a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/file-[file]/fileTokensCopyUrl.svelte b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/file-[file]/fileTokensCopyUrl.svelte index 106947370..f592d9de1 100644 --- a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/file-[file]/fileTokensCopyUrl.svelte +++ b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/file-[file]/fileTokensCopyUrl.svelte @@ -1,79 +1,47 @@ + {@const tokenUrl = tabContents[selectedTab]} Use the token-based URL below to access this file securely. - {#if error} - - Something went wrong, could not generate the URL. - - {:else} - {@const tokenUrl = codeSnippets[selectedTab]} - - - {#each ['Preview', 'View', 'Download'] as cat} - (selectedTab = cat)} - active={selectedTab === cat}> - {cat} - - {/each} - + + + {#each ['Preview', 'View', 'Download'] as cat} + (selectedTab = cat)} + active={selectedTab === cat}> + {cat} + + {/each} + + + + {getMoreInfo()} + + {#if !token.expire} + + This token doesn't expire. Be cautious when sharing links. + + {/if} + + - - {getMoreInfo()} - - {#if !token.expire} - - This token doesn't expire. Be cautious when sharing links. - - {/if} - - - {/if} diff --git a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/file-[file]/manageFileToken.svelte b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/file-[file]/manageFileToken.svelte index 9f13c1f71..9a3e5e266 100644 --- a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/file-[file]/manageFileToken.svelte +++ b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/file-[file]/manageFileToken.svelte @@ -13,27 +13,24 @@ import { createEventDispatcher } from 'svelte'; import { Link } from '@appwrite.io/pink-svelte'; import { type Models } from '@appwrite.io/console'; - import { Permissions } from '$lib/components/permissions'; import { Confirm, ExpirationInput, Modal } from '$lib/components'; export let show = false; export let isDelete = false; - export let isUpdatePermissions = false; export let fileToken: Models.ResourceToken | null = null; $: expire = fileToken?.expire ?? null; const dispatch = createEventDispatcher(); - function close() { + function close(): void { show = false; expire = null; isDelete = false; fileToken = null; - isUpdatePermissions = false; } - function handleFileToken() { + function handleFileToken(): void { if (isDelete) { dispatch('deleted'); } else { @@ -45,6 +42,10 @@ close(); } + function getModalTitle(): string { + return `${fileToken ? 'Edit' : 'Create'} token${fileToken ? ' expiry' : ''}`; + } + $: if (!show) { close(); } @@ -68,41 +69,24 @@

{:else} - + {#if fileToken} - {#if isUpdatePermissions} - Choose who can access or update your file using this token. - - Learn more - . - {:else} - {@const formattedDate = cleanFormattedDate(fileToken.$createdAt)} - Edit the expiry of the file token created on {formattedDate}. - {/if} + {@const formattedDate = cleanFormattedDate(fileToken.$createdAt)} + Edit the expiry of the file token created on {formattedDate}. {:else} Create a file token to grant access to a file. + Learn more. {/if} - {#if isUpdatePermissions} - - {:else} - - {/if} + diff --git a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/file-[file]/store.ts b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/file-[file]/store.ts index 2f5748362..dd1432428 100644 --- a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/file-[file]/store.ts +++ b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/file-[file]/store.ts @@ -7,15 +7,9 @@ export const file = derived(page, ($page) => $page.data.file as Models.File); export const tokens = derived(page, ($page) => $page.data.tokens as Models.ResourceTokenList); -/** - * Caches JWTs in memory by `token.$id` to avoid regenerating them on each URL copy. - */ -export const cachedJwts = writable>(new Map()); - export const columns = writable([ { id: 'created', title: 'Created', type: 'datetime', width: 200 }, { id: 'expire', title: 'Expiration', type: 'datetime', width: 200 }, { id: 'last_accessed', title: 'Last accessed', type: 'datetime', width: 200 }, - { id: 'permissions', title: 'Permissions', type: 'string', width: 200 }, { id: 'actions', title: '', type: 'string', width: 60 } ]);