Formulaire multiple
Nous allons maintenant permettre à notre route de gérer plusieurs actions : ajout et suppression.
Modifier le module route pour permettre de retirer une track d'une playlist.
Guide
💿 Ajouter un formulaire
Nous allons donc ajouter un formulaire avec une méthode post sur chaque ligne correspond à la track d'une playlist.
Le formulaire aura :
- Un
inputde typehiddenpermettant d'envoyer l'informationtrack_idcorrespondant à l'id de la track à ajouter. - Un bouton
submitavec le nameactionet la valeurdelete
L'ajout d'un nom et d'une valeur au bouton submit va nous permettre d'identifier dans l'action quel bouton submit a été cliqué pour savoir quelle modification effectuer.
Voir une solution
export default function Playlists() {
//...
return (
//...
<li>
{/*...*/}
{isEditionMode && (
<Form method="post" className="inline">
<input name="track_id" type="hidden" value={track.id} />
<button type="submit" name="action" value="delete">
Remove
</button>
</Form>
)}
</li>
//...
);
}
💿 Mettre à jour le schéma Zod
Nous allons mettons mettre à jour notre schéma Zod pour s'assurer de la validité de notre requête.
Voir une solution
const FormDataRequestSchema = z.object({
track_id: z.string(),
action: z.enum(["add", "delete"]),
});
Suite à la modification ci-dessus, la requête doit forcément contenir une action. Nous allons ajouter au bouton Add le name action et la value add.
💿 Mettre à jour l'action
Nous allons maintenant pouvoir modifier l'action pour retirer la track correspondant au track_id lorsque l'action vaut delete.
Voir une solution
export const action = async ({ request, params: { id = "" } }: ActionArgs) => {
const rawFormData = Object.fromEntries(await request.formData());
const formData = FormDataRequestSchema.parse(rawFormData);
if (formData.action === "delete") {
await playlists.removeTrack(id, formData.track_id);
} else {
await playlists.addTrack(id, formData.track_id);
}
return null;
};
Entre nous, l'expérience utilisateur n'est pas forcément très fluide. Voyons maintenant comment l'améliorer