Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
112 commits
Select commit Hold shift + click to select a range
338fb9c
chore: initialize project folder structure (#1)
evenif99 Jun 14, 2026
721c696
docs: add CLAUDE.md with project rules and work guidelines (#2)
evenif99 Jun 14, 2026
5f5b229
infra: setup project config and install dependencies (#3)
evenif99 Jun 14, 2026
de0f4d9
docs: add base documentation structure (#4)
evenif99 Jun 14, 2026
8a17ac0
docs: add domain document drafts for all MVP domains (#5)
evenif99 Jun 14, 2026
3a9791d
infra: add Next.js App Router entry files and SCSS base structure (#6)
evenif99 Jun 14, 2026
bb0f645
Infra/init next setup (#7)
evenif99 Jun 14, 2026
9a6fbe5
Update README.md (#8)
evenif99 Jun 14, 2026
d47aeb8
docs(infra): confirm Supabase as project infrastructure (#9)
evenif99 Jun 15, 2026
1e585ac
chore(github): add collaboration templates and policy (#10)
evenif99 Jun 15, 2026
0d55c19
docs(env): document environment variable management (#11)
evenif99 Jun 15, 2026
8db7957
docs(calendar): confirm MUI date picker usage (#12)
evenif99 Jun 15, 2026
cd3c931
chore(deps): install MUI X Date Pickers and peer dependencies (#13)
evenif99 Jun 15, 2026
cfa2d30
Update README.md (#15)
evenif99 Jun 15, 2026
4894aae
fix: resolve ESLint and TypeScript config warnings (#20)
evenif99 Jun 15, 2026
dc802bd
infra: add MVP Prisma schema with NextAuth and TALKY-OWL models (#21)
evenif99 Jun 15, 2026
d7de797
infra: align project structure with guide v2 (#22)
evenif99 Jun 15, 2026
3e234e4
infra: rename src/app/page to src/app/(page) for correct Next.js rout…
evenif99 Jun 15, 2026
132544f
[Style] 디자인 토큰 및 전역 스타일 설정 (#25)
lyla-bae Jun 16, 2026
a41ad81
style: 디자인 시스템 기반 설정 (#27)
lyla-bae Jun 16, 2026
84091bd
Feature/common component jw (#28)
evenif99 Jun 16, 2026
333873b
fix: :root {} 시맨틱 토큰을 _global.scss로 분리 (#29)
lyla-bae Jun 16, 2026
241ec4e
feat(common): 공통 UI 컴포넌트 추가 및 MUI 정책 적용 (#30)
evenif99 Jun 17, 2026
1cf99eb
feat: 사건 목록 공통 UI 컴포넌트 추가 (Tab, StatusBadge) (#31)
wjdals21 Jun 17, 2026
1b6f964
fix(common): ActionPrompt message 제거 및 Textarea 글자수 카운터 위치 수정 (#32)
evenif99 Jun 17, 2026
2d10c75
feat: 공통 및 dispute·judgment DTO 타입 정의
juahcheon Jun 17, 2026
aeb02d5
feat: dispute 도메인 공유 상수·헬퍼·mapper 추가
juahcheon Jun 17, 2026
5cba696
feat: 사건 목록 조회·생성·수정·삭제 API 구현
juahcheon Jun 17, 2026
8897de1
feat: AI 판결 요청·결과 조회 API 구현
juahcheon Jun 17, 2026
e687e01
feat: 공통 UI 컴포넌트 - StatusBadge, Tab, 진행 상태 (#33)
wjdals21 Jun 17, 2026
39b9581
Merge branch 'dev' of https://github.com/I5-Project/TALKY-OWL into fe…
juahcheon Jun 17, 2026
cfea865
feat: Prisma 클라이언트, NextAuth Kakao OAuth 설정 및 핸들러 추가
juahcheon Jun 17, 2026
d56e5a1
chore: 빌드 스크립트에 prisma generate 추가
juahcheon Jun 17, 2026
33c43bb
docs: MVP 전체 API 명세서 작성 (API_SPEC.md) (#36)
evenif99 Jun 17, 2026
4ff949c
feat: Spinner, Avatar, AvatarGroup 공통 컴포넌트 추가 (#37)
lyla-bae Jun 17, 2026
0e061f6
feat: 공통 UI 컴포넌트 - CategoryFilter, CategoryIcon, Tab, StatusBadge (#38)
wjdals21 Jun 17, 2026
7b877e9
fix(common): BottomNavigation 아이콘 MUI MD2 기본 스타일로 수정 (#39)
evenif99 Jun 17, 2026
aa27da3
feat: 사건·방 도메인 타입 정의 및 API 구현 (#40)
juahcheon Jun 17, 2026
8bad421
fix: API 라우트 경로 v1 버전 세그먼트 제거 (#42)
evenif99 Jun 17, 2026
569d321
fix(docs): 서비스 흐름 기반 문서 구조 수정 및 페이지 문서 생성 (#43)
evenif99 Jun 17, 2026
7b70fb0
fix: personal-analyses 페이지 및 API 폴더 삭제 (#45)
evenif99 Jun 17, 2026
d7f47d4
feat: 통계 API 구현 (GET /api/statistics/categories) (#44)
wjdals21 Jun 17, 2026
40975bb
feat: Header variant 분리 (logo/title) 및 홈 화면 적용 (#47)
wjdalss21 Jun 18, 2026
e2384b2
feat: 사건작성 페이지 구현 (disputes/[id]/statement) (#46)
juahcheon Jun 18, 2026
e606322
docs: 단독 판결 MVP 포함 및 관련 정책 업데이트 (#51)
evenif99 Jun 18, 2026
535b719
Feature/verdict record display - 캘린더 페이지 ui 제작 (#41)
SG-Develope Jun 18, 2026
8b7bff4
feat: 사건작성(진술서) 페이지 구현 및 욕설 감지 필터 연동 (#49)
juahcheon Jun 18, 2026
6691e76
feat: 카카오 로그인 기능 구현 (#50)
evenif99 Jun 18, 2026
686b9d7
docs: 단독/1:1 판결 공통 진입 흐름 반영 및 관련 문서 일괄 수정 (#54)
evenif99 Jun 18, 2026
162e88b
fix: Login 페이지 hydration removeChild 에러 수정 (#55)
evenif99 Jun 18, 2026
0c033b3
fix: statements submittedAt 멱등성 보장, 에러 로깅, moderation JSON 파싱 에러 처리 (…
juahcheon Jun 18, 2026
560d9b7
feat: 홈 화면 진행중인 사건 섹션 구현 (#52)
wjdalss21 Jun 18, 2026
06041f4
feat: 사건조회 페이지 구현 (진행중/진행완료, 1인/2인 분기) (#53)
juahcheon Jun 18, 2026
0244e21
feat: 초대 참여 페이지 퍼블리싱 및 공통 UI 컴포넌트 추가 (#57)
lyla-bae Jun 18, 2026
cbfd654
feat: 이용약관, 개인정보처리방침 페이지 추가 (#58)
evenif99 Jun 18, 2026
4497d87
fix(auth): 카카오 로그인 시 UUID 형식 검증 오류 수정 (#59)
evenif99 Jun 18, 2026
b265353
fix(auth): 카카오 로그인 리다이렉트 오류 수정 (SessionProvider 추가) (#61)
evenif99 Jun 19, 2026
77a1ee6
feat: 홈 화면 새 사건 버튼, 카테고리 모달, 서비스 정보 푸터 구현 (#62)
wjdalss21 Jun 19, 2026
87cb9f9
refactor: 진술 제출 시 dispute 상태 동기화 및 판결 조건 수정 (#67)
juahcheon Jun 19, 2026
94e1168
feat(mypage): 마이페이지 UI/레이아웃 및 기능 구현 (#63)
evenif99 Jun 19, 2026
8148bc4
feat: 홈 화면 개선 — DB 닉네임 인사말, 통계 API, 새 사건 버튼 연결 (#68)
wjdalss21 Jun 19, 2026
b8d7623
feat: 사건기록 페이지 구현 (#65)
wjdalss21 Jun 19, 2026
b251350
feat: 감정일기 상세 페이지 ui 구현 (#64)
SG-Develope Jun 19, 2026
8b36ccf
feat: AI 판결 스키마 분리 및 판결 로직 구현 (#70)
juahcheon Jun 19, 2026
84e3871
fix: seed ConflictTypeGroup 추가 및 판결 매퍼 타입 오류 수정 (#75)
juahcheon Jun 19, 2026
c59c87d
feat: 마이페이지 개인정보 수정 페이지 구현 (#71)
evenif99 Jun 19, 2026
00924a7
fix: Prisma schema 중복 UserTermsAgreement 모델 제거 (#77)
evenif99 Jun 19, 2026
6d1a8ca
fix(prisma): 중복 UserTermsAgreement 모델 제거 및 SCSS mixin 수정 (#78)
evenif99 Jun 19, 2026
01e088c
feat: 새 사건 버튼 — POST /api/rooms 연결 및 roomId 전달 (#73)
wjdalss21 Jun 19, 2026
a6b441e
feat: 초대 링크 발급·참여 API 구현 및 프론트 연결 (#69)
lyla-bae Jun 19, 2026
aa1f436
feat(auth): 카카오 로그인 시 약관 동의 레코드 저장 구현 (#72)
evenif99 Jun 19, 2026
8cdf581
feat: 사건조회 페이지 분기 UI 및 AI 판결 프롬프트 개선 (#79)
juahcheon Jun 19, 2026
f644ee5
fix: 진술 저장 API 에러 메시지 노출 (#80)
juahcheon Jun 19, 2026
c6221fc
fix(auth): 카카오 로그인 시 kakao_id 중복 유니크 제약 위반 해결 (#82)
evenif99 Jun 19, 2026
89d9c6f
fix: 홈 진행중인 사건 API 연동 및 UI 수정 (#83)
wjdalss21 Jun 20, 2026
84bd0d0
Revert "fix: 홈 진행중인 사건 API 연동 및 UI 수정 (#83)" (#84)
wjdalss21 Jun 20, 2026
31f4782
feat: name/nickname 표시 정책 적용 (#74)
evenif99 Jun 20, 2026
0d65f44
fix: 홈 진행중인 사건 API 연동 및 UI 수정 (#85)
wjdalss21 Jun 20, 2026
08816e4
perf: 홈 로딩 시 session API 중복 호출 제거 (#86)
evenif99 Jun 20, 2026
e412502
feat(diary): 감정일기 작성 페이지 및 CategoryFilter emotion 모드 추가 (#81)
SG-Develope Jun 20, 2026
094b3e2
refactor(api): 중복 users/me API 라우트 제거 (#89)
evenif99 Jun 20, 2026
0624cd6
feat(mypage): 회원탈퇴 전 약관 안내 페이지 추가 (#87)
evenif99 Jun 20, 2026
cec2189
fix(mypage): 프로필 이미지 미표시, 이름 기본값, MBTI 미설정 문구 수정 (#88)
evenif99 Jun 20, 2026
6c80b15
feat: 판결 결과 페이지 구현 (판결/유형 탭, JudgmentResult, JudgmentTypeResult) (#90)
wjdalss21 Jun 20, 2026
161411b
fix: ai_room 이름 변경, 초대 링크 버그 수정, 판결받기 버튼 개선 (#92)
lyla-bae Jun 20, 2026
c61d04e
fix: disputes/[id] 페이지 UI 및 판결 플로우 수정 (#91)
juahcheon Jun 20, 2026
bed7aab
fix(auth): 탈퇴 회원이 동일 카카오 계정으로 재가입 가능하도록 수정 (#94)
evenif99 Jun 20, 2026
5246856
fix: 사건조회 UI 개선 및 AI 판결 플로우 버그 수정 (#95)
juahcheon Jun 20, 2026
6aa65eb
fix: dispute UI 버그 수정 및 AI 판결 플로우 개선 (#96)
juahcheon Jun 20, 2026
72d96d7
feat: 사건기록 페이지 API 연동 및 홈 UI 개선 (#97)
wjdalss21 Jun 20, 2026
3f758cf
feat: 달력 월별 조회 및 감정일기 날짜별 조회 API 구현
SG-Develope Jun 20, 2026
ba7c079
refactor: diary , calendar 에러 응답처리
SG-Develope Jun 22, 2026
886f8ef
feat: 달력 월별 조회 및 감정일기 날짜별 조회 API 구현 (#98)
SG-Develope Jun 22, 2026
42e1668
chore: 이미지 에셋 SVG 전환 및 메타데이터 업데이트 (#99)
lyla-bae Jun 22, 2026
223053b
fix: UI 구조 개선 및 진술 수정 기능 (#100)
juahcheon Jun 22, 2026
35e3b81
fix(style): Remove temporary dev border from container (#101)
evenif99 Jun 22, 2026
6d1c4a6
fix: API 성능 개선 및 UI 버그 수정 (#103)
juahcheon Jun 22, 2026
b5d4395
fix(auth): 탈퇴 회원 카카오 재가입 허용 (#102)
evenif99 Jun 22, 2026
b35583b
feat: 2인 판결결과 UI 및 진술 탭 참여자 정보 개선 (#104)
wjdalss21 Jun 22, 2026
19916c2
fix: 사건 생성 플로우 개선 및 UI/성능 수정 (#107)
juahcheon Jun 22, 2026
c079671
fix(mypage): 마이페이지 UI 개선 (#105)
evenif99 Jun 22, 2026
a221ce3
feat: 카테고리 사건 제한, 사건기록 무한스크롤, statistics API 최적화 (#106)
wjdalss21 Jun 22, 2026
96b439c
fix: api/user/me PATCH 중복 프로필 이미지 업로드 로직 제거 (#108)
evenif99 Jun 22, 2026
72a7d57
fix(auth): 비회원 보호 페이지 접근 시 로그인 리다이렉트 적용 (#109)
evenif99 Jun 22, 2026
b1bb80e
feat: 감정일기 수정 및 작성 페이지 api 연동
SG-Develope Jun 22, 2026
c877697
feat: 감정일기 수정 , 조회 api 추가
SG-Develope Jun 22, 2026
3ac101e
fix(auth): 콜백 URL 절대경로 처리로 로그인 후 원래 페이지 복귀 수정 (#114)
evenif99 Jun 22, 2026
9b9a054
Merge branch 'dev' of https://github.com/I5-Project/TALKY-OWL into fe…
SG-Develope Jun 23, 2026
5d0617b
refactor : diary route 예외처리 추가
SG-Develope Jun 23, 2026
81daa87
fix: API 라우트 미들웨어 리다이렉트 제거 (#120)
juahcheon Jun 23, 2026
bfd1cf0
Merge pull request #113 from I5-Project/feature/calendar-daily-record…
SG-Develope Jun 23, 2026
d2da113
fix: dev → main 프로덕션 배포 동기화 (전체 충돌 해결)
evenif99 Jun 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/app/(page)/calendar/page.module.scss
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
height: fn.r(48);
margin-left: auto;
margin-right: fn.r(20);
margin-bottom: fn.r(24);
margin-bottom: fn.r(80);
padding: fn.r(12) fn.r(15);
background-color: v.$color-black-700;
color: v.$color-white;
Expand Down
2 changes: 2 additions & 0 deletions src/app/(page)/calendar/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import { useState } from 'react';
import { useRouter } from 'next/navigation';
import dayjs from 'dayjs';
import Header from '@/components/layout/Header';
import CalendarView from '@/components/calendar/CalendarView';
import styles from '@/app/(page)/calendar/page.module.scss';
import EmotionDiaryList from '@/components/diary/EmotionDiaryList';
Expand Down Expand Up @@ -32,6 +33,7 @@ export default function Calendar() {

return (
<div>
<Header variant="logo" />
<div className={styles.calendarWrapper}>
<CalendarView
onDateChange={setSelectedDate}
Expand Down
22 changes: 22 additions & 0 deletions src/app/(page)/diary/[id]/DiaryActions.module.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
@use '@/styles/abstracts/variables' as v;
@use '@/styles/abstracts/functions' as fn;
@use '@/styles/abstracts/mixins' as typo;

.modalContent {
display: flex;
flex-direction: column;
gap: fn.r(20);
}

.modalTitle {
@include typo.text-title-s
}

.modalButtons {
display: flex;
gap: fn.r(8);

> * {
flex: 1;
}
}
67 changes: 67 additions & 0 deletions src/app/(page)/diary/[id]/DiaryActions.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
'use client';

import { useState } from 'react';
import { useRouter } from 'next/navigation';
import ActionPrompt from '@/components/ui/ActionPrompt';
import Button from '@/components/ui/Button';
import Modal from '@/components/ui/Modal';
import { useDeleteDiary } from '@/domains/diary/diary.hooks';
import styles from './DiaryActions.module.scss';

interface DiaryActionsProps {
diaryId: string;
diaryDate: string;
className?: string;
}

export default function DiaryActions({ diaryId, diaryDate, className }: DiaryActionsProps) {
const router = useRouter();
const [showDeleteModal, setShowDeleteModal] = useState(false);

const deleteMutation = useDeleteDiary(diaryDate);

const handleEdit = () => {
router.push(`/diary/${diaryId}/edit`);
};

const handleDelete = () => {
setShowDeleteModal(true);
};

const handleConfirmDelete = () => {
deleteMutation.mutate(diaryId, {
onError: () => setShowDeleteModal(false),
});
};

return (
<>
<ActionPrompt
secondaryLabel="삭제"
onSecondary={handleDelete}
primaryLabel="수정"
onPrimary={handleEdit}
secondaryVariant="outline"
className={className}
/>

<Modal open={showDeleteModal} onClose={() => !deleteMutation.isPending && setShowDeleteModal(false)}>
<div className={styles.modalContent}>
<p className={styles.modalTitle}>일기를 삭제하시겠습니까?</p>
<div className={styles.modalButtons}>
<Button
variant="outline"
onClick={() => setShowDeleteModal(false)}
disabled={deleteMutation.isPending}
>
취소
</Button>
<Button onClick={handleConfirmDelete} disabled={deleteMutation.isPending}>
{deleteMutation.isPending ? '삭제 중...' : '삭제'}
</Button>
</div>
</div>
</Modal>
</>
);
}
9 changes: 9 additions & 0 deletions src/app/(page)/diary/[id]/DiaryDetailHeader.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
'use client';

import { useRouter } from 'next/navigation';
import Header from '@/components/layout/Header';

export default function DiaryDetailHeader() {
const router = useRouter();
return <Header variant="title" title="일기 조회" onBack={() => router.push('/calendar')} />;
}
22 changes: 22 additions & 0 deletions src/app/(page)/diary/[id]/edit/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { notFound, redirect } from 'next/navigation';
import { getServerSession } from 'next-auth';
import { authOptions } from '@/lib/auth';
import { getSessionUserId } from '@/lib/auth/session';
import { getDiaryById } from '@/domains/diary/diary.service';
import DiaryCreate from '@/app/(page)/diary/create/page';

export default async function DiaryEditPage({
params,
}: {
params: Promise<{ id: string }>;
}) {
const session = await getServerSession(authOptions);
const userId = getSessionUserId(session);
if (!userId) redirect('/login');

const { id } = await params;
const diary = await getDiaryById(id, userId);
if (!diary) notFound();

return <DiaryCreate mode="edit" diary={diary} />;
}
3 changes: 2 additions & 1 deletion src/app/(page)/diary/[id]/page.module.scss
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
&__character {
position: absolute;
bottom: fn.r(13);
right: fn.r(-100);
right: fn.r(-50);
opacity: 50%;
}

Expand All @@ -46,6 +46,7 @@
display: flex;
gap: fn.r(8);
margin-top: fn.r(121);
padding-bottom: fn.r(80);
}
}

Expand Down
70 changes: 29 additions & 41 deletions src/app/(page)/diary/[id]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,60 +1,48 @@
'use client';

import { notFound, redirect } from 'next/navigation';
import { getServerSession } from 'next-auth';
import Image from 'next/image';
import styles from '@/app/(page)/diary/[id]/page.module.scss';
import ActionPrompt from '@/components/ui/ActionPrompt';
import { authOptions } from '@/lib/auth';
import { getSessionUserId } from '@/lib/auth/session';
import { getDiaryById } from '@/domains/diary/diary.service';
import styles from './page.module.scss';
import DiaryActions from './DiaryActions';
import DiaryDetailHeader from './DiaryDetailHeader';

export default async function DiaryDetailPage({
params,
}: {
params: Promise<{ id: string }>;
}) {
const session = await getServerSession(authOptions);
const userId = getSessionUserId(session);
if (!userId) redirect('/login');

export default function Diary() {
const handleEdit = () => {
console.log('수정 클릭');
};
const { id } = await params;
const diary = await getDiaryById(id, userId);
if (!diary) notFound();

const handleDelete = () => {
console.log('삭제 클릭');
};
return (
<div className={styles.diary}>
<>
<DiaryDetailHeader />
<div className={styles.diary}>
<div className={styles['diary__body']}>
<Image
className={styles['diary__character']}
src="/images/characters/character-closed.png"
alt=""
width={350}
width={355}
height={194}
/>

<div className={styles['diary__title']}>지금 이건 테스트인가</div>

<div className={styles['diary__content']}>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quas veritatis distinctio
voluptas, dolor nulla nam, corporis sunt adipisci veniam perspiciatis odit. Natus veniam
delectus exercitationem. Rerum doloribus pariatur hic facere! Lorem ipsum dolor sit amet,
consectetur adipisicing elit. Quas veritatis distinctio voluptas, dolor nulla nam,
corporis sunt adipisci veniam perspiciatis odit. Natus veniam delectus exercitationem.
Rerum doloribus pariatur hic facere! Lorem ipsum dolor sit amet, consectetur adipisicing
elit. Quas veritatis distinctio voluptas, dolor nulla nam, corporis sunt adipisci veniam
perspiciatis odit. Natus veniam delectus exercitationem. Rerum doloribus pariatur hic
facere! Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quas veritatis
distinctio voluptas, dolor nulla nam, corporis sunt adipisci veniam perspiciatis odit.
Natus veniam delectus exercitationem. Rerum doloribus pariatur hic facere! Lorem ipsum
dolor sit amet, consectetur adipisicing elit. Quas veritatis distinctio voluptas, dolor
nulla nam, corporis sunt adipisci veniam perspiciatis odit. Natus veniam delectus
exercitationem. Rerum doloribus pariatur hic facere!
</div>

<time className={styles['diary__createdAt']}>26-06-14</time>
<div className={styles['diary__title']}>{diary.title}</div>
<div className={styles['diary__content']}>{diary.content}</div>
<time className={styles['diary__createdAt']}>{diary.diaryDate}</time>
</div>

<div className={styles['diary__actions']}>
<ActionPrompt
secondaryLabel="삭제"
onSecondary={handleDelete}
primaryLabel="수정"
onPrimary={handleEdit}
secondaryVariant="outline"
className={styles.diaryActions}
/>
<DiaryActions diaryId={id} diaryDate={diary.diaryDate} className={styles.diaryActions} />
</div>
</div>
</>
);
}
17 changes: 17 additions & 0 deletions src/app/(page)/diary/create/page.module.scss
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,27 @@
@include typo.text-body-s;
}

&__form-area {
position: relative;
}

&__form {
display: flex;
flex-direction: column;
gap: fn.r(12);

&--loading {
opacity: 0.4;
pointer-events: none;
}
}

&__spinner-overlay {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
}

&__textarea {
Expand Down
Loading