You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
251 lines
5.8 KiB
251 lines
5.8 KiB
import 'dart:async';
|
|
import 'package:dafl_project_flutter/persistence/database_saver.dart';
|
|
import 'package:fluttertoast/fluttertoast.dart';
|
|
import 'package:path_provider/path_provider.dart';
|
|
import 'dart:math';
|
|
import './views/pages/home/p_home.dart';
|
|
import './views/pages/main/p_main.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/services.dart';
|
|
import 'package:provider/provider.dart';
|
|
import 'package:rive/rive.dart';
|
|
|
|
import 'package:dafl_project_flutter/controller/controller.dart';
|
|
|
|
|
|
|
|
void main() {
|
|
MyApp mainApp = MyApp();
|
|
|
|
runApp(mainApp);
|
|
}
|
|
|
|
|
|
class MyApp extends StatelessWidget {
|
|
|
|
// This widget is the root of your application.
|
|
@override
|
|
Widget build(BuildContext context){
|
|
SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
|
|
return ChangeNotifierProvider(
|
|
create: (context) => CardProvider(),
|
|
child: MaterialApp(
|
|
debugShowCheckedModeBanner: false,
|
|
title: 'Flutter Demo',
|
|
home: HomePage(),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
enum CardStatus { like, disLike, discovery}
|
|
|
|
class CardProvider extends ChangeNotifier{
|
|
List<String> _urlImages = [];
|
|
bool _isDragging = false;
|
|
double _angle = 0;
|
|
Offset _position = Offset.zero;
|
|
Size _screenSize = Size.zero;
|
|
|
|
List<String> get urlImages => _urlImages;
|
|
bool get isDragging => _isDragging;
|
|
Offset get position => _position;
|
|
double get angle => _angle;
|
|
|
|
CardProvider() {
|
|
resetUsers();
|
|
}
|
|
|
|
void resetUsers() {
|
|
_urlImages = <String>[
|
|
'https://khaligidilit.com/assets/images/cover-LAI%CC%88LA-Khali.jpeg',
|
|
'https://m.media-amazon.com/images/I/61aUOMzwS8L._SL1440_.jpg',
|
|
'https://pbs.twimg.com/media/ExJ-My-XMAE3Ko2.jpg',
|
|
'https://cdns-images.dzcdn.net/images/cover/2818a661c6d533155ce6dffc256b1f51/500x500.jpg',
|
|
'https://cdns-images.dzcdn.net/images/cover/b351f0e935c9c3901f8d893b92ab952a/500x500.jpg',
|
|
'https://cdns-images.dzcdn.net/images/cover/65147b581f2ace9e0f0723ee76e70fda/500x500.jpg',
|
|
'https://cdns-images.dzcdn.net/images/cover/173b96be8ac025fb9578b0139010bc80/500x500.jpg',
|
|
'https://cdns-images.dzcdn.net/images/cover/17a9747927ac3e5ea56f92f635d9180c/500x500.jpg',
|
|
].reversed.toList();
|
|
|
|
notifyListeners();
|
|
}
|
|
|
|
|
|
void setScreenSize(Size screenSize) => _screenSize = screenSize;
|
|
|
|
void startPosition(DragStartDetails details) {
|
|
_isDragging = true;
|
|
|
|
notifyListeners();
|
|
}
|
|
|
|
void updatePosition(DragUpdateDetails details) {
|
|
_position += details.delta;
|
|
|
|
final x = _position.dx;
|
|
_angle = 45 * x / _screenSize.width;
|
|
notifyListeners();
|
|
}
|
|
|
|
void endPosition() {
|
|
_isDragging = false;
|
|
notifyListeners();
|
|
|
|
final status = getStatus(force: true);
|
|
|
|
|
|
switch (status) {
|
|
case CardStatus.like:
|
|
like();
|
|
break;
|
|
case CardStatus.disLike:
|
|
dislike();
|
|
break;
|
|
case CardStatus.discovery:
|
|
discovery();
|
|
break;
|
|
default:
|
|
resetPosition();
|
|
}
|
|
}
|
|
void resetPosition() {
|
|
_isDragging = false;
|
|
_position = Offset.zero;
|
|
_angle = 0;
|
|
|
|
notifyListeners();
|
|
}
|
|
|
|
double getStatusOpacity() {
|
|
final delta = 100;
|
|
final pos = max(_position.dx.abs(), _position.dy.abs());
|
|
final opacity = pos / delta;
|
|
|
|
return min(opacity, 1);
|
|
}
|
|
|
|
CardStatus? getStatus({bool force = false}) {
|
|
final x = _position.dx;
|
|
final y = _position.dy;
|
|
final forceDiscovery = x.abs() < 20;
|
|
|
|
if(force) {
|
|
final delta = 100;
|
|
|
|
if (x >= delta) {
|
|
return CardStatus.like;
|
|
} else if ( x <= -delta){
|
|
return CardStatus.disLike;
|
|
} else if ( y <= -delta / 2 && forceDiscovery){
|
|
return CardStatus.discovery;
|
|
}
|
|
} else{
|
|
final delta = 20;
|
|
|
|
if(y <= -delta * 2 && forceDiscovery) {
|
|
return CardStatus.discovery;
|
|
} else if ( x >= delta) {
|
|
return CardStatus.like;
|
|
} else if ( x <= -delta) {
|
|
return CardStatus.disLike;
|
|
}
|
|
}
|
|
}
|
|
void dislike() {
|
|
print("dislike");
|
|
_angle = -20;
|
|
_position -= Offset(2 * _screenSize.width, 0);
|
|
_nextCard();
|
|
|
|
notifyListeners();
|
|
}
|
|
|
|
void discovery() {
|
|
print("discovery");
|
|
_angle = 0;
|
|
_position -= Offset(0, _screenSize.height);
|
|
_discovery_card();
|
|
Fluttertoast.showToast(
|
|
msg: 'Ajouté',
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
gravity: ToastGravity.TOP,
|
|
timeInSecForIosWeb: 2,
|
|
backgroundColor: Colors.deepPurple,
|
|
textColor: Colors.white
|
|
);
|
|
|
|
notifyListeners();
|
|
}
|
|
|
|
void like() {
|
|
print("like");
|
|
_angle = 20;
|
|
_position += Offset(2 * _screenSize.width, 0);
|
|
_nextCard();
|
|
|
|
notifyListeners();
|
|
}
|
|
|
|
Future _nextCard() async {
|
|
if ( _urlImages.isEmpty) return;
|
|
|
|
await Future.delayed(Duration(milliseconds: 200));
|
|
_urlImages.removeLast();
|
|
resetPosition();
|
|
}
|
|
|
|
Future _discovery_card() async {
|
|
await Future.delayed(Duration(milliseconds: 200));
|
|
resetPosition();
|
|
}
|
|
}
|
|
|
|
|
|
class Splash extends StatefulWidget {
|
|
const Splash({Key? key}) : super(key: key);
|
|
|
|
@override
|
|
State<Splash> createState() => _SplashState();
|
|
}
|
|
|
|
class _SplashState extends State<Splash> {
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
|
|
Timer(Duration(seconds: 2), () {
|
|
Navigator.pushReplacement(context,
|
|
MaterialPageRoute(builder:
|
|
(context) =>MainPage()
|
|
)
|
|
);
|
|
});
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
backgroundColor: Color(0xFF141414),
|
|
body: Center(
|
|
child: Column(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
Container(
|
|
height: 300,
|
|
width: 300,
|
|
child: RiveAnimation.asset('assets/images/new_file (2).riv'),
|
|
),
|
|
SizedBox(height: 50),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|