Skip to content

Commit

Permalink
refactor: simplify
Browse files Browse the repository at this point in the history
  • Loading branch information
jkoenig134 committed Feb 25, 2025
1 parent 8a34960 commit 97cb037
Showing 1 changed file with 69 additions and 83 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,23 +34,21 @@ class _CreateAnnouncementDialogState extends State<_CreateAnnouncementDialog> {
DateTime? _selectedExpirationDate;
final List<AnnouncementSeverity> _severityOptions = AnnouncementSeverity.values;

final List<_AnnouncementTextFormWidget> _announcementTextWidgets = [];
final List<_AnnouncementTextFormWidgetController> _announcementTextWidgetControllers = [];

@override
void initState() {
super.initState();

_announcementTextWidgets.add(
_AnnouncementTextFormWidget(
defaultLanguage: 'en',
formKey: _formKey,
onRemove: _remove,
),
);
_announcementTextWidgetControllers.add(_AnnouncementTextFormWidgetController(defaultLanguage: 'en'));
}

@override
void dispose() {
for (final controller in _announcementTextWidgetControllers) {
controller.dispose();
}

super.dispose();
}

Expand Down Expand Up @@ -127,23 +125,25 @@ class _CreateAnnouncementDialogState extends State<_CreateAnnouncementDialog> {
Expanded(child: Text(context.l10n.createAnnouncement_defaultLanguage)),
IconButton.filled(
icon: const Icon(Icons.add),
onPressed: () {
setState(() {
_announcementTextWidgets.add(
_AnnouncementTextFormWidget(
formKey: _formKey,
onRemove: _remove,
),
);
});
},
onPressed: () => setState(() => _announcementTextWidgetControllers.add(_AnnouncementTextFormWidgetController())),
),
],
),
Gaps.h16,
Column(
spacing: 16,
children: _announcementTextWidgets,
children: _announcementTextWidgetControllers
.map(
(controller) => _AnnouncementTextFormWidget(
formKey: GlobalKey<FormState>(),
onRemove: () {
setState(() => _announcementTextWidgetControllers.remove(controller));
controller.dispose();
},
controller: controller,
),
)
.toList(),
),
],
),
Expand All @@ -162,42 +162,26 @@ class _CreateAnnouncementDialogState extends State<_CreateAnnouncementDialog> {
height: 40,
child: FilledButton(
onPressed: () async {
if (_formKey.currentState!.validate()) {
final announcementTexts = <AnnouncementText>[];

for (final announcementTextWidget in _announcementTextWidgets) {
final title = announcementTextWidget.titleController.text;
final body = announcementTextWidget.bodyController.text;
final language = announcementTextWidget.languageController.text == ''
? announcementTextWidget.defaultLanguage
: announcementTextWidget.languageController.text;

announcementTexts.add(
AnnouncementText(
title: title,
body: body,
language: language!,
),
);
}

final response = await GetIt.I.get<AdminApiClient>().announcements.createAnnouncement(
expiresAt: _selectedExpirationDate?.toIso8601String(),
severity: _selectedSeverity!,
announcementTexts: announcementTexts,
recipients: [],
);

if (!context.mounted) return;
context.pop();

if (response.hasError) {
_showErrorSnackbar();
return;
}
widget.onAnnouncementCreated();
_showSuccessSnackbar();
if (_formKey.currentState!.validate()) return;

final announcementTexts = _announcementTextWidgetControllers.map((controller) => controller.announcementText).toList();

final response = await GetIt.I.get<AdminApiClient>().announcements.createAnnouncement(
expiresAt: _selectedExpirationDate?.toIso8601String(),
severity: _selectedSeverity!,
announcementTexts: announcementTexts,
recipients: [],
);

if (!context.mounted) return;
context.pop();

if (response.hasError) {
_showErrorSnackbar();
return;
}
widget.onAnnouncementCreated();
_showSuccessSnackbar();
},
child: Text(context.l10n.create),
),
Expand All @@ -206,14 +190,6 @@ class _CreateAnnouncementDialogState extends State<_CreateAnnouncementDialog> {
);
}

void _remove(_AnnouncementTextFormWidget announcementTextWidget) {
final index = _announcementTextWidgets.indexWhere((element) => element == announcementTextWidget);

setState(() {
_announcementTextWidgets.removeAt(index);
});
}

void _showSuccessSnackbar() {
final snackBar = SnackBar(
content: Text(
Expand Down Expand Up @@ -241,34 +217,44 @@ class _CreateAnnouncementDialogState extends State<_CreateAnnouncementDialog> {
}
}

class _AnnouncementTextFormWidgetController {
final String? defaultLanguage;

final TextEditingController titleController = TextEditingController();
final TextEditingController bodyController = TextEditingController();
final TextEditingController languageController = TextEditingController();

_AnnouncementTextFormWidgetController({this.defaultLanguage}) {
languageController.text = defaultLanguage ?? '';
}

AnnouncementText get announcementText =>
AnnouncementText(title: titleController.text, body: bodyController.text, language: languageController.text);

void dispose() {
titleController.dispose();
bodyController.dispose();
languageController.dispose();
}
}

class _AnnouncementTextFormWidget extends StatefulWidget {
final GlobalKey<FormState> formKey;
final void Function(_AnnouncementTextFormWidget index) onRemove;
final VoidCallback onRemove;
final _AnnouncementTextFormWidgetController controller;

_AnnouncementTextFormWidget({
const _AnnouncementTextFormWidget({
required this.formKey,
required this.onRemove,
this.defaultLanguage,
required this.controller,
});

@override
State<_AnnouncementTextFormWidget> createState() => _AnnouncementTextFormWidgetState();

final String? defaultLanguage;
final TextEditingController titleController = TextEditingController();
final TextEditingController bodyController = TextEditingController();
final TextEditingController languageController = TextEditingController();
}

class _AnnouncementTextFormWidgetState extends State<_AnnouncementTextFormWidget> {
String? selectedLanguage;
@override
void dispose() {
widget.titleController.dispose();
widget.bodyController.dispose();
widget.languageController.dispose();
super.dispose();
}

@override
Widget build(BuildContext context) {
Expand All @@ -280,34 +266,34 @@ class _AnnouncementTextFormWidgetState extends State<_AnnouncementTextFormWidget
spacing: 16,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (widget.defaultLanguage == null) ...[
if (widget.controller.defaultLanguage == null) ...[
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
TextButton(onPressed: () => widget.onRemove(widget), child: Text(context.l10n.remove)),
TextButton(onPressed: () => widget.onRemove(), child: Text(context.l10n.remove)),
],
),
LanguagePicker(
width: MediaQuery.of(context).size.width,
labelText: '${context.l10n.announcementsLanguage}*',
onLanguageChanged: (selectedLanguage) {
setState(() {
widget.languageController.text = selectedLanguage;
widget.controller.languageController.text = selectedLanguage;
});
},
validator: (value) => validateRequiredField(context, widget.languageController.text),
validator: (value) => validateRequiredField(context, widget.controller.languageController.text),
),
],
TextFormField(
controller: widget.titleController,
controller: widget.controller.titleController,
validator: (value) => validateRequiredField(context, value),
decoration: InputDecoration(
labelText: '${context.l10n.title}*',
border: const OutlineInputBorder(),
),
),
TextFormField(
controller: widget.bodyController,
controller: widget.controller.bodyController,
validator: (value) => validateRequiredField(context, value),
decoration: InputDecoration(
labelText: '${context.l10n.body}*',
Expand Down

0 comments on commit 97cb037

Please sign in to comment.