Communitygithub.com

YepAPI/compétences-ecommerce

Gestion du panier avec Zustand + persistance, variantes de produits, paiement Stripe, gestion des stocks et cycle de vie des commandes.

Qu'est-ce que compétences-ecommerce ?

Ce modèle de compétence e-commerce fournit une architecture complète pour construire une boutique en ligne moderne. Il utilise Zustand avec persistance `localStorage` pour gérer l'état du panier, garantissant qu'il survit au rechargement de la page et à la fermeture de l'onglet. Les variantes de produits sont modélisées en tant que SKU distincts avec un produit parent partagé, chacun ayant son propre prix, stock et image. Le processus de paiement est entièrement géré côté serveur via Stripe Checkout Sessions, empêchant toute manipulation des prix côté client. La gestion des stocks intègre une protection contre les conditions de concurrence grâce à des transactions de base de données, et le cycle de vie des commandes suit une progression stricte (pending → paid → shipped → delivered) basée uniquement sur les événements webhook de Stripe. Cette compétence est idéale pour les développeurs travaillant avec des agents comme Claude Code ou Cursor sur des projets e-commerce nécessitant une gestion fiable du panier, des paiements sécurisés et un suivi robuste des stocks et des commandes.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/YepAPI/skills/tree/HEAD/skills/e-commerce

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

E-Commerce

Règles

  • État du panier : store Zustand avec persistance localStorage — survit au rechargement de la page et à la fermeture de l'onglet
  • Variantes de produits : modélisées en tant que SKU distincts avec un produit parent partagé — chaque variante a son propre prix, stock et image
  • Paiement : Sessions de paiement Stripe (côté serveur) — n'envoyez jamais les prix depuis le client
  • Stocks : vérifiez le stock côté serveur avant de créer une session de paiement — protection contre les conditions de concurrence avec des transactions de base de données
  • Cycle de vie des commandes : pending → paid → shipped → delivered — mise à jour via des événements webhook, pas par des actions client
  • Liste des produits : filtrage/tri/pagination côté serveur — paramètres d'URL de recherche pour des vues filtrées partageables
  • Prix : stockés en centimes (entiers) — affichés avec Intl.NumberFormat et le code de la devise
  • Opérations sur le panier : ajouter, supprimer, mettre à jour la quantité, vider — valider le stock à chaque action sur le panier

Patterns

// Store Zustand du panier avec persistance
import { create } from "zustand";
import { persist } from "zustand/middleware";

interface CartItem { productId: string; variantId: string; quantity: number; price: number; }
interface CartStore {
  items: CartItem[];
  addItem: (item: CartItem) => void;
  removeItem: (variantId: string) => void;
  updateQuantity: (variantId: string, quantity: number) => void;
  clear: () => void;
  total: () => number;
}

export const useCart = create<CartStore>()(
  persist(
    (set, get) => ({
      items: [],
      addItem: (item) => set((state) => {
        const existing = state.items.find((i) => i.variantId === item.variantId);
        if (existing) {
          return { items: state.items.map((i) =>
            i.variantId === item.variantId ? { ...i, quantity: i.quantity + item.quantity } : i
          )};
        }
        return { items: [...state.items, item] };
      }),
      removeItem: (variantId) => set((s) => ({ items: s.items.filter((i) => i.variantId !== variantId) })),
      updateQuantity: (variantId, quantity) => set((s) => ({
        items: quantity <= 0
          ? s.items.filter((i) => i.variantId !== variantId)
          : s.items.map((i) => (i.variantId === variantId ? { ...i, quantity } : i)),
      })),
      clear: () => set({ items: [] }),
      total: () => get().items.reduce((sum, i) => sum + i.price * i.quantity, 0),
    }),
    { name: "cart-storage" }
  )
);

À éviter

  • Envoyer les prix depuis le client pour créer un paiement — résolvez toujours les prix côté serveur à partir de votre base de données
  • Stocker le panier uniquement dans l'état React — utilisez Zustand persistant ou localStorage pour que le panier survive au rechargement
  • Déduire le stock lors de l'ajout au panier — réservez le stock uniquement lors du paiement, libérez-le à l'expiration de la session
  • Mettre à jour le statut de la commande depuis le client — utilisez les webhooks Stripe pour checkout.session.completed
  • Utiliser des flottants pour l'argent — stockez en entiers (centimes), formatez uniquement pour l'affichage

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

YepAPI/skills

WCAG 2.1 AA — semantic HTML, keyboard navigation, screen readers.

YepAPI/skills

Experiment setup, variant splitting, statistical significance, and feature flag integration.

YepAPI/skills

CRUD generators, data tables, user management, role-based access, and bulk operations.

YepAPI/skills

Monitor what ChatGPT and Gemini say about your brand using YepAPI.

YepAPI/skills

Queue workers with BullMQ/Inngest/Trigger.dev, job retries, dead letter queues, concurrency.

YepAPI/skills

Commander.js, interactive prompts with Clack, spinners, colors, config files, exit codes, and npm publishing.

YepAPI/skills

cmdk integration, Cmd+K trigger, fuzzy search, grouped actions, keyboard navigation, and dynamic action registration.

YepAPI/skills

Content planning with trend and sentiment data from YepAPI.

YepAPI/skills

Content calendar, keyword-driven planning, and content briefs.

YepAPI/skills

Theme switching with CSS variables, system preference detection, next-themes, and persistence.

YepAPI/skills

Threaded comments, @mentions, reactions, moderation queue, optimistic UI, and cursor pagination.

YepAPI/skills

Competitive analysis between domains using YepAPI.

YepAPI/skills

Layout grids, KPI cards, data tables with sorting/filtering, sidebar navigation, and responsive breakpoints.

YepAPI/skills

Data encryption — TLS everywhere, AES-256-GCM for PII, bcrypt passwords, encrypted backups.

YepAPI/skills

Chart patterns with Recharts/Nivo/D3, responsive containers, color scales, and accessibility.

YepAPI/skills

Drizzle schema definition, push vs migrate, type-safe queries, relations, transactions, and prepared statements.

YepAPI/skills

Upload handling, resize/compress, CDN delivery, blur placeholders, and next/image patterns.

YepAPI/skills

Local business and Google Maps research using YepAPI.

YepAPI/skills

Cursor-based pagination, IntersectionObserver, virtualized lists with @tanstack/react-virtual, and scroll position restoration.

YepAPI/skills

Chat UI components, streaming responses with AI SDK, context window management, and RAG patterns.

Skills associés