Add server-generated URL preview support
This commit is contained in:
parent
cadd5c1255
commit
f4624c2866
5 changed files with 128 additions and 49 deletions
63
lib/controllers/url_preview_controller.dart
Normal file
63
lib/controllers/url_preview_controller.dart
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
import "dart:convert";
|
||||
import "package:flutter_chat_core/flutter_chat_core.dart";
|
||||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||
import "package:http/http.dart";
|
||||
import "package:nexus/controllers/client_state_controller.dart";
|
||||
import "package:nexus/controllers/header_controller.dart";
|
||||
import "package:nexus/helpers/extensions/mxc_to_https.dart";
|
||||
|
||||
class UrlPreviewController extends AsyncNotifier<LinkPreviewData?> {
|
||||
final TextMessage message;
|
||||
UrlPreviewController(this.message);
|
||||
|
||||
@override
|
||||
Future<LinkPreviewData?> build() async {
|
||||
final homeserver = ref.watch(ClientStateController.provider)?.homeserverUrl;
|
||||
final link = RegExp(
|
||||
r'''https?://[^\s"'<>]+''',
|
||||
).allMatches(message.text).firstOrNull?.group(0);
|
||||
|
||||
if (homeserver != null && link != null) {
|
||||
{
|
||||
final response = await get(
|
||||
Uri.parse(homeserver)
|
||||
.resolve("/_matrix/client/v1/media/preview_url")
|
||||
.replace(queryParameters: {"url": link}),
|
||||
headers: await ref.watch(HeaderController.provider.future),
|
||||
);
|
||||
|
||||
if (response.statusCode == 200) {
|
||||
final decodedValue = json.decode(response.body);
|
||||
final mxc = decodedValue["og:image"];
|
||||
final image = mxc == null
|
||||
? null
|
||||
: Uri.tryParse(mxc)?.mxcToHttps(homeserver);
|
||||
|
||||
return LinkPreviewData(
|
||||
link: link,
|
||||
title: decodedValue["og:title"],
|
||||
description: decodedValue["og:description"],
|
||||
image: image == null
|
||||
? null
|
||||
: ImagePreviewData(
|
||||
url: image.toString(),
|
||||
width:
|
||||
(decodedValue["og:image:width"] as int?)?.toDouble() ??
|
||||
0,
|
||||
height:
|
||||
(decodedValue["og:image:height"] as int?)?.toDouble() ??
|
||||
0,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
static final provider = AsyncNotifierProvider.autoDispose
|
||||
.family<UrlPreviewController, LinkPreviewData?, TextMessage>(
|
||||
UrlPreviewController.new,
|
||||
);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue