flutter_profile/lib/src/widgets/profile/proifle_wrapper.dart

227 lines
6.6 KiB
Dart
Raw Normal View History

2022-09-20 14:11:38 +02:00
import 'package:flutter/material.dart';
2022-09-21 14:37:16 +02:00
import 'package:flutter_profile/src/models/user.dart';
import 'package:flutter_profile/src/services/profile_service.dart';
2022-10-21 10:42:32 +02:00
import 'package:flutter_profile/src/widgets/avatar/avatar_wrapper.dart';
2022-09-21 14:37:16 +02:00
import 'package:flutter_profile/src/widgets/item_builder/item_builder.dart';
import 'package:flutter_profile/src/widgets/item_builder/item_builder_options.dart';
import 'package:flutter_profile/src/widgets/item_builder/item_list.dart';
import 'package:flutter_profile/src/widgets/profile/profile_style.dart';
2022-09-20 14:11:38 +02:00
class ProfileWrapper extends StatefulWidget {
const ProfileWrapper({
Key? key,
required this.user,
required this.service,
required this.rebuild,
this.style = const ProfileStyle(),
this.customAvatar,
this.showAvatar = true,
this.itemBuilder,
this.itemBuilderOptions,
this.bottomActionText,
2022-10-14 15:54:50 +02:00
this.prioritizedItems = const [],
this.showDefaultItems = true,
this.wrapItemsBuilder,
2022-09-20 14:11:38 +02:00
}) : super(key: key);
final User user;
final ProfileService service;
final ProfileStyle style;
final Widget? customAvatar;
final bool showAvatar;
final String? bottomActionText;
2022-09-20 14:11:38 +02:00
final ItemBuilder? itemBuilder;
final Function rebuild;
final ItemBuilderOptions? itemBuilderOptions;
final bool showDefaultItems;
final Widget Function(BuildContext context, Widget child)? wrapItemsBuilder;
2022-09-20 14:11:38 +02:00
2022-10-14 15:54:50 +02:00
/// Map keys of items that should be shown first before the default items and the rest of the items.
final List<String> prioritizedItems;
2022-09-20 14:11:38 +02:00
@override
State<ProfileWrapper> createState() => _ProfileWrapperState();
}
class _ProfileWrapperState extends State<ProfileWrapper> {
List<Widget> defaultItems = [];
GlobalKey<FormState> firstNameKey = GlobalKey<FormState>();
GlobalKey<FormState> lastNameKey = GlobalKey<FormState>();
2022-09-20 14:11:38 +02:00
@override
void initState() {
super.initState();
if (widget.itemBuilder == null) {
ItemBuilder builder = ItemBuilder(
options: widget.itemBuilderOptions ?? ItemBuilderOptions(),
);
defaultItems.add(
builder.build(
'first_name',
firstNameKey,
widget.user.firstName,
null,
(v) {
widget.user.firstName = v;
2022-09-20 14:11:38 +02:00
widget.service.editProfile(widget.user, 'first_name', v);
},
),
);
2022-09-20 14:11:38 +02:00
defaultItems.add(
SizedBox(
height: widget.style.betweenDefaultItemPadding,
),
);
defaultItems.add(
builder.build(
'last_name',
lastNameKey,
widget.user.lastName,
null,
(v) {
widget.user.lastName = v;
2022-09-20 14:11:38 +02:00
widget.service.editProfile(widget.user, 'last_name', v);
},
),
);
2022-09-22 14:17:35 +02:00
defaultItems.add(
SizedBox(
height: widget.style.betweenDefaultItemPadding,
),
);
2022-09-20 14:11:38 +02:00
} else {
defaultItems.add(
widget.itemBuilder!.build(
'first_name',
firstNameKey,
widget.user.firstName,
null,
(v) {
widget.user.firstName = v;
2022-09-20 14:11:38 +02:00
widget.service.editProfile(widget.user, 'first_name', v);
},
),
);
2022-09-20 14:11:38 +02:00
defaultItems.add(
SizedBox(
height: widget.style.betweenDefaultItemPadding,
),
);
defaultItems.add(
widget.itemBuilder!.build(
'last_name',
lastNameKey,
widget.user.lastName,
null,
(v) {
widget.user.lastName = v;
2022-09-20 14:11:38 +02:00
widget.service.editProfile(widget.user, 'last_name', v);
},
),
);
defaultItems.add(
SizedBox(
height: widget.style.betweenDefaultItemPadding,
),
);
2022-09-20 14:11:38 +02:00
}
}
@override
Widget build(BuildContext context) {
var items = Column(
children: [
ItemList(
Map.fromEntries(widget.user.profileData!.toMap().entries.where(
(element) => widget.prioritizedItems.contains(element.key))),
widget.user.profileData!.mapWidget(
() {
widget.rebuild();
},
context,
),
widget.style.betweenDefaultItemPadding,
(key, value) {
widget.service.editProfile(widget.user, key, value);
},
itemBuilder: widget.itemBuilder,
itemBuilderOptions: widget.itemBuilderOptions,
),
if (widget.showDefaultItems) ...defaultItems,
// remove all the items that have priority from the widget.user.profileData!.toMap()
ItemList(
Map.fromEntries(widget.user.profileData!.toMap().entries.where(
(element) => !widget.prioritizedItems.contains(element.key))),
widget.user.profileData!.mapWidget(
() {
widget.rebuild();
},
context,
),
widget.style.betweenDefaultItemPadding,
(key, value) {
widget.service.editProfile(widget.user, key, value);
},
itemBuilder: widget.itemBuilder,
itemBuilderOptions: widget.itemBuilderOptions,
),
],
);
var child = widget.wrapItemsBuilder?.call(context, items) ?? items;
2022-09-20 14:11:38 +02:00
return Material(
color: Colors.transparent,
child: Padding(
padding: widget.style.pagePadding,
child: Column(
children: [
2022-10-14 15:54:50 +02:00
if (widget.showAvatar) ...[
2022-09-20 14:11:38 +02:00
InkWell(
onTap: () async {
await widget.service.uploadImage(context);
},
2022-10-21 10:42:32 +02:00
child: AvaterWrapper(
user: widget.user,
2022-09-20 14:11:38 +02:00
style: widget.style.avatarStyle,
avatar: widget.customAvatar,
),
),
SizedBox(
height: widget.style.betweenDefaultItemPadding,
),
2022-10-14 15:54:50 +02:00
],
// all the items that have priority above the default items
child,
2022-10-14 15:54:50 +02:00
if (widget.bottomActionText != null) ...[
2022-09-20 14:11:38 +02:00
SizedBox(
height: widget.style.betweenDefaultItemPadding,
),
2022-10-14 15:54:50 +02:00
const Spacer(),
2022-09-20 14:11:38 +02:00
InkWell(
onTap: () {
widget.service.pageBottomAction();
2022-09-20 14:11:38 +02:00
},
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
widget.bottomActionText!,
style: widget.style.bottomActionTextStyle,
),
),
2022-09-20 14:11:38 +02:00
),
2022-10-14 15:54:50 +02:00
] else ...[
const Spacer(),
],
2022-09-20 14:11:38 +02:00
],
),
),
);
}
}