From 7a271e2a216d96fe01808f2f83fb305ffcb442ff Mon Sep 17 00:00:00 2001 From: Oh YoungJe <139232765+GulSauce@users.noreply.github.com> Date: Sun, 18 Jan 2026 15:30:51 +0900 Subject: [PATCH 1/3] v 1.4.0 (#116) --- src/pages/MakeQuiz/ui/RecentChanges/index.jsx | 49 +++++++++++++++---- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/src/pages/MakeQuiz/ui/RecentChanges/index.jsx b/src/pages/MakeQuiz/ui/RecentChanges/index.jsx index 6854983..2484389 100644 --- a/src/pages/MakeQuiz/ui/RecentChanges/index.jsx +++ b/src/pages/MakeQuiz/ui/RecentChanges/index.jsx @@ -1,22 +1,51 @@ +import { useEffect, useState } from "react"; import { useTranslation } from "i18nexus"; +import axiosInstance from "#shared/api"; import "./index.css"; const RecentChanges = () => { const { t } = useTranslation(); + const [changes, setChanges] = useState([]); + + useEffect(() => { + const fetchUpdates = async () => { + try { + const res = await axiosInstance.get("/updateLog"); + + const data = res.data; + + setChanges(data.updateLogs || []); + } catch (err) { + console.error("변경사항 로드 실패:", err); + } + }; + + fetchUpdates(); + }, []); + + const formatDate = (isoString) => { + const date = new Date(isoString); + return new Intl.DateTimeFormat("ko-KR", { + timeZone: "Asia/Seoul", + year: "numeric", + month: "2-digit", + day: "2-digit", + }) + .format(date) + .replace(/\. /g, ".") + .replace(/\.$/, ""); + }; + return (

{t("최근 변경사항")}

); From 9034b0e8a140b704845de274befbdf55bec82869 Mon Sep 17 00:00:00 2001 From: Oh YoungJe <139232765+GulSauce@users.noreply.github.com> Date: Mon, 19 Jan 2026 04:45:44 +0900 Subject: [PATCH 2/3] v 1.4.1 (#118) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [ICC-55] 모바일 화면깨짐 조정정 * 미세조정정 * [ICC-60] 헤더 이미지, vite 이미지 교체 및 페이지 범위 설정 * [ICC-61] pdf 관련 코드 추가 * [ICC-59] 퀴즈 결과 페이지 디자인 수정 * [ICC-62] Quiz 만들 시 레벨 선택 가능 및 퀴즈 결과 페이지 수정 * google analytics 분석 기능 추가 * 도움말 페이지 및 그에 맞는 분석 기능 추가 * generation 페이지 사용자 지정 명세 수정 * [ICC-75] 구현 완료 * [ICC-75] 리베이스 머지 전 커밋 * [ICC-75] 파일 제한 안내 문구, 파일 크기 오류 메시지 추가 * [ICC-75] 파일 크기 제한을 전역변수로 * page지정 int 값으로 * 참조하는 데이터 변경 * 연락처 추가 * [ICC-82] 환경 설정 완료 * [ICC-82] 불필요 옵션 제거 * dialog보이기 및 footer 수정 * [ICC-82] 누락본 추가 * [ICC-84] 참조 페이지 추가 * 퀴즈 기록 로컬 스테이트를 통해 확인 * [ICC-83] dev_deploy.yml 작성 * [ICC-83] dev_deploy.yml 작성 * [ICC-83] 객체 삭제 후 커밋 * [ICC-83] 두번째 시도 * [ICC-83] 세번째 시도 * [ICC-83] 구현 완료 * [ICC-83] 수정 * [ICC-83] 네번째 시도 * [ICC-83] 다섯번째 시도 * [ICC-83] 구현완료 * [ICC-83] 구현완료 * 테스트 중 * modified: src/pages/MakeQuiz.jsx * test용용 * test2 * test22 * 테스트했던거 수정 * 선지박스 늘리기 및 글씨 간격, 파일 업로드 수정 * 검토부분 최종 수정 * 틀린문제 문제번호 박스 표시 * [ICC-91] history 페이지 개선 추가 * [ICC-90] 개선 완료 * [ICC-90] 통계 원위치 * [ICC-90] setProbelmId 복구 * [ICC-90] 퀴즈 기록 볼드체 * 오답만 보기 처리 기능 및 사용자 선지선택 안한거 처리 * [ICC-91] history 페이지 개선 추가 * 다이어로그로 사용자 문제 최종 점검 * 다이어로그로 사용자 문제 최종 점검 * 설문 다이어로그 주석처리 * [ICC-93] s3 url 에러 코드 추가 * [ICC-93] 에러 메세지 수정 * [ICC-93] 에러 메세지 수정 * [ICC-93] 수정사항 반영 * 도움말 페이지에 퀴즈 기록 설명 추가 및 퀴즈 기록에서 다시풀기 기능 추가, 퀴즈 기록페이지 이벤트 추적 추가 * 퀴즈기록만 틔는거 수정 * quiz select 변경 * 메세지 수정 * 확대기능 추가 * 상세해설보기 기능 추가 * 모바일 사이즈 수정 * MakeQuiz 버튼 text 수정정 * 스피너 돌고 명칭수정 * [ICC-102] css 스타일변경으로 공백출력하도록함 * 문제 난이도 -> 문제 단계 * [ICC-104] 링크 태그로 변경 완료 * [ICC-104] 푸터 조정 * [ICC-107] SEO 구성 완료 * [ICC-107] 구조 확정, 텍스트 수정 남음 * [ICC-105] 상세 해설 url 설정 * [ICC-107] 구조 작성, 텍스트 수정 중 * [ICC-107] 작성 완료 * [ICC-107] 파일 제한 수정 * [ICC-107] 파일 이름 변경 * [ICC-107] 기본값을 숨기기로 * [ICC-116] 퀴즈 히스토리 클래스명 수정 (#48) * [ICC-109] 개발용 S3 cicd (#50) * [ICC-109] 첫번째 시도 * [ICC-109] 구현 완료 * [ICC-113] 출처 url + OCR url * [ICC-113] 리팩터링 * [ICC-110] 작성 완료 * [ICC-110] 첫번째 시도 * [ICC-110] 구현 완료 * [ICC-110] github action에 로그인으로 수정 * [ICC-110] 두번째 시도 * [ICC-110] 세번째 시도 * [ICC-110] 네번째 시도 * [ICC-110] 네번째 시도 * [ICC-110] 다섯번째 시도 * [ICC-110] 여섯번째 시도 * [ICC-110] 일곱번째 시도 * [ICC-110] 여덟번째 시도 * [ICC-110] 아홉번째 시도 * [ICC-110] 열번째 시도 * [ICC-110] 열한번째 시도 * [ICC-110] 열두번째 시도 * [ICC-110] 열세번째 시도 * [ICC-110] 열네번째 시도 * [ICC-110] 구현 완료 * [ICC-110] 코드 1번 연속 테스트 1 * [ICC-110] 코드 1번 연속 테스트 2 * [ICC-110] 재시도 * [ICC-110] S3 업로드만 테스트 * [ICC-110] Cloudfront 초기화도 같이 * [ICC-110] S3 업로드만 테스트 * [ICC-110] S3 업로드만 테스트 * [ICC-110] echo로 확인 * [ICC-110] code 1 S3 상태 확인 * [ICC-110] 재확인 * [ICC-110] 구현완료 * [ICC-121] 첫번째 시도 * [ICC-121] 첫번째 시도 * [ICC-121 두번째 시도 * [ICC-121 세번째 시도 * [ICC-121] 네번째 시도 * [ICC-121] 테스트가 끝났으니 올바른 브랜치명으로 복원 * [ICC-120] 커서로 로우 데이터 완성, 수정 시작 * [ICC-120] MakeQuiz 로드되면 애널리틱스가 트래킹하게 수정 * [ICC-120] package.json 수정 * [ICC-120] 동적 사이트맵 생성 코드 제거 * [ICC-120] robots.txt 변경 * [ICC-120] 여러 아이콘 이미지 도입 * [ICC_120] 전부 헤드 태그로 이전 * [ICC-120] helmet을 사용하지 않으므로 다시 리액트 업그레이드 * [ICC-120] ppt 허용 * [ICC-120] 수정 * [ICC-124] CICD 수정: * [ICC-124] 첫번째 시도 * [ICC-124] 브랜치 이름 복원 * [ICC-125] 발견된 문제점들 수정 * [ICC-127] 디자인 변경 완료 * [ICC-127] 태그 타입 수정 * [ICC-127] 코드 작성 완료 * [ICC-115] OX API 구현 완료 * [ICC-126] 지연 로딩 * [ICC-126] 2.5초에 50페이지 * [ICC-126] 공통 값 변수화 * [ICC-126] 백그라운드 이미지 추가 * [ICC-126] 사진 추가 * [ICC-126] 지연 로딩 * [ICC-126] 2.5초에 50페이지 * [ICC-126] 공통 값 변수화 * [ICC-126] 백그라운드 이미지 추가 * [ICC-126] 사진 추가 * [ICC-126] background 변경 * [ICC-126] conflicts 해결 * [ICC-126] background 삭제 * [ICC-126] background 추가 * [ICC-131] 이미지 변경 완료 * [ICC-131] 위치 조정 완료 * [ICC-157] 2차 배포전 프론트 변경 * [ICC-157] 내부 파일로 변경 * [ICC-158] 중간 저장 * [ICC-158] 768px 미만 버튼 배열 방식 변경 * [ICC-158] 도움말 버튼 위치 이동 * [ICC-158] 언어 버튼 추가 * [ICC-158] 변경 완료 * [ICC-162] 문제 유형, 난이도 통일 * [ICC-162] 기본값 수정 * [ICC-162] 유형배치, 설명 변경 * [ICC-161] 퀴즈 풀이 영역 개선 * [ICC-161] 해설보기 화면 조정 중 * [ICC-161] 중복 스타일 제거 * [ICC-161] 해설 스타일 변경 완료 * [ICC-161] 해설 스타일 변경 완료 * [ICC-161] 다국어 번역 추가 * v 1.3.0 (#81) * first commit * Delete .env * s3 url 받아오기기 * docker작업 * 안푼 문제 있을 시 번호 생성 및 이동 * solvequiz 화면 수정 및 quizresult화면 * modified: .gitignore modified: src/pages/MakeQuiz.css modified: src/pages/MakeQuiz.jsx * Delete FastAPI directory * Delete docker-compose.yml * 문제 button 배치 수정 * 필요한 모든 화면 작업 * className 수정정 * [ICC-54] 구현 완료 * [ICC-54] 참조 환경 변수 이름 변경 * [ICC-55] 모바일 화면깨짐 조정정 * 미세조정정 * [ICC-60] 헤더 이미지, vite 이미지 교체 및 페이지 범위 설정 * [ICC-61] pdf 관련 코드 추가 * [ICC-59] 퀴즈 결과 페이지 디자인 수정 * [ICC-62] Quiz 만들 시 레벨 선택 가능 및 퀴즈 결과 페이지 수정 * google analytics 분석 기능 추가 * 도움말 페이지 및 그에 맞는 분석 기능 추가 * generation 페이지 사용자 지정 명세 수정 * [ICC-75] 구현 완료 * [ICC-75] 리베이스 머지 전 커밋 * [ICC-75] 파일 제한 안내 문구, 파일 크기 오류 메시지 추가 * [ICC-75] 파일 크기 제한을 전역변수로 * page지정 int 값으로 * 참조하는 데이터 변경 * 연락처 추가 * [ICC-82] 환경 설정 완료 * [ICC-82] 불필요 옵션 제거 * dialog보이기 및 footer 수정 * [ICC-82] 누락본 추가 * [ICC-84] 참조 페이지 추가 * 퀴즈 기록 로컬 스테이트를 통해 확인 * [ICC-83] dev_deploy.yml 작성 * [ICC-83] dev_deploy.yml 작성 * [ICC-83] 객체 삭제 후 커밋 * [ICC-83] 두번째 시도 * [ICC-83] 세번째 시도 * [ICC-83] 구현 완료 * [ICC-83] 수정 * [ICC-83] 네번째 시도 * [ICC-83] 다섯번째 시도 * [ICC-83] 구현완료 * [ICC-83] 구현완료 * 테스트 중 * modified: src/pages/MakeQuiz.jsx * test용용 * test2 * test22 * 테스트했던거 수정 * 선지박스 늘리기 및 글씨 간격, 파일 업로드 수정 * 검토부분 최종 수정 * 틀린문제 문제번호 박스 표시 * [ICC-91] history 페이지 개선 추가 * [ICC-90] 개선 완료 * [ICC-90] 통계 원위치 * [ICC-90] setProbelmId 복구 * [ICC-90] 퀴즈 기록 볼드체 * 오답만 보기 처리 기능 및 사용자 선지선택 안한거 처리 * [ICC-91] history 페이지 개선 추가 * 다이어로그로 사용자 문제 최종 점검 * 다이어로그로 사용자 문제 최종 점검 * 설문 다이어로그 주석처리 * [ICC-93] s3 url 에러 코드 추가 * [ICC-93] 에러 메세지 수정 * [ICC-93] 에러 메세지 수정 * [ICC-93] 수정사항 반영 * 도움말 페이지에 퀴즈 기록 설명 추가 및 퀴즈 기록에서 다시풀기 기능 추가, 퀴즈 기록페이지 이벤트 추적 추가 * 퀴즈기록만 틔는거 수정 * quiz select 변경 * 메세지 수정 * 확대기능 추가 * 상세해설보기 기능 추가 * 모바일 사이즈 수정 * MakeQuiz 버튼 text 수정정 * 스피너 돌고 명칭수정 * [ICC-102] css 스타일변경으로 공백출력하도록함 * 문제 난이도 -> 문제 단계 * [ICC-104] 링크 태그로 변경 완료 * [ICC-104] 푸터 조정 * [ICC-107] SEO 구성 완료 * [ICC-107] 구조 확정, 텍스트 수정 남음 * [ICC-105] 상세 해설 url 설정 * [ICC-107] 구조 작성, 텍스트 수정 중 * [ICC-107] 작성 완료 * [ICC-107] 파일 제한 수정 * [ICC-107] 파일 이름 변경 * [ICC-107] 기본값을 숨기기로 * [ICC-116] 퀴즈 히스토리 클래스명 수정 (#48) * [ICC-109] 개발용 S3 cicd (#50) * [ICC-109] 첫번째 시도 * [ICC-109] 구현 완료 * [ICC-113] 출처 url + OCR url * [ICC-113] 리팩터링 * [ICC-110] 작성 완료 * [ICC-110] 첫번째 시도 * [ICC-110] 구현 완료 * [ICC-110] github action에 로그인으로 수정 * [ICC-110] 두번째 시도 * [ICC-110] 세번째 시도 * [ICC-110] 네번째 시도 * [ICC-110] 네번째 시도 * [ICC-110] 다섯번째 시도 * [ICC-110] 여섯번째 시도 * [ICC-110] 일곱번째 시도 * [ICC-110] 여덟번째 시도 * [ICC-110] 아홉번째 시도 * [ICC-110] 열번째 시도 * [ICC-110] 열한번째 시도 * [ICC-110] 열두번째 시도 * [ICC-110] 열세번째 시도 * [ICC-110] 열네번째 시도 * [ICC-110] 구현 완료 * [ICC-110] 코드 1번 연속 테스트 1 * [ICC-110] 코드 1번 연속 테스트 2 * [ICC-110] 재시도 * [ICC-110] S3 업로드만 테스트 * [ICC-110] Cloudfront 초기화도 같이 * [ICC-110] S3 업로드만 테스트 * [ICC-110] S3 업로드만 테스트 * [ICC-110] echo로 확인 * [ICC-110] code 1 S3 상태 확인 * [ICC-110] 재확인 * [ICC-110] 구현완료 * [ICC-121] 첫번째 시도 * [ICC-121] 첫번째 시도 * [ICC-121 두번째 시도 * [ICC-121 세번째 시도 * [ICC-121] 네번째 시도 * [ICC-121] 테스트가 끝났으니 올바른 브랜치명으로 복원 * [ICC-120] 커서로 로우 데이터 완성, 수정 시작 * [ICC-120] MakeQuiz 로드되면 애널리틱스가 트래킹하게 수정 * [ICC-120] package.json 수정 * [ICC-120] 동적 사이트맵 생성 코드 제거 * [ICC-120] robots.txt 변경 * [ICC-120] 여러 아이콘 이미지 도입 * [ICC_120] 전부 헤드 태그로 이전 * [ICC-120] helmet을 사용하지 않으므로 다시 리액트 업그레이드 * [ICC-120] ppt 허용 * [ICC-120] 수정 * [ICC-124] CICD 수정: * [ICC-124] 첫번째 시도 * [ICC-124] 브랜치 이름 복원 * [ICC-125] 발견된 문제점들 수정 * [ICC-127] 디자인 변경 완료 * [ICC-127] 태그 타입 수정 * [ICC-127] 코드 작성 완료 * [ICC-115] OX API 구현 완료 * [ICC-126] 지연 로딩 * [ICC-126] 2.5초에 50페이지 * [ICC-126] 공통 값 변수화 * [ICC-126] 백그라운드 이미지 추가 * [ICC-126] 사진 추가 * [ICC-126] 지연 로딩 * [ICC-126] 2.5초에 50페이지 * [ICC-126] 공통 값 변수화 * [ICC-126] 백그라운드 이미지 추가 * [ICC-126] 사진 추가 * [ICC-126] background 변경 * [ICC-126] conflicts 해결 * [ICC-126] background 삭제 * [ICC-126] background 추가 * [ICC-131] 이미지 변경 완료 * [ICC-131] 위치 조정 완료 * [ICC-157] 2차 배포전 프론트 변경 * [ICC-157] 내부 파일로 변경 * [ICC-158] 중간 저장 * [ICC-158] 768px 미만 버튼 배열 방식 변경 * [ICC-158] 도움말 버튼 위치 이동 * [ICC-158] 언어 버튼 추가 * [ICC-158] 변경 완료 * [ICC-162] 문제 유형, 난이도 통일 * [ICC-162] 기본값 수정 * [ICC-162] 유형배치, 설명 변경 * [ICC-161] 퀴즈 풀이 영역 개선 * [ICC-161] 해설보기 화면 조정 중 * [ICC-161] 중복 스타일 제거 * [ICC-161] 해설 스타일 변경 완료 * [ICC-161] 해설 스타일 변경 완료 * [ICC-161] 다국어 번역 추가 --------- Co-authored-by: jaewon Co-authored-by: nech1234 <145868124+nech1234@users.noreply.github.com> Co-authored-by: lhoju0158 Co-authored-by: 이찬우 <105221020+ChanJinYeon@users.noreply.github.com> * [ICC-165] 작성완료 * v 1.3.1 (#83) * first commit * Delete .env * s3 url 받아오기기 * docker작업 * 안푼 문제 있을 시 번호 생성 및 이동 * solvequiz 화면 수정 및 quizresult화면 * modified: .gitignore modified: src/pages/MakeQuiz.css modified: src/pages/MakeQuiz.jsx * Delete FastAPI directory * Delete docker-compose.yml * 문제 button 배치 수정 * 필요한 모든 화면 작업 * className 수정정 * [ICC-54] 구현 완료 * [ICC-54] 참조 환경 변수 이름 변경 * [ICC-55] 모바일 화면깨짐 조정정 * 미세조정정 * [ICC-60] 헤더 이미지, vite 이미지 교체 및 페이지 범위 설정 * [ICC-61] pdf 관련 코드 추가 * [ICC-59] 퀴즈 결과 페이지 디자인 수정 * [ICC-62] Quiz 만들 시 레벨 선택 가능 및 퀴즈 결과 페이지 수정 * google analytics 분석 기능 추가 * 도움말 페이지 및 그에 맞는 분석 기능 추가 * generation 페이지 사용자 지정 명세 수정 * [ICC-75] 구현 완료 * [ICC-75] 리베이스 머지 전 커밋 * [ICC-75] 파일 제한 안내 문구, 파일 크기 오류 메시지 추가 * [ICC-75] 파일 크기 제한을 전역변수로 * page지정 int 값으로 * 참조하는 데이터 변경 * 연락처 추가 * [ICC-82] 환경 설정 완료 * [ICC-82] 불필요 옵션 제거 * dialog보이기 및 footer 수정 * [ICC-82] 누락본 추가 * [ICC-84] 참조 페이지 추가 * 퀴즈 기록 로컬 스테이트를 통해 확인 * [ICC-83] dev_deploy.yml 작성 * [ICC-83] dev_deploy.yml 작성 * [ICC-83] 객체 삭제 후 커밋 * [ICC-83] 두번째 시도 * [ICC-83] 세번째 시도 * [ICC-83] 구현 완료 * [ICC-83] 수정 * [ICC-83] 네번째 시도 * [ICC-83] 다섯번째 시도 * [ICC-83] 구현완료 * [ICC-83] 구현완료 * 테스트 중 * modified: src/pages/MakeQuiz.jsx * test용용 * test2 * test22 * 테스트했던거 수정 * 선지박스 늘리기 및 글씨 간격, 파일 업로드 수정 * 검토부분 최종 수정 * 틀린문제 문제번호 박스 표시 * [ICC-91] history 페이지 개선 추가 * [ICC-90] 개선 완료 * [ICC-90] 통계 원위치 * [ICC-90] setProbelmId 복구 * [ICC-90] 퀴즈 기록 볼드체 * 오답만 보기 처리 기능 및 사용자 선지선택 안한거 처리 * [ICC-91] history 페이지 개선 추가 * 다이어로그로 사용자 문제 최종 점검 * 다이어로그로 사용자 문제 최종 점검 * 설문 다이어로그 주석처리 * [ICC-93] s3 url 에러 코드 추가 * [ICC-93] 에러 메세지 수정 * [ICC-93] 에러 메세지 수정 * [ICC-93] 수정사항 반영 * 도움말 페이지에 퀴즈 기록 설명 추가 및 퀴즈 기록에서 다시풀기 기능 추가, 퀴즈 기록페이지 이벤트 추적 추가 * 퀴즈기록만 틔는거 수정 * quiz select 변경 * 메세지 수정 * 확대기능 추가 * 상세해설보기 기능 추가 * 모바일 사이즈 수정 * MakeQuiz 버튼 text 수정정 * 스피너 돌고 명칭수정 * [ICC-102] css 스타일변경으로 공백출력하도록함 * 문제 난이도 -> 문제 단계 * [ICC-104] 링크 태그로 변경 완료 * [ICC-104] 푸터 조정 * [ICC-107] SEO 구성 완료 * [ICC-107] 구조 확정, 텍스트 수정 남음 * [ICC-105] 상세 해설 url 설정 * [ICC-107] 구조 작성, 텍스트 수정 중 * [ICC-107] 작성 완료 * [ICC-107] 파일 제한 수정 * [ICC-107] 파일 이름 변경 * [ICC-107] 기본값을 숨기기로 * [ICC-116] 퀴즈 히스토리 클래스명 수정 (#48) * [ICC-109] 개발용 S3 cicd (#50) * [ICC-109] 첫번째 시도 * [ICC-109] 구현 완료 * [ICC-113] 출처 url + OCR url * [ICC-113] 리팩터링 * [ICC-110] 작성 완료 * [ICC-110] 첫번째 시도 * [ICC-110] 구현 완료 * [ICC-110] github action에 로그인으로 수정 * [ICC-110] 두번째 시도 * [ICC-110] 세번째 시도 * [ICC-110] 네번째 시도 * [ICC-110] 네번째 시도 * [ICC-110] 다섯번째 시도 * [ICC-110] 여섯번째 시도 * [ICC-110] 일곱번째 시도 * [ICC-110] 여덟번째 시도 * [ICC-110] 아홉번째 시도 * [ICC-110] 열번째 시도 * [ICC-110] 열한번째 시도 * [ICC-110] 열두번째 시도 * [ICC-110] 열세번째 시도 * [ICC-110] 열네번째 시도 * [ICC-110] 구현 완료 * [ICC-110] 코드 1번 연속 테스트 1 * [ICC-110] 코드 1번 연속 테스트 2 * [ICC-110] 재시도 * [ICC-110] S3 업로드만 테스트 * [ICC-110] Cloudfront 초기화도 같이 * [ICC-110] S3 업로드만 테스트 * [ICC-110] S3 업로드만 테스트 * [ICC-110] echo로 확인 * [ICC-110] code 1 S3 상태 확인 * [ICC-110] 재확인 * [ICC-110] 구현완료 * [ICC-121] 첫번째 시도 * [ICC-121] 첫번째 시도 * [ICC-121 두번째 시도 * [ICC-121 세번째 시도 * [ICC-121] 네번째 시도 * [ICC-121] 테스트가 끝났으니 올바른 브랜치명으로 복원 * [ICC-120] 커서로 로우 데이터 완성, 수정 시작 * [ICC-120] MakeQuiz 로드되면 애널리틱스가 트래킹하게 수정 * [ICC-120] package.json 수정 * [ICC-120] 동적 사이트맵 생성 코드 제거 * [ICC-120] robots.txt 변경 * [ICC-120] 여러 아이콘 이미지 도입 * [ICC_120] 전부 헤드 태그로 이전 * [ICC-120] helmet을 사용하지 않으므로 다시 리액트 업그레이드 * [ICC-120] ppt 허용 * [ICC-120] 수정 * [ICC-124] CICD 수정: * [ICC-124] 첫번째 시도 * [ICC-124] 브랜치 이름 복원 * [ICC-125] 발견된 문제점들 수정 * [ICC-127] 디자인 변경 완료 * [ICC-127] 태그 타입 수정 * [ICC-127] 코드 작성 완료 * [ICC-115] OX API 구현 완료 * [ICC-126] 지연 로딩 * [ICC-126] 2.5초에 50페이지 * [ICC-126] 공통 값 변수화 * [ICC-126] 백그라운드 이미지 추가 * [ICC-126] 사진 추가 * [ICC-126] 지연 로딩 * [ICC-126] 2.5초에 50페이지 * [ICC-126] 공통 값 변수화 * [ICC-126] 백그라운드 이미지 추가 * [ICC-126] 사진 추가 * [ICC-126] background 변경 * [ICC-126] conflicts 해결 * [ICC-126] background 삭제 * [ICC-126] background 추가 * [ICC-131] 이미지 변경 완료 * [ICC-131] 위치 조정 완료 * [ICC-157] 2차 배포전 프론트 변경 * [ICC-157] 내부 파일로 변경 * [ICC-158] 중간 저장 * [ICC-158] 768px 미만 버튼 배열 방식 변경 * [ICC-158] 도움말 버튼 위치 이동 * [ICC-158] 언어 버튼 추가 * [ICC-158] 변경 완료 * [ICC-162] 문제 유형, 난이도 통일 * [ICC-162] 기본값 수정 * [ICC-162] 유형배치, 설명 변경 * [ICC-161] 퀴즈 풀이 영역 개선 * [ICC-161] 해설보기 화면 조정 중 * [ICC-161] 중복 스타일 제거 * [ICC-161] 해설 스타일 변경 완료 * [ICC-161] 해설 스타일 변경 완료 * [ICC-161] 다국어 번역 추가 * [ICC-165] 작성완료 --------- Co-authored-by: jaewon Co-authored-by: nech1234 <145868124+nech1234@users.noreply.github.com> Co-authored-by: lhoju0158 Co-authored-by: 이찬우 <105221020+ChanJinYeon@users.noreply.github.com> * [ICC-161] 불필요한 패딩옵션 제거, 옵션 축소 0 * v 1.3.2 (#85) * first commit * Delete .env * s3 url 받아오기기 * docker작업 * 안푼 문제 있을 시 번호 생성 및 이동 * solvequiz 화면 수정 및 quizresult화면 * modified: .gitignore modified: src/pages/MakeQuiz.css modified: src/pages/MakeQuiz.jsx * Delete FastAPI directory * Delete docker-compose.yml * 문제 button 배치 수정 * 필요한 모든 화면 작업 * className 수정정 * [ICC-54] 구현 완료 * [ICC-54] 참조 환경 변수 이름 변경 * [ICC-55] 모바일 화면깨짐 조정정 * 미세조정정 * [ICC-60] 헤더 이미지, vite 이미지 교체 및 페이지 범위 설정 * [ICC-61] pdf 관련 코드 추가 * [ICC-59] 퀴즈 결과 페이지 디자인 수정 * [ICC-62] Quiz 만들 시 레벨 선택 가능 및 퀴즈 결과 페이지 수정 * google analytics 분석 기능 추가 * 도움말 페이지 및 그에 맞는 분석 기능 추가 * generation 페이지 사용자 지정 명세 수정 * [ICC-75] 구현 완료 * [ICC-75] 리베이스 머지 전 커밋 * [ICC-75] 파일 제한 안내 문구, 파일 크기 오류 메시지 추가 * [ICC-75] 파일 크기 제한을 전역변수로 * page지정 int 값으로 * 참조하는 데이터 변경 * 연락처 추가 * [ICC-82] 환경 설정 완료 * [ICC-82] 불필요 옵션 제거 * dialog보이기 및 footer 수정 * [ICC-82] 누락본 추가 * [ICC-84] 참조 페이지 추가 * 퀴즈 기록 로컬 스테이트를 통해 확인 * [ICC-83] dev_deploy.yml 작성 * [ICC-83] dev_deploy.yml 작성 * [ICC-83] 객체 삭제 후 커밋 * [ICC-83] 두번째 시도 * [ICC-83] 세번째 시도 * [ICC-83] 구현 완료 * [ICC-83] 수정 * [ICC-83] 네번째 시도 * [ICC-83] 다섯번째 시도 * [ICC-83] 구현완료 * [ICC-83] 구현완료 * 테스트 중 * modified: src/pages/MakeQuiz.jsx * test용용 * test2 * test22 * 테스트했던거 수정 * 선지박스 늘리기 및 글씨 간격, 파일 업로드 수정 * 검토부분 최종 수정 * 틀린문제 문제번호 박스 표시 * [ICC-91] history 페이지 개선 추가 * [ICC-90] 개선 완료 * [ICC-90] 통계 원위치 * [ICC-90] setProbelmId 복구 * [ICC-90] 퀴즈 기록 볼드체 * 오답만 보기 처리 기능 및 사용자 선지선택 안한거 처리 * [ICC-91] history 페이지 개선 추가 * 다이어로그로 사용자 문제 최종 점검 * 다이어로그로 사용자 문제 최종 점검 * 설문 다이어로그 주석처리 * [ICC-93] s3 url 에러 코드 추가 * [ICC-93] 에러 메세지 수정 * [ICC-93] 에러 메세지 수정 * [ICC-93] 수정사항 반영 * 도움말 페이지에 퀴즈 기록 설명 추가 및 퀴즈 기록에서 다시풀기 기능 추가, 퀴즈 기록페이지 이벤트 추적 추가 * 퀴즈기록만 틔는거 수정 * quiz select 변경 * 메세지 수정 * 확대기능 추가 * 상세해설보기 기능 추가 * 모바일 사이즈 수정 * MakeQuiz 버튼 text 수정정 * 스피너 돌고 명칭수정 * [ICC-102] css 스타일변경으로 공백출력하도록함 * 문제 난이도 -> 문제 단계 * [ICC-104] 링크 태그로 변경 완료 * [ICC-104] 푸터 조정 * [ICC-107] SEO 구성 완료 * [ICC-107] 구조 확정, 텍스트 수정 남음 * [ICC-105] 상세 해설 url 설정 * [ICC-107] 구조 작성, 텍스트 수정 중 * [ICC-107] 작성 완료 * [ICC-107] 파일 제한 수정 * [ICC-107] 파일 이름 변경 * [ICC-107] 기본값을 숨기기로 * [ICC-116] 퀴즈 히스토리 클래스명 수정 (#48) * [ICC-109] 개발용 S3 cicd (#50) * [ICC-109] 첫번째 시도 * [ICC-109] 구현 완료 * [ICC-113] 출처 url + OCR url * [ICC-113] 리팩터링 * [ICC-110] 작성 완료 * [ICC-110] 첫번째 시도 * [ICC-110] 구현 완료 * [ICC-110] github action에 로그인으로 수정 * [ICC-110] 두번째 시도 * [ICC-110] 세번째 시도 * [ICC-110] 네번째 시도 * [ICC-110] 네번째 시도 * [ICC-110] 다섯번째 시도 * [ICC-110] 여섯번째 시도 * [ICC-110] 일곱번째 시도 * [ICC-110] 여덟번째 시도 * [ICC-110] 아홉번째 시도 * [ICC-110] 열번째 시도 * [ICC-110] 열한번째 시도 * [ICC-110] 열두번째 시도 * [ICC-110] 열세번째 시도 * [ICC-110] 열네번째 시도 * [ICC-110] 구현 완료 * [ICC-110] 코드 1번 연속 테스트 1 * [ICC-110] 코드 1번 연속 테스트 2 * [ICC-110] 재시도 * [ICC-110] S3 업로드만 테스트 * [ICC-110] Cloudfront 초기화도 같이 * [ICC-110] S3 업로드만 테스트 * [ICC-110] S3 업로드만 테스트 * [ICC-110] echo로 확인 * [ICC-110] code 1 S3 상태 확인 * [ICC-110] 재확인 * [ICC-110] 구현완료 * [ICC-121] 첫번째 시도 * [ICC-121] 첫번째 시도 * [ICC-121 두번째 시도 * [ICC-121 세번째 시도 * [ICC-121] 네번째 시도 * [ICC-121] 테스트가 끝났으니 올바른 브랜치명으로 복원 * [ICC-120] 커서로 로우 데이터 완성, 수정 시작 * [ICC-120] MakeQuiz 로드되면 애널리틱스가 트래킹하게 수정 * [ICC-120] package.json 수정 * [ICC-120] 동적 사이트맵 생성 코드 제거 * [ICC-120] robots.txt 변경 * [ICC-120] 여러 아이콘 이미지 도입 * [ICC_120] 전부 헤드 태그로 이전 * [ICC-120] helmet을 사용하지 않으므로 다시 리액트 업그레이드 * [ICC-120] ppt 허용 * [ICC-120] 수정 * [ICC-124] CICD 수정: * [ICC-124] 첫번째 시도 * [ICC-124] 브랜치 이름 복원 * [ICC-125] 발견된 문제점들 수정 * [ICC-127] 디자인 변경 완료 * [ICC-127] 태그 타입 수정 * [ICC-127] 코드 작성 완료 * [ICC-115] OX API 구현 완료 * [ICC-126] 지연 로딩 * [ICC-126] 2.5초에 50페이지 * [ICC-126] 공통 값 변수화 * [ICC-126] 백그라운드 이미지 추가 * [ICC-126] 사진 추가 * [ICC-126] 지연 로딩 * [ICC-126] 2.5초에 50페이지 * [ICC-126] 공통 값 변수화 * [ICC-126] 백그라운드 이미지 추가 * [ICC-126] 사진 추가 * [ICC-126] background 변경 * [ICC-126] conflicts 해결 * [ICC-126] background 삭제 * [ICC-126] background 추가 * [ICC-131] 이미지 변경 완료 * [ICC-131] 위치 조정 완료 * [ICC-157] 2차 배포전 프론트 변경 * [ICC-157] 내부 파일로 변경 * [ICC-158] 중간 저장 * [ICC-158] 768px 미만 버튼 배열 방식 변경 * [ICC-158] 도움말 버튼 위치 이동 * [ICC-158] 언어 버튼 추가 * [ICC-158] 변경 완료 * [ICC-162] 문제 유형, 난이도 통일 * [ICC-162] 기본값 수정 * [ICC-162] 유형배치, 설명 변경 * [ICC-161] 퀴즈 풀이 영역 개선 * [ICC-161] 해설보기 화면 조정 중 * [ICC-161] 중복 스타일 제거 * [ICC-161] 해설 스타일 변경 완료 * [ICC-161] 해설 스타일 변경 완료 * [ICC-161] 다국어 번역 추가 * [ICC-165] 작성완료 * [ICC-161] 불필요한 패딩옵션 제거, 옵션 축소 0 --------- Co-authored-by: jaewon Co-authored-by: nech1234 <145868124+nech1234@users.noreply.github.com> Co-authored-by: lhoju0158 Co-authored-by: 이찬우 <105221020+ChanJinYeon@users.noreply.github.com> * [ICC-166] 식별된 문제 해결 * v 1.3.3 (#87) * [ICC-166] 식별된 문제해결 * v 1.4.4 (#89) * [ICC-166] 퀴즈 기록 너비 변경 (#90) * v 1.3.5 (#91) * [ICC-166] 내용 변경 * [ICC-166] 번역 추가 * [ICC-166] 디자인 변경 (#94) * [ICC-166] 오답만보기시 참조페이지 버그 수정 * [ICC-166] 오답만 보기 시 참조페이지 버그 수정 (#99) * [ICC-166] 선택 타입 저장 * [ICC-166] 문구 추가 (#103) * [ICC-166] 문구 추가 * [ICC-166] 문구 추가 * [ICC-203] 첫번째 시도 * [ICC-203] 첫번째 시도 * [ICC-203] 첫번째 시도 * [ICC-203] 세번번째 시도 * [ICC-203] 세번번째 시도 * [ICC-203] 브랜치명 롤백 * [ICC-203] 다섯번째 시도 * 여섯번째 시도 * [ICC-203] 브랜치명 롤백 * [ICC-207] 페이지 150페이지로 상향, 최근 변경 사항 컴포넌트 추가 * [ICC-213] 안내 문구 추가 * [ICC-206] 최신 반영 사항 수정 * [ICC-255] 구현 완료 --------- Co-authored-by: nech1234 <145868124+nech1234@users.noreply.github.com> Co-authored-by: jaewon Co-authored-by: lhoju0158 Co-authored-by: 이찬우 <105221020+ChanJinYeon@users.noreply.github.com> --- src/pages/MakeQuiz/index.jsx | 36 +++++++++++++-------- src/pages/MakeQuiz/util/fileUploader.js | 43 +++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 14 deletions(-) create mode 100644 src/pages/MakeQuiz/util/fileUploader.js diff --git a/src/pages/MakeQuiz/index.jsx b/src/pages/MakeQuiz/index.jsx index 1deb6f2..7ab5001 100644 --- a/src/pages/MakeQuiz/index.jsx +++ b/src/pages/MakeQuiz/index.jsx @@ -12,19 +12,25 @@ import "react-pdf/dist/Page/TextLayer.css"; import { useNavigate } from "react-router-dom"; import "./index.css"; import { OcrButton, RecentChanges } from "./ui"; +import { uploadFileToServer } from "./util/fileUploader"; const levelDescriptions = { RECALL: `순수 암기나 단순 이해를 묻는 문제 - 예) "명제의 _______는 모든 가능한 경우에서 항상 참(True)이 되는 명제를 의미한다."`, + 예) "대한민국의 수도는 _______이다."`, SKILLS: `옳고 그름을 판별하는 문제 - 예) "명제 p → q의 대우(contrapositive)와 역(converse)이 모두 참일 때, 반드시 원래의 명제 p → q도 참이 된다." (O/X)`, + 예) "지구는 태양 주위를 돈다. (O/X)"`, STRATEGIC: `추론, 문제 해결, 자료 해석을 요구하는 문제 - 예) "교수님이 학생들에게 기말고사에서 100점을 받으면 A를 주겠다"라고 약속했습니다. 다음 중 이 논리적 함의(p → q)가 거짓(False)이 되는 경우는?"`, + 예) [전제] 물가가 오르면 화폐 가치는 떨어진다. 현재 물가가 급등했다. + [질문] 이 경우 화폐 가치의 변화로 가장 적절한 것은? + 1. 하락한다 + 2. 상승한다 + 3. 변함없다 + 4. 알 수 없다`, }; const MAX_FILE_SIZE = 30 * 1024 * 1024; @@ -87,15 +93,7 @@ const MakeQuiz = () => { [] ); - async function uploadFileToServer(file) { - const formData = new FormData(); - // 백엔드 @RequestPart("file") 과 동일한 키 - formData.append("file", file); - const res = await axiosInstance.post(`/s3/upload`, formData, { - isMultipart: true, - }); - return res.data; - } + // questionType 변경 시 quizLevel 자동으로 변경 및 localStorage에 저장 useEffect(() => { setQuizLevel(levelMapping[questionType]); @@ -178,7 +176,7 @@ const MakeQuiz = () => { setFileExtension(ext); setIsProcessing(true); try { - const { uploadedUrl } = await uploadFileToServer(f); + const uploadedUrl = await uploadFileToServer(f); setUploadedUrl(uploadedUrl); setFile(f); @@ -190,7 +188,17 @@ const MakeQuiz = () => { if (uploadTimerRef.current) { uploadTimerRef.current.stop(); } - throw error; + + const message = + error?.message === "변환 시간 초과" + ? t("파일 변환이 지연되고 있어요. 잠시 후 다시 시도해주세요.") + : error?.response?.data?.message || + error?.message || + t("파일 업로드 중 오류가 발생했습니다. 다시 시도해주세요."); + + CustomToast.error(message); + console.error("파일 업로드 실패:", error); + return; } finally { setFileExtension(null); setIsProcessing(false); diff --git a/src/pages/MakeQuiz/util/fileUploader.js b/src/pages/MakeQuiz/util/fileUploader.js new file mode 100644 index 0000000..e12abeb --- /dev/null +++ b/src/pages/MakeQuiz/util/fileUploader.js @@ -0,0 +1,43 @@ +import axiosInstance from "#shared/api"; + +export async function uploadFileToServer(file) { + const initResponse = await axiosInstance.post("/s3/request-presign", { + originalFileName: file.name, + contentType: file.type, + fileSize: file.size, + }); + + const { uploadUrl, finalUrl, isPdf } = initResponse.data; + + const encodedFileName = encodeURIComponent(file.name); + + await axiosInstance.put(uploadUrl, file, { + headers: { + "Content-Type": file.type, + "x-amz-meta-original-filename": encodedFileName, + }, + }); + + if (!isPdf) { + await pollForFile(finalUrl); + } + + return finalUrl; +} + +// --------------------------------------------------------- +// Helper: DB 없이 파일 생성 여부 확인하기 (S3 직접 조회) +// --------------------------------------------------------- +async function pollForFile(url, timeout = 60000) { + const startTime = Date.now(); + + const encodedUrl = encodeURIComponent(url); + while (Date.now() - startTime < timeout) { + const res = await axiosInstance.get(`/s3/check-file-exist?url=${encodedUrl}`); + if (res.data.status === "EXIST") { + return true; + } + await new Promise((resolve) => setTimeout(resolve, 2000)); + } + throw new Error("변환 시간 초과"); +} \ No newline at end of file From 2a4b8ea137c41e9b8a5a4eb669ed5dc92d3dcaa3 Mon Sep 17 00:00:00 2001 From: Oh YoungJe <139232765+GulSauce@users.noreply.github.com> Date: Thu, 22 Jan 2026 00:21:00 +0900 Subject: [PATCH 3/3] v 1.5.0 (#120) --- src/App.jsx | 2 +- src/index.css | 42 +++++++++++++++++++++++++++++++++++---- src/shared/toast/index.js | 2 +- 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index 3cdff47..be0c3f4 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -63,7 +63,7 @@ const App = () => { - + } /> } /> diff --git a/src/index.css b/src/index.css index 39664f0..7687e96 100644 --- a/src/index.css +++ b/src/index.css @@ -1,7 +1,41 @@ -div { - white-space: pre-line; +@font-face { + font-family: 'Pretendard'; + src: url('/fonts/Pretendard-Regular.otf') format('opentype'); + font-weight: 400; + font-style: normal; + font-display: swap; } -p { - white-space: pre-line; +@font-face { + font-family: 'Pretendard'; + src: url('/fonts/Pretendard-Medium.otf') format('opentype'); + font-weight: 500; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Pretendard'; + src: url('/fonts/Pretendard-Bold.otf') format('opentype'); + font-weight: 700; + font-style: normal; + font-display: swap; +} + +/* 전역 폰트 적용 */ +* { + font-family: 'Pretendard', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; +} + +body { + font-family: 'Pretendard', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +input, textarea, select, button { + font-family: 'Pretendard', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; } diff --git a/src/shared/toast/index.js b/src/shared/toast/index.js index 34f74db..f094778 100644 --- a/src/shared/toast/index.js +++ b/src/shared/toast/index.js @@ -2,7 +2,7 @@ import { Slide, toast } from "react-toastify"; import "react-toastify/dist/ReactToastify.css"; const options = { - position: "top-right", + position: "top-center", autoClose: 3000, hideProgressBar: true, closeOnClick: true,