54 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'dart:typed_data';
 | |
| 
 | |
| import 'package:flutter/material.dart';
 | |
| import 'package:hooks_riverpod/hooks_riverpod.dart';
 | |
| import 'package:moneymgr_mobile/utils/pdf_utils.dart';
 | |
| import 'package:riverpod_annotation/riverpod_annotation.dart';
 | |
| 
 | |
| part 'pdf_viewer.g.dart';
 | |
| 
 | |
| @riverpod
 | |
| Future<Uint8List> _renderPdf(
 | |
|   Ref ref, {
 | |
|   String? path,
 | |
|   Uint8List? pdfBytes,
 | |
| }) async {
 | |
|   return renderPdf(path: path, pdfBytes: pdfBytes);
 | |
| }
 | |
| 
 | |
| class PDFViewer extends ConsumerWidget {
 | |
|   final String? pdfPath;
 | |
|   final Uint8List? pdfBytes;
 | |
|   final double? width;
 | |
|   final double? height;
 | |
|   final BoxFit? fit;
 | |
| 
 | |
|   const PDFViewer({
 | |
|     super.key,
 | |
|     this.pdfPath,
 | |
|     this.pdfBytes,
 | |
|     this.width,
 | |
|     this.height,
 | |
|     this.fit,
 | |
|   }) : assert(pdfPath != null || pdfBytes != null);
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context, WidgetRef ref) {
 | |
|     final provider = ref.watch(
 | |
|       _renderPdfProvider(path: pdfPath, pdfBytes: pdfBytes),
 | |
|     );
 | |
| 
 | |
|     // Perform a switch-case on the result to handle loading/error states
 | |
|     return switch (provider) {
 | |
|       AsyncData(:final value) => Image(
 | |
|         image: MemoryImage(value),
 | |
|         width: width,
 | |
|         height: height,
 | |
|         fit: fit,
 | |
|       ),
 | |
|       AsyncError(:final error) => Text('PDF error: $error'),
 | |
|       _ => Center(child: const CircularProgressIndicator()),
 | |
|     };
 | |
|   }
 | |
| }
 |