Watch
1
0
Fork
You've already forked nexus
0
forked from Nexus/nexus

treewide: use dot shorthands where possible

Now this feature is stable, we should use it. I might have missed some usecases, but these can be added in future commits.
This commit is contained in:
Henry Hiles 2026-06-02 11:53:14 -04:00
commit d2ec5f035b
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
67 changed files with 391 additions and 534 deletions

View file

@ -4,10 +4,10 @@ import "package:nexus/models/account_data.dart";
class AccountDataController extends Notifier<IMap<String, AccountData>> { class AccountDataController extends Notifier<IMap<String, AccountData>> {
@override @override
IMap<String, AccountData> build() => const IMap.empty(); IMap<String, AccountData> build() => .new();
void update(IMap<String, AccountData> newData) => void update(IMap<String, AccountData> newData) =>
state = IMap({...state.unlock, ...newData.unlock}); state = .new({...state.unlock, ...newData.unlock});
static final provider = static final provider =
NotifierProvider<AccountDataController, IMap<String, AccountData>>( NotifierProvider<AccountDataController, IMap<String, AccountData>>(

View file

@ -1,7 +1,6 @@
import "dart:async"; import "dart:async";
import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:nexus/controllers/user_controller.dart"; import "package:nexus/controllers/user_controller.dart";
import "package:nexus/models/configs/user_config.dart";
import "package:nexus/models/content/membership.dart"; import "package:nexus/models/content/membership.dart";
import "package:nexus/models/event.dart"; import "package:nexus/models/event.dart";
@ -13,11 +12,11 @@ class AuthorController extends AsyncNotifier<MembershipContent> {
Future<MembershipContent> build() async { Future<MembershipContent> build() async {
final member = await ref.watch( final member = await ref.watch(
UserController.provider( UserController.provider(
UserConfig(roomId: event.roomId, userId: event.sender), .new(roomId: event.roomId, userId: event.sender),
).future, ).future,
); );
return MembershipContent( return .new(
status: member.status, status: member.status,
avatarUrl: event.pmp?.avatarUrl ?? member.avatarUrl, avatarUrl: event.pmp?.avatarUrl ?? member.avatarUrl,
displayName: event.pmp?.displayName ?? member.displayName, displayName: event.pmp?.displayName ?? member.displayName,

View file

@ -14,7 +14,6 @@ import "package:nexus/controllers/sync_status_controller.dart";
import "package:nexus/controllers/top_level_spaces_controller.dart"; import "package:nexus/controllers/top_level_spaces_controller.dart";
import "package:nexus/helpers/extensions/gomuks_buffer.dart"; import "package:nexus/helpers/extensions/gomuks_buffer.dart";
import "package:nexus/main.dart"; import "package:nexus/main.dart";
import "package:nexus/models/client_state.dart";
import "package:nexus/models/event.dart"; import "package:nexus/models/event.dart";
import "package:nexus/models/paginate.dart"; import "package:nexus/models/paginate.dart";
import "package:nexus/models/requests/get_event_request.dart"; import "package:nexus/models/requests/get_event_request.dart";
@ -31,7 +30,6 @@ import "package:nexus/models/requests/send_message_request.dart";
import "package:nexus/models/requests/set_membership_request.dart"; import "package:nexus/models/requests/set_membership_request.dart";
import "package:nexus/models/room.dart"; import "package:nexus/models/room.dart";
import "package:nexus/models/sync_data.dart"; import "package:nexus/models/sync_data.dart";
import "package:nexus/models/sync_status.dart";
import "package:nexus/src/third_party/gomuks.g.dart"; import "package:nexus/src/third_party/gomuks.g.dart";
import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:path_provider/path_provider.dart"; import "package:path_provider/path_provider.dart";
@ -66,12 +64,12 @@ class ClientController extends AsyncNotifier<int> {
case "client_state": case "client_state":
ref ref
.watch(ClientStateController.provider.notifier) .watch(ClientStateController.provider.notifier)
.set(ClientState.fromJson(decodedMuksEvent)); .set(.fromJson(decodedMuksEvent));
break; break;
case "sync_status": case "sync_status":
ref ref
.watch(SyncStatusController.provider.notifier) .watch(SyncStatusController.provider.notifier)
.set(SyncStatus.fromJson(decodedMuksEvent)); .set(.fromJson(decodedMuksEvent));
break; break;
case "init_complete": case "init_complete":
ref.watch(InitCompleteController.provider.notifier).complete(); ref.watch(InitCompleteController.provider.notifier).complete();
@ -81,12 +79,10 @@ class ClientController extends AsyncNotifier<int> {
ref ref
.watch(RoomsController.provider.notifier) .watch(RoomsController.provider.notifier)
.update( .update(
{ .new({
event.roomId: Room( event.roomId: .new(events: .new({event.rowId: event})),
events: {event.rowId: event}.toIMap(), }),
), .new(),
}.toIMap(),
const ISet.empty(),
); );
break; break;
@ -210,9 +206,11 @@ class ClientController extends AsyncNotifier<int> {
(await _sendCommand("get_room_state", request.toJson())) as List?; (await _sendCommand("get_room_state", request.toJson())) as List?;
final response = await getState(request); final response = await getState(request);
return (response ?? await getState(request.copyWith(refetch: true)) ?? []) return .new(
.map((event) => Event.fromJson(event)) (response ?? await getState(request.copyWith(refetch: true)) ?? []).map(
.toIList(); (event) => .fromJson(event),
),
);
} }
Future<IList<Event>?> getRelatedEvents( Future<IList<Event>?> getRelatedEvents(
@ -220,20 +218,20 @@ class ClientController extends AsyncNotifier<int> {
) async { ) async {
final response = final response =
(await _sendCommand("get_related_events", request.toJson())) as List?; (await _sendCommand("get_related_events", request.toJson())) as List?;
return response?.map((event) => Event.fromJson(event)).toIList(); return .new(response?.map((event) => .fromJson(event)));
} }
Future<Event?> getEvent(GetEventRequest request) async { Future<Event?> getEvent(GetEventRequest request) async {
final json = await _sendCommand("get_event", request.toJson()); final json = await _sendCommand("get_event", request.toJson());
return json == null ? null : Event.fromJson(json); return json == null ? null : .fromJson(json);
} }
Future<Paginate> paginate(PaginateRequest request) async => Future<Paginate> paginate(PaginateRequest request) async =>
Paginate.fromJson(await _sendCommand("paginate", request.toJson())); .fromJson(await _sendCommand("paginate", request.toJson()));
Future<Profile> getProfile(String userId) async { Future<Profile> getProfile(String userId) async {
final json = await _sendCommand("get_profile", {"user_id": userId}); final json = await _sendCommand("get_profile", {"user_id": userId});
return Profile.fromJsonWithCatch({...json, "id": userId}); return .fromJsonWithCatch({...json, "id": userId});
} }
Future<void> reportEvent(ReportRequest request) => Future<void> reportEvent(ReportRequest request) =>

View file

@ -5,9 +5,7 @@ class ClientStateController extends Notifier<ClientState?> {
@override @override
Null build() => null; Null build() => null;
void set(ClientState newState) { void set(ClientState newState) => state = newState;
state = newState;
}
static final provider = NotifierProvider<ClientStateController, ClientState?>( static final provider = NotifierProvider<ClientStateController, ClientState?>(
ClientStateController.new, ClientStateController.new,

View file

@ -2,11 +2,8 @@ import "package:cross_cache/cross_cache.dart";
import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:flutter_riverpod/flutter_riverpod.dart";
class CrossCacheController extends Notifier<CrossCache> { class CrossCacheController extends Notifier<CrossCache> {
static const String spaceKey = "space";
static const String roomKey = "room";
@override @override
CrossCache build() => CrossCache(); CrossCache build() => .new();
static final provider = NotifierProvider<CrossCacheController, CrossCache>( static final provider = NotifierProvider<CrossCacheController, CrossCache>(
CrossCacheController.new, CrossCacheController.new,

View file

@ -12,10 +12,7 @@ class EmojiController extends AsyncNotifier<EmojiTuple> {
@override @override
Future<EmojiTuple> build() async { Future<EmojiTuple> build() async {
final response = await get( final response = await get(
Uri.https( .https("github.com", "github/gemoji/raw/refs/heads/master/db/emoji.json"),
"github.com",
"github/gemoji/raw/refs/heads/master/db/emoji.json",
),
); );
if (response.statusCode != 200) { if (response.statusCode != 200) {
@ -30,19 +27,19 @@ class EmojiController extends AsyncNotifier<EmojiTuple> {
.toIList(); .toIList();
final categoryMap = entries.fold<IMap<String, IList<String>>>( final categoryMap = entries.fold<IMap<String, IList<String>>>(
const IMap.empty(), .new(),
(acc, entry) => acc.update( (acc, entry) => acc.update(
entry.category, entry.category,
(list) => list.add(entry.emoji), (list) => list.add(entry.emoji),
ifAbsent: () => IList([entry.emoji]), ifAbsent: () => .new([entry.emoji]),
), ),
); );
final keywordMap = entries.fold<IMap<String, IList<String>>>( final keywordMap = entries.fold<IMap<String, IList<String>>>(
const IMap.empty(), .new(),
(acc, entry) => acc.add( (acc, entry) => acc.add(
entry.emoji, entry.emoji,
IList<String>([...entry.tags, ...entry.aliases, entry.description]), .new([...entry.tags, ...entry.aliases, entry.description]),
), ),
); );
@ -71,9 +68,9 @@ class EmojiController extends AsyncNotifier<EmojiTuple> {
); );
final customKeywords = IMap( final customKeywords = IMap(
Map.fromEntries( .fromEntries(
keywordMap.entries.map( keywordMap.entries.map(
(e) => MapEntry(e.key, e.value.toList(growable: false)), (e) => .new(e.key, e.value.toList(growable: false)),
), ),
), ),
); );

View file

@ -16,7 +16,7 @@ class MembersController extends AsyncNotifier<ISet<Event>> {
RoomsController.provider.select((value) => value[roomId]), RoomsController.provider.select((value) => value[roomId]),
); );
if (room == null) return const ISet.empty(); if (room == null) return .new();
if (!room.hasFetchedMembers) { if (!room.hasFetchedMembers) {
final fetchedState = await ref final fetchedState = await ref
@ -38,7 +38,7 @@ class MembersController extends AsyncNotifier<ISet<Event>> {
.map((rowId) => room.events[rowId]) .map((rowId) => room.events[rowId])
.nonNulls .nonNulls
.toISet() ?? .toISet() ??
const ISet.empty(); .new();
} }
static final provider = AsyncNotifierProvider.autoDispose static final provider = AsyncNotifierProvider.autoDispose

View file

@ -7,9 +7,8 @@ class MultiProviderController extends AsyncNotifier<void> {
final IList<AsyncNotifierProvider> providers; final IList<AsyncNotifierProvider> providers;
@override @override
FutureOr<void> build() async => await Future.wait( Future<void> build() =>
providers.map((provider) => ref.watch(provider.future)), .wait(providers.map((provider) => ref.watch(provider.future)));
);
static final provider = static final provider =
AsyncNotifierProvider.family< AsyncNotifierProvider.family<

View file

@ -4,7 +4,6 @@ import "package:nexus/controllers/rooms_controller.dart";
import "package:nexus/models/configs/power_level_config.dart"; import "package:nexus/models/configs/power_level_config.dart";
import "package:nexus/models/content/content.dart"; import "package:nexus/models/content/content.dart";
import "package:nexus/models/content/power_levels.dart"; import "package:nexus/models/content/power_levels.dart";
import "package:nexus/models/requests/membership_action.dart";
class PowerLevelController extends Notifier<bool> { class PowerLevelController extends Notifier<bool> {
final PowerLevelConfig config; final PowerLevelConfig config;
@ -14,7 +13,7 @@ class PowerLevelController extends Notifier<bool> {
bool build() { bool build() {
if (config case EventPowerLevelConfig(:final eventType)) { if (config case EventPowerLevelConfig(:final eventType)) {
assert( assert(
eventType != EventType.redaction, eventType != .redaction,
"Checking power level for a redaction should use [PowerLevelConfig.redaction].", "Checking power level for a redaction should use [PowerLevelConfig.redaction].",
); );
} }
@ -29,6 +28,7 @@ class PowerLevelController extends Notifier<bool> {
final content = event?.content is PowerLevelsContent final content = event?.content is PowerLevelsContent
? event!.content ? event!.content
: PowerLevelsContent(); : PowerLevelsContent();
final user = ref.watch( final user = ref.watch(
ClientStateController.provider.select((value) => value?.userId), ClientStateController.provider.select((value) => value?.userId),
); );
@ -45,15 +45,15 @@ class PowerLevelController extends Notifier<bool> {
MembershipActionPowerLevelConfig(:final action, :final targetUser) => MembershipActionPowerLevelConfig(:final action, :final targetUser) =>
switch (action) { switch (action) {
MembershipAction.invite => userLevel >= content.invite, .invite => userLevel >= content.invite,
MembershipAction.kick => .kick =>
userLevel >= content.kick && userLevel > powerLevelOf(targetUser), userLevel >= content.kick && userLevel > powerLevelOf(targetUser),
MembershipAction.ban => .ban =>
userLevel >= content.ban && userLevel > powerLevelOf(targetUser), userLevel >= content.ban && userLevel > powerLevelOf(targetUser),
MembershipAction.unban => userLevel >= content.ban, .unban => userLevel >= content.ban,
}, },
StatePowerLevelConfig(:final eventType) => StatePowerLevelConfig(:final eventType) =>

View file

@ -4,7 +4,6 @@ import "package:nexus/controllers/client_controller.dart";
import "package:nexus/controllers/rooms_controller.dart"; import "package:nexus/controllers/rooms_controller.dart";
import "package:nexus/models/configs/reactions_config.dart"; import "package:nexus/models/configs/reactions_config.dart";
import "package:nexus/models/content/reaction.dart"; import "package:nexus/models/content/reaction.dart";
import "package:nexus/models/requests/get_related_events_request.dart";
class ReactionsController extends AsyncNotifier<IMap<String, IList<String>>> { class ReactionsController extends AsyncNotifier<IMap<String, IList<String>>> {
final ReactionsConfig config; final ReactionsConfig config;
@ -23,7 +22,7 @@ class ReactionsController extends AsyncNotifier<IMap<String, IList<String>>> {
? await ref ? await ref
.watch(ClientController.provider.notifier) .watch(ClientController.provider.notifier)
.getRelatedEvents( .getRelatedEvents(
GetRelatedEventsRequest( .new(
roomId: config.roomId, roomId: config.roomId,
eventId: eventInfo!.$1, eventId: eventInfo!.$1,
relationType: "m.annotation", relationType: "m.annotation",
@ -33,18 +32,18 @@ class ReactionsController extends AsyncNotifier<IMap<String, IList<String>>> {
return reactionEvents return reactionEvents
?.where((event) => event.redactedBy == null) ?.where((event) => event.redactedBy == null)
.fold<IMap<String, IList<String>>>(IMap(), (acc, event) { .fold<IMap<String, IList<String>>>(.new(), (acc, event) {
if (event.content case ReactionContent(:final key?)) { if (event.content case ReactionContent(:final key?)) {
return acc.update( return acc.update(
key, key,
(list) => list.add(event.sender), (list) => list.add(event.sender),
ifAbsent: () => IList([event.sender]), ifAbsent: () => .new([event.sender]),
); );
} }
return acc; return acc;
}) ?? }) ??
const IMap.empty(); .new();
} }
static final provider = static final provider =

View file

@ -9,12 +9,8 @@ import "package:nexus/controllers/rooms_controller.dart";
import "package:nexus/models/content/content.dart"; import "package:nexus/models/content/content.dart";
import "package:nexus/models/content/reaction.dart"; import "package:nexus/models/content/reaction.dart";
import "package:nexus/models/event.dart"; import "package:nexus/models/event.dart";
import "package:nexus/models/requests/get_related_events_request.dart";
import "package:nexus/models/requests/get_room_state_request.dart";
import "package:nexus/models/requests/paginate_request.dart";
import "package:nexus/models/requests/redact_event_request.dart"; import "package:nexus/models/requests/redact_event_request.dart";
import "package:nexus/models/relation_type.dart"; import "package:nexus/models/relation_type.dart";
import "package:nexus/models/requests/send_event_request.dart";
import "package:nexus/models/requests/send_message_request.dart"; import "package:nexus/models/requests/send_message_request.dart";
import "package:nexus/models/room.dart"; import "package:nexus/models/room.dart";
@ -28,12 +24,10 @@ class RoomChatController extends AsyncNotifier<IList<Event>> {
final room = ref.watch( final room = ref.watch(
RoomsController.provider.select((rooms) => rooms[roomId]), RoomsController.provider.select((rooms) => rooms[roomId]),
); );
if (room == null) return const IList.empty(); if (room == null) return .new();
if (!room.hasFetchedState) { if (!room.hasFetchedState) {
final state = await client.getRoomState( final state = await client.getRoomState(.new(roomId: roomId));
GetRoomStateRequest(roomId: roomId),
);
await ref.read(RoomsController.provider.notifier).addState(roomId, state); await ref.read(RoomsController.provider.notifier).addState(roomId, state);
} }
@ -45,7 +39,7 @@ class RoomChatController extends AsyncNotifier<IList<Event>> {
} }
return IMap<int, int?>.fromValues( return IMap<int, int?>.fromValues(
keyMapper: (id) => 9999999 + (id ?? 0), keyMapper: (id) => 9999999999 + (id ?? 0),
values: room.sticky, values: room.sticky,
) )
.addAll(room.timeline) .addAll(room.timeline)
@ -86,7 +80,7 @@ class RoomChatController extends AsyncNotifier<IList<Event>> {
final response = await ref final response = await ref
.watch(ClientController.provider.notifier) .watch(ClientController.provider.notifier)
.paginate( .paginate(
PaginateRequest( .new(
roomId: roomId, roomId: roomId,
maxTimelineId: timelineKeys?.isNotEmpty == true maxTimelineId: timelineKeys?.isNotEmpty == true
? timelineKeys?.reduce(min) ? timelineKeys?.reduce(min)
@ -112,7 +106,7 @@ class RoomChatController extends AsyncNotifier<IList<Event>> {
), ),
), ),
}), }),
const ISet.empty(), .new(),
); );
return response.hasMore; return response.hasMore;
@ -153,20 +147,20 @@ class RoomChatController extends AsyncNotifier<IList<Event>> {
text: taggedMessage, text: taggedMessage,
relation: relation == null relation: relation == null
? null ? null
: Relation(eventId: relation.eventId, relationType: relationType), : .new(eventId: relation.eventId, relationType: relationType),
), ),
); );
ref ref
.watch(RoomsController.provider.notifier) .watch(RoomsController.provider.notifier)
.update( .update(
{ .new({
roomId: Room( roomId: .new(
events: {event.rowId: event}.toIMap(), events: .new({event.rowId: event}),
sticky: {event.rowId}.toISet(), sticky: .new({event.rowId}),
), ),
}.toIMap(), }),
const ISet.empty(), .new(),
); );
} }
@ -177,7 +171,7 @@ class RoomChatController extends AsyncNotifier<IList<Event>> {
) async { ) async {
final client = ref.watch(ClientController.provider.notifier); final client = ref.watch(ClientController.provider.notifier);
final allReactionEvents = await client.getRelatedEvents( final allReactionEvents = await client.getRelatedEvents(
GetRelatedEventsRequest( .new(
roomId: roomId, roomId: roomId,
eventId: event.eventId, eventId: event.eventId,
relationType: "m.annotation", relationType: "m.annotation",
@ -199,9 +193,7 @@ class RoomChatController extends AsyncNotifier<IList<Event>> {
if (reactionEvent != null) { if (reactionEvent != null) {
await ref await ref
.watch(ClientController.provider.notifier) .watch(ClientController.provider.notifier)
.redactEvent( .redactEvent(.new(eventId: reactionEvent.eventId, roomId: roomId));
RedactEventRequest(eventId: reactionEvent.eventId, roomId: roomId),
);
} }
} }
@ -209,7 +201,7 @@ class RoomChatController extends AsyncNotifier<IList<Event>> {
final client = ref.watch(ClientController.provider.notifier); final client = ref.watch(ClientController.provider.notifier);
await client.sendEvent( await client.sendEvent(
SendEventRequest( .new(
roomId: roomId, roomId: roomId,
type: EventType.reaction.type, type: EventType.reaction.type,
content: { content: {

View file

@ -1,33 +1,29 @@
import "dart:isolate"; import "dart:isolate";
import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:nexus/models/event.dart"; import "package:nexus/models/event.dart";
import "package:nexus/models/read_receipt.dart";
import "package:nexus/models/room.dart"; import "package:nexus/models/room.dart";
class RoomsController extends Notifier<IMap<String, Room>> { class RoomsController extends Notifier<IMap<String, Room>> {
@override @override
IMap<String, Room> build() => const IMap.empty(); IMap<String, Room> build() => .new();
Future<void> addState( Future<void> addState(
String roomId, String roomId,
IList<Event> state, { IList<Event> state, {
bool isMembers = false, bool isMembers = false,
}) async => update( }) async => update(
{ .new({
roomId: Room( roomId: Room(
events: IMap.fromEntries( events: .fromEntries(state.map((event) => .new(event.rowId, event))),
state.map((event) => MapEntry(event.rowId, event)),
),
hasFetchedState: true, hasFetchedState: true,
hasFetchedMembers: isMembers, hasFetchedMembers: isMembers,
state: await Isolate.run(() { state: await Isolate.run(() {
final newState = state.fold( final newState = state.fold<IMap<String, IMap<String, int>>>(
const IMap<String, IMap<String, int>>.empty(), .new(),
(previousValue, stateEvent) => previousValue.add( (previousValue, stateEvent) => previousValue.add(
stateEvent.type, stateEvent.type,
(previousValue[stateEvent.type] ?? const IMap.empty()).add( (previousValue[stateEvent.type] ?? .new()).add(
stateEvent.stateKey!, stateEvent.stateKey!,
stateEvent.rowId, stateEvent.rowId,
), ),
@ -36,8 +32,8 @@ class RoomsController extends Notifier<IMap<String, Room>> {
return newState; return newState;
}), }),
), ),
}.toIMap(), }),
const ISet.empty(), .new(),
); );
void update(IMap<String, Room> rooms, ISet<String> leftRooms) { void update(IMap<String, Room> rooms, ISet<String> leftRooms) {
@ -65,9 +61,7 @@ class RoomsController extends Notifier<IMap<String, Room>> {
existing.state, existing.state,
(previousValue, event) => previousValue.add( (previousValue, event) => previousValue.add(
event.key, event.key,
(previousValue[event.key] ?? const IMap.empty()).addAll( (previousValue[event.key] ?? .new()).addAll(event.value),
event.value,
),
), ),
), ),
reset: false, reset: false,
@ -82,9 +76,7 @@ class RoomsController extends Notifier<IMap<String, Room>> {
existing.receipts, existing.receipts,
(receiptAcc, event) => receiptAcc.add( (receiptAcc, event) => receiptAcc.add(
event.key, event.key,
(receiptAcc[event.key] ?? IList<ReadReceipt>()).addAll( (receiptAcc[event.key] ?? .new()).addAll(event.value),
event.value,
),
), ),
), ),
) ?? ) ??

View file

@ -3,7 +3,7 @@ import "package:shared_preferences/shared_preferences.dart";
class SharedPrefsController extends AsyncNotifier<SharedPreferences> { class SharedPrefsController extends AsyncNotifier<SharedPreferences> {
@override @override
Future<SharedPreferences> build() => SharedPreferences.getInstance(); Future<SharedPreferences> build() async => .getInstance();
static final provider = static final provider =
AsyncNotifierProvider<SharedPrefsController, SharedPreferences>( AsyncNotifierProvider<SharedPrefsController, SharedPreferences>(

View file

@ -4,7 +4,7 @@ import "package:nexus/models/space_edge.dart";
class SpaceEdgesController extends Notifier<IMap<String, IList<SpaceEdge>>> { class SpaceEdgesController extends Notifier<IMap<String, IList<SpaceEdge>>> {
@override @override
IMap<String, IList<SpaceEdge>> build() => const IMap.empty(); IMap<String, IList<SpaceEdge>> build() => .new();
void set(IMap<String, IList<SpaceEdge>> newEdges) => void set(IMap<String, IList<SpaceEdge>> newEdges) =>
state = state.addAll(newEdges); state = state.addAll(newEdges);

View file

@ -7,8 +7,6 @@ import "package:nexus/controllers/rooms_controller.dart";
import "package:nexus/controllers/top_level_spaces_controller.dart"; import "package:nexus/controllers/top_level_spaces_controller.dart";
import "package:nexus/controllers/space_edges_controller.dart"; import "package:nexus/controllers/space_edges_controller.dart";
import "package:nexus/models/space.dart"; import "package:nexus/models/space.dart";
import "package:nexus/models/room.dart";
import "package:nexus/models/space_edge.dart";
class SpacesController extends Notifier<IList<Space>> { class SpacesController extends Notifier<IList<Space>> {
@override @override
@ -20,15 +18,15 @@ class SpacesController extends Notifier<IList<Space>> {
final childRoomsBySpaceId = IMap.fromEntries( final childRoomsBySpaceId = IMap.fromEntries(
topLevelSpaceIds.map((spaceId) { topLevelSpaceIds.map((spaceId) {
ISet<String> walk(String currentId) { ISet<String> walk(String currentId) {
final children = spaceEdges[currentId] ?? IList<SpaceEdge>(); final children = spaceEdges[currentId] ?? .new();
return children.fold<ISet<String>>(const ISet.empty(), (acc, edge) { return children.fold<ISet<String>>(.new(), (acc, edge) {
final childId = edge.childId; final childId = edge.childId;
final isSpace = spaceEdges.containsKey(childId); final isSpace = spaceEdges.containsKey(childId);
return acc return acc
.addAll(!isSpace ? ISet([childId]) : const ISet.empty()) .addAll(!isSpace ? ISet([childId]) : const .empty())
.addAll(isSpace ? walk(childId) : const ISet.empty()); .addAll(isSpace ? walk(childId) : const .empty());
}); });
} }
@ -88,7 +86,7 @@ class SpacesController extends Notifier<IList<Space>> {
final room = rooms[id]; final room = rooms[id];
if (room == null) return null; if (room == null) return null;
final children = childRoomsBySpaceId[id] ?? IList<Room>(); final children = childRoomsBySpaceId[id] ?? .new();
return Space( return Space(
id: id, id: id,
title: room.metadata?.name ?? "Unnamed Room", title: room.metadata?.name ?? "Unnamed Room",
@ -100,13 +98,13 @@ class SpacesController extends Notifier<IList<Space>> {
.toIList(); .toIList();
return <Space>[ return <Space>[
Space( .new(
id: "home", id: "home",
title: "Home", title: "Home",
icon: Icons.home, icon: Icons.home,
children: homeRooms, children: homeRooms,
), ),
Space( .new(
id: "dms", id: "dms",
title: "Direct Messages", title: "Direct Messages",
icon: Icons.people, icon: Icons.people,
@ -116,18 +114,19 @@ class SpacesController extends Notifier<IList<Space>> {
] ]
.map( .map(
(space) => space.copyWith( (space) => space.copyWith(
children: space.children children: .new(
.sortedBy( space.children
(element) => .sortedBy(
element (element) =>
.metadata element
?.sortingTimestamp .metadata
.millisecondsSinceEpoch ?? ?.sortingTimestamp
0, .millisecondsSinceEpoch ??
) 0,
.sortedBy((room) => room.metadata?.unreadMessages ?? 0) )
.reversed .sortedBy((room) => room.metadata?.unreadMessages ?? 0)
.toIList(), .reversed,
),
), ),
) )
.toIList(); .toIList();

View file

@ -7,7 +7,7 @@ class SyncStatusController extends Notifier<SyncStatus?> {
Null build() => null; Null build() => null;
void set(SyncStatus newStatus) { void set(SyncStatus newStatus) {
if (newStatus.type == SyncStatusType.permanentlyFailed) { if (newStatus.type == .permanentlyFailed) {
showError(newStatus.error ?? "Syncing failed"); showError(newStatus.error ?? "Syncing failed");
} }
state = newStatus; state = newStatus;

View file

@ -3,7 +3,7 @@ import "package:flutter_riverpod/flutter_riverpod.dart";
class TopLevelSpacesController extends Notifier<IList<String>> { class TopLevelSpacesController extends Notifier<IList<String>> {
@override @override
IList<String> build() => const IList.empty(); IList<String> build() => .new();
void set(IList<String> newSpaces) => state = newSpaces; void set(IList<String> newSpaces) => state = newSpaces;

View file

@ -19,7 +19,7 @@ class UrlPreviewController extends AsyncNotifier<OpenGraphData?> {
if (homeserver != null && !link.contains("matrix.to")) { if (homeserver != null && !link.contains("matrix.to")) {
{ {
final response = await get( final response = await get(
Uri.parse(homeserver) .parse(homeserver)
.resolve("/_matrix/client/v1/media/preview_url") .resolve("/_matrix/client/v1/media/preview_url")
.replace(queryParameters: {"url": link}), .replace(queryParameters: {"url": link}),
headers: await ref.watch(HeaderController.provider.future), headers: await ref.watch(HeaderController.provider.future),
@ -34,7 +34,7 @@ class UrlPreviewController extends AsyncNotifier<OpenGraphData?> {
? null ? null
: Uri.tryParse(mxc)?.mxcToHttps(homeserver); : Uri.tryParse(mxc)?.mxcToHttps(homeserver);
return OpenGraphData.fromJson(decodedValue).copyWith(imageUrl: image); return .fromJson(decodedValue).copyWith(imageUrl: image);
} }
} }
} }

View file

@ -6,7 +6,6 @@ import "package:nexus/controllers/profile_controller.dart";
import "package:nexus/helpers/extensions/get_localpart.dart"; import "package:nexus/helpers/extensions/get_localpart.dart";
import "package:nexus/models/configs/user_config.dart"; import "package:nexus/models/configs/user_config.dart";
import "package:nexus/models/content/membership.dart"; import "package:nexus/models/content/membership.dart";
import "package:nexus/models/membership_status.dart";
class UserController extends AsyncNotifier<MembershipContent> { class UserController extends AsyncNotifier<MembershipContent> {
final UserConfig config; final UserConfig config;
@ -31,8 +30,9 @@ class UserController extends AsyncNotifier<MembershipContent> {
final profile = await ref.watch( final profile = await ref.watch(
ProfileController.provider(config.userId).future, ProfileController.provider(config.userId).future,
); );
return MembershipContent(
status: MembershipStatus.leave, return .new(
status: .leave,
avatarUrl: profile.avatarUrl, avatarUrl: profile.avatarUrl,
displayName: profile.displayName ?? config.userId.localpart, displayName: profile.displayName ?? config.userId.localpart,
); );

View file

@ -5,7 +5,6 @@ import "package:nexus/controllers/client_state_controller.dart";
import "package:nexus/models/content/content.dart"; import "package:nexus/models/content/content.dart";
import "package:nexus/models/content/membership.dart"; import "package:nexus/models/content/membership.dart";
import "package:nexus/models/content/power_levels.dart"; import "package:nexus/models/content/power_levels.dart";
import "package:nexus/models/membership_status.dart";
import "package:nexus/models/room.dart"; import "package:nexus/models/room.dart";
class ViaController extends Notifier<String> { class ViaController extends Notifier<String> {
@ -45,7 +44,7 @@ class ViaController extends Notifier<String> {
: room.events[membershipEventId]; : room.events[membershipEventId];
if (member?.content case MembershipContent(:final status)) { if (member?.content case MembershipContent(:final status)) {
if (status == MembershipStatus.join) { if (status == .join) {
addUserId(member?.stateKey); addUserId(member?.stateKey);
} }
} }

Some files were not shown because too many files have changed in this diff Show more