// Profile view (свой профиль) const ProfileView = { drinks: new Set(), activities: new Set(), purposes: new Set(), anonymous: false, DRINKS: [ ['beer', '🍺 Пиво'], ['wine', '🍷 Вино'], ['whiskey', '🥃 Виски'], ['vodka', '🍸 Водка'], ['cocktail', '🍹 Коктейль'], ['rum', '🥃 Ром'], ['gin', '🍸 Джин'], ['tequila', '🌵 Текила'], ['champagne', '🍾 Шампанское'], ['non_alcoholic', '🥤 Безалкогольное'], ], ACTIVITIES: [ ['walk', '🚶 Прогулка'], ['dinner', '🍽️ Ужин'], ['bar', '🍻 Бар'], ['cafe', '☕ Кафе'], ['travel', '✈️ Путешествие'], ['movie', '🎬 Кино'], ['concert', '🎵 Концерт'], ['sport', '⚽ Спорт'], ['gaming', '🎮 Игры'], ['reading', '📚 Чтение'], ], PURPOSES: [ ['chat', '💬 Пообщаться'], ['drink', '🍻 Выпить'], ['walk', '🌳 Погулять'], ['dinner', '🍽️ Поужинать'], ['travel', '✈️ Поехать'], ['friendship', '🤝 Дружба'], ['relationship', '❤️ Отношения'], ], async render(root) { try { const me = await API.Auth.me(); API.Store.user = me.user; const prefs = me.prefs || {}; this.drinks = new Set(prefs.drinks || []); this.activities = new Set(prefs.activities || []); this.purposes = new Set(prefs.purposes || []); this.renderForm(root, me.user); } catch (e) { root.innerHTML = '
Не удалось загрузить: ' + e.message + '
'; } }, renderForm(root, u) { root.innerHTML = `

👤 Профиль

${escapeHtml(u.name || '')}
${u.telegram_id ? `
@${escapeHtml(u.username || '')}
` : ''} ${u.telegram_id ? '' : `
${escapeHtml(u.email || '')}
`}

🍻 Что пью

🎯 Чем занимаюсь

💡 Цели

`; this.renderChips('p-drinks', this.DRINKS, this.drinks); this.renderChips('p-activities', this.ACTIVITIES, this.activities); this.renderChips('p-purposes', this.PURPOSES, this.purposes); document.getElementById('p-save').onclick = () => this.save(); }, renderChips(elId, items, selected) { const el = document.getElementById(elId); if (!el) { console.error('renderChips: no element', elId); return; } items.forEach(([key, label]) => { const chip = document.createElement('span'); chip.className = 'chip' + (selected.has(key) ? ' active' : ''); chip.textContent = label; chip.onclick = () => { try { if (selected.has(key)) selected.delete(key); else selected.add(key); chip.classList.toggle('active'); TG_APP.haptic('selection'); } catch (e) { console.warn('chip click err', e); } }; el.appendChild(chip); }); }, async save() { const btn = document.getElementById('p-save'); const orig = btn ? btn.textContent : null; if (btn) { btn.disabled = true; btn.textContent = '⏳ Сохраняю…'; } try { await API.Auth.updateMe({ name: document.getElementById('p-name').value.trim(), city: document.getElementById('p-city').value.trim(), bio: document.getElementById('p-bio').value.trim(), gender: document.getElementById('p-gender').value, }); await API.Auth.updatePrefs({ drinks: [...this.drinks], activities: [...this.activities], purposes: [...this.purposes], }); try { TG_APP.haptic('notification'); } catch {} App.toast('✓ Сохранено'); if (btn) { btn.textContent = '✓ Сохранено'; setTimeout(() => { btn.textContent = orig || 'Сохранить'; btn.disabled = false; }, 1500); } } catch (e) { console.error('save profile:', e); App.toast('⚠️ ' + e.message); TG_APP.showAlert('Ошибка сохранения: ' + e.message); if (btn) { btn.disabled = false; btn.textContent = orig || 'Сохранить'; } } }, }; window.ProfileView = ProfileView;