Files
2026-07-08 14:44:09 +02:00

76 lines
2.3 KiB
Dart

import "package:flutter/material.dart";
import "../demo_identity.dart";
/// Représentation d'un matériel affiché dans le catalogue et son détail
/// à partir des réponses API.
class MaterielItem {
const MaterielItem({
required this.id,
required this.nom,
required this.categorie,
required this.marque,
required this.modele,
required this.reference,
required this.campus,
required this.etatGeneral,
required this.disponible,
required this.accessoires,
required this.icon,
});
/// Construit un MaterielItem depuis la réponse JSON du catalogue.
/// Les champs non fournis par cet endpoint (accessoires, icône) sont complétés.
factory MaterielItem.fromJson(Map<String, dynamic> json) {
final categorie = (json["categorie"] as Map<String, dynamic>)["nom"] as String;
final campus = json["campus"] as Map<String, dynamic>?;
final accessoires = json["accessoires"] as List<dynamic>?;
return MaterielItem(
id: json["id"] as int,
nom: json["nom"] as String,
categorie: categorie,
marque: json["marque"] as String,
modele: json["modele"] as String,
reference: json["reference"] as String,
campus: campus == null
? DemoIdentity.campusTag
: "${campus["nom"]} · ${campus["ville"]}",
etatGeneral: json["etatGeneral"] as String,
disponible: json["statut"] == "DISPONIBLE",
accessoires: accessoires == null ? const <String>[] : accessoires.cast<String>(),
icon: iconePourCategorie(categorie),
);
}
final int id;
final String nom;
final String categorie;
final String marque;
final String modele;
final String reference;
final String campus;
final String etatGeneral;
final bool disponible;
final List<String> accessoires;
final IconData icon;
}
/// Déduit une icône à partir du nom de catégorie renvoyé par l'API.
IconData iconePourCategorie(String categorie) {
switch (categorie) {
case "Ordinateur portable":
return Icons.laptop_mac;
case "Vidéoprojecteur":
return Icons.videocam_outlined;
case "Tablette":
return Icons.tablet_mac;
case "Caméra":
return Icons.photo_camera_outlined;
case "Périphérique audio":
return Icons.headphones;
case "Câble / Adaptateur":
return Icons.cable;
default:
return Icons.inventory_2_outlined;
}
}