buhapp-telegram/public/js/views/settings.js
root c5f8ac67ad UX overhaul: единый стиль BuhApp на всех экранах
ДИЗАЙН-СИСТЕМА в app.css:
- --primary #FF6B35, --success #3dd68c, --danger #ff5c5c
- --bg #0f0f12, --bg-elev #1a1a22, --bg-input #121218
- Компоненты: .card-b, .row-b, .field-b, .btn-b, .switch-b, .chip, .avatar-b, .bubble-b, .composer-b, .toast-b, .stars-b, .pulse-b, .empty-b

ПЕРЕПИСАНЫ на единый стиль:

Settings:
- Карточка с аватаром пользователя
- Card-row для юр.документов (📄 / 🔒 / ⚠️)
- 'Выйти' — danger btn-b с state machine (idle→load→ok)

Profile:
- Карточка аватара + кнопка 'Загрузить фото' через multipart /api/v1/me/photo
- Поля: field-b (ctrl + hint)
- Чипы в chip-list, новый стиль с .on
- Счётчик bio символов
- 'Сохранить' со state machine + toast

Review (создание):
- Звёзды в stars-b с center hint
- textarea с counter
- switch-b 'Анонимно' (вместо checkbox)
- Submit со state machine + toast 'Спасибо за отзыв!'

UserReviews:
- Средний рейтинг + звёзды
- Список карточек с отзывами

Chats:
- Список с avatar-b + last message + время + badge непрочитанных
- Пустое состояние с эмодзи
- formatChatTime() — 'сейчас' / '5м' / '3ч' / '2д'

Chat (один):
- Header с аватаром и кнопками 👤 ⭐
- composer-b: 📎 + input + ➤ (sticky bottom)
- bubble-b .in / .out с .ticks.read
- Send со state + toast
- sendPhoto() для фоток в чате

App.js _toast(msg, kind):
- Единый toast-b с классами ok / err

Всё в одном стиле. CSS variables, padding 16, radius 14, no disabled кнопок.
2026-08-21 11:42:16 +00:00

68 lines
3.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Settings view — единый стиль BuhApp
const SettingsView = {
async render(root) {
const u = API.Store.user;
root.innerHTML = `
<div class="view">
<h1 style="margin:0 0 14px;font-size:22px;">⚙️ Настройки</h1>
<!-- Юзер -->
<div class="card-b">
<div style="display:flex;align-items:center;gap:14px;">
<div class="avatar-b">${escapeHtml(((u?.name || u?.email || '?')[0] || '?').toUpperCase())}</div>
<div style="flex:1;min-width:0;">
<div style="font-weight:600;font-size:16px;">${escapeHtml(u?.name || 'Без имени')}</div>
${u?.email ? `<div style="font-size:13px;color:var(--text-dim);margin-top:2px;">${escapeHtml(u.email)}</div>` : ''}
</div>
</div>
</div>
<!-- Юридические документы -->
<div class="row-list" style="margin-top:14px;">
<div class="card-b" style="padding:0;">
<a href="/legal/TERMS.html" target="_blank" style="text-decoration:none;color:inherit;">
<div class="row-b" style="border:0;background:transparent;">
<div class="title">📄 Пользовательское соглашение</div>
<div class="chev">›</div>
</div>
</a>
<a href="/legal/PRIVACY.html" target="_blank" style="text-decoration:none;color:inherit;">
<div class="row-b" style="border:0;background:transparent;border-top:1px solid var(--border);">
<div class="title">🔒 Политика конфиденциальности</div>
<div class="chev">›</div>
</div>
</a>
<a href="/legal/DISCLAIMER.html" target="_blank" style="text-decoration:none;color:inherit;">
<div class="row-b" style="border:0;background:transparent;border-top:1px solid var(--border);">
<div class="title">⚠️ Отказ от ответственности</div>
<div class="chev">›</div>
</div>
</a>
</div>
</div>
<div style="text-align:center;color:var(--text-mute);font-size:11px;margin:20px 0 8px;">v 0.7.0 · BuhApp</div>
<!-- Выйти — danger -->
<button class="btn-b danger" id="logout" style="margin-top:8px;">Выйти</button>
</div>
`;
document.getElementById('logout').onclick = async () => {
const ok = await TG_APP.showConfirm('Выйти из BuhApp?');
if (!ok) return;
const btn = document.getElementById('logout');
const orig = btn.textContent;
btn.className = 'btn-b danger load';
btn.textContent = '⏳ Выходим…';
try {
await fetch('https://buhapp.mygoodservice.ru/api/v1/auth/logout', { method: 'POST', credentials: 'include' });
} catch {}
btn.className = 'btn-b ok';
btn.textContent = '✓ Готово!';
App.onLogout();
setTimeout(() => location.reload(), 500);
};
},
};