π Sistema Cart - Guida Rapida all'Integrazione β
π¦ File β
Store β
app/store/cart/cart.store.ts- Store Zustand con stato del carrello
Hooks β
app/hooks/ui/useTopbarCart.ts- Comunicazione con iframeapp/hooks/sync/useCartSyncListener.ts- Sincronizzazione tra tab
Component β
app/components/layout/topbar/cart.tsx- Componente UI del carrello
Tests β
tests/cart.store.test.ts- Test dello store (20 test) βtests/useCartSyncListener.test.ts- Test sincronizzazione (8 test) βtests/useTopbarCart.test.ts- Test comunicazione (12+ test) βtests/Cart.test.tsx- Test componente (15+ test) β
Documentazione β
docs/cart/cart-implementation.md- Documentazione completa
π Integrazione in 3 Passi β
Passo 1: Montare gli Hooks (Layout Autenticato) β
// app/components/layout/authenticated-layout.tsx
import { useTopbarCart } from "@/hooks/ui/useTopbarCart";
import { useCartSyncListener } from "@/hooks/sync/useCartSyncListener";
export function AuthenticatedLayout({ children }) {
useTopbarCart(); // Gestisce comunicazione con iframe
useCartSyncListener(); // Sincronizza tra tab
return (
<div>
<Topbar />
<main>{children}</main>
</div>
);
}Passo 2: Aggiungere il Componente alla Topbar β
// app/components/layout/topbar/nav-actions.tsx
import { Cart } from "@/components/layout/topbar/cart";
export function NavActions() {
return (
<nav className="navbar">
<ul className="nav-list">
<Cart />
{/* Altri elementi della topbar */}
</ul>
</nav>
);
}Passo 3: Configurare l'Iframe (legacy code) β
// Nell'iframe (legacy PHP/JavaScript)
// Quando il carrello viene aggiornato
function updateCartCounter(count) {
if (window.parent && window.parent.cart) {
window.parent.cart.setCounter(count);
}
}
// Dopo un'azione sul carrello
updateCartCounter(5); // Imposta contatore a 5β Verifiche Post-Integrazione β
1. Verifica Hook Montati β
Apri la console del browser e controlla i log:
[useTopbarCart] Hook montato, registrazione cart...
[useTopbarCart] β
Oggetto cart registrato su window2. Verifica Comunicazione Iframe β
Nella console dell'iframe, esegui:
window.parent.cart.setCounter(5);Dovresti vedere il badge del carrello aggiornarsi.
3. Verifica Sincronizzazione Multi-Tab β
- Apri due tab dello stesso sito
- In una tab, modifica il carrello
- Controlla che l'altra tab si sincronizzi automaticamente
- Log atteso:
[CartSyncListener] π Ricevuto aggiornamento carrello da altra tab
4. Verifica Dropdown β
- Clicca sul badge del carrello
- Verifica che il dropdown si apra
- Verifica che le voci siano visibili: Apri, Usa, Offline, Fastlabel, Svuota
5. Esegui i Test β
npm test -- cartDovresti vedere tutti i test passare (55+ test).
π§ Configurazione Opzionale β
Variabili Globali da Configurare β
// Nel tuo layout HTML o script di inizializzazione
window.base_url = "https://your-domain.com";
window.commoncart_btn_offline = true; // Mostra bottone Offline
window.commoncart_btn_fastlabel = true; // Mostra bottone FastlabelImplementare common_cart nell'Iframe β
// Nell'iframe (legacy code)
window.common_cart = {
read: function() {
// Leggi e ritorna il contenuto del carrello
console.log("read() chiamato dalla SPA");
},
open: function() {
// Naviga alla pagina del carrello
window.location.href = "/cart";
},
download: function() {
// Avvia il download del carrello
console.log("download() chiamato dalla SPA");
},
empty: function() {
// Svuota il carrello
console.log("empty() chiamato dalla SPA");
// Dopo aver svuotato, aggiorna il contatore
window.parent.cart.setCounter(0);
},
commoncart_clipboard_success: function() {
// Callback dopo successo copia Fastlabel
alert("Fastlabel copiato!");
},
commoncart_offline_clipboard_success: function() {
// Callback dopo successo copia Offline
alert("Dati offline copiati!");
}
};
// Imposta le risposte per clipboard
window.fastlabel_response = "FASTLABEL-CODES-HERE";
window.offline_response = "OFFLINE-DATA-HERE";π FunzionalitΓ Implementate β
β
Tutte le funzionalitΓ del legacy Cart.js β
- [x] Contatore articoli con badge
- [x] Evidenziazione quando
hasItems = true - [x] Dropdown con azioni
- [x] Azione "Apri" (apre carrello nell'iframe)
- [x] Azione "Usa" (scarica/usa carrello)
- [x] Azione "Offline" (copia dati offline in clipboard)
- [x] Azione "Fastlabel" (copia fastlabel in clipboard)
- [x] Azione "Svuota" (svuota carrello)
- [x] Gestione click esterni (chiude dropdown)
- [x] Comunicazione bidirezionale con iframe
- [x] Titolo dinamico basato su contatore
β Nuove funzionalitΓ moderne β
- [x] Sincronizzazione multi-tab (BroadcastChannel)
- [x] TypeScript con type safety completo
- [x] Store Zustand (stato globale persistente)
- [x] React hooks moderni
- [x] Clipboard API nativa (no dipendenze esterne)
- [x] Test coverage completo (55+ test)
- [x] Logging dettagliato per debug
- [x] Gestione errori robusta
- [x] Documentazione completa
π― Differenze con il Legacy β
| Feature | Legacy Cart.js | Nuovo Cart |
|---|---|---|
| Framework | Class Component | Function Component + Hooks |
| State Management | Local state | Zustand (global) |
| Multi-tab Sync | β No | β SΓ¬ (BroadcastChannel) |
| TypeScript | β No | β SΓ¬ (strict mode) |
| Testing | β No test | β 55+ test |
| Clipboard | react-clipboard.js | Clipboard API nativa |
| Documentation | β No | β Completa |
| Examples | β No | β 12 esempi |
π Troubleshooting β
Il carrello non appare β
Causa: Componente <Cart /> non montato Soluzione: Verifica di aver aggiunto <Cart /> alla topbar
Il contatore non si aggiorna β
Causa: Hook useTopbarCart non montato Soluzione: Verifica di aver aggiunto useTopbarCart() nel layout
Sincronizzazione non funziona β
Causa: Hook useCartSyncListener non montato Soluzione: Verifica di aver aggiunto useCartSyncListener() nel layout
Azioni non funzionano β
Causa: common_cart non definito nell'iframe Soluzione: Implementa window.common_cart nell'iframe (vedi sopra)
Offline/Fastlabel non visibili β
Causa: Flag globali non impostati Soluzione: Imposta window.commoncart_btn_offline e window.commoncart_btn_fastlabel
π Documentazione Completa β
Per maggiori dettagli consulta:
docs/cart/cart-implementation.md- Documentazione completa
π Riepilogo β
β Store Zustand: Gestione stato globale β Sincronizzazione: Automatica tra tab β Comunicazione: Bidirezionale con iframe β Componente: UI moderna e responsive β Test: 55+ test passati β TypeScript: Type safety completo β Documentazione: Completa ed esaustiva
Il sistema Γ¨ pronto per essere integrato! π