From 4e9548a8c01401f531b8645a478d7ca62b9f140a Mon Sep 17 00:00:00 2001 From: hyungi Date: Sun, 7 Jun 2026 14:46:56 +0900 Subject: [PATCH] =?UTF-8?q?feat(study):=20=EC=95=94=EA=B8=B0=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=20=ED=95=99=EC=8A=B5=20=E2=80=94=20=ED=95=99=EC=8A=B5?= =?UTF-8?q?=20=EC=A4=91=20'=EC=9D=B4=20=EC=B9=B4=EB=93=9C=20=EC=9D=B4?= =?UTF-8?q?=EC=83=81=ED=95=B4=EC=9A=94'=20=EB=B2=84=ED=8A=BC(=EA=B2=80?= =?UTF-8?q?=EC=88=98=ED=95=A8=20=EB=B3=B5=EA=B7=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 사용자 의도 정정: 신고 버튼은 퀴즈가 아니라 암기카드 학습(cards-study) 안에 필요했음. - 복습·그냥공부 카드 우상단에 '이 카드 이상해요' 버튼. PATCH /study-cards/{id} {needs_review:true} → flagged_by='user' → 학습 큐에서 빠지고 검수함(/study/cards-review)으로 복귀. 신고 후 advance()로 다음 카드. - 카드 backend(update_card needs_review set)는 기존 — 프론트 1파일만. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../src/routes/study/cards-study/+page.svelte | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/frontend/src/routes/study/cards-study/+page.svelte b/frontend/src/routes/study/cards-study/+page.svelte index 95bd3aa..04cca6d 100644 --- a/frontend/src/routes/study/cards-study/+page.svelte +++ b/frontend/src/routes/study/cards-study/+page.svelte @@ -16,7 +16,7 @@ import { goto } from '$app/navigation'; import { api } from '$lib/api'; import { addToast } from '$lib/stores/toast'; - import { ArrowLeft, Repeat, Layers, Eye, BookOpen } from 'lucide-svelte'; + import { ArrowLeft, Repeat, Layers, Eye, BookOpen, Flag } from 'lucide-svelte'; import Button from '$lib/components/ui/Button.svelte'; import Skeleton from '$lib/components/ui/Skeleton.svelte'; import EmptyState from '$lib/components/ui/EmptyState.svelte'; @@ -140,6 +140,23 @@ } } + // 학습 중 카드 내용이 이상하면 검수함(cards-review)으로 되돌림 (needs_review=true → 학습 큐에서 빠짐). + let flagBusy = $state(false); + async function flagCard() { + if (!current || flagBusy || busy) return; + flagBusy = true; + const c = current; + try { + await api(`/study-cards/${c.id}`, { method: 'PATCH', body: JSON.stringify({ needs_review: true }) }); + addToast('success', '검수함으로 보냈어요 — 이 카드는 학습에서 빠집니다'); + advance(); + } catch (err) { + addToast('error', err?.detail || '신고 처리 실패'); + } finally { + flagBusy = false; + } + } + function setCramFilter(f) { if (fmtFilter === f) return; fmtFilter = f; @@ -294,9 +311,20 @@
- {current.format} +
+ {current.format} + +
앞 — {current.format === 'qa' ? '질문' : '회상'}