@page "/ajout/isbn"
@inject ServiceLivresApi Api
@inject NavigationManager Navigation
MaBibli — ajouter par ISBN
Ajouter par ISBN
@if (_etape == Etape.Saisie)
{
Saisissez l'ISBN imprimé sur le livre. Le scan par la caméra arrivera plus tard.
}
@if (_erreur is not null)
{
@_erreur
}
@foreach (var avertissement in _avertissements)
{
@avertissement
}
@if (_etape == Etape.Choix)
{
@* Décision actée dans CLAUDE.md : plusieurs notices pour un même ISBN (rééditions
successives partageant l'ISBN), on ne choisit JAMAIS à la place de l'utilisateur.
Les candidats partagent titre et auteur : ce sont l'éditeur et l'année qui départagent,
donc ils sont mis en avant. *@
@_candidats.Count notices correspondent à cet ISBN. Elles se distinguent par l'éditeur et l'année.
@foreach (var (candidat, index) in _candidats.Select((c, i) => (c, i)))
{
@candidat.Titre
@if (!string.IsNullOrWhiteSpace(candidat.Auteur))
{
@candidat.Auteur
}
@(candidat.Editeur ?? "éditeur inconnu")
@(candidat.Annee ?? "année inconnue")
@candidat.Source
@if (!string.IsNullOrWhiteSpace(candidat.IsbnInterroge))
{
trouvé via @candidat.IsbnInterroge
}
Choisir(candidat)">
Choisir cette édition
}
Aucune : saisir à la main
}
@if (_etape == Etape.Formulaire)
{
Vérifiez et complétez la fiche : tout reste modifiable.
}
@code {
private enum Etape { Saisie, Choix, Formulaire }
private Etape _etape = Etape.Saisie;
private string _isbn = string.Empty;
private bool _chargement;
private bool _enregistrement;
private string? _erreur;
private string? _erreurFormulaire;
private IReadOnlyList _candidats = [];
private IReadOnlyList _avertissements = [];
private EnregistrementLivre _saisie = new();
private async Task SurTouche(KeyboardEventArgs e)
{
if (e.Key == "Enter" && !string.IsNullOrWhiteSpace(_isbn))
{
await ChercherAsync();
}
}
private async Task ChercherAsync()
{
_chargement = true;
_erreur = null;
_avertissements = [];
try
{
var resultat = await Api.ChercherIsbnAsync(_isbn.Trim());
if (resultat is null)
{
_erreur = $"« {_isbn} » n'est pas un ISBN valide.";
return;
}
_avertissements = resultat.Avertissements;
_candidats = resultat.Candidats;
if (_candidats.Count == 0)
{
// Aucune notice : on ne bloque pas, le formulaire manuel reste la porte de sortie.
_erreur = "Aucune notice trouvée pour cet ISBN. Complétez la fiche à la main.";
_saisie = new EnregistrementLivre { Isbn = resultat.IsbnDemande };
_etape = Etape.Formulaire;
return;
}
if (_candidats.Count == 1)
{
Choisir(_candidats[0]);
return;
}
_etape = Etape.Choix;
}
catch (Exception ex)
{
_erreur = $"La recherche a échoué : {ex.Message}";
}
finally
{
_chargement = false;
}
}
private void Choisir(CandidatLivre candidat)
{
_saisie = new EnregistrementLivre
{
Isbn = _isbn.Trim(),
Titre = candidat.Titre,
Auteur = candidat.Auteur,
Editeur = candidat.Editeur,
CoverUrl = candidat.CoverUrl,
Format = Format.Physique,
Statut = Statut.ALire,
};
_erreur = null;
_etape = Etape.Formulaire;
}
private void Recommencer()
{
_etape = Etape.Saisie;
_erreur = null;
_erreurFormulaire = null;
_candidats = [];
}
private async Task EnregistrerAsync()
{
_enregistrement = true;
_erreurFormulaire = null;
var resultat = await Api.CreerAsync(_saisie);
_enregistrement = false;
if (!resultat.EstOk)
{
_erreurFormulaire = resultat.Erreur;
return;
}
Navigation.NavigateTo("/");
}
}