Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
510ea31
refactor: 이름, 연락처 유효성 검증 추가
aken-you Jul 18, 2025
ff35c90
refactor: 연락처 input에 숫자와 -만 입력하도록 제한
aken-you Jul 18, 2025
5ba07a0
refactor: 내 프로필 수정 모달의 Footer 디자인 변경
aken-you Jul 18, 2025
3ba458b
style: eslint 적용
aken-you Jul 18, 2025
7b9f9f8
refactor: ProfileEditModal에서 onSubmit prop 삭제
aken-you Jul 18, 2025
6724fde
feat: 프로필 기본 이미지 경로 상수화
aken-you Jul 18, 2025
6ec6122
style: 주석 제거
aken-you Jul 18, 2025
7e89030
style: --color-background-dimmer opacity 오타 수정
aken-you Jul 18, 2025
4153fd3
refactor: 프로필 편집 모달에서 폼과 관련된 상태 통합
aken-you Jul 18, 2025
71e0dcb
fix: 모달을 다시 열어도 이전에 수정한 폼 상태 유지되는 문제 해결
aken-you Jul 18, 2025
d2e9518
fix: github 링크와 blog/sns 링크가 없을 경우, 입력 부탁 메세지 표시
aken-you Jul 18, 2025
af97fac
refactor: 공백 제거 후 github, 블로그/SNS 링크 상태 업데이트
aken-you Jul 18, 2025
8909fed
refactor: 프로필 수정 폼 컴포넌트로 분리
aken-you Jul 19, 2025
81d58b0
style: 주석 제거
aken-you Jul 19, 2025
b910c38
refactor: 1024px 기준으로 layout 스타일 다르게 적용
aken-you Jul 19, 2025
a738ab4
refactor: 프로필 이미지 input에 파일 확장자와 선택 개수 제한
aken-you Jul 19, 2025
dd6dd49
refactor: 프로필 이미지 업데이트 로직 수정
aken-you Jul 19, 2025
d48ef19
style: 파일 폴더를 여는 핸들러 이름 변경
aken-you Jul 19, 2025
d773b55
feat: 프로필 이미지를 기본 이미지로 선택하면, 서버에게 기본 이미지 전송
aken-you Jul 19, 2025
7eac077
Merge pull request #91 from code-zero-to-one/QNRR-375-유수아-내-프로필-수정에서-…
aken-you Jul 19, 2025
f690b4d
refactor: 프로필 수정 폼 안내 문구 수정
aken-you Jul 19, 2025
9f17d98
Merge pull request #92 from code-zero-to-one/QNRR-375-유수아-내-프로필-수정에서-…
aken-you Jul 19, 2025
2e4b595
refactor: 면접 준비/완료 모달 Footer 디자인 수정
aken-you Jul 19, 2025
b17c97d
refactor: 면접 모달 trigger text 변경
aken-you Jul 19, 2025
2fdee75
refactor: DoneForm의 TextAreaInput 위치 수정
aken-you Jul 19, 2025
64c828f
refactor: 프로필을 기본 프로필로 수정했을 때의 요청 로직 수정
aken-you Jul 19, 2025
919b201
Merge pull request #94 from code-zero-to-one/QNRR-377-유수아-면접-준비-완료하기-…
aken-you Jul 19, 2025
1ebd8fd
fix: 1일 전의 날짜로 특정 날짜의 내 스터디 조회하는 버그 해결
aken-you Jul 19, 2025
8c1b0de
Merge pull request #96 from code-zero-to-one/QNRR-380-유수아-특정-날짜의-내-스터…
aken-you Jul 19, 2025
d626510
refactor: ProfileInfoEditModal에서 폼 UI를 컴포넌트로 분리
aken-you Jul 20, 2025
24dc7af
refactor: 내 정보 수정 mutation 훅 위치 이동
aken-you Jul 20, 2025
99debbb
refactor: 내 정보 수정이 성공했을 경우 호출할 onSuccess 설정
aken-you Jul 20, 2025
6ebf8c4
refactor: 내 정보 수정 모달의 "수정 완료" 버튼 disabled 설정
aken-you Jul 20, 2025
360f835
Merge pull request #95 from code-zero-to-one/QNRR-375-유수아-내-프로필-수정에서-…
aken-you Jul 21, 2025
5154154
refactor: 연락처 유효성 조건 수정
aken-you Jul 21, 2025
bb21d01
fix: 스터디 전체 조회 studyDate로 변경
Mimiminz Jul 21, 2025
d7d9142
fix: 면접 완료 api 변경
Mimiminz Jul 21, 2025
e1708ca
Merge pull request #97 from code-zero-to-one/QNRR-381-유수아-내-정보-수정-모달-…
aken-you Jul 22, 2025
9991872
refactor: 모달 분리
Mimiminz Jul 22, 2025
4268bb9
fix: 면접 준비 api
Mimiminz Jul 22, 2025
54da5e5
refactor: 뱃지맵 함수 분리
Mimiminz Jul 22, 2025
52f7307
style: link 버튼 변경
Mimiminz Jul 22, 2025
beab5b4
Merge branch 'develop' of https://github.com/code-zero-to-one/study-p…
Mimiminz Jul 22, 2025
ea30d7a
Merge pull request #99 from code-zero-to-one/QNRR-383-유수아-연락처를-설정하지-않…
aken-you Jul 22, 2025
be689c6
style: badge 이름 변경
Mimiminz Jul 23, 2025
be1c023
fix: 면접 완료 api 수정
Mimiminz Jul 23, 2025
457a0c3
Merge branch 'develop' of https://github.com/code-zero-to-one/study-p…
Mimiminz Jul 23, 2025
c5e31be
refactor: icon 폴더 이동
Mimiminz Jul 23, 2025
19f38a4
refactor: 폴더 위치 이동
Mimiminz Jul 23, 2025
35cbb62
refactor: image -> svgr 컴포넌트로 변경
Mimiminz Jul 23, 2025
44dde99
refactor: props 및 param 형태 변경
Mimiminz Jul 23, 2025
f89b411
fix: 업데이트 쿼리 추가
Mimiminz Jul 23, 2025
6dd1c81
fix: 빈 값 설정
Mimiminz Jul 23, 2025
e8a2755
delete: 사용하지 않는 import 제거
Mimiminz Jul 23, 2025
ffd7dff
fix: warning 제거 (img -> Next/Image)
Mimiminz Jul 23, 2025
a59a26e
fix : 로그인 리디렉션시 쿠키에 소셜이미지 디코딩해서 넣기
seong-jin-jo Jul 24, 2025
ac24bad
fix: mutation 방식 변경
Mimiminz Jul 24, 2025
9662ba9
fix : 로그인 리디렉션시 쿠키에 소셜이미지 디코딩해서 넣기2
seong-jin-jo Jul 24, 2025
8f9d035
feat: 스터디 신청 완료 안내 문구 alert로 표시
aken-you Jul 24, 2025
e945d91
chore : 주석삭제 (배포환경테스트는 인프라에서 진행)
seong-jin-jo Jul 24, 2025
47e367f
Merge pull request #98 from code-zero-to-one/QNRR-373-조민주-스터디-면접-준비-완…
Mimiminz Jul 25, 2025
6dcce3a
refactor: 약관동의 checkbox 이동
aken-you Jul 25, 2025
e4d6e38
fix: 이름 유효성 검사 스타일 개선
aken-you Jul 26, 2025
70df1e3
refactor: 이름 Input의 입력값 제한
aken-you Jul 26, 2025
b44c6c3
feat: 개인 약관 동의하지 않으면 가입 완료 버튼 비활성화
aken-you Jul 26, 2025
4619524
refactor: 스터디 시작 전에는 완료하기 버튼 비활성화
aken-you Jul 26, 2025
9362b1a
refactor: 준비하기 버튼에 Button 컴포넌트 적용
aken-you Jul 26, 2025
b56ecae
refactor: 스터디 준비 mutate가 응답오기 전에 작성 완료 버튼 비활성화
aken-you Jul 26, 2025
d01d398
Merge pull request #102 from code-zero-to-one/QNRR-395-유수아-이름-형식에-맞지-…
aken-you Jul 26, 2025
df7241e
Merge pull request #101 from code-zero-to-one/QNRR-390-유수아-스터디-신청-완료-…
aken-you Jul 26, 2025
0ae99bc
Merge pull request #103 from code-zero-to-one/QNRR-392-유수아-면접-준비가-되면-…
aken-you Jul 26, 2025
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
4 changes: 3 additions & 1 deletion app/(my)/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ export default function MyLayout({
return (
<div className="flex">
<Sidebar />
<div className="w-full px-[150px] pt-500 pb-[100px]">{children}</div>
<div className="w-full px-[40px] pt-500 pb-[100px] lg:px-[150px]">
{children}
</div>
</div>
);
}
2 changes: 1 addition & 1 deletion app/global.css
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ https://velog.io/@oneook/tailwindcss-4.0-%EB%AC%B4%EC%97%87%EC%9D%B4-%EB%8B%AC%E

--color-background-alternative: var(--color-gray-50);
--color-background-default: var(--color-gray-0);
--color-background-dimmer: rgba(24, 29, 39, 80);
--color-background-dimmer: rgba(24, 29, 39, 0.8);
--color-background-disabled: var(--color-gray-100);

--color-background-brand-subtle: var(--color-rose-300);
Expand Down
3 changes: 2 additions & 1 deletion app/not-found.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import Image from 'next/image';
import Link from 'next/link';
import Button from '@/shared/ui/button';

export default function NotFound() {
return (
<div className="flex h-[calc(100vh-45px)] w-full flex-col items-center justify-center gap-5">
<img src="/images/404.png" width={256} height={221} />
<Image src="/images/404.png" alt="404 에러" width={256} height={221} />
<Link href="/">
<Button size="large" type="button" color="secondary">
홈으로 이동
Expand Down
8 changes: 4 additions & 4 deletions app/redirection/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,13 @@ function RedirectionContent() {
const isGuest = searchParams.get('is-guest');
const memberId = searchParams.get('member-id');
const authVendor = searchParams.get('auth-vendor');
const socialImageURL = decodeURIComponent(
searchParams.get('profile-image-url') || '',
);

setCookie('accessToken', accessToken);
setCookie('memberId', memberId);
setCookie(
'socialImageURL',
searchParams.get('profile-image-url') || '',
);
setCookie('socialImageURL', socialImageURL);

if (isGuest === 'true') {
router.push('/sign-up');
Expand Down
2 changes: 1 addition & 1 deletion public/icons/Link.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/profile-default.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 0 additions & 3 deletions src/features/auth/api/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,10 @@ export async function uploadProfileImage(
filename: string,
file: FormData,
) {
console.log('uploadProfileImage 요청직전', file);
// Bug : 여기서 에러발생중
const res = await axiosInstanceForMultipart.put(
`/files/members/${memberId}/profile/image/${filename}`,
file,
);
console.log('auth.ts - uploadProfileImage 응답', res);

return res.data;
}
Expand Down
6 changes: 0 additions & 6 deletions src/features/auth/ui/login-modal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -112,12 +112,6 @@ export default function LoginModal({
</span>
</button>
</div>
<div className="font-designer-14m text-text-subtle mb-250 flex items-center gap-75">
<input type="checkbox" id="agree" />
<label htmlFor="agree">
ZERO-ONE의 이용 약관과 개인정보 처리방침에 동의할게요.
</label>
</div>
</Modal.Body>
</Modal.Content>
</Modal.Portal>
Expand Down
9 changes: 5 additions & 4 deletions src/features/auth/ui/sign-up-image-selector.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@ export default function SignupImageSelector({
handleImageChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
}) {
const setDefaultImage = () => setImage('/profile-default.svg');
const openFileDialog = () => fileInputRef.current?.click();
const openFileFolder = () => fileInputRef.current?.click();

return (
<div className="relative">
<div className="relative h-[112px] w-[112px] overflow-hidden rounded-full">
<Image src={image} alt="프로필" fill className="object-cover" />
<img src={image} alt="next최적화안쓴프로필" className='object-covoer' />
<img src={image} alt="next최적화안쓴프로필" className="object-covoer" />
</div>
<DropdownMenu.Root>
<DropdownMenu.Trigger asChild>
Expand All @@ -44,7 +44,7 @@ export default function SignupImageSelector({
</DropdownMenu.Item>
<DropdownMenu.Item
className="hover:text-text-default hover:font-designer-14b cursor-pointer px-50 py-[2px] hover:bg-gray-100"
onSelect={openFileDialog}
onSelect={openFileFolder}
>
앨범에서 선택
</DropdownMenu.Item>
Expand All @@ -53,8 +53,9 @@ export default function SignupImageSelector({
<input
ref={fileInputRef}
type="file"
accept="image/*"
accept="image/jpg,image/png,image/gif,image/webp"
className="hidden"
multiple={false}
onChange={handleImageChange}
/>
</div>
Expand Down
73 changes: 51 additions & 22 deletions src/features/auth/ui/sign-up-modal.tsx
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
import { sendGTMEvent } from '@next/third-parties/google';
import { XIcon } from 'lucide-react';
import { useState, useRef } from 'react';
import {
useSignUpMutation,
useUploadProfileImageMutation,
} from '@/features/auth/model/use-auth-mutation';
import SignupImageSelector from '@/features/auth/ui/sign-up-image-selector';
import SignupNameInput from '@/features/auth/ui/sign-up-name-input';
import { hashValue } from '@/shared/lib/hash';
import { getCookie, setCookie } from '@/shared/tanstack-query/cookie';
import Button from '@/shared/ui/button';
import { BaseInput } from '@/shared/ui/input';
import { Modal } from '@/shared/ui/modal';
import { sendGTMEvent } from '@next/third-parties/google';
import { hashValue } from '@/shared/lib/hash';

export default function SignupModal({
open,
Expand All @@ -20,7 +20,7 @@ export default function SignupModal({
onClose: () => void;
}) {
const [name, setName] = useState('');
const [error, setError] = useState('');
const [checked, setChecked] = useState<boolean>(false);
const [image, setImage] = useState(
getCookie('socialImageURL') || 'profile-default.svg',
);
Expand All @@ -29,15 +29,7 @@ export default function SignupModal({
const signUp = useSignUpMutation();
const uploadProfileImage = useUploadProfileImageMutation();

// 이름 유효성 검사
const validateName = (value: string) => {
if (!/^[가-힣a-zA-Z]{2,10}$/.test(value)) {
setError('이름에는 숫자나 특수문자를 사용할 수 없습니다.');
} else {
setError('');
}
setName(value);
};
const isValidName = /^[가-힣a-zA-Z]{2,10}$/.test(name);

// 이미지 업로드
const handleImageChange = (e: React.ChangeEvent<HTMLInputElement>) => {
Expand All @@ -60,12 +52,11 @@ export default function SignupModal({
{
// 회원가입 성공 시 프로필 이미지 업로드
onSuccess: (data) => {

const memberId = data.content.generatedMemberId;

if (data && memberId) {
setCookie('memberId', memberId)
setCookie('memberId', memberId);

// 회원가입 GA 이벤트 전송
sendGTMEvent({
event: 'custom_member_join',
Expand All @@ -85,7 +76,6 @@ export default function SignupModal({
file: formData,
});
}


// 성공 후 홈페이지로 이동
window.location.href = '/';
Expand Down Expand Up @@ -124,17 +114,56 @@ export default function SignupModal({
<div className="font-designer-24b text-text-default mt-2 text-center">
서비스 이용을 위해 이름을 입력해주세요.
</div>
<SignupNameInput
name={name}
setName={validateName}
error={error}
/>
<div className="flex w-full flex-col items-center gap-200">
<div className="flex w-full flex-col gap-75">
<BaseInput
type="text"
value={name}
onChange={(e) => {
const value = e.target.value;
const filteredValue = value
.replace(/[^a-zA-Zㄱ-힣]/g, '')
.slice(0, 10)
.trim();
setName(filteredValue);
}}
placeholder="홍길동"
className={`w-full`}
color={
isValidName || name.length === 0 ? 'default' : 'error'
}
maxLength={10}
/>
<div
className={`font-designer-13r ${isValidName || name.length === 0 ? 'text-text-subtlest' : 'text-text-error'}`}
>
{isValidName || name.length === 0
? '신뢰 있는 매칭을 위해 실명을 사용해주세요. (예: 홍길동 )'
: '이름에는 숫자나 특수문자를 사용할 수 없습니다. 두 글자 이상 입력해주세요.'}
</div>
</div>
<div className="flex w-full gap-75">
<input
type="checkbox"
id="agree"
checked={checked}
onChange={(e) => setChecked(e.target.checked)}
/>
<label
htmlFor="agree"
className="font-designer-14m text-text-subtle text-sm"
>
ZERO-ONE의 이용 약관과 개인정보 처리방침에 동의할게요.
</label>
</div>
</div>
<Button
color="primary"
size="large"
className="w-full"
type="submit"
onClick={handleSubmit}
disabled={!isValidName || !checked || signUp.isPending}
>
가입 완료
</Button>
Expand Down
31 changes: 0 additions & 31 deletions src/features/auth/ui/sign-up-name-input.tsx

This file was deleted.

2 changes: 2 additions & 0 deletions src/features/my-page/consts/my-page-const.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,5 @@ export const MBTI_OPTIONS = [
{ label: 'ENFJ', value: 'ENFJ' },
{ label: 'ENTJ', value: 'ENTJ' },
];

export const DEFAULT_PROFILE_IMAGE_URL = '/profile-default.svg';
File renamed without changes
File renamed without changes
Loading