fix: thumbnail not shown actualy pdf page
This commit is contained in:
parent
c82bb7fa2a
commit
7336ca4d57
|
|
@ -13,7 +13,7 @@ import 'package:pdf_signature/data/repositories/signature_card_repository.dart';
|
|||
import 'package:pdf_signature/data/repositories/document_repository.dart';
|
||||
import 'package:pdf_signature/domain/models/model.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_view_model.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/ui_services.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pages_sidebar.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_screen.dart';
|
||||
|
|
@ -48,11 +48,7 @@ void main() {
|
|||
(ref) => PreferencesStateNotifier(prefs),
|
||||
),
|
||||
documentRepositoryProvider.overrideWith(
|
||||
(ref) =>
|
||||
DocumentStateNotifier()..openPicked(
|
||||
path: 'integration_test/data/sample-local-pdf.pdf',
|
||||
pageCount: 3,
|
||||
),
|
||||
(ref) => DocumentStateNotifier()..openPicked(pageCount: 3),
|
||||
),
|
||||
useMockViewerProvider.overrideWith((ref) => false),
|
||||
exportServiceProvider.overrideWith((_) => fake),
|
||||
|
|
@ -110,11 +106,8 @@ void main() {
|
|||
),
|
||||
documentRepositoryProvider.overrideWith(
|
||||
(ref) =>
|
||||
DocumentStateNotifier()..openPicked(
|
||||
path: 'integration_test/data/sample-local-pdf.pdf',
|
||||
pageCount: 3,
|
||||
bytes: pdfBytes,
|
||||
),
|
||||
DocumentStateNotifier()
|
||||
..openPicked(pageCount: 3, bytes: pdfBytes),
|
||||
),
|
||||
signatureAssetRepositoryProvider.overrideWith((ref) {
|
||||
final c = SignatureAssetRepository();
|
||||
|
|
@ -196,11 +189,8 @@ void main() {
|
|||
),
|
||||
documentRepositoryProvider.overrideWith(
|
||||
(ref) =>
|
||||
DocumentStateNotifier()..openPicked(
|
||||
path: 'integration_test/data/sample-local-pdf.pdf',
|
||||
pageCount: 3,
|
||||
bytes: pdfBytes,
|
||||
),
|
||||
DocumentStateNotifier()
|
||||
..openPicked(pageCount: 3, bytes: pdfBytes),
|
||||
),
|
||||
useMockViewerProvider.overrideWithValue(false),
|
||||
],
|
||||
|
|
@ -239,11 +229,8 @@ void main() {
|
|||
),
|
||||
documentRepositoryProvider.overrideWith(
|
||||
(ref) =>
|
||||
DocumentStateNotifier()..openPicked(
|
||||
path: 'integration_test/data/sample-local-pdf.pdf',
|
||||
pageCount: 3,
|
||||
bytes: pdfBytes,
|
||||
),
|
||||
DocumentStateNotifier()
|
||||
..openPicked(pageCount: 3, bytes: pdfBytes),
|
||||
),
|
||||
useMockViewerProvider.overrideWithValue(false),
|
||||
],
|
||||
|
|
@ -285,11 +272,8 @@ void main() {
|
|||
),
|
||||
documentRepositoryProvider.overrideWith(
|
||||
(ref) =>
|
||||
DocumentStateNotifier()..openPicked(
|
||||
path: 'integration_test/data/sample-local-pdf.pdf',
|
||||
pageCount: 3,
|
||||
bytes: pdfBytes,
|
||||
),
|
||||
DocumentStateNotifier()
|
||||
..openPicked(pageCount: 3, bytes: pdfBytes),
|
||||
),
|
||||
useMockViewerProvider.overrideWithValue(false),
|
||||
],
|
||||
|
|
@ -305,6 +289,14 @@ void main() {
|
|||
final ctx = tester.element(find.byType(PdfSignatureHomePage));
|
||||
final container = ProviderScope.containerOf(ctx);
|
||||
expect(container.read(pdfViewModelProvider), 1);
|
||||
|
||||
final pagesSidebar = find.byType(PagesSidebar);
|
||||
expect(pagesSidebar, findsOneWidget);
|
||||
|
||||
// Scroll to make page 3 thumbnail visible
|
||||
await tester.drag(pagesSidebar, const Offset(0, -300));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
final page3Thumb = find.text('3');
|
||||
expect(page3Thumb, findsOneWidget);
|
||||
await tester.tap(page3Thumb);
|
||||
|
|
@ -326,11 +318,8 @@ void main() {
|
|||
),
|
||||
documentRepositoryProvider.overrideWith(
|
||||
(ref) =>
|
||||
DocumentStateNotifier()..openPicked(
|
||||
path: 'integration_test/data/sample-local-pdf.pdf',
|
||||
pageCount: 3,
|
||||
bytes: pdfBytes,
|
||||
),
|
||||
DocumentStateNotifier()
|
||||
..openPicked(pageCount: 3, bytes: pdfBytes),
|
||||
),
|
||||
useMockViewerProvider.overrideWithValue(false),
|
||||
],
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import 'dart:io';
|
|||
import 'package:flutter/services.dart';
|
||||
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_screen.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pages_sidebar.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_view_model.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
|
@ -34,11 +34,8 @@ void main() {
|
|||
),
|
||||
documentRepositoryProvider.overrideWith(
|
||||
(ref) =>
|
||||
DocumentStateNotifier()..openPicked(
|
||||
path: 'integration_test/data/sample-local-pdf.pdf',
|
||||
pageCount: 3,
|
||||
bytes: pdfBytes,
|
||||
),
|
||||
DocumentStateNotifier()
|
||||
..openPicked(pageCount: 3, bytes: pdfBytes),
|
||||
),
|
||||
useMockViewerProvider.overrideWithValue(false),
|
||||
],
|
||||
|
|
@ -85,11 +82,8 @@ void main() {
|
|||
),
|
||||
documentRepositoryProvider.overrideWith(
|
||||
(ref) =>
|
||||
DocumentStateNotifier()..openPicked(
|
||||
path: 'integration_test/data/sample-local-pdf.pdf',
|
||||
pageCount: 3,
|
||||
bytes: pdfBytes,
|
||||
),
|
||||
DocumentStateNotifier()
|
||||
..openPicked(pageCount: 3, bytes: pdfBytes),
|
||||
),
|
||||
useMockViewerProvider.overrideWithValue(false),
|
||||
],
|
||||
|
|
@ -136,11 +130,8 @@ void main() {
|
|||
),
|
||||
documentRepositoryProvider.overrideWith(
|
||||
(ref) =>
|
||||
DocumentStateNotifier()..openPicked(
|
||||
path: 'integration_test/data/sample-local-pdf.pdf',
|
||||
pageCount: 3,
|
||||
bytes: pdfBytes,
|
||||
),
|
||||
DocumentStateNotifier()
|
||||
..openPicked(pageCount: 3, bytes: pdfBytes),
|
||||
),
|
||||
useMockViewerProvider.overrideWithValue(false),
|
||||
],
|
||||
|
|
@ -159,6 +150,13 @@ void main() {
|
|||
final container = ProviderScope.containerOf(ctx);
|
||||
expect(container.read(pdfViewModelProvider), 1);
|
||||
|
||||
final pagesSidebar = find.byType(PagesSidebar);
|
||||
expect(pagesSidebar, findsOneWidget);
|
||||
|
||||
// Scroll to make page 3 thumbnail visible
|
||||
await tester.drag(pagesSidebar, const Offset(0, -300));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
final page3Thumbnail = find.text('3');
|
||||
expect(page3Thumbnail, findsOneWidget);
|
||||
await tester.tap(page3Thumbnail);
|
||||
|
|
@ -181,11 +179,8 @@ void main() {
|
|||
),
|
||||
documentRepositoryProvider.overrideWith(
|
||||
(ref) =>
|
||||
DocumentStateNotifier()..openPicked(
|
||||
path: 'integration_test/data/sample-local-pdf.pdf',
|
||||
pageCount: 3,
|
||||
bytes: pdfBytes,
|
||||
),
|
||||
DocumentStateNotifier()
|
||||
..openPicked(pageCount: 3, bytes: pdfBytes),
|
||||
),
|
||||
useMockViewerProvider.overrideWithValue(false),
|
||||
],
|
||||
|
|
|
|||
|
|
@ -16,7 +16,6 @@ class DocumentStateNotifier extends StateNotifier<Document> {
|
|||
}
|
||||
|
||||
void openPicked({
|
||||
required String path,
|
||||
required int pageCount,
|
||||
Uint8List? bytes,
|
||||
}) {
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ class PdfViewModel extends StateNotifier<int> {
|
|||
}
|
||||
ref
|
||||
.read(documentRepositoryProvider.notifier)
|
||||
.openPicked(path: path, pageCount: pageCount, bytes: bytes);
|
||||
.openPicked(pageCount: pageCount, bytes: bytes);
|
||||
ref.read(signatureCardRepositoryProvider.notifier).clearAll();
|
||||
state = 1; // Reset current page to 1
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'pdf_pages_overview.dart';
|
||||
import 'thumbnails_view.dart';
|
||||
|
||||
class PagesSidebar extends StatelessWidget {
|
||||
const PagesSidebar({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Card(margin: EdgeInsets.zero, child: const PdfPagesOverview());
|
||||
return Card(margin: EdgeInsets.zero, child: const ThumbnailsView());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||
import 'package:pdf_signature/l10n/app_localizations.dart';
|
||||
|
||||
import 'pdf_page_overlays.dart';
|
||||
import 'pdf_providers.dart';
|
||||
import '../view_model/pdf_providers.dart';
|
||||
import 'package:pdf_signature/data/repositories/signature_asset_repository.dart';
|
||||
// using only adjusted overlay, no direct model imports needed
|
||||
import '../../signature/widgets/signature_drag_data.dart';
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import 'package:pdf_signature/l10n/app_localizations.dart';
|
|||
import 'package:pdf_signature/data/repositories/document_repository.dart';
|
||||
import 'pdf_viewer_widget.dart';
|
||||
import '../view_model/pdf_view_model.dart';
|
||||
import 'pdf_providers.dart';
|
||||
import '../view_model/pdf_providers.dart';
|
||||
|
||||
class PdfPageArea extends ConsumerStatefulWidget {
|
||||
const PdfPageArea({
|
||||
|
|
@ -159,6 +159,7 @@ class _PdfPageAreaState extends ConsumerState<PdfPageArea> {
|
|||
|
||||
// Use real PDF viewer
|
||||
if (isContinuous) {
|
||||
final controller = ref.watch(pdfViewerControllerProvider);
|
||||
return PdfViewerWidget(
|
||||
pageSize: widget.pageSize,
|
||||
onDragSignature: widget.onDragSignature,
|
||||
|
|
@ -168,6 +169,7 @@ class _PdfPageAreaState extends ConsumerState<PdfPageArea> {
|
|||
onSelectPlaced: widget.onSelectPlaced,
|
||||
pageKeyBuilder: _pageKey,
|
||||
scrollToPage: _scrollToPage,
|
||||
controller: controller,
|
||||
);
|
||||
}
|
||||
return const SizedBox.shrink();
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||
import '../../../../domain/models/model.dart';
|
||||
import 'package:pdf_signature/data/repositories/document_repository.dart';
|
||||
import 'signature_overlay.dart';
|
||||
import 'pdf_providers.dart';
|
||||
import '../view_model/pdf_providers.dart';
|
||||
|
||||
/// Builds all overlays for a given page: placed signatures and the active one.
|
||||
class PdfPageOverlays extends ConsumerWidget {
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:pdfrx/pdfrx.dart';
|
||||
import 'package:pdf_signature/data/repositories/document_repository.dart';
|
||||
import 'pdf_providers.dart';
|
||||
import '../view_model/pdf_providers.dart';
|
||||
|
||||
class PdfPagesOverview extends ConsumerWidget {
|
||||
const PdfPagesOverview({super.key});
|
||||
|
|
@ -9,59 +10,77 @@ class PdfPagesOverview extends ConsumerWidget {
|
|||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final pdf = ref.watch(documentRepositoryProvider);
|
||||
ref.watch(useMockViewerProvider);
|
||||
final controller = ref.watch(pdfViewerControllerProvider);
|
||||
final theme = Theme.of(context);
|
||||
|
||||
if (!pdf.loaded) return const SizedBox.shrink();
|
||||
if (!pdf.loaded || pdf.pickedPdfBytes == null)
|
||||
return const SizedBox.shrink();
|
||||
|
||||
Widget buildList(int pageCount, {Widget Function(int i)? item}) {
|
||||
return ListView.separated(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 8),
|
||||
itemCount: pageCount,
|
||||
separatorBuilder: (_, _) => const SizedBox(height: 8),
|
||||
itemBuilder: (context, index) {
|
||||
final pageNumber = index + 1;
|
||||
final isSelected = ref.watch(currentPageProvider) == pageNumber;
|
||||
return InkWell(
|
||||
onTap: () {
|
||||
final controller = ref.read(pdfViewerControllerProvider);
|
||||
if (controller.isReady)
|
||||
controller.goToPage(pageNumber: pageNumber);
|
||||
},
|
||||
child: DecoratedBox(
|
||||
decoration: BoxDecoration(
|
||||
color:
|
||||
isSelected
|
||||
? theme.colorScheme.primaryContainer
|
||||
: theme.cardColor,
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
border: Border.all(
|
||||
color:
|
||||
isSelected
|
||||
? theme.colorScheme.primary
|
||||
: theme.dividerColor,
|
||||
),
|
||||
),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(6),
|
||||
child: AspectRatio(
|
||||
aspectRatio: 1 / 1.4142, // A4 portrait approx
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(4),
|
||||
child:
|
||||
item != null
|
||||
? item(index)
|
||||
: Center(child: Text('$pageNumber')),
|
||||
final documentRef = PdfDocumentRefData(
|
||||
pdf.pickedPdfBytes!,
|
||||
sourceName: 'document.pdf',
|
||||
);
|
||||
|
||||
return Container(
|
||||
color: theme.colorScheme.surface,
|
||||
child: PdfDocumentViewBuilder(
|
||||
documentRef: documentRef,
|
||||
builder: (context, document) {
|
||||
final pageCount = document?.pages.length ?? 0;
|
||||
return ListView.separated(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 8),
|
||||
itemCount: pageCount,
|
||||
separatorBuilder: (_, _) => const SizedBox(height: 8),
|
||||
itemBuilder: (context, index) {
|
||||
final pageNumber = index + 1;
|
||||
final isSelected = ref.watch(currentPageProvider) == pageNumber;
|
||||
return InkWell(
|
||||
onTap: () {
|
||||
controller.goToPage(
|
||||
pageNumber: pageNumber,
|
||||
anchor: PdfPageAnchor.top,
|
||||
);
|
||||
},
|
||||
child: DecoratedBox(
|
||||
decoration: BoxDecoration(
|
||||
color:
|
||||
isSelected
|
||||
? theme.colorScheme.primaryContainer
|
||||
: theme.cardColor,
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
border: Border.all(
|
||||
color:
|
||||
isSelected
|
||||
? theme.colorScheme.primary
|
||||
: theme.dividerColor,
|
||||
),
|
||||
),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(6),
|
||||
child: Column(
|
||||
children: [
|
||||
SizedBox(
|
||||
height: 180,
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(4),
|
||||
child: PdfPageView(
|
||||
document: document,
|
||||
pageNumber: pageNumber,
|
||||
alignment: Alignment.center,
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 4),
|
||||
Text('$pageNumber', style: theme.textTheme.bodySmall),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
final count = pdf.pageCount == 0 ? 1 : pdf.pageCount;
|
||||
return buildList(count);
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import 'package:pdf_signature/l10n/app_localizations.dart';
|
|||
import 'package:multi_split_view/multi_split_view.dart';
|
||||
|
||||
import 'package:pdf_signature/data/repositories/document_repository.dart';
|
||||
import 'pdf_providers.dart';
|
||||
import '../view_model/pdf_providers.dart';
|
||||
import 'package:pdfrx/pdfrx.dart';
|
||||
import 'draw_canvas.dart';
|
||||
import 'pdf_toolbar.dart';
|
||||
|
|
@ -31,6 +31,7 @@ class _PdfSignatureHomePageState extends ConsumerState<PdfSignatureHomePage> {
|
|||
bool _showPagesSidebar = true;
|
||||
bool _showSignaturesSidebar = true;
|
||||
int _zoomLevel = 100; // percentage for display only
|
||||
fs.XFile _file = fs.XFile('');
|
||||
|
||||
// Split view controller to manage resizable sidebars without remounting the center area.
|
||||
late final MultiSplitViewController _splitController;
|
||||
|
|
@ -57,6 +58,9 @@ class _PdfSignatureHomePageState extends ConsumerState<PdfSignatureHomePage> {
|
|||
final typeGroup = const fs.XTypeGroup(label: 'PDF', extensions: ['pdf']);
|
||||
final file = await fs.openFile(acceptedTypeGroups: [typeGroup]);
|
||||
if (file != null) {
|
||||
setState(() {
|
||||
_file = file;
|
||||
});
|
||||
Uint8List? bytes;
|
||||
try {
|
||||
bytes = await file.readAsBytes();
|
||||
|
|
@ -75,7 +79,7 @@ class _PdfSignatureHomePageState extends ConsumerState<PdfSignatureHomePage> {
|
|||
}
|
||||
ref
|
||||
.read(documentRepositoryProvider.notifier)
|
||||
.openPicked(path: file.path, pageCount: pageCount, bytes: bytes);
|
||||
.openPicked(pageCount: pageCount, bytes: bytes);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -331,7 +335,7 @@ class _PdfSignatureHomePageState extends ConsumerState<PdfSignatureHomePage> {
|
|||
});
|
||||
},
|
||||
zoomLevel: _zoomLevel,
|
||||
fileName: 'mock.pdf',
|
||||
fileName: _file.name,
|
||||
showPagesSidebar: _showPagesSidebar,
|
||||
showSignaturesSidebar: _showSignaturesSidebar,
|
||||
onTogglePagesSidebar:
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||
import 'package:pdf_signature/l10n/app_localizations.dart';
|
||||
|
||||
import 'package:pdf_signature/data/repositories/document_repository.dart';
|
||||
import 'pdf_providers.dart';
|
||||
import '../view_model/pdf_providers.dart';
|
||||
|
||||
class PdfToolbar extends ConsumerStatefulWidget {
|
||||
const PdfToolbar({
|
||||
|
|
|
|||
|
|
@ -5,8 +5,8 @@ import 'package:pdf_signature/data/repositories/document_repository.dart';
|
|||
import 'package:pdf_signature/l10n/app_localizations.dart';
|
||||
import 'pdf_page_overlays.dart';
|
||||
import './pdf_mock_continuous_list.dart';
|
||||
import '../../signature/widgets/signature_drag_data.dart';
|
||||
import 'pdf_providers.dart';
|
||||
import '../view_model/pdf_providers.dart';
|
||||
import '../view_model/pdf_view_model.dart';
|
||||
|
||||
class PdfViewerWidget extends ConsumerStatefulWidget {
|
||||
const PdfViewerWidget({
|
||||
|
|
@ -19,6 +19,7 @@ class PdfViewerWidget extends ConsumerStatefulWidget {
|
|||
required this.onSelectPlaced,
|
||||
this.pageKeyBuilder,
|
||||
this.scrollToPage,
|
||||
required this.controller,
|
||||
});
|
||||
|
||||
final Size pageSize;
|
||||
|
|
@ -29,22 +30,21 @@ class PdfViewerWidget extends ConsumerStatefulWidget {
|
|||
final ValueChanged<int?> onSelectPlaced;
|
||||
final GlobalKey Function(int page)? pageKeyBuilder;
|
||||
final void Function(int page)? scrollToPage;
|
||||
final PdfViewerController controller;
|
||||
|
||||
@override
|
||||
ConsumerState<PdfViewerWidget> createState() => _PdfViewerWidgetState();
|
||||
}
|
||||
|
||||
class _PdfViewerWidgetState extends ConsumerState<PdfViewerWidget> {
|
||||
PdfViewerController? _controller;
|
||||
PdfDocumentRef? _documentRef;
|
||||
|
||||
// Public getter for testing the actual viewer page
|
||||
int? get viewerCurrentPage => _controller?.pageNumber;
|
||||
int? get viewerCurrentPage => widget.controller.pageNumber;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_controller = PdfViewerController();
|
||||
}
|
||||
|
||||
@override
|
||||
|
|
@ -99,86 +99,40 @@ class _PdfViewerWidgetState extends ConsumerState<PdfViewerWidget> {
|
|||
);
|
||||
}
|
||||
|
||||
return Stack(
|
||||
children: [
|
||||
PdfViewer(
|
||||
_documentRef!,
|
||||
key: const Key(
|
||||
'pdf_continuous_mock_list',
|
||||
), // Keep the same key for test compatibility
|
||||
controller: _controller,
|
||||
params: PdfViewerParams(
|
||||
onViewerReady: (document, controller) {
|
||||
// Update page count in repository
|
||||
ref
|
||||
.read(documentRepositoryProvider.notifier)
|
||||
.setPageCount(document.pages.length);
|
||||
},
|
||||
onPageChanged: (page) {
|
||||
if (page != null) {
|
||||
ref.read(currentPageProvider.notifier).state = page;
|
||||
}
|
||||
},
|
||||
),
|
||||
),
|
||||
// Drag target for dropping signatures
|
||||
Positioned.fill(
|
||||
child: DragTarget<SignatureDragData>(
|
||||
onAcceptWithDetails: (details) {
|
||||
final dragData = details.data;
|
||||
|
||||
// For real PDF viewer, we need to calculate which page was dropped on
|
||||
// This is a simplified implementation - in a real app you'd need to
|
||||
// determine the exact page and position within that page
|
||||
final currentPage = ref.read(currentPageProvider);
|
||||
|
||||
// Create a default rect for the signature (can be adjusted later)
|
||||
final rect = const Rect.fromLTWH(0.1, 0.1, 0.2, 0.1);
|
||||
|
||||
// Add placement to the document
|
||||
ref
|
||||
.read(documentRepositoryProvider.notifier)
|
||||
.addPlacement(
|
||||
page: currentPage,
|
||||
rect: rect,
|
||||
asset: dragData.card?.asset,
|
||||
rotationDeg: dragData.card?.rotationDeg ?? 0.0,
|
||||
graphicAdjust: dragData.card?.graphicAdjust,
|
||||
);
|
||||
},
|
||||
builder: (context, candidateData, rejectedData) {
|
||||
return Container(
|
||||
color:
|
||||
candidateData.isNotEmpty
|
||||
? Colors.blue.withOpacity(0.1)
|
||||
: Colors.transparent,
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
// Add signature overlays on top
|
||||
Positioned.fill(
|
||||
child: Consumer(
|
||||
builder: (context, ref, _) {
|
||||
final visible = ref.watch(signatureVisibilityProvider);
|
||||
if (!visible) return const SizedBox.shrink();
|
||||
|
||||
// For now, just add a simple overlay for the first page
|
||||
// This is a simplified version - in a real implementation you'd need
|
||||
// to handle overlays for each page properly
|
||||
return PdfPageOverlays(
|
||||
pageSize: widget.pageSize,
|
||||
pageNumber: ref.watch(currentPageProvider),
|
||||
onDragSignature: widget.onDragSignature,
|
||||
onResizeSignature: widget.onResizeSignature,
|
||||
onConfirmSignature: widget.onConfirmSignature,
|
||||
onClearActiveOverlay: widget.onClearActiveOverlay,
|
||||
onSelectPlaced: widget.onSelectPlaced,
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
return PdfViewer(
|
||||
_documentRef!,
|
||||
key: const Key(
|
||||
'pdf_continuous_mock_list',
|
||||
), // Keep the same key for test compatibility
|
||||
controller: widget.controller,
|
||||
params: PdfViewerParams(
|
||||
onViewerReady: (document, controller) {
|
||||
// Update page count in repository
|
||||
ref
|
||||
.read(documentRepositoryProvider.notifier)
|
||||
.setPageCount(document.pages.length);
|
||||
},
|
||||
onPageChanged: (page) {
|
||||
if (page != null) {
|
||||
ref.read(currentPageProvider.notifier).state = page;
|
||||
// Also update the view model to keep them in sync
|
||||
ref.read(pdfViewModelProvider.notifier).jumpToPage(page);
|
||||
}
|
||||
},
|
||||
viewerOverlayBuilder: (context, size, handle) {
|
||||
return [
|
||||
PdfPageOverlays(
|
||||
pageSize: widget.pageSize,
|
||||
pageNumber: ref.watch(currentPageProvider),
|
||||
onDragSignature: widget.onDragSignature,
|
||||
onResizeSignature: widget.onResizeSignature,
|
||||
onConfirmSignature: widget.onConfirmSignature,
|
||||
onClearActiveOverlay: widget.onClearActiveOverlay,
|
||||
onSelectPlaced: widget.onSelectPlaced,
|
||||
),
|
||||
];
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import 'package:pdf_signature/data/repositories/signature_asset_repository.dart'
|
|||
import 'package:pdf_signature/data/repositories/signature_card_repository.dart';
|
||||
import 'image_editor_dialog.dart';
|
||||
import '../../signature/widgets/signature_card.dart';
|
||||
import 'pdf_providers.dart';
|
||||
import '../view_model/pdf_providers.dart';
|
||||
|
||||
/// Data for drag-and-drop is in signature_drag_data.dart
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,86 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:pdfrx/pdfrx.dart';
|
||||
import 'package:pdf_signature/data/repositories/document_repository.dart';
|
||||
import '../view_model/pdf_providers.dart';
|
||||
|
||||
class ThumbnailsView extends ConsumerWidget {
|
||||
const ThumbnailsView({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final pdf = ref.watch(documentRepositoryProvider);
|
||||
final controller = ref.watch(pdfViewerControllerProvider);
|
||||
final theme = Theme.of(context);
|
||||
|
||||
if (!pdf.loaded || pdf.pickedPdfBytes == null)
|
||||
return const SizedBox.shrink();
|
||||
|
||||
final documentRef = PdfDocumentRefData(
|
||||
pdf.pickedPdfBytes!,
|
||||
sourceName: 'document.pdf',
|
||||
);
|
||||
|
||||
return Container(
|
||||
color: theme.colorScheme.surface,
|
||||
child: PdfDocumentViewBuilder(
|
||||
documentRef: documentRef,
|
||||
builder: (context, document) {
|
||||
final pageCount = document?.pages.length ?? 0;
|
||||
return ListView.separated(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 8),
|
||||
itemCount: pageCount,
|
||||
separatorBuilder: (_, _) => const SizedBox(height: 8),
|
||||
itemBuilder: (context, index) {
|
||||
final pageNumber = index + 1;
|
||||
final isSelected = ref.watch(currentPageProvider) == pageNumber;
|
||||
return InkWell(
|
||||
onTap: () {
|
||||
controller.goToPage(
|
||||
pageNumber: pageNumber,
|
||||
anchor: PdfPageAnchor.top,
|
||||
);
|
||||
},
|
||||
child: DecoratedBox(
|
||||
decoration: BoxDecoration(
|
||||
color:
|
||||
isSelected
|
||||
? theme.colorScheme.primaryContainer
|
||||
: theme.cardColor,
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
border: Border.all(
|
||||
color:
|
||||
isSelected
|
||||
? theme.colorScheme.primary
|
||||
: theme.dividerColor,
|
||||
),
|
||||
),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(6),
|
||||
child: Column(
|
||||
children: [
|
||||
SizedBox(
|
||||
height: 180,
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(4),
|
||||
child: PdfPageView(
|
||||
document: document,
|
||||
pageNumber: pageNumber,
|
||||
alignment: Alignment.center,
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 4),
|
||||
Text('$pageNumber', style: theme.textTheme.bodySmall),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -21,7 +21,7 @@ class WelcomeViewModel {
|
|||
}
|
||||
ref
|
||||
.read(documentRepositoryProvider.notifier)
|
||||
.openPicked(path: path, pageCount: pageCount, bytes: bytes);
|
||||
.openPicked(pageCount: pageCount, bytes: bytes);
|
||||
ref.read(signatureCardRepositoryProvider.notifier).clearAll();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import 'package:shared_preferences/shared_preferences.dart';
|
|||
import 'package:pdf_signature/app.dart';
|
||||
import 'package:pdf_signature/data/repositories/preferences_repository.dart';
|
||||
import 'package:pdf_signature/data/repositories/document_repository.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/ui_services.dart';
|
||||
import 'package:pdf_signature/data/services/export_service.dart';
|
||||
import 'package:pdf_signature/domain/models/model.dart';
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ Future<void> aDocumentIsOpenAndContainsAtLeastOneSignaturePlacement(
|
|||
TestWorld.container = container;
|
||||
container
|
||||
.read(documentRepositoryProvider.notifier)
|
||||
.openPicked(path: 'test.pdf', pageCount: 5);
|
||||
.openPicked(pageCount: 5);
|
||||
container
|
||||
.read(documentRepositoryProvider.notifier)
|
||||
.addPlacement(
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ aDocumentIsOpenAndContainsMultiplePlacedSignaturePlacementsAcrossPages(
|
|||
TestWorld.container = container;
|
||||
container
|
||||
.read(documentRepositoryProvider.notifier)
|
||||
.openPicked(path: 'multi.pdf', pageCount: 5);
|
||||
.openPicked(pageCount: 5);
|
||||
container
|
||||
.read(documentRepositoryProvider.notifier)
|
||||
.addPlacement(
|
||||
|
|
|
|||
|
|
@ -11,6 +11,6 @@ Future<void> aDocumentIsOpenWithNoSignaturePlacementsPlaced(
|
|||
TestWorld.container = container;
|
||||
container
|
||||
.read(documentRepositoryProvider.notifier)
|
||||
.openPicked(path: 'empty.pdf', pageCount: 5);
|
||||
.openPicked(pageCount: 5);
|
||||
// No placements added
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import 'package:pdf_signature/data/repositories/document_repository.dart';
|
|||
import 'package:pdf_signature/data/repositories/signature_card_repository.dart';
|
||||
import 'package:pdf_signature/data/repositories/signature_asset_repository.dart';
|
||||
import 'package:pdf_signature/domain/models/model.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
|
|
@ -18,9 +18,7 @@ Future<void> aMultipageDocumentIsOpen(WidgetTester tester) async {
|
|||
container.read(signatureCardRepositoryProvider.notifier).state = [
|
||||
SignatureCard.initial(),
|
||||
];
|
||||
container
|
||||
.read(documentRepositoryProvider.notifier)
|
||||
.openPicked(path: 'mock.pdf', pageCount: 5);
|
||||
container.read(documentRepositoryProvider.notifier).openPicked(pageCount: 5);
|
||||
// Reset page state providers
|
||||
try {
|
||||
container.read(currentPageProvider.notifier).state = 1;
|
||||
|
|
|
|||
|
|
@ -11,5 +11,5 @@ Future<void> aSampleMultipageDocument5PagesIsAvailable(
|
|||
TestWorld.container = container;
|
||||
container
|
||||
.read(documentRepositoryProvider.notifier)
|
||||
.openPicked(path: 'sample.pdf', pageCount: 5);
|
||||
.openPicked(pageCount: 5);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ Future<void> aSignatureAssetIsPlacedOnThePage(WidgetTester tester) async {
|
|||
if (!container.read(documentRepositoryProvider).loaded) {
|
||||
container
|
||||
.read(documentRepositoryProvider.notifier)
|
||||
.openPicked(path: 'mock.pdf', pageCount: 5);
|
||||
.openPicked(pageCount: 5);
|
||||
}
|
||||
|
||||
// Get or create an asset
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ import 'package:pdf_signature/data/repositories/document_repository.dart';
|
|||
import 'package:pdf_signature/data/repositories/signature_asset_repository.dart';
|
||||
import 'package:pdf_signature/data/repositories/signature_card_repository.dart';
|
||||
import 'package:pdf_signature/domain/models/model.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_providers.dart';
|
||||
import '_world.dart';
|
||||
|
||||
class _BridgedSignatureCardStateNotifier extends SignatureCardStateNotifier {
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import 'package:flutter_test/flutter_test.dart';
|
|||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:pdf_signature/data/repositories/document_repository.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_view_model.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_providers.dart';
|
||||
import '_world.dart';
|
||||
|
||||
/// Usage: the last page is displayed (page {5})
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ theUserDragsItOnThePageOfTheDocumentToPlaceSignaturePlacementsInMultipleLocation
|
|||
if (!container.read(documentRepositoryProvider).loaded) {
|
||||
container
|
||||
.read(documentRepositoryProvider.notifier)
|
||||
.openPicked(path: 'mock.pdf', pageCount: 5);
|
||||
.openPicked(pageCount: 5);
|
||||
}
|
||||
|
||||
container
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ theUserDragsThisSignatureCardOnThePageOfTheDocumentToPlaceASignaturePlacement(
|
|||
if (!container.read(documentRepositoryProvider).loaded) {
|
||||
container
|
||||
.read(documentRepositoryProvider.notifier)
|
||||
.openPicked(path: 'mock.pdf', pageCount: 5);
|
||||
.openPicked(pageCount: 5);
|
||||
}
|
||||
|
||||
// Get or create an asset
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import 'package:flutter_test/flutter_test.dart';
|
|||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:pdf_signature/data/repositories/document_repository.dart';
|
||||
import 'package:pdf_signature/domain/models/model.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ Future<void> theUserPlacesItInMultipleLocationsInTheDocument(
|
|||
TestWorld.container = container;
|
||||
final notifier = container.read(documentRepositoryProvider.notifier);
|
||||
// Always open a fresh doc to avoid state bleed between scenarios
|
||||
notifier.openPicked(path: 'mock.pdf', pageCount: 6);
|
||||
notifier.openPicked(pageCount: 6);
|
||||
// Place two on page 2 and one on page 4
|
||||
notifier.addPlacement(page: 2, rect: const Rect.fromLTWH(10, 10, 80, 40));
|
||||
notifier.addPlacement(page: 2, rect: const Rect.fromLTWH(120, 50, 80, 40));
|
||||
|
|
|
|||
|
|
@ -10,9 +10,7 @@ Future<void> theUserSelects(WidgetTester tester, dynamic file) async {
|
|||
final container = ProviderContainer();
|
||||
TestWorld.container = container;
|
||||
// Mark page for signing to enable signature ops
|
||||
container
|
||||
.read(documentRepositoryProvider.notifier)
|
||||
.openPicked(path: 'mock.pdf', pageCount: 1);
|
||||
container.read(documentRepositoryProvider.notifier).openPicked(pageCount: 1);
|
||||
// For invalid/unsupported/empty selections we do NOT set image bytes.
|
||||
// This simulates a failed load and keeps rect null.
|
||||
final token = file.toString();
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_view_model.dart';
|
||||
import '_world.dart';
|
||||
|
||||
|
|
|
|||
|
|
@ -22,9 +22,7 @@ Future<void> threeSignaturePlacementsArePlacedOnTheCurrentPage(
|
|||
container.read(signatureCardRepositoryProvider.notifier).state = [
|
||||
SignatureCard.initial(),
|
||||
];
|
||||
container
|
||||
.read(documentRepositoryProvider.notifier)
|
||||
.openPicked(path: 'mock.pdf', pageCount: 5);
|
||||
container.read(documentRepositoryProvider.notifier).openPicked(pageCount: 5);
|
||||
final pdfN = container.read(documentRepositoryProvider.notifier);
|
||||
final page = container.read(pdfViewModelProvider);
|
||||
pdfN.addPlacement(
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import 'package:shared_preferences/shared_preferences.dart';
|
|||
import 'package:pdf_signature/data/services/export_service.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/ui_services.dart';
|
||||
import 'package:pdf_signature/data/repositories/preferences_repository.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_providers.dart';
|
||||
|
||||
import 'package:pdf_signature/data/repositories/document_repository.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_screen.dart';
|
||||
|
|
@ -55,11 +55,8 @@ void main() {
|
|||
),
|
||||
documentRepositoryProvider.overrideWith(
|
||||
(ref) =>
|
||||
DocumentStateNotifier()..openPicked(
|
||||
path: 'test.pdf',
|
||||
pageCount: 5,
|
||||
bytes: Uint8List(0),
|
||||
),
|
||||
DocumentStateNotifier()
|
||||
..openPicked(pageCount: 5, bytes: Uint8List(0)),
|
||||
),
|
||||
useMockViewerProvider.overrideWith((ref) => true),
|
||||
exportServiceProvider.overrideWith((_) => fake),
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import 'package:flutter_test/flutter_test.dart';
|
|||
import 'package:image/image.dart' as img;
|
||||
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_screen.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/ui_services.dart';
|
||||
import 'package:pdf_signature/data/repositories/document_repository.dart';
|
||||
import 'package:pdf_signature/data/repositories/signature_asset_repository.dart';
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_screen.dart';
|
||||
import 'package:pdf_signature/data/repositories/document_repository.dart';
|
||||
import 'package:pdf_signature/domain/models/model.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_providers.dart';
|
||||
|
||||
import 'package:pdf_signature/l10n/app_localizations.dart';
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_page_area.dart';
|
||||
import 'package:pdf_signature/data/repositories/document_repository.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_view_model.dart';
|
||||
|
||||
import 'package:pdf_signature/l10n/app_localizations.dart';
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_page_area.dart';
|
||||
import 'package:pdf_signature/data/repositories/document_repository.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_view_model.dart';
|
||||
|
||||
import 'package:pdf_signature/l10n/app_localizations.dart';
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_page_area.dart';
|
||||
import 'package:pdf_signature/data/repositories/document_repository.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/widgets/pdf_providers.dart';
|
||||
import 'package:pdf_signature/ui/features/pdf/view_model/pdf_providers.dart';
|
||||
|
||||
import 'package:pdf_signature/l10n/app_localizations.dart';
|
||||
import 'package:pdf_signature/domain/models/model.dart';
|
||||
|
|
|
|||
Loading…
Reference in New Issue