From 592b3fcf4e84b0e3a98f9e8ef95d852bfff3b69b Mon Sep 17 00:00:00 2001 From: gahusb Date: Thu, 2 Jul 2026 14:15:30 +0900 Subject: [PATCH] =?UTF-8?q?chore(phase0):=20redirect=EC=97=90=20=EA=B0=80?= =?UTF-8?q?=EB=A6=B0=20=EC=A3=BD=EC=9D=80=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?4=EC=A2=85=20+=20=EC=A0=84=EC=9D=B4=20=EA=B3=A0=EC=95=84(Contac?= =?UTF-8?q?tForm=C2=B7freelance-portfolio)=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - /work → /outsourcing 리다이렉트에 가려진 app/work/page.tsx 제거 - /work/freelance → /outsourcing 리다이렉트에 가려진 freelance/ 디렉토리 제거 - /work/website → /portfolio 리다이렉트에 가려진 app/work/website/page.tsx 제거 - /music/packs → /products 리다이렉트에 가려진 app/music/packs/ 디렉토리 제거 - 유일 소비처(freelance/)가 삭제된 ContactForm.tsx 제거 - 유일 소비처(/work, /work/freelance)가 삭제된 freelance-portfolio.ts 제거 samples/** 8종과 layout.tsx는 유지됨. Co-Authored-By: Claude Opus 4.8 (1M context) --- app/components/ContactForm.tsx | 184 ------- app/music/packs/layout.tsx | 28 - app/music/packs/page.tsx | 301 ----------- app/work/freelance/layout.tsx | 27 - app/work/freelance/page.tsx | 644 ---------------------- app/work/page.tsx | 134 ----- app/work/website/page.tsx | 962 --------------------------------- lib/freelance-portfolio.ts | 81 --- 8 files changed, 2361 deletions(-) delete mode 100644 app/components/ContactForm.tsx delete mode 100644 app/music/packs/layout.tsx delete mode 100644 app/music/packs/page.tsx delete mode 100644 app/work/freelance/layout.tsx delete mode 100644 app/work/freelance/page.tsx delete mode 100644 app/work/page.tsx delete mode 100644 app/work/website/page.tsx delete mode 100644 lib/freelance-portfolio.ts diff --git a/app/components/ContactForm.tsx b/app/components/ContactForm.tsx deleted file mode 100644 index 905b3b0..0000000 --- a/app/components/ContactForm.tsx +++ /dev/null @@ -1,184 +0,0 @@ -'use client'; - -import { useState, useEffect, Suspense } from 'react'; -import { useSearchParams } from 'next/navigation'; -import { trackEvent } from '../../lib/gtag'; - -function ContactFormInner() { - const searchParams = useSearchParams(); - const [formData, setFormData] = useState({ - name: '', - phone: '', - email: '', - service: '외주 개발 문의', - message: '', - }); - const [status, setStatus] = useState<'idle' | 'loading' | 'success' | 'error'>('idle'); - const [errorMessage, setErrorMessage] = useState(''); - - useEffect(() => { - const serviceParam = searchParams.get('service'); - if (serviceParam) { - setFormData((prev) => ({ ...prev, service: serviceParam })); - } - }, [searchParams]); - - const handleSubmit = async (e: React.FormEvent) => { - e.preventDefault(); - setStatus('loading'); - setErrorMessage(''); - - try { - const response = await fetch('/api/contact', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(formData), - }); - const data = await response.json(); - if (!response.ok) throw new Error(data.error || '문의 전송에 실패했습니다.'); - setStatus('success'); - trackEvent('generate_lead', { - event_category: 'contact', - event_label: formData.service, - }); - setFormData({ name: '', phone: '', email: '', service: '외주 개발 문의', message: '' }); - setTimeout(() => setStatus('idle'), 5000); - } catch (error) { - setStatus('error'); - setErrorMessage(error instanceof Error ? error.message : '문의 전송에 실패했습니다.'); - } - }; - - const handleChange = ( - e: React.ChangeEvent - ) => { - setFormData((prev) => ({ ...prev, [e.target.name]: e.target.value })); - }; - - const fieldClass = - 'w-full px-3.5 py-2.5 text-sm border rounded-xl outline-none bg-white disabled:bg-slate-50 transition-colors focus:ring-2 focus:ring-[var(--jsm-accent)] focus:border-[var(--jsm-accent)]'; - - return ( -
-
-
- - -
-
- - -
-
- -
- - -
- -
- - -
- -
- -