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