change pp
continuous-integration/drone/push Build is passing Details

AUTH_PERSISTENCE_LDE
Lucas Delanier 2 years ago
parent 552db38458
commit 7b8a9182dd

@ -24,7 +24,7 @@ class ProfilPictureComponent extends StatelessWidget {
// Image radius // Image radius
child: FadeInImage.assetNetwork( child: FadeInImage.assetNetwork(
image: user.pp, image: user.pp,
fit: BoxFit.cover, fit: BoxFit.fill,
fadeInDuration: const Duration(milliseconds: 100), fadeInDuration: const Duration(milliseconds: 100),
placeholder: "assets/images/loadingPlaceholder.gif", placeholder: "assets/images/loadingPlaceholder.gif",
), ),

@ -264,6 +264,7 @@ class _TopNavBarComponentState extends State<TopNavBarComponent> with TickerProv
child: ClipOval( child: ClipOval(
child: SizedBox( child: SizedBox(
width: 30, width: 30,
height: 30,
// Image radius // Image radius
child: FadeInImage.assetNetwork( child: FadeInImage.assetNetwork(
image: MyApp.userViewModel.userCurrent.pp, image: MyApp.userViewModel.userCurrent.pp,

@ -435,9 +435,13 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
ClipOval( ClipOval(
child: SizedBox.fromSize( child: SizedBox.fromSize(
// Rayon de l'image // Rayon de l'image
child: Image.network( child: FadeInImage.assetNetwork(
MyApp.userViewModel.userCurrent.pp, image: MyApp.userViewModel.userCurrent.pp,
width: 45, width: 45,
height: 45,
fit: BoxFit.cover,
fadeInDuration: const Duration(milliseconds: 100),
placeholder: "assets/images/loadingPlaceholder.gif",
), ),
), ),
), ),

@ -31,126 +31,135 @@ class _ProfileScreenState extends State<ProfileScreen> {
} }
return Scaffold( return Scaffold(
appBar: PreferredSize( appBar: PreferredSize(
preferredSize: Size(double.infinity, 58), preferredSize: Size(double.infinity, 58),
child: Container( child: Container(
height: double.infinity, height: double.infinity,
color: bgAppBar, color: bgAppBar,
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric(horizontal: defaultPadding), padding: const EdgeInsets.symmetric(horizontal: defaultPadding),
child: Stack( child: Stack(
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
children: [ children: [
GestureDetector( GestureDetector(
behavior: HitTestBehavior.translucent, behavior: HitTestBehavior.translucent,
onTap: () { onTap: () {
Navigator.pop(context, true); Navigator.pop(context, true);
}, },
child: Container( child: Container(
padding: EdgeInsets.symmetric(horizontal: 10), padding: EdgeInsets.symmetric(horizontal: 10),
height: 30, height: 30,
width: 30, width: 30,
child: Image( child: Image(
image: AssetImage("assets/images/return_icon.png"), image: AssetImage("assets/images/return_icon.png"),
height: 8, height: 8,
), ),
)), )),
Align( Align(
child: Text( child: Text(
"Profile", "Profile",
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontSize: 14, fontWeight: FontWeight.bold), style:
), GoogleFonts.plusJakartaSans(color: Colors.white, fontSize: 14, fontWeight: FontWeight.bold),
) ),
], )
],
),
), ),
), ),
), ),
), body: Container(
body: Container( width: double.infinity,
width: double.infinity, height: double.infinity,
height: double.infinity, color: bgColor,
color: bgColor, child: RefreshIndicator(
child: SingleChildScrollView( displacement: 20,
physics: const BouncingScrollPhysics(decelerationRate: ScrollDecelerationRate.fast), triggerMode: RefreshIndicatorTriggerMode.onEdge,
child: Padding( onRefresh: _refresh,
padding: const EdgeInsets.symmetric(horizontal: settingPadding), child: SingleChildScrollView(
child: Column( physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()),
mainAxisAlignment: MainAxisAlignment.start, child: Padding(
crossAxisAlignment: CrossAxisAlignment.start, padding: const EdgeInsets.symmetric(horizontal: settingPadding),
children: [ child: Column(
Padding( mainAxisAlignment: MainAxisAlignment.start,
padding: EdgeInsets.only(top: 68.h, bottom: 40), crossAxisAlignment: CrossAxisAlignment.start,
child: ProfileComponent(user: MyApp.userViewModel.userCurrent), children: [
), Padding(
Padding( padding: EdgeInsets.only(top: 68.h, bottom: 40),
padding: const EdgeInsets.only(bottom: 12, left: defaultPadding), child: ProfileComponent(user: MyApp.userViewModel.userCurrent),
child: Text( ),
"Compte", Padding(
style: GoogleFonts.plusJakartaSans(color: grayText, fontWeight: FontWeight.w800, fontSize: 16), padding: const EdgeInsets.only(bottom: 12, left: defaultPadding),
), child: Text(
), "Compte",
ClipRRect( style: GoogleFonts.plusJakartaSans(color: grayText, fontWeight: FontWeight.w800, fontSize: 16),
borderRadius: BorderRadius.circular(8),
child: Column(
children: [
SettingPartComponent(
icon: JustMusicIcon.profile,
label: 'Compte',
action: _openDetail,
),
const SettingPartComponent(
icon: JustMusicIcon.history,
label: 'Historiques des capsules',
action: null,
), ),
const SettingPartComponent( ),
icon: JustMusicIcon.spotify, ClipRRect(
label: 'Lier un compte Spotify', borderRadius: BorderRadius.circular(8),
action: null, child: Column(
children: [
SettingPartComponent(
icon: JustMusicIcon.profile,
label: 'Compte',
action: _openDetail,
),
const SettingPartComponent(
icon: JustMusicIcon.history,
label: 'Historiques des capsules',
action: null,
),
const SettingPartComponent(
icon: JustMusicIcon.spotify,
label: 'Lier un compte Spotify',
action: null,
),
const SettingPartComponent(
icon: JustMusicIcon.trash,
label: 'Supprimer mon compte',
action: null,
),
SettingPartComponent(
icon: JustMusicIcon.cross,
label: 'Déconnexion',
important: true,
action: logout,
),
],
), ),
const SettingPartComponent( ),
icon: JustMusicIcon.trash, Padding(
label: 'Supprimer mon compte', padding: const EdgeInsets.only(bottom: 12, left: defaultPadding, top: 40),
action: null, child: Text(
"Préférences",
style: GoogleFonts.plusJakartaSans(color: grayText, fontWeight: FontWeight.w800, fontSize: 16),
), ),
SettingPartComponent( ),
icon: JustMusicIcon.cross, ClipRRect(
label: 'Déconnexion', borderRadius: BorderRadius.circular(8),
important: true, child: const Column(
action: logout, children: [
SettingPartComponent(
icon: JustMusicIcon.theme,
label: 'Thême de l\'application',
action: null,
),
SettingPartComponent(
icon: JustMusicIcon.notification,
label: 'Notifications',
action: null,
),
],
), ),
], )
), ],
), ),
Padding( ),
padding: const EdgeInsets.only(bottom: 12, left: defaultPadding, top: 40),
child: Text(
"Préférences",
style: GoogleFonts.plusJakartaSans(color: grayText, fontWeight: FontWeight.w800, fontSize: 16),
),
),
ClipRRect(
borderRadius: BorderRadius.circular(8),
child: const Column(
children: [
SettingPartComponent(
icon: JustMusicIcon.theme,
label: 'Thême de l\'application',
action: null,
),
SettingPartComponent(
icon: JustMusicIcon.notification,
label: 'Notifications',
action: null,
),
],
),
)
],
), ),
), ),
), ));
), }
);
Future<void> _refresh() async {
setState(() {});
} }
} }

@ -1,6 +1,11 @@
import 'dart:io';
import 'package:flutter/Material.dart'; import 'package:flutter/Material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:image_picker/image_picker.dart';
import '../components/profile_component.dart'; import '../components/profile_component.dart';
import '../components/recap_component.dart'; import '../components/recap_component.dart';
@ -18,6 +23,78 @@ class UserScreen extends StatefulWidget {
class _UserScreenState extends State<UserScreen> { class _UserScreenState extends State<UserScreen> {
late bool isClicked; late bool isClicked;
File? image;
Future pickImage(ImageSource source) async {
try {
final image = await ImagePicker().pickImage(source: source, imageQuality: 20);
if (image == null) return;
final imageTemp = File(image.path);
await MyApp.userViewModel.updateImage(imageTemp);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
"Votre photo de profile a bien été mise à jour",
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w400, fontSize: 15.h),
),
backgroundColor: primaryColor,
closeIconColor: Colors.white,
),
);
} on PlatformException catch (e) {
print('Failed to pick image: $e');
}
}
void manageImage() {
if (image != null) {
setState(() {
image = null;
});
} else {
_showActionSheet(context);
}
}
void _showActionSheet(BuildContext context) {
showCupertinoModalPopup<void>(
context: context,
barrierColor: Colors.black.withOpacity(0.5),
builder: (BuildContext context) => Container(
color: Colors.black,
child: CupertinoActionSheet(
title: Text(
'Ajouter une photo',
style: GoogleFonts.plusJakartaSans(fontWeight: FontWeight.bold),
),
actions: <CupertinoActionSheetAction>[
CupertinoActionSheetAction(
onPressed: () {
pickImage(ImageSource.gallery);
Navigator.pop(context);
},
child: const Text('Galerie'),
),
CupertinoActionSheetAction(
onPressed: () {
pickImage(ImageSource.camera);
Navigator.pop(context);
},
child: const Text('Prendre un selfie'),
),
],
cancelButton: CupertinoActionSheetAction(
isDestructiveAction: true,
onPressed: () {
Navigator.pop(context);
},
child: const Text('Annuler'),
),
),
),
);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
isClicked = MyApp.userViewModel.isFriend(widget.user.id); isClicked = MyApp.userViewModel.isFriend(widget.user.id);
@ -71,7 +148,34 @@ class _UserScreenState extends State<UserScreen> {
children: [ children: [
Padding( Padding(
padding: EdgeInsets.only(top: 68.h, bottom: 40), padding: EdgeInsets.only(top: 68.h, bottom: 40),
child: ProfileComponent(user: widget.user), child: Stack(
alignment: Alignment.center,
children: [
ProfileComponent(user: widget.user),
MyApp.userViewModel.userCurrent.id == widget.user.id
? Padding(
padding: const EdgeInsets.only(left: 70, bottom: 10),
child: GestureDetector(
onTap: () {
_showActionSheet(context);
},
child: ClipOval(
child: Container(
width: 30,
height: 30,
color: grayColor,
child: Icon(
Icons.edit,
color: Colors.white,
size: 16,
),
),
),
),
)
: Container(),
],
),
), ),
MyApp.userViewModel.userCurrent.id != widget.user.id MyApp.userViewModel.userCurrent.id != widget.user.id
? Align( ? Align(

@ -1,4 +1,4 @@
import 'dart:io'; import 'dart:io';
import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_storage/firebase_storage.dart'; import 'package:firebase_storage/firebase_storage.dart';
@ -6,14 +6,11 @@ import 'package:firebase_storage/firebase_storage.dart';
import '../main.dart'; import '../main.dart';
class UserService { class UserService {
Future<List<QueryDocumentSnapshot<Map<String, dynamic>>>> getUsersByIdUnique( Future<List<QueryDocumentSnapshot<Map<String, dynamic>>>> getUsersByIdUnique(String uniqueId) async {
String uniqueId) async { QuerySnapshot<Map<String, dynamic>> response = await FirebaseFirestore.instance
QuerySnapshot<Map<String, dynamic>> response = await FirebaseFirestore
.instance
.collection("users") .collection("users")
.where("unique_id", isGreaterThanOrEqualTo: uniqueId) .where("unique_id", isGreaterThanOrEqualTo: uniqueId)
.where("unique_id", .where("unique_id", isLessThanOrEqualTo: uniqueId + "zzzzzzzzzzzzzzzzzzzzzzzzzzzz")
isLessThanOrEqualTo: uniqueId + "zzzzzzzzzzzzzzzzzzzzzzzzzzzz")
.limit(20) .limit(20)
.get(); .get();
var users = response.docs.where((doc) { var users = response.docs.where((doc) {
@ -25,10 +22,7 @@ class UserService {
} }
updateTokenNotify(String idUser, String token) { updateTokenNotify(String idUser, String token) {
FirebaseFirestore.instance FirebaseFirestore.instance.collection('users').doc(idUser).update({'token_notify': token}).then((_) {
.collection('users')
.doc(idUser)
.update({'token_notify': token}).then((_) {
print("Mise à jour réussie !"); print("Mise à jour réussie !");
}).catchError((error) { }).catchError((error) {
print("Erreur lors de la mise à jour : $error"); print("Erreur lors de la mise à jour : $error");
@ -36,8 +30,7 @@ class UserService {
} }
addOrDeleteFriend(String id) async { addOrDeleteFriend(String id) async {
var userRef = var userRef = MyApp.db.collection("users").doc(MyApp.userViewModel.userCurrent.id);
MyApp.db.collection("users").doc(MyApp.userViewModel.userCurrent.id);
var actionUserRef = MyApp.db.collection("users").doc(id); var actionUserRef = MyApp.db.collection("users").doc(id);
if (MyApp.userViewModel.isFriend(id)) { if (MyApp.userViewModel.isFriend(id)) {
@ -65,7 +58,7 @@ class UserService {
updateImage(File image) async { updateImage(File image) async {
var id = MyApp.userViewModel.userCurrent.id; var id = MyApp.userViewModel.userCurrent.id;
var userRef = await MyApp.db.collection("posts").doc(MyApp.userViewModel.userCurrent.id); var userRef = await MyApp.db.collection("users").doc(MyApp.userViewModel.userCurrent.id);
var imageRef = FirebaseStorage.instance.ref('$id.jpg'); var imageRef = FirebaseStorage.instance.ref('$id.jpg');
await imageRef.putFile(image); await imageRef.putFile(image);
var imageUrl = await imageRef.getDownloadURL(); var imageUrl = await imageRef.getDownloadURL();
@ -82,5 +75,4 @@ class UserService {
print("Erreur lors de la mise à jour : $error"); print("Erreur lors de la mise à jour : $error");
}); });
} }
} }

@ -59,10 +59,7 @@ class UserViewModel {
updateUserCurrent() async { updateUserCurrent() async {
try { try {
final user = await MyApp.db final user = await MyApp.db.collection("users").doc(firebase_auth.FirebaseAuth.instance.currentUser?.uid).get();
.collection("users")
.doc(firebase_auth.FirebaseAuth.instance.currentUser?.uid)
.get();
User data = UserMapper.toModel(user); User data = UserMapper.toModel(user);
_userCurrent = data; _userCurrent = data;
} catch (e) { } catch (e) {
@ -85,8 +82,7 @@ class UserViewModel {
Future<List<User>> getUsersByUniqueId(String uniqueId) async { Future<List<User>> getUsersByUniqueId(String uniqueId) async {
try { try {
var response = var response = await _userService.getUsersByIdUnique(uniqueId.toLowerCase());
await _userService.getUsersByIdUnique(uniqueId.toLowerCase());
var users = response.map((value) { var users = response.map((value) {
return UserMapper.toModel(value); return UserMapper.toModel(value);
}).toList(); }).toList();
@ -120,7 +116,8 @@ class UserViewModel {
updateImage(File pp) async { updateImage(File pp) async {
try { try {
await _userService.updateImage(pp); await _userService.updateImage(pp);
} catch(e) { await updateUserCurrent();
} catch (e) {
print(e.toString()); print(e.toString());
rethrow; rethrow;
} }
@ -129,7 +126,7 @@ class UserViewModel {
updatePseudo(String pseudo) async { updatePseudo(String pseudo) async {
try { try {
await _userService.updatePseudo(pseudo); await _userService.updatePseudo(pseudo);
} catch(e) { } catch (e) {
print(e.toString()); print(e.toString());
rethrow; rethrow;
} }

Loading…
Cancel
Save