diff --git a/public/js/app.js b/public/js/app.js
index 5fdca7f..3fc2174 100644
--- a/public/js/app.js
+++ b/public/js/app.js
@@ -2,9 +2,9 @@
const App = {
consentGiven: false,
isMobileMode: false,
+ _preReg: null, // callback после согласия
async init() {
- // Определяем: десктоп — стартуем в mobile-mode для удобства разработки
const isTouch = ('ontouchstart' in window) || navigator.maxTouchPoints > 0;
const smallScreen = window.innerWidth <= 768;
const savedMode = localStorage.getItem('buhapp.mode');
@@ -13,7 +13,6 @@ const App = {
} else if (savedMode === 'mobile') {
this.isMobileMode = true;
} else {
- // авто: если экран узкий — нативный мобильный, иначе мобильный-эмулятор
this.isMobileMode = !smallScreen;
}
this.applyMode();
@@ -22,24 +21,19 @@ const App = {
this.isMobileMode = !this.isMobileMode;
localStorage.setItem('buhapp.mode', this.isMobileMode ? 'mobile' : 'desktop');
this.applyMode();
- // оповестим карту чтобы она пересчитала размер
if (window.MapView?.map) {
setTimeout(() => window.MapView.map.invalidateSize(), 100);
}
};
- // bind tabbar
document.querySelectorAll('.tab').forEach(btn => {
btn.onclick = () => this.showView(btn.dataset.view);
});
- // restore tokens from localStorage
- API.Store.load();
-
- if (TG_APP.isAvailable && TG_APP.initData) {
- // авторизация через Telegram
+ if (TG_APP.isTelegram && TG_APP.user) {
try {
await API.Auth.loginWithTelegram(TG_APP.initData);
+ await API.Auth.me();
await this.checkConsent();
await this.maybeOnboard();
this.showView('map');
@@ -47,105 +41,108 @@ const App = {
this.showError('Не удалось войти через Telegram: ' + e.message);
}
} else if (API.Store.access) {
- // уже залогинен
try {
await API.Auth.me();
await this.checkConsent();
- await this.maybeOnboard();
this.showView('map');
} catch (e) {
API.Store.clear();
this.showError('Сессия истекла: ' + e.message);
}
} else {
- // WebApp открыт вне Telegram — предложим email login
- this.showEmailLogin();
+ // Вне Telegram — показать email login (но сначала согласия)
+ this.showWelcome();
}
- // bind input events for chat
- document.body.addEventListener('click', (e) => {
- const sendBtn = e.target.closest('#msg-send');
- if (sendBtn) { window.ChatView.send(); return; }
- const cancel = e.target.closest('#edit-cancel');
- if (cancel) { document.getElementById('msg-input').value = ''; document.getElementById('edit-bar').style.display='none'; return; }
- });
- document.body.addEventListener('keydown', (e) => {
- if (e.key === 'Enter' && e.target.id === 'msg-input') {
- if (!e.shiftKey) { e.preventDefault(); window.ChatView.send(); }
+ document.addEventListener('keydown', (e) => {
+ if (e.key === 'Enter' && !e.shiftKey && document.activeElement?.id === 'msg-input') return;
+ if (e.key === 'Escape') {
+ if (window.ChatView?.cleanup) window.ChatView.cleanup();
+ if (API.Store.access) this.showView('map');
}
});
},
+ applyMode() {
+ if (this.isMobileMode) {
+ document.body.classList.add('mobile-mode');
+ document.getElementById('mode-toggle').textContent = '🖥️ На весь экран';
+ } else {
+ document.body.classList.remove('mobile-mode');
+ document.getElementById('mode-toggle').textContent = '📱 Мобильный';
+ }
+ },
+
async checkConsent() {
- // проверяем на бэкенде — если все 4 уже приняты, не показываем
try {
const s = await API.ConsentApi.status();
- if (s.all_accepted) {
- return true;
- }
+ if (s.all_accepted) return true;
} catch (e) {
console.warn('consent status check failed', e);
}
+ // не показываем если нет авторизации — это для авторизованных
+ if (!API.Store.user) return true;
this.showConsent();
return false;
},
- // Показываем welcome-flow новому пользователю ОДИН раз.
- // Возвращает Promise, который резолвится когда пользователь прошёл/пропустил онбординг.
- async maybeOnboard() {
- if (!window.OnboardingView) {
- console.warn('[onboarding] OnboardingView not loaded');
- return;
- }
- if (OnboardingView.isDone()) return;
- const root = document.getElementById('app');
- await OnboardingView.render(root);
- },
-
showConsent() {
const ov = document.createElement('div');
ov.id = 'consent-overlay';
ov.innerHTML = `
🍻 Добро пожаловать в BuhApp
Приложение для поиска компании. Только для лиц 18+.
-
-
- ⚠️ Внимание: BuhApp — это платформа для знакомств и встреч с другими пользователями.
- Включает в себя риски, связанные с употреблением алкоголя и личными встречами.
-
-
- Пожалуйста, ознакомьтесь и примите следующие документы:
-
-
-
-
-
-
+
+
+ Перед тем как продолжить, прочти и прими:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Без принятия согласий пользование приложением невозможно.
Приложение для поиска компании (Telegram Mini App)
+
Вход
+
Войди или зарегистрируйся по email
-
- ⚠️ WebApp лучше открывать через Telegram — там авторизация автоматическая.
- Здесь можно зайти по email для тестирования.
-
@@ -192,15 +196,14 @@ const App = {
Введите email и пароль
- 🍻 BuhApp — приложение для лиц 18+. Встречи и употребление алкоголя — на свой риск.
- Принимая соглашение, вы подтверждаете совершеннолетие.
+ Регистрируясь, вы подтверждаете совершеннолетие (18+) и принимаете
+ соглашение.