fix: ui overflow nav-bar, name files in chat, qr-code scanner in dev-tools, message field size, keyboard type

This commit is contained in:
mso7nueh
2025-12-22 16:48:13 +03:00
parent f56092d88f
commit 42b443c3ba
61 changed files with 759 additions and 393 deletions

View File

@@ -0,0 +1,29 @@
import 'package:freezed_annotation/freezed_annotation.dart';
part 'barcode_product_model.freezed.dart';
part 'barcode_product_model.g.dart';
@freezed
abstract class BarcodeProductModel with _$BarcodeProductModel {
const factory BarcodeProductModel({
// ignore: non_constant_identifier_names
required String GTIN,
@JsonKey(name: 'Товарный знак (ru)') String? brandName,
@JsonKey(name: 'Описание (ru)') String? description,
@JsonKey(name: 'Количество/вес') String? quantity,
@JsonKey(name: 'Рынок сбыта') String? market,
@JsonKey(name: 'Калорийность') double? calories,
@JsonKey(name: 'Белки') double? proteins,
@JsonKey(name: 'Жиры') double? fats,
@JsonKey(name: 'Углеводы') double? carbohydrates,
}) = _BarcodeProductModel;
factory BarcodeProductModel.fromJson(Map<String, Object?> json) => _$BarcodeProductModelFromJson(json);
}
@freezed
abstract class BarcodeTaskStatusModel with _$BarcodeTaskStatusModel {
const factory BarcodeTaskStatusModel({String? status, @JsonKey(name: 'task_id') String? taskId, BarcodeProductModel? data}) = _BarcodeTaskStatusModel;
factory BarcodeTaskStatusModel.fromJson(Map<String, Object?> json) => _$BarcodeTaskStatusModelFromJson(json);
}

View File

@@ -0,0 +1,108 @@
import 'package:dio/dio.dart';
import 'package:eatvio_app/features/barcode/models/barcode_product_model.dart';
import 'package:eatvio_app/features/barcode/services/barcode_service.dart';
class BarcodeRepository {
final BarcodeService barcodeService;
final Dio dio;
BarcodeRepository({
required this.barcodeService,
required this.dio,
});
/// Получить информацию о продукте по штрихкоду
/// Возвращает либо данные продукта, либо статус задачи обработки
Future<BarcodeResult> getProductByBarcode(String barcode) async {
try {
final response = await dio.get('/api/gsone/barcode/$barcode');
if (response.statusCode == 200) {
// Данные найдены в БД
final product = BarcodeProductModel.fromJson(response.data as Map<String, dynamic>);
return BarcodeResult.success(product);
} else if (response.statusCode == 202) {
// Запущена задача обработки
final taskStatus = BarcodeTaskStatusModel.fromJson(response.data as Map<String, dynamic>);
return BarcodeResult.processing(taskStatus.taskId ?? '');
}
throw Exception('Unexpected status code: ${response.statusCode}');
} on DioException catch (e) {
if (e.response?.statusCode == 202) {
// Если получен статус 202, значит запущена задача обработки
final taskStatus = BarcodeTaskStatusModel.fromJson(e.response!.data as Map<String, dynamic>);
return BarcodeResult.processing(taskStatus.taskId ?? '');
}
rethrow;
} catch (e) {
rethrow;
}
}
/// Получить статус задачи обработки
Future<BarcodeTaskStatus> getTaskStatus(String taskId) async {
try {
final statusModel = await barcodeService.getTaskStatus(taskId: taskId);
if (statusModel.status == 'completed' && statusModel.data != null) {
return BarcodeTaskStatus.completed(statusModel.data!);
} else if (statusModel.status == 'failed') {
return BarcodeTaskStatus.failed();
} else {
return BarcodeTaskStatus.processing();
}
} catch (e) {
rethrow;
}
}
}
/// Результат запроса информации о продукте по штрихкоду
class BarcodeResult {
final BarcodeResultType type;
final BarcodeProductModel? product;
final String? taskId;
BarcodeResult._({required this.type, this.product, this.taskId});
factory BarcodeResult.success(BarcodeProductModel product) {
return BarcodeResult._(type: BarcodeResultType.success, product: product);
}
factory BarcodeResult.processing(String taskId) {
return BarcodeResult._(type: BarcodeResultType.processing, taskId: taskId);
}
}
enum BarcodeResultType {
success,
processing,
}
/// Статус задачи обработки
class BarcodeTaskStatus {
final BarcodeTaskStatusType type;
final BarcodeProductModel? product;
BarcodeTaskStatus._({required this.type, this.product});
factory BarcodeTaskStatus.completed(BarcodeProductModel product) {
return BarcodeTaskStatus._(type: BarcodeTaskStatusType.completed, product: product);
}
factory BarcodeTaskStatus.processing() {
return BarcodeTaskStatus._(type: BarcodeTaskStatusType.processing);
}
factory BarcodeTaskStatus.failed() {
return BarcodeTaskStatus._(type: BarcodeTaskStatusType.failed);
}
}
enum BarcodeTaskStatusType {
completed,
processing,
failed,
}

View File

@@ -0,0 +1,17 @@
import 'package:dio/dio.dart';
import 'package:eatvio_app/features/barcode/models/barcode_product_model.dart';
import 'package:retrofit/retrofit.dart';
part 'barcode_service.g.dart';
@RestApi()
abstract class BarcodeService {
factory BarcodeService(Dio dio, {String baseUrl}) = _BarcodeService;
@GET('/api/gsone/barcode/{barcode}')
Future<BarcodeProductModel> getProductByBarcode({@Path('barcode') required String barcode});
@GET('/api/gsone/barcode/status/{task_id}')
Future<BarcodeTaskStatusModel> getTaskStatus({@Path('task_id') required String taskId});
}