diff --git a/.env b/.env index 516fc2a2e..a34fd2495 100644 --- a/.env +++ b/.env @@ -11,3 +11,5 @@ RC_STRIPE_KEY = 'strp_YWZxWUeEfvagiefDNoofinaRCOl' RC_OFFERING_NAME = 'test' STRIPE_MANAGEMENT_LINK = 'https://billing.stripe.com/p/login/test_9AQaI8d3O9lmaXe5kk' + +SUPPORT_SPACE_ID = '!gqSNSkvwTpgumyjLsV:staging.pangea.chat' \ No newline at end of file diff --git a/assets/.env b/assets/.env index 516fc2a2e..d937e442e 100644 --- a/assets/.env +++ b/assets/.env @@ -11,3 +11,5 @@ RC_STRIPE_KEY = 'strp_YWZxWUeEfvagiefDNoofinaRCOl' RC_OFFERING_NAME = 'test' STRIPE_MANAGEMENT_LINK = 'https://billing.stripe.com/p/login/test_9AQaI8d3O9lmaXe5kk' + +SUPPORT_SPACE_ID = '!gqSNSkvwTpgumyjLsV:staging.pangea.chat' diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index d2239141f..66d77ea12 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -333,7 +333,6 @@ class ChatController extends State ), ); } - await Matrix.of(context).client.roomsLoading; }); // Pangea# tryLoadTimeline(); diff --git a/lib/pages/chat_details/chat_details.dart b/lib/pages/chat_details/chat_details.dart index 126ec0826..14f1efbe1 100644 --- a/lib/pages/chat_details/chat_details.dart +++ b/lib/pages/chat_details/chat_details.dart @@ -12,6 +12,7 @@ import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:go_router/go_router.dart'; import 'package:image_picker/image_picker.dart'; +import 'package:matrix/matrix.dart' as sdk; import 'package:matrix/matrix.dart'; enum AliasActions { copy, delete, setCanonical } @@ -226,6 +227,23 @@ class ChatDetailsController extends State { ); } + Future setVisibility(sdk.Visibility visibility) async { + if (roomId == null) return; + final room = Matrix.of(context).client.getRoomById(roomId!); + if (room == null) return; + + await showFutureLoadingDialog( + context: context, + future: () async { + await room.client.setRoomVisibilityOnDirectory( + room.id, + visibility: visibility, + ); + }, + ); + setState(() {}); + } + Future toggleMute() async { final client = Matrix.of(context).client; final Room? room = client.getRoomById(roomId!); diff --git a/lib/pangea/config/environment.dart b/lib/pangea/config/environment.dart index c9069e183..8a3a5beb2 100644 --- a/lib/pangea/config/environment.dart +++ b/lib/pangea/config/environment.dart @@ -70,6 +70,11 @@ class Environment { 'https://billing.stripe.com/p/login/dR6dSkf5p6rBc4EcMM'; } + static String get supportSpaceId { + return dotenv.env["SUPPORT_SPACE_ID"] ?? + '!gqSNSkvwTpgumyjLsV:staging.pangea.chat'; + } + static String get supportUserId { return isStaging ? '@support:staging.pangea.chat' : '@support:pangea.chat'; } diff --git a/lib/pangea/constants/model_keys.dart b/lib/pangea/constants/model_keys.dart index 20c95a6fd..b3f89e8c5 100644 --- a/lib/pangea/constants/model_keys.dart +++ b/lib/pangea/constants/model_keys.dart @@ -11,6 +11,7 @@ class ModelKey { static const String userSourceLanguage = 'source_language'; static const String userSpeaks = 'speaks'; static const String userCountry = 'country'; + static const String hasJoinedHelpSpace = 'has_joined_help_space'; static const String userInterests = 'interests'; static const String l2LanguageKey = 'target_language'; static const String l1LanguageKey = 'source_language'; diff --git a/lib/pangea/controllers/pangea_controller.dart b/lib/pangea/controllers/pangea_controller.dart index f09457d34..02dbe0537 100644 --- a/lib/pangea/controllers/pangea_controller.dart +++ b/lib/pangea/controllers/pangea_controller.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:developer'; import 'dart:math'; +import 'package:fluffychat/pangea/config/environment.dart'; import 'package:fluffychat/pangea/constants/bot_mode.dart'; import 'package:fluffychat/pangea/constants/class_default_values.dart'; import 'package:fluffychat/pangea/constants/pangea_event_types.dart'; @@ -92,6 +93,7 @@ class PangeaController { startChatWithBotIfNotPresent(); inviteBotToExistingSpaces(); setPangeaPushRules(); + joinSupportSpace(); } /// Initialize controllers @@ -426,4 +428,39 @@ class PangeaController { ); } } + + /// Joins the user to the support space if they are + /// not already a member and have not previously left. + Future joinSupportSpace() async { + // if the user is already in the space, return + await matrixState.client.roomsLoading; + final isInSupportSpace = matrixState.client.rooms.any( + (room) => room.id == Environment.supportSpaceId, + ); + if (isInSupportSpace) return; + + // if the user has previously joined the space, return + final bool previouslyJoined = + userController.profile.userSettings.hasJoinedHelpSpace ?? false; + if (previouslyJoined) return; + + // join the space + try { + await matrixState.client.joinRoomById(Environment.supportSpaceId); + final room = matrixState.client.getRoomById(Environment.supportSpaceId); + if (room == null) { + await matrixState.client.waitForRoomInSync( + Environment.supportSpaceId, + join: true, + ); + } + userController.updateProfile((profile) { + profile.userSettings.hasJoinedHelpSpace = true; + return profile; + }); + } catch (err, s) { + ErrorHandler.logError(e: err, s: s); + return; + } + } } diff --git a/lib/pangea/models/user_model.dart b/lib/pangea/models/user_model.dart index 97a5f814a..50456fc3e 100644 --- a/lib/pangea/models/user_model.dart +++ b/lib/pangea/models/user_model.dart @@ -18,6 +18,7 @@ class UserSettings { String? targetLanguage; String? sourceLanguage; String? country; + bool? hasJoinedHelpSpace; UserSettings({ this.dateOfBirth, @@ -29,6 +30,7 @@ class UserSettings { this.targetLanguage, this.sourceLanguage, this.country, + this.hasJoinedHelpSpace, }); factory UserSettings.fromJson(Map json) => UserSettings( @@ -43,6 +45,7 @@ class UserSettings { targetLanguage: json[ModelKey.l2LanguageKey], sourceLanguage: json[ModelKey.l1LanguageKey], country: json[ModelKey.userCountry], + hasJoinedHelpSpace: json[ModelKey.hasJoinedHelpSpace], ); Map toJson() { @@ -56,6 +59,7 @@ class UserSettings { data[ModelKey.l2LanguageKey] = targetLanguage; data[ModelKey.l1LanguageKey] = sourceLanguage; data[ModelKey.userCountry] = country; + data[ModelKey.hasJoinedHelpSpace] = hasJoinedHelpSpace; return data; } diff --git a/lib/pangea/pages/chat_details/pangea_chat_details.dart b/lib/pangea/pages/chat_details/pangea_chat_details.dart index ccc9baed3..2edb04e7a 100644 --- a/lib/pangea/pages/chat_details/pangea_chat_details.dart +++ b/lib/pangea/pages/chat_details/pangea_chat_details.dart @@ -316,10 +316,9 @@ class PangeaChatDetailsView extends StatelessWidget { if (room.isRoomAdmin) VisibilityToggle( room: room, - setVisibility: (_) async {}, + setVisibility: controller.setVisibility, setJoinRules: controller.setJoinRules, iconColor: iconColor, - showSearchToggle: false, ), if (room.isRoomAdmin) Divider(color: theme.dividerColor, height: 1),