Dashboard

Hook headless

useSitepingInbox — toute la logique de l'inbox, aucune interface. Construisez votre propre vue de tri.

Tout ce que fait SitepingInbox — chargement, filtres, mutations optimistes, annulation, pagination — vit dans un hook que vous pouvez piloter depuis vos propres composants :

import { useSitepingInbox } from "@siteping/dashboard";

const inbox = useSitepingInbox({
  projects: "mon-projet",
  endpoint: "/api/siteping",
});

Options

OptionTypeDéfautNotes
projectsstring ou string[]obligatoireUn tableau vide lève une erreur au rendu. La première entrée est sélectionnée au départ
endpointstringMode HTTP
storeSitepingStoreMode store — prioritaire sur endpoint
sourceInboxSourceSource de données entièrement personnalisée — prioritaire sur les deux ; voir Sources de données
apiKeystringAuthorization: Bearer sur chaque requête (mode endpoint)
headersobjet ou fonctionEn-têtes supplémentaires ; un Authorization explicite l'emporte sur apiKey. Lu en direct — le modifier ne reconstruit pas la source
pageSizenumber50Borné entre 1 et 100
onStatusChange(feedback, previousStatus) => voidAprès confirmation du serveur
onDelete(feedback) => voidAprès confirmation du serveur
onError(error) => voidChaque chargement ou mutation en échec

Ne fournir aucun de source / store / endpoint lève immédiatement — il n'y a pas de mode dégradé silencieux.

Ce que vous récupérez

Donnéesitems (toutes les pages chargées), total (null jusqu'à l'arrivée de la première page), counts (totaux par statut, au mieux), loading, loadingMore, error, hasMore, loadMore(), refresh().

Filtresproject/setProject, status/setStatus (démarre sur "open"), type/setType, search/setSearch. La recherche met l'état à jour instantanément et temporise le rechargement de 250 ms ; les requêtes sont nettoyées et plafonnées à 200 caractères.

Focus et tiroirfocusedId, focus(id), focusNext(), focusPrev(), openedId, opened (le feedback ouvert — il reste disponible même si un filtre retire sa ligne), openFeedback(id), closeFeedback().

MutationschangeStatus(id, status), deleteFeedback(id), pendingUndo, undo().

Les mutations sont optimistes — et elles relèvent l'erreur

L'interface se met à jour immédiatement ; si le serveur refuse, le hook annule tout (items, compteurs, focus, feedback ouvert) puis relève l'erreur. Attachez toujours un catch :

<button
  onClick={() => {
    inbox.changeStatus(item.id, "resolved").catch(() => {
      // l'état est déjà revenu en arrière — affichez un toast ici
    });
  }}
>
  Résoudre
</button>

Seul le dernier changement de statut est annulable (pendingUndo + undo()) ; la suppression est définitive, alors protégez-la derrière votre propre confirmation.

Pagination

loadMore() est manuel — le composant fourni affiche un bouton « Charger plus », pas un défilement infini. Les pages sont dédoublonnées par id, et le numéro de page suivant est déduit de items.length, donc les suppressions optimistes ne font jamais sauter de lignes.

Modifier sur GitHub

Sur cette page