/* ============================================================ Экран «Мой профиль» — #/me Работает для всех ролей: manager, staff, client ============================================================ */ const MeScreen = (function () { function escHtml(s) { return String(s == null ? "" : s) .replace(/&/g, "&").replace(//g, ">").replace(/"/g, """); } async function _fetchWithTimeout(url, body, ms = 15000) { const ctrl = new AbortController(); const t = setTimeout(() => ctrl.abort(), ms); try { const res = await fetch(url, { method: "POST", signal: ctrl.signal, headers: { "Content-Type": "application/json" }, body: JSON.stringify(body) }); return await res.json(); } catch (e) { if (e.name === "AbortError") throw new Error("Сервер не отвечает"); throw e; } finally { clearTimeout(t); } } function header(container) { const h = document.createElement("header"); h.className = "podbor-header"; h.innerHTML = `
Мой профиль
`; h.querySelector(".podbor-back").addEventListener("click", () => { haptic && haptic("impact"); history.back(); }); container.appendChild(h); } function avatarBlock(initial, name, subtitle) { return `
${escHtml(initial)}
${escHtml(name)}
${subtitle ? `
${escHtml(subtitle)}
` : ""}
`; } function roleChip(label, color) { const colors = { gold: "#C5A55E", blue: "#3D7AB5", green: "#4A9E6A", muted: "var(--muted)" }; const c = colors[color] || colors.gold; return ` ${escHtml(label)} `; } function renderManager(container, me) { const u = me.user || {}; const statusLabel = me.status === "active" ? "✅ Активен" : me.status === "trial" ? "🟡 Пробный" : "🔴 Неактивен"; const statusColor = me.status === "active" ? "green" : me.status === "trial" ? "gold" : "muted"; const screen = document.createElement("div"); screen.className = "podbor-screen"; screen.innerHTML = ` ${avatarBlock(u.avatar_initial || "?", u.full_name || "Менеджер", u.salon || "")}
Статус доступа
Статус ${roleChip(statusLabel, statusColor)}
${me.status_until ? `
Активен до${escHtml(me.status_until)}
` : ""} ${u.salon ? `
Салон${escHtml(u.salon)}
` : ""}
Быстрый переход
`; screen.querySelectorAll("[data-href]").forEach(btn => { btn.addEventListener("click", () => { haptic && haptic("impact"); location.hash = btn.dataset.href; }); }); container.appendChild(screen); } function renderStaffMe(container, me) { const u = me.user || {}; const caps = me.capabilities || {}; const chips = [ caps.measurer && roleChip("замерщик", "blue"), caps.assembler && roleChip("сборщик", "green"), ].filter(Boolean).join(""); const screen = document.createElement("div"); screen.className = "podbor-screen"; screen.innerHTML = ` ${avatarBlock(u.avatar_initial || "?", u.full_name || "Сотрудник", "")}
${chips}
Мои задачи
${caps.measurer ? `` : ""} ${caps.measurer ? `` : ""} ${caps.assembler ? `` : ""}
`; screen.querySelectorAll("[data-href]").forEach(btn => { btn.addEventListener("click", () => { haptic && haptic("impact"); location.hash = btn.dataset.href; }); }); container.appendChild(screen); } function renderClientMe(container, me) { const u = me.user || {}; const mgr = me.manager || {}; const screen = document.createElement("div"); screen.className = "podbor-screen"; screen.innerHTML = ` ${avatarBlock(u.avatar_initial || "?", u.full_name || "Клиент", "Личный кабинет")} ${mgr.full_name ? `
Мой менеджер
Имя${escHtml(mgr.full_name)}
${mgr.salon ? `
Салон${escHtml(mgr.salon)}
` : ""}
` : ""}
`; screen.querySelectorAll("[data-href]").forEach(btn => { btn.addEventListener("click", () => { haptic && haptic("impact"); location.hash = btn.dataset.href; }); }); container.appendChild(screen); } async function mount(container) { container.innerHTML = ""; document.body.classList.remove("has-bottom-nav"); const oldNav = document.getElementById("bottom-nav"); if (oldNav) oldNav.remove(); header(container); const loading = document.createElement("div"); loading.className = "loader-inline"; loading.innerHTML = `
`; container.appendChild(loading); try { const me = await _fetchWithTimeout(`${BACKEND_URL}/api/me`, { initData: tg?.initData || "", initDataUnsafe: tg?.initDataUnsafe || null, }); loading.remove(); if (me.error) { container.appendChild(el(`
${escHtml(me.error)}
`)); return; } const role = me.role; if (role === "manager" || me.roles?.includes("manager")) { renderManager(container, me); } else if (role === "staff") { renderStaffMe(container, me); } else { renderClientMe(container, me); } } catch (e) { loading.remove(); container.appendChild(el(`
Ошибка: ${escHtml(e.message)}
`)); } } return { mount }; })();