url launch support

This commit is contained in:
Henry Hiles 2025-11-10 19:01:18 -05:00
commit dca9ee1939
No known key found for this signature in database
3 changed files with 56 additions and 28 deletions

View file

@ -1,33 +1,33 @@
import "dart:io"; // import "dart:io";
import "package:matrix/matrix.dart"; // import "package:matrix/matrix.dart";
import "package:nexusbot/controllers/settings_controller.dart"; // import "package:nexusbot/controllers/settings_controller.dart";
import "package:riverpod/riverpod.dart"; // import "package:riverpod/riverpod.dart";
import "package:sqflite_common_ffi/sqflite_ffi.dart"; // import "package:sqflite_common_ffi/sqflite_ffi.dart";
class ClientController extends AsyncNotifier<Client> { // class ClientController extends AsyncNotifier<Client> {
@override // @override
Future<Client> build() async { // Future<Client> build() async {
final settings = ref.watch(SettingsController.provider)!; // final settings = ref.watch(SettingsController.provider)!;
final client = Client( // final client = Client(
"nexusbot", // "nexusbot",
database: await MatrixSdkDatabase.init( // database: await MatrixSdkDatabase.init(
"NexusBot", // "NexusBot",
database: await databaseFactoryFfi.openDatabase(inMemoryDatabasePath), // database: await databaseFactoryFfi.openDatabase(inMemoryDatabasePath),
), // ),
); // );
await client.checkHomeserver(settings.homeserver); // await client.checkHomeserver(settings.homeserver);
await client.login( // await client.login(
LoginType.mLoginPassword, // LoginType.mLoginPassword,
identifier: AuthenticationUserIdentifier(user: settings.name), // identifier: AuthenticationUserIdentifier(user: settings.name),
password: (await File(settings.botPasswordFile).readAsString()).trim(), // password: (await File(settings.botPasswordFile).readAsString()).trim(),
); // );
return client; // return client;
} // }
static final provider = AsyncNotifierProvider<ClientController, Client>( // static final provider = AsyncNotifierProvider<ClientController, Client>(
ClientController.new, // ClientController.new,
); // );
} // }

View file

@ -0,0 +1,23 @@
import "package:flutter/services.dart";
import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:url_launcher/url_launcher.dart" as ul;
class LaunchHelper {
final Ref ref;
LaunchHelper(this.ref);
Future<void> launchUrl(Uri url, {bool useWebview = false}) async {
try {
await ul.launchUrl(
url,
mode: useWebview
? ul.LaunchMode.inAppBrowserView
: ul.LaunchMode.externalApplication,
);
} on PlatformException catch (_) {
// Ignore missing intent handler error
}
}
static final provider = Provider<LaunchHelper>(LaunchHelper.new);
}

View file

@ -7,6 +7,7 @@ import "package:flyer_chat_system_message/flyer_chat_system_message.dart";
import "package:flyer_chat_text_message/flyer_chat_text_message.dart"; import "package:flyer_chat_text_message/flyer_chat_text_message.dart";
import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:hooks_riverpod/hooks_riverpod.dart";
import "package:nexus/controllers/room_chat_controller.dart"; import "package:nexus/controllers/room_chat_controller.dart";
import "package:nexus/helpers/launch_helper.dart";
class RoomChat extends HookConsumerWidget { class RoomChat extends HookConsumerWidget {
const RoomChat({super.key}); const RoomChat({super.key});
@ -42,7 +43,11 @@ class RoomChat extends HookConsumerWidget {
), ),
), ),
index: index, index: index,
onLinkTap: (url, _) =>
ref.watch(LaunchHelper.provider).launchUrl(Uri.parse(url)),
linksDecoration: TextDecoration.underline, linksDecoration: TextDecoration.underline,
sentLinksColor: Colors.blue,
receivedLinksColor: Colors.blue,
), ),
linkPreviewBuilder: (_, message, isSentByMe) { linkPreviewBuilder: (_, message, isSentByMe) {
return LinkPreview( return LinkPreview(