diff --git a/README.md b/README.md index 62d2b75..2562704 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ A simple and user-friendly Matrix client made with Flutter and the Matrix Dart S ## Progress -- [x] Move from the Dart SDK to the Gomuks SDK with Dart bindings: https://git.federated.nexus/Henry-Hiles/nexus/pulls/2 +- [ ] Move from the Dart SDK to the Gomuks SDK with bindings: WIP - [ ] Platform Support - [x] Linux - [x] Windows @@ -33,17 +33,14 @@ A simple and user-friendly Matrix client made with Flutter and the Matrix Dart S - [ ] Searching - [ ] Creating (Rooms, Spaces, and DMs) - [x] Joining - - [x] Using a text/uri/link - - [x] Plain text - - [x] `matrix:` Uri - - [ ] Matrix.to link: I just need to fix my regex + - [x] Using alias/id/link - [ ] From space - [ ] Exploring - [x] Leaving - [x] Subspaces - [x] Messages - [x] Encryption - - [x] Restoring crypto identity from passphrase/key or verification + - [ ] Restoring crypto identity from passphrase/key or verification - [x] Sending - [x] Plain text - [x] HTML/Markdown @@ -150,4 +147,4 @@ flutter run ## Community -Join the [Nexus Client Matrix Room](https://matrix.to/#/#nexus:federated.nexus) for questions or help with developing or using Nexus Client. +Come chat in the [Federated Nexus Community](https://matrix.to/#/#space:federated.nexus) for questions or help with developing or using Nexus Client. diff --git a/flake.nix b/flake.nix index 0e5e7c8..c4c5cc3 100644 --- a/flake.nix +++ b/flake.nix @@ -29,22 +29,6 @@ ... }: - let - src = ./.; - - # from https://discourse.nixos.org/t/is-there-a-way-to-read-a-yaml-file-and-get-back-a-set/18385/5 - importYAML = - file: - lib.importJSON ( - pkgs.runCommand "converted-yaml.json" { } ''${pkgs.yj}/bin/yj < "${file}" > "$out"'' - ); - - package = importYAML "${src}/pubspec.yaml"; - - usedFlutter = (pkgs.flutter.override { extraPkgConfigPackages = [ pkgs.libsecret ]; }); - - buildInputs = [ pkgs.sqlite ]; - in { _module.args.pkgs = import nixpkgs { inherit system; @@ -61,35 +45,20 @@ olm git clang - usedFlutter + (flutter.override { extraPkgConfigPackages = [ pkgs.libsecret ]; }) (pkgs.writeShellScriptBin "rustup" (builtins.readFile ./nix/fake-rustup.sh)) ]; env = { - LD_LIBRARY_PATH = "${lib.makeLibraryPath buildInputs}:./build/native_assets/linux"; + LD_LIBRARY_PATH = "${ + pkgs.lib.makeLibraryPath ([ + pkgs.sqlite + ]) + }:./build/native_assets/linux"; CPATH = lib.makeSearchPath "include" [ pkgs.glibc.dev ]; }; }; - - packages.default = usedFlutter.buildFlutterApplication { - inherit src buildInputs; - pname = package.name; - version = package.version; - - pubspecLock = importYAML "${src}/pubspec.lock"; - gitHashes = { - flutter_chat_ui = "sha256-4fuag7lRH5cMBFD3fUzj2K541JwXLoz8HF/4OMr3uhk="; - flutter_link_previewer = "sha256-4fuag7lRH5cMBFD3fUzj2K541JwXLoz8HF/4OMr3uhk="; - flyer_chat_text_message = "sha256-4fuag7lRH5cMBFD3fUzj2K541JwXLoz8HF/4OMr3uhk="; - window_size = "sha256-XelNtp7tpZ91QCEcvewVphNUtgQX7xrp5QP0oFo6DgM="; - }; - - patchPhase = /* sh */ '' - patchShebangs ./scripts/generate.sh - ./scripts/generate.sh # note: this doesn't quit the build on fail - ''; - }; }; }; } diff --git a/lib/controllers/client_controller.dart b/lib/controllers/client_controller.dart index abfdb72..fd7600f 100644 --- a/lib/controllers/client_controller.dart +++ b/lib/controllers/client_controller.dart @@ -16,7 +16,6 @@ import "package:nexus/models/paginate.dart"; import "package:nexus/models/requests/get_event_request.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/join_room_request.dart"; import "package:nexus/models/requests/login_request.dart"; import "package:nexus/models/profile.dart"; import "package:nexus/models/requests/paginate_request.dart"; @@ -139,11 +138,6 @@ class ClientController extends AsyncNotifier { } } - Future joinRoom(JoinRoomRequest request) async { - final response = await _sendCommand("join_room", request.toJson()); - return response["room_id"]; - } - Future leaveRoom(Room room) async { if (room.metadata == null) return; await _sendCommand("leave_room", {"room_id": room.metadata!.id}); diff --git a/lib/helpers/extensions/join_room_with_snackbars.dart b/lib/helpers/extensions/join_room_with_snackbars.dart index 05b045d..df89740 100644 --- a/lib/helpers/extensions/join_room_with_snackbars.dart +++ b/lib/helpers/extensions/join_room_with_snackbars.dart @@ -1,12 +1,9 @@ import "package:collection/collection.dart"; -import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter/material.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:nexus/controllers/client_controller.dart"; import "package:nexus/controllers/key_controller.dart"; import "package:nexus/controllers/spaces_controller.dart"; -import "package:nexus/helpers/extensions/link_to_mention.dart"; -import "package:nexus/models/requests/join_room_request.dart"; extension JoinRoomWithSnackbars on ClientController { Future joinRoomWithSnackBars( @@ -14,77 +11,77 @@ extension JoinRoomWithSnackbars on ClientController { String roomAlias, WidgetRef ref, ) async { - final roomIdOrAlias = roomAlias.mention ?? roomAlias; + // final parsed = roomAlias.parseIdentifierIntoParts(); + // final alias = parsed?.primaryIdentifier ?? roomAlias; - final scaffoldMessenger = ScaffoldMessenger.of(context); + // final scaffoldMessenger = ScaffoldMessenger.of(context); - final snackbar = scaffoldMessenger.showSnackBar( - SnackBar( - content: Text("Joining room $roomIdOrAlias."), - duration: Duration(days: 999), - ), - ); + // final snackbar = scaffoldMessenger.showSnackBar( + // SnackBar( + // content: Text("Joining room $alias."), + // duration: Duration(days: 999), + // ), + // ); - try { - final id = await joinRoom( - JoinRoomRequest( - roomIdOrAlias: roomIdOrAlias, - via: IList(Uri.tryParse(roomAlias)?.queryParametersAll["via"] ?? []), - ), - ); + // try { + // final id = await joinRoom(alias, via: parsed?.via.toList()); - snackbar.close(); + // snackbar.close(); - scaffoldMessenger.showSnackBar( - SnackBar( - content: Text("Room $roomIdOrAlias successfully joined."), - action: SnackBarAction( - label: "Open", - onPressed: () async { - final spaces = ref.watch(SpacesController.provider); - final space = spaces.firstWhereOrNull((space) => space.id == id); + // scaffoldMessenger.showSnackBar( + // SnackBar( + // content: Text("Room $alias successfully joined."), + // action: SnackBarAction( + // label: "Open", + // onPressed: () async { + // final spaces = await ref.refresh( + // SpacesController.provider.future, + // ); + // final space = spaces.firstWhereOrNull((space) => space.id == id); - await ref - .watch( - KeyController.provider(KeyController.spaceKey).notifier, - ) - .set( - space?.id ?? - spaces - .firstWhere( - (space) => space.children.any( - (child) => child.metadata?.id == id, - ), - ) - .id, - ); + // await ref + // .watch( + // KeyController.provider(KeyController.spaceKey).notifier, + // ) + // .set( + // space?.id ?? + // spaces + // .firstWhere( + // (space) => + // space.children.firstWhereOrNull( + // (child) => child.roomData.id == id, + // ) != + // null, + // ) + // .id, + // ); - if (space == null) { - await ref - .watch( - KeyController.provider(KeyController.roomKey).notifier, - ) - .set(id); - } - }, - ), - ), - ); - } catch (error) { - snackbar.close(); - if (context.mounted) { - scaffoldMessenger.showSnackBar( - SnackBar( - backgroundColor: Theme.of(context).colorScheme.errorContainer, - content: Text( - error.toString(), - style: TextStyle( - color: Theme.of(context).colorScheme.onErrorContainer, - ), - ), - ), - ); - } - } + // if (space == null) { + // await ref + // .watch( + // KeyController.provider(KeyController.roomKey).notifier, + // ) + // .set(id); + // } + // }, + // ), + // ), + // ); + // } catch (error) { + // snackbar.close(); + // if (context.mounted) { + // scaffoldMessenger.showSnackBar( + // SnackBar( + // backgroundColor: Theme.of(context).colorScheme.errorContainer, + // content: Text( + // error.toString(), + // style: TextStyle( + // color: Theme.of(context).colorScheme.onErrorContainer, + // ), + // ), + // ), + // ); + // } + // } } } diff --git a/lib/helpers/extensions/link_to_mention.dart b/lib/helpers/extensions/link_to_mention.dart index 8095132..33d2bd2 100644 --- a/lib/helpers/extensions/link_to_mention.dart +++ b/lib/helpers/extensions/link_to_mention.dart @@ -29,11 +29,7 @@ extension LinkToMention on String { if (uri.pathSegments.isNotEmpty) { final identifier = uri.pathSegments.last; if (identifier.isNotEmpty) { - return "${switch (uri.pathSegments.firstOrNull) { - "r" || "roomid" => "#", - "u" => "@", - _ => "", - }}${Uri.decodeComponent(identifier)}"; + return Uri.decodeComponent(identifier); } } } catch (_) {} diff --git a/lib/models/requests/join_room_request.dart b/lib/models/requests/join_room_request.dart deleted file mode 100644 index d6b411e..0000000 --- a/lib/models/requests/join_room_request.dart +++ /dev/null @@ -1,15 +0,0 @@ -import "package:fast_immutable_collections/fast_immutable_collections.dart"; -import "package:freezed_annotation/freezed_annotation.dart"; -part "join_room_request.freezed.dart"; -part "join_room_request.g.dart"; - -@freezed -abstract class JoinRoomRequest with _$JoinRoomRequest { - const factory JoinRoomRequest({ - required String roomIdOrAlias, - required IList via, - }) = _JoinRoomRequest; - - factory JoinRoomRequest.fromJson(Map json) => - _$JoinRoomRequestFromJson(json); -} diff --git a/lib/widgets/chat_page/room_menu.dart b/lib/widgets/chat_page/room_menu.dart index 2687bc8..f14b8ca 100644 --- a/lib/widgets/chat_page/room_menu.dart +++ b/lib/widgets/chat_page/room_menu.dart @@ -1,8 +1,11 @@ import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter/material.dart"; +import "package:flutter/services.dart"; +import "package:flutter_hooks/flutter_hooks.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:nexus/controllers/client_controller.dart"; import "package:nexus/models/room.dart"; +import "package:nexus/widgets/form_text_input.dart"; class RoomMenu extends ConsumerWidget { final Room room; diff --git a/src/gomuks/libgomuks.h b/src/gomuks/libgomuks.h deleted file mode 100644 index 962d281..0000000 --- a/src/gomuks/libgomuks.h +++ /dev/null @@ -1,105 +0,0 @@ -/* Code generated by cmd/cgo; DO NOT EDIT. */ - -/* package go.mau.fi/gomuks/pkg/ffi */ - - -#line 1 "cgo-builtin-export-prolog" - -#include - -#ifndef GO_CGO_EXPORT_PROLOGUE_H -#define GO_CGO_EXPORT_PROLOGUE_H - -#ifndef GO_CGO_GOSTRING_TYPEDEF -typedef struct { const char *p; ptrdiff_t n; } _GoString_; -extern size_t _GoStringLen(_GoString_ s); -extern const char *_GoStringPtr(_GoString_ s); -#endif - -#endif - -/* Start of preamble from import "C" comments. */ - - -#line 9 "ffi.go" - -#include "gomuksffi.h" -#include - -static inline void _gomuks_callEventCallback(EventCallback cb, const char *command, int64_t request_id, GomuksOwnedBuffer data) { - cb(command, request_id, data); -} - -#line 1 "cgo-generated-wrapper" - - -/* End of preamble from import "C" comments. */ - - -/* Start of boilerplate cgo prologue. */ -#line 1 "cgo-gcc-export-header-prolog" - -#ifndef GO_CGO_PROLOGUE_H -#define GO_CGO_PROLOGUE_H - -typedef signed char GoInt8; -typedef unsigned char GoUint8; -typedef short GoInt16; -typedef unsigned short GoUint16; -typedef int GoInt32; -typedef unsigned int GoUint32; -typedef long long GoInt64; -typedef unsigned long long GoUint64; -typedef GoInt64 GoInt; -typedef GoUint64 GoUint; -typedef size_t GoUintptr; -typedef float GoFloat32; -typedef double GoFloat64; -#ifdef _MSC_VER -#if !defined(__cplusplus) || _MSVC_LANG <= 201402L -#include -typedef _Fcomplex GoComplex64; -typedef _Dcomplex GoComplex128; -#else -#include -typedef std::complex GoComplex64; -typedef std::complex GoComplex128; -#endif -#else -typedef float _Complex GoComplex64; -typedef double _Complex GoComplex128; -#endif - -/* - static assertion to make sure the file is being used on architecture - at least with matching size of GoInt. -*/ -typedef char _check_for_64_bit_pointer_matching_GoInt[sizeof(void*)==64/8 ? 1:-1]; - -#ifndef GO_CGO_GOSTRING_TYPEDEF -typedef _GoString_ GoString; -#endif -typedef void *GoMap; -typedef void *GoChan; -typedef struct { void *t; void *v; } GoInterface; -typedef struct { void *data; GoInt len; GoInt cap; } GoSlice; - -#endif - -/* End of boilerplate cgo prologue. */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern GomuksHandle GomuksInit(void); -extern int GomuksStart(GomuksHandle handle, EventCallback callback); -extern void GomuksDestroy(GomuksHandle handle); -extern GomuksResponse GomuksSubmitCommand(GomuksHandle handle, char* command, GomuksBorrowedBuffer data); -extern GomuksAccountInfo GomuksGetAccountInfo(GomuksHandle handle); -extern void GomuksFreeAccountInfo(GomuksAccountInfo info); -extern void GomuksFreeBuffer(GomuksOwnedBuffer buf); - -#ifdef __cplusplus -} -#endif diff --git a/src/gomuks/libgomuks.so b/src/gomuks/libgomuks.so deleted file mode 100644 index c4987c5..0000000 Binary files a/src/gomuks/libgomuks.so and /dev/null differ