mobdr/lib/ui/sync/testsync copy.dart

229 lines
6.8 KiB
Dart

import 'package:flutter/material.dart';
import 'package:mobdr/service/shared_prefs.dart';
import 'package:mobdr/config/global_style.dart';
class SyncPage extends StatefulWidget {
@override
_SyncPageState createState() => _SyncPageState();
}
class _SyncPageState extends State<SyncPage>
with SingleTickerProviderStateMixin {
AnimationController? _animationController;
late Animation<double> _rotationAnimation;
bool _isSyncing = false;
bool _syncCompleted = false;
@override
void initState() {
super.initState();
_animationController = AnimationController(
duration: const Duration(seconds: 2),
vsync: this,
);
_rotationAnimation = Tween<double>(
begin: 0,
end: 1,
).animate(_animationController!);
_animationController!.addStatusListener((status) {
if (status == AnimationStatus.completed) {
setState(() {
_syncCompleted = true;
});
}
});
// Lancement automatique de la synchronisation au démarrage
//startSync();
}
@override
void dispose() {
_animationController!.dispose();
super.dispose();
}
void startSync() {
setState(() {
_isSyncing = true;
_syncCompleted = false;
});
_animationController!.repeat();
// Simulation d'une tâche de synchronisation
Future.delayed(const Duration(seconds: 3), () {
setState(() {
_isSyncing = false;
_syncCompleted = true;
});
_animationController!.stop();
});
}
@override
Widget build(BuildContext context) {
final double screenWidth = MediaQuery.of(context).size.width;
final double screenHeight = MediaQuery.of(context).size.height;
// Calcul du positionnement du premier cercle
final double circleSize = 55;
final double circleLeft = (screenWidth - circleSize) / 2 - 23;
final double circleTop = (screenHeight - circleSize) / 2 + 30;
// Calcul du positionnement du deuxième cercle
final double secondCircleSize = 29;
final double secondCircleLeft = (screenWidth - circleSize) / 2 + 142;
final double secondCircleTop = (screenHeight - circleSize) / 2 + 75;
// Définition de la couleur du premier cercle en fonction de l'état de synchronisation
Color circleColor;
if (_isSyncing) {
circleColor = Colors.lightBlue;
} else if (_syncCompleted) {
circleColor = Colors.green;
} else {
circleColor = Colors.transparent;
}
return Scaffold(
appBar: AppBar(
title: Text('Page de synchronisation'),
),
body: Stack(
children: [
Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage('assets/images/synchro.png'),
fit: BoxFit.contain,
),
),
),
Container(
padding: EdgeInsets.fromLTRB(16, 16, 16, 0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('Calendar', style: GlobalStyle.horizontalTitle),
Row(
children: [
Icon(Icons.refresh),
Text(SharedPrefs().lastCalendarRefresh.isNotEmpty
? SharedPrefs().lastCalendarRefresh
: "Never"),
],
),
],
),
),
if (_isSyncing || _syncCompleted)
Positioned(
left: circleLeft,
top: circleTop,
child: Container(
width: circleSize,
height: circleSize,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: circleColor,
),
child: _syncCompleted
? Icon(
Icons.check,
color: Colors.white,
size: circleSize - 20,
)
: null,
),
),
if (_isSyncing || _syncCompleted)
Positioned(
left: secondCircleLeft,
top: secondCircleTop,
child: Container(
width: secondCircleSize,
height: secondCircleSize,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: circleColor,
),
child: _syncCompleted
? Icon(
Icons.check,
color: Colors.white,
size: secondCircleSize - 15,
)
: null,
),
),
if (_isSyncing)
Positioned(
left: circleLeft + (circleSize - 70) / 2,
top: circleTop + (circleSize - 70) / 2,
child: Align(
alignment: Alignment.center,
child: AnimatedBuilder(
animation: _animationController!,
builder: (BuildContext context, Widget? child) {
return Transform.rotate(
angle: _rotationAnimation.value * 2.0 * 3.14,
child: Icon(
Icons.refresh,
color: Colors.white,
size: 70,
),
);
},
),
),
),
if (_isSyncing)
Positioned(
left: secondCircleLeft + (secondCircleSize - 35) / 2,
top: secondCircleTop + (secondCircleSize - 34) / 2,
child: AnimatedBuilder(
animation: _animationController!,
builder: (BuildContext context, Widget? child) {
return Transform.rotate(
angle: _rotationAnimation.value * 2.0 * 3.14,
child: Icon(
Icons.refresh,
color: Colors.white,
size: 35,
),
);
},
),
),
Align(
alignment: Alignment.bottomCenter,
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
SizedBox(height: 20),
if (_isSyncing)
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: LinearProgressIndicator(),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: _isSyncing ? null : startSync,
child: Text('Lancer la synchronisation'),
),
SizedBox(height: 20),
],
),
),
],
),
);
}
}