diff --git a/src/Game.js b/src/Game.js index ff12580..42d98bb 100644 --- a/src/Game.js +++ b/src/Game.js @@ -106,6 +106,10 @@ function Game({ avatarUrl, gender }) { const [activeChat, setActiveChat] = useState(null); // Добавьте этот код в начало компонента Game, рядом с другими состояниями const [telegramContacts, setTelegramContacts] = useState([]); + const [tgLoading, setTgLoading] = useState(false); + const [tgError, setTgError] = useState(null); + const [sysTime, setSysTime] = useState(new Date()); + const isPhoneNarrow = true; // экран виртуального телефона — всегда узкий const [isIframeOpen, setIsIframeOpen] = useState(false); const [iframeUrl, setIframeUrl] = useState(''); @@ -188,7 +192,9 @@ function Game({ avatarUrl, gender }) { setAppsHidden(true); setActiveApp(appName); if (appName === "Telegram") { - loadTelegramContacts(); // Загрузка контактов при открытии + setTgError(null); + setTgLoading(true); + loadTelegramContacts().finally(() => setTgLoading(false)); } if (appName === "Chrome") { loadQuestsProgress(); @@ -1322,17 +1328,23 @@ function Game({ avatarUrl, gender }) { async function loadTelegramContacts() { const token = localStorage.getItem('token'); try { + setTgError(null); const res = await fetch('/api/users', { - headers: { Authorization: `Bearer ${token}` } + headers: { Authorization: `Bearer ${token}` }, + credentials: 'include', + cache: 'no-cache' }); if (res.ok) { const data = await res.json(); setTelegramContacts(data); } else { - console.error('Ошибка загрузки контактов Telegram'); + const txt = await res.text().catch(()=> ''); + console.error('Ошибка загрузки контактов Telegram', res.status, txt); + setTgError('Не удалось загрузить контакты'); } } catch (err) { console.error('Ошибка сети:', err); + setTgError('Проблема сети'); } } @@ -5519,127 +5531,69 @@ useEffect(() => { )} {activeApp === "Telegram" && ( -
-
-
Shipgram Messenger
+
+ {/* Заголовок приложения */} +
Shipgram
+ {/* Контент */} +
+ {/* Список контактов */} +
+
Контакты
+ {tgLoading && ( +
Загрузка…
+ )} + {tgError && ( +
{tgError}
+ )} + {!tgLoading && !tgError && telegramContacts.length === 0 && ( +
Контакты не найдены
+ )} + {telegramContacts.map((user) => ( +
setActiveChat(user)} style={{ padding: '10px 12px', display: 'flex', alignItems: 'center', gap: 8, cursor: 'pointer', color: '#111' }}> +
+ {user.firstName?.[0]}{user.lastName?.[0]}
- -
-
-
Contacts
-
- {telegramContacts.length === 0 && ( -
- {telegramContacts.length === 0 - ? "Загрузка контактов..." - : "Контакты не найдены"} -
- )} - {telegramContacts.map((user, index) => ( -
setActiveChat(user)} - > -
- {user.firstName} {user.lastName} -
-
- ))} -
-
-
- {activeChat && ( -
-

Чат с {activeChat.firstName} {activeChat.lastName}

- {/* Контейнер сообщений с прокруткой */} -
- {messages.length === 0 ? ( -

Нет сообщений

- ) : ( - messages.map((msg) => ( -
-
- {msg.message} -
-
- {new Date(msg.created_at).toLocaleTimeString()} -
-
- )) - )} -
- - {/* Поле ввода и кнопка отправки */} -
- setNewMessage(e.target.value)} - placeholder="Введите сообщение..." - style={{ - flex: 1, - padding: '8px', - borderRadius: '20px', - border: '1px solid #ddd' - }} - onKeyDown={(e) => { - if (e.key === 'Enter') sendMessage(); - }} - /> - -
-
- )} -
+
+
{user.firstName} {user.lastName}
+
Онлайн
-
- )} +
+ ))} +
+ {/* Область чата */} +
+ {activeChat && ( + <> +
+ {isPhoneNarrow && ( + + )} + {activeChat.firstName} {activeChat.lastName} +
+
+ {messages.length === 0 ? ( +

Нет сообщений

+ ) : ( + messages.map(msg => ( +
+
{msg.message}
+
+ )) + )} +
+
+ setNewMessage(e.target.value)} placeholder="Сообщение" onKeyDown={(e) => { if (e.key === 'Enter') sendMessage(); }} style={{ flex: 1, padding: '10px 12px', borderRadius: 12, border: '1px solid #ddd' }} /> + +
+ + )} + {!activeChat && ( +
Выберите контакт
+ )} +
+
+
+ )}