forked from Nexus/nexus
Compare commits
No commits in common. "309d0df5819dbec341cc1f4778e4b35df8f0c86d" and "e1d7a30a0649f5856c3fcd8ed2567c7451bb0c39" have entirely different histories.
309d0df581
...
e1d7a30a06
10 changed files with 75 additions and 134 deletions
|
|
@ -108,8 +108,8 @@ A simple and user-friendly Matrix client made with Flutter and a Gomuks backend.
|
|||
- [x] Events
|
||||
- [ ] Rooms
|
||||
- [x] Member list
|
||||
- [x] Sort by power level
|
||||
- [ ] Colors based off of power level
|
||||
- [ ] Sort by power level
|
||||
- [ ] Notifications using UnifiedPush ([#35](https://git.federated.nexus/Nexus/nexus/issues/35))
|
||||
- [ ] Group calls using [MSC4195](https://github.com/matrix-org/matrix-spec-proposals/pull/4195)
|
||||
- [ ] Invites
|
||||
|
|
|
|||
Binary file not shown.
|
Before Width: | Height: | Size: 616 KiB After Width: | Height: | Size: 466 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 616 KiB After Width: | Height: | Size: 462 KiB |
|
|
@ -2,5 +2,5 @@ import "package:color_hash/color_hash.dart";
|
|||
import "package:flutter/material.dart";
|
||||
|
||||
extension ToColor on String {
|
||||
Color get colorHash => ColorHash(this, lightness: .5, saturation: .7).color;
|
||||
Color get colorHash => ColorHash(this, lightness: .7, saturation: .7).color;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
import "package:flutter/material.dart";
|
||||
import "package:nexus/widgets/divider_widget.dart";
|
||||
|
||||
class DividerText extends StatelessWidget {
|
||||
final String text;
|
||||
|
|
@ -7,6 +6,24 @@ class DividerText extends StatelessWidget {
|
|||
const DividerText(this.text, {super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) =>
|
||||
DividerWidget(Text(text, style: Theme.of(context).textTheme.labelLarge));
|
||||
Widget build(BuildContext context) => LayoutBuilder(
|
||||
builder: (context, constraints) => Row(
|
||||
children: [
|
||||
SizedBox(
|
||||
width: 16,
|
||||
child: Divider(color: Theme.of(context).colorScheme.onSurface),
|
||||
),
|
||||
ConstrainedBox(
|
||||
constraints: .new(maxWidth: constraints.maxWidth - 32),
|
||||
child: Padding(
|
||||
padding: const .all(8),
|
||||
child: Text(text, style: Theme.of(context).textTheme.labelLarge),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: Divider(color: Theme.of(context).colorScheme.onSurface),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,25 +0,0 @@
|
|||
import "package:flutter/material.dart";
|
||||
|
||||
class DividerWidget extends StatelessWidget {
|
||||
final Widget widget;
|
||||
const DividerWidget(this.widget, {super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) => LayoutBuilder(
|
||||
builder: (_, constraints) => Row(
|
||||
children: [
|
||||
SizedBox(
|
||||
width: 16,
|
||||
child: Divider(color: Theme.of(context).colorScheme.onSurface),
|
||||
),
|
||||
ConstrainedBox(
|
||||
constraints: .new(maxWidth: constraints.maxWidth - 32),
|
||||
child: Padding(padding: const .all(8), child: widget),
|
||||
),
|
||||
Expanded(
|
||||
child: Divider(color: Theme.of(context).colorScheme.onSurface),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
@ -21,7 +21,6 @@ class ErrorDialog extends ConsumerWidget {
|
|||
onPressed: () => ref.invalidate(provider!),
|
||||
child: const Text("Try Again"),
|
||||
),
|
||||
if (Navigator.of(context).canPop())
|
||||
TextButton(
|
||||
onPressed: () =>
|
||||
Navigator.of(context).popUntil((route) => route.isFirst),
|
||||
|
|
|
|||
|
|
@ -18,8 +18,6 @@ class MessageImage extends ConsumerWidget {
|
|||
url.toString(),
|
||||
child: ClipRRect(
|
||||
borderRadius: .all(.circular(8)),
|
||||
child: AspectRatio(
|
||||
aspectRatio: info!.width! / info!.height!,
|
||||
child: Image(
|
||||
image: CachedNetworkImage(
|
||||
url.toString(),
|
||||
|
|
@ -27,7 +25,6 @@ class MessageImage extends ConsumerWidget {
|
|||
headers: ref.headers,
|
||||
),
|
||||
width: info?.width,
|
||||
fit: BoxFit.fitWidth,
|
||||
loadingBuilder: (_, child, loadingProgress) => loadingProgress == null
|
||||
? child
|
||||
: switch (info?.blurHash) {
|
||||
|
|
@ -38,10 +35,13 @@ class MessageImage extends ConsumerWidget {
|
|||
height: 200,
|
||||
child: BlurHash(hash: blurHash),
|
||||
)
|
||||
: SizedBox(
|
||||
: AspectRatio(
|
||||
aspectRatio: info!.width! / info!.height!,
|
||||
child: SizedBox(
|
||||
width: info!.width,
|
||||
child: BlurHash(hash: blurHash),
|
||||
),
|
||||
),
|
||||
_ => Loading(),
|
||||
},
|
||||
errorBuilder: (context, error, stackTrace) => Center(
|
||||
|
|
@ -52,6 +52,5 @@ class MessageImage extends ConsumerWidget {
|
|||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,7 +17,6 @@ import "package:nexus/models/content/server_acl.dart";
|
|||
import "package:nexus/models/content/sticker.dart";
|
||||
import "package:nexus/models/content/topic.dart";
|
||||
import "package:nexus/models/event.dart";
|
||||
import "package:nexus/widgets/error_dialog.dart";
|
||||
import "package:nexus/widgets/lazy_loading/message_displayname.dart";
|
||||
import "package:nexus/widgets/renderers/message.dart";
|
||||
import "package:nexus/widgets/reaction_row.dart";
|
||||
|
|
@ -50,13 +49,9 @@ class EventRenderer extends ConsumerWidget {
|
|||
final child = event.redactedBy != null || event.relationType == "m.replace"
|
||||
? null
|
||||
: switch (event.content) {
|
||||
Content(:final parseError?) => Row(
|
||||
children: [
|
||||
ErrorDialog(
|
||||
"An error occurred while parsing event ${event.eventId}:\n$parseError",
|
||||
parseError.stackTrace,
|
||||
),
|
||||
],
|
||||
Content(:final parseError?) => SelectableText(
|
||||
"An error occurred while parsing this event:\n$parseError\n${parseError.stackTrace}",
|
||||
style: errorStyle,
|
||||
),
|
||||
|
||||
MessageContent() ||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@ import "package:nexus/controllers/key_controller.dart";
|
|||
import "package:nexus/controllers/spaces_controller.dart";
|
||||
import "package:nexus/models/room.dart";
|
||||
import "package:nexus/widgets/avatar_or_hash.dart";
|
||||
import "package:nexus/widgets/divider_widget.dart";
|
||||
import "package:nexus/widgets/join_dialog.dart";
|
||||
import "package:nexus/widgets/room_menu.dart";
|
||||
|
||||
|
|
@ -39,11 +38,9 @@ class Sidebar extends HookConsumerWidget {
|
|||
spaces.firstWhereOrNull((space) => space.id == selectedSpaceId) ??
|
||||
spaces.first;
|
||||
|
||||
final indexOfSelectedRoom = selectedSpace.children
|
||||
.addAll(
|
||||
selectedSpace.subSpaces.map((element) => element.children).flattened,
|
||||
)
|
||||
.indexWhere((room) => room.metadata?.id == selectedRoomId);
|
||||
final indexOfSelectedRoom = selectedSpace.children.indexWhere(
|
||||
(room) => room.metadata?.id == selectedRoomId,
|
||||
);
|
||||
final selectedRoomIndex = indexOfSelectedRoom == -1
|
||||
? null
|
||||
: indexOfSelectedRoom;
|
||||
|
|
@ -63,6 +60,7 @@ class Sidebar extends HookConsumerWidget {
|
|||
fallback: selectedSpaceId == "dms"
|
||||
? null
|
||||
: Icon(Icons.numbers),
|
||||
// space.client.headers,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
|
@ -100,31 +98,16 @@ class Sidebar extends HookConsumerWidget {
|
|||
destinations: spaces
|
||||
.map(
|
||||
(space) => NavigationRailM3EDestination(
|
||||
badgeCount: switch (space.children
|
||||
.addAll(
|
||||
space.subSpaces
|
||||
.map((element) => element.children)
|
||||
.flattened,
|
||||
)
|
||||
.fold(
|
||||
badgeCount: switch (space.children.fold(
|
||||
0,
|
||||
(previousValue, room) =>
|
||||
previousValue +
|
||||
(room.metadata?.unreadNotifications ?? 0),
|
||||
)) {
|
||||
0 =>
|
||||
space.children
|
||||
.addAll(
|
||||
space.subSpaces
|
||||
.map(
|
||||
(element) => element.children,
|
||||
)
|
||||
.flattened,
|
||||
)
|
||||
.any(
|
||||
space.children.any(
|
||||
(room) =>
|
||||
room.metadata?.unreadMessages !=
|
||||
0,
|
||||
room.metadata?.unreadMessages != 0,
|
||||
)
|
||||
? 0
|
||||
: null,
|
||||
|
|
@ -230,47 +213,20 @@ class Sidebar extends HookConsumerWidget {
|
|||
selectedIndex: selectedRoomIndex ?? 0,
|
||||
sections: [
|
||||
.new(
|
||||
header: selectedSpace.room == null
|
||||
? null
|
||||
: DividerWidget(Text("Rooms")),
|
||||
header: selectedSpace.room == null ? null : Text("Rooms"),
|
||||
destinations: roomsToDestinations(selectedSpace.children),
|
||||
),
|
||||
for (final subSpace in selectedSpace.subSpaces)
|
||||
.new(
|
||||
header: DividerWidget(
|
||||
Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
spacing: 8,
|
||||
children: [
|
||||
if (subSpace.room.metadata?.avatar != null)
|
||||
AvatarOrHash(
|
||||
subSpace.room.metadata?.avatar,
|
||||
subSpace.room.metadata?.name ??
|
||||
"Unnamed Room",
|
||||
height: 16,
|
||||
),
|
||||
Flexible(
|
||||
child: Text(
|
||||
subSpace.room.metadata?.name ??
|
||||
"Unnamed Space",
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
header: Text(
|
||||
subSpace.room.metadata?.name ?? "Unnamed Space",
|
||||
),
|
||||
destinations: roomsToDestinations(subSpace.children),
|
||||
),
|
||||
],
|
||||
onDestinationSelected: (value) {
|
||||
final children = selectedSpace.children.addAll(
|
||||
selectedSpace.subSpaces
|
||||
.map((element) => element.children)
|
||||
.flattened,
|
||||
);
|
||||
selectedRoomIdNotifier.set(
|
||||
children[value].metadata?.id, //
|
||||
selectedSpace.children[value].metadata?.id,
|
||||
);
|
||||
if (!isDesktop) Navigator.of(context).pop();
|
||||
},
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue