Waaaay big enchancements

This commit is contained in:
Artem Kokos
2026-04-02 23:51:28 +07:00
parent 6221fbcc71
commit 5e09f41747
14 changed files with 1308 additions and 111 deletions

View File

@@ -17,6 +17,8 @@ class _HomeEditScreenState extends ConsumerState<HomeEditScreen> {
final _nameCtrl = TextEditingController();
final _urlCtrl = TextEditingController();
final _keyCtrl = TextEditingController();
final _latCtrl = TextEditingController();
final _lonCtrl = TextEditingController();
bool _saving = false;
bool get _isEdit => widget.home != null;
@@ -28,6 +30,12 @@ class _HomeEditScreenState extends ConsumerState<HomeEditScreen> {
_nameCtrl.text = widget.home!.name;
_urlCtrl.text = widget.home!.url;
_keyCtrl.text = widget.home!.apiKey;
if (widget.home!.latitude != null) {
_latCtrl.text = widget.home!.latitude.toString();
}
if (widget.home!.longitude != null) {
_lonCtrl.text = widget.home!.longitude.toString();
}
}
}
@@ -36,6 +44,8 @@ class _HomeEditScreenState extends ConsumerState<HomeEditScreen> {
_nameCtrl.dispose();
_urlCtrl.dispose();
_keyCtrl.dispose();
_latCtrl.dispose();
_lonCtrl.dispose();
super.dispose();
}
@@ -45,9 +55,10 @@ class _HomeEditScreenState extends ConsumerState<HomeEditScreen> {
appBar: AppBar(
title: Text(_isEdit ? 'РЕДАКТИРОВАТЬ ДОМ' : 'НОВЫЙ ДОМ'),
),
body: Padding(
body: SingleChildScrollView(
padding: const EdgeInsets.all(20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextField(
controller: _nameCtrl,
@@ -75,6 +86,54 @@ class _HomeEditScreenState extends ConsumerState<HomeEditScreen> {
),
obscureText: true,
),
const SizedBox(height: 24),
// ─── GPS-координаты (опционально) ───
const Text(
'Координаты дома (опционально)',
style: TextStyle(
color: Colors.white54,
fontSize: 13,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 4),
const Text(
'Для автоматизации по геолокации',
style: TextStyle(color: Colors.white30, fontSize: 12),
),
const SizedBox(height: 8),
Row(
children: [
Expanded(
child: TextField(
controller: _latCtrl,
decoration: const InputDecoration(
labelText: 'Широта',
prefixIcon: Icon(Icons.location_on, size: 20),
hintText: '51.128',
),
keyboardType: const TextInputType.numberWithOptions(
decimal: true, signed: true),
),
),
const SizedBox(width: 12),
Expanded(
child: TextField(
controller: _lonCtrl,
decoration: const InputDecoration(
labelText: 'Долгота',
prefixIcon: Icon(Icons.location_on, size: 20),
hintText: '71.430',
),
keyboardType: const TextInputType.numberWithOptions(
decimal: true, signed: true),
),
),
],
),
const SizedBox(height: 24),
SizedBox(
width: double.infinity,
@@ -97,6 +156,8 @@ class _HomeEditScreenState extends ConsumerState<HomeEditScreen> {
: Text(_isEdit ? 'СОХРАНИТЬ' : 'ДОБАВИТЬ'),
),
),
// Отступ внизу для системных кнопок
SizedBox(height: MediaQuery.of(context).padding.bottom + 16),
],
),
),
@@ -107,23 +168,47 @@ class _HomeEditScreenState extends ConsumerState<HomeEditScreen> {
final name = _nameCtrl.text.trim();
final url = _urlCtrl.text.trim();
final key = _keyCtrl.text.trim();
final latText = _latCtrl.text.trim();
final lonText = _lonCtrl.text.trim();
if (name.isEmpty || url.isEmpty || key.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Заполните все поля')),
const SnackBar(content: Text('Заполните все обязательные поля')),
);
return;
}
double? lat;
double? lon;
if (latText.isNotEmpty && lonText.isNotEmpty) {
lat = double.tryParse(latText);
lon = double.tryParse(lonText);
if (lat == null || lon == null) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Некорректные координаты')),
);
return;
}
}
setState(() => _saving = true);
final home = _isEdit
? widget.home!.copyWith(name: name, url: url, apiKey: key)
? widget.home!.copyWith(
name: name,
url: url,
apiKey: key,
latitude: lat,
longitude: lon,
clearCoordinates: latText.isEmpty && lonText.isEmpty,
)
: HomeConfig(
id: DateTime.now().millisecondsSinceEpoch.toString(),
name: name,
url: url,
apiKey: key,
latitude: lat,
longitude: lon,
);
if (_isEdit) {