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()),
 | 
						|
    };
 | 
						|
  }
 | 
						|
}
 |