Files
flux/lib/core/widgets/image_viewer_widget.dart

62 lines
2.1 KiB
Dart
Raw Normal View History

2026-04-20 16:50:55 +02:00
import 'dart:typed_data';
import 'package:flutter/material.dart';
2026-04-20 16:50:55 +02:00
import 'package:supabase_flutter/supabase_flutter.dart'; // <--- AGGIUNGI QUESTO
class ImageViewerWidget extends StatelessWidget {
2026-04-20 16:50:55 +02:00
final String? storagePath; // ATTENZIONE: Ora contiene lo storagePath!
final Uint8List? bytes;
2026-04-20 16:50:55 +02:00
const ImageViewerWidget({super.key, this.storagePath, this.bytes})
: assert(
(storagePath != null && storagePath != '') || bytes != null,
'Errore: Devi fornire un Path valido o i bytes del file!',
);
// Funzione che chiede le chiavi a Supabase
Future<String> _getSignedUrl() async {
return await Supabase.instance.client.storage
.from('documents')
.createSignedUrl(storagePath!, 60); // Link che si autodistrugge in 60s
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
2026-04-20 16:50:55 +02:00
backgroundColor: Colors.transparent,
elevation: 0,
leading: IconButton(
2026-04-20 16:50:55 +02:00
icon: const Icon(Icons.close, color: Colors.black),
onPressed: () => Navigator.pop(context),
),
),
body: InteractiveViewer(
2026-04-20 16:50:55 +02:00
maxScale: 5.0,
child: Center(
// Se abbiamo i byte, mostriamo subito. Altrimenti usiamo il FutureBuilder!
child: bytes != null
? Image.memory(bytes!)
: FutureBuilder<String>(
future: _getSignedUrl(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const CircularProgressIndicator();
}
if (snapshot.hasError) {
return const Text(
"Errore caricamento immagine (Permessi negati?)",
style: TextStyle(color: Colors.red),
);
}
if (snapshot.hasData) {
return Image.network(snapshot.data!);
}
return const SizedBox.shrink();
},
),
),
),
);
}
}