Skip to content

Commit 0185660

Browse files
조성진조성진
authored andcommitted
Resolve merge conflict in deploy-dev.yml workflow
2 parents 1db2f68 + 644a93e commit 0185660

File tree

5 files changed

+141
-49
lines changed

5 files changed

+141
-49
lines changed

.github/workflows/deploy-dev.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,4 +69,4 @@ jobs:
6969
sudo docker compose -f docker-compose.dev.yml up -d --build
7070
7171
echo "테스트 서버 배포 완료"
72-
EOF
72+
EOF

app/(landing)/page.tsx

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ export default async function Landing() {
8080
<div className="relative z-10 flex flex-col items-center justify-center gap-400">
8181
<div>
8282
<p className="font-bold-h1 text-text-strong flex flex-col items-center">
83-
<span>기획자, 개발자 디자이너를 위한</span>
84-
<span>프리미엄 멤버십 플랫폼</span>
83+
<span>IT 업계 선배들이 진행하는</span>
84+
<span>프리미엄 실전 스터디/외주 플랫폼</span>
8585
</p>
8686

8787
<p className="text-text-subtle font-designer-16m mt-200 flex flex-col items-center">
@@ -208,17 +208,22 @@ export default async function Landing() {
208208

209209
<div className="mt-200 flex flex-col gap-300">
210210
<p className="font-bold-h2 text-text-strong flex flex-col">
211-
<span>사전 등록하고</span>
212-
<span>패키지 혜택을 받아보세요</span>
211+
<span>당신을 위한 스터디가 준비중입니다!</span>
212+
{/* <span>연락드릴게요!</span> */}
213213
</p>
214214

215215
<p className="text-text-subtle font-designer-16m flex flex-col">
216-
<span>사전 등록 이용자 한정으로 특별한 선물을 준비했어요.</span>
216+
<span>현재 멘토님들이 스터디 개설을 준비하고 있어요.</span>
217+
<br />
217218
<span>
218-
오픈 알림을 신청하시면 멘토링, 스터디, 외주 프로젝트 개설에
219-
대한
219+
알림을 신청하시면 나의 관심분야에 대한
220220
</span>
221-
<span>정보를 가장 먼저 알려드릴게요.</span>
221+
<span>
222+
오픈 정보를 가장 먼저 알려드릴게요.
223+
</span>
224+
{/* <span>정보를 가장 먼저 알려드릴게요.</span> */}
225+
<br />
226+
<span>(선착순 모집 마감시에는 알림이 발송되지 않을 수 있습니다)</span>
222227
</p>
223228
</div>
224229
</div>

app/api/notify-user-by-email/route.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@ export async function POST(request: NextRequest) {
66
const body = await request.json();
77

88
// 폼 데이터 유효성 검사
9-
const { email, type, features, consultation, agreeTerms } = body;
9+
const { email, type, experience, features, consultation, agreeTerms } = body;
1010

1111
if (
1212
!email ||
1313
!type ||
14+
!experience ||
1415
!features ||
1516
!Array.isArray(features) ||
1617
agreeTerms === undefined
@@ -34,6 +35,7 @@ export async function POST(request: NextRequest) {
3435
const formData: LandingFormData = {
3536
email,
3637
type,
38+
experience,
3739
features,
3840
consultation: consultation || '',
3941
agreeTerms,

src/shared/lib/google-sheets.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { google } from 'googleapis';
33
// Google Sheets API 설정
44
const SCOPES = ['https://www.googleapis.com/auth/spreadsheets'];
55
const SPREADSHEET_ID = process.env.NEXT_PUBLIC_GOOGLE_SHEETS_ID || '';
6-
const RANGE = 'A:F'; // A부터 F열까지 사용 (시트 이름 없이)
6+
const RANGE = 'A:G'; // A부터 G열까지 사용 (시트 이름 없이)
77

88
// Google Sheets API 클라이언트 초기화
99
async function getSheetsClient() {
@@ -23,6 +23,7 @@ async function getSheetsClient() {
2323
export interface LandingFormData {
2424
email: string;
2525
type: string;
26+
experience: string;
2627
features: string[];
2728
consultation: string;
2829
agreeTerms: boolean;
@@ -35,11 +36,12 @@ export async function addToGoogleSheets(data: LandingFormData): Promise<void> {
3536
const sheets = await getSheetsClient();
3637

3738
// 헤더가 없는 경우 헤더 추가
38-
const headerRange = 'A1:F1';
39+
const headerRange = 'A1:G1';
3940
const headerValues = [
4041
[
4142
'이메일',
4243
'직무 유형',
44+
'경력',
4345
'관심 기능',
4446
'상담 내용',
4547
'개인정보 동의',
@@ -61,6 +63,7 @@ export async function addToGoogleSheets(data: LandingFormData): Promise<void> {
6163
[
6264
data.email,
6365
data.type,
66+
data.experience,
6467
data.features.join(', '),
6568
data.consultation,
6669
data.agreeTerms ? '동의' : '비동의',

src/widgets/landing/form.tsx

Lines changed: 119 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
'use client';
22

33
import { useState } from 'react';
4+
import { useRouter } from 'next/navigation';
45
import Button from '@/shared/ui/button';
56
import Checkbox from '@/shared/ui/checkbox';
67

78
export default function LandingForm() {
9+
const router = useRouter();
810
const [checked, setChecked] = useState<string[]>([]);
911
const [type, setType] = useState<string>('NONE');
12+
const [experience, setExperience] = useState<string>('NONE');
1013
const [email, setEmail] = useState<string>('');
1114
const [consultation, setConsultation] = useState<string>('');
1215
const [isSubmitting, setIsSubmitting] = useState<boolean>(false);
@@ -25,7 +28,13 @@ export default function LandingForm() {
2528
}
2629

2730
if (type === 'NONE') {
28-
alert('직무 유형을 선택해주세요.');
31+
alert('어느 분야에서 활동하고 계신가요?');
32+
33+
return;
34+
}
35+
36+
if (experience === 'NONE') {
37+
alert('경력이 얼마나 되시나요?');
2938

3039
return;
3140
}
@@ -51,6 +60,7 @@ export default function LandingForm() {
5160
body: JSON.stringify({
5261
email: email.trim(),
5362
type,
63+
experience,
5464
features: checked.filter((item) => item !== 'AGREE_TERMS_OF_SERVICE'),
5565
consultation: consultation.trim(),
5666
agreeTerms: checked.includes('AGREE_TERMS_OF_SERVICE'),
@@ -64,8 +74,11 @@ export default function LandingForm() {
6474
// 폼 초기화
6575
setEmail('');
6676
setType('NONE');
77+
setExperience('NONE');
6778
setChecked([]);
6879
setConsultation('');
80+
// 로그인 페이지로 이동
81+
router.push('/login');
6982
} else {
7083
alert(result.error || '오류가 발생했습니다.');
7184
}
@@ -109,109 +122,170 @@ export default function LandingForm() {
109122
<option value="FRONTEND">프론트엔드 개발자</option>
110123
<option value="BACKEND">백엔드 개발자</option>
111124
<option value="PLANNER">서비스 기획자</option>
112-
<option value="DESIGNER">프로덕트 디자이너</option>
113-
<option value="UX_DESIGNER">UX 디자이너</option>
125+
<option value="DESIGNER">UI/UX 디자이너</option>
126+
<option value="MARKETER">마케터</option>
127+
<option value="OTHER">기타</option>
128+
</select>
129+
<div className="font-designer-16m mt-[32px] mb-[12px] text-[#444444]">
130+
경력이 얼마나 되시나요?
131+
</div>
132+
<select
133+
className={`h-[60px] w-full appearance-none rounded-[16px] bg-[#F2F2F2] bg-[url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTcgMTBMMTIgMTVMMTcgMTAiIHN0cm9rZT0iIzY2NjY2NiIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9zdmc+')] bg-no-repeat py-[18px] pr-[50px] pl-[24px] ${
134+
experience === 'NONE' ? 'text-[#999999]' : 'text-[#111111]'
135+
}`}
136+
style={{ backgroundPosition: 'calc(100% - 12px) center' }}
137+
value={experience}
138+
onChange={(e) => setExperience(e.target.value)}
139+
>
140+
<option value="NONE" hidden>
141+
경력을 선택해주세요.
142+
</option>
143+
<option value="NEWBIE">뉴비</option>
144+
<option value="JOBSEEKER">취업준비중(0년차)</option>
145+
<option value="JUNIOR">주니어(1-3년차)</option>
146+
<option value="MIDDLE">미들(4-6년차)</option>
147+
<option value="SENIOR">시니어(7년차 이상)</option>
114148
</select>
115149
<div className="font-designer-16m mt-[32px] mb-[12px] text-[#444444]">
116-
제로원에서 사용해보고 싶은 기능은 무엇인가요?
150+
제로원에서 가장 먼저 선보였으면 하는 기능은 무엇인가요?
117151
<span className="font-designer-14m text-[#FF4C4F]">
118152
*복수선택가능
119153
</span>
120154
</div>
121155

122-
<div className="flex flex-row gap-[16px]">
156+
<div className="grid grid-cols-2 gap-[16px]">
123157
<div className="flex flex-row gap-[11px]">
124158
<Checkbox
125-
id="STUDY"
126-
checked={checked.includes('STUDY')}
159+
id="TECH_INTERVIEW"
160+
checked={checked.includes('TECH_INTERVIEW')}
127161
onToggle={() => {
128162
setChecked(
129-
checked.includes('STUDY')
130-
? checked.filter((item) => item !== 'STUDY')
131-
: [...checked, 'STUDY'],
163+
checked.includes('TECH_INTERVIEW')
164+
? checked.filter((item) => item !== 'TECH_INTERVIEW')
165+
: [...checked, 'TECH_INTERVIEW'],
132166
);
133167
}}
134168
themeColor="#F63D68"
135169
/>
136170
<label
137-
htmlFor="STUDY"
171+
htmlFor="TECH_INTERVIEW"
138172
className="font-designer-16m text-[#767676]"
139173
>
140-
1:1 개인 스터디
174+
1:1 파트너 면접 스터디
141175
</label>
142176
</div>
143177
<div className="flex flex-row gap-[11px]">
144178
<Checkbox
145-
id="GROUP_STUDY"
146-
checked={checked.includes('GROUP_STUDY')}
179+
id="BOOK_STUDY"
180+
checked={checked.includes('BOOK_STUDY')}
147181
onToggle={() => {
148182
setChecked(
149-
checked.includes('GROUP_STUDY')
150-
? checked.filter((item) => item !== 'GROUP_STUDY')
151-
: [...checked, 'GROUP_STUDY'],
183+
checked.includes('BOOK_STUDY')
184+
? checked.filter((item) => item !== 'BOOK_STUDY')
185+
: [...checked, 'BOOK_STUDY'],
152186
);
153187
}}
154188
themeColor="#F63D68"
155189
/>
156190
<label
157-
htmlFor="GROUP_STUDY"
191+
htmlFor="BOOK_STUDY"
158192
className="font-designer-16m text-[#767676]"
159193
>
160-
단체 스터디 그룹
194+
책/인강 스터디
161195
</label>
162196
</div>
163197
<div className="flex flex-row gap-[11px]">
164198
<Checkbox
165-
id="OUTSOURCING"
166-
checked={checked.includes('OUTSOURCING')}
199+
id="MENTOR_TUTORING"
200+
checked={checked.includes('MENTOR_TUTORING')}
167201
onToggle={() => {
168202
setChecked(
169-
checked.includes('OUTSOURCING')
170-
? checked.filter((item) => item !== 'OUTSOURCING')
171-
: [...checked, 'OUTSOURCING'],
203+
checked.includes('MENTOR_TUTORING')
204+
? checked.filter((item) => item !== 'MENTOR_TUTORING')
205+
: [...checked, 'MENTOR_TUTORING'],
172206
);
173207
}}
174208
themeColor="#F63D68"
175209
/>
176210
<label
177-
htmlFor="OUTSOURCING"
211+
htmlFor="MENTOR_TUTORING"
178212
className="font-designer-16m text-[#767676]"
179213
>
180-
외주 프로젝트
214+
멘토 주도 1:1/그룹 과외형 스터디
181215
</label>
182216
</div>
183217
<div className="flex flex-row gap-[11px]">
184218
<Checkbox
185-
id="EXPERT_ANSWER"
186-
checked={checked.includes('EXPERT_ANSWER')}
219+
id="MISSION_CHALLENGE"
220+
checked={checked.includes('MISSION_CHALLENGE')}
187221
onToggle={() => {
188222
setChecked(
189-
checked.includes('EXPERT_ANSWER')
190-
? checked.filter((item) => item !== 'EXPERT_ANSWER')
191-
: [...checked, 'EXPERT_ANSWER'],
223+
checked.includes('MISSION_CHALLENGE')
224+
? checked.filter((item) => item !== 'MISSION_CHALLENGE')
225+
: [...checked, 'MISSION_CHALLENGE'],
192226
);
193227
}}
194228
themeColor="#F63D68"
195229
/>
196230
<label
197-
htmlFor="EXPERT_ANSWER"
231+
htmlFor="MISSION_CHALLENGE"
198232
className="font-designer-16m text-[#767676]"
199233
>
200-
전문가 답변 서비스
234+
미션인증 챌린지 스터디
235+
</label>
236+
</div>
237+
<div className="flex flex-row gap-[11px]">
238+
<Checkbox
239+
id="FUNDED_PROJECT"
240+
checked={checked.includes('FUNDED_PROJECT')}
241+
onToggle={() => {
242+
setChecked(
243+
checked.includes('FUNDED_PROJECT')
244+
? checked.filter((item) => item !== 'FUNDED_PROJECT')
245+
: [...checked, 'FUNDED_PROJECT'],
246+
);
247+
}}
248+
themeColor="#F63D68"
249+
/>
250+
<label
251+
htmlFor="FUNDED_PROJECT"
252+
className="font-designer-16m text-[#767676]"
253+
>
254+
펀딩받는 실전프로젝트 스터디
255+
</label>
256+
</div>
257+
<div className="flex flex-row gap-[11px]">
258+
<Checkbox
259+
id="OUTSOURCING"
260+
checked={checked.includes('OUTSOURCING')}
261+
onToggle={() => {
262+
setChecked(
263+
checked.includes('OUTSOURCING')
264+
? checked.filter((item) => item !== 'OUTSOURCING')
265+
: [...checked, 'OUTSOURCING'],
266+
);
267+
}}
268+
themeColor="#F63D68"
269+
/>
270+
<label
271+
htmlFor="OUTSOURCING"
272+
className="font-designer-16m text-[#767676]"
273+
>
274+
SI 외주 프로젝트
201275
</label>
202276
</div>
203277
</div>
204278

205279
<div className="font-designer-16m mt-[32px] mb-[12px] text-[#444444]">
206-
전문가에게 상담받고 싶은 고민거리가 있으시다면 자유롭게 적어주세요.
280+
요즘 계속 생각나는 고민(질문)이 있으시다면 자유롭게 적어주세요. 진심을 다해 돕겠습니다.
207281
</div>
208282
<textarea
209-
placeholder="Ex) 외주 프로젝트에 참여하고 싶은데 제로 베이스라 어디서부터 시작해야할지 잘 모르겠어요."
283+
placeholder="Ex) 3년차 프론트엔드 개발자고 외주를 하고 싶은데 어디서부터 시작해야할지 잘 모르겠어요. 그럴 실력이 되는지도 모르겠고... 팀을 찾고 같이 하면 좋을 것 같아요"
210284
value={consultation}
211285
onChange={(e) => setConsultation(e.target.value)}
212286
className="placeholder:font-designer-16m h-[120px] w-full resize-none rounded-[16px] bg-[#F2F2F2] px-[24px] py-[18px] placeholder:text-[#999999]"
213287
/>
214-
<div className="mt-[24px] flex flex-row gap-[11px]">
288+
<div className="mt-[24px] flex flex-row items-center gap-[11px]">
215289
<Checkbox
216290
id="AGREE_TERMS_OF_SERVICE"
217291
checked={checked.includes('AGREE_TERMS_OF_SERVICE')}
@@ -233,6 +307,14 @@ export default function LandingForm() {
233307
>
234308
개인정보 보호정책에 동의합니다.
235309
</label>
310+
311+
<button
312+
type="button"
313+
onClick={() => window.open('https://www.notion.so/gaan/13efbb391d7980cea50fc6864d60f4f7?p=29bfbb391d7980fba669f8d4de741021&pm=s', '_blank')}
314+
className="font-designer-14m text-[#F63D68] underline hover:text-[#E5353A]"
315+
>
316+
보기
317+
</button>
236318
</div>
237319

238320
<Button
@@ -241,7 +323,7 @@ export default function LandingForm() {
241323
className="text-font-designer-18m mt-[60px] h-[60px] w-full rounded-[16px] py-[16px]"
242324
disabled={isSubmitting}
243325
>
244-
오픈 알림 신청하기
326+
내 관심분야 스터디 오픈 알림 신청하기
245327
</Button>
246328
</div>
247329
</form>

0 commit comments

Comments
 (0)