65 lines
1.9 KiB
Dart
65 lines
1.9 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
import 'package:island/models/file.dart';
|
|
import 'package:island/pods/config.dart';
|
|
import 'package:material_symbols_icons/symbols.dart';
|
|
import 'package:styled_widget/styled_widget.dart';
|
|
|
|
import 'image.dart';
|
|
import 'video.dart';
|
|
|
|
class CloudFileWidget extends ConsumerWidget {
|
|
final SnCloudFile item;
|
|
final BoxFit fit;
|
|
const CloudFileWidget({
|
|
super.key,
|
|
required this.item,
|
|
this.fit = BoxFit.cover,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context, WidgetRef ref) {
|
|
final serverUrl = ref.watch(serverUrlProvider);
|
|
final uri = '$serverUrl/files/${item.id}';
|
|
switch (item.mimeType?.split('/').firstOrNull) {
|
|
case "image":
|
|
return AspectRatio(
|
|
aspectRatio: (item.fileMeta?['ratio'] ?? 1).toDouble(),
|
|
child: UniversalImage(uri: uri, blurHash: item.fileMeta?['blur']),
|
|
);
|
|
case "video":
|
|
return AspectRatio(
|
|
aspectRatio: (item.fileMeta?['ratio'] ?? 16 / 9).toDouble(),
|
|
child: UniversalVideo(
|
|
uri: uri,
|
|
aspectRatio: (item.fileMeta?['ratio'] ?? 16 / 9).toDouble(),
|
|
),
|
|
);
|
|
default:
|
|
return Text('Unable render for ${item.mimeType}');
|
|
}
|
|
}
|
|
}
|
|
|
|
class ProfilePictureWidget extends ConsumerWidget {
|
|
final SnCloudFile? item;
|
|
final double radius;
|
|
const ProfilePictureWidget({super.key, required this.item, this.radius = 20});
|
|
|
|
@override
|
|
Widget build(BuildContext context, WidgetRef ref) {
|
|
return ClipRRect(
|
|
borderRadius: BorderRadius.all(Radius.circular(radius)),
|
|
child: Container(
|
|
width: radius * 2,
|
|
height: radius * 2,
|
|
color: Theme.of(context).colorScheme.primaryContainer,
|
|
child:
|
|
item == null
|
|
? Icon(Symbols.account_circle, size: radius).center()
|
|
: CloudFileWidget(item: item!),
|
|
),
|
|
);
|
|
}
|
|
}
|