Skip to content

Commit

Permalink
edit profile scrollable
Browse files Browse the repository at this point in the history
  • Loading branch information
leo-lox committed Oct 26, 2024
1 parent 70eeffa commit ec89a14
Show file tree
Hide file tree
Showing 2 changed files with 186 additions and 245 deletions.
309 changes: 116 additions & 193 deletions lib/presentation_layer/components/edit_profile.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,25 +10,18 @@ import '../atoms/camer_upload.dart';
class EditProfile extends ConsumerStatefulWidget {
final String initialName;
final Function(String) onNameChanged;

final Uint8List? initialPicture;
final Function() pictureCallback;

final Uint8List? initialBanner;
final Function() bannerCallback;

final String initalAbout;
final String initialAbout;
final Function(String) onAboutChanged;

final String initialNip05;
final Function(String) onNip05Changed;

final String initialWebsite;
final Function(String) onWebsiteChanged;

final String initalLud06;
final String initialLud06;
final Function(String) onLud06Changed;

final String initialLud16;
final Function(String) onLud16Changed;

Expand All @@ -37,10 +30,10 @@ class EditProfile extends ConsumerStatefulWidget {
required this.initialName,
required this.initialPicture,
required this.initialBanner,
required this.initalAbout,
required this.initialAbout,
required this.initialNip05,
required this.initialWebsite,
required this.initalLud06,
required this.initialLud06,
required this.initialLud16,
required this.onNameChanged,
required this.pictureCallback,
Expand All @@ -57,209 +50,138 @@ class EditProfile extends ConsumerStatefulWidget {
}

class _EditProfileState extends ConsumerState<EditProfile> {
late TextEditingController _nameController;
late TextEditingController _aboutController;
late TextEditingController _nip05Controller;
late TextEditingController _websiteController;
late TextEditingController _lud06Controller;
late TextEditingController _lud16Controller;
late final Map<String, TextEditingController> _controllers;

@override
void initState() {
super.initState();
_nameController = TextEditingController(text: widget.initialName);
_aboutController = TextEditingController(text: widget.initalAbout);
_nip05Controller = TextEditingController(text: widget.initialNip05);
_websiteController = TextEditingController(text: widget.initialWebsite);
_lud06Controller = TextEditingController(text: widget.initalLud06);
_lud16Controller = TextEditingController(text: widget.initialLud16);

// Add listeners to controllers
_nameController
.addListener(() => widget.onNameChanged(_nameController.text));
_aboutController
.addListener(() => widget.onAboutChanged(_aboutController.text));
_nip05Controller
.addListener(() => widget.onNip05Changed(_nip05Controller.text));
_websiteController
.addListener(() => widget.onWebsiteChanged(_websiteController.text));
_lud06Controller
.addListener(() => widget.onLud06Changed(_lud06Controller.text));
_lud16Controller
.addListener(() => widget.onLud16Changed(_lud16Controller.text));
_controllers = {
'name': TextEditingController(text: widget.initialName),
'about': TextEditingController(text: widget.initialAbout),
'nip05': TextEditingController(text: widget.initialNip05),
'website': TextEditingController(text: widget.initialWebsite),
'lud06': TextEditingController(text: widget.initialLud06),
'lud16': TextEditingController(text: widget.initialLud16),
};

_controllers.forEach((key, controller) {
controller.addListener(() {
switch (key) {
case 'name':
widget.onNameChanged(controller.text);
break;
case 'about':
widget.onAboutChanged(controller.text);
break;
case 'nip05':
widget.onNip05Changed(controller.text);
break;
case 'website':
widget.onWebsiteChanged(controller.text);
break;
case 'lud06':
widget.onLud06Changed(controller.text);
break;
case 'lud16':
widget.onLud16Changed(controller.text);
break;
}
});
});
}

@override
void dispose() {
_nameController.dispose();
_aboutController.dispose();
_nip05Controller.dispose();
_websiteController.dispose();
_lud06Controller.dispose();
_lud16Controller.dispose();

for (var controller in _controllers.values) {
controller.dispose();
}
super.dispose();
}

@override
Widget build(BuildContext context) {
return Column(
children: [
SizedBox(
height: (MediaQuery.of(context).size.height / 6) + 60,
child: Stack(
children: <Widget>[
InkWell(
onTap: () {
log("Header Pressed");
},
child: Container(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height / 6,
decoration: const BoxDecoration(
//shape: BoxShape.circle,
color: Palette.darkGray,
),
),
),
Positioned(
top: 90,
left: MediaQuery.of(context).size.width / 6,
child: InkWell(
onTap: () {
log("CircleButtonPressed");
},
child: const CameraUpload(size: 100)),
),
],
),
),
Column(
children: <Widget>[
SizedBox(
width: double.infinity,
child: Container(
/// color: Colors.red,
child: Text(
"Name",
textAlign: TextAlign.left,
style: TextStyle(
color: const Color.fromARGB(213, 245, 248, 250),
fontSize: MediaQuery.of(context).size.width / 28,
),
),
),
),
],
),
TextField(
controller: _nameController,
decoration: textEditInputDecoration,
),
Column(
children: <Widget>[
SizedBox(
width: double.infinity,
child: Container(
/// color: Colors.red,
child: Text(
"Bio",
textAlign: TextAlign.left,
style: TextStyle(
color: const Color.fromARGB(213, 245, 248, 250),
fontSize: MediaQuery.of(context).size.width / 28,
),
),
),
),
],
),
TextField(
controller: _aboutController,
decoration: textEditInputDecoration,
),
Column(
children: <Widget>[
SizedBox(
width: double.infinity,
child: Container(
/// color: Colors.red,
child: Text(
"Location",
textAlign: TextAlign.left,
style: TextStyle(
color: const Color.fromARGB(213, 245, 248, 250),
fontSize: MediaQuery.of(context).size.width / 28,
),
),
),
),
],
),
TextField(
decoration: textEditInputDecoration,
),
Column(
children: <Widget>[
SizedBox(
width: double.infinity,
child: Container(
/// color: Colors.red,
child: Text(
"Website",
textAlign: TextAlign.left,
style: TextStyle(
color: const Color.fromARGB(213, 245, 248, 250),
fontSize: MediaQuery.of(context).size.width / 28,
),
),
_buildHeader(),
_buildForm(),
],
);
}

Widget _buildHeader() {
return SizedBox(
height: (MediaQuery.of(context).size.height / 6) + 60,
child: Stack(
children: <Widget>[
InkWell(
onTap: () {
log("Header Pressed");
widget.bannerCallback();
},
child: Container(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height / 6,
decoration: BoxDecoration(
color: Palette.darkGray,
image: widget.initialBanner != null
? DecorationImage(
image: MemoryImage(widget.initialBanner!),
fit: BoxFit.cover,
)
: null,
),
),
],
),
TextField(
decoration: textEditInputDecoration,
),
Column(
children: <Widget>[
SizedBox(
width: double.infinity,
child: Container(
/// color: Colors.red,
child: Text(
"Birth date",
textAlign: TextAlign.left,
style: TextStyle(
color: const Color.fromARGB(213, 245, 248, 250),
fontSize: MediaQuery.of(context).size.width / 28,
),
),
),
Positioned(
bottom: 0,
left: MediaQuery.of(context).size.width / 6,
child: InkWell(
onTap: () {
log("Profile Picture Pressed");
widget.pictureCallback();
},
child: CameraUpload(
size: 100,
),
),
],
),
TextField(
decoration: textEditInputDecoration,
),
Column(
children: <Widget>[
SizedBox(
width: double.infinity,
child: Container(
/// color: Colors.red,
child: Text(
"Pronouns",
textAlign: TextAlign.left,
style: TextStyle(
color: const Color.fromARGB(213, 245, 248, 250),
fontSize: MediaQuery.of(context).size.width / 28,
),
),
),
),
],
),
);
}

Widget _buildForm() {
return Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
_buildInputField('Name', _controllers['name']!),
_buildInputField('Bio', _controllers['about']!),
_buildInputField('Website', _controllers['website']!),
_buildInputField('nip05', _controllers['nip05']!),
_buildInputField('lud06', _controllers['lud06']!),
_buildInputField('lud16', _controllers['lud16']!),
],
),
);
}

Widget _buildInputField(String label, TextEditingController controller) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top: 16.0, bottom: 8.0),
child: Text(
label,
style: TextStyle(
color: const Color.fromARGB(213, 245, 248, 250),
fontSize: MediaQuery.of(context).size.width / 28,
),
],
),
),
TextField(
controller: controller,
decoration: textEditInputDecoration,
),
],
Expand All @@ -269,9 +191,10 @@ class _EditProfileState extends ConsumerState<EditProfile> {

const textEditInputDecoration = InputDecoration(
hintText: "",
contentPadding: EdgeInsets.symmetric(vertical: 8.0, horizontal: 12.0),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(
width: 1, //<-- SEE HERE
width: 1,
color: Colors.grey,
),
),
Expand Down
Loading

0 comments on commit ec89a14

Please sign in to comment.