Able to render offsite media

This commit is contained in:
2026-01-01 02:00:09 +08:00
parent adb231278c
commit ec71125fa9
13 changed files with 352 additions and 349 deletions

View File

@@ -62,7 +62,7 @@ class CloudFileLightbox extends HookConsumerWidget {
controller: photoViewController,
heroAttributes: PhotoViewHeroAttributes(tag: heroTag),
imageProvider: CloudImageWidget.provider(
fileId: item.id,
file: item,
serverUrl: serverUrl,
original: showOriginal.value,
),
@@ -118,20 +118,21 @@ class CloudFileLightbox extends HookConsumerWidget {
onPressed: showInfoSheet,
shadows: WhiteShadows.standard,
),
FileActionButton.more(
onPressed: () {
final router = GoRouter.of(context);
Navigator.of(context).pop(context);
Future(() {
router.pushNamed(
'fileDetail',
pathParameters: {'id': item.id},
extra: item,
);
});
},
shadows: WhiteShadows.standard,
),
if (item.url != null)
FileActionButton.more(
onPressed: () {
final router = GoRouter.of(context);
Navigator.of(context).pop(context);
Future(() {
router.pushNamed(
'fileDetail',
pathParameters: {'id': item.id},
extra: item,
);
});
},
shadows: WhiteShadows.standard,
),
],
showExtraOnLeft: true,
),

View File

@@ -41,7 +41,7 @@ class CloudFileWidget extends HookConsumerWidget {
appSettingsProvider.select((s) => s.dataSavingMode),
);
final serverUrl = ref.watch(serverUrlProvider);
final uri = '$serverUrl/drive/files/${item.id}';
final uri = item.url ?? '$serverUrl/drive/files/${item.id}';
final unlocked = useState(false);
@@ -529,7 +529,7 @@ class CloudImageWidget extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final serverUrl = ref.watch(serverUrlProvider);
final uri = '$serverUrl/drive/files/${file?.id ?? fileId}';
final uri = file?.url ?? '$serverUrl/drive/files/${file?.id ?? fileId}';
return AspectRatio(
aspectRatio: aspectRatio,
@@ -540,13 +540,15 @@ class CloudImageWidget extends ConsumerWidget {
}
static ImageProvider provider({
required String fileId,
required SnCloudFile file,
required String serverUrl,
bool original = false,
}) {
final uri = original
? '$serverUrl/drive/files/$fileId?original=true'
: '$serverUrl/drive/files/$fileId';
final uri =
file.url ??
(original
? '$serverUrl/drive/files/${file.id}?original=true'
: '$serverUrl/drive/files/${file.id}');
return CachedNetworkImageProvider(uri);
}
}

View File

@@ -167,7 +167,7 @@ class ImageFileContent extends HookConsumerWidget {
),
controller: photoViewController,
imageProvider: CloudImageWidget.provider(
fileId: item.id,
file: item,
serverUrl: ref.watch(serverUrlProvider),
original: showOriginal.value,
),

View File

@@ -21,7 +21,6 @@ import 'package:markdown/markdown.dart' as markdown;
import 'package:markdown_widget/markdown_widget.dart';
import 'package:material_symbols_icons/symbols.dart';
import 'package:styled_widget/styled_widget.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:uuid/uuid.dart';
import 'image.dart';
@@ -139,7 +138,7 @@ class MarkdownTextContent extends HookConsumerWidget {
style:
linkStyle ??
TextStyle(color: Theme.of(context).colorScheme.primary),
onTap: (href) {
onTap: (href) async {
final url = Uri.tryParse(href);
if (url != null) {
if (url.scheme == 'solian') {
@@ -147,22 +146,7 @@ class MarkdownTextContent extends HookConsumerWidget {
context.push(fullPath);
return;
}
final whitelistDomains = ['solian.app', 'solsynth.dev'];
if (whitelistDomains.any(
(domain) =>
url.host == domain || url.host.endsWith('.$domain'),
)) {
launchUrl(url, mode: LaunchMode.externalApplication);
return;
}
showConfirmAlert(
'openLinkConfirmDescription'.tr(args: [url.toString()]),
'openLinkConfirm'.tr(),
).then((value) {
if (value) {
launchUrl(url, mode: LaunchMode.externalApplication);
}
});
await openExternalLink(url, ref);
} else {
showSnackBar(
'brokenLink'.tr(args: [href]),