42 lines
1.2 KiB
TypeScript
42 lines
1.2 KiB
TypeScript
|
|
import type { Plugin } from "nuxt/app";
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Client-side Pinia persistence plugin.
|
||
|
|
* Syncs the cart store to localStorage on every mutation and hydrates on load.
|
||
|
|
*/const STORAGE_KEY = "hms-cart";
|
||
|
|
|
||
|
|
export default defineNuxtPlugin(({ pinia }) => {
|
||
|
|
// Hydrate from localStorage on plugin load
|
||
|
|
if (import.meta.client) {
|
||
|
|
try {
|
||
|
|
const stored = localStorage.getItem(STORAGE_KEY);
|
||
|
|
if (stored) {
|
||
|
|
const parsed = JSON.parse(stored);
|
||
|
|
if (parsed && Array.isArray(parsed.items)) {
|
||
|
|
const cartStore = pinia._s.get("cart");
|
||
|
|
if (cartStore) {
|
||
|
|
cartStore.$patch({ items: parsed.items });
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
} catch (e) {
|
||
|
|
console.warn("Failed to hydrate cart from localStorage:", e);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Subscribe to cart store changes and persist
|
||
|
|
const cartStore = pinia._s.get("cart");
|
||
|
|
if (cartStore) {
|
||
|
|
cartStore.$subscribe((_mutation, state) => {
|
||
|
|
try {
|
||
|
|
localStorage.setItem(
|
||
|
|
STORAGE_KEY,
|
||
|
|
JSON.stringify({ items: state.items }),
|
||
|
|
);
|
||
|
|
} catch (e) {
|
||
|
|
console.warn("Failed to persist cart to localStorage:", e);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}) as Plugin;
|