From 31960fcd11daa2dfaf8ae409c80b572c9b22940f Mon Sep 17 00:00:00 2001 From: Mohamed Bassem Date: Sat, 8 Nov 2025 15:22:14 +0000 Subject: feat: Add support for user uploaded files (#2100) * feat: add user file upload support for bookmarks Add a new "user-uploaded" asset type that allows users to upload and attach their own files to bookmarks from the attachment box in the bookmark preview page. Changes: - Add USER_UPLOADED asset type to database schema - Add userUploaded to zAssetTypesSchema for type safety - Update attachment permissions to allow attaching/detaching user files - Add fileName field to asset schema for displaying custom filenames - Add "Upload File" button in AttachmentBox component - Display actual filename for user-uploaded files - Allow any file type for user uploads (respects existing upload limits) - Add Upload icon for user-uploaded files Fixes #1863 related asset attachment improvements * fix: ensure fileName is returned and remove edit button for user uploads - Fix attachAsset mutation to fetch and return complete asset with fileName instead of just returning the input (which lacks fileName) - Remove replace/edit button for user-uploaded files - users can only delete and re-upload instead - This ensures the filename displays correctly in the UI immediately after upload Fixes fileName propagation issue for user-uploaded assets * fix asset file name * remove filename from attach asset api --------- Co-authored-by: Claude --- .../components/dashboard/preview/AttachmentBox.tsx | 85 +++++++++++++++------- 1 file changed, 59 insertions(+), 26 deletions(-) (limited to 'apps/web/components/dashboard/preview') diff --git a/apps/web/components/dashboard/preview/AttachmentBox.tsx b/apps/web/components/dashboard/preview/AttachmentBox.tsx index 87c56eb8..e24cc646 100644 --- a/apps/web/components/dashboard/preview/AttachmentBox.tsx +++ b/apps/web/components/dashboard/preview/AttachmentBox.tsx @@ -101,7 +101,11 @@ export default function AttachmentBox({ bookmark }: { bookmark: ZBookmark }) { prefetch={false} > {ASSET_TYPE_TO_ICON[asset.assetType]} -

{humanFriendlyNameForAssertType(asset.assetType)}

+

+ {asset.assetType === "userUploaded" && asset.fileName + ? asset.fileName + : humanFriendlyNameForAssertType(asset.assetType)} +

- {isAllowedToAttachAsset(asset.assetType) && ( - - uploadAsset(file, { - onSuccess: (resp) => { - replaceAsset({ - bookmarkId: bookmark.id, - oldAssetId: asset.id, - newAssetId: resp.assetId, - }); - }, - }) - } - > - - - )} + {isAllowedToAttachAsset(asset.assetType) && + asset.assetType !== "userUploaded" && ( + + uploadAsset(file, { + onSuccess: (resp) => { + replaceAsset({ + bookmarkId: bookmark.id, + oldAssetId: asset.id, + newAssetId: resp.assetId, + }); + }, + }) + } + > + + + )} {isAllowedToDetachAsset(asset.assetType) && ( )} + + uploadAsset(file, { + onSuccess: (resp) => { + attachAsset({ + bookmarkId: bookmark.id, + asset: { + id: resp.assetId, + assetType: "userUploaded", + }, + }); + }, + }) + } + > + + Upload File + ); -- cgit v1.2.3-70-g09d2