-
- setIntroduce(e.target.value)}
- />
-
+ const {
+ selfIntroduction,
+ studyPlan,
+ tel,
+ githubLink,
+ blogOrSnsLink,
+ preferredStudySubjectId,
+ availableStudyTimeIds,
+ } = form;
-
- setStudyPlan(e.target.value)}
- />
-
+ const { data: availableStudyTimes } = useAvailableStudyTimesQuery();
+ const { data: studySubjects } = useStudySubjectsQuery();
+ const { data: techStacks } = useTechStacksQuery();
+ const router = useRouter();
+
+ const { mutate: joinStudy } = useJoinStudyMutation();
-
- ({
- value: studySubjectId,
- label: name,
- }),
- )}
- placeholder="선택하세요"
- onChange={(value) => setPreferredSubject(value.toString())}
- />
-
+ const toggleStudyTime = (id: number) => {
+ setForm((prev) =>
+ prev.availableStudyTimeIds.includes(id)
+ ? {
+ ...prev,
+ availableStudyTimeIds: prev.availableStudyTimeIds.filter(
+ (item) => item !== id,
+ ),
+ }
+ : {
+ ...prev,
+ availableStudyTimeIds: [...prev.availableStudyTimeIds, id],
+ },
+ );
+ };
+
+ const handleSubmit = () => {
+ const newError: JoinStudyFormError = {
+ selfIntroduction: selfIntroduction.trim() === '',
+ studyPlan: studyPlan.trim() === '',
+ tel: !/^\d{2,3}-\d{3,4}-\d{4}$/.test(tel),
+ preferredStudySubjectId: preferredStudySubjectId === undefined,
+ availableStudyTimeIds: availableStudyTimeIds.length === 0,
+ techStackIds: form.techStackIds.length === 0,
+ };
-
-
- {(availableStudyTimes ?? []).map(
- ({ availableTimeId, display }) => (
- toggleTimeSlot(availableTimeId)}
- >
- {display}
-
- ),
- )}
-
-
+ if (Object.values(newError).some(Boolean)) {
+ setError(newError);
-
- ({
- value: techStackId,
- label: techStackName,
- }),
- )}
- onChange={(newSelected) =>
- setSelectedSkills(newSelected as number[])
- }
- placeholder="기술을 선택해주세요"
- />
-
+ return;
+ }
-
- setPhoneNumber(e.target.value)}
- />
-
+ joinStudy(
+ {
+ ...form,
+ memberId,
+ githubLink: githubLink.trim() || undefined,
+ blogOrSnsLink: blogOrSnsLink.trim() || undefined,
+ },
+ {
+ onSuccess: () => {
+ alert('스터디 신청이 완료되었습니다!');
+ router.refresh();
+ },
+ onError: () => {
+ alert('스터디 신청 중 오류가 발생했습니다. 다시 시도해 주세요.');
+ },
+ },
+ );
+ };
-
- setGithub(e.target.value)}
- />
-
+ return (
+ <>
+
+ CS 스터디 진행 방법
+ {studySteps.map((step, idx) => (
+
+ ))}
-
- setBlog(e.target.value)}
- />
-
+
+
+
+
+ {
+ setForm((prev) => ({
+ ...prev,
+ selfIntroduction: e.target.value,
+ }));
+ setError((prev) => ({
+ ...prev,
+ selfIntroduction: e.target.value.trim() === '',
+ }));
+ }}
+ />
+
+
+
+ {
+ setForm((prev) => ({
+ ...prev,
+ studyPlan: e.target.value,
+ }));
+ setError((prev) => ({
+ ...prev,
+ studyPlan: e.target.value.trim() === '',
+ }));
+ }}
+ />
+
+
+
+ ({
+ value: studySubjectId,
+ label: name,
+ }),
+ )}
+ placeholder="선택하세요"
+ onChange={(value) => {
+ setForm((prev) => ({
+ ...prev,
+ preferredStudySubjectId: value.toString(),
+ }));
+ setError((prev) => ({
+ ...prev,
+ preferredStudySubjectId: value === undefined,
+ }));
+ }}
+ />
+
+
+
+
+ {(availableStudyTimes ?? []).map(
+ ({ availableTimeId, display }) => (
+ toggleStudyTime(availableTimeId)}
+ >
+ {display}
+
+ ),
+ )}
-
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+ setForm((prev) => ({ ...prev, githubLink: e.target.value }))
+ }
+ />
+
+
+
+
+ setForm((prev) => ({
+ ...prev,
+ blogOrSnsLink: e.target.value,
+ }))
+ }
+ />
+
+
+
+
+
+
+
+
+
+
+ >
);
}
diff --git a/src/features/study/ui/today-study-card.tsx b/src/features/study/ui/today-study-card.tsx
index 109f265e..ffc87692 100644
--- a/src/features/study/ui/today-study-card.tsx
+++ b/src/features/study/ui/today-study-card.tsx
@@ -1,8 +1,11 @@
'use client';
import { useEffect, useState } from 'react';
+import UserProfileModal from '@/features/my-page/ui/user-profile-modal';
import { getStatusBadge } from '@/features/study/ui/status-badge-map';
import { getCookie } from '@/shared/tanstack-query/cookie';
+// TODO: FSD 의 import 바운더리를 넘어서 import 해야하는데,
+// 해당 UI를 shared 등으로 빼던지 수정 필요
import UserAvatar from '@/shared/ui/avatar';
import StudyDoneModal from './study-done-modal';
import StudyReadyModal from './study-ready-modal';
@@ -22,6 +25,18 @@ export default function TodayStudyCard({ studyDate }: { studyDate: string }) {
const isInterviewee = memberId === todayStudyData.intervieweeId;
+ const matchedUserId = isInterviewee
+ ? todayStudyData.interviewerId
+ : todayStudyData.intervieweeId;
+
+ const matchedUserImage = isInterviewee
+ ? todayStudyData.interviewerImage
+ : todayStudyData.intervieweeImage;
+
+ const matchedUsername = isInterviewee
+ ? todayStudyData.interviewerName
+ : todayStudyData.intervieweeName;
+
return (
@@ -35,26 +50,26 @@ export default function TodayStudyCard({ studyDate }: { studyDate: string }) {
-
-
-
-
- {todayStudyData.interviewerName}
-
-
- }
- />
-
-
+
+ {`${todayStudyData.studySpaceId} 조`}
+
+
+
+
+
+ {matchedUsername}
+
+
+ }
+ />
+
+