From b0a3ff1f57bb24edd3fe76be4ecb06282cd9f513 Mon Sep 17 00:00:00 2001 From: insleker Date: Wed, 10 Sep 2025 20:22:36 +0800 Subject: [PATCH] feat: partially implement new ui widget --- .../pdf/view_model/pdf_view_model.dart | 65 +++++++++++++++++++ lib/ui/features/pdf/widgets/pdf_screen.dart | 7 +- .../view_model/preferences_view_model.dart | 13 ++++ .../view_model/signature_view_model.dart | 13 ++++ .../view_model/welcome_view_model.dart | 31 +++++++++ .../welcome/widgets/welcome_screen.dart | 17 ++--- 6 files changed, 130 insertions(+), 16 deletions(-) create mode 100644 lib/ui/features/pdf/view_model/pdf_view_model.dart create mode 100644 lib/ui/features/preferences/view_model/preferences_view_model.dart create mode 100644 lib/ui/features/signature/view_model/signature_view_model.dart create mode 100644 lib/ui/features/welcome/view_model/welcome_view_model.dart diff --git a/lib/ui/features/pdf/view_model/pdf_view_model.dart b/lib/ui/features/pdf/view_model/pdf_view_model.dart new file mode 100644 index 0000000..d8639d7 --- /dev/null +++ b/lib/ui/features/pdf/view_model/pdf_view_model.dart @@ -0,0 +1,65 @@ +import 'dart:typed_data'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:pdf_signature/data/repositories/document_repository.dart'; +import 'package:pdf_signature/data/repositories/signature_card_repository.dart'; +import 'package:pdf_signature/domain/models/model.dart'; +import 'package:pdfrx/pdfrx.dart'; + +class PdfViewModel { + final Ref ref; + + PdfViewModel(this.ref); + + Document get document => ref.read(documentRepositoryProvider); + + void jumpToPage(int page) { + ref.read(documentRepositoryProvider.notifier).jumpTo(page); + } + + Future openPdf({required String path, Uint8List? bytes}) async { + int pageCount = 1; + if (bytes != null) { + try { + final doc = await PdfDocument.openData(bytes); + pageCount = doc.pages.length; + } catch (_) { + // ignore + } + } + ref + .read(documentRepositoryProvider.notifier) + .openPicked(path: path, pageCount: pageCount, bytes: bytes); + ref.read(signatureCardProvider.notifier).clearAll(); + } + + Future loadSignatureFromFile() async { + // This would need file picker, but since it's UI logic, perhaps keep in widget + // For now, return null + return null; + } + + void confirmSignature() { + // Need to implement based on original logic + } + + void onDragSignature(Offset delta) { + // Implement drag + } + + void onResizeSignature(Offset delta) { + // Implement resize + } + + void onSelectPlaced(int? index) { + // ref.read(documentRepositoryProvider.notifier).selectPlacement(index); + } + + Future saveSignedPdf() async { + // Implement save logic + } +} + +final pdfViewModelProvider = Provider((ref) { + return PdfViewModel(ref); +}); diff --git a/lib/ui/features/pdf/widgets/pdf_screen.dart b/lib/ui/features/pdf/widgets/pdf_screen.dart index 8152c74..0215ed8 100644 --- a/lib/ui/features/pdf/widgets/pdf_screen.dart +++ b/lib/ui/features/pdf/widgets/pdf_screen.dart @@ -62,10 +62,9 @@ class _PdfSignatureHomePageState extends ConsumerState { } catch (_) { bytes = null; } - ref - .read(documentRepositoryProvider.notifier) - .openPicked(path: file.path, bytes: bytes); - ref.read(signatureProvider.notifier).resetForNewPage(); + await ref + .read(pdfViewModelProvider) + .openPdf(path: file.path, bytes: bytes); } } diff --git a/lib/ui/features/preferences/view_model/preferences_view_model.dart b/lib/ui/features/preferences/view_model/preferences_view_model.dart new file mode 100644 index 0000000..a9d25af --- /dev/null +++ b/lib/ui/features/preferences/view_model/preferences_view_model.dart @@ -0,0 +1,13 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +class PreferencesViewModel { + final Ref ref; + + PreferencesViewModel(this.ref); + + // Add methods as needed +} + +final preferencesViewModelProvider = Provider((ref) { + return PreferencesViewModel(ref); +}); diff --git a/lib/ui/features/signature/view_model/signature_view_model.dart b/lib/ui/features/signature/view_model/signature_view_model.dart new file mode 100644 index 0000000..8ea97a5 --- /dev/null +++ b/lib/ui/features/signature/view_model/signature_view_model.dart @@ -0,0 +1,13 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +class SignatureViewModel { + final Ref ref; + + SignatureViewModel(this.ref); + + // Add methods as needed +} + +final signatureViewModelProvider = Provider((ref) { + return SignatureViewModel(ref); +}); diff --git a/lib/ui/features/welcome/view_model/welcome_view_model.dart b/lib/ui/features/welcome/view_model/welcome_view_model.dart new file mode 100644 index 0000000..7c80e7e --- /dev/null +++ b/lib/ui/features/welcome/view_model/welcome_view_model.dart @@ -0,0 +1,31 @@ +import 'dart:typed_data'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:pdf_signature/data/repositories/document_repository.dart'; +import 'package:pdf_signature/data/repositories/signature_card_repository.dart'; +import 'package:pdfrx/pdfrx.dart'; + +class WelcomeViewModel { + final Ref ref; + + WelcomeViewModel(this.ref); + + Future openPdf({required String path, Uint8List? bytes}) async { + int pageCount = 1; // default + if (bytes != null) { + try { + final doc = await PdfDocument.openData(bytes); + pageCount = doc.pages.length; + } catch (_) { + // ignore + } + } + ref + .read(documentRepositoryProvider.notifier) + .openPicked(path: path, pageCount: pageCount, bytes: bytes); + ref.read(signatureCardProvider.notifier).clearAll(); + } +} + +final welcomeViewModelProvider = Provider((ref) { + return WelcomeViewModel(ref); +}); diff --git a/lib/ui/features/welcome/widgets/welcome_screen.dart b/lib/ui/features/welcome/widgets/welcome_screen.dart index 191a92f..bb3a488 100644 --- a/lib/ui/features/welcome/widgets/welcome_screen.dart +++ b/lib/ui/features/welcome/widgets/welcome_screen.dart @@ -6,10 +6,7 @@ import 'package:flutter/foundation.dart' show kIsWeb; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:pdf_signature/l10n/app_localizations.dart'; - -import 'package:pdf_signature/data/repositories/signature_card_repository.dart'; -import 'package:pdf_signature/data/repositories/document_repository.dart'; -// Settings dialog is provided via global AppBar in MyApp +import 'package:pdf_signature/ui/features/welcome/view_model/welcome_view_model.dart'; // Abstraction to make drop handling testable without constructing // platform-specific DropItem types in widget tests. @@ -50,10 +47,7 @@ Future handleDroppedFiles( bytes = null; } final String path = pdf.path ?? pdf.name; - read( - documentRepositoryProvider.notifier, - ).openPicked(path: path, bytes: bytes); - read(signatureProvider.notifier).resetForNewPage(); + await read(welcomeViewModelProvider).openPdf(path: path, bytes: bytes); } class WelcomeScreen extends ConsumerStatefulWidget { @@ -76,10 +70,9 @@ class _WelcomeScreenState extends ConsumerState { } catch (_) { bytes = null; } - ref - .read(documentRepositoryProvider.notifier) - .openPicked(path: file.path, bytes: bytes); - ref.read(signatureProvider.notifier).resetForNewPage(); + await ref + .read(welcomeViewModelProvider) + .openPdf(path: file.path, bytes: bytes); } }