fmassive/lib/edit_set.dart

143 lines
4.8 KiB
Dart
Raw Permalink Normal View History

2023-04-06 23:50:02 +00:00
import 'package:flutter/material.dart';
2023-04-10 23:41:10 +00:00
import 'package:flutter/material.dart' as material;
2023-04-11 01:14:26 +00:00
import 'package:flutter/services.dart';
2023-04-10 23:41:10 +00:00
import 'package:fmassive/database.dart';
import 'package:fmassive/main.dart';
import 'package:moor_flutter/moor_flutter.dart';
import 'package:permission_handler/permission_handler.dart';
2023-04-06 23:50:02 +00:00
class EditGymSetPage extends StatefulWidget {
2023-04-10 23:41:10 +00:00
final GymSetsCompanion gymSet;
2023-04-06 23:50:02 +00:00
2023-04-07 03:56:17 +00:00
const EditGymSetPage({required this.gymSet, super.key});
2023-04-06 23:50:02 +00:00
@override
2023-04-07 03:56:17 +00:00
createState() => _EditGymSetPageState();
2023-04-06 23:50:02 +00:00
}
class _EditGymSetPageState extends State<EditGymSetPage> {
final TextEditingController _nameController = TextEditingController();
final TextEditingController _repsController = TextEditingController();
final TextEditingController _weightController = TextEditingController();
2023-04-10 23:41:10 +00:00
late GymSetsCompanion gymSet;
final nameNode = FocusNode();
final repsNode = FocusNode();
2023-04-06 23:50:02 +00:00
@override
void initState() {
super.initState();
2023-04-10 23:41:10 +00:00
gymSet = widget.gymSet;
2023-11-10 04:09:20 +00:00
print(gymSet);
2023-04-10 23:41:10 +00:00
_nameController.text = gymSet.name.value;
_repsController.text = gymSet.reps.value.toString();
_weightController.text = gymSet.weight.value.toString();
2023-11-10 04:09:20 +00:00
if (gymSet.id.present) {
repsNode.requestFocus();
2023-11-10 04:09:20 +00:00
_repsController.selection = TextSelection(
2023-11-30 00:02:50 +00:00
baseOffset: 0, extentOffset: _repsController.text.length,);
2023-11-10 04:09:20 +00:00
} else
nameNode.requestFocus();
}
@override
dispose() {
nameNode.dispose();
repsNode.dispose();
super.dispose();
2023-04-06 23:50:02 +00:00
}
@override
Widget build(BuildContext context) {
2023-04-10 23:41:10 +00:00
List<Widget> actions = [];
if (widget.gymSet.id.present)
actions.add(IconButton(
onPressed: () async {
await db.gymSets.deleteOne(widget.gymSet);
if (!mounted) return;
Navigator.pop(context);
},
2023-11-30 00:02:50 +00:00
icon: const Icon(Icons.delete),),);
2023-04-10 23:41:10 +00:00
2023-04-13 06:58:26 +00:00
return SafeArea(
child: Scaffold(
2023-04-10 23:41:10 +00:00
appBar: AppBar(title: const Text('Edit Gym Set'), actions: actions),
2023-04-06 23:50:02 +00:00
body: Padding(
padding: const EdgeInsets.all(16.0),
2023-04-10 23:41:10 +00:00
child: material.Column(
2023-04-06 23:50:02 +00:00
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextFormField(
controller: _nameController,
focusNode: nameNode,
2023-04-06 23:50:02 +00:00
decoration: const InputDecoration(labelText: 'Name'),
onTap: () {
_nameController.selection = TextSelection(
2023-11-30 00:02:50 +00:00
baseOffset: 0, extentOffset: _nameController.text.length,);
},
2023-04-06 23:50:02 +00:00
onChanged: (value) {
setState(() {
2023-04-10 23:41:10 +00:00
gymSet = gymSet.copyWith(name: Value(value));
2023-04-06 23:50:02 +00:00
});
},
),
TextFormField(
controller: _repsController,
focusNode: repsNode,
onTap: () {
_repsController.selection = TextSelection(
2023-11-30 00:02:50 +00:00
baseOffset: 0, extentOffset: _repsController.text.length,);
},
2023-04-06 23:50:02 +00:00
decoration: const InputDecoration(labelText: 'Reps'),
keyboardType: TextInputType.number,
onChanged: (value) {
setState(() {
2023-04-10 23:41:10 +00:00
gymSet =
gymSet.copyWith(reps: Value(int.tryParse(value) ?? 0));
2023-04-06 23:50:02 +00:00
});
},
),
TextFormField(
controller: _weightController,
decoration: const InputDecoration(labelText: 'Weight (kg)'),
keyboardType: TextInputType.number,
onTap: () {
_weightController.selection = TextSelection(
2023-11-30 00:02:50 +00:00
baseOffset: 0, extentOffset: _weightController.text.length,);
},
2023-04-06 23:50:02 +00:00
onChanged: (value) {
setState(() {
2023-11-10 03:16:12 +00:00
gymSet = gymSet.copyWith(
2023-11-30 00:02:50 +00:00
weight: Value(double.tryParse(value) ?? 0),);
2023-04-06 23:50:02 +00:00
});
},
),
],
),
),
floatingActionButton: FloatingActionButton(
2023-04-07 03:56:17 +00:00
onPressed: () async {
2023-04-13 06:58:26 +00:00
if (_nameController.text.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
2023-11-30 00:02:50 +00:00
const SnackBar(content: Text('Please enter a name')),);
2023-04-13 06:58:26 +00:00
nameNode.requestFocus();
return;
}
2023-04-10 23:41:10 +00:00
if (gymSet.id.present)
2023-11-10 04:09:20 +00:00
await db.update(db.gymSets).replace(gymSet);
2023-04-11 01:14:26 +00:00
else {
await Permission.notification.request();
final newSet = gymSet.copyWith(
2023-11-30 00:02:50 +00:00
created: Value(DateTime.now().toIso8601String()),);
await db.into(db.gymSets).insert(newSet);
2023-04-11 01:14:26 +00:00
const platform = MethodChannel('com.massive/android');
platform.invokeMethod('timer', [3000]);
}
2023-04-07 03:56:17 +00:00
if (!mounted) return;
2023-04-10 23:41:10 +00:00
Navigator.pop(context);
2023-04-06 23:50:02 +00:00
},
child: const Icon(Icons.check),
),
2023-11-30 00:02:50 +00:00
),);
2023-04-06 23:50:02 +00:00
}
}