D1APP-42 edit profile (dynamic)

This commit is contained in:
MohammadTaha Basiri 2022-01-11 18:46:48 +03:30
parent 76ee41c3f8
commit b3605b008c
2 changed files with 198 additions and 44 deletions

View File

@ -1,59 +1,169 @@
import 'dart:async';
import 'package:didvan/models/view/app_bar_data.dart'; import 'package:didvan/models/view/app_bar_data.dart';
import 'package:didvan/pages/home/profile/edit_profile/widgets/profile_photo.dart'; import 'package:didvan/pages/home/profile/edit_profile/widgets/profile_photo.dart';
import 'package:didvan/pages/home/profile/edit_profile/widgets/switch.dart';
import 'package:didvan/pages/home/profile/widgets/menu_item.dart'; import 'package:didvan/pages/home/profile/widgets/menu_item.dart';
import 'package:didvan/providers/user_provider.dart';
import 'package:didvan/routes/routes.dart';
import 'package:didvan/widgets/didvan/button.dart';
import 'package:didvan/widgets/didvan/card.dart'; import 'package:didvan/widgets/didvan/card.dart';
import 'package:didvan/widgets/didvan/divider.dart'; import 'package:didvan/widgets/didvan/divider.dart';
import 'package:didvan/widgets/didvan/scaffold.dart'; import 'package:didvan/widgets/didvan/scaffold.dart';
import 'package:didvan/widgets/didvan/text_field.dart'; import 'package:didvan/widgets/didvan/text_field.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class EditProfile extends StatelessWidget { class EditProfile extends StatefulWidget {
const EditProfile({Key? key}) : super(key: key); const EditProfile({Key? key}) : super(key: key);
@override
State<EditProfile> createState() => _EditProfileState();
}
class _EditProfileState extends State<EditProfile> {
Timer? _timer;
late String fullName;
String? username;
String? email;
final _formKey = GlobalKey<FormState>();
@override
void initState() {
final user = context.read<UserProvider>().user;
fullName = user.fullName;
username = user.username;
email = user.email;
super.initState();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return DidvanScaffold( return Consumer<UserProvider>(
appBarData: AppBarData(title: 'ویرایش پروفایل'), builder: (context, state, child) => Material(
children: [ child: Stack(
const SizedBox(height: 16), children: [
const ProfilePhoto(), Form(
const SizedBox(height: 16), key: _formKey,
DidvanCard( child: DidvanScaffold(
child: Column( padding: const EdgeInsets.only(left: 16, right: 16, bottom: 92),
children: [ appBarData: AppBarData(title: 'ویرایش پروفایل'),
DidvanTextField( children: [
title: 'نام کاربری', const ProfilePhoto(),
hintText: 'انتخاب نام کاربری (اختیاری)', const SizedBox(height: 16),
onChanged: (value) {}, DidvanCard(
child: Column(
children: [
DidvanTextField(
title: 'نام و نام‌ خانوادگی',
hintText: 'نام و نام خانوادگی',
initialValue: state.user.fullName,
onChanged: (value) {
_setButtonState();
fullName = value;
},
),
const SizedBox(height: 16),
DidvanTextField(
title: 'موبایل',
enabled: false,
hintText: state.user.phoneNumber,
),
const SizedBox(height: 16),
DidvanTextField(
title: 'نام کاربری',
hintText: 'انتخاب نام کاربری (اختیاری)',
onChanged: _onUsernameChanged,
initialValue: state.user.username,
validator: (value) async {
final result = await state.checkUsername(value);
if (result == false) {
return 'نام کاربری در دسترس نمی‌باشد';
}
},
),
const SizedBox(height: 16),
DidvanTextField(
title: 'ایمیل',
hintText: 'مثال: example@email.com',
onChanged: (value) {
_setButtonState();
email = value;
},
initialValue: state.user.email,
validator: (value) async {
bool emailValid = RegExp(
r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+")
.hasMatch(value);
if (!emailValid) {
return 'ایمیل وارد شده معتبر نمی‌باشد';
}
},
),
// const SizedBox(height: 16),
// DidvanSwitch(
// value: true,
// title: 'ورود با اثر انگشت',
// onChanged: (value) => {},
// ),
const DidvanDivider(),
MenuItem(
title: 'تغییر رمز عبور',
onTap: () => Navigator.of(context).pushNamed(
Routes.authenticaion,
arguments: true,
),
),
],
),
),
],
), ),
const SizedBox(height: 16), ),
DidvanTextField( Positioned(
title: 'ایمیل', left: 20,
hintText: 'مثال: example@email.com', right: 20,
onChanged: (value) {}, bottom: 20,
child: DidvanButton(
key: UniqueKey(),
title: 'ذخیره تغییرات',
onPressed: () {
if (_formKey.currentState!.validate()) {
state.editProfile(fullName, username, email);
}
},
enabled: _buttonEnabled,
), ),
const SizedBox(height: 16), ),
const DidvanTextField( ],
title: 'موبایل',
enabled: false,
hintText: '09123456789',
),
const SizedBox(height: 16),
DidvanSwitch(
value: true,
title: 'ورود با اثر انگشت',
onChanged: (value) => {},
),
const DidvanDivider(),
MenuItem(
title: 'تغییر رمز عبور',
onTap: () {},
),
],
),
), ),
], ),
); );
} }
void _setButtonState() {
if (!_buttonEnabled) {
setState(() {});
}
}
bool get _buttonEnabled {
final user = context.read<UserProvider>().user;
return !(user.email == email &&
user.fullName == fullName &&
user.username == username);
}
void _onUsernameChanged(String value) {
_setButtonState();
username = value;
_timer?.cancel();
if (value.length < 5) {
return;
}
_timer = Timer(const Duration(seconds: 1), () {
_formKey.currentState!.validate();
});
}
} }

View File

@ -2,9 +2,11 @@ import 'dart:io';
import 'package:didvan/models/enums.dart'; import 'package:didvan/models/enums.dart';
import 'package:didvan/models/user.dart'; import 'package:didvan/models/user.dart';
import 'package:didvan/models/view/alert_data.dart';
import 'package:didvan/providers/core_provider.dart'; import 'package:didvan/providers/core_provider.dart';
import 'package:didvan/services/network/request.dart'; import 'package:didvan/services/network/request.dart';
import 'package:didvan/services/network/request_helper.dart'; import 'package:didvan/services/network/request_helper.dart';
import 'package:didvan/utils/action_sheet.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
class UserProvider extends CoreProvier { class UserProvider extends CoreProvier {
@ -34,6 +36,8 @@ class UserProvider extends CoreProvier {
RequestService(RequestHelper.updateUserProfile); RequestService(RequestHelper.updateUserProfile);
await service.multipart(file); await service.multipart(file);
if (service.isSuccess) { if (service.isSuccess) {
user =
user.copyWith(photo: RequestHelper.baseUrl + service.result['photo']);
appState = AppState.idle; appState = AppState.idle;
return true; return true;
} }
@ -41,15 +45,55 @@ class UserProvider extends CoreProvier {
return false; return false;
} }
Future<void> setUsername(String username) async { Future<bool?> checkUsername(String username) async {
appState = AppState.isolatedBusy; if (user.username == username) return true;
final RequestService service = RequestService( final RequestService service = RequestService(
RequestHelper.updateUsername, RequestHelper.checkUsername,
body: {'username': username}, body: {'username': username},
); );
await service.post();
if (service.isSuccess) {
return service.result['available'];
}
return null;
}
Future<void> editProfile(
String fullName,
String? username,
String? email,
) async {
appState = AppState.isolatedBusy;
final service = RequestService(
RequestHelper.updateProfile,
body: {
'fullName': fullName,
'email': email,
'username': username,
},
);
await service.put(); await service.put();
if (service.isSuccess) { if (service.isSuccess) {
// appState = app user = user.copyWith(
fullName: fullName,
email: email,
username: username,
);
appState = AppState.idle;
ActionSheetUtils.pop();
ActionSheetUtils.showAlert(
AlertData(
message: 'پروفایل با موفقیت ویرایش شد',
aLertType: ALertType.success,
),
);
return;
} }
appState = AppState.idle;
ActionSheetUtils.showAlert(
AlertData(
message: service.errorMessage,
),
);
} }
} }