import 'dart:convert'; import 'package:camera/camera.dart'; import 'package:flutter/material.dart'; import 'package:yoshi_papas_app/models/toping_categoria_model.dart'; import '../data/api_response.dart'; import '../services/base_service.dart'; import '../models/models.dart'; import '../services/services.dart'; class TopingViewModel extends ChangeNotifier { String _busqueda = ""; String get busqueda => _busqueda; List _registros = []; Toping? _selectedModelo; bool _isLoading = false; List get registros => _registros; Toping? get selectedToping => _selectedModelo; bool get isLoading => _isLoading; int pagina = 1; int totalPaginas = 1; int limite = 10; setBusqueda(String value) { _busqueda = value; notifyListeners(); } Toping? getById(int id) { try { return _registros.firstWhere((toping) => toping.id == id); } catch (e) { // Si no se encuentra ninguna categoría con ese ID, regresa null. return null; } } Future> fetchRegistros( {String? q, bool segmentar = false, int limitee = 10}) async { Map parametros = { "ordenar": "id-desc", "pagina": "$pagina", "limite": "$limite", "expand": "mediaToping,categoriaToping" }; if (limitee == -1) { parametros['limite'] = limitee.toString(); } if (_busqueda.isNotEmpty) { parametros["q"] = _busqueda; } if (segmentar) { parametros['segmentar'] = "1"; } var r = ApiResponse( await BaseService().get("admin/toping", queryParameters: parametros)); pagina = r.paginacion!.pagina; var total = r.paginacion!.total / r.paginacion!.limite; totalPaginas = total > 0 ? total.ceil() : 1; List aux = []; if (r.isOk) { for (var x in r.resultados!) { Toping modelo = Toping.fromJson(x); aux.add(modelo); } } _registros = aux; notifyListeners(); return _registros; } selectModelo(Toping Toping) { _selectedModelo = Toping; notifyListeners(); } setIsLoading(bool loading) { _isLoading = loading; notifyListeners(); } cambiarPagina(int nuevaPagina, {bool segmentar = false}) { pagina = nuevaPagina; fetchRegistros(segmentar: segmentar); } Future eliminarMedia(Media m) async { _selectedModelo!.mediaToping .removeWhere((mediaToping) => mediaToping.media?.id == m.id); notifyListeners(); } Future guardarModelo({ required Toping modelo, required String clave, required String nombre, required String descripcion, required String costo, required int categoria, required bool activo, List? fotos, }) async { modelo.clave = clave; modelo.nombre = nombre; modelo.descripcion = descripcion; modelo.idCategoria = categoria; modelo.costo = costo; modelo.activo = activo; var r = ApiResponse(await BaseService() .post("admin/toping/guardar", body: modelo.toJson())); int id = int.parse(r.detalle!["id"].toString()); if (id > 0 && fotos != null && fotos.isNotEmpty) { for (var x in fotos) { await GeneralService().enviarMedia( id: id, media: x, modulo: "Toping", etiquetaID: "idToping", tipo: "imagen"); } } var s = await BaseService().post("admin/toping/guardar", body: modelo.toJson()); if (r.statusCode == 200) {} notifyListeners(); } Future eliminar(Toping m) async { var r = await BaseService() .delete("admin/toping", body: {"id": m.id.toString()}); Map resJson = jsonDecode(r.body); if (r.statusCode == 200) {} } }