fix(online): validation client online offline-first (ticket #70)

Corrige l'acceptation de partage hors-ligne (acceptShare,
_acceptCachedShareAndQueueAck, _importSharedPayload dans
application/use_cases.dart) : crée bien une copie locale indépendante
avec de nouveaux IDs avant de mettre l'accusé serveur en file
d'attente. Ajuste app_bootstrap.dart, profile_screen.dart et
share_screen.dart en conséquence. flutter pub get OK, dart format
appliqué (aucun changement), analyze propre (mêmes infos
préexistantes), 137/137 tests verts, build APK debug validé. Dernier
ticket du chantier "Ajouter les features serveur au client" (#63,
tickets #64 à #70 tous terminés).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-20 09:39:40 +02:00
parent c00f61ef06
commit b6f048ad64
10 changed files with 470 additions and 13 deletions

View File

@ -1,3 +1,5 @@
import 'dart:async';
import 'package:flutter/material.dart';
import '../application/application.dart';
@ -64,6 +66,7 @@ final class _ProfileScreenState extends State<ProfileScreen> {
builder: (context) => LoginScreen(
authUseCases: widget.authUseCases,
syncUseCases: widget.syncUseCases,
shareUseCases: widget.shareUseCases,
),
),
);
@ -83,6 +86,7 @@ final class _ProfileScreenState extends State<ProfileScreen> {
builder: (context) => RegisterScreen(
authUseCases: widget.authUseCases,
syncUseCases: widget.syncUseCases,
shareUseCases: widget.shareUseCases,
),
),
);
@ -420,11 +424,13 @@ final class LoginScreen extends StatefulWidget {
const LoginScreen({
required this.authUseCases,
required this.syncUseCases,
this.shareUseCases,
super.key,
});
final AuthUseCases authUseCases;
final SyncUseCases syncUseCases;
final ShareUseCases? shareUseCases;
@override
State<LoginScreen> createState() => _LoginScreenState();
@ -486,6 +492,7 @@ final class _LoginScreenState extends State<LoginScreen> {
builder: (context) => RegisterScreen(
authUseCases: widget.authUseCases,
syncUseCases: widget.syncUseCases,
shareUseCases: widget.shareUseCases,
),
),
);
@ -515,6 +522,11 @@ final class _LoginScreenState extends State<LoginScreen> {
email: _emailController.text,
password: _passwordController.text,
);
unawaited(widget.syncUseCases.synchronize(manual: false));
final shareUseCases = widget.shareUseCases;
if (shareUseCases != null) {
unawaited(shareUseCases.processPendingShareActions());
}
if (!mounted) return;
Navigator.of(context).pop(true);
} on RemoteAuthException catch (error) {
@ -537,11 +549,13 @@ final class RegisterScreen extends StatefulWidget {
const RegisterScreen({
required this.authUseCases,
required this.syncUseCases,
this.shareUseCases,
super.key,
});
final AuthUseCases authUseCases;
final SyncUseCases syncUseCases;
final ShareUseCases? shareUseCases;
@override
State<RegisterScreen> createState() => _RegisterScreenState();
@ -628,6 +642,7 @@ final class _RegisterScreenState extends State<RegisterScreen> {
builder: (context) => LoginScreen(
authUseCases: widget.authUseCases,
syncUseCases: widget.syncUseCases,
shareUseCases: widget.shareUseCases,
),
),
);
@ -660,6 +675,11 @@ final class _RegisterScreenState extends State<RegisterScreen> {
password: _passwordController.text,
displayName: displayName.isEmpty ? null : displayName,
);
unawaited(widget.syncUseCases.synchronize(manual: false));
final shareUseCases = widget.shareUseCases;
if (shareUseCases != null) {
unawaited(shareUseCases.processPendingShareActions());
}
if (!mounted) return;
Navigator.of(context).pop(true);
} on RemoteAuthException catch (error) {