fixup! data-saving: implement gate with bypass
This commit is contained in:
@@ -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',
|
||||
|
Reference in New Issue
Block a user