{/* 편집 모드 하단 삭제 CTA — 선택이 있을 때만 노출 */}
{editing && selected.size > 0 && (
)}
);
}
function AccountScreen({ credits, unlimited = false, onOpenBilling, onOpenHelp, onToggleTheme, theme, userEmail, onLogout, authMode = "toss-anonymous" }) {
// toss-anonymous 모드에서는 email 이 없어요. 사용자 이름/아바타/로그아웃 버튼의
// 디폴트 카피를 "토스 자동 로그인" 정합성에 맞게 바꿔주는 게 핵심.
// 계정 화면 행(row) 정책 메모 (G-3 후속 정리, 2026-04 김인아 피드백 반영)
// - 결제 수단 / 결제 내역: 토스 미니앱은 카드/결제수단 등록을 토스 플랫폼이 직접
// 관리하기 때문에 앱 안에서 등록 화면으로 보낼 수 없다. 잘못된 기대를 만들지
// 않도록 두 행 모두 제거하고, "크레딧 충전하기" 버튼 하나로 결제 흐름을 모았다.
// - 알림: 푸시/인앱 알림 시스템이 아직 없어서 "켜져 있어요" 라는 표시가 거짓말.
// 기능이 들어오기 전까진 행 자체를 노출하지 않는다.
// - 개인정보와 보안: 별도 화면이 없고, 같은 내용이 도움말·이용 약관에서 다뤄진다.
// 중복이라 제거.
// - 도움말과 문의: 하단 탭의 "도움말" 화면으로 이동시킨다 (onOpenHelp).
// - 이용 약관과 개인정보 처리방침: window.openLegalSheet("terms") 그대로 유지.
const [scrolled, setScrolled] = useState(false);
const isTossMode = authMode === "toss-anonymous";
const localPart = userEmail ? userEmail.split("@")[0] : "";
// 토스 모드: 이메일이 없는 게 정상. 사용자 입장에선 "이미 로그인됨" 상태이므로
// "로그인 안 했어요" 같은 카피는 절대 노출하면 안 돼요.
const displayName = userEmail
? localPart
: (isTossMode ? "토스로 자동 로그인됐어요" : "로그인하고 시작해 보세요");
const displayEmail = userEmail
? userEmail
: (isTossMode ? "별도 가입 없이 바로 사용 중이에요" : "아직 로그인 안 했어요");
const avatarChar = userEmail
? (localPart[0] || "?").toUpperCase()
: (isTossMode ? "T" : "?");
return (
계정
setScrolled(e.currentTarget.scrollTop > 20)}>
계정
{avatarChar}
{displayName}
{displayEmail}
{/* 크레딧 지갑 카드 — 상단에 바로 노출 */}
{unlimited ? "분석 크레딧" : "남은 분석 크레딧"}
{unlimited ? (
<>
∞무제한
>
) : (
<>
{credits}회
>
)}
{unlimited ? (
베타 기간 동안 무제한으로 쓸 수 있어요
) : (
만료 기한 없어요
)}
{!unlimited && (
)}
{/* 결제 수단 / 결제 내역 / 알림 / 개인정보와 보안 행은 위 정책 메모 참고 — 모두 제거.
크레딧 충전은 위쪽 "크레딧 충전하기" 버튼으로 일원화. */}
{/* 로그아웃 버튼 정책
- toss-anonymous : 진짜 "로그아웃"은 불가(SDK가 같은 hash를 다시 줌).
대신 "내 데이터 초기화"로 라벨을 바꿔서 의미를 명확히 함.
signOut() 가 web-fallback hash 캐시를 비우고 새 hash 로 재부트스트랩 →
로컬 캐시/스토어가 깨끗해진 상태로 다시 진입.
- supabase-jwt : 기존 그대로 — userEmail 유무로 로그인/로그아웃 토글. */}
{isTossMode ? (
) : (
)}