Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -61,63 +61,61 @@ class ActivityParticipantList extends StatelessWidget {
spacing: 8.0,
mainAxisAlignment: MainAxisAlignment.center,
children: availableRoles.map((availableRole) {
final selected = isSelected != null
? isSelected!(availableRole.id)
: false;
final selected = isSelected != null
? isSelected!(availableRole.id)
: false;

final assignedRole =
assignedRoles[availableRole.id] ??
(selected
? ActivityRoleModel(
id: availableRole.id,
userId: Matrix.of(context).client.userID!,
role: availableRole.name,
)
: null);
final assignedRole =
assignedRoles[availableRole.id] ??
(selected
? ActivityRoleModel(
id: availableRole.id,
userId: Matrix.of(context).client.userID!,
role: availableRole.name,
)
: null);

final User? user =
participants.participants.firstWhereOrNull(
(u) => u.id == assignedRole?.userId,
) ??
course?.getParticipants().firstWhereOrNull(
(u) => u.id == assignedRole?.userId,
);
final User? user =
participants.participants.firstWhereOrNull(
(u) => u.id == assignedRole?.userId,
) ??
course?.getParticipants().firstWhereOrNull(
(u) => u.id == assignedRole?.userId,
);

final selectable = canSelect != null
? canSelect!(availableRole.id)
: true;
final selectable = canSelect != null
? canSelect!(availableRole.id)
: true;

final shimmering = isShimmering != null
? isShimmering!(availableRole.id)
: false;
final shimmering = isShimmering != null
? isShimmering!(availableRole.id)
: false;

final starsMode = showStarsCard != null &&
showStarsCard!(availableRole.id);
final starsMode =
showStarsCard != null && showStarsCard!(availableRole.id);

return Expanded(
child: ActivityParticipantIndicator(
name: availableRole.name,
userId: assignedRole?.userId,
opacity: getOpacity != null
? getOpacity!(assignedRole)
: 1.0,
user: user,
onTap: onTap != null && selectable
? () => onTap!(availableRole.id)
: null,
selected: selected,
selectable: selectable,
shimmer: shimmering,
room: room,
goals: starsMode
? availableRole.allGoals
: null,
completedGoalIds: starsMode
? completedGoalsForRole?.call(availableRole.id)
: null,
),
);
}).toList(),
return Expanded(
child: ActivityParticipantIndicator(
name: availableRole.name,
userId: assignedRole?.userId,
opacity: getOpacity != null
? getOpacity!(assignedRole)
: 1.0,
user: user,
onTap: onTap != null && selectable
? () => onTap!(availableRole.id)
: null,
selected: selected,
selectable: selectable,
shimmer: shimmering,
room: room,
goals: starsMode ? availableRole.allGoals : null,
completedGoalIds: starsMode
? completedGoalsForRole?.call(availableRole.id)
: null,
),
);
}).toList(),
),
Wrap(
alignment: WrapAlignment.center,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,9 @@ class _NotStartedSessionBottomContent extends StatelessWidget {

@override
Widget build(BuildContext context) {
if (controller.subPage.visibleStatuses.isEmpty) return const SizedBox.shrink();
if (controller.subPage.visibleStatuses.isEmpty) {
return const SizedBox.shrink();
}

return ConstrainedBox(
constraints: const BoxConstraints(
Expand Down
41 changes: 19 additions & 22 deletions lib/pangea/analytics_data/analytics_data_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import 'package:fluffychat/pangea/analytics_misc/construct_use_type_enum.dart';
import 'package:fluffychat/pangea/analytics_misc/constructs_event.dart';
import 'package:fluffychat/pangea/analytics_misc/constructs_model.dart';
import 'package:fluffychat/pangea/analytics_settings/analytics_settings_extension.dart';
import 'package:fluffychat/pangea/analytics_settings/analytics_settings_model.dart';
import 'package:fluffychat/pangea/common/utils/error_handler.dart';
import 'package:fluffychat/pangea/constructs/construct_identifier.dart';
import 'package:fluffychat/pangea/constructs/construct_level_enum.dart';
Expand Down Expand Up @@ -223,9 +224,8 @@ class AnalyticsDataService {
language,
);

final blocked = blockedConstructs;
_mergeTable.addConstructs(vocab, blocked);
_mergeTable.addConstructs(morph, blocked);
_mergeTable.addConstructs(vocab);
_mergeTable.addConstructs(morph);
}

Future<void> reinitialize() async {
Expand Down Expand Up @@ -275,21 +275,21 @@ class AnalyticsDataService {
Future<void> _ensureInitialized() =>
initCompleter.isCompleted ? Future.value() : initCompleter.future;

int numConstructs(ConstructTypeEnum type) =>
_mergeTable.uniqueConstructsByType(type);

bool hasUsedConstruct(ConstructIdentifier id) =>
_mergeTable.constructUsed(id);

bool isConstructBlocked(ConstructIdentifier id) =>
blockedConstructs.contains(id);
int uniqueConstructsByType(ConstructTypeEnum type) {
final constructIds = _mergeTable.uniqueConstructsByType(type);
final blocked = blockedConstructs;
return constructIds.where((c) => !blocked.containsKey(c)).length;
}

int uniqueConstructsByType(ConstructTypeEnum type) =>
_mergeTable.uniqueConstructsByType(type);
Map<ConstructIdentifier, BlockedConstruct> get blockedConstructs {
if (_analyticsClient == null) return {};

Set<ConstructIdentifier> get blockedConstructs {
final analyticsRoom =
_analyticsClientGetter.client.ownAnalyticsRoomLocalByL2;

return analyticsRoom?.blockedConstructs ?? {};
}

Expand Down Expand Up @@ -337,7 +337,7 @@ class AnalyticsDataService {

final Map<ConstructIdentifier, DateTime?> cappedLastUseCache = {};
for (final use in uses) {
if (blocked.contains(use.identifier)) continue;
if (blocked.containsKey(use.identifier)) continue;
if (use.identifier.isInvalid) continue;

if (!cappedLastUseCache.containsKey(use.identifier)) {
Expand Down Expand Up @@ -370,8 +370,7 @@ class AnalyticsDataService {
String language,
) async {
await _ensureInitialized();
final blocked = blockedConstructs;
final ids = _mergeTable.groupedIds(_mergeTable.resolve(id), blocked);
final ids = _mergeTable.groupedIds(_mergeTable.resolve(id));
if (ids.isEmpty) {
return ConstructUses(
uses: [],
Expand All @@ -392,8 +391,8 @@ class AnalyticsDataService {
final Map<ConstructIdentifier, List<ConstructIdentifier>> request = {};
final blocked = blockedConstructs;
for (final id in ids) {
if (blocked.contains(id)) continue;
request[id] = _mergeTable.groupedIds(_mergeTable.resolve(id), blocked);
if (blocked.containsKey(id)) continue;
request[id] = _mergeTable.groupedIds(_mergeTable.resolve(id));
}

return _analyticsClientGetter.database.getConstructUses(request, language);
Expand All @@ -417,7 +416,7 @@ class AnalyticsDataService {
final existing = cleaned[canonical];
if (existing != null) {
existing.merge(entry);
} else if (!blocked.contains(canonical) && !canonical.isInvalid) {
} else if (!blocked.containsKey(canonical) && !canonical.isInvalid) {
cleaned[canonical] = entry;
}
}
Expand All @@ -437,7 +436,7 @@ class AnalyticsDataService {
.where(
(c) =>
c.constructType == type &&
!blocked.contains(c.identifier) &&
!blocked.containsKey(c.identifier) &&
c.identifier.category != 'other',
)
.toList();
Expand Down Expand Up @@ -486,12 +485,11 @@ class AnalyticsDataService {
_invalidateCaches();
await _ensureInitialized();

final blocked = blockedConstructs;
final newUnusedConstructs = updateIds
.where((id) => !hasUsedConstruct(id))
.toSet();

_mergeTable.addConstructsByUses(addedConstructs, blocked);
_mergeTable.addConstructsByUses(addedConstructs);
await _analyticsClientGetter.database.updateLocalAnalytics(
addedConstructs,
language,
Expand Down Expand Up @@ -588,9 +586,8 @@ class AnalyticsDataService {
String language,
) async {
_invalidateCaches();
final blocked = blockedConstructs;
for (final event in events) {
_mergeTable.addConstructsByUses(event.content.uses, blocked);
_mergeTable.addConstructsByUses(event.content.uses);
}
await _analyticsClientGetter.database.updateServerAnalytics(
events,
Expand Down
32 changes: 22 additions & 10 deletions lib/pangea/analytics_data/analytics_sync_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -156,20 +156,32 @@ class AnalyticsSyncController {
String language,
) async {
for (final event in events) {
final current = AnalyticsSettingsModel.fromJson(event.content);
final prevContent =
event.unsigned?['prev_content'] as Map<String, Object?>?;
final prev = prevContent != null
? AnalyticsSettingsModel.fromJson(prevContent)
: null;
Map<ConstructIdentifier, BlockedConstruct> newBlocked = {};
Map<ConstructIdentifier, BlockedConstruct> prevBlocked = {};

try {
final current = AnalyticsSettingsModel.fromJson(event.content);
final prevContent =
event.unsigned?['prev_content'] as Map<String, Object?>?;
final prev = prevContent != null
? AnalyticsSettingsModel.fromJson(prevContent)
: null;

newBlocked = current.blockedConstructs;
prevBlocked = prev?.blockedConstructs ?? {};
} catch (_) {
continue;
}

final newBlocked = current.blockedConstructs;
final prevBlocked = prev?.blockedConstructs ?? {};
final Set<ConstructIdentifier> newlyBlocked = {};
for (final value in newBlocked.values) {
final prevEntry = prevBlocked[value.constructId];
if (prevEntry != value) newlyBlocked.add(value.constructId);
}

final newlyBlocked = newBlocked.where((c) => !prevBlocked.contains(c));
if (newlyBlocked.isEmpty) continue;
await dataService.updateDispatcher.sendBlockedConstructsUpdate(
newlyBlocked.toSet(),
newlyBlocked,
language,
);
}
Expand Down
20 changes: 13 additions & 7 deletions lib/pangea/analytics_data/analytics_update_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,12 @@ import 'package:sentry_flutter/sentry_flutter.dart';

import 'package:fluffychat/pangea/analytics_data/analytics_data_service.dart';
import 'package:fluffychat/pangea/analytics_data/analytics_update_dispatcher.dart';
import 'package:fluffychat/pangea/analytics_misc/construct_use_model.dart';
import 'package:fluffychat/pangea/analytics_misc/constructs_model.dart';
import 'package:fluffychat/pangea/analytics_misc/saved_analytics_extension.dart';
import 'package:fluffychat/pangea/analytics_misc/user_lemma_info_extension.dart';
import 'package:fluffychat/pangea/analytics_settings/analytics_settings_extension.dart';
import 'package:fluffychat/pangea/analytics_settings/analytics_settings_model.dart';
import 'package:fluffychat/pangea/common/utils/error_handler.dart';
import 'package:fluffychat/pangea/constructs/construct_identifier.dart';
import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart';
Expand Down Expand Up @@ -159,17 +161,21 @@ class AnalyticsUpdateService {
await analyticsRoom.addActivityRoomIds({roomId});
}

Future<void> blockConstructs(List<ConstructIdentifier> constructIds) async {
Future<void> blockConstructs(List<ConstructUses> constructs) async {
final analyticsRoom = await _getAnalyticsRoom();
if (analyticsRoom == null) return;

final current = analyticsRoom.analyticsSettings;
final blockedConstructs = current.blockedConstructs;
final updated = current.copyWith(
blockedConstructs: {...blockedConstructs, ...constructIds},
);
final Map<ConstructIdentifier, BlockedConstruct> blocked = {};
for (final construct in constructs) {
final snapshot = ConstructSnapshot(points: construct.points);
blocked[construct.id] = BlockedConstruct(
constructId: construct.id,
timestamp: DateTime.now(),
snapshot: snapshot,
);
}

await analyticsRoom.setAnalyticsSettings(updated);
await analyticsRoom.addBlockedConstructs(blocked);
}

Future<void> setLemmaInfo(
Expand Down
Loading
Loading