Comment sauvegarder une liste de pages récemment consultées avec Stimulus et localStorage
Créer une liste de “pages récemment consultées” peut améliorer significativement l’expérience utilisateur en fournissant une navigation facile et un historique du contenu récemment accédé. Puisque nous utilisons déjà Rails, nous allons tirer parti de Stimulus. De plus, au lieu de stocker les informations sur le serveur, nous utiliserons localStorage pour persister les données de pages consultées entre les sessions.
Pourquoi Utiliser Stimulus et localStorage ?
Habituellement pour les interactions UI, je préfère garder les choses aussi légères que possible. C’est pourquoi je préfère AlpineJS à Stimulus.
Cependant, dans ce cas, Stimulus est un bon choix car il y a un peu plus de logique dans le JavaScript.
Nous utiliserons également localStorage comme mécanisme de stockage côté client. C’est idéal pour sauvegarder des informations non sensibles comme l’historique des pages car les données sont stockées même après que l’utilisateur rafraîchit ou ferme le navigateur.
L’inconvénient d’utiliser localStorage est que si l’utilisateur se connecte depuis un autre ordinateur, cela n’est pas synchronisé. Il est possible de synchroniser ces informations avec une logique supplémentaire dans le contrôleur Stimulus, mais si votre cas d’utilisation est comme le mien, ce n’est probablement pas nécessaire.
L’Objectif
Notre objectif est de construire une liste de pages récemment consultées qui :
- Suit les pages visitées par l’utilisateur.
- Stocke des métadonnées comme le nom de la page et une courte description.
- Affiche jusqu’aux 20 dernières pages récemment visitées.
- Persiste ces données entre les sessions en utilisant
localStorage.
Le Contrôleur Stimulus
Ci-dessous se trouve un contrôleur Stimulus qui gère le suivi et le stockage des pages visitées par l’utilisateur :
// app/javascript/controllers/recently_viewed_controller.js
import { Controller } from "@hotwired/stimulus";
export default class extends Controller {
static targets = ["currentPath"];
connect() {
if (this.currentPathTargets.length !== 0) {
let name = this.currentPathTarget.dataset.name;
this.saveCurrentPath(name);
}
}
saveCurrentPath(name) {
let path = window.location.pathname;
// Créer un objet avec path, name et description
let pathObject = { path: path, name: name };
// Supprimer les objets existants avec le même path
let visitedPaths = this.removePathsContaining(path);
// Ajouter le nouvel objet au début du tableau
visitedPaths.unshift(pathObject);
// Garder seulement les 20 dernières entrées
if (visitedPaths.length > 20) {
visitedPaths = visitedPaths.slice(0, 20);
}
// Sauvegarder le tableau mis à jour dans localStorage
localStorage.setItem("visitedPath", JSON.stringify(visitedPaths));
}
removePathsContaining(substring) {
// Obtenir le tableau existant de localStorage
let visitedPaths = JSON.parse(localStorage.getItem("visitedPath")) || [];
// Filtrer les objets où le path contient la sous-chaîne
visitedPaths = visitedPaths.filter(
(item) => !item.path.includes(substring)
);
return visitedPaths;
}
resetPaths() {
// Effacer l'élément visitedPath de localStorage
localStorage.removeItem("visitedPath");
}
}
Pour activer ce contrôleur et suivre des pages spécifiques, vous devrez ajouter ceci à la balise body :
<body data-controller="smooth-scroll recently-viewed">
<div data-recently-viewed-target="currentPath" data-page-name="<%= @page_name %>">
</div>
/* Votre code */
</body>
Vous avez la possibilité de refactoriser le code ci-dessus ou de les combiner. Dans mon cas d’utilisation, je voulais ajouter le contrôleur à la balise body pour l’activer, puis optionnellement sauvegarder la page si j’ajoutais la balise div interne.
Utiliser la liste depuis localStorage
Maintenant que vous avez la liste, vous pouvez y accéder avec quelque chose comme ceci :
window.recentlyVisitedPaths = JSON.parse(localStorage.getItem("visitedPath")) || [];
Les valeurs seront maintenant retournées en JSON et vous pouvez les afficher en utilisant Stimulus ou quelque chose de similaire.
Derniere mise a jour le 31 août 2024