nc-photos/lib/widget/photo_list_item.dart

133 lines
4 KiB
Dart
Raw Normal View History

2021-05-06 13:29:20 +02:00
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:nc_photos/account.dart';
import 'package:nc_photos/api/api.dart';
import 'package:nc_photos/theme.dart';
class PhotoListImage extends StatelessWidget {
const PhotoListImage({
Key key,
@required this.account,
@required this.previewUrl,
2021-06-22 07:24:37 +02:00
this.isGif = false,
2021-05-06 13:29:20 +02:00
}) : super(key: key);
@override
build(BuildContext context) {
return FittedBox(
clipBehavior: Clip.hardEdge,
fit: BoxFit.cover,
2021-06-22 07:24:37 +02:00
child: Stack(
children: [
Container(
// arbitrary size here
constraints: BoxConstraints.tight(const Size(128, 128)),
color: AppTheme.getListItemBackgroundColor(context),
child: CachedNetworkImage(
imageUrl: previewUrl,
httpHeaders: {
"Authorization": Api.getAuthorizationHeaderValue(account),
},
fadeInDuration: const Duration(),
filterQuality: FilterQuality.high,
errorWidget: (context, url, error) {
// won't work on web because the image is downloaded by the cache
// manager instead
// where's the preview???
return Container(
child: Center(
child: Icon(
Icons.image_not_supported,
size: 64,
color: Colors.white.withOpacity(.8),
),
),
);
},
imageRenderMethodForWeb: ImageRenderMethodForWeb.HttpGet,
),
),
if (isGif)
Container(
// arbitrary size here
constraints: BoxConstraints.tight(const Size(128, 128)),
alignment: AlignmentDirectional.topEnd,
padding: const EdgeInsets.symmetric(horizontal: 2),
child: const Icon(
Icons.gif,
size: 36,
color: Colors.white,
2021-05-06 13:29:20 +02:00
),
2021-06-22 07:24:37 +02:00
),
],
2021-05-06 13:29:20 +02:00
),
);
}
final Account account;
final String previewUrl;
2021-06-22 07:24:37 +02:00
final bool isGif;
2021-05-06 13:29:20 +02:00
}
2021-05-06 13:36:20 +02:00
class PhotoListVideo extends StatelessWidget {
const PhotoListVideo({
Key key,
@required this.account,
@required this.previewUrl,
}) : super(key: key);
@override
build(BuildContext context) {
return FittedBox(
clipBehavior: Clip.hardEdge,
fit: BoxFit.cover,
2021-06-22 07:23:28 +02:00
child: Stack(
children: [
Container(
// arbitrary size here
constraints: BoxConstraints.tight(const Size(128, 128)),
color: AppTheme.getListItemBackgroundColor(context),
child: CachedNetworkImage(
imageUrl: previewUrl,
httpHeaders: {
"Authorization": Api.getAuthorizationHeaderValue(account),
},
fadeInDuration: const Duration(),
filterQuality: FilterQuality.high,
errorWidget: (context, url, error) {
// no preview for this video. Normal since video preview is disabled
// by default
return Container(
child: Center(
child: Icon(
Icons.image_not_supported,
size: 64,
color: Colors.white.withOpacity(.8),
),
),
);
},
imageRenderMethodForWeb: ImageRenderMethodForWeb.HttpGet,
),
),
Container(
// arbitrary size here
constraints: BoxConstraints.tight(const Size(128, 128)),
alignment: AlignmentDirectional.topEnd,
padding: const EdgeInsets.all(8),
child: const Icon(
Icons.play_circle_outlined,
size: 24,
color: Colors.white,
),
),
],
2021-05-06 13:36:20 +02:00
),
);
}
final Account account;
final String previewUrl;
}