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:
parent
6281c1d13a
commit
d2ec5f035b
67 changed files with 391 additions and 534 deletions
|
|
@ -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>>(
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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) =>
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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)),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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<
|
||||||
|
|
|
||||||
|
|
@ -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) =>
|
||||||
|
|
|
||||||
|
|
@ -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 =
|
||||||
|
|
|
||||||
|
|
@ -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: {
|
||||||
|
|
|
||||||
|
|
@ -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,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
) ??
|
) ??
|
||||||
|
|
|
||||||
|
|
@ -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>(
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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
Loading…
Reference in a new issue