feat: add a book by scanning

This commit is contained in:
Alzalia 2025-08-09 01:42:22 +02:00
parent 72fd0b66a9
commit 981dce5bfe
14 changed files with 264 additions and 59 deletions

View file

@ -3,19 +3,30 @@ import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:mobile_scanner/mobile_scanner.dart';
import 'package:seshat/data/repositories/book_instance_repository.dart';
import 'package:seshat/data/repositories/book_repository.dart';
import 'package:seshat/data/repositories/owner_repository.dart';
import 'package:seshat/domain/models/bal.dart';
import 'package:seshat/domain/models/book.dart';
import 'package:seshat/domain/models/book_instance.dart';
import 'package:seshat/domain/models/owner.dart';
import 'package:seshat/utils/command.dart';
import 'package:seshat/utils/result.dart';
class AddViewModel extends ChangeNotifier {
AddViewModel({required OwnerRepository ownerRepository})
: _ownerRepository = ownerRepository {
AddViewModel({
required OwnerRepository ownerRepository,
required BookRepository bookRepository,
required BookInstanceRepository bookInstanceRepository,
}) : _ownerRepository = ownerRepository,
_bookRepository = bookRepository,
_bookInstanceRepository = bookInstanceRepository {
load = Command0(_load)..execute();
}
final OwnerRepository _ownerRepository;
final BookRepository _bookRepository;
final BookInstanceRepository _bookInstanceRepository;
late final StreamSubscription sub;
/*
@ -87,15 +98,18 @@ class AddViewModel extends ChangeNotifier {
/// Sends an api request with a [bacorde], then gets the [Book] that was
/// either created or retrieved. Sens the [Book] back wrapped in a [Result].
Future<Result<Book>> scanBook(BarcodeCapture barcode) async {
return Result.ok(
Book(
author: "Patrick K. Dewdney",
ean: barcode.barcodes.first.rawValue!,
id: 56,
priceNew: "50 EUR",
title: "Les chiens et la charrue",
),
);
var ean = barcode.barcodes.first.rawValue!;
var result = await _bookRepository.getBookByEAN(ean);
return result;
}
Future<Result<BookInstance>> sendBook(
Book book,
Owner owner,
Bal bal,
double price,
) async {
return await _bookInstanceRepository.sendBook(book, owner, bal, price);
}
/// Sends an api request with

View file

@ -75,6 +75,8 @@ class _AddPageState extends State<AddPage> {
);
break;
case Error():
debugPrintStack();
debugPrint(result.error.toString());
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text("Erreur : ${result.error}"),

View file

@ -1,6 +1,10 @@
import 'dart:ffi';
import 'package:flutter/material.dart';
import 'package:seshat/domain/models/bal.dart';
import 'package:seshat/domain/models/book.dart';
import 'package:seshat/ui/add_page/view_model/add_view_model.dart';
import 'package:seshat/utils/result.dart';
class ConfirmationPopup extends StatefulWidget {
const ConfirmationPopup({
@ -22,7 +26,7 @@ class ConfirmationPopup extends StatefulWidget {
class _ConfirmationPopupState extends State<ConfirmationPopup> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
num price = 0;
double price = 0;
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
@ -67,7 +71,7 @@ class _ConfirmationPopupState extends State<ConfirmationPopup> {
text: "Prix à neuf : ",
style: TextStyle(fontWeight: FontWeight.bold),
),
TextSpan(text: widget.book.priceNew),
TextSpan(text: widget.book.priceNew.replaceAll("EUR", "")),
],
),
),
@ -89,7 +93,7 @@ class _ConfirmationPopupState extends State<ConfirmationPopup> {
return null;
},
onSaved: (newValue) {
price = num.parse(newValue!);
price = double.parse(newValue!);
},
)
: SizedBox(),
@ -111,32 +115,57 @@ class _ConfirmationPopupState extends State<ConfirmationPopup> {
child: Text("Annuler"),
),
TextButton(
onPressed: () {
switch (widget.viewModel.askPrice) {
case true:
if (_formKey.currentState!.validate()) {
_formKey.currentState!.save();
onPressed: () async {
var result = await widget.viewModel.sendBook(
widget.book,
widget.viewModel.currentOwner!,
Bal(id: 1),
price,
);
switch (result) {
case Ok():
switch (widget.viewModel.askPrice) {
case true:
if (_formKey.currentState!.validate()) {
_formKey.currentState!.save();
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
"\"${widget.book.title}\" ($price€) a bien été enregistré",
),
behavior: SnackBarBehavior.floating,
),
);
widget.exitPopup(context);
}
}
break;
case false:
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
"\"${widget.book.title}\" (PL) a bien été enregistré",
),
behavior: SnackBarBehavior.floating,
),
);
widget.exitPopup(context);
}
}
break;
case Error():
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
"\"${widget.book.title}\" ($price) a bien été enregistré",
"Une erreur est survenue : ${result.error}",
),
behavior: SnackBarBehavior.floating,
),
);
widget.exitPopup(context);
}
break;
case false:
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
"\"${widget.book.title}\" (PL) a bien été enregistré",
),
behavior: SnackBarBehavior.floating,
),
);
widget.exitPopup(context);
}
},
child: Text("Valider"),