feat(import): implement recipe import functionality with file and URL support

Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
Nils-Johan Gynther
2026-04-22 21:31:25 +02:00
parent 8ebf119d39
commit 81117fbcb7
11 changed files with 617 additions and 13 deletions
@@ -11,7 +11,10 @@ import '../domain/parsed_recipe.dart';
enum _Step { input, review }
class CreateRecipeScreen extends ConsumerStatefulWidget {
const CreateRecipeScreen({super.key});
/// Optional markdown to pre-fill the input field, e.g. from import.
final String? initialMarkdown;
const CreateRecipeScreen({super.key, this.initialMarkdown});
@override
ConsumerState<CreateRecipeScreen> createState() =>
@@ -22,10 +25,16 @@ class _CreateRecipeScreenState extends ConsumerState<CreateRecipeScreen> {
_Step _step = _Step.input;
// Step 1 — markdown input
final _markdownCtrl = TextEditingController();
late final TextEditingController _markdownCtrl;
bool _isParsing = false;
String? _parseError;
@override
void initState() {
super.initState();
_markdownCtrl = TextEditingController(text: widget.initialMarkdown ?? '');
}
// Step 2 — review state
ParsedRecipe? _parsed;
late TextEditingController _nameCtrl;
@@ -39,7 +48,7 @@ class _CreateRecipeScreenState extends ConsumerState<CreateRecipeScreen> {
@override
void dispose() {
_markdownCtrl.dispose();
_markdownCtrl.dispose(); // always non-null after initState
if (_step == _Step.review) {
_nameCtrl.dispose();
_servingsCtrl.dispose();