52 lines
2.0 KiB
Dart
52 lines
2.0 KiB
Dart
import 'package:cached_network_image/cached_network_image.dart';
|
|
import 'package:flutter/material.dart';
|
|
|
|
import '../../../../api/marianumcloud/webdav/queries/list_files/cacheable_file.dart';
|
|
import '../../../../model/account_data.dart';
|
|
import '../../../../model/endpoint_data.dart';
|
|
import '../data/file_type_icon.dart';
|
|
|
|
/// Leading slot for a file row: shows the Nextcloud thumbnail when the
|
|
/// server can render one (`nc:has-preview`), otherwise a typed file icon.
|
|
/// Always reserves the same square so rows stay aligned regardless of
|
|
/// whether a preview is present.
|
|
class FileLeading extends StatelessWidget {
|
|
final CacheableFile file;
|
|
|
|
/// Edge length of the rendered square. Defaults to the regular row size;
|
|
/// use a larger value (e.g. in detail sheets) where appropriate.
|
|
final double size;
|
|
|
|
const FileLeading({required this.file, this.size = 28, super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final icon = Icon(iconForFile(file), size: size);
|
|
final fileId = file.fileId;
|
|
return SizedBox(
|
|
width: size,
|
|
height: size,
|
|
child: (file.isDirectory || file.hasPreview != true || fileId == null)
|
|
? Center(child: icon)
|
|
: ClipRRect(
|
|
borderRadius: BorderRadius.circular(4),
|
|
child: CachedNetworkImage(
|
|
imageUrl:
|
|
'https://${EndpointData().nextcloud().full()}'
|
|
'/index.php/core/preview'
|
|
'?fileId=$fileId&x=128&y=128&a=0',
|
|
httpHeaders: AccountData().authHeaders(),
|
|
fit: BoxFit.cover,
|
|
fadeInDuration: Duration.zero,
|
|
fadeOutDuration: Duration.zero,
|
|
errorListener: (_) {},
|
|
// Icon doubles as the loading placeholder so the list doesn't
|
|
// pop a spinner per row while thumbnails stream in.
|
|
placeholder: (_, _) => Center(child: icon),
|
|
errorWidget: (_, _, _) => Center(child: icon),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|