diff --git a/lib/core/misc/demo_mode_status.dart b/lib/core/misc/demo_mode_status.dart new file mode 100644 index 00000000..8d7b3a38 --- /dev/null +++ b/lib/core/misc/demo_mode_status.dart @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2026 BitCodersNN + +class DemoModeStatus { + static bool demoModeEnabled = false; +} diff --git a/lib/core/viewmodels/auth_page/auth_page_view_model.dart b/lib/core/viewmodels/auth_page/auth_page_view_model.dart index d989fe60..c5ea0330 100644 --- a/lib/core/viewmodels/auth_page/auth_page_view_model.dart +++ b/lib/core/viewmodels/auth_page/auth_page_view_model.dart @@ -3,6 +3,7 @@ import 'package:unn_mobile/core/misc/authorisation/authorisation_request_result.dart'; import 'package:unn_mobile/core/misc/custom_errors/auth_error_messages.dart'; +import 'package:unn_mobile/core/misc/demo_mode_status.dart'; import 'package:unn_mobile/core/models/authorisation/auth_data.dart'; import 'package:unn_mobile/core/providers/interfaces/authorisation/auth_data_provider.dart'; import 'package:unn_mobile/core/services/interfaces/authorisation/unn_authorisation_service.dart'; @@ -32,21 +33,32 @@ class AuthPageViewModel extends BaseViewModel { _resetAuthError(); AuthRequestResult? authResult; + final shouldEnableDemo = + user.startsWith('53effbc2-242e-43c1-9046-6580b77cccdb-'); + + final actualUserName = shouldEnableDemo ? user.substring(37) : user; try { - authResult = await _authorisationService.auth(user, password); + authResult = await _authorisationService.auth( + actualUserName, + password, + ); } catch (error, stackTrace) { _loggerService.logError(error, stackTrace); } if (authResult == AuthRequestResult.success) { - await _authDataProvider.saveData(AuthData(user, password)); + await _authDataProvider.saveData(AuthData(actualUserName, password)); } else { authResult != null ? _setAuthError(text: authResult.errorMessage) : _setAuthError(); } + if (authResult == AuthRequestResult.success) { + DemoModeStatus.demoModeEnabled = shouldEnableDemo; + } + setState(ViewState.idle); return authResult == AuthRequestResult.success; } diff --git a/lib/core/viewmodels/main_page/certificates_online/certificate_item_view_model.dart b/lib/core/viewmodels/main_page/certificates_online/certificate_item_view_model.dart index defd04c4..bab00a6b 100644 --- a/lib/core/viewmodels/main_page/certificates_online/certificate_item_view_model.dart +++ b/lib/core/viewmodels/main_page/certificates_online/certificate_item_view_model.dart @@ -6,6 +6,7 @@ import 'dart:io'; import 'package:unn_mobile/core/constants/date_pattern.dart'; import 'package:unn_mobile/core/misc/date_time_utilities/date_time_extensions.dart'; +import 'package:unn_mobile/core/misc/demo_mode_status.dart'; import 'package:unn_mobile/core/models/certificate/certificate.dart'; import 'package:unn_mobile/core/models/certificate/practice_order.dart'; import 'package:unn_mobile/core/services/interfaces/certificate/certificate_downloader_service.dart'; @@ -68,6 +69,9 @@ class CertificateItemViewModel extends BaseViewModel { } Future askForPath() async => await busyCallAsync(() async { + if (DemoModeStatus.demoModeEnabled) { + return; + } if (_certificate == null) { return; } diff --git a/lib/core/viewmodels/main_page/chat/chat_inside_view_model.dart b/lib/core/viewmodels/main_page/chat/chat_inside_view_model.dart index b11e70a3..631bd2c4 100644 --- a/lib/core/viewmodels/main_page/chat/chat_inside_view_model.dart +++ b/lib/core/viewmodels/main_page/chat/chat_inside_view_model.dart @@ -8,6 +8,7 @@ import 'dart:math'; import 'package:unn_mobile/core/aggregators/interfaces/message_service_aggregator.dart'; import 'package:unn_mobile/core/misc/authorisation/try_login_and_retrieve_data.dart'; import 'package:unn_mobile/core/misc/date_time_utilities/date_time_extensions.dart'; +import 'package:unn_mobile/core/misc/demo_mode_status.dart'; import 'package:unn_mobile/core/misc/objects_with_pagination.dart'; import 'package:unn_mobile/core/misc/user/current_user_sync_storage.dart'; import 'package:unn_mobile/core/models/common/file_data.dart'; @@ -311,6 +312,9 @@ class ChatInsideViewModel extends BaseViewModel { int chatId, List messages, ) async { + if (DemoModeStatus.demoModeEnabled) { + return; + } await _messagesAggregator.readMessages( chatId: chatId, messageIds: messages.map((m) => m.messageId), @@ -321,6 +325,9 @@ class ChatInsideViewModel extends BaseViewModel { FutureOr Function() sendFunction, ) async => await typedBusyCallAsync(() async { + if (DemoModeStatus.demoModeEnabled) { + return false; + } if (_dialog == null) { return false; } diff --git a/lib/core/viewmodels/main_page/chat/message_reaction_view_model.dart b/lib/core/viewmodels/main_page/chat/message_reaction_view_model.dart index cea5b08b..2e949005 100644 --- a/lib/core/viewmodels/main_page/chat/message_reaction_view_model.dart +++ b/lib/core/viewmodels/main_page/chat/message_reaction_view_model.dart @@ -5,6 +5,7 @@ import 'dart:async'; import 'package:injector/injector.dart'; import 'package:unn_mobile/core/aggregators/interfaces/message_reaction_service_aggregator.dart'; +import 'package:unn_mobile/core/misc/demo_mode_status.dart'; import 'package:unn_mobile/core/models/feed/rating_list.dart'; import 'package:unn_mobile/core/models/profile/user_short_info.dart'; import 'package:unn_mobile/core/viewmodels/factories/message_reaction_view_model_factory.dart'; @@ -32,6 +33,9 @@ class MessageReactionViewModel extends ReactionViewModelBase { @override FutureOr setReaction(ReactionType? reaction) async { + if (DemoModeStatus.demoModeEnabled) { + return; + } if (profileId == ReactionViewModelBase.noId) { return; } diff --git a/lib/core/viewmodels/main_page/feed/feed_post_view_model.dart b/lib/core/viewmodels/main_page/feed/feed_post_view_model.dart index d2e9d7bb..185c8b11 100644 --- a/lib/core/viewmodels/main_page/feed/feed_post_view_model.dart +++ b/lib/core/viewmodels/main_page/feed/feed_post_view_model.dart @@ -4,6 +4,7 @@ import 'package:event/event.dart'; import 'package:html_unescape/html_unescape.dart'; import 'package:injector/injector.dart'; +import 'package:unn_mobile/core/misc/demo_mode_status.dart'; import 'package:unn_mobile/core/models/feed/blog_post.dart'; import 'package:unn_mobile/core/models/feed/blog_post_data.dart'; import 'package:unn_mobile/core/providers/interfaces/feed/last_feed_load_date_time_provider.dart'; @@ -123,6 +124,9 @@ class FeedPostViewModel extends BaseViewModel { } Future togglePin() async { + if (DemoModeStatus.demoModeEnabled) { + return; + } final pinnedId = blogData.pinnedId ?? 0; final success = isPinned ? await _pinningService.unpin(pinnedId) @@ -135,6 +139,9 @@ class FeedPostViewModel extends BaseViewModel { } Future markReadIfImportant() async { + if (DemoModeStatus.demoModeEnabled) { + return; + } if (!isAnnouncement) { return; } diff --git a/lib/core/viewmodels/main_page/feed/reaction_view_model.dart b/lib/core/viewmodels/main_page/feed/reaction_view_model.dart index 4e29c783..86805c55 100644 --- a/lib/core/viewmodels/main_page/feed/reaction_view_model.dart +++ b/lib/core/viewmodels/main_page/feed/reaction_view_model.dart @@ -2,6 +2,7 @@ // Copyright 2025 BitCodersNN import 'package:injector/injector.dart'; +import 'package:unn_mobile/core/misc/demo_mode_status.dart'; import 'package:unn_mobile/core/models/feed/rating_list.dart'; import 'package:unn_mobile/core/models/profile/user_short_info.dart'; import 'package:unn_mobile/core/services/interfaces/feed/legacy/getting_rating_list.dart'; @@ -70,6 +71,9 @@ class ReactionViewModel extends ReactionViewModelBase { @override Future setReaction(ReactionType? reaction) async { + if (DemoModeStatus.demoModeEnabled) { + return; + } if (profileId == ReactionViewModelBase.noId) { return; } diff --git a/pubspec.yaml b/pubspec.yaml index 150e87f6..ef9f32fe 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: unn_mobile description: A mobile application for UNN Portal website publish_to: 'none' -version: 0.6.0+392 +version: 0.6.0+395 environment: sdk: '>=3.1.2 <4.0.0'