Integrate limits usage and exchange workspace #23

Merged
tech merged 8 commits from limits-22 into main 2026-09-12 10:12:33 +00:00
16 changed files with 86 additions and 306 deletions
Showing only changes of commit 54f50ad6b7 - Show all commits

No files matched your search

+18
View File
@@ -238,3 +238,21 @@ tests were needed. The PR is not merged.
unmerged. Task and PR have frontend label, tech owner and SXCHNGE project. unmerged. Task and PR have frontend label, tech owner and SXCHNGE project.
Browser demo walkthrough also completed exchange and payout, confirming source Browser demo walkthrough also completed exchange and payout, confirming source
currency handoffs and exact fee/debit/receipt values on the result screen. currency handoffs and exact fee/debit/receipt values on the result screen.
### Workspace copy cleanup — follow-up to #28
At the user's request, removed repeated demo/preview banners from the workspace,
transaction forms, auth, email confirmation, identity and limits. Confirmation
and result copy now uses ordinary product wording in EN/RU; the mobile wordmark
remains without the extra note. Removed unused localization entries and duplicate
email-state copy. Existing journey measurement, simulation flags, service behavior,
funds explanations and recovery controls are unchanged. Development constraints
belong in this record and package README, not repeated throughout the product UI.
Delivery continues in [PR #29](https://git.sendico.io/tech/sxchnge/pulls/29) on
`workspace-28`. This copy change does not connect real authentication, email,
payment, support or backoffice services.
Validation: all 115 frontend tests, app analysis, app Dart formatting, web build
and diff checks pass. Updated existing copy expectations; telemetry tests still
verify simulated events never count as real business success. No new click events
were needed for this presentation-only cleanup.
-5
View File
@@ -133,11 +133,6 @@ class _AuthFormState extends State<AuthForm> {
), ),
), ),
), ),
const SizedBox(height: 16),
Text(
l.earlyPreview,
style: text.bodySmall!.copyWith(color: colors.onSurfaceVariant),
),
const SizedBox(height: 24), const SizedBox(height: 24),
Text( Text(
_signUp ? l.signupHeading : l.loginHeading, _signUp ? l.signupHeading : l.loginHeading,
@@ -221,13 +221,13 @@ abstract class AppLocalizations {
/// No description provided for @loginPreview. /// No description provided for @loginPreview.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Demo login completed. No real session was created. Your credentials have not been sent or saved.'** /// **'You’re signed in.'**
String get loginPreview; String get loginPreview;
/// No description provided for @signupPreview. /// No description provided for @signupPreview.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Demo sign-up completed. No real account was created. Your credentials have not been sent or saved.'** /// **'Your account is ready.'**
String get signupPreview; String get signupPreview;
/// No description provided for @alreadyMember. /// No description provided for @alreadyMember.
@@ -254,12 +254,6 @@ abstract class AppLocalizations {
/// **'Create an account'** /// **'Create an account'**
String get createAnAccount; String get createAnAccount;
/// No description provided for @earlyPreview.
///
/// In en, this message translates to:
/// **'EARLY PREVIEW · Login and sign-up are not live yet.'**
String get earlyPreview;
/// No description provided for @brandEyebrow. /// No description provided for @brandEyebrow.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
@@ -476,16 +470,10 @@ abstract class AppLocalizations {
/// **'No email? Check your spam folder or request another below.'** /// **'No email? Check your spam folder or request another below.'**
String get verificationHint; String get verificationHint;
/// No description provided for @verificationDemo.
///
/// In en, this message translates to:
/// **'DEMO · No real email is sent and no account is verified.'**
String get verificationDemo;
/// No description provided for @verificationDemoLink. /// No description provided for @verificationDemoLink.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Open demo confirmation link'** /// **'Continue to confirmation'**
String get verificationDemoLink; String get verificationDemoLink;
/// No description provided for @verificationStep. /// No description provided for @verificationStep.
@@ -494,30 +482,6 @@ abstract class AppLocalizations {
/// **'CONFIRM YOUR EMAIL'** /// **'CONFIRM YOUR EMAIL'**
String get verificationStep; String get verificationStep;
/// No description provided for @demoSentHeading.
///
/// In en, this message translates to:
/// **'Demo email prepared.'**
String get demoSentHeading;
/// No description provided for @demoSentBody.
///
/// In en, this message translates to:
/// **'No email was sent. Use the demo confirmation below to preview the next step.'**
String get demoSentBody;
/// No description provided for @demoVerifiedHeading.
///
/// In en, this message translates to:
/// **'Demo verification\ncomplete.'**
String get demoVerifiedHeading;
/// No description provided for @demoVerifiedBody.
///
/// In en, this message translates to:
/// **'You’ve previewed email confirmation. No account was verified. Return to login to explore the demo.'**
String get demoVerifiedBody;
/// No description provided for @verificationRecipient. /// No description provided for @verificationRecipient.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
@@ -530,12 +494,6 @@ abstract class AppLocalizations {
/// **'Change email'** /// **'Change email'**
String get verificationChangeEmail; String get verificationChangeEmail;
/// No description provided for @demoResend.
///
/// In en, this message translates to:
/// **'Prepare demo email again'**
String get demoResend;
/// No description provided for @kycTitle. /// No description provided for @kycTitle.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
@@ -548,12 +506,6 @@ abstract class AppLocalizations {
/// **'Your account, at your pace. Verify your identity when you need higher limits.'** /// **'Your account, at your pace. Verify your identity when you need higher limits.'**
String get kycIntro; String get kycIntro;
/// No description provided for @kycDemo.
///
/// In en, this message translates to:
/// **'DEMO · Use sample images only. Photos stay in memory, are never uploaded, and disappear when you leave or reload. Review decisions are simulated.'**
String get kycDemo;
/// No description provided for @kycUnverified. /// No description provided for @kycUnverified.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
@@ -665,7 +617,7 @@ abstract class AppLocalizations {
/// No description provided for @kycSupportBody. /// No description provided for @kycSupportBody.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Support is not connected in this preview. In the live app, you will be able to request a review here without submitting documents again.'** /// **'Support is currently unavailable. Please try again later.'**
String get kycSupportBody; String get kycSupportBody;
/// No description provided for @kycBasic. /// No description provided for @kycBasic.
@@ -686,12 +638,6 @@ abstract class AppLocalizations {
/// **'Your limits'** /// **'Your limits'**
String get kycLimits; String get kycLimits;
/// No description provided for @kycLimitsDemo.
///
/// In en, this message translates to:
/// **'Illustrative limits from the demo service. These are not a live offer.'**
String get kycLimitsDemo;
/// No description provided for @kycDay. /// No description provided for @kycDay.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
@@ -815,7 +761,7 @@ abstract class AppLocalizations {
/// No description provided for @kycClose. /// No description provided for @kycClose.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Back to account preview'** /// **'Back to account'**
String get kycClose; String get kycClose;
/// No description provided for @kycReviewHelp. /// No description provided for @kycReviewHelp.
@@ -836,12 +782,6 @@ abstract class AppLocalizations {
/// **'Submit for review'** /// **'Submit for review'**
String get kycSubmit; String get kycSubmit;
/// No description provided for @kycSubmitDemo.
///
/// In en, this message translates to:
/// **'Simulate submission'**
String get kycSubmitDemo;
/// No description provided for @kycWorking. /// No description provided for @kycWorking.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
@@ -941,7 +881,7 @@ abstract class AppLocalizations {
/// No description provided for @kycDemoControls. /// No description provided for @kycDemoControls.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Demo: simulate a backoffice decision'** /// **'Review scenarios'**
String get kycDemoControls; String get kycDemoControls;
/// No description provided for @kycDemoApprove. /// No description provided for @kycDemoApprove.
@@ -1112,12 +1052,6 @@ abstract class AppLocalizations {
/// **'Refresh'** /// **'Refresh'**
String get wRefresh; String get wRefresh;
/// No description provided for @wDemo.
///
/// In en, this message translates to:
/// **'Demo workspace · No real money moves.'**
String get wDemo;
/// No description provided for @wSource. /// No description provided for @wSource.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
@@ -1151,7 +1085,7 @@ abstract class AppLocalizations {
/// No description provided for @wRecipientHint. /// No description provided for @wRecipientHint.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Sample recipient — demo only'** /// **'Recipient name or reference'**
String get wRecipientHint; String get wRecipientHint;
/// No description provided for @wReview. /// No description provided for @wReview.
@@ -1223,7 +1157,7 @@ abstract class AppLocalizations {
/// No description provided for @wConfirm. /// No description provided for @wConfirm.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Confirm demo transaction'** /// **'Confirm transaction'**
String get wConfirm; String get wConfirm;
/// No description provided for @wEdit. /// No description provided for @wEdit.
@@ -1310,18 +1244,6 @@ abstract class AppLocalizations {
/// **'The transaction did not complete. The amount and fee are available in your account again.'** /// **'The transaction did not complete. The amount and fee are available in your account again.'**
String get wFailedOutgoing; String get wFailedOutgoing;
/// No description provided for @wDemoMethod.
///
/// In en, this message translates to:
/// **'Demo transfer'**
String get wDemoMethod;
/// No description provided for @wDemoMethodHelp.
///
/// In en, this message translates to:
/// **'Try the flow with sample data. No bank or payment provider is contacted.'**
String get wDemoMethodHelp;
/// No description provided for @wUnavailable. /// No description provided for @wUnavailable.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
@@ -1463,7 +1385,7 @@ abstract class AppLocalizations {
/// No description provided for @wLanguageSaved. /// No description provided for @wLanguageSaved.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Saved to your demo account.'** /// **'Saved to your account.'**
String get wLanguageSaved; String get wLanguageSaved;
/// No description provided for @wLanguageFailed. /// No description provided for @wLanguageFailed.
@@ -1487,7 +1409,7 @@ abstract class AppLocalizations {
/// No description provided for @wSecurityBody. /// No description provided for @wSecurityBody.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Live sessions, password changes and two-step verification are not connected in this demo.'** /// **'Password and security settings are not available yet.'**
String get wSecurityBody; String get wSecurityBody;
/// No description provided for @wIdentity. /// No description provided for @wIdentity.
@@ -70,12 +70,10 @@ class AppLocalizationsEn extends AppLocalizations {
String get letsGo => 'Let’s go'; String get letsGo => 'Let’s go';
@override @override
String get loginPreview => String get loginPreview => 'You’re signed in.';
'Demo login completed. No real session was created. Your credentials have not been sent or saved.';
@override @override
String get signupPreview => String get signupPreview => 'Your account is ready.';
'Demo sign-up completed. No real account was created. Your credentials have not been sent or saved.';
@override @override
String get alreadyMember => 'Already part of sxchnge?'; String get alreadyMember => 'Already part of sxchnge?';
@@ -89,10 +87,6 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get createAnAccount => 'Create an account'; String get createAnAccount => 'Create an account';
@override
String get earlyPreview =>
'EARLY PREVIEW · Login and sign-up are not live yet.';
@override @override
String get brandEyebrow => 'A LITTLE CHANGE. A BIG NEXT STEP.'; String get brandEyebrow => 'A LITTLE CHANGE. A BIG NEXT STEP.';
@@ -211,38 +205,17 @@ class AppLocalizationsEn extends AppLocalizations {
'No email? Check your spam folder or request another below.'; 'No email? Check your spam folder or request another below.';
@override @override
String get verificationDemo => String get verificationDemoLink => 'Continue to confirmation';
'DEMO · No real email is sent and no account is verified.';
@override
String get verificationDemoLink => 'Open demo confirmation link';
@override @override
String get verificationStep => 'CONFIRM YOUR EMAIL'; String get verificationStep => 'CONFIRM YOUR EMAIL';
@override
String get demoSentHeading => 'Demo email prepared.';
@override
String get demoSentBody =>
'No email was sent. Use the demo confirmation below to preview the next step.';
@override
String get demoVerifiedHeading => 'Demo verification\ncomplete.';
@override
String get demoVerifiedBody =>
'You’ve previewed email confirmation. No account was verified. Return to login to explore the demo.';
@override @override
String get verificationRecipient => 'Recipient'; String get verificationRecipient => 'Recipient';
@override @override
String get verificationChangeEmail => 'Change email'; String get verificationChangeEmail => 'Change email';
@override
String get demoResend => 'Prepare demo email again';
@override @override
String get kycTitle => 'Verification & limits'; String get kycTitle => 'Verification & limits';
@@ -250,10 +223,6 @@ class AppLocalizationsEn extends AppLocalizations {
String get kycIntro => String get kycIntro =>
'Your account, at your pace. Verify your identity when you need higher limits.'; 'Your account, at your pace. Verify your identity when you need higher limits.';
@override
String get kycDemo =>
'DEMO · Use sample images only. Photos stay in memory, are never uploaded, and disappear when you leave or reload. Review decisions are simulated.';
@override @override
String get kycUnverified => 'Not verified'; String get kycUnverified => 'Not verified';
@@ -319,7 +288,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get kycSupportBody => String get kycSupportBody =>
'Support is not connected in this preview. In the live app, you will be able to request a review here without submitting documents again.'; 'Support is currently unavailable. Please try again later.';
@override @override
String get kycBasic => 'Basic'; String get kycBasic => 'Basic';
@@ -330,10 +299,6 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get kycLimits => 'Your limits'; String get kycLimits => 'Your limits';
@override
String get kycLimitsDemo =>
'Illustrative limits from the demo service. These are not a live offer.';
@override @override
String get kycDay => 'Daily volume'; String get kycDay => 'Daily volume';
@@ -400,7 +365,7 @@ class AppLocalizationsEn extends AppLocalizations {
String get kycSkip => 'Keep basic limits'; String get kycSkip => 'Keep basic limits';
@override @override
String get kycClose => 'Back to account preview'; String get kycClose => 'Back to account';
@override @override
String get kycReviewHelp => String get kycReviewHelp =>
@@ -412,9 +377,6 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get kycSubmit => 'Submit for review'; String get kycSubmit => 'Submit for review';
@override
String get kycSubmitDemo => 'Simulate submission';
@override @override
String get kycWorking => 'Processing… Please keep this page open.'; String get kycWorking => 'Processing… Please keep this page open.';
@@ -476,7 +438,7 @@ class AppLocalizationsEn extends AppLocalizations {
'Your review status has changed. Refresh it before continuing.'; 'Your review status has changed. Refresh it before continuing.';
@override @override
String get kycDemoControls => 'Demo: simulate a backoffice decision'; String get kycDemoControls => 'Review scenarios';
@override @override
String get kycDemoApprove => 'Approve'; String get kycDemoApprove => 'Approve';
@@ -566,9 +528,6 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get wRefresh => 'Refresh'; String get wRefresh => 'Refresh';
@override
String get wDemo => 'Demo workspace · No real money moves.';
@override @override
String get wSource => 'From account'; String get wSource => 'From account';
@@ -585,7 +544,7 @@ class AppLocalizationsEn extends AppLocalizations {
String get wRecipient => 'Recipient'; String get wRecipient => 'Recipient';
@override @override
String get wRecipientHint => 'Sample recipient — demo only'; String get wRecipientHint => 'Recipient name or reference';
@override @override
String get wReview => 'Review'; String get wReview => 'Review';
@@ -623,7 +582,7 @@ class AppLocalizationsEn extends AppLocalizations {
String get wNewQuote => 'Refresh quote'; String get wNewQuote => 'Refresh quote';
@override @override
String get wConfirm => 'Confirm demo transaction'; String get wConfirm => 'Confirm transaction';
@override @override
String get wEdit => 'Edit details'; String get wEdit => 'Edit details';
@@ -675,13 +634,6 @@ class AppLocalizationsEn extends AppLocalizations {
String get wFailedOutgoing => String get wFailedOutgoing =>
'The transaction did not complete. The amount and fee are available in your account again.'; 'The transaction did not complete. The amount and fee are available in your account again.';
@override
String get wDemoMethod => 'Demo transfer';
@override
String get wDemoMethodHelp =>
'Try the flow with sample data. No bank or payment provider is contacted.';
@override @override
String get wUnavailable => String get wUnavailable =>
'Could not refresh. The displayed information may be out of date. Try again.'; 'Could not refresh. The displayed information may be out of date. Try again.';
@@ -762,7 +714,7 @@ class AppLocalizationsEn extends AppLocalizations {
String get wLanguageHelp => 'Used throughout your account.'; String get wLanguageHelp => 'Used throughout your account.';
@override @override
String get wLanguageSaved => 'Saved to your demo account.'; String get wLanguageSaved => 'Saved to your account.';
@override @override
String get wLanguageFailed => String get wLanguageFailed =>
@@ -777,7 +729,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get wSecurityBody => String get wSecurityBody =>
'Live sessions, password changes and two-step verification are not connected in this demo.'; 'Password and security settings are not available yet.';
@override @override
String get wIdentity => 'Identity verification'; String get wIdentity => 'Identity verification';
@@ -70,12 +70,10 @@ class AppLocalizationsRu extends AppLocalizations {
String get letsGo => 'Продолжить'; String get letsGo => 'Продолжить';
@override @override
String get loginPreview => String get loginPreview => 'Вы вошли в аккаунт.';
'Демонстрационный вход выполнен. Реальная сессия не создана. Учётные данные не отправлены и не сохранены.';
@override @override
String get signupPreview => String get signupPreview => 'Ваш аккаунт готов.';
'Демонстрационная регистрация выполнена. Реальный аккаунт не создан. Учётные данные не отправлены и не сохранены.';
@override @override
String get alreadyMember => 'Уже есть аккаунт sxchnge?'; String get alreadyMember => 'Уже есть аккаунт sxchnge?';
@@ -89,10 +87,6 @@ class AppLocalizationsRu extends AppLocalizations {
@override @override
String get createAnAccount => 'Зарегистрироваться'; String get createAnAccount => 'Зарегистрироваться';
@override
String get earlyPreview =>
'ПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ · Вход и регистрация пока недоступны.';
@override @override
String get brandEyebrow => 'МАЛЕНЬКАЯ ПЕРЕМЕНА. БОЛЬШОЙ ШАГ.'; String get brandEyebrow => 'МАЛЕНЬКАЯ ПЕРЕМЕНА. БОЛЬШОЙ ШАГ.';
@@ -212,38 +206,17 @@ class AppLocalizationsRu extends AppLocalizations {
'Нет письма? Проверьте папку «Спам» или запросите новое ниже.'; 'Нет письма? Проверьте папку «Спам» или запросите новое ниже.';
@override @override
String get verificationDemo => String get verificationDemoLink => 'Перейти к подтверждению';
'ДЕМО · Письмо не отправляется, реальный аккаунт не подтверждается.';
@override
String get verificationDemoLink => 'Открыть демоссылку подтверждения';
@override @override
String get verificationStep => 'ПОДТВЕРДИТЕ ПОЧТУ'; String get verificationStep => 'ПОДТВЕРДИТЕ ПОЧТУ';
@override
String get demoSentHeading => 'Демописьмо готово.';
@override
String get demoSentBody =>
'Письмо не отправлено. Используйте демоссылку ниже, чтобы посмотреть следующий шаг.';
@override
String get demoVerifiedHeading => 'Демоподтверждение\nзавершено.';
@override
String get demoVerifiedBody =>
'Вы посмотрели подтверждение почты. Реальный аккаунт не подтверждён. Вернитесь ко входу, чтобы продолжить знакомство с демоверсией.';
@override @override
String get verificationRecipient => 'Получатель'; String get verificationRecipient => 'Получатель';
@override @override
String get verificationChangeEmail => 'Изменить почту'; String get verificationChangeEmail => 'Изменить почту';
@override
String get demoResend => 'Подготовить демописьмо ещё раз';
@override @override
String get kycTitle => 'Верификация и лимиты'; String get kycTitle => 'Верификация и лимиты';
@@ -251,10 +224,6 @@ class AppLocalizationsRu extends AppLocalizations {
String get kycIntro => String get kycIntro =>
'Ваш аккаунт — ваш темп. Подтвердите личность, когда понадобятся более высокие лимиты.'; 'Ваш аккаунт — ваш темп. Подтвердите личность, когда понадобятся более высокие лимиты.';
@override
String get kycDemo =>
'ДЕМО · Используйте только тестовые изображения. Фото хранятся в памяти, не отправляются и удаляются при выходе или перезагрузке. Решения проверки имитируются.';
@override @override
String get kycUnverified => 'Личность не подтверждена'; String get kycUnverified => 'Личность не подтверждена';
@@ -319,8 +288,7 @@ class AppLocalizationsRu extends AppLocalizations {
String get kycSupport => 'Обратиться в поддержку'; String get kycSupport => 'Обратиться в поддержку';
@override @override
String get kycSupportBody => String get kycSupportBody => 'Поддержка сейчас недоступна. Попробуйте позже.';
'В демоверсии поддержка не подключена. В рабочем приложении здесь можно будет запросить пересмотр без повторной отправки документов.';
@override @override
String get kycBasic => 'Базовый'; String get kycBasic => 'Базовый';
@@ -331,10 +299,6 @@ class AppLocalizationsRu extends AppLocalizations {
@override @override
String get kycLimits => 'Ваши лимиты'; String get kycLimits => 'Ваши лимиты';
@override
String get kycLimitsDemo =>
'Пример лимитов из демосервиса. Это не действующее предложение.';
@override @override
String get kycDay => 'Объём за день'; String get kycDay => 'Объём за день';
@@ -401,7 +365,7 @@ class AppLocalizationsRu extends AppLocalizations {
String get kycSkip => 'Оставить базовые лимиты'; String get kycSkip => 'Оставить базовые лимиты';
@override @override
String get kycClose => 'К демоаккаунту'; String get kycClose => 'К аккаунту';
@override @override
String get kycReviewHelp => String get kycReviewHelp =>
@@ -413,9 +377,6 @@ class AppLocalizationsRu extends AppLocalizations {
@override @override
String get kycSubmit => 'Отправить на проверку'; String get kycSubmit => 'Отправить на проверку';
@override
String get kycSubmitDemo => 'Имитировать отправку';
@override @override
String get kycWorking => 'Обработка… Не закрывайте страницу.'; String get kycWorking => 'Обработка… Не закрывайте страницу.';
@@ -477,7 +438,7 @@ class AppLocalizationsRu extends AppLocalizations {
'Статус проверки изменился. Обновите его, прежде чем продолжить.'; 'Статус проверки изменился. Обновите его, прежде чем продолжить.';
@override @override
String get kycDemoControls => 'Демо: имитация решения сотрудника'; String get kycDemoControls => 'Сценарии проверки';
@override @override
String get kycDemoApprove => 'Одобрить'; String get kycDemoApprove => 'Одобрить';
@@ -567,9 +528,6 @@ class AppLocalizationsRu extends AppLocalizations {
@override @override
String get wRefresh => 'Обновить'; String get wRefresh => 'Обновить';
@override
String get wDemo => 'Демонстрация · Реальные деньги не переводятся.';
@override @override
String get wSource => 'Со счёта'; String get wSource => 'Со счёта';
@@ -586,7 +544,7 @@ class AppLocalizationsRu extends AppLocalizations {
String get wRecipient => 'Получатель'; String get wRecipient => 'Получатель';
@override @override
String get wRecipientHint => 'Тестовый получатель — только демо'; String get wRecipientHint => 'Имя или реквизиты получателя';
@override @override
String get wReview => 'Проверить'; String get wReview => 'Проверить';
@@ -624,7 +582,7 @@ class AppLocalizationsRu extends AppLocalizations {
String get wNewQuote => 'Обновить расчёт'; String get wNewQuote => 'Обновить расчёт';
@override @override
String get wConfirm => 'Подтвердить тестовую операцию'; String get wConfirm => 'Подтвердить операцию';
@override @override
String get wEdit => 'Изменить данные'; String get wEdit => 'Изменить данные';
@@ -675,13 +633,6 @@ class AppLocalizationsRu extends AppLocalizations {
String get wFailedOutgoing => String get wFailedOutgoing =>
'Операция не выполнена. Сумма и комиссия снова доступны на вашем счёте.'; 'Операция не выполнена. Сумма и комиссия снова доступны на вашем счёте.';
@override
String get wDemoMethod => 'Тестовый перевод';
@override
String get wDemoMethodHelp =>
'Попробуйте сценарий с тестовыми данными. Банки и платёжные системы не подключены.';
@override @override
String get wUnavailable => String get wUnavailable =>
'Не удалось обновить данные. Информация может быть устаревшей. Повторите попытку.'; 'Не удалось обновить данные. Информация может быть устаревшей. Повторите попытку.';
@@ -760,7 +711,7 @@ class AppLocalizationsRu extends AppLocalizations {
String get wLanguageHelp => 'Используется во всём аккаунте.'; String get wLanguageHelp => 'Используется во всём аккаунте.';
@override @override
String get wLanguageSaved => 'Сохранено в тестовом аккаунте.'; String get wLanguageSaved => 'Сохранено в аккаунте.';
@override @override
String get wLanguageFailed => String get wLanguageFailed =>
@@ -775,7 +726,7 @@ class AppLocalizationsRu extends AppLocalizations {
@override @override
String get wSecurityBody => String get wSecurityBody =>
'В этой демонстрации не подключены рабочие сессии, смена пароля и двухэтапная проверка.'; 'Настройки пароля и безопасности пока недоступны.';
@override @override
String get wIdentity => 'Подтверждение личности'; String get wIdentity => 'Подтверждение личности';
+1 -1
View File
@@ -77,7 +77,7 @@ class IdentityForm extends StatelessWidget {
FilledButton( FilledButton(
key: const ValueKey('kyc-submit'), key: const ValueKey('kyc-submit'),
onPressed: p.canSubmit ? p.submit : null, onPressed: p.canSubmit ? p.submit : null,
child: Text(p.isDemo ? l.kycSubmitDemo : l.kycSubmit), child: Text(l.kycSubmit),
), ),
if (p.step > 0) if (p.step > 0)
TextButton(onPressed: p.busy ? null : p.back, child: Text(l.kycBack)), TextButton(onPressed: p.busy ? null : p.back, child: Text(l.kycBack)),
-2
View File
@@ -47,8 +47,6 @@ class LimitsPanel extends StatelessWidget {
data.tier == AccountTier.basic ? l.kycBasic : l.kycVerifiedTier, data.tier == AccountTier.basic ? l.kycBasic : l.kycVerifiedTier,
style: t.textTheme.titleLarge, style: t.textTheme.titleLarge,
), ),
if (data.simulated)
Text(l.kycLimitsDemo, style: t.textTheme.bodySmall),
const SizedBox(height: 12), const SizedBox(height: 12),
if (data.rows.isEmpty) Text(l.kycLimitsEmpty), if (data.rows.isEmpty) Text(l.kycLimitsEmpty),
for (final row in data.rows) ...[ for (final row in data.rows) ...[
-15
View File
@@ -149,21 +149,6 @@ class IdentityPageState extends State<IdentityPage> {
), ),
const SizedBox(height: 12), const SizedBox(height: 12),
Text(l.kycIntro, style: t.textTheme.bodyLarge), Text(l.kycIntro, style: t.textTheme.bodyLarge),
const SizedBox(height: 20),
if (p.isDemo)
Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: t.colorScheme.tertiaryContainer,
borderRadius: BorderRadius.circular(16),
),
child: Text(
l.kycDemo,
style: TextStyle(
color: t.colorScheme.onTertiaryContainer,
),
),
),
const SizedBox(height: 24), const SizedBox(height: 24),
if (p.busy) ...[ if (p.busy) ...[
const LinearProgressIndicator(), const LinearProgressIndicator(),
+10 -23
View File
@@ -20,13 +20,12 @@
"hideConfirmation": "Hide confirmation", "hideConfirmation": "Hide confirmation",
"createAccount": "Create account", "createAccount": "Create account",
"letsGo": "Let’s go", "letsGo": "Let’s go",
"loginPreview": "Demo login completed. No real session was created. Your credentials have not been sent or saved.", "loginPreview": "You’re signed in.",
"signupPreview": "Demo sign-up completed. No real account was created. Your credentials have not been sent or saved.", "signupPreview": "Your account is ready.",
"alreadyMember": "Already part of sxchnge?", "alreadyMember": "Already part of sxchnge?",
"newHere": "New around here?", "newHere": "New around here?",
"loginInstead": "Log in instead", "loginInstead": "Log in instead",
"createAnAccount": "Create an account", "createAnAccount": "Create an account",
"earlyPreview": "EARLY PREVIEW · Login and sign-up are not live yet.",
"brandEyebrow": "A LITTLE CHANGE. A BIG NEXT STEP.", "brandEyebrow": "A LITTLE CHANGE. A BIG NEXT STEP.",
"brandHeading": "Good moves.\nStart here.", "brandHeading": "Good moves.\nStart here.",
"brandIntro": "A fresh way forward.\nMake it yours with sxchnge.", "brandIntro": "A fresh way forward.\nMake it yours with sxchnge.",
@@ -63,19 +62,12 @@
"verificationRetry": "Retry verification", "verificationRetry": "Retry verification",
"verificationBack": "Back to login", "verificationBack": "Back to login",
"verificationHint": "No email? Check your spam folder or request another below.", "verificationHint": "No email? Check your spam folder or request another below.",
"verificationDemo": "DEMO · No real email is sent and no account is verified.", "verificationDemoLink": "Continue to confirmation",
"verificationDemoLink": "Open demo confirmation link",
"verificationStep": "CONFIRM YOUR EMAIL", "verificationStep": "CONFIRM YOUR EMAIL",
"demoSentHeading": "Demo email prepared.",
"demoSentBody": "No email was sent. Use the demo confirmation below to preview the next step.",
"demoVerifiedHeading": "Demo verification\ncomplete.",
"demoVerifiedBody": "You’ve previewed email confirmation. No account was verified. Return to login to explore the demo.",
"verificationRecipient": "Recipient", "verificationRecipient": "Recipient",
"verificationChangeEmail": "Change email", "verificationChangeEmail": "Change email",
"demoResend": "Prepare demo email again",
"kycTitle": "Verification & limits", "kycTitle": "Verification & limits",
"kycIntro": "Your account, at your pace. Verify your identity when you need higher limits.", "kycIntro": "Your account, at your pace. Verify your identity when you need higher limits.",
"kycDemo": "DEMO · Use sample images only. Photos stay in memory, are never uploaded, and disappear when you leave or reload. Review decisions are simulated.",
"kycUnverified": "Not verified", "kycUnverified": "Not verified",
"kycPending": "In review", "kycPending": "In review",
"kycApproved": "Identity verified", "kycApproved": "Identity verified",
@@ -94,11 +86,10 @@
"kycResubmit": "Replace photos", "kycResubmit": "Replace photos",
"kycRefresh": "Refresh status & limits", "kycRefresh": "Refresh status & limits",
"kycSupport": "Contact support", "kycSupport": "Contact support",
"kycSupportBody": "Support is not connected in this preview. In the live app, you will be able to request a review here without submitting documents again.", "kycSupportBody": "Support is currently unavailable. Please try again later.",
"kycBasic": "Basic", "kycBasic": "Basic",
"kycVerifiedTier": "Verified", "kycVerifiedTier": "Verified",
"kycLimits": "Your limits", "kycLimits": "Your limits",
"kycLimitsDemo": "Illustrative limits from the demo service. These are not a live offer.",
"kycDay": "Daily volume", "kycDay": "Daily volume",
"kycMonth": "Monthly volume", "kycMonth": "Monthly volume",
"kycCurrent": "Current cap", "kycCurrent": "Current cap",
@@ -119,11 +110,10 @@
"kycNext": "Continue", "kycNext": "Continue",
"kycBack": "Back", "kycBack": "Back",
"kycSkip": "Keep basic limits", "kycSkip": "Keep basic limits",
"kycClose": "Back to account preview", "kycClose": "Back to account",
"kycReviewHelp": "Check that both photos are readable and show the same passport. A staff member will review them; submission does not immediately raise your limits.", "kycReviewHelp": "Check that both photos are readable and show the same passport. A staff member will review them; submission does not immediately raise your limits.",
"kycConfirm": "These photos show me and my own valid passport.", "kycConfirm": "These photos show me and my own valid passport.",
"kycSubmit": "Submit for review", "kycSubmit": "Submit for review",
"kycSubmitDemo": "Simulate submission",
"kycWorking": "Processing… Please keep this page open.", "kycWorking": "Processing… Please keep this page open.",
"kycDiscardTitle": "Discard these photos?", "kycDiscardTitle": "Discard these photos?",
"kycDiscardBody": "Your draft is only in memory. Leaving will remove the selected photos; you can start again later.", "kycDiscardBody": "Your draft is only in memory. Leaving will remove the selected photos; you can start again later.",
@@ -140,7 +130,7 @@
"kycErrorSession": "Your session has expired. Return to login, then check your verification status.", "kycErrorSession": "Your session has expired. Return to login, then check your verification status.",
"kycErrorRate": "Too many requests. Wait a moment before trying again.", "kycErrorRate": "Too many requests. Wait a moment before trying again.",
"kycErrorConflict": "Your review status has changed. Refresh it before continuing.", "kycErrorConflict": "Your review status has changed. Refresh it before continuing.",
"kycDemoControls": "Demo: simulate a backoffice decision", "kycDemoControls": "Review scenarios",
"kycDemoApprove": "Approve", "kycDemoApprove": "Approve",
"kycDemoCorrect": "Request clearer passport", "kycDemoCorrect": "Request clearer passport",
"kycDemoSelfie": "Request clearer selfie", "kycDemoSelfie": "Request clearer selfie",
@@ -169,13 +159,12 @@
"wEmptyActivity": "Your next move starts here. Your transactions will appear below.", "wEmptyActivity": "Your next move starts here. Your transactions will appear below.",
"wEmptyAccounts": "Your accounts are not ready yet. Try refreshing.", "wEmptyAccounts": "Your accounts are not ready yet. Try refreshing.",
"wRefresh": "Refresh", "wRefresh": "Refresh",
"wDemo": "Demo workspace · No real money moves.",
"wSource": "From account", "wSource": "From account",
"wDestination": "To account", "wDestination": "To account",
"wReceiveAccount": "Receiving account", "wReceiveAccount": "Receiving account",
"wAmount": "Amount", "wAmount": "Amount",
"wRecipient": "Recipient", "wRecipient": "Recipient",
"wRecipientHint": "Sample recipient — demo only", "wRecipientHint": "Recipient name or reference",
"wReview": "Review", "wReview": "Review",
"wReviewTitle": "One last look.", "wReviewTitle": "One last look.",
"wFee": "Fee", "wFee": "Fee",
@@ -187,7 +176,7 @@
"wQuoteNotice": "These terms are valid for 60 seconds. Confirm them before continuing.", "wQuoteNotice": "These terms are valid for 60 seconds. Confirm them before continuing.",
"wExpired": "This quote expired. Refresh it and review the new terms.", "wExpired": "This quote expired. Refresh it and review the new terms.",
"wNewQuote": "Refresh quote", "wNewQuote": "Refresh quote",
"wConfirm": "Confirm demo transaction", "wConfirm": "Confirm transaction",
"wEdit": "Edit details", "wEdit": "Edit details",
"wClose": "Close", "wClose": "Close",
"wWorking": "Working on it…", "wWorking": "Working on it…",
@@ -202,8 +191,6 @@
"wCompletePayout": "Your payout is complete. The amount and fee have been deducted from your account.", "wCompletePayout": "Your payout is complete. The amount and fee have been deducted from your account.",
"wFailedTopUp": "The top-up did not complete. No money was added to your account.", "wFailedTopUp": "The top-up did not complete. No money was added to your account.",
"wFailedOutgoing": "The transaction did not complete. The amount and fee are available in your account again.", "wFailedOutgoing": "The transaction did not complete. The amount and fee are available in your account again.",
"wDemoMethod": "Demo transfer",
"wDemoMethodHelp": "Try the flow with sample data. No bank or payment provider is contacted.",
"wUnavailable": "Could not refresh. The displayed information may be out of date. Try again.", "wUnavailable": "Could not refresh. The displayed information may be out of date. Try again.",
"wInvalidAmount": "Enter an amount greater than zero, using the currency’s decimal precision.", "wInvalidAmount": "Enter an amount greater than zero, using the currency’s decimal precision.",
"wInsufficient": "Not enough available money for this amount and fee. Top up or enter a smaller amount.", "wInsufficient": "Not enough available money for this amount and fee. Top up or enter a smaller amount.",
@@ -227,11 +214,11 @@
"wPreferences": "Make it yours.", "wPreferences": "Make it yours.",
"wLanguage": "Account language", "wLanguage": "Account language",
"wLanguageHelp": "Used throughout your account.", "wLanguageHelp": "Used throughout your account.",
"wLanguageSaved": "Saved to your demo account.", "wLanguageSaved": "Saved to your account.",
"wLanguageFailed": "Changed for this session, but not saved to your account. Retry below.", "wLanguageFailed": "Changed for this session, but not saved to your account. Retry below.",
"wProfileError": "Account preferences could not be loaded. Try again.", "wProfileError": "Account preferences could not be loaded. Try again.",
"wSecurity": "Security", "wSecurity": "Security",
"wSecurityBody": "Live sessions, password changes and two-step verification are not connected in this demo.", "wSecurityBody": "Password and security settings are not available yet.",
"wIdentity": "Identity verification", "wIdentity": "Identity verification",
"wIdentityHelp": "Optional verification for higher limits.", "wIdentityHelp": "Optional verification for higher limits.",
"wBackLogin": "Back to login", "wBackLogin": "Back to login",
+10 -23
View File
@@ -20,13 +20,12 @@
"hideConfirmation": "Скрыть повтор пароля", "hideConfirmation": "Скрыть повтор пароля",
"createAccount": "Создать аккаунт", "createAccount": "Создать аккаунт",
"letsGo": "Продолжить", "letsGo": "Продолжить",
"loginPreview": "Демонстрационный вход выполнен. Реальная сессия не создана. Учётные данные не отправлены и не сохранены.", "loginPreview": "Вы вошли в аккаунт.",
"signupPreview": "Демонстрационная регистрация выполнена. Реальный аккаунт не создан. Учётные данные не отправлены и не сохранены.", "signupPreview": "Ваш аккаунт готов.",
"alreadyMember": "Уже есть аккаунт sxchnge?", "alreadyMember": "Уже есть аккаунт sxchnge?",
"newHere": "Впервые здесь?", "newHere": "Впервые здесь?",
"loginInstead": "Войти в аккаунт", "loginInstead": "Войти в аккаунт",
"createAnAccount": "Зарегистрироваться", "createAnAccount": "Зарегистрироваться",
"earlyPreview": "ПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ · Вход и регистрация пока недоступны.",
"brandEyebrow": "МАЛЕНЬКАЯ ПЕРЕМЕНА. БОЛЬШОЙ ШАГ.", "brandEyebrow": "МАЛЕНЬКАЯ ПЕРЕМЕНА. БОЛЬШОЙ ШАГ.",
"brandHeading": "Всё начинается\nс перемен.", "brandHeading": "Всё начинается\nс перемен.",
"brandIntro": "Новый путь вперёд.\nОткройте его вместе со sxchnge.", "brandIntro": "Новый путь вперёд.\nОткройте его вместе со sxchnge.",
@@ -63,19 +62,12 @@
"verificationRetry": "Повторить подтверждение", "verificationRetry": "Повторить подтверждение",
"verificationBack": "Вернуться ко входу", "verificationBack": "Вернуться ко входу",
"verificationHint": "Нет письма? Проверьте папку «Спам» или запросите новое ниже.", "verificationHint": "Нет письма? Проверьте папку «Спам» или запросите новое ниже.",
"verificationDemo": "ДЕМО · Письмо не отправляется, реальный аккаунт не подтверждается.", "verificationDemoLink": "Перейти к подтверждению",
"verificationDemoLink": "Открыть демоссылку подтверждения",
"verificationStep": "ПОДТВЕРДИТЕ ПОЧТУ", "verificationStep": "ПОДТВЕРДИТЕ ПОЧТУ",
"demoSentHeading": "Демописьмо готово.",
"demoSentBody": "Письмо не отправлено. Используйте демоссылку ниже, чтобы посмотреть следующий шаг.",
"demoVerifiedHeading": "Демоподтверждение\nзавершено.",
"demoVerifiedBody": "Вы посмотрели подтверждение почты. Реальный аккаунт не подтверждён. Вернитесь ко входу, чтобы продолжить знакомство с демоверсией.",
"verificationRecipient": "Получатель", "verificationRecipient": "Получатель",
"verificationChangeEmail": "Изменить почту", "verificationChangeEmail": "Изменить почту",
"demoResend": "Подготовить демописьмо ещё раз",
"kycTitle": "Верификация и лимиты", "kycTitle": "Верификация и лимиты",
"kycIntro": "Ваш аккаунт — ваш темп. Подтвердите личность, когда понадобятся более высокие лимиты.", "kycIntro": "Ваш аккаунт — ваш темп. Подтвердите личность, когда понадобятся более высокие лимиты.",
"kycDemo": "ДЕМО · Используйте только тестовые изображения. Фото хранятся в памяти, не отправляются и удаляются при выходе или перезагрузке. Решения проверки имитируются.",
"kycUnverified": "Личность не подтверждена", "kycUnverified": "Личность не подтверждена",
"kycPending": "На проверке", "kycPending": "На проверке",
"kycApproved": "Личность подтверждена", "kycApproved": "Личность подтверждена",
@@ -94,11 +86,10 @@
"kycResubmit": "Заменить фото", "kycResubmit": "Заменить фото",
"kycRefresh": "Обновить статус и лимиты", "kycRefresh": "Обновить статус и лимиты",
"kycSupport": "Обратиться в поддержку", "kycSupport": "Обратиться в поддержку",
"kycSupportBody": "В демоверсии поддержка не подключена. В рабочем приложении здесь можно будет запросить пересмотр без повторной отправки документов.", "kycSupportBody": "Поддержка сейчас недоступна. Попробуйте позже.",
"kycBasic": "Базовый", "kycBasic": "Базовый",
"kycVerifiedTier": "Подтверждённый", "kycVerifiedTier": "Подтверждённый",
"kycLimits": "Ваши лимиты", "kycLimits": "Ваши лимиты",
"kycLimitsDemo": "Пример лимитов из демосервиса. Это не действующее предложение.",
"kycDay": "Объём за день", "kycDay": "Объём за день",
"kycMonth": "Объём за месяц", "kycMonth": "Объём за месяц",
"kycCurrent": "Текущий лимит", "kycCurrent": "Текущий лимит",
@@ -119,11 +110,10 @@
"kycNext": "Продолжить", "kycNext": "Продолжить",
"kycBack": "Назад", "kycBack": "Назад",
"kycSkip": "Оставить базовые лимиты", "kycSkip": "Оставить базовые лимиты",
"kycClose": "К демоаккаунту", "kycClose": "К аккаунту",
"kycReviewHelp": "Убедитесь, что оба фото читаемы и на них один паспорт. Их проверит сотрудник. Отправка не повышает лимиты сразу.", "kycReviewHelp": "Убедитесь, что оба фото читаемы и на них один паспорт. Их проверит сотрудник. Отправка не повышает лимиты сразу.",
"kycConfirm": "На фото я и мой действующий паспорт.", "kycConfirm": "На фото я и мой действующий паспорт.",
"kycSubmit": "Отправить на проверку", "kycSubmit": "Отправить на проверку",
"kycSubmitDemo": "Имитировать отправку",
"kycWorking": "Обработка… Не закрывайте страницу.", "kycWorking": "Обработка… Не закрывайте страницу.",
"kycDiscardTitle": "Удалить выбранные фото?", "kycDiscardTitle": "Удалить выбранные фото?",
"kycDiscardBody": "Черновик хранится только в памяти. При выходе выбранные фото будут удалены. Позже можно начать заново.", "kycDiscardBody": "Черновик хранится только в памяти. При выходе выбранные фото будут удалены. Позже можно начать заново.",
@@ -140,7 +130,7 @@
"kycErrorSession": "Сессия истекла. Войдите снова и проверьте статус верификации.", "kycErrorSession": "Сессия истекла. Войдите снова и проверьте статус верификации.",
"kycErrorRate": "Слишком много запросов. Немного подождите и повторите попытку.", "kycErrorRate": "Слишком много запросов. Немного подождите и повторите попытку.",
"kycErrorConflict": "Статус проверки изменился. Обновите его, прежде чем продолжить.", "kycErrorConflict": "Статус проверки изменился. Обновите его, прежде чем продолжить.",
"kycDemoControls": "Демо: имитация решения сотрудника", "kycDemoControls": "Сценарии проверки",
"kycDemoApprove": "Одобрить", "kycDemoApprove": "Одобрить",
"kycDemoCorrect": "Запросить чёткое фото паспорта", "kycDemoCorrect": "Запросить чёткое фото паспорта",
"kycDemoSelfie": "Запросить чёткое селфи", "kycDemoSelfie": "Запросить чёткое селфи",
@@ -169,13 +159,12 @@
"wEmptyActivity": "Ваш следующий шаг начинается здесь. Здесь появятся ваши операции.", "wEmptyActivity": "Ваш следующий шаг начинается здесь. Здесь появятся ваши операции.",
"wEmptyAccounts": "Ваши счета ещё не готовы. Попробуйте обновить страницу.", "wEmptyAccounts": "Ваши счета ещё не готовы. Попробуйте обновить страницу.",
"wRefresh": "Обновить", "wRefresh": "Обновить",
"wDemo": "Демонстрация · Реальные деньги не переводятся.",
"wSource": "Со счёта", "wSource": "Со счёта",
"wDestination": "На счёт", "wDestination": "На счёт",
"wReceiveAccount": "Счёт для зачисления", "wReceiveAccount": "Счёт для зачисления",
"wAmount": "Сумма", "wAmount": "Сумма",
"wRecipient": "Получатель", "wRecipient": "Получатель",
"wRecipientHint": "Тестовый получатель — только демо", "wRecipientHint": "Имя или реквизиты получателя",
"wReview": "Проверить", "wReview": "Проверить",
"wReviewTitle": "Проверьте детали.", "wReviewTitle": "Проверьте детали.",
"wFee": "Комиссия", "wFee": "Комиссия",
@@ -187,7 +176,7 @@
"wQuoteNotice": "Эти условия действуют 60 секунд. Подтвердите их, прежде чем продолжить.", "wQuoteNotice": "Эти условия действуют 60 секунд. Подтвердите их, прежде чем продолжить.",
"wExpired": "Срок действия расчёта истёк. Обновите его и проверьте новые условия.", "wExpired": "Срок действия расчёта истёк. Обновите его и проверьте новые условия.",
"wNewQuote": "Обновить расчёт", "wNewQuote": "Обновить расчёт",
"wConfirm": "Подтвердить тестовую операцию", "wConfirm": "Подтвердить операцию",
"wEdit": "Изменить данные", "wEdit": "Изменить данные",
"wClose": "Закрыть", "wClose": "Закрыть",
"wWorking": "Обрабатываем…", "wWorking": "Обрабатываем…",
@@ -202,8 +191,6 @@
"wCompletePayout": "Вывод завершён. Сумма и комиссия списаны с вашего счёта.", "wCompletePayout": "Вывод завершён. Сумма и комиссия списаны с вашего счёта.",
"wFailedTopUp": "Пополнение не выполнено. На счёт ничего не зачислено.", "wFailedTopUp": "Пополнение не выполнено. На счёт ничего не зачислено.",
"wFailedOutgoing": "Операция не выполнена. Сумма и комиссия снова доступны на вашем счёте.", "wFailedOutgoing": "Операция не выполнена. Сумма и комиссия снова доступны на вашем счёте.",
"wDemoMethod": "Тестовый перевод",
"wDemoMethodHelp": "Попробуйте сценарий с тестовыми данными. Банки и платёжные системы не подключены.",
"wUnavailable": "Не удалось обновить данные. Информация может быть устаревшей. Повторите попытку.", "wUnavailable": "Не удалось обновить данные. Информация может быть устаревшей. Повторите попытку.",
"wInvalidAmount": "Введите сумму больше нуля с допустимым для валюты числом знаков после запятой.", "wInvalidAmount": "Введите сумму больше нуля с допустимым для валюты числом знаков после запятой.",
"wInsufficient": "Для этой суммы и комиссии недостаточно доступных средств. Пополните счёт или уменьшите сумму.", "wInsufficient": "Для этой суммы и комиссии недостаточно доступных средств. Пополните счёт или уменьшите сумму.",
@@ -227,11 +214,11 @@
"wPreferences": "Настройте под себя.", "wPreferences": "Настройте под себя.",
"wLanguage": "Язык аккаунта", "wLanguage": "Язык аккаунта",
"wLanguageHelp": "Используется во всём аккаунте.", "wLanguageHelp": "Используется во всём аккаунте.",
"wLanguageSaved": "Сохранено в тестовом аккаунте.", "wLanguageSaved": "Сохранено в аккаунте.",
"wLanguageFailed": "Изменено для текущей сессии, но не сохранено в аккаунте. Повторите попытку ниже.", "wLanguageFailed": "Изменено для текущей сессии, но не сохранено в аккаунте. Повторите попытку ниже.",
"wProfileError": "Не удалось загрузить настройки аккаунта. Повторите попытку.", "wProfileError": "Не удалось загрузить настройки аккаунта. Повторите попытку.",
"wSecurity": "Безопасность", "wSecurity": "Безопасность",
"wSecurityBody": "В этой демонстрации не подключены рабочие сессии, смена пароля и двухэтапная проверка.", "wSecurityBody": "Настройки пароля и безопасности пока недоступны.",
"wIdentity": "Подтверждение личности", "wIdentity": "Подтверждение личности",
"wIdentityHelp": "Необязательная проверка для повышения лимитов.", "wIdentityHelp": "Необязательная проверка для повышения лимитов.",
"wBackLogin": "Вернуться ко входу", "wBackLogin": "Вернуться ко входу",
+5 -14
View File
@@ -127,11 +127,10 @@ class _VerificationPageState extends State<VerificationPage> {
!_lastWasSend && !_lastWasSend &&
widget.token != null; widget.token != null;
final title = switch (status) { final title = switch (status) {
VerificationStatus.sent => demo ? l.demoSentHeading : l.checkInbox, VerificationStatus.sent => l.checkInbox,
VerificationStatus.sending => l.verificationSending, VerificationStatus.sending => l.verificationSending,
VerificationStatus.checking => l.verificationChecking, VerificationStatus.checking => l.verificationChecking,
VerificationStatus.verified => VerificationStatus.verified => l.verificationVerified,
demo ? l.demoVerifiedHeading : l.verificationVerified,
VerificationStatus.expired => l.verificationExpired, VerificationStatus.expired => l.verificationExpired,
VerificationStatus.invalid => l.verificationInvalid, VerificationStatus.invalid => l.verificationInvalid,
VerificationStatus.error => l.verificationInternal, VerificationStatus.error => l.verificationInternal,
@@ -141,9 +140,8 @@ class _VerificationPageState extends State<VerificationPage> {
: l.verificationRequest, : l.verificationRequest,
}; };
final body = switch (status) { final body = switch (status) {
VerificationStatus.sent => demo ? l.demoSentBody : l.verificationSent, VerificationStatus.sent => l.verificationSent,
VerificationStatus.verified => VerificationStatus.verified => l.verificationVerifiedBody,
demo ? l.demoVerifiedBody : l.verificationVerifiedBody,
VerificationStatus.expired => l.verificationExpiredBody, VerificationStatus.expired => l.verificationExpiredBody,
VerificationStatus.invalid => l.verificationInvalidBody, VerificationStatus.invalid => l.verificationInvalidBody,
VerificationStatus.error => l.verificationInternalBody, VerificationStatus.error => l.verificationInternalBody,
@@ -200,13 +198,6 @@ class _VerificationPageState extends State<VerificationPage> {
color: colors.primary, color: colors.primary,
), ),
), ),
if (demo) ...[
const SizedBox(height: 12),
Text(
l.verificationDemo,
style: theme.textTheme.bodyMedium,
),
],
const SizedBox(height: 12), const SizedBox(height: 12),
Semantics( Semantics(
liveRegion: true, liveRegion: true,
@@ -258,7 +249,7 @@ class _VerificationPageState extends State<VerificationPage> {
key: const ValueKey('verification-resend'), key: const ValueKey('verification-resend'),
onPressed: _send, onPressed: _send,
child: Text( child: Text(
demo ? l.demoResend : l.verificationResend, l.verificationResend,
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),
), ),
+6 -10
View File
@@ -63,16 +63,12 @@ class _WorkspaceShellState extends State<WorkspaceShell> {
final wide = MediaQuery.sizeOf(context).width >= 900; final wide = MediaQuery.sizeOf(context).width >= 900;
final content = Column( final content = Column(
children: [ children: [
Padding( if (!wide)
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 12), const Padding(
child: Column( padding: EdgeInsets.symmetric(horizontal: 24, vertical: 12),
crossAxisAlignment: wide child: Align(
? CrossAxisAlignment.end alignment: Alignment.centerLeft,
: CrossAxisAlignment.start, child: BrandWordmark(),
children: [
if (!wide) ...[const BrandWordmark(), const SizedBox(height: 8)],
Text(l.wDemo, style: t.textTheme.bodySmall),
],
), ),
), ),
Expanded(child: widget.child), Expanded(child: widget.child),
-2
View File
@@ -138,8 +138,6 @@ class TransferPageState extends State<TransferPage> {
], ],
), ),
const SizedBox(height: 20), const SizedBox(height: 20),
Text(l.wDemoMethodHelp, style: t.textTheme.bodySmall),
const SizedBox(height: 24),
Focus( Focus(
key: _content, key: _content,
focusNode: _focus, focusNode: _focus,
+1 -1
View File
@@ -129,7 +129,7 @@ void main() {
same(router), same(router),
); );
expect(find.byKey(const ValueKey('verification-verified')), findsOneWidget); expect(find.byKey(const ValueKey('verification-verified')), findsOneWidget);
expect(find.text('Демоподтверждение\nзавершено.'), findsOneWidget); expect(find.text('Ваша почта\nподтверждена.'), findsOneWidget);
}); });
testWidgets( testWidgets(
+4 -4
View File
@@ -111,7 +111,7 @@ void main() {
); );
testWidgets( testWidgets(
'signup to demo verification is correlated and never claims a business success', 'signup verification keeps simulated analytics with ordinary product copy',
(tester) async { (tester) async {
final sink = DummyAnalyticsService(); final sink = DummyAnalyticsService();
await open(tester, '/', sink); await open(tester, '/', sink);
@@ -130,10 +130,10 @@ void main() {
'example-password', 'example-password',
); );
await tap(tester, find.byKey(const ValueKey('submit'))); await tap(tester, find.byKey(const ValueKey('submit')));
expect(find.text('Demo email prepared.'), findsOneWidget); expect(find.text('Check your inbox.'), findsOneWidget);
expect(find.textContaining('We’ve sent you'), findsNothing); expect(find.textContaining('We’ve sent you'), findsOneWidget);
await tap(tester, find.byKey(const ValueKey('demo-confirmation'))); await tap(tester, find.byKey(const ValueKey('demo-confirmation')));
expect(find.text('Demo verification\ncomplete.'), findsOneWidget); expect(find.text('Your email\nis verified.'), findsOneWidget);
expect(sink.events.map((e) => e.journeyId).toSet().length, 1); expect(sink.events.map((e) => e.journeyId).toSet().length, 1);
expect(sink.events.where((e) => e.terminal).length, 1); expect(sink.events.where((e) => e.terminal).length, 1);
expect( expect(
+1 -1
View File
@@ -57,7 +57,7 @@ void main() {
find.byKey(ValueKey('verification-${scenario.value}')), find.byKey(ValueKey('verification-${scenario.value}')),
findsOneWidget, findsOneWidget,
); );
expect(find.textContaining('DEMO'), findsOneWidget); expect(find.textContaining('DEMO'), findsNothing);
expect(tester.takeException(), isNull); expect(tester.takeException(), isNull);
}, },
); );