fixup! data-saving: implement gate with bypass

This commit is contained in:
Texas0295
2025-09-06 19:55:35 +08:00
parent a8c3830d67
commit eb9bb73c31

View File

@@ -34,42 +34,39 @@ class CloudFileWidget extends HookConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final dataSaving = ref.watch(appSettingsNotifierProvider.select((s) => s.dataSavingMode));
final dataSaving = ref.watch(
appSettingsNotifierProvider.select((s) => s.dataSavingMode),
);
final serverUrl = ref.watch(serverUrlProvider);
final uri = '$serverUrl/drive/files/${item.id}';
var ratio =
item.fileMeta?['ratio'] is num
? item.fileMeta!['ratio'].toDouble()
: 1.0;
final unlocked = useState(false);
final meta = item.fileMeta is Map ? (item.fileMeta as Map) : const {};
final blurHash = noBlurhash ? null : (meta['blur'] as String?);
var ratio = meta['ratio'] is num ? (meta['ratio'] as num).toDouble() : 1.0;
if (ratio == 0) ratio = 1.0;
Widget cloudImage() => UniversalImage(uri: uri, blurHash: blurHash, fit: fit);
Widget cloudVideo() => CloudVideoWidget(item: item);
Widget dataPlaceHolder(IconData icon) => _DataSavingPlaceholder(
icon: icon,
onTap: () {
unlocked.value = true;
},
);
var content = switch (item.mimeType?.split('/').firstOrNull) {
"image" => AspectRatio(
'image' => AspectRatio(
aspectRatio: ratio,
child: dataSaving ? _DataSavingPlaceholder(
icon: Symbols.image,
onTap: () {
// TODO: single picture unlock logic
})
: UniversalImage(
uri: uri,
blurHash:
noBlurhash
? null
: (item.fileMeta is String ? item.fileMeta!['blur'] : null),
child: (dataSaving && !unlocked.value) ? dataPlaceHolder(Symbols.image) : cloudImage(),
),
),
"video" => AspectRatio(
'video' => AspectRatio(
aspectRatio: ratio,
child: dataSaving ? _DataSavingPlaceholder(
icon: Symbols.play_arrow,
onTap: () {
// TODO: single vedio unlock logic
}
)
: CloudVideoWidget(item: item),
child: (dataSaving && !unlocked.value) ? dataPlaceHolder(Symbols.play_arrow) : cloudVideo(),
),
"audio" => Center(
'audio' => Center(
child: ConstrainedBox(
constraints: BoxConstraints(
maxWidth: math.min(360, MediaQuery.of(context).size.width * 0.8),
@@ -375,7 +372,7 @@ class ProfilePictureWidget extends ConsumerWidget {
child: id == null
? fallback
: DataSavingGate(
bypass: true, // 小頭像永遠繞過低數據
bypass: true,
placeholder: fallback,
content: () => UniversalImage(
uri: '$serverUrl/drive/files/$id',