/**
* 헤더 프로필 드롭다운
*/
(function initAuthHeader() {
const DEFAULT_AVATAR =
'data:image/svg+xml,' +
encodeURIComponent(
'',
);
let currentUser = null;
let dropdownOpen = false;
/**
* @param {string} key
* @param {string} fallback
* @returns {string}
*/
function t(key, fallback) {
if (window.UaPageI18n?.t) {
return window.UaPageI18n.t(key, fallback);
}
return fallback;
}
/**
* HTML 이스케이프
* @param {string} str
* @returns {string}
*/
function escapeHtml(str) {
return String(str ?? '')
.replace(/&/g, '&')
.replace(//g, '>')
.replace(/"/g, '"');
}
/**
* 드롭다운 닫기
*/
function closeDropdown() {
const dd = document.getElementById('auth-dropdown');
if (dd) dd.classList.remove('open');
dropdownOpen = false;
}
/**
* 아바타 이미지 src (캐시 무효화 포함)
* @param {object|null} user
* @returns {string}
*/
function resolveAvatarSrc(user) {
const raw = user?.avatarUrl;
if (!raw) return DEFAULT_AVATAR;
let src =
window.UaDeckApi?.resolveMediaUrl
? window.UaDeckApi.resolveMediaUrl(raw) || raw
: raw;
if (user?.updatedAt && src && !src.startsWith('data:')) {
src += (src.includes('?') ? '&' : '?') + 't=' + encodeURIComponent(user.updatedAt);
}
return src;
}
/**
* 표시용 닉네임
* @param {object|null} user
* @returns {string}
*/
function getDisplayName(user) {
if (!user) return '';
return String(user.username || user.displayName || '').trim();
}
/**
* 아바타 HTML
* @param {object|null} user
* @returns {string}
*/
function avatarHtml(user) {
const src = resolveAvatarSrc(user);
return ``;
}
/**
* 프로필 버튼 HTML (아바타 + 닉네임)
* @param {object|null} user
* @returns {string}
*/
function profileBtnHtml(user) {
const name = getDisplayName(user);
const avatar = avatarHtml(user);
if (!name) {
return `${avatar}`;
}
return `
${avatar}
${escapeHtml(name)}
`;
}
/**
* 드롭다운 메뉴 렌더
*/
function renderDropdown() {
const dd = document.getElementById('auth-dropdown');
if (!dd) return;
if (!currentUser) {
dd.innerHTML = `
${escapeHtml(t('authLogin', '로그인'))}
${escapeHtml(t('authSignup', '회원가입'))}
`;
return;
}
const adminLink =
currentUser.role === 'admin'
? `${escapeHtml(t('authAdmin', '관리자'))}`
: '';
dd.innerHTML = `