mirror of
https://github.com/timokz/flutter-vienna-hackathon-25.git
synced 2025-11-08 21:24:20 +01:00
98 lines
3 KiB
Dart
98 lines
3 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:loader_overlay/loader_overlay.dart';
|
|
import 'package:location/location.dart';
|
|
import 'package:wien_talks_client/wien_talks_client.dart';
|
|
import 'package:wien_talks_flutter/helper/location_mgr.dart';
|
|
import 'package:wien_talks_flutter/widgets/error_snackbar.dart';
|
|
|
|
typedef OnSubmit = Future<void> Function(CreateQuoteRequest request);
|
|
|
|
class NewsInputForm extends StatefulWidget {
|
|
final OnSubmit onSubmit;
|
|
|
|
const NewsInputForm({super.key, required this.onSubmit});
|
|
|
|
@override
|
|
// ignore: library_private_types_in_public_api
|
|
_NewsInputFormState createState() => _NewsInputFormState();
|
|
}
|
|
|
|
class _NewsInputFormState extends State<NewsInputForm> {
|
|
final _formKey = GlobalKey<FormState>();
|
|
final TextEditingController _newsController = TextEditingController();
|
|
|
|
@override
|
|
void dispose() {
|
|
_newsController.dispose();
|
|
super.dispose();
|
|
}
|
|
|
|
void _submitForm() async {
|
|
LocationData? locationData = LocationMgr().lastLocation;
|
|
if (locationData == null ||
|
|
locationData.latitude == null ||
|
|
locationData.longitude == null) {
|
|
ErrorSnackbar()
|
|
.show(context, "No location available, please retry later");
|
|
return;
|
|
}
|
|
if (_formKey.currentState!.validate()) {
|
|
final newsData = CreateQuoteRequest(
|
|
text: _newsController.text.trim(),
|
|
lat: LocationMgr().lastLocation!.latitude!,
|
|
lng: LocationMgr().lastLocation!.longitude!,
|
|
);
|
|
var handler = context.loaderOverlay..show();
|
|
try {
|
|
await widget.onSubmit(newsData);
|
|
} catch (error) {
|
|
if (mounted) {
|
|
ErrorSnackbar().show(context, error.toString());
|
|
}
|
|
} finally {
|
|
handler.hide();
|
|
}
|
|
}
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Padding(
|
|
padding: const EdgeInsets.all(16.0),
|
|
child: Form(
|
|
key: _formKey,
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
TextFormField(
|
|
controller: _newsController,
|
|
maxLines: 4,
|
|
decoration: const InputDecoration(
|
|
labelText: 'News',
|
|
hintText: 'Enter your news here...',
|
|
border: OutlineInputBorder(),
|
|
),
|
|
validator: (value) {
|
|
if (value == null || value.trim().isEmpty) {
|
|
return 'Please enter some text';
|
|
}
|
|
return null;
|
|
},
|
|
),
|
|
const SizedBox(height: 16.0),
|
|
ElevatedButton(
|
|
style: ButtonStyle(
|
|
backgroundColor:
|
|
WidgetStateProperty.all(Theme.of(context).primaryColor),
|
|
foregroundColor: WidgetStateProperty.all(
|
|
Theme.of(context).colorScheme.onPrimary)),
|
|
onPressed: _submitForm,
|
|
child: const Text('Submit News'),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|