From c1e49fb15d8edf5e0d0d3c2b5cb9ff610a2b44a5 Mon Sep 17 00:00:00 2001 From: mi Date: Fri, 21 Aug 2026 17:37:12 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B2=D0=B0=D1=8F=20=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D1=81=D0=B8=D1=8F=20=D0=BC=D0=BE=D0=B1=D0=B8=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BF=D1=80=D0=B8=D0=BB=D0=BE?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../login/messages/messages_ru.properties | 2 + .../keycloak/themes/han-phone/login/otp.ftl | 10 +- .../han-phone/login/resources/js/han-login.js | 50 +- .../.assets/icons/adaptive-foreground.png | Bin 0 -> 33134 bytes .../.assets/icons/adaptive-monochrome.png | Bin 0 -> 24995 bytes VM4_Expo-mobile/.assets/icons/icon.png | Bin 0 -> 62383 bytes VM4_Expo-mobile/.env.example | 7 + VM4_Expo-mobile/.gitignore | 16 + VM4_Expo-mobile/.npmrc | 1 + VM4_Expo-mobile/README.md | 28 + VM4_Expo-mobile/app.config.ts | 50 + VM4_Expo-mobile/app/_layout.tsx | 17 + VM4_Expo-mobile/app/auth/callback.tsx | 63 + VM4_Expo-mobile/app/diagnostics.tsx | 76 + VM4_Expo-mobile/app/dialogs/[dialogId].tsx | 263 + VM4_Expo-mobile/app/dialogs/index.tsx | 84 + VM4_Expo-mobile/app/index.tsx | 202 + VM4_Expo-mobile/app/notification/[id].tsx | 284 + VM4_Expo-mobile/app/notifications/index.tsx | 97 + VM4_Expo-mobile/app/profile.tsx | 145 + VM4_Expo-mobile/eas.json | 27 + VM4_Expo-mobile/package-lock.json | 8967 +++++++++++++++++ VM4_Expo-mobile/package.json | 47 + VM4_Expo-mobile/src/api.ts | 97 + VM4_Expo-mobile/src/app-context.tsx | 190 + VM4_Expo-mobile/src/auth.ts | 204 + .../src/components/AccordionSection.tsx | 71 + VM4_Expo-mobile/src/components/AppHeader.tsx | 92 + .../src/components/AuthLoadingView.tsx | 135 + .../src/components/ChatInputBar.tsx | 131 + .../src/components/ChatScreenHeader.tsx | 44 + .../src/components/ConsentModal.tsx | 228 + .../src/components/GuestAuthGate.tsx | 51 + VM4_Expo-mobile/src/components/HanLogo.tsx | 35 + .../src/components/MessageBubble.tsx | 147 + .../src/components/NotificationCard.tsx | 136 + .../src/components/NotificationCarousel.tsx | 152 + .../src/components/PopularQuestionsList.tsx | 59 + .../src/components/QuickActions.tsx | 139 + .../src/components/ScreenShell.tsx | 20 + VM4_Expo-mobile/src/config.ts | 16 + VM4_Expo-mobile/src/message-text.ts | 9 + VM4_Expo-mobile/src/native-files.ts | 96 + VM4_Expo-mobile/src/notification-actions.ts | 94 + VM4_Expo-mobile/src/notification-api.ts | 96 + VM4_Expo-mobile/src/notification-presenter.ts | 111 + VM4_Expo-mobile/src/oidc-device.ts | 62 + VM4_Expo-mobile/src/pending-intent.ts | 117 + VM4_Expo-mobile/src/realtime.ts | 269 + VM4_Expo-mobile/src/reconcile.ts | 12 + VM4_Expo-mobile/src/services.ts | 102 + VM4_Expo-mobile/src/session.ts | 10 + VM4_Expo-mobile/src/single-flight.ts | 11 + VM4_Expo-mobile/src/theme.ts | 38 + VM4_Expo-mobile/src/types.ts | 218 + VM4_Expo-mobile/src/ui.tsx | 68 + VM4_Expo-mobile/tests/unit/core.test.ts | 220 + .../tests/unit/notifications.test.ts | 158 + VM4_Expo-mobile/tsconfig.json | 26 + VM4_Expo-mobile/vitest.config.ts | 12 + 60 files changed, 14106 insertions(+), 6 deletions(-) create mode 100644 VM4_Expo-mobile/.assets/icons/adaptive-foreground.png create mode 100644 VM4_Expo-mobile/.assets/icons/adaptive-monochrome.png create mode 100644 VM4_Expo-mobile/.assets/icons/icon.png create mode 100644 VM4_Expo-mobile/.env.example create mode 100644 VM4_Expo-mobile/.gitignore create mode 100644 VM4_Expo-mobile/.npmrc create mode 100644 VM4_Expo-mobile/README.md create mode 100644 VM4_Expo-mobile/app.config.ts create mode 100644 VM4_Expo-mobile/app/_layout.tsx create mode 100644 VM4_Expo-mobile/app/auth/callback.tsx create mode 100644 VM4_Expo-mobile/app/diagnostics.tsx create mode 100644 VM4_Expo-mobile/app/dialogs/[dialogId].tsx create mode 100644 VM4_Expo-mobile/app/dialogs/index.tsx create mode 100644 VM4_Expo-mobile/app/index.tsx create mode 100644 VM4_Expo-mobile/app/notification/[id].tsx create mode 100644 VM4_Expo-mobile/app/notifications/index.tsx create mode 100644 VM4_Expo-mobile/app/profile.tsx create mode 100644 VM4_Expo-mobile/eas.json create mode 100644 VM4_Expo-mobile/package-lock.json create mode 100644 VM4_Expo-mobile/package.json create mode 100644 VM4_Expo-mobile/src/api.ts create mode 100644 VM4_Expo-mobile/src/app-context.tsx create mode 100644 VM4_Expo-mobile/src/auth.ts create mode 100644 VM4_Expo-mobile/src/components/AccordionSection.tsx create mode 100644 VM4_Expo-mobile/src/components/AppHeader.tsx create mode 100644 VM4_Expo-mobile/src/components/AuthLoadingView.tsx create mode 100644 VM4_Expo-mobile/src/components/ChatInputBar.tsx create mode 100644 VM4_Expo-mobile/src/components/ChatScreenHeader.tsx create mode 100644 VM4_Expo-mobile/src/components/ConsentModal.tsx create mode 100644 VM4_Expo-mobile/src/components/GuestAuthGate.tsx create mode 100644 VM4_Expo-mobile/src/components/HanLogo.tsx create mode 100644 VM4_Expo-mobile/src/components/MessageBubble.tsx create mode 100644 VM4_Expo-mobile/src/components/NotificationCard.tsx create mode 100644 VM4_Expo-mobile/src/components/NotificationCarousel.tsx create mode 100644 VM4_Expo-mobile/src/components/PopularQuestionsList.tsx create mode 100644 VM4_Expo-mobile/src/components/QuickActions.tsx create mode 100644 VM4_Expo-mobile/src/components/ScreenShell.tsx create mode 100644 VM4_Expo-mobile/src/config.ts create mode 100644 VM4_Expo-mobile/src/message-text.ts create mode 100644 VM4_Expo-mobile/src/native-files.ts create mode 100644 VM4_Expo-mobile/src/notification-actions.ts create mode 100644 VM4_Expo-mobile/src/notification-api.ts create mode 100644 VM4_Expo-mobile/src/notification-presenter.ts create mode 100644 VM4_Expo-mobile/src/oidc-device.ts create mode 100644 VM4_Expo-mobile/src/pending-intent.ts create mode 100644 VM4_Expo-mobile/src/realtime.ts create mode 100644 VM4_Expo-mobile/src/reconcile.ts create mode 100644 VM4_Expo-mobile/src/services.ts create mode 100644 VM4_Expo-mobile/src/session.ts create mode 100644 VM4_Expo-mobile/src/single-flight.ts create mode 100644 VM4_Expo-mobile/src/theme.ts create mode 100644 VM4_Expo-mobile/src/types.ts create mode 100644 VM4_Expo-mobile/src/ui.tsx create mode 100644 VM4_Expo-mobile/tests/unit/core.test.ts create mode 100644 VM4_Expo-mobile/tests/unit/notifications.test.ts create mode 100644 VM4_Expo-mobile/tsconfig.json create mode 100644 VM4_Expo-mobile/vitest.config.ts diff --git a/VM1_app/codebase/backend/keycloak/themes/han-phone/login/messages/messages_ru.properties b/VM1_app/codebase/backend/keycloak/themes/han-phone/login/messages/messages_ru.properties index 988f125..8383777 100644 --- a/VM1_app/codebase/backend/keycloak/themes/han-phone/login/messages/messages_ru.properties +++ b/VM1_app/codebase/backend/keycloak/themes/han-phone/login/messages/messages_ru.properties @@ -17,6 +17,8 @@ otpResendCountdown=Отправить повторно через otpResend=Отправить код снова authBack=Назад verifyOtp=Подтвердить +otpVerifying=Проверяем... +otpSubmitUnavailable=Не удалось отправить код. Проверьте соединение и попробуйте ещё раз. mockMode=Тестовый режим отправки кода phoneInvalid=Проверьте формат номера телефона. otpInvalid=Код неверен, истёк или уже использован. diff --git a/VM1_app/codebase/backend/keycloak/themes/han-phone/login/otp.ftl b/VM1_app/codebase/backend/keycloak/themes/han-phone/login/otp.ftl index 87814f6..b47209c 100644 --- a/VM1_app/codebase/backend/keycloak/themes/han-phone/login/otp.ftl +++ b/VM1_app/codebase/backend/keycloak/themes/han-phone/login/otp.ftl @@ -61,12 +61,18 @@ - - + <#if captchaEnabled!false> diff --git a/VM1_app/codebase/backend/keycloak/themes/han-phone/login/resources/js/han-login.js b/VM1_app/codebase/backend/keycloak/themes/han-phone/login/resources/js/han-login.js index ea9e1e8..899df1d 100644 --- a/VM1_app/codebase/backend/keycloak/themes/han-phone/login/resources/js/han-login.js +++ b/VM1_app/codebase/backend/keycloak/themes/han-phone/login/resources/js/han-login.js @@ -56,16 +56,28 @@ function initOtpForm() { var fields = Array.prototype.slice.call(document.querySelectorAll(".han-otp-digit")); + var form = document.getElementById("kc-otp-form"); var hidden = document.getElementById("otp"); var submit = document.getElementById("han-otp-submit"); - if (!fields.length || !hidden || !submit) return; + var submitError = document.getElementById("han-otp-submit-error"); + if (!fields.length || !form || !hidden || !submit) return; + var submitLabel = submit.textContent; + var submitting = false; + + function submitForm() { + if (typeof form.requestSubmit === "function") { + form.requestSubmit(); + return; + } + HTMLFormElement.prototype.submit.call(form); + } function syncOtp() { fields.forEach(function (field) { field.classList.toggle("han-filled", Boolean(field.value)); }); hidden.value = fields.map(function (field) { return field.value; }).join(""); - submit.disabled = hidden.value.length !== fields.length; + submit.disabled = submitting || hidden.value.length !== fields.length; } fields.forEach(function (field, index) { @@ -106,6 +118,22 @@ }); syncOtp(); + submit.addEventListener("click", function (event) { + event.preventDefault(); + syncOtp(); + if (submit.disabled || submitting) return; + submitting = true; + submit.disabled = true; + submit.textContent = submit.getAttribute("data-submitting-label") || submitLabel; + if (submitError) submitError.hidden = true; + submitForm(); + window.setTimeout(function () { + submitting = false; + submit.textContent = submitLabel; + syncOtp(); + if (submitError) submitError.hidden = false; + }, 12000); + }); var countdown = document.getElementById("han-resend-countdown"); var countdownValue = countdown && countdown.querySelector("strong"); @@ -126,9 +154,17 @@ } updateCountdown(); if (expiresAt > Date.now()) timer = window.setInterval(updateCountdown, 1000); - resend.addEventListener("click", function () { + resend.addEventListener("click", function (event) { if (document.getElementById("han-captcha-container")) return; - window.setTimeout(function () { resend.disabled = true; }, 0); + event.preventDefault(); + resend.disabled = true; + var action = document.createElement("input"); + action.type = "hidden"; + action.name = "otp_action"; + action.value = "resend"; + form.appendChild(action); + submitForm(); + window.setTimeout(function () { resend.disabled = false; }, 12000); }); } @@ -142,8 +178,11 @@ var widgetId = null; var executing = false; var pendingSubmitter = null; + var executionTimeout = null; function showError() { + if (executionTimeout) window.clearTimeout(executionTimeout); + executionTimeout = null; executing = false; if (pendingSubmitter) pendingSubmitter.disabled = false; pendingSubmitter = null; @@ -162,6 +201,8 @@ invisible: true, hl: "ru", callback: function (token) { + if (executionTimeout) window.clearTimeout(executionTimeout); + executionTimeout = null; if (!token || !pendingSubmitter) { showError(); return; @@ -209,6 +250,7 @@ if (pendingSubmitter) pendingSubmitter.disabled = true; tokenInput.value = ""; try { + executionTimeout = window.setTimeout(showError, 12000); window.smartCaptcha.execute(widgetId); } catch (_error) { showError(); diff --git a/VM4_Expo-mobile/.assets/icons/adaptive-foreground.png b/VM4_Expo-mobile/.assets/icons/adaptive-foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..68a425dfbc8471b4741e9f48cbee657dd0027012 GIT binary patch literal 33134 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 TUGOmk2t@Ja8@W;$qfh?}5lf(d literal 0 HcmV?d00001 diff --git a/VM4_Expo-mobile/.assets/icons/adaptive-monochrome.png b/VM4_Expo-mobile/.assets/icons/adaptive-monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..1d6c51eec7843ba6f17638d5e54c0eb85236241e GIT binary patch literal 24995 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 Lo(IT32BrTCWt6BY literal 0 HcmV?d00001 diff --git a/VM4_Expo-mobile/.assets/icons/icon.png b/VM4_Expo-mobile/.assets/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5e6227d6c338af91d4c1886bcced466784372b89 GIT binary patch literal 62383 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 BRj&X5 literal 0 HcmV?d00001 diff --git a/VM4_Expo-mobile/.env.example b/VM4_Expo-mobile/.env.example new file mode 100644 index 0000000..10972b1 --- /dev/null +++ b/VM4_Expo-mobile/.env.example @@ -0,0 +1,7 @@ +EXPO_PUBLIC_API_BASE_URL=https://chat.example.ru +EXPO_PUBLIC_AUTH_BASE_URL=https://chat.example.ru/auth +EXPO_PUBLIC_KEYCLOAK_REALM=han-chat +EXPO_PUBLIC_KEYCLOAK_CLIENT_ID=han-chat-frontend +EXPO_PUBLIC_APP_ENV=production-like + +# Только публичные значения. Service tokens, S3 credentials и OTP-код запрещены. diff --git a/VM4_Expo-mobile/.gitignore b/VM4_Expo-mobile/.gitignore new file mode 100644 index 0000000..ba26e7d --- /dev/null +++ b/VM4_Expo-mobile/.gitignore @@ -0,0 +1,16 @@ +node_modules/ +.expo/ +dist/ +.env +.env.* +!.env.example +*.log +android/ +ios/ +.DS_Store + +# @generated expo-cli sync-2b81b286409207a5da26e14c78851eb30d8ccbdb +# The following patterns were generated by expo-cli + +expo-env.d.ts +# @end expo-cli \ No newline at end of file diff --git a/VM4_Expo-mobile/.npmrc b/VM4_Expo-mobile/.npmrc new file mode 100644 index 0000000..521a9f7 --- /dev/null +++ b/VM4_Expo-mobile/.npmrc @@ -0,0 +1 @@ +legacy-peer-deps=true diff --git a/VM4_Expo-mobile/README.md b/VM4_Expo-mobile/README.md new file mode 100644 index 0000000..f087180 --- /dev/null +++ b/VM4_Expo-mobile/README.md @@ -0,0 +1,28 @@ +# HAN Chat Mobile + +Мобильный Android-клиент HAN Chat на Expo SDK 57. + +## Подготовка + +1. Установить Node.js и npm. +2. Скопировать `.env.example` в `.env` и указать адреса API и Keycloak. +3. Установить зависимости: + + ```bash + npm install + ``` + +4. Зарегистрировать `han-chat://auth/callback` как допустимый redirect URI клиента Keycloak. + +## Локальные проверки + +```bash +npm run typecheck +npm test +``` + +Запуск приложения выполняется отдельно командой `npm run android`. Проект использует managed Expo workflow и не хранит каталоги `android/` и `ios/`. + +## Сборка + +Профили development, preview и production определены в `eas.json`. Перед первой EAS-сборкой потребуется привязать Expo-проект и настроить signing credentials. diff --git a/VM4_Expo-mobile/app.config.ts b/VM4_Expo-mobile/app.config.ts new file mode 100644 index 0000000..cdc54e3 --- /dev/null +++ b/VM4_Expo-mobile/app.config.ts @@ -0,0 +1,50 @@ +import type { ExpoConfig } from "expo/config"; + +const config: ExpoConfig = { + name: "HAN Chat", + slug: "han-chat", + owner: "anzh", + version: "1.0.0", + scheme: "han-chat", + icon: "./.assets/icons/icon.png", + orientation: "portrait", + userInterfaceStyle: "light", + android: { + package: "ru.han.chat", + softwareKeyboardLayoutMode: "resize", + adaptiveIcon: { + foregroundImage: "./.assets/icons/adaptive-foreground.png", + monochromeImage: "./.assets/icons/adaptive-monochrome.png", + backgroundColor: "#4A0E1E", + }, + intentFilters: [ + { + action: "VIEW", + autoVerify: false, + data: [ + { + scheme: "han-chat", + host: "auth", + pathPrefix: "/callback", + }, + ], + category: ["BROWSABLE", "DEFAULT"], + }, + ], + }, + experiments: { + typedRoutes: true, + }, + extra: { + eas: { + projectId: "53d1a38c-f888-40ca-b485-58f5301e4dff", + }, + }, + plugins: [ + "expo-router", + "expo-secure-store", + "expo-document-picker", + ], +}; + +export default config; diff --git a/VM4_Expo-mobile/app/_layout.tsx b/VM4_Expo-mobile/app/_layout.tsx new file mode 100644 index 0000000..14a662b --- /dev/null +++ b/VM4_Expo-mobile/app/_layout.tsx @@ -0,0 +1,17 @@ +import { Stack } from "expo-router"; +import { StatusBar } from "expo-status-bar"; +import React from "react"; +import { SafeAreaProvider, SafeAreaView } from "react-native-safe-area-context"; +import { AppProvider } from "../src/app-context"; +import { colors } from "../src/theme"; + +export default function RootLayout() { + return + + + + + + + ; +} diff --git a/VM4_Expo-mobile/app/auth/callback.tsx b/VM4_Expo-mobile/app/auth/callback.tsx new file mode 100644 index 0000000..13ba5dd --- /dev/null +++ b/VM4_Expo-mobile/app/auth/callback.tsx @@ -0,0 +1,63 @@ +import { useLocalSearchParams, useRouter } from "expo-router"; +import React, { useEffect, useRef, useState } from "react"; +import { Text, View } from "react-native"; +import { clearPendingConsents, loadPendingConsents, useApp } from "../../src/app-context"; +import { AuthLoadingView } from "../../src/components/AuthLoadingView"; +import { ScreenShell } from "../../src/components/ScreenShell"; +import { pendingDialogKey, restorePendingIntents } from "../../src/pending-intent"; +import { spacing } from "../../src/theme"; +import { Button, ErrorNotice, styles } from "../../src/ui"; + +export default function AuthCallbackScreen() { + const params = useLocalSearchParams<{ code?: string; state?: string; error?: string }>(); + const app = useApp(); + const router = useRouter(); + const [error, setError] = useState(); + const completionStarted = useRef(false); + + const complete = async () => { + if (!params.code || !params.state) return; + const consents = await loadPendingConsents(); + if (!consents) throw new Error("Не найдены локально принятые согласия. Начните вход заново."); + setError(undefined); + await app.finishCallback(params.code, params.state, consents); + await clearPendingConsents(); + await restorePendingIntents(); + + if (pendingDialogKey()) { + router.replace("/dialogs?pending=1"); + return; + } + + router.replace("/"); + }; + + useEffect(() => { + if (completionStarted.current) return; + if (params.error) { + completionStarted.current = true; + setError(new Error("Авторизация отменена или отклонена.")); + return; + } + if (!params.code || !params.state) return; + completionStarted.current = true; + void complete().catch(setError); + }, [params.code, params.state, params.error]); + + return ( + + {!error ? ( + + ) : ( + + Не удалось завершить вход + <> + +