import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../models/home_config.dart'; import '../providers/providers.dart'; /// Экран создания или редактирования "дома" (сервера Ignis). class HomeEditScreen extends ConsumerStatefulWidget { final HomeConfig? home; // null -- создание, иначе редактирование const HomeEditScreen({super.key, this.home}); @override ConsumerState createState() => _HomeEditScreenState(); } class _HomeEditScreenState extends ConsumerState { final _nameCtrl = TextEditingController(); final _urlCtrl = TextEditingController(); final _keyCtrl = TextEditingController(); bool _saving = false; bool get _isEdit => widget.home != null; @override void initState() { super.initState(); if (_isEdit) { _nameCtrl.text = widget.home!.name; _urlCtrl.text = widget.home!.url; _keyCtrl.text = widget.home!.apiKey; } } @override void dispose() { _nameCtrl.dispose(); _urlCtrl.dispose(); _keyCtrl.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(_isEdit ? 'РЕДАКТИРОВАТЬ ДОМ' : 'НОВЫЙ ДОМ'), ), body: Padding( padding: const EdgeInsets.all(20), child: Column( children: [ TextField( controller: _nameCtrl, decoration: const InputDecoration( labelText: 'Название (например "Квартира")', prefixIcon: Icon(Icons.home), ), textCapitalization: TextCapitalization.sentences, ), const SizedBox(height: 12), TextField( controller: _urlCtrl, decoration: const InputDecoration( labelText: 'Адрес сервера (например ignis.akokos.ru)', prefixIcon: Icon(Icons.dns), ), keyboardType: TextInputType.url, ), const SizedBox(height: 12), TextField( controller: _keyCtrl, decoration: const InputDecoration( labelText: 'API Key', prefixIcon: Icon(Icons.key), ), obscureText: true, ), const SizedBox(height: 24), SizedBox( width: double.infinity, height: 48, child: ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: Colors.deepOrange, foregroundColor: Colors.white, ), onPressed: _saving ? null : _save, child: _saving ? const SizedBox( width: 20, height: 20, child: CircularProgressIndicator( strokeWidth: 2, color: Colors.white, ), ) : Text(_isEdit ? 'СОХРАНИТЬ' : 'ДОБАВИТЬ'), ), ), ], ), ), ); } Future _save() async { final name = _nameCtrl.text.trim(); final url = _urlCtrl.text.trim(); final key = _keyCtrl.text.trim(); if (name.isEmpty || url.isEmpty || key.isEmpty) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('Заполните все поля')), ); return; } setState(() => _saving = true); final home = _isEdit ? widget.home!.copyWith(name: name, url: url, apiKey: key) : HomeConfig( id: DateTime.now().millisecondsSinceEpoch.toString(), name: name, url: url, apiKey: key, ); if (_isEdit) { await ref.read(homesProvider.notifier).update(home); } else { await ref.read(homesProvider.notifier).add(home); } if (mounted) Navigator.of(context).pop(); } }