// frontend/components/settings/AccountTab.tsx — 프로필(이름·역할) 편집 + 로그인 정보 "use client"; import { useEffect, useState } from "react"; import { Avatar } from "@/components/Avatar"; import { Button } from "@/components/Button"; import { Icon } from "@/components/Icon"; import { logout } from "@/lib/auth"; import { settingsApi } from "@/lib/settings/api"; import { useMe } from "@/lib/hooks/useSettings"; import type { ToastFn } from "./SettingsClient"; const AUTH_ENABLED = process.env.NEXT_PUBLIC_AUTH_ENABLED === "true"; export function AccountTab({ toast }: { toast: ToastFn }) { const { data: me, isLoading, refresh } = useMe(); const [name, setName] = useState(""); const [role, setRole] = useState(""); const [saving, setSaving] = useState(false); useEffect(() => { if (me) { setName(me.name); setRole(me.role === "member" || me.role === "admin" ? me.role : me.role || ""); } }, [me]); const dirty = me ? name.trim() !== me.name || role.trim() !== (me.role ?? "") : false; const onSave = async () => { if (!name.trim()) { toast("이름을 입력해 주세요", "amber"); return; } setSaving(true); try { await settingsApi.updateProfile({ name: name.trim(), role: role.trim() }); await refresh(); toast("프로필을 저장했어요", "green"); } catch { toast("저장에 실패했어요", "coral"); } finally { setSaving(false); } }; const onLogout = async () => { await logout(); if (typeof window !== "undefined") window.location.assign("/login"); }; return (

계정

이름과 역할은 대시보드·아바타에 표시돼요.

{me?.name ?? (isLoading ? "불러오는 중…" : "지우")} {me?.email || "이메일 미설정"}
{me?.role === "admin" ? "관리자" : me?.role || "멤버"}
setName(e.target.value)} placeholder="표시 이름" />
setRole(e.target.value)} placeholder="예: 프로덕트 디자이너" />
로그인 세션 {AUTH_ENABLED ? "현재 기기에서 로그인되어 있어요." : "데모 모드 — 인증이 꺼져 있어요(AUTH_ENABLED=false)."}
{AUTH_ENABLED && ( )}
); }