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:
@ -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) {
|
||||
|
||||
@ -118,6 +118,7 @@ final class _ShareFormScreenState extends State<ShareFormScreen> {
|
||||
MaterialPageRoute(
|
||||
builder: (context) => ShareAccountRequiredScreen(
|
||||
resourceType: widget.resourceType,
|
||||
shareUseCases: widget.shareUseCases,
|
||||
authUseCases: widget.authUseCases,
|
||||
syncUseCases: widget.syncUseCases,
|
||||
),
|
||||
@ -137,12 +138,14 @@ final class _ShareFormScreenState extends State<ShareFormScreen> {
|
||||
final class ShareAccountRequiredScreen extends StatelessWidget {
|
||||
const ShareAccountRequiredScreen({
|
||||
required this.resourceType,
|
||||
this.shareUseCases,
|
||||
this.authUseCases,
|
||||
this.syncUseCases,
|
||||
super.key,
|
||||
});
|
||||
|
||||
final ShareResourceType resourceType;
|
||||
final ShareUseCases? shareUseCases;
|
||||
final AuthUseCases? authUseCases;
|
||||
final SyncUseCases? syncUseCases;
|
||||
|
||||
@ -179,6 +182,7 @@ final class ShareAccountRequiredScreen extends StatelessWidget {
|
||||
builder: (context) => LoginScreen(
|
||||
authUseCases: authUseCases!,
|
||||
syncUseCases: syncUseCases!,
|
||||
shareUseCases: shareUseCases,
|
||||
),
|
||||
),
|
||||
)
|
||||
@ -193,6 +197,7 @@ final class ShareAccountRequiredScreen extends StatelessWidget {
|
||||
builder: (context) => RegisterScreen(
|
||||
authUseCases: authUseCases!,
|
||||
syncUseCases: syncUseCases!,
|
||||
shareUseCases: shareUseCases,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user