✨ Able to render offsite media
This commit is contained in:
@@ -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,
|
||||
),
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
),
|
||||
|
||||
@@ -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]),
|
||||
|
||||
Reference in New Issue
Block a user