A framework for building convergent cross-platform Nextcloud clients using Flutter.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
2.2 KiB

part of '../neon_files.dart';
3 years ago
class FilePreview extends StatelessWidget {
const FilePreview({
required this.bloc,
required this.details,
this.width = 40,
this.height = 40,
this.color,
this.borderRadius,
this.withBackground = false,
3 years ago
super.key,
}) : assert(
(borderRadius != null && withBackground) || borderRadius == null,
'withBackground needs to be true when borderRadius is set',
);
3 years ago
final FilesBloc bloc;
final FileDetails details;
final int width;
final int height;
final Color? color;
final BorderRadius? borderRadius;
final bool withBackground;
3 years ago
@override
Widget build(final BuildContext context) {
3 years ago
final color = this.color ?? Theme.of(context).colorScheme.primary;
return SizedBox(
width: width.toDouble(),
height: height.toDouble(),
child: StreamBuilder<bool?>(
stream: bloc.options.showPreviewsOption.stream,
builder: (final context, final showPreviewsSnapshot) {
if ((showPreviewsSnapshot.data ?? false) && (details.hasPreview ?? false)) {
final account = Provider.of<AccountsBloc>(context, listen: false).activeAccount.value!;
final child = NeonCachedApiImage(
account: account,
cacheKey: 'preview-${details.path.join('/')}-$width-$height',
etag: details.etag,
download: () async => account.client.core.getPreview(
file: details.path.join('/'),
x: width,
y: height,
),
3 years ago
);
if (withBackground) {
return NeonImageWrapper(
color: Colors.white,
borderRadius: borderRadius,
child: child,
);
}
return child;
3 years ago
}
if (details.isDirectory) {
return Icon(
MdiIcons.folder,
color: color,
size: min(width.toDouble(), height.toDouble()),
);
}
return FileIcon(
details.name,
color: color,
size: min(width.toDouble(), height.toDouble()),
);
},
),
);
}
}