Skip to content

Commit

Permalink
cleanup: Split out the add contact page into separate widgets.
Browse files Browse the repository at this point in the history
  • Loading branch information
iphydf committed Dec 29, 2024
1 parent 253b777 commit e65fb35
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 42 deletions.
51 changes: 9 additions & 42 deletions lib/add_contact_page.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import 'package:btox/widgets/friend_request_message_field.dart';
import 'package:btox/widgets/tox_id_field.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';

Expand Down Expand Up @@ -36,52 +38,17 @@ final class _AddContactPageState extends State<AddContactPage> {
key: _formKey,
child: Column(
children: [
Padding(
padding: const EdgeInsets.all(16),
child: TextFormField(
key: const Key('toxId'),
autovalidateMode: AutovalidateMode.onUserInteraction,
validator: (value) {
value ??= '';
if (value.length != 76) {
return '${AppLocalizations.of(context)!.toxIdLengthError} (${value.length}/76)';
}
return null;
},
decoration: InputDecoration(
border: UnderlineInputBorder(),
labelText: AppLocalizations.of(context)!.toxId,
),
controller: _toxIdInputController,
textInputAction: TextInputAction.next,
autofocus: true,
),
),
Padding(
padding: const EdgeInsets.all(16),
child: TextFormField(
autovalidateMode: AutovalidateMode.onUserInteraction,
validator: (value) {
if (value == null || value.isEmpty) {
return AppLocalizations.of(context)!.messageEmptyError;
}
return null;
},
decoration: InputDecoration(
border: UnderlineInputBorder(),
labelText: AppLocalizations.of(context)!.message,
),
onEditingComplete: () => _onAddContact(),
controller: _messageInputController,
textInputAction: TextInputAction.send,
),
ToxIdField(controller: _toxIdInputController),
FriendRequestMessageField(
controller: _messageInputController,
onEditingComplete: () => _onAddContact(_formKey.currentState!),
),
Align(
alignment: Alignment.topRight,
child: Padding(
padding: const EdgeInsets.all(16),
child: ElevatedButton(
onPressed: _onAddContact,
onPressed: () => _onAddContact(_formKey.currentState!),
child: Text(AppLocalizations.of(context)!.add),
),
),
Expand All @@ -93,8 +60,8 @@ final class _AddContactPageState extends State<AddContactPage> {
);
}

void _onAddContact() {
if (_formKey.currentState!.validate()) {
void _onAddContact(FormState form) {
if (form.validate()) {
widget.onAddContact(
_toxIdInputController.text, _messageInputController.text);
Navigator.pop(context);
Expand Down
37 changes: 37 additions & 0 deletions lib/widgets/friend_request_message_field.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import 'package:flutter/material.dart';

import 'package:flutter_gen/gen_l10n/app_localizations.dart';

final class FriendRequestMessageField extends StatelessWidget {
final TextEditingController controller;
final void Function() onEditingComplete;

const FriendRequestMessageField({
super.key,
required this.controller,
required this.onEditingComplete,
});

@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(16),
child: TextFormField(
autovalidateMode: AutovalidateMode.onUserInteraction,
validator: (value) {
if (value == null || value.isEmpty) {
return AppLocalizations.of(context)!.messageEmptyError;
}
return null;
},
decoration: InputDecoration(
border: UnderlineInputBorder(),
labelText: AppLocalizations.of(context)!.message,
),
onEditingComplete: onEditingComplete,
controller: controller,
textInputAction: TextInputAction.send,
),
);
}
}
37 changes: 37 additions & 0 deletions lib/widgets/tox_id_field.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import 'package:flutter/material.dart';

import 'package:flutter_gen/gen_l10n/app_localizations.dart';

final class ToxIdField extends StatelessWidget {
final TextEditingController controller;

const ToxIdField({
super.key,
required this.controller,
});

@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(16),
child: TextFormField(
key: const Key('toxId'),
autovalidateMode: AutovalidateMode.onUserInteraction,
validator: (value) {
value ??= '';
if (value.length != 76) {
return '${AppLocalizations.of(context)!.toxIdLengthError} (${value.length}/76)';
}
return null;
},
decoration: InputDecoration(
border: UnderlineInputBorder(),
labelText: AppLocalizations.of(context)!.toxId,
),
controller: controller,
textInputAction: TextInputAction.next,
autofocus: true,
),
);
}
}

0 comments on commit e65fb35

Please sign in to comment.