feat: Add receipt import functionality with file upload and parsing

- Implemented receipt file upload in ImportRepository with multipart request handling.
- Created ParsedReceiptItem model for parsed receipt data.
- Added ReceiptImportTab for user interface to upload and review receipts.
- Updated ImportScreen to include the new ReceiptImportTab alongside RecipeImportTab.
- Introduced flutter_bootstrap.js and index.html for web app initialization.
- Added wimp.wasm and flutter.js for enhanced web performance and capabilities.
This commit is contained in:
Nils-Johan Gynther
2026-04-23 19:24:53 +02:00
parent 108c633d0e
commit cd4274575e
44 changed files with 63900 additions and 657 deletions
@@ -0,0 +1 @@
{"version":2,"files":[{"path":"C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\lib\\l10n\\generated\\app_localizations_sv.dart","hash":"f1e13c0f9c90ec81955912c7df8a2430"},{"path":"C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\l10n.yaml","hash":"3a6f56d787f3093703fe91c15fc15342"},{"path":"C:\\Users\\Nils-JohanGynther\\AppData\\Local\\Programs\\flutter\\packages\\flutter_tools\\lib\\src\\build_system\\targets\\web.dart","hash":"790d5e3c840d25a312d1b8a625f34500"},{"path":"C:\\Users\\Nils-JohanGynther\\AppData\\Local\\Programs\\flutter\\bin\\cache\\engine.stamp","hash":"44f9d05c1ceacb7f1911501881fdad84"},{"path":"C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\lib\\l10n\\app_sv.arb","hash":"24892b1e0a97f7e262e95bec62340fad"},{"path":"C:\\Users\\Nils-JohanGynther\\AppData\\Local\\Programs\\flutter\\packages\\flutter_tools\\lib\\src\\build_system\\targets\\native_assets.dart","hash":"f78c405bcece3968277b212042da9ed6"},{"path":"C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\.dart_tool\\flutter_build\\f8c96b9ba70d270e1df926aec2a1e154\\main.dart","hash":"a45a5a08a75f55e5a5f771de1ed16f41"},{"path":"C:\\Users\\Nils-JohanGynther\\AppData\\Local\\Programs\\flutter\\packages\\flutter_tools\\lib\\src\\build_system\\targets\\localizations.dart","hash":"33a276900ad78ff1cd267a3483f69235"},{"path":"C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\lib\\l10n\\generated\\app_localizations_en.dart","hash":"e6e1e4bddc2ee4d8ee8385d6eea4e3c6"},{"path":"C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\.dart_tool\\flutter_build\\f8c96b9ba70d270e1df926aec2a1e154\\dart_build_result.json","hash":"599fc661078b15e1e46c169dc3e2408a"},{"path":"C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\build\\web\\flutter_bootstrap.js","hash":"d3d625dad1ff440d5b846a0c57755198"},{"path":"C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\lib\\l10n\\app_en.arb","hash":"e6bd7c70391c9b7e84f8d1c6d59b6638"},{"path":"C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\.dart_tool\\package_config.json","hash":"7502efdbbd009dd6f44e829774232f31"},{"path":"C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\lib\\l10n\\generated\\app_localizations.dart","hash":"7110f582493fdc56442a8e9e76ccf71d"}]}
@@ -0,0 +1 @@
{"inputs":["C:\\Users\\Nils-JohanGynther\\AppData\\Local\\Programs\\flutter\\bin\\cache\\engine.stamp","C:\\Users\\Nils-JohanGynther\\AppData\\Local\\Programs\\flutter\\bin\\cache\\engine.stamp","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\.dart_tool\\flutter_build\\f8c96b9ba70d270e1df926aec2a1e154\\main.dart","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\.dart_tool\\package_config.json"],"outputs":[],"buildKey":"{\"optimizationLevel\":null,\"webRenderer\":\"skwasm\",\"StripWasm\":true,\"minify\":null,\"dryRun\":true,\"SourceMaps\":false}"}
@@ -0,0 +1 @@
C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\.dart_tool\\flutter_build\\f8c96b9ba70d270e1df926aec2a1e154\\dart_build_result.json:
@@ -0,0 +1 @@
{"inputs":["C:\\Users\\Nils-JohanGynther\\AppData\\Local\\Programs\\flutter\\packages\\flutter_tools\\lib\\src\\build_system\\targets\\native_assets.dart","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\.dart_tool\\package_config.json"],"outputs":["C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\.dart_tool\\flutter_build\\f8c96b9ba70d270e1df926aec2a1e154\\dart_build_result.json","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\.dart_tool\\flutter_build\\f8c96b9ba70d270e1df926aec2a1e154\\dart_build_result.json"]}
@@ -0,0 +1 @@
{"build_start":"2026-04-23T19:22:42.204321","build_end":"2026-04-23T19:22:42.204321","dependencies":[],"code_assets":[],"data_assets":[]}
@@ -0,0 +1 @@
{"inputs":["C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\lib\\l10n\\app_en.arb","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\lib\\l10n\\app_sv.arb"],"outputs":["C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\lib\\l10n\\generated\\app_localizations_en.dart","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\lib\\l10n\\generated\\app_localizations_sv.dart","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\lib\\l10n\\generated\\app_localizations.dart"]}
@@ -0,0 +1 @@
C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\lib\\l10n\\generated\\app_localizations_en.dart C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\lib\\l10n\\generated\\app_localizations_sv.dart C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\lib\\l10n\\generated\\app_localizations.dart: C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\l10n.yaml C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\lib\\l10n\\app_en.arb C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\lib\\l10n\\app_sv.arb
@@ -0,0 +1 @@
{"inputs":["C:\\Users\\Nils-JohanGynther\\AppData\\Local\\Programs\\flutter\\packages\\flutter_tools\\lib\\src\\build_system\\targets\\localizations.dart","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\l10n.yaml","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\lib\\l10n\\app_en.arb","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\lib\\l10n\\app_sv.arb"],"outputs":["C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\lib\\l10n\\generated\\app_localizations_en.dart","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\lib\\l10n\\generated\\app_localizations_sv.dart","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\lib\\l10n\\generated\\app_localizations.dart"]}
@@ -0,0 +1,30 @@
// @dart=3.3
// Flutter web bootstrap script for package:recipe_flutter/main.dart.
//
// Generated file. Do not edit.
//
// ignore_for_file: type=lint
import 'dart:ui_web' as ui_web;
import 'dart:async';
import 'package:recipe_flutter/main.dart' as entrypoint;
import 'web_plugin_registrant.dart' as pluginRegistrant;
typedef _UnaryFunction = dynamic Function(List<String> args);
typedef _NullaryFunction = dynamic Function();
Future<void> main() async {
await ui_web.bootstrapEngine(
runApp: () {
if (entrypoint.main is _UnaryFunction) {
return (entrypoint.main as _UnaryFunction)(<String>[]);
}
return (entrypoint.main as _NullaryFunction)();
},
registerPlugins: () {
pluginRegistrant.registerPlugins();
},
);
}
@@ -0,0 +1 @@
["C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\build\\web\\*\\index.html","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\build\\web\\flutter_bootstrap.js","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\lib\\l10n\\generated\\app_localizations_en.dart","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\lib\\l10n\\generated\\app_localizations_sv.dart","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\lib\\l10n\\generated\\app_localizations.dart"]
@@ -0,0 +1 @@
{"inputs":["C:\\Users\\Nils-JohanGynther\\AppData\\Local\\Programs\\flutter\\packages\\flutter_tools\\lib\\src\\build_system\\targets\\web.dart"],"outputs":["C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\.dart_tool\\flutter_build\\f8c96b9ba70d270e1df926aec2a1e154\\main.dart"]}
@@ -0,0 +1,18 @@
// Flutter web plugin registrant file.
//
// Generated file. Do not edit.
//
// @dart = 2.13
// ignore_for_file: type=lint
import 'package:file_picker/src/platform/web/file_picker_web.dart';
import 'package:shared_preferences_web/shared_preferences_web.dart';
import 'package:flutter_web_plugins/flutter_web_plugins.dart';
void registerPlugins([final Registrar? pluginRegistrar]) {
final Registrar registrar = pluginRegistrar ?? webPluginRegistrar;
FilePickerWeb.registerWith(registrar);
SharedPreferencesPlugin.registerWith(registrar);
registrar.registerMessageHandler();
}
@@ -0,0 +1 @@
{"inputs":["C:\\Users\\Nils-JohanGynther\\AppData\\Local\\Programs\\flutter\\bin\\cache\\engine.stamp"],"outputs":["C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\.dart_tool\\flutter_build\\f8c96b9ba70d270e1df926aec2a1e154\\flutter.js","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\.dart_tool\\flutter_build\\f8c96b9ba70d270e1df926aec2a1e154\\canvaskit\\canvaskit.js","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\.dart_tool\\flutter_build\\f8c96b9ba70d270e1df926aec2a1e154\\canvaskit\\canvaskit.js.symbols","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\.dart_tool\\flutter_build\\f8c96b9ba70d270e1df926aec2a1e154\\canvaskit\\canvaskit.wasm","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\.dart_tool\\flutter_build\\f8c96b9ba70d270e1df926aec2a1e154\\canvaskit\\chromium\\canvaskit.js","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\.dart_tool\\flutter_build\\f8c96b9ba70d270e1df926aec2a1e154\\canvaskit\\chromium\\canvaskit.js.symbols","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\.dart_tool\\flutter_build\\f8c96b9ba70d270e1df926aec2a1e154\\canvaskit\\chromium\\canvaskit.wasm","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\.dart_tool\\flutter_build\\f8c96b9ba70d270e1df926aec2a1e154\\canvaskit\\skwasm.js","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\.dart_tool\\flutter_build\\f8c96b9ba70d270e1df926aec2a1e154\\canvaskit\\skwasm.js.symbols","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\.dart_tool\\flutter_build\\f8c96b9ba70d270e1df926aec2a1e154\\canvaskit\\skwasm.wasm","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\.dart_tool\\flutter_build\\f8c96b9ba70d270e1df926aec2a1e154\\canvaskit\\skwasm_heavy.js","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\.dart_tool\\flutter_build\\f8c96b9ba70d270e1df926aec2a1e154\\canvaskit\\skwasm_heavy.js.symbols","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\.dart_tool\\flutter_build\\f8c96b9ba70d270e1df926aec2a1e154\\canvaskit\\skwasm_heavy.wasm","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\.dart_tool\\flutter_build\\f8c96b9ba70d270e1df926aec2a1e154\\canvaskit\\wimp.js","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\.dart_tool\\flutter_build\\f8c96b9ba70d270e1df926aec2a1e154\\canvaskit\\wimp.js.symbols","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\.dart_tool\\flutter_build\\f8c96b9ba70d270e1df926aec2a1e154\\canvaskit\\wimp.wasm"]}
@@ -0,0 +1 @@
{"inputs":["C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\web\\*\\index.html","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\web\\flutter_bootstrap.js","C:\\Users\\Nils-JohanGynther\\AppData\\Local\\Programs\\flutter\\bin\\cache\\engine.stamp"],"outputs":["C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\build\\web\\*\\index.html","C:\\Users\\Nils-JohanGynther\\dev\\recipe-app\\flutter\\build\\web\\flutter_bootstrap.js"],"buildKey":"[{\"compileTarget\":\"dart2js\",\"renderer\":\"canvaskit\",\"mainJsPath\":\"main.dart.js\"},{}]"}