From 3c81d9a4a193e45490f1f4c726c2c79fa18a03ea Mon Sep 17 00:00:00 2001 From: vibsin9322 Date: Thu, 11 Jun 2026 18:39:09 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EA=B3=B5=EC=9C=A0=20=EB=A7=81=ED=81=AC?= =?UTF-8?q?=20=EB=B3=B5=EC=82=AC=20=EA=B8=B0=EB=8A=A5=20=EB=B0=8F=20?= =?UTF-8?q?=EC=97=85=EB=A1=9C=EB=93=9C=20=ED=99=95=EC=9D=B8=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 파일 미리보기 모달 공유 링크 복사 버튼 → 클립보드 복사 + 토스트 알림 - 업로드 완료 후 확인 버튼 표시 Co-Authored-By: Claude Sonnet 4.6 --- index.html | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index 3390b91..02d736a 100644 --- a/index.html +++ b/index.html @@ -913,13 +913,20 @@ const UploadModal = ({ onClose, onUploaded, accent, categories, users }) => { ))} )} + {uploads.length > 0 && uploads.every(u => u.progress === 100 || u.progress < 0) && ( +
+ +
+ )} ); }; -const PreviewModal = ({ file, onClose, onDownload, onStar, accent, categories }) => { +const PreviewModal = ({ file, onClose, onDownload, onStar, onCopyLink, accent, categories }) => { if (!file) return null; return (
@@ -981,7 +988,7 @@ const PreviewModal = ({ file, onClose, onDownload, onStar, accent, categories }) {file.starred ? "즐겨찾기 해제" : "즐겨찾기 추가"} - +
@@ -1133,6 +1140,16 @@ function App() { } catch { showToast("오류가 발생했습니다"); } }; + const onCopyLink = async f => { + const url = `${window.location.origin}/api/files/${f.id}/download`; + try { + await navigator.clipboard.writeText(url); + showToast('링크가 클립보드에 복사되었습니다'); + } catch { + showToast('복사에 실패했습니다'); + } + }; + const onBulkDownload = () => { showToast(`${selected.size}개 파일을 ZIP으로 다운로드합니다`); setSelected(new Set()); }; const onBulkDelete = async () => { @@ -1204,6 +1221,7 @@ function App() { onClose={() => setPreviewing(null)} onDownload={f => { onDownload(f); setPreviewing(null); }} onStar={id => toggleStar(id)} + onCopyLink={onCopyLink} accent={t.accent} categories={categories} />