import 'dart:async'; import 'dart:developer'; import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:collection/collection.dart'; import 'package:fluffychat/pangea/constants/class_default_values.dart'; import 'package:fluffychat/pangea/constants/model_keys.dart'; import 'package:fluffychat/pangea/constants/pangea_room_types.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; import 'package:fluffychat/pangea/models/analytics/analytics_event.dart'; import 'package:fluffychat/pangea/models/analytics/constructs_event.dart'; import 'package:fluffychat/pangea/models/analytics/summary_analytics_event.dart'; import 'package:fluffychat/pangea/models/analytics/summary_analytics_model.dart'; import 'package:fluffychat/pangea/models/bot_options_model.dart'; import 'package:fluffychat/pangea/models/class_model.dart'; import 'package:fluffychat/pangea/models/tokens_event_content_model.dart'; import 'package:fluffychat/pangea/utils/bot_name.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:future_loading_dialog/future_loading_dialog.dart'; // import markdown.dart import 'package:html_unescape/html_unescape.dart'; import 'package:matrix/matrix.dart'; import 'package:matrix/src/utils/markdown.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; import '../../../config/app_config.dart'; import '../../constants/pangea_event_types.dart'; import '../../enum/use_type.dart'; import '../../models/choreo_record.dart'; import '../../models/representation_content_model.dart'; import '../client_extension/client_extension.dart'; part "children_and_parents_extension.dart"; part "class_and_exchange_settings_extension.dart"; part "events_extension.dart"; part "room_analytics_extension.dart"; part "room_information_extension.dart"; part "room_settings_extension.dart"; part "user_permissions_extension.dart"; extension PangeaRoom on Room { // analytics Future joinAnalyticsRoomsInSpace() async => await _joinAnalyticsRoomsInSpace(); Future ensureAnalyticsRoomExists() async => await _ensureAnalyticsRoomExists(); Future addAnalyticsRoomToSpace(Room analyticsRoom) async => await _addAnalyticsRoomToSpace(analyticsRoom); Future addAnalyticsRoomToSpaces() async => await _addAnalyticsRoomToSpaces(); Future addAnalyticsRoomsToSpace() async => await _addAnalyticsRoomsToSpace(); Future inviteSpaceTeachersToAnalyticsRoom(Room analyticsRoom) async => await _inviteSpaceTeachersToAnalyticsRoom(analyticsRoom); Future inviteTeachersToAnalyticsRoom() async => await _inviteTeachersToAnalyticsRoom(); // Invite teachers of 1 space to all users' analytics rooms Future inviteSpaceTeachersToAnalyticsRooms() async => await _inviteSpaceTeachersToAnalyticsRooms(); Future getLastAnalyticsEvent( String type, String userId, ) async => await _getLastAnalyticsEvent(type, userId); Future analyticsLastUpdated(String type, String userId) async { return await _analyticsLastUpdated(type, userId); } Future?> getAnalyticsEvents({ required String type, required String userId, DateTime? since, }) async => await _getAnalyticsEvents(type: type, since: since, userId: userId); String? get madeForLang => _madeForLang; bool isMadeForLang(String langCode) => _isMadeForLang(langCode); // children_and_parents List get joinedChildren => _joinedChildren; List get joinedChildrenRoomIds => _joinedChildrenRoomIds; Future> getChildRooms() async => await _getChildRooms(); Future joinSpaceChild(String roomID) async => await _joinSpaceChild(roomID); Room? firstParentWithState(String stateType) => _firstParentWithState(stateType); List get immediateClassParents => _immediateClassParents; List get pangeaSpaceParents => _pangeaSpaceParents; List get allSpaceChildRoomIds => _allSpaceChildRoomIds; // class_and_exchange_settings DateTime? get rulesUpdatedAt => _rulesUpdatedAt; String get classCode => _classCode; void checkClass() => _checkClass(); List get students => _students; Future> get teachers async => await _teachers; Future setClassPowerLevels() async => await _setClassPowerLevels(); DateTime? get classSettingsUpdatedAt => _classSettingsUpdatedAt; ClassSettingsModel? get classSettings => _classSettings; Event? get languageSettingsStateEvent => _languageSettingsStateEvent; Event? get pangeaRoomRulesStateEvent => _pangeaRoomRulesStateEvent; ClassSettingsModel? get firstLanguageSettings => _firstLanguageSettings; // events Future leaveIfFull() async => await _leaveIfFull(); Future archive() async => await _archive(); Future archiveSpace( BuildContext context, Client client, { bool onlyAdmin = false, }) async => await _archiveSpace(context, client, onlyAdmin: onlyAdmin); Future leaveSpace(BuildContext context, Client client) async => await _leaveSpace(context, client); Future sendPangeaEvent({ required Map content, required String parentEventId, required String type, }) async => await _sendPangeaEvent( content: content, parentEventId: parentEventId, type: type, ); Future pangeaSendTextEvent( String message, { String? txid, Event? inReplyTo, String? editEventId, bool parseMarkdown = true, bool parseCommands = false, String msgtype = MessageTypes.Text, String? threadRootEventId, String? threadLastEventId, PangeaRepresentation? originalSent, PangeaRepresentation? originalWritten, PangeaMessageTokens? tokensSent, PangeaMessageTokens? tokensWritten, ChoreoRecord? choreo, UseType? useType, }) => _pangeaSendTextEvent( message, txid: txid, inReplyTo: inReplyTo, editEventId: editEventId, parseMarkdown: parseMarkdown, parseCommands: parseCommands, msgtype: msgtype, threadRootEventId: threadRootEventId, threadLastEventId: threadLastEventId, originalSent: originalSent, originalWritten: originalWritten, tokensSent: tokensSent, tokensWritten: tokensWritten, choreo: choreo, useType: useType, ); Future updateStateEvent(Event stateEvent) => _updateStateEvent(stateEvent); // room_information Future get numNonAdmins async => await _numNonAdmins; DateTime? get creationTime => _creationTime; String? get creatorId => _creatorId; String get domainString => _domainString; bool isChild(String roomId) => _isChild(roomId); bool isFirstOrSecondChild(String roomId) => _isFirstOrSecondChild(roomId); bool get isExchange => _isExchange; bool get isDirectChatWithoutMe => _isDirectChatWithoutMe; // bool isMadeForLang(String langCode) => _isMadeForLang(langCode); Future get isBotRoom async => await _isBotRoom; Future get isBotDM async => await _isBotDM; bool get isLocked => _isLocked; bool get isPangeaClass => _isPangeaClass; bool isAnalyticsRoomOfUser(String userId) => _isAnalyticsRoomOfUser(userId); bool get isAnalyticsRoom => _isAnalyticsRoom; // room_settings Future updateRoomCapacity(int newCapacity) => _updateRoomCapacity(newCapacity); int? get capacity => _capacity; PangeaRoomRules? get pangeaRoomRules => _pangeaRoomRules; PangeaRoomRules? get firstRules => _firstRules; IconData? get roomTypeIcon => _roomTypeIcon; Text nameAndRoomTypeIcon([TextStyle? textStyle]) => _nameAndRoomTypeIcon(textStyle); BotOptionsModel? get botOptions => _botOptions; Future setSuggested(bool suggested) async => await _setSuggested(suggested); Future isSuggested() async => await _isSuggested(); // user_permissions Future isOnlyAdmin() async => await _isOnlyAdmin(); bool isMadeByUser(String userId) => _isMadeByUser(userId); bool get isSpaceAdmin => _isSpaceAdmin; bool isUserRoomAdmin(String userId) => _isUserRoomAdmin(userId); bool isUserSpaceAdmin(String userId) => _isUserSpaceAdmin(userId); bool get isRoomOwner => _isRoomOwner; bool get isRoomAdmin => _isRoomAdmin; bool get showClassEditOptions => _showClassEditOptions; bool get canDelete => _canDelete; bool canIAddSpaceChild(Room? room) => _canIAddSpaceChild(room); bool get canIAddSpaceParents => _canIAddSpaceParents; bool pangeaCanSendEvent(String eventType) => _pangeaCanSendEvent(eventType); int? get eventsDefaultPowerLevel => _eventsDefaultPowerLevel; }