Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
108 changes: 79 additions & 29 deletions src/components/screens/FaqScreen.jsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useState } from 'react';
import { ChevronDown, ChevronUp } from 'lucide-react';
import { ChevronDown, ChevronUp, TypeOutline } from 'lucide-react';

// FAQ 데이터
const faqData = {
Expand All @@ -12,70 +12,120 @@ const faqData = {
},
{
id: 2,
title: 'λΉ„λ°€λ²ˆν˜Έλ₯Ό μžŠμ–΄λ²„λ Έμ–΄μš”',
title: '둜그인이 μ•ˆλΌμš”.',
content:
"둜그인 νŽ˜μ΄μ§€μ—μ„œ 'λΉ„λ°€λ²ˆν˜Έ μ°ΎκΈ°'λ₯Ό ν΄λ¦­ν•˜μ‹œλ©΄ κ°€μž…ν•˜μ‹  μ΄λ©”μΌλ‘œ μž¬μ„€μ • 링크λ₯Ό λ³΄λ‚΄λ“œλ¦½λ‹ˆλ‹€.",
"이메일 λ˜λŠ” λΉ„λ°€λ²ˆν˜Έλ₯Ό λ‹€μ‹œ ν•œ 번 ν™•μΈν•΄μ£Όμ„Έμš”. SNS κ³„μ •μœΌλ‘œ κ°€μž…ν•œ 경우, λ™μΌν•œ 둜그인 방식을 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.",
},
{
id: 3,
title: '둜그인이 μ•ˆλΌμš”',
title: 'νšŒμ› νƒˆν‡΄λŠ” μ–΄λ–»κ²Œ ν•˜λ‚˜μš”?',
content:
'이메일과 λΉ„λ°€λ²ˆν˜Έλ₯Ό μ •ν™•νžˆ μž…λ ₯ν–ˆλŠ”μ§€ ν™•μΈν•΄μ£Όμ„Έμš”. λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•©λ‹ˆλ‹€.',
'λ§ˆμ΄νŽ˜μ΄μ§€ β†’ βš™οΈ -> νšŒμ›μ •λ³΄μˆ˜μ • λ©”λ‰΄μ—μ„œ β€œνšŒμ› νƒˆν‡΄β€λ₯Ό μ„ νƒν•˜λ©΄ μ¦‰μ‹œ νƒˆν‡΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€.',
},
{
id: 8,
title: 'μ†Œμ…œ λ‘œκ·ΈμΈμ€ μ–΄λ–€ 계정을 μ§€μ›ν•˜λ‚˜μš”?',
content:
'ν˜„μž¬ 카카였 λ‘œκ·ΈμΈμ„ μ§€μ›ν•˜κ³  있으며, μΆ”ν›„ 넀이버 및 ꡬ글 계정 연동도 좔가될 μ˜ˆμ •μž…λ‹ˆλ‹€.',
},
{
id: 9,
title: 'νšŒμ›μ •λ³΄λŠ” μ–΄λ–»κ²Œ μˆ˜μ •ν•  수 μžˆλ‚˜μš”?',
content:
'λ§ˆμ΄νŽ˜μ΄μ§€ β†’ βš™οΈ -> νšŒμ›μ •λ³΄μˆ˜μ • λ©”λ‰΄μ—μ„œ λ‹‰λ„€μž„, ν”„λ‘œν•„ 이미지 λ“± κΈ°λ³Έ 정보λ₯Ό μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.',
},
],

포인트: [
{
id: 4,
title: 'ν¬μΈνŠΈλŠ” μ–΄λ–»κ²Œ μ λ¦½λ˜λ‚˜μš”?',
content:
'μ˜μˆ˜μ¦μ΄λ‚˜ μ΄μš©λ‚΄μ—­ 사진을 μ°μ–΄μ„œ 올리면 μžλ™ 인식 ν›„ ν¬μΈνŠΈκ°€ μ λ¦½λ©λ‹ˆλ‹€',
'μ˜μˆ˜μ¦μ΄λ‚˜ μ΄μš©λ‚΄μ—­ 사진을 μ—…λ‘œλ“œν•˜λ©΄ μžλ™ 인식 ν›„ ν¬μΈνŠΈκ°€ μ λ¦½λ©λ‹ˆλ‹€. 일뢀 μ±Œλ¦°μ§€λ‚˜ 이벀트 μ°Έμ—¬ μ‹œμ—λ„ μΆ”κ°€ 적립이 κ°€λŠ₯ν•©λ‹ˆλ‹€.',
},
{
id: 5,
title: '포인트 μœ νš¨κΈ°κ°„μ€ μ–Όλ§ˆλ‚˜ λ˜λ‚˜μš”?',
content:
'μ λ¦½μΌλ‘œλΆ€ν„° 3λ…„κ°„ μœ νš¨ν•©λ‹ˆλ‹€. μœ νš¨κΈ°κ°„μ΄ μ§€λ‚˜λ©΄ μžλ™μœΌλ‘œ μ†Œλ©Έλ©λ‹ˆλ‹€.',
'μ λ¦½μΌλ‘œλΆ€ν„° 평생 μœ νš¨ν•©λ‹ˆλ‹€. 단, μž₯κΈ° 미이용 μ‹œ 휴면 정책에 따라 μ•ˆλ‚΄ ν›„ μ†Œλ©Έλ  수 μžˆμŠ΅λ‹ˆλ‹€.',
},
{
id: 6,
title: '포인트λ₯Ό μ–΄λ–»κ²Œ μ΄μš©ν•  수 μžˆλ‚˜μš”? ',
title: '포인트λ₯Ό μ–΄λ–»κ²Œ μ΄μš©ν•  수 μžˆλ‚˜μš”?',
content:
'κΈ°ν”„ν‹°μ½˜μœΌλ‘œ κ΅ν™˜ν•˜κ±°λ‚˜, 1만 포인트 이상이면 본인 κ³„μ’Œλ‘œ ν˜„κΈˆ 좜금이 κ°€λŠ₯ν•©λ‹ˆλ‹€.',
'κΈ°ν”„ν‹°μ½˜ κ΅ν™˜, 캠페인 κΈ°λΆ€, 1만 포인트 이상일 경우 ν˜„κΈˆ 좜금이 κ°€λŠ₯ν•©λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ 포인트 이용 μ•ˆλ‚΄λ₯Ό μ°Έκ³ ν•˜μ„Έμš”.',
},
{
id: 10,
title: 'ν¬μΈνŠΈκ°€ μ λ¦½λ˜μ§€ μ•Šμ•˜μ–΄μš”.',
content:
'이미 인증된 μ˜μˆ˜μ¦μ΄κ±°λ‚˜ 인식이 μ‹€νŒ¨ν•œ 경우일 수 μžˆμŠ΅λ‹ˆλ‹€. β€œ1:1 λ¬Έμ˜ν•˜κΈ°β€ λ₯Ό 톡해 사진과 상황을 μ•Œλ €μ£Όμ‹œλ©΄ 확인 ν›„ μ²˜λ¦¬ν•΄λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.',
},
{
id: 11,
title: '포인트 μΆœκΈˆμ€ μ–΄λ–»κ²Œ ν•˜λ‚˜μš”?',
content:
'1만 포인트 이상 보유 μ‹œ λ§ˆμ΄νŽ˜μ΄μ§€ β†’ 포인트 β†’ β€œμΆœκΈˆ 신청” λ²„νŠΌμ„ 눌러 본인 λͺ…μ˜ κ³„μ’Œλ‘œ μ†‘κΈˆλ°›μ„ 수 μžˆμŠ΅λ‹ˆλ‹€.',
},
{
id: 12,
title: 'μ±Œλ¦°μ§€ μ°Έμ—¬ μ‹œ ν¬μΈνŠΈκ°€ μΆ”κ°€λ˜λ‚˜μš”?',
content:
'μ±Œλ¦°μ§€μ— 따라 νšλ“ 포인트 정보λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.',
},
],

고객지원: [
{
id: 7,
title: '고객센터 μš΄μ˜μ‹œκ°„μ€?',
content:
'평일 μ˜€μ „ 9μ‹œλΆ€ν„° μ˜€ν›„ 6μ‹œκΉŒμ§€ μš΄μ˜λ©λ‹ˆλ‹€. 주말 및 κ³΅νœ΄μΌμ€ νœ΄λ¬΄μž…λ‹ˆλ‹€.',
},
{
id: 13,
title: '1:1 λ¬Έμ˜λŠ” μ–΄λ–»κ²Œ ν•˜λ‚˜μš”?',
content:
'FAQ ν•˜λ‹¨μ˜ β€œ1:1 λ¬Έμ˜ν•˜κΈ°β€ λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄ 문의 νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•©λ‹ˆλ‹€. μ ‘μˆ˜λœ λ¬Έμ˜λŠ” 평균 24μ‹œκ°„ 이내 λ‹΅λ³€λ©λ‹ˆλ‹€.',
},
{
id: 14,
title: 'μ„œλΉ„μŠ€ 였λ₯˜λ₯Ό λ°œκ²¬ν–ˆμ–΄μš”.',
content:
'λ°œκ²¬ν•œ 였λ₯˜λ‚˜ κ°œμ„ μ‚¬ν•­μ€ [email protected] 으둜 λ³΄λ‚΄μ£Όμ„Έμš”. λΉ λ₯΄κ²Œ κ²€ν†  ν›„ λ°˜μ˜ν•˜κ² μŠ΅λ‹ˆλ‹€.',
},
{
id: 15,
title: 'μ œνœ΄λ‚˜ ν˜‘μ—… λ¬Έμ˜λŠ” μ–΄λ””λ‘œ ν•˜λ©΄ λ˜λ‚˜μš”?',
content:
'ν™˜κ²½ κΈ°μ—…, λ‹¨μ²΄μ™€μ˜ 제휴λ₯Ό ν™˜μ˜ν•©λ‹ˆλ‹€. [email protected] 으둜 메일을 λ³΄λ‚΄μ£Όμ‹œλ©΄ λ‹΄λ‹Ήμžκ°€ 확인 ν›„ μ—°λ½λ“œλ¦½λ‹ˆλ‹€.',
},

],
};


// κ°œλ³„ FAQ μ•„μ΄ν…œ μ»΄ν¬λ„ŒνŠΈ
function FaqItem({ faq, isOpen, onToggle }) {
return (
<div className='border-b border-gray-200'>
<button
onClick={onToggle}
className='w-full flex items-center justify-between p-5 text-left hover:bg-gray-50 transition'
>
<span className='font-medium text-gray-800'>{faq.title}</span>
{isOpen ? (
<ChevronUp
className='text-gray-500 flex-shrink-0'
size={20}
/>
) : (
<ChevronDown
className='text-gray-500 flex-shrink-0'
size={20}
/>
)}
</button>
<button
onClick={onToggle}
className={`w-full flex items-center justify-between p-5 text-left transition
${isOpen ? 'bg-white-50' : 'hover:bg-white-50'}
focus:outline-none focus:ring-0 focus-visible:outline-none`}
>
<span className='font-medium text-gray-800'>{faq.title}</span>
{isOpen ? (
<ChevronUp className='text-gray-500 flex-shrink-0' size={20} />
) : (
<ChevronDown className='text-gray-500 flex-shrink-0' size={20} />
)}
</button>


{isOpen && (
<div className='px-5 pb-5 text-gray-600 leading-relaxed'>
<div className='px-5 pt-7 pb-7 text-gray-600 leading-relaxed'>
{faq.content}
</div>
)}
Expand Down Expand Up @@ -108,7 +158,7 @@ export default function FaqScreen() {
</div>

{/* νƒ­ 메뉴 */}
<div className='flex gap-2 mb-6 bg-white rounded-lg p-2 shadow-sm'>
<div className='flex gap-2 mb-6 bg-white rounded-lg p-2 shadow-sm '>
{tabs.map((tab) => (
<button
key={tab}
Expand All @@ -122,7 +172,7 @@ export default function FaqScreen() {
: 'bg-white text-gray-600 hover:bg-gray-100'
}`}
>
{tab}
{tab}
</button>
))}
</div>
Expand Down
46 changes: 24 additions & 22 deletions src/components/screens/LoginSignupScreen.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ const styles = `
.hint{ font-size:.85rem; color:#6b7280; margin-top:6px; }
.error{ font-size:.85rem; color:#e11d48; margin-top:6px; }
.btn{ width:100%; padding:12px 14px; border-radius:12px; border:0; background:var(--brand); color:#fff; font-weight:800; cursor:pointer; margin-top:6px;}
button:focus{ outline:none; box-shadow:none; }
.btn:disabled{ opacity:.5; cursor:not-allowed; }
.kakao{ width:100%; margin-top:12px; padding:12px 14px; border-radius:12px; border:0;
background:#FEE500; color:#3C1E1E; font-weight:700; cursor:pointer; }
Expand All @@ -65,7 +66,6 @@ const styles = `
}
`;

/* βœ… λͺ¨λ‹¬ μ»΄ν¬λ„ŒνŠΈ */
function Modal({ message, type = 'info', onClose }) {
const handleClick = () => {
if (type === 'success') {
Expand Down Expand Up @@ -161,27 +161,29 @@ export default function LoginSignupScreen() {
<HomeScreen />
)}

{!userInfo && (
<button
onClick={kakaoLogin}
style={{
width: '100%',
marginTop: '12px',
borderRadius: '12px',
overflow: 'hidden',
padding: 0,
}}
>
<img
src={kakaoBtn}
alt="카카였 둜그인"
style={{ width: '100%', display: 'block' }}
/>
</button>
)}

{!userInfo && page === 'login' && (
<button
onClick={kakaoLogin}
style={{
width: '100%',
marginTop: '12px',
borderRadius: '12px',
overflow: 'hidden',
padding: 0,
}}
>
<img
src={kakaoBtn}
alt="카카였 둜그인"
style={{ width: '100%', display: 'block' }}
/>
</button>
)}

</div>

{/* βœ… λͺ¨λ‹¬ ν‘œμ‹œ */}

{modal && (
<Modal
message={modal.message}
Expand Down Expand Up @@ -324,13 +326,13 @@ function SignupForm({ setPage, setModal }) {
try {
await api.post('/member', { email, password, nickname });
setModal({
message: 'νšŒμ›κ°€μž… μ™„λ£Œ! λ‘œκ·ΈμΈν•΄μ£Όμ„Έμš” 🌿',
message: 'νšŒμ›κ°€μž… 성곡 λ‘œκ·ΈμΈν•΄μ£Όμ„Έμš”',
type: 'success',
});
setTimeout(() => setPage('login'), 1000);
} catch {
setModal({
message: 'νšŒμ›κ°€μž… μ‹€νŒ¨. λ‹€μ‹œ μ‹œλ„ν•΄μ£Όμ„Έμš” πŸ‚',
message: 'λ‹€μ‹œ μ‹œλ„ν•΄μ£Όμ„Έμš”',
type: 'error',
});
}
Expand Down