import 'package:filesize/filesize.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:jiffy/jiffy.dart'; import '../../../../api/marianumcloud/webdav/queries/list_files/cacheable_file.dart'; /// Shows a modal bottom sheet with technical metadata about a single file or /// folder: full path, MIME type, size, timestamps, ETag. Future showFileDetailsSheet(BuildContext context, CacheableFile file) { return showModalBottomSheet( context: context, isScrollControlled: true, showDragHandle: true, builder: (context) => SafeArea( child: SingleChildScrollView( padding: const EdgeInsets.fromLTRB(16, 0, 16, 16), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, mainAxisSize: MainAxisSize.min, children: [ ListTile( leading: Icon(file.isDirectory ? Icons.folder : Icons.description_outlined, size: 32), title: Text(file.name, style: const TextStyle(fontWeight: FontWeight.bold)), subtitle: Text(file.isDirectory ? 'Ordner' : (file.mimeType ?? '–')), ), const Divider(), _DetailRow(label: 'Pfad', value: file.path, copyable: true), if (!file.isDirectory) _DetailRow(label: 'Größe', value: filesize(file.size)), if (file.modifiedAt != null) _DetailRow( label: 'Geändert', value: '${Jiffy.parseFromDateTime(file.modifiedAt!).format(pattern: 'dd.MM.yyyy HH:mm')} ' '(${Jiffy.parseFromDateTime(file.modifiedAt!).fromNow()})', ), if (file.createdAt != null) _DetailRow( label: 'Erstellt', value: Jiffy.parseFromDateTime(file.createdAt!).format(pattern: 'dd.MM.yyyy HH:mm'), ), if (file.eTag != null) _DetailRow(label: 'ETag', value: file.eTag!, copyable: true), ], ), ), ), ); } class _DetailRow extends StatelessWidget { const _DetailRow({required this.label, required this.value, this.copyable = false}); final String label; final String value; final bool copyable; @override Widget build(BuildContext context) => Padding( padding: const EdgeInsets.symmetric(vertical: 6), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( width: 90, child: Text(label, style: TextStyle(color: Theme.of(context).colorScheme.onSurfaceVariant)), ), Expanded(child: SelectableText(value)), if (copyable) IconButton( tooltip: 'Kopieren', icon: const Icon(Icons.copy, size: 18), onPressed: () { Clipboard.setData(ClipboardData(text: value)); ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('In Zwischenablage kopiert')), ); }, ), ], ), ); }