fix: 크롭 이미지 URL을 API 서버 기준으로 해석 + 복습 시 사용자 등록 문제 이미지 표시

- import-pdf: resolveUploadUrl로 이미지 src를 API 서버 도메인으로 변환
- review: currentProblem이 null이어도 StudyLog.imageUrl이 있으면 이미지 표시
- getOne API: correctAnswer, imageUrl 필드 응답에 추가
- api.ts: StudyLogDetail에 imageUrl 필드 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
reloop
2026-04-17 09:45:31 +09:00
parent 2b9111a3f7
commit da7dba0c0c
4 changed files with 23 additions and 18 deletions

View File

@@ -554,6 +554,8 @@ export class StudyLogsService {
studiedAt: log.studiedAt,
result: log.result,
chosenAnswer: log.chosenAnswer,
correctAnswer: log.correctAnswer,
imageUrl: log.imageUrl,
memo: log.memo,
timeSpent: log.timeSpent,
difficulty: log.difficulty,

View File

@@ -169,7 +169,7 @@ export default function ReviewPage() {
const currentProblem = currentDetail?.problem ?? null;
const currentPassage = currentProblem?.passage ?? null;
const currentProblemImageUrl = resolveUploadUrl(
currentProblem?.imageUrl ?? currentProblem?.pageImageUrl,
currentProblem?.imageUrl ?? currentProblem?.pageImageUrl ?? currentDetail?.imageUrl,
);
const currentPassageImageUrl = resolveUploadUrl(currentPassage?.imageUrl);
const ghostItems = queue?.slice(1, 3) ?? [];
@@ -616,7 +616,7 @@ export default function ReviewPage() {
</CardTitle>
<CardBody>
{currentProblem && (
{(currentProblem || currentProblemImageUrl) && (
<PromptBlock>
{currentPassage && (
<PromptPassageSection
@@ -631,20 +631,22 @@ export default function ReviewPage() {
}
/>
)}
<PromptImageButton
type="button"
onClick={() => setLightboxOpenFor(currentItem.id)}
aria-label={`${currentProblem.problemSet.subjectName} ${currentProblem.number}번 이미지 크게 보기`}
>
<PromptImageStage
imageUrl={currentProblemImageUrl}
alt={`${currentProblem.problemSet.subjectName} ${currentProblem.number}`}
/>
<PromptImageHint>
<Icon name="export" size={14} />
</PromptImageHint>
</PromptImageButton>
{currentProblemImageUrl && (
<PromptImageButton
type="button"
onClick={() => setLightboxOpenFor(currentItem.id)}
aria-label={`${currentProblem?.problemSet?.subjectName ?? '수학'} ${currentProblem?.number ?? ''} 이미지 크게 보기`}
>
<PromptImageStage
imageUrl={currentProblemImageUrl}
alt={`${currentProblem?.problemSet?.subjectName ?? '수학'} ${currentProblem?.number ?? ''}`}
/>
<PromptImageHint>
<Icon name="export" size={14} />
</PromptImageHint>
</PromptImageButton>
)}
</PromptBlock>
)}

View File

@@ -17,7 +17,7 @@ import {
Select,
Stack,
} from '@/components/ui/primitives';
import { api, type StudyResult, type Subject, type Tag } from '@/lib/api';
import { api, resolveUploadUrl, type StudyResult, type Subject, type Tag } from '@/lib/api';
import { theme } from '@/styles/theme';
interface ParsedProblem {
@@ -397,7 +397,7 @@ function ImportPdfBody() {
<ProblemNumber>{problem.number}</ProblemNumber>
<ProblemImageWrap>
<ProblemImage
src={problem.imageUrl}
src={resolveUploadUrl(problem.imageUrl) ?? problem.imageUrl}
alt={`${problem.number}번 문제`}
loading="lazy"
/>

View File

@@ -317,6 +317,7 @@ export interface StudyLogDetail {
result: StudyResult;
chosenAnswer: number | null;
correctAnswer: number | null;
imageUrl: string | null;
memo: string | null;
timeSpent: number | null;
difficulty: number;