@altazion/commerce-sdk-vue 26.407.7565 → 26.415.7673
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -1
- package/dist/index.cjs +22 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +25 -5
- package/dist/index.js +22 -13
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -26,6 +26,26 @@ app.use(AltazionCommercePlugin, {
|
|
|
26
26
|
app.mount('#app')
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
+
## Mode offline borne
|
|
30
|
+
|
|
31
|
+
Le package expose aussi un store dédié à l'état réseau et au mode d'écran terminal.
|
|
32
|
+
|
|
33
|
+
### `useConnectivityStore`
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
import { useConnectivityStore } from '@altazion/commerce-sdk-vue'
|
|
37
|
+
|
|
38
|
+
const connectivityStore = useConnectivityStore()
|
|
39
|
+
|
|
40
|
+
connectivityStore.status // 'online' | 'offline'
|
|
41
|
+
connectivityStore.isOnline // boolean
|
|
42
|
+
connectivityStore.isOffline // boolean
|
|
43
|
+
connectivityStore.screenMode // 'interactive' | 'offline'
|
|
44
|
+
connectivityStore.isInteractiveAvailable // boolean
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Cas d'usage typique sur borne : basculer vers un écran passif (pub, branding, attente) quand `screenMode === 'offline'`.
|
|
48
|
+
|
|
29
49
|
## Stores Pinia
|
|
30
50
|
|
|
31
51
|
### `useCartStore`
|
|
@@ -48,7 +68,6 @@ cartStore.total // total TTC (computed)
|
|
|
48
68
|
cartStore.isEmpty // boolean (computed)
|
|
49
69
|
cartStore.loading // boolean
|
|
50
70
|
cartStore.isOffline // boolean
|
|
51
|
-
cartStore.hasPendingOperations // mutations en attente de sync
|
|
52
71
|
```
|
|
53
72
|
|
|
54
73
|
### `useCatalogStore`
|
|
@@ -95,6 +114,21 @@ sessionStore.isKiosk // boolean
|
|
|
95
114
|
sessionStore.isReady // boolean
|
|
96
115
|
```
|
|
97
116
|
|
|
117
|
+
### Exemple de bascule d'écran
|
|
118
|
+
|
|
119
|
+
```vue
|
|
120
|
+
<script setup lang="ts">
|
|
121
|
+
import { useConnectivityStore } from '@altazion/commerce-sdk-vue'
|
|
122
|
+
|
|
123
|
+
const connectivityStore = useConnectivityStore()
|
|
124
|
+
</script>
|
|
125
|
+
|
|
126
|
+
<template>
|
|
127
|
+
<OfflineScreen v-if="connectivityStore.screenMode === 'offline'" />
|
|
128
|
+
<InteractiveApp v-else />
|
|
129
|
+
</template>
|
|
130
|
+
```
|
|
131
|
+
|
|
98
132
|
## Composants
|
|
99
133
|
|
|
100
134
|
### `<ProductCard>`
|
package/dist/index.cjs
CHANGED
|
@@ -20,6 +20,24 @@ function useCommerceClient() {
|
|
|
20
20
|
}
|
|
21
21
|
return client;
|
|
22
22
|
}
|
|
23
|
+
const useConnectivityStore = pinia.defineStore("altazion:connectivity", () => {
|
|
24
|
+
const client = useCommerceClient();
|
|
25
|
+
const status = vue.ref(client.connectivity.isOnline ? "online" : "offline");
|
|
26
|
+
client.connectivity.subscribe((nextStatus) => {
|
|
27
|
+
status.value = nextStatus;
|
|
28
|
+
});
|
|
29
|
+
const isOnline = vue.computed(() => status.value === "online");
|
|
30
|
+
const isOffline = vue.computed(() => status.value === "offline");
|
|
31
|
+
const screenMode = vue.computed(() => isOffline.value ? "offline" : "interactive");
|
|
32
|
+
const isInteractiveAvailable = vue.computed(() => !isOffline.value);
|
|
33
|
+
return {
|
|
34
|
+
status,
|
|
35
|
+
isOnline,
|
|
36
|
+
isOffline,
|
|
37
|
+
screenMode,
|
|
38
|
+
isInteractiveAvailable
|
|
39
|
+
};
|
|
40
|
+
});
|
|
23
41
|
const useSessionStore = pinia.defineStore("altazion:session", () => {
|
|
24
42
|
const client = useCommerceClient();
|
|
25
43
|
const session = vue.ref(null);
|
|
@@ -61,10 +79,6 @@ const useCartStore = pinia.defineStore("altazion:cart", () => {
|
|
|
61
79
|
const cart = vue.ref(null);
|
|
62
80
|
const loading = vue.ref(false);
|
|
63
81
|
const error = vue.ref(null);
|
|
64
|
-
const hasPendingOperations = vue.ref(false);
|
|
65
|
-
client.onQueueEvent(async () => {
|
|
66
|
-
hasPendingOperations.value = await client.pendingOperationsCount > 0;
|
|
67
|
-
});
|
|
68
82
|
const isOffline = vue.computed(() => client.isOffline);
|
|
69
83
|
const itemCount = vue.computed(() => {
|
|
70
84
|
var _a;
|
|
@@ -135,7 +149,6 @@ const useCartStore = pinia.defineStore("altazion:cart", () => {
|
|
|
135
149
|
loading,
|
|
136
150
|
error,
|
|
137
151
|
isOffline,
|
|
138
|
-
hasPendingOperations,
|
|
139
152
|
itemCount,
|
|
140
153
|
total,
|
|
141
154
|
isEmpty,
|
|
@@ -234,7 +247,7 @@ const _hoisted_8$1 = {
|
|
|
234
247
|
class: "altz-product-card__price--original"
|
|
235
248
|
};
|
|
236
249
|
const _hoisted_9$1 = { class: "altz-product-card__price--current" };
|
|
237
|
-
const _hoisted_10
|
|
250
|
+
const _hoisted_10 = {
|
|
238
251
|
key: 0,
|
|
239
252
|
class: "altz-product-card__unavailable"
|
|
240
253
|
};
|
|
@@ -275,7 +288,7 @@ const _sfc_main$2 = /* @__PURE__ */ vue.defineComponent({
|
|
|
275
288
|
__props.product.discountedPrice ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_8$1, vue.toDisplayString(__props.product.price.toFixed(2)) + " € ", 1)) : vue.createCommentVNode("", true),
|
|
276
289
|
vue.createElementVNode("span", _hoisted_9$1, vue.toDisplayString((__props.product.discountedPrice ?? __props.product.price).toFixed(2)) + " € ", 1)
|
|
277
290
|
]),
|
|
278
|
-
!__props.product.availableForOrder ? (vue.openBlock(), vue.createElementBlock("p", _hoisted_10
|
|
291
|
+
!__props.product.availableForOrder ? (vue.openBlock(), vue.createElementBlock("p", _hoisted_10, " Indisponible ")) : vue.createCommentVNode("", true),
|
|
279
292
|
__props.showAddToCart && __props.product.availableForOrder ? (vue.openBlock(), vue.createElementBlock("button", {
|
|
280
293
|
key: 1,
|
|
281
294
|
class: "altz-product-card__add-to-cart",
|
|
@@ -305,10 +318,6 @@ const _hoisted_6 = { class: "altz-cart-summary__line-qty" };
|
|
|
305
318
|
const _hoisted_7 = { class: "altz-cart-summary__line-price" };
|
|
306
319
|
const _hoisted_8 = { class: "altz-cart-summary__total" };
|
|
307
320
|
const _hoisted_9 = { class: "altz-cart-summary__total-amount" };
|
|
308
|
-
const _hoisted_10 = {
|
|
309
|
-
key: 1,
|
|
310
|
-
class: "altz-cart-summary__offline-notice"
|
|
311
|
-
};
|
|
312
321
|
const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
|
|
313
322
|
__name: "CartSummary",
|
|
314
323
|
props: {
|
|
@@ -338,8 +347,7 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
|
|
|
338
347
|
vue.createElementVNode("div", _hoisted_8, [
|
|
339
348
|
_cache[0] || (_cache[0] = vue.createElementVNode("span", { class: "altz-cart-summary__total-label" }, "Total", -1)),
|
|
340
349
|
vue.createElementVNode("span", _hoisted_9, vue.toDisplayString(vue.unref(cartStore).total.toFixed(2)) + " €", 1)
|
|
341
|
-
])
|
|
342
|
-
vue.unref(cartStore).hasPendingOperations ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_10, " Modifications en attente de synchronisation… ")) : vue.createCommentVNode("", true)
|
|
350
|
+
])
|
|
343
351
|
], 64))
|
|
344
352
|
]);
|
|
345
353
|
};
|
|
@@ -383,6 +391,7 @@ exports.ProductCard = _sfc_main$2;
|
|
|
383
391
|
exports.useCartStore = useCartStore;
|
|
384
392
|
exports.useCatalogStore = useCatalogStore;
|
|
385
393
|
exports.useCommerceClient = useCommerceClient;
|
|
394
|
+
exports.useConnectivityStore = useConnectivityStore;
|
|
386
395
|
exports.useSearchStore = useSearchStore;
|
|
387
396
|
exports.useSessionStore = useSessionStore;
|
|
388
397
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/plugin.ts","../src/composables/useCommerceClient.ts","../src/stores/useSessionStore.ts","../src/stores/useCartStore.ts","../src/stores/useCatalogStore.ts","../src/stores/useSearchStore.ts","../src/components/ProductCard.vue","../src/components/CartSummary.vue","../src/components/AddToCartButton.vue"],"sourcesContent":["import type { App } from 'vue'\nimport { createPinia, type Pinia } from 'pinia'\nimport type { CommerceClient } from '@altazion/commerce-sdk-core'\n\nexport const COMMERCE_CLIENT_KEY = Symbol('altazion:commerce-client')\n\nexport interface AltazionCommercePluginOptions {\n client: CommerceClient\n /** Pinia instance existante (optionnel — le plugin en crée une si absent) */\n pinia?: Pinia\n}\n\n/**\n * Plugin Vue 3 pour le SDK Altazion Commerce.\n *\n * Usage :\n * ```ts\n * import { createApp } from 'vue'\n * import { CommerceClient } from '@altazion/commerce-sdk-core'\n * import { AltazionCommercePlugin } from '@altazion/commerce-sdk-vue'\n *\n * const client = new CommerceClient({ baseUrl: '...', siteUrl: window.location.href })\n * await client.initialize()\n *\n * createApp(App)\n * .use(AltazionCommercePlugin, { client })\n * .mount('#app')\n * ```\n */\nexport const AltazionCommercePlugin = {\n install(app: App, options: AltazionCommercePluginOptions): void {\n const { client, pinia } = options\n\n // Installer Pinia si pas déjà présente\n const piniaInstance = pinia ?? createPinia()\n app.use(piniaInstance)\n\n // Rendre le client accessible via inject()\n app.provide(COMMERCE_CLIENT_KEY, client)\n }\n}\n","import { inject } from 'vue'\nimport { COMMERCE_CLIENT_KEY } from '../plugin.js'\nimport type { CommerceClient } from '@altazion/commerce-sdk-core'\n\n/**\n * Composable pour accéder au CommerceClient injecté par AltazionCommercePlugin.\n * Doit être utilisé dans un composant Vue (setup()) ou un store Pinia.\n */\nexport function useCommerceClient(): CommerceClient {\n const client = inject<CommerceClient>(COMMERCE_CLIENT_KEY)\n if (!client) {\n throw new Error(\n '[AltazionCommerce] useCommerceClient() : aucun client trouvé. ' +\n 'Assurez-vous d\\'avoir installé AltazionCommercePlugin via app.use().'\n )\n }\n return client\n}\n","import { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { SessionInfo, ConnectivityStatus } from '@altazion/commerce-sdk-core'\n\nexport const useSessionStore = defineStore('altazion:session', () => {\n const client = useCommerceClient()\n\n const session = ref<SessionInfo | null>(null)\n const loading = ref(false)\n const error = ref<string | null>(null)\n\n const isOnline = ref(client.connectivity.isOnline)\n client.connectivity.subscribe((status: ConnectivityStatus) => {\n isOnline.value = status === 'online'\n })\n\n const mode = computed(() => client.context.mode)\n const isKiosk = computed(() => mode.value === 'kiosk')\n const isReady = computed(() => session.value !== null || mode.value === 'kiosk')\n\n async function load(): Promise<void> {\n loading.value = true\n error.value = null\n try {\n session.value = await client.session.getSession()\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function associateStore(storeGuid: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n session.value = await client.session.associateStore(storeGuid)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n return { session, loading, error, isOnline, mode, isKiosk, isReady, load, associateStore }\n})\n","import { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { Cart } from '@altazion/commerce-sdk-core'\n\nexport const useCartStore = defineStore('altazion:cart', () => {\n const client = useCommerceClient()\n\n const cart = ref<Cart | null>(null)\n const loading = ref(false)\n const error = ref<string | null>(null)\n const hasPendingOperations = ref(false)\n\n // Mise à jour de hasPendingOperations via la file offline\n client.onQueueEvent(async () => {\n hasPendingOperations.value = (await client.pendingOperationsCount) > 0\n })\n\n const isOffline = computed(() => client.isOffline)\n const itemCount = computed(() => cart.value?.totalQuantity ?? 0)\n const total = computed(() => cart.value?.totalAmountWithTax ?? 0)\n const isEmpty = computed(() => itemCount.value === 0)\n\n async function load(): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.getCart()\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function addItem(reference: string, quantity: number, options?: Record<string, unknown>): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.addItem(reference, quantity, options)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function updateItem(lineId: string, quantity: number): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.updateItem(lineId, quantity)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function removeItem(lineId: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.removeItem(lineId)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function applyCoupon(code: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.applyCoupon(code)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n return {\n cart, loading, error, isOffline, hasPendingOperations,\n itemCount, total, isEmpty,\n load, addItem, updateItem, removeItem, applyCoupon\n }\n})\n","import { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { ProductDetails, SearchResult, SearchRequest } from '@altazion/commerce-sdk-core'\n\nexport const useCatalogStore = defineStore('altazion:catalog', () => {\n const client = useCommerceClient()\n\n const currentProduct = ref<ProductDetails | null>(null)\n const categoryResult = ref<SearchResult | null>(null)\n const loading = ref(false)\n const error = ref<string | null>(null)\n\n const isOffline = computed(() => client.isOffline)\n\n async function loadProduct(reference: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n currentProduct.value = await client.catalog.getProduct(reference)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function loadCategory(categoryCode: string, pageIndex = 0, pageSize = 20): Promise<void> {\n loading.value = true\n error.value = null\n try {\n categoryResult.value = await client.catalog.getCategory(categoryCode, pageIndex, pageSize)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n return {\n currentProduct, categoryResult, loading, error, isOffline,\n loadProduct, loadCategory\n }\n})\n","import { defineStore } from 'pinia'\nimport { ref } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { SearchResult, SearchRequest } from '@altazion/commerce-sdk-core'\n\nexport const useSearchStore = defineStore('altazion:search', () => {\n const client = useCommerceClient()\n\n const result = ref<SearchResult | null>(null)\n const suggestions = ref<string[]>([])\n const loading = ref(false)\n const error = ref<string | null>(null)\n const query = ref('')\n\n async function search(request: SearchRequest): Promise<void> {\n query.value = request.q ?? ''\n loading.value = true\n error.value = null\n try {\n result.value = await client.catalog.search(request)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function suggest(q: string): Promise<void> {\n if (!q.trim()) { suggestions.value = []; return }\n try {\n suggestions.value = await client.catalog.suggest(q)\n } catch {\n suggestions.value = []\n }\n }\n\n function clear(): void {\n result.value = null\n suggestions.value = []\n query.value = ''\n }\n\n return { result, suggestions, loading, error, query, search, suggest, clear }\n})\n","<script setup lang=\"ts\">\nimport type { WebProduct } from '@altazion/commerce-sdk-core'\nimport { useCartStore } from '../stores/useCartStore.js'\n\nconst props = defineProps<{\n product: WebProduct\n showAddToCart?: boolean\n}>()\n\nconst cartStore = useCartStore()\n\nasync function addToCart(): Promise<void> {\n await cartStore.addItem(props.product.sku ?? props.product.guid, 1)\n}\n</script>\n\n<template>\n <article class=\"altz-product-card\">\n <a :href=\"product.externalUrl ?? '#'\" class=\"altz-product-card__image-link\">\n <img\n v-if=\"product.mainImage\"\n :src=\"product.mainImage\"\n :alt=\"product.label ?? undefined\"\n class=\"altz-product-card__image\"\n loading=\"lazy\"\n />\n </a>\n\n <div class=\"altz-product-card__body\">\n <h3 class=\"altz-product-card__title\">\n <a :href=\"product.externalUrl ?? '#'\">{{ product.label }}</a>\n </h3>\n\n <div class=\"altz-product-card__price\">\n <span\n v-if=\"product.discountedPrice\"\n class=\"altz-product-card__price--original\"\n >\n {{ product.price.toFixed(2) }} €\n </span>\n <span class=\"altz-product-card__price--current\">\n {{ (product.discountedPrice ?? product.price).toFixed(2) }} €\n </span>\n </div>\n\n <p v-if=\"!product.availableForOrder\" class=\"altz-product-card__unavailable\">\n Indisponible\n </p>\n\n <button\n v-if=\"showAddToCart && product.availableForOrder\"\n class=\"altz-product-card__add-to-cart\"\n :disabled=\"cartStore.loading\"\n @click=\"addToCart\"\n >\n Ajouter au panier\n </button>\n </div>\n </article>\n</template>\n","<script setup lang=\"ts\">\nimport { onMounted } from 'vue'\nimport { useCartStore } from '../stores/useCartStore.js'\n\nconst props = defineProps<{\n showLines?: boolean\n}>()\n\nconst cartStore = useCartStore()\n\nonMounted(() => { cartStore.load() })\n</script>\n\n<template>\n <div class=\"altz-cart-summary\">\n <div v-if=\"cartStore.loading\" class=\"altz-cart-summary__loading\">\n Chargement du panier…\n </div>\n\n <div v-else-if=\"cartStore.isEmpty\" class=\"altz-cart-summary__empty\">\n Votre panier est vide.\n </div>\n\n <template v-else>\n <div v-if=\"showLines\" class=\"altz-cart-summary__lines\">\n <div\n v-for=\"line in cartStore.cart?.content?.flatMap(g => g.lines ?? [])\"\n :key=\"line.id\"\n class=\"altz-cart-summary__line\"\n >\n <span class=\"altz-cart-summary__line-label\">{{ line.label }}</span>\n <span class=\"altz-cart-summary__line-qty\">× {{ line.quantity }}</span>\n <span class=\"altz-cart-summary__line-price\">{{ (line.finalUnitPriceInclTax * line.quantity).toFixed(2) }} €</span>\n </div>\n </div>\n\n <div class=\"altz-cart-summary__total\">\n <span class=\"altz-cart-summary__total-label\">Total</span>\n <span class=\"altz-cart-summary__total-amount\">{{ cartStore.total.toFixed(2) }} €</span>\n </div>\n\n <div v-if=\"cartStore.hasPendingOperations\" class=\"altz-cart-summary__offline-notice\">\n Modifications en attente de synchronisation…\n </div>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { useCartStore } from '../stores/useCartStore.js'\n\nconst props = defineProps<{\n reference: string\n quantity?: number\n label?: string\n disabled?: boolean\n}>()\n\nconst cartStore = useCartStore()\n\nasync function handleClick(): Promise<void> {\n if (props.disabled) return\n await cartStore.addItem(props.reference, props.quantity ?? 1)\n}\n</script>\n\n<template>\n <button\n class=\"altz-add-to-cart\"\n :disabled=\"disabled || cartStore.loading\"\n :aria-busy=\"cartStore.loading\"\n @click=\"handleClick\"\n >\n <slot>{{ label ?? 'Ajouter au panier' }}</slot>\n </button>\n</template>\n"],"names":["pinia","createPinia","inject","defineStore","ref","computed","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_4","_hoisted_5","_toDisplayString","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_unref","onMounted","_Fragment","_renderList","_renderSlot"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/plugin.ts","../src/composables/useCommerceClient.ts","../src/stores/useConnectivityStore.ts","../src/stores/useSessionStore.ts","../src/stores/useCartStore.ts","../src/stores/useCatalogStore.ts","../src/stores/useSearchStore.ts","../src/components/ProductCard.vue","../src/components/CartSummary.vue","../src/components/AddToCartButton.vue"],"sourcesContent":["import type { App } from 'vue'\nimport { createPinia, type Pinia } from 'pinia'\nimport type { CommerceClient } from '@altazion/commerce-sdk-core'\n\nexport const COMMERCE_CLIENT_KEY = Symbol('altazion:commerce-client')\n\nexport interface AltazionCommercePluginOptions {\n client: CommerceClient\n /** Pinia instance existante (optionnel — le plugin en crée une si absent) */\n pinia?: Pinia\n}\n\n/**\n * Plugin Vue 3 pour le SDK Altazion Commerce.\n *\n * Usage :\n * ```ts\n * import { createApp } from 'vue'\n * import { CommerceClient } from '@altazion/commerce-sdk-core'\n * import { AltazionCommercePlugin } from '@altazion/commerce-sdk-vue'\n *\n * const client = new CommerceClient({ baseUrl: '...', siteUrl: window.location.href })\n * await client.initialize()\n *\n * createApp(App)\n * .use(AltazionCommercePlugin, { client })\n * .mount('#app')\n * ```\n */\nexport const AltazionCommercePlugin = {\n install(app: App, options: AltazionCommercePluginOptions): void {\n const { client, pinia } = options\n\n // Installer Pinia si pas déjà présente\n const piniaInstance = pinia ?? createPinia()\n app.use(piniaInstance)\n\n // Rendre le client accessible via inject()\n app.provide(COMMERCE_CLIENT_KEY, client)\n }\n}\n","import { inject } from 'vue'\nimport { COMMERCE_CLIENT_KEY } from '../plugin.js'\nimport type { CommerceClient } from '@altazion/commerce-sdk-core'\n\n/**\n * Composable pour accéder au CommerceClient injecté par AltazionCommercePlugin.\n * Doit être utilisé dans un composant Vue (setup()) ou un store Pinia.\n */\nexport function useCommerceClient(): CommerceClient {\n const client = inject<CommerceClient>(COMMERCE_CLIENT_KEY)\n if (!client) {\n throw new Error(\n '[AltazionCommerce] useCommerceClient() : aucun client trouvé. ' +\n 'Assurez-vous d\\'avoir installé AltazionCommercePlugin via app.use().'\n )\n }\n return client\n}\n","import { defineStore } from 'pinia'\nimport { computed, ref } from 'vue'\nimport type { ConnectivityStatus } from '@altazion/commerce-sdk-core'\n\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\n\nexport type TerminalScreenMode = 'interactive' | 'offline'\n\nexport const useConnectivityStore = defineStore('altazion:connectivity', () => {\n const client = useCommerceClient()\n\n const status = ref<ConnectivityStatus>(client.connectivity.isOnline ? 'online' : 'offline')\n\n client.connectivity.subscribe((nextStatus: ConnectivityStatus) => {\n status.value = nextStatus\n })\n\n const isOnline = computed(() => status.value === 'online')\n const isOffline = computed(() => status.value === 'offline')\n const screenMode = computed<TerminalScreenMode>(() => isOffline.value ? 'offline' : 'interactive')\n const isInteractiveAvailable = computed(() => !isOffline.value)\n\n return {\n status,\n isOnline,\n isOffline,\n screenMode,\n isInteractiveAvailable,\n }\n})","import { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { SessionInfo, ConnectivityStatus } from '@altazion/commerce-sdk-core'\n\nexport const useSessionStore = defineStore('altazion:session', () => {\n const client = useCommerceClient()\n\n const session = ref<SessionInfo | null>(null)\n const loading = ref(false)\n const error = ref<string | null>(null)\n\n const isOnline = ref(client.connectivity.isOnline)\n client.connectivity.subscribe((status: ConnectivityStatus) => {\n isOnline.value = status === 'online'\n })\n\n const mode = computed(() => client.context.mode)\n const isKiosk = computed(() => mode.value === 'kiosk')\n const isReady = computed(() => session.value !== null || mode.value === 'kiosk')\n\n async function load(): Promise<void> {\n loading.value = true\n error.value = null\n try {\n session.value = await client.session.getSession()\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function associateStore(storeGuid: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n session.value = await client.session.associateStore(storeGuid)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n return { session, loading, error, isOnline, mode, isKiosk, isReady, load, associateStore }\n})\n","import { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { Cart } from '@altazion/commerce-sdk-core'\n\nexport const useCartStore = defineStore('altazion:cart', () => {\n const client = useCommerceClient()\n\n const cart = ref<Cart | null>(null)\n const loading = ref(false)\n const error = ref<string | null>(null)\n\n const isOffline = computed(() => client.isOffline)\n const itemCount = computed(() => cart.value?.totalQuantity ?? 0)\n const total = computed(() => cart.value?.totalAmountWithTax ?? 0)\n const isEmpty = computed(() => itemCount.value === 0)\n\n async function load(): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.getCart()\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function addItem(reference: string, quantity: number, options?: Record<string, unknown>): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.addItem(reference, quantity, options)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function updateItem(lineId: string, quantity: number): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.updateItem(lineId, quantity)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function removeItem(lineId: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.removeItem(lineId)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function applyCoupon(code: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.applyCoupon(code)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n return {\n cart, loading, error, isOffline,\n itemCount, total, isEmpty,\n load, addItem, updateItem, removeItem, applyCoupon\n }\n})\n","import { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { ProductDetails, SearchResult, SearchRequest } from '@altazion/commerce-sdk-core'\n\nexport const useCatalogStore = defineStore('altazion:catalog', () => {\n const client = useCommerceClient()\n\n const currentProduct = ref<ProductDetails | null>(null)\n const categoryResult = ref<SearchResult | null>(null)\n const loading = ref(false)\n const error = ref<string | null>(null)\n\n const isOffline = computed(() => client.isOffline)\n\n async function loadProduct(reference: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n currentProduct.value = await client.catalog.getProduct(reference)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function loadCategory(categoryCode: string, pageIndex = 0, pageSize = 20): Promise<void> {\n loading.value = true\n error.value = null\n try {\n categoryResult.value = await client.catalog.getCategory(categoryCode, pageIndex, pageSize)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n return {\n currentProduct, categoryResult, loading, error, isOffline,\n loadProduct, loadCategory\n }\n})\n","import { defineStore } from 'pinia'\nimport { ref } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { SearchResult, SearchRequest } from '@altazion/commerce-sdk-core'\n\nexport const useSearchStore = defineStore('altazion:search', () => {\n const client = useCommerceClient()\n\n const result = ref<SearchResult | null>(null)\n const suggestions = ref<string[]>([])\n const loading = ref(false)\n const error = ref<string | null>(null)\n const query = ref('')\n\n async function search(request: SearchRequest): Promise<void> {\n query.value = request.q ?? ''\n loading.value = true\n error.value = null\n try {\n result.value = await client.catalog.search(request)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function suggest(q: string): Promise<void> {\n if (!q.trim()) { suggestions.value = []; return }\n try {\n suggestions.value = await client.catalog.suggest(q)\n } catch {\n suggestions.value = []\n }\n }\n\n function clear(): void {\n result.value = null\n suggestions.value = []\n query.value = ''\n }\n\n return { result, suggestions, loading, error, query, search, suggest, clear }\n})\n","<script setup lang=\"ts\">\nimport type { WebProduct } from '@altazion/commerce-sdk-core'\nimport { useCartStore } from '../stores/useCartStore.js'\n\nconst props = defineProps<{\n product: WebProduct\n showAddToCart?: boolean\n}>()\n\nconst cartStore = useCartStore()\n\nasync function addToCart(): Promise<void> {\n await cartStore.addItem(props.product.sku ?? props.product.guid, 1)\n}\n</script>\n\n<template>\n <article class=\"altz-product-card\">\n <a :href=\"product.externalUrl ?? '#'\" class=\"altz-product-card__image-link\">\n <img\n v-if=\"product.mainImage\"\n :src=\"product.mainImage\"\n :alt=\"product.label ?? undefined\"\n class=\"altz-product-card__image\"\n loading=\"lazy\"\n />\n </a>\n\n <div class=\"altz-product-card__body\">\n <h3 class=\"altz-product-card__title\">\n <a :href=\"product.externalUrl ?? '#'\">{{ product.label }}</a>\n </h3>\n\n <div class=\"altz-product-card__price\">\n <span\n v-if=\"product.discountedPrice\"\n class=\"altz-product-card__price--original\"\n >\n {{ product.price.toFixed(2) }} €\n </span>\n <span class=\"altz-product-card__price--current\">\n {{ (product.discountedPrice ?? product.price).toFixed(2) }} €\n </span>\n </div>\n\n <p v-if=\"!product.availableForOrder\" class=\"altz-product-card__unavailable\">\n Indisponible\n </p>\n\n <button\n v-if=\"showAddToCart && product.availableForOrder\"\n class=\"altz-product-card__add-to-cart\"\n :disabled=\"cartStore.loading\"\n @click=\"addToCart\"\n >\n Ajouter au panier\n </button>\n </div>\n </article>\n</template>\n","<script setup lang=\"ts\">\nimport { onMounted } from 'vue'\nimport { useCartStore } from '../stores/useCartStore.js'\n\nconst props = defineProps<{\n showLines?: boolean\n}>()\n\nconst cartStore = useCartStore()\n\nonMounted(() => { cartStore.load() })\n</script>\n\n<template>\n <div class=\"altz-cart-summary\">\n <div v-if=\"cartStore.loading\" class=\"altz-cart-summary__loading\">\n Chargement du panier…\n </div>\n\n <div v-else-if=\"cartStore.isEmpty\" class=\"altz-cart-summary__empty\">\n Votre panier est vide.\n </div>\n\n <template v-else>\n <div v-if=\"showLines\" class=\"altz-cart-summary__lines\">\n <div\n v-for=\"line in cartStore.cart?.content?.flatMap(g => g.lines ?? [])\"\n :key=\"line.id\"\n class=\"altz-cart-summary__line\"\n >\n <span class=\"altz-cart-summary__line-label\">{{ line.label }}</span>\n <span class=\"altz-cart-summary__line-qty\">× {{ line.quantity }}</span>\n <span class=\"altz-cart-summary__line-price\">{{ (line.finalUnitPriceInclTax * line.quantity).toFixed(2) }} €</span>\n </div>\n </div>\n\n <div class=\"altz-cart-summary__total\">\n <span class=\"altz-cart-summary__total-label\">Total</span>\n <span class=\"altz-cart-summary__total-amount\">{{ cartStore.total.toFixed(2) }} €</span>\n </div>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { useCartStore } from '../stores/useCartStore.js'\n\nconst props = defineProps<{\n reference: string\n quantity?: number\n label?: string\n disabled?: boolean\n}>()\n\nconst cartStore = useCartStore()\n\nasync function handleClick(): Promise<void> {\n if (props.disabled) return\n await cartStore.addItem(props.reference, props.quantity ?? 1)\n}\n</script>\n\n<template>\n <button\n class=\"altz-add-to-cart\"\n :disabled=\"disabled || cartStore.loading\"\n :aria-busy=\"cartStore.loading\"\n @click=\"handleClick\"\n >\n <slot>{{ label ?? 'Ajouter au panier' }}</slot>\n </button>\n</template>\n"],"names":["pinia","createPinia","inject","defineStore","ref","computed","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_4","_hoisted_5","_toDisplayString","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_unref","onMounted","_Fragment","_renderList","_renderSlot"],"mappings":";;;;AAIO,MAAM,sBAAsB,OAAO,0BAA0B;AAyB7D,MAAM,yBAAyB;AAAA,EACpC,QAAQ,KAAU,SAA8C;AAC9D,UAAM,EAAE,eAAQA,QAAA,IAAU;AAG1B,UAAM,gBAAgBA,WAASC,kBAAA;AAC/B,QAAI,IAAI,aAAa;AAGrB,QAAI,QAAQ,qBAAqB,MAAM;AAAA,EACzC;AACF;AChCO,SAAS,oBAAoC;AAClD,QAAM,SAASC,IAAAA,OAAuB,mBAAmB;AACzD,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAAA,EAGJ;AACA,SAAO;AACT;ACTO,MAAM,uBAAuBC,MAAAA,YAAY,yBAAyB,MAAM;AAC7E,QAAM,SAAS,kBAAA;AAEf,QAAM,SAASC,IAAAA,IAAwB,OAAO,aAAa,WAAW,WAAW,SAAS;AAE1F,SAAO,aAAa,UAAU,CAAC,eAAmC;AAChE,WAAO,QAAQ;AAAA,EACjB,CAAC;AAED,QAAM,WAAWC,IAAAA,SAAS,MAAM,OAAO,UAAU,QAAQ;AACzD,QAAM,YAAYA,IAAAA,SAAS,MAAM,OAAO,UAAU,SAAS;AAC3D,QAAM,aAAaA,IAAAA,SAA6B,MAAM,UAAU,QAAQ,YAAY,aAAa;AACjG,QAAM,yBAAyBA,IAAAA,SAAS,MAAM,CAAC,UAAU,KAAK;AAE9D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ,CAAC;ACxBM,MAAM,kBAAkBF,MAAAA,YAAY,oBAAoB,MAAM;AACnE,QAAM,SAAS,kBAAA;AAEf,QAAM,UAAUC,IAAAA,IAAwB,IAAI;AAC5C,QAAM,UAAUA,IAAAA,IAAI,KAAK;AACzB,QAAM,QAAQA,IAAAA,IAAmB,IAAI;AAErC,QAAM,WAAWA,IAAAA,IAAI,OAAO,aAAa,QAAQ;AACjD,SAAO,aAAa,UAAU,CAAC,WAA+B;AAC5D,aAAS,QAAQ,WAAW;AAAA,EAC9B,CAAC;AAED,QAAM,OAAOC,IAAAA,SAAS,MAAM,OAAO,QAAQ,IAAI;AAC/C,QAAM,UAAUA,IAAAA,SAAS,MAAM,KAAK,UAAU,OAAO;AACrD,QAAM,UAAUA,IAAAA,SAAS,MAAM,QAAQ,UAAU,QAAQ,KAAK,UAAU,OAAO;AAE/E,iBAAe,OAAsB;AACnC,YAAQ,QAAQ;AAChB,UAAM,QAAQ;AACd,QAAI;AACF,cAAQ,QAAQ,MAAM,OAAO,QAAQ,WAAA;AAAA,IACvC,SAAS,KAAK;AACZ,YAAM,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IAC/D,UAAA;AACE,cAAQ,QAAQ;AAAA,IAClB;AAAA,EACF;AAEA,iBAAe,eAAe,WAAkC;AAC9D,YAAQ,QAAQ;AAChB,UAAM,QAAQ;AACd,QAAI;AACF,cAAQ,QAAQ,MAAM,OAAO,QAAQ,eAAe,SAAS;AAAA,IAC/D,SAAS,KAAK;AACZ,YAAM,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IAC/D,UAAA;AACE,cAAQ,QAAQ;AAAA,IAClB;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,SAAS,OAAO,UAAU,MAAM,SAAS,SAAS,MAAM,eAAA;AAC5E,CAAC;ACzCM,MAAM,eAAeF,MAAAA,YAAY,iBAAiB,MAAM;AAC7D,QAAM,SAAS,kBAAA;AAEf,QAAM,OAAOC,IAAAA,IAAiB,IAAI;AAClC,QAAM,UAAUA,IAAAA,IAAI,KAAK;AACzB,QAAM,QAAQA,IAAAA,IAAmB,IAAI;AAErC,QAAM,YAAYC,IAAAA,SAAS,MAAM,OAAO,SAAS;AACjD,QAAM,YAAYA,IAAAA,SAAS,MAAA;;AAAM,uBAAK,UAAL,mBAAY,kBAAiB;AAAA,GAAC;AAC/D,QAAM,QAAQA,IAAAA,SAAS,MAAA;;AAAM,uBAAK,UAAL,mBAAY,uBAAsB;AAAA,GAAC;AAChE,QAAM,UAAUA,IAAAA,SAAS,MAAM,UAAU,UAAU,CAAC;AAEpD,iBAAe,OAAsB;AACnC,YAAQ,QAAQ;AAChB,UAAM,QAAQ;AACd,QAAI;AACF,WAAK,QAAQ,MAAM,OAAO,KAAK,QAAA;AAAA,IACjC,SAAS,KAAK;AACZ,YAAM,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IAC/D,UAAA;AACE,cAAQ,QAAQ;AAAA,IAClB;AAAA,EACF;AAEA,iBAAe,QAAQ,WAAmB,UAAkB,SAAkD;AAC5G,YAAQ,QAAQ;AAChB,UAAM,QAAQ;AACd,QAAI;AACF,WAAK,QAAQ,MAAM,OAAO,KAAK,QAAQ,WAAW,UAAU,OAAO;AAAA,IACrE,SAAS,KAAK;AACZ,YAAM,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IAC/D,UAAA;AACE,cAAQ,QAAQ;AAAA,IAClB;AAAA,EACF;AAEA,iBAAe,WAAW,QAAgB,UAAiC;AACzE,YAAQ,QAAQ;AAChB,UAAM,QAAQ;AACd,QAAI;AACF,WAAK,QAAQ,MAAM,OAAO,KAAK,WAAW,QAAQ,QAAQ;AAAA,IAC5D,SAAS,KAAK;AACZ,YAAM,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IAC/D,UAAA;AACE,cAAQ,QAAQ;AAAA,IAClB;AAAA,EACF;AAEA,iBAAe,WAAW,QAA+B;AACvD,YAAQ,QAAQ;AAChB,UAAM,QAAQ;AACd,QAAI;AACF,WAAK,QAAQ,MAAM,OAAO,KAAK,WAAW,MAAM;AAAA,IAClD,SAAS,KAAK;AACZ,YAAM,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IAC/D,UAAA;AACE,cAAQ,QAAQ;AAAA,IAClB;AAAA,EACF;AAEA,iBAAe,YAAY,MAA6B;AACtD,YAAQ,QAAQ;AAChB,UAAM,QAAQ;AACd,QAAI;AACF,WAAK,QAAQ,MAAM,OAAO,KAAK,YAAY,IAAI;AAAA,IACjD,SAAS,KAAK;AACZ,YAAM,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IAC/D,UAAA;AACE,cAAQ,QAAQ;AAAA,IAClB;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IAAM;AAAA,IAAS;AAAA,IAAO;AAAA,IACtB;AAAA,IAAW;AAAA,IAAO;AAAA,IAClB;AAAA,IAAM;AAAA,IAAS;AAAA,IAAY;AAAA,IAAY;AAAA,EAAA;AAE3C,CAAC;AC7EM,MAAM,kBAAkBF,MAAAA,YAAY,oBAAoB,MAAM;AACnE,QAAM,SAAS,kBAAA;AAEf,QAAM,iBAAiBC,IAAAA,IAA2B,IAAI;AACtD,QAAM,iBAAiBA,IAAAA,IAAyB,IAAI;AACpD,QAAM,UAAUA,IAAAA,IAAI,KAAK;AACzB,QAAM,QAAQA,IAAAA,IAAmB,IAAI;AAErC,QAAM,YAAYC,IAAAA,SAAS,MAAM,OAAO,SAAS;AAEjD,iBAAe,YAAY,WAAkC;AAC3D,YAAQ,QAAQ;AAChB,UAAM,QAAQ;AACd,QAAI;AACF,qBAAe,QAAQ,MAAM,OAAO,QAAQ,WAAW,SAAS;AAAA,IAClE,SAAS,KAAK;AACZ,YAAM,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IAC/D,UAAA;AACE,cAAQ,QAAQ;AAAA,IAClB;AAAA,EACF;AAEA,iBAAe,aAAa,cAAsB,YAAY,GAAG,WAAW,IAAmB;AAC7F,YAAQ,QAAQ;AAChB,UAAM,QAAQ;AACd,QAAI;AACF,qBAAe,QAAQ,MAAM,OAAO,QAAQ,YAAY,cAAc,WAAW,QAAQ;AAAA,IAC3F,SAAS,KAAK;AACZ,YAAM,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IAC/D,UAAA;AACE,cAAQ,QAAQ;AAAA,IAClB;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IAAgB;AAAA,IAAgB;AAAA,IAAS;AAAA,IAAO;AAAA,IAChD;AAAA,IAAa;AAAA,EAAA;AAEjB,CAAC;ACtCM,MAAM,iBAAiBF,MAAAA,YAAY,mBAAmB,MAAM;AACjE,QAAM,SAAS,kBAAA;AAEf,QAAM,SAASC,IAAAA,IAAyB,IAAI;AAC5C,QAAM,cAAcA,IAAAA,IAAc,EAAE;AACpC,QAAM,UAAUA,IAAAA,IAAI,KAAK;AACzB,QAAM,QAAQA,IAAAA,IAAmB,IAAI;AACrC,QAAM,QAAQA,IAAAA,IAAI,EAAE;AAEpB,iBAAe,OAAO,SAAuC;AAC3D,UAAM,QAAQ,QAAQ,KAAK;AAC3B,YAAQ,QAAQ;AAChB,UAAM,QAAQ;AACd,QAAI;AACF,aAAO,QAAQ,MAAM,OAAO,QAAQ,OAAO,OAAO;AAAA,IACpD,SAAS,KAAK;AACZ,YAAM,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IAC/D,UAAA;AACE,cAAQ,QAAQ;AAAA,IAClB;AAAA,EACF;AAEA,iBAAe,QAAQ,GAA0B;AAC/C,QAAI,CAAC,EAAE,QAAQ;AAAE,kBAAY,QAAQ,CAAA;AAAI;AAAA,IAAO;AAChD,QAAI;AACF,kBAAY,QAAQ,MAAM,OAAO,QAAQ,QAAQ,CAAC;AAAA,IACpD,QAAQ;AACN,kBAAY,QAAQ,CAAA;AAAA,IACtB;AAAA,EACF;AAEA,WAAS,QAAc;AACrB,WAAO,QAAQ;AACf,gBAAY,QAAQ,CAAA;AACpB,UAAM,QAAQ;AAAA,EAChB;AAEA,SAAO,EAAE,QAAQ,aAAa,SAAS,OAAO,OAAO,QAAQ,SAAS,MAAA;AACxE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;ACvCD,UAAM,QAAQ;AAKd,UAAM,YAAY,aAAA;AAElB,mBAAe,YAA2B;AACxC,YAAM,UAAU,QAAQ,MAAM,QAAQ,OAAO,MAAM,QAAQ,MAAM,CAAC;AAAA,IACpE;;AAIE,aAAAE,cAAA,GAAAC,uBAyCU,WAzCVC,cAyCU;AAAA,QAxCRC,IAAAA,mBAQI,KAAA;AAAA,UARA,MAAM,QAAA,QAAQ,eAAW;AAAA,UAAS,OAAM;AAAA,QAAA;UAElC,QAAA,QAAQ,8BADhBF,IAAAA,mBAME,OAAA;AAAA;YAJC,KAAK,QAAA,QAAQ;AAAA,YACb,KAAK,QAAA,QAAQ,SAAS;AAAA,YACvB,OAAM;AAAA,YACN,SAAQ;AAAA,UAAA;;QAIZE,IAAAA,mBA6BM,OA7BNC,cA6BM;AAAA,UA5BJD,IAAAA,mBAEK,MAFLE,cAEK;AAAA,YADHF,IAAAA,mBAA6D,KAAA;AAAA,cAAzD,MAAM,QAAA,QAAQ,eAAW;AAAA,YAAA,GAAYG,IAAAA,gBAAA,QAAA,QAAQ,KAAK,GAAA,GAAAC,YAAA;AAAA,UAAA;UAGxDJ,IAAAA,mBAUM,OAVNK,cAUM;AAAA,YARI,QAAA,QAAQ,oCADhBP,IAAAA,mBAKO,QALPQ,cAKOH,IAAAA,gBADF,QAAA,QAAQ,MAAM,QAAO,CAAA,CAAA,IAAM,OAChC,CAAA;YACAH,IAAAA,mBAEO,QAFPO,cAEOJ,IAAAA,iBADD,QAAA,QAAQ,mBAAmB,QAAA,QAAQ,OAAO,cAAa,OAC7D,CAAA;AAAA,UAAA;UAGQ,CAAA,QAAA,QAAQ,sCAAlBL,IAAAA,mBAEI,KAFJ,aAA4E,gBAE5E;UAGQ,QAAA,iBAAiB,QAAA,QAAQ,sCADjCA,IAAAA,mBAOS,UAAA;AAAA;YALP,OAAM;AAAA,YACL,UAAUU,IAAAA,MAAA,SAAA,EAAU;AAAA,YACpB,SAAO;AAAA,UAAA,GACT,uBAED,GAAA,WAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChDN,UAAM,YAAY,aAAA;AAElBC,QAAAA,UAAU,MAAM;AAAE,gBAAU,KAAA;AAAA,IAAO,CAAC;;;AAIlC,aAAAZ,cAAA,GAAAC,uBA2BM,OA3BNC,cA2BM;AAAA,QA1BOS,IAAAA,MAAA,SAAA,EAAU,4BAArBV,IAAAA,mBAEM,OAFN,YAAiE,yBAEjE,KAEgBU,IAAAA,MAAA,SAAA,EAAU,4BAA1BV,IAAAA,mBAEM,OAFN,YAAoE,0BAEpE,uBAEAA,IAAAA,mBAiBWY,IAAAA,UAAA,EAAA,KAAA,KAAA;AAAA,UAhBE,QAAA,aAAXb,IAAAA,UAAA,GAAAC,IAAAA,mBAUM,OAVN,YAUM;AAAA,aATJD,cAAA,IAAA,GAAAC,uBAQMY,IAAAA,UAAA,MAAAC,IAAAA,YAPWH,eAAAA,MAAA,SAAA,EAAU,SAAVA,mBAAgB,YAAhBA,mBAAyB,QAAQ,OAAK,EAAE,eAAhD,SAAI;sCADbV,IAAAA,mBAQM,OAAA;AAAA,gBANH,KAAK,KAAK;AAAA,gBACX,OAAM;AAAA,cAAA;gBAENE,IAAAA,mBAAmE,QAAnE,YAAmEG,IAAAA,gBAApB,KAAK,KAAK,GAAA,CAAA;AAAA,gBACzDH,uBAAsE,QAAtE,YAA0C,OAAEG,IAAAA,gBAAG,KAAK,QAAQ,GAAA,CAAA;AAAA,gBAC5DH,IAAAA,mBAAkH,QAAlH,YAAkHG,IAAAA,iBAAlE,KAAK,wBAAwB,KAAK,UAAU,cAAa,MAAE,CAAA;AAAA,cAAA;;;UAI/GH,IAAAA,mBAGM,OAHN,YAGM;AAAA,YAFJ,OAAA,CAAA,MAAA,OAAA,CAAA,IAAAA,IAAAA,mBAAyD,QAAA,EAAnD,OAAM,iCAAA,GAAiC,SAAK,EAAA;AAAA,YAClDA,IAAAA,mBAAuF,QAAvF,YAAuFG,IAAAA,gBAAtCK,IAAAA,MAAA,SAAA,EAAU,MAAM,QAAO,CAAA,CAAA,IAAM,MAAE,CAAA;AAAA,UAAA;;;;;;;;;;;;;;;;ACnCxF,UAAM,QAAQ;AAOd,UAAM,YAAY,aAAA;AAElB,mBAAe,cAA6B;AAC1C,UAAI,MAAM,SAAU;AACpB,YAAM,UAAU,QAAQ,MAAM,WAAW,MAAM,YAAY,CAAC;AAAA,IAC9D;;8BAIEV,IAAAA,mBAOS,UAAA;AAAA,QANP,OAAM;AAAA,QACL,UAAU,QAAA,YAAYU,IAAAA,MAAA,SAAA,EAAU;AAAA,QAChC,aAAWA,IAAAA,MAAA,SAAA,EAAU;AAAA,QACrB,SAAO;AAAA,MAAA;QAERI,IAAAA,WAA+C,4BAA/C,MAA+C;AAAA,kDAAtC,QAAA,SAAK,mBAAA,GAAA,CAAA;AAAA,QAAA;;;;;;;;;;;;;;;;"}
|
package/dist/index.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ import { CommerceMode } from '@altazion/commerce-sdk-core';
|
|
|
11
11
|
import { ComponentOptionsMixin } from 'vue';
|
|
12
12
|
import { ComponentProvideOptions } from 'vue';
|
|
13
13
|
import { ComputedRef } from 'vue';
|
|
14
|
+
import { ConnectivityStatus } from '@altazion/commerce-sdk-core';
|
|
14
15
|
import { DefineComponent } from 'vue';
|
|
15
16
|
import { ExtractPropTypes } from 'vue';
|
|
16
17
|
import { Pinia } from 'pinia';
|
|
@@ -127,6 +128,8 @@ product: WebProduct;
|
|
|
127
128
|
showAddToCart?: boolean;
|
|
128
129
|
}>>> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
|
|
129
130
|
|
|
131
|
+
export declare type TerminalScreenMode = 'interactive' | 'offline';
|
|
132
|
+
|
|
130
133
|
export declare const useCartStore: StoreDefinition<"altazion:cart", Pick<{
|
|
131
134
|
cart: Ref< {
|
|
132
135
|
guid: string;
|
|
@@ -754,7 +757,6 @@ pickupPersonName?: string | null | undefined;
|
|
|
754
757
|
loading: Ref<boolean, boolean>;
|
|
755
758
|
error: Ref<string | null, string | null>;
|
|
756
759
|
isOffline: ComputedRef<boolean>;
|
|
757
|
-
hasPendingOperations: Ref<boolean, boolean>;
|
|
758
760
|
itemCount: ComputedRef<number>;
|
|
759
761
|
total: ComputedRef<number>;
|
|
760
762
|
isEmpty: ComputedRef<boolean>;
|
|
@@ -763,7 +765,7 @@ addItem: (reference: string, quantity: number, options?: Record<string, unknown>
|
|
|
763
765
|
updateItem: (lineId: string, quantity: number) => Promise<void>;
|
|
764
766
|
removeItem: (lineId: string) => Promise<void>;
|
|
765
767
|
applyCoupon: (code: string) => Promise<void>;
|
|
766
|
-
}, "cart" | "loading" | "error"
|
|
768
|
+
}, "cart" | "loading" | "error">, Pick<{
|
|
767
769
|
cart: Ref< {
|
|
768
770
|
guid: string;
|
|
769
771
|
orderNumber?: string | null | undefined;
|
|
@@ -1390,7 +1392,6 @@ pickupPersonName?: string | null | undefined;
|
|
|
1390
1392
|
loading: Ref<boolean, boolean>;
|
|
1391
1393
|
error: Ref<string | null, string | null>;
|
|
1392
1394
|
isOffline: ComputedRef<boolean>;
|
|
1393
|
-
hasPendingOperations: Ref<boolean, boolean>;
|
|
1394
1395
|
itemCount: ComputedRef<number>;
|
|
1395
1396
|
total: ComputedRef<number>;
|
|
1396
1397
|
isEmpty: ComputedRef<boolean>;
|
|
@@ -2026,7 +2027,6 @@ pickupPersonName?: string | null | undefined;
|
|
|
2026
2027
|
loading: Ref<boolean, boolean>;
|
|
2027
2028
|
error: Ref<string | null, string | null>;
|
|
2028
2029
|
isOffline: ComputedRef<boolean>;
|
|
2029
|
-
hasPendingOperations: Ref<boolean, boolean>;
|
|
2030
2030
|
itemCount: ComputedRef<number>;
|
|
2031
2031
|
total: ComputedRef<number>;
|
|
2032
2032
|
isEmpty: ComputedRef<boolean>;
|
|
@@ -4643,6 +4643,26 @@ loadCategory: (categoryCode: string, pageIndex?: number, pageSize?: number) => P
|
|
|
4643
4643
|
*/
|
|
4644
4644
|
export declare function useCommerceClient(): CommerceClient;
|
|
4645
4645
|
|
|
4646
|
+
export declare const useConnectivityStore: StoreDefinition<"altazion:connectivity", Pick<{
|
|
4647
|
+
status: Ref<ConnectivityStatus, ConnectivityStatus>;
|
|
4648
|
+
isOnline: ComputedRef<boolean>;
|
|
4649
|
+
isOffline: ComputedRef<boolean>;
|
|
4650
|
+
screenMode: ComputedRef<TerminalScreenMode>;
|
|
4651
|
+
isInteractiveAvailable: ComputedRef<boolean>;
|
|
4652
|
+
}, "status">, Pick<{
|
|
4653
|
+
status: Ref<ConnectivityStatus, ConnectivityStatus>;
|
|
4654
|
+
isOnline: ComputedRef<boolean>;
|
|
4655
|
+
isOffline: ComputedRef<boolean>;
|
|
4656
|
+
screenMode: ComputedRef<TerminalScreenMode>;
|
|
4657
|
+
isInteractiveAvailable: ComputedRef<boolean>;
|
|
4658
|
+
}, "isOffline" | "isOnline" | "screenMode" | "isInteractiveAvailable">, Pick<{
|
|
4659
|
+
status: Ref<ConnectivityStatus, ConnectivityStatus>;
|
|
4660
|
+
isOnline: ComputedRef<boolean>;
|
|
4661
|
+
isOffline: ComputedRef<boolean>;
|
|
4662
|
+
screenMode: ComputedRef<TerminalScreenMode>;
|
|
4663
|
+
isInteractiveAvailable: ComputedRef<boolean>;
|
|
4664
|
+
}, never>>;
|
|
4665
|
+
|
|
4646
4666
|
export declare const useSearchStore: StoreDefinition<"altazion:search", Pick<{
|
|
4647
4667
|
result: Ref< {
|
|
4648
4668
|
totalCount: number;
|
|
@@ -5204,7 +5224,7 @@ isKiosk: ComputedRef<boolean>;
|
|
|
5204
5224
|
isReady: ComputedRef<boolean>;
|
|
5205
5225
|
load: () => Promise<void>;
|
|
5206
5226
|
associateStore: (storeGuid: string) => Promise<void>;
|
|
5207
|
-
}, "loading" | "error" | "
|
|
5227
|
+
}, "loading" | "error" | "isOnline" | "session">, Pick<{
|
|
5208
5228
|
session: Ref< {
|
|
5209
5229
|
id: string;
|
|
5210
5230
|
expiresOn?: string | null | undefined;
|
package/dist/index.js
CHANGED
|
@@ -18,6 +18,24 @@ function useCommerceClient() {
|
|
|
18
18
|
}
|
|
19
19
|
return client;
|
|
20
20
|
}
|
|
21
|
+
const useConnectivityStore = defineStore("altazion:connectivity", () => {
|
|
22
|
+
const client = useCommerceClient();
|
|
23
|
+
const status = ref(client.connectivity.isOnline ? "online" : "offline");
|
|
24
|
+
client.connectivity.subscribe((nextStatus) => {
|
|
25
|
+
status.value = nextStatus;
|
|
26
|
+
});
|
|
27
|
+
const isOnline = computed(() => status.value === "online");
|
|
28
|
+
const isOffline = computed(() => status.value === "offline");
|
|
29
|
+
const screenMode = computed(() => isOffline.value ? "offline" : "interactive");
|
|
30
|
+
const isInteractiveAvailable = computed(() => !isOffline.value);
|
|
31
|
+
return {
|
|
32
|
+
status,
|
|
33
|
+
isOnline,
|
|
34
|
+
isOffline,
|
|
35
|
+
screenMode,
|
|
36
|
+
isInteractiveAvailable
|
|
37
|
+
};
|
|
38
|
+
});
|
|
21
39
|
const useSessionStore = defineStore("altazion:session", () => {
|
|
22
40
|
const client = useCommerceClient();
|
|
23
41
|
const session = ref(null);
|
|
@@ -59,10 +77,6 @@ const useCartStore = defineStore("altazion:cart", () => {
|
|
|
59
77
|
const cart = ref(null);
|
|
60
78
|
const loading = ref(false);
|
|
61
79
|
const error = ref(null);
|
|
62
|
-
const hasPendingOperations = ref(false);
|
|
63
|
-
client.onQueueEvent(async () => {
|
|
64
|
-
hasPendingOperations.value = await client.pendingOperationsCount > 0;
|
|
65
|
-
});
|
|
66
80
|
const isOffline = computed(() => client.isOffline);
|
|
67
81
|
const itemCount = computed(() => {
|
|
68
82
|
var _a;
|
|
@@ -133,7 +147,6 @@ const useCartStore = defineStore("altazion:cart", () => {
|
|
|
133
147
|
loading,
|
|
134
148
|
error,
|
|
135
149
|
isOffline,
|
|
136
|
-
hasPendingOperations,
|
|
137
150
|
itemCount,
|
|
138
151
|
total,
|
|
139
152
|
isEmpty,
|
|
@@ -232,7 +245,7 @@ const _hoisted_8$1 = {
|
|
|
232
245
|
class: "altz-product-card__price--original"
|
|
233
246
|
};
|
|
234
247
|
const _hoisted_9$1 = { class: "altz-product-card__price--current" };
|
|
235
|
-
const _hoisted_10
|
|
248
|
+
const _hoisted_10 = {
|
|
236
249
|
key: 0,
|
|
237
250
|
class: "altz-product-card__unavailable"
|
|
238
251
|
};
|
|
@@ -273,7 +286,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
|
273
286
|
__props.product.discountedPrice ? (openBlock(), createElementBlock("span", _hoisted_8$1, toDisplayString(__props.product.price.toFixed(2)) + " € ", 1)) : createCommentVNode("", true),
|
|
274
287
|
createElementVNode("span", _hoisted_9$1, toDisplayString((__props.product.discountedPrice ?? __props.product.price).toFixed(2)) + " € ", 1)
|
|
275
288
|
]),
|
|
276
|
-
!__props.product.availableForOrder ? (openBlock(), createElementBlock("p", _hoisted_10
|
|
289
|
+
!__props.product.availableForOrder ? (openBlock(), createElementBlock("p", _hoisted_10, " Indisponible ")) : createCommentVNode("", true),
|
|
277
290
|
__props.showAddToCart && __props.product.availableForOrder ? (openBlock(), createElementBlock("button", {
|
|
278
291
|
key: 1,
|
|
279
292
|
class: "altz-product-card__add-to-cart",
|
|
@@ -303,10 +316,6 @@ const _hoisted_6 = { class: "altz-cart-summary__line-qty" };
|
|
|
303
316
|
const _hoisted_7 = { class: "altz-cart-summary__line-price" };
|
|
304
317
|
const _hoisted_8 = { class: "altz-cart-summary__total" };
|
|
305
318
|
const _hoisted_9 = { class: "altz-cart-summary__total-amount" };
|
|
306
|
-
const _hoisted_10 = {
|
|
307
|
-
key: 1,
|
|
308
|
-
class: "altz-cart-summary__offline-notice"
|
|
309
|
-
};
|
|
310
319
|
const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
311
320
|
__name: "CartSummary",
|
|
312
321
|
props: {
|
|
@@ -336,8 +345,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
|
336
345
|
createElementVNode("div", _hoisted_8, [
|
|
337
346
|
_cache[0] || (_cache[0] = createElementVNode("span", { class: "altz-cart-summary__total-label" }, "Total", -1)),
|
|
338
347
|
createElementVNode("span", _hoisted_9, toDisplayString(unref(cartStore).total.toFixed(2)) + " €", 1)
|
|
339
|
-
])
|
|
340
|
-
unref(cartStore).hasPendingOperations ? (openBlock(), createElementBlock("div", _hoisted_10, " Modifications en attente de synchronisation… ")) : createCommentVNode("", true)
|
|
348
|
+
])
|
|
341
349
|
], 64))
|
|
342
350
|
]);
|
|
343
351
|
};
|
|
@@ -382,6 +390,7 @@ export {
|
|
|
382
390
|
useCartStore,
|
|
383
391
|
useCatalogStore,
|
|
384
392
|
useCommerceClient,
|
|
393
|
+
useConnectivityStore,
|
|
385
394
|
useSearchStore,
|
|
386
395
|
useSessionStore
|
|
387
396
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/plugin.ts","../src/composables/useCommerceClient.ts","../src/stores/useSessionStore.ts","../src/stores/useCartStore.ts","../src/stores/useCatalogStore.ts","../src/stores/useSearchStore.ts","../src/components/ProductCard.vue","../src/components/CartSummary.vue","../src/components/AddToCartButton.vue"],"sourcesContent":["import type { App } from 'vue'\nimport { createPinia, type Pinia } from 'pinia'\nimport type { CommerceClient } from '@altazion/commerce-sdk-core'\n\nexport const COMMERCE_CLIENT_KEY = Symbol('altazion:commerce-client')\n\nexport interface AltazionCommercePluginOptions {\n client: CommerceClient\n /** Pinia instance existante (optionnel — le plugin en crée une si absent) */\n pinia?: Pinia\n}\n\n/**\n * Plugin Vue 3 pour le SDK Altazion Commerce.\n *\n * Usage :\n * ```ts\n * import { createApp } from 'vue'\n * import { CommerceClient } from '@altazion/commerce-sdk-core'\n * import { AltazionCommercePlugin } from '@altazion/commerce-sdk-vue'\n *\n * const client = new CommerceClient({ baseUrl: '...', siteUrl: window.location.href })\n * await client.initialize()\n *\n * createApp(App)\n * .use(AltazionCommercePlugin, { client })\n * .mount('#app')\n * ```\n */\nexport const AltazionCommercePlugin = {\n install(app: App, options: AltazionCommercePluginOptions): void {\n const { client, pinia } = options\n\n // Installer Pinia si pas déjà présente\n const piniaInstance = pinia ?? createPinia()\n app.use(piniaInstance)\n\n // Rendre le client accessible via inject()\n app.provide(COMMERCE_CLIENT_KEY, client)\n }\n}\n","import { inject } from 'vue'\nimport { COMMERCE_CLIENT_KEY } from '../plugin.js'\nimport type { CommerceClient } from '@altazion/commerce-sdk-core'\n\n/**\n * Composable pour accéder au CommerceClient injecté par AltazionCommercePlugin.\n * Doit être utilisé dans un composant Vue (setup()) ou un store Pinia.\n */\nexport function useCommerceClient(): CommerceClient {\n const client = inject<CommerceClient>(COMMERCE_CLIENT_KEY)\n if (!client) {\n throw new Error(\n '[AltazionCommerce] useCommerceClient() : aucun client trouvé. ' +\n 'Assurez-vous d\\'avoir installé AltazionCommercePlugin via app.use().'\n )\n }\n return client\n}\n","import { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { SessionInfo, ConnectivityStatus } from '@altazion/commerce-sdk-core'\n\nexport const useSessionStore = defineStore('altazion:session', () => {\n const client = useCommerceClient()\n\n const session = ref<SessionInfo | null>(null)\n const loading = ref(false)\n const error = ref<string | null>(null)\n\n const isOnline = ref(client.connectivity.isOnline)\n client.connectivity.subscribe((status: ConnectivityStatus) => {\n isOnline.value = status === 'online'\n })\n\n const mode = computed(() => client.context.mode)\n const isKiosk = computed(() => mode.value === 'kiosk')\n const isReady = computed(() => session.value !== null || mode.value === 'kiosk')\n\n async function load(): Promise<void> {\n loading.value = true\n error.value = null\n try {\n session.value = await client.session.getSession()\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function associateStore(storeGuid: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n session.value = await client.session.associateStore(storeGuid)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n return { session, loading, error, isOnline, mode, isKiosk, isReady, load, associateStore }\n})\n","import { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { Cart } from '@altazion/commerce-sdk-core'\n\nexport const useCartStore = defineStore('altazion:cart', () => {\n const client = useCommerceClient()\n\n const cart = ref<Cart | null>(null)\n const loading = ref(false)\n const error = ref<string | null>(null)\n const hasPendingOperations = ref(false)\n\n // Mise à jour de hasPendingOperations via la file offline\n client.onQueueEvent(async () => {\n hasPendingOperations.value = (await client.pendingOperationsCount) > 0\n })\n\n const isOffline = computed(() => client.isOffline)\n const itemCount = computed(() => cart.value?.totalQuantity ?? 0)\n const total = computed(() => cart.value?.totalAmountWithTax ?? 0)\n const isEmpty = computed(() => itemCount.value === 0)\n\n async function load(): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.getCart()\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function addItem(reference: string, quantity: number, options?: Record<string, unknown>): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.addItem(reference, quantity, options)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function updateItem(lineId: string, quantity: number): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.updateItem(lineId, quantity)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function removeItem(lineId: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.removeItem(lineId)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function applyCoupon(code: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.applyCoupon(code)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n return {\n cart, loading, error, isOffline, hasPendingOperations,\n itemCount, total, isEmpty,\n load, addItem, updateItem, removeItem, applyCoupon\n }\n})\n","import { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { ProductDetails, SearchResult, SearchRequest } from '@altazion/commerce-sdk-core'\n\nexport const useCatalogStore = defineStore('altazion:catalog', () => {\n const client = useCommerceClient()\n\n const currentProduct = ref<ProductDetails | null>(null)\n const categoryResult = ref<SearchResult | null>(null)\n const loading = ref(false)\n const error = ref<string | null>(null)\n\n const isOffline = computed(() => client.isOffline)\n\n async function loadProduct(reference: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n currentProduct.value = await client.catalog.getProduct(reference)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function loadCategory(categoryCode: string, pageIndex = 0, pageSize = 20): Promise<void> {\n loading.value = true\n error.value = null\n try {\n categoryResult.value = await client.catalog.getCategory(categoryCode, pageIndex, pageSize)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n return {\n currentProduct, categoryResult, loading, error, isOffline,\n loadProduct, loadCategory\n }\n})\n","import { defineStore } from 'pinia'\nimport { ref } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { SearchResult, SearchRequest } from '@altazion/commerce-sdk-core'\n\nexport const useSearchStore = defineStore('altazion:search', () => {\n const client = useCommerceClient()\n\n const result = ref<SearchResult | null>(null)\n const suggestions = ref<string[]>([])\n const loading = ref(false)\n const error = ref<string | null>(null)\n const query = ref('')\n\n async function search(request: SearchRequest): Promise<void> {\n query.value = request.q ?? ''\n loading.value = true\n error.value = null\n try {\n result.value = await client.catalog.search(request)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function suggest(q: string): Promise<void> {\n if (!q.trim()) { suggestions.value = []; return }\n try {\n suggestions.value = await client.catalog.suggest(q)\n } catch {\n suggestions.value = []\n }\n }\n\n function clear(): void {\n result.value = null\n suggestions.value = []\n query.value = ''\n }\n\n return { result, suggestions, loading, error, query, search, suggest, clear }\n})\n","<script setup lang=\"ts\">\nimport type { WebProduct } from '@altazion/commerce-sdk-core'\nimport { useCartStore } from '../stores/useCartStore.js'\n\nconst props = defineProps<{\n product: WebProduct\n showAddToCart?: boolean\n}>()\n\nconst cartStore = useCartStore()\n\nasync function addToCart(): Promise<void> {\n await cartStore.addItem(props.product.sku ?? props.product.guid, 1)\n}\n</script>\n\n<template>\n <article class=\"altz-product-card\">\n <a :href=\"product.externalUrl ?? '#'\" class=\"altz-product-card__image-link\">\n <img\n v-if=\"product.mainImage\"\n :src=\"product.mainImage\"\n :alt=\"product.label ?? undefined\"\n class=\"altz-product-card__image\"\n loading=\"lazy\"\n />\n </a>\n\n <div class=\"altz-product-card__body\">\n <h3 class=\"altz-product-card__title\">\n <a :href=\"product.externalUrl ?? '#'\">{{ product.label }}</a>\n </h3>\n\n <div class=\"altz-product-card__price\">\n <span\n v-if=\"product.discountedPrice\"\n class=\"altz-product-card__price--original\"\n >\n {{ product.price.toFixed(2) }} €\n </span>\n <span class=\"altz-product-card__price--current\">\n {{ (product.discountedPrice ?? product.price).toFixed(2) }} €\n </span>\n </div>\n\n <p v-if=\"!product.availableForOrder\" class=\"altz-product-card__unavailable\">\n Indisponible\n </p>\n\n <button\n v-if=\"showAddToCart && product.availableForOrder\"\n class=\"altz-product-card__add-to-cart\"\n :disabled=\"cartStore.loading\"\n @click=\"addToCart\"\n >\n Ajouter au panier\n </button>\n </div>\n </article>\n</template>\n","<script setup lang=\"ts\">\nimport { onMounted } from 'vue'\nimport { useCartStore } from '../stores/useCartStore.js'\n\nconst props = defineProps<{\n showLines?: boolean\n}>()\n\nconst cartStore = useCartStore()\n\nonMounted(() => { cartStore.load() })\n</script>\n\n<template>\n <div class=\"altz-cart-summary\">\n <div v-if=\"cartStore.loading\" class=\"altz-cart-summary__loading\">\n Chargement du panier…\n </div>\n\n <div v-else-if=\"cartStore.isEmpty\" class=\"altz-cart-summary__empty\">\n Votre panier est vide.\n </div>\n\n <template v-else>\n <div v-if=\"showLines\" class=\"altz-cart-summary__lines\">\n <div\n v-for=\"line in cartStore.cart?.content?.flatMap(g => g.lines ?? [])\"\n :key=\"line.id\"\n class=\"altz-cart-summary__line\"\n >\n <span class=\"altz-cart-summary__line-label\">{{ line.label }}</span>\n <span class=\"altz-cart-summary__line-qty\">× {{ line.quantity }}</span>\n <span class=\"altz-cart-summary__line-price\">{{ (line.finalUnitPriceInclTax * line.quantity).toFixed(2) }} €</span>\n </div>\n </div>\n\n <div class=\"altz-cart-summary__total\">\n <span class=\"altz-cart-summary__total-label\">Total</span>\n <span class=\"altz-cart-summary__total-amount\">{{ cartStore.total.toFixed(2) }} €</span>\n </div>\n\n <div v-if=\"cartStore.hasPendingOperations\" class=\"altz-cart-summary__offline-notice\">\n Modifications en attente de synchronisation…\n </div>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { useCartStore } from '../stores/useCartStore.js'\n\nconst props = defineProps<{\n reference: string\n quantity?: number\n label?: string\n disabled?: boolean\n}>()\n\nconst cartStore = useCartStore()\n\nasync function handleClick(): Promise<void> {\n if (props.disabled) return\n await cartStore.addItem(props.reference, props.quantity ?? 1)\n}\n</script>\n\n<template>\n <button\n class=\"altz-add-to-cart\"\n :disabled=\"disabled || cartStore.loading\"\n :aria-busy=\"cartStore.loading\"\n @click=\"handleClick\"\n >\n <slot>{{ label ?? 'Ajouter au panier' }}</slot>\n </button>\n</template>\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_4","_hoisted_5","_toDisplayString","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_unref","_Fragment","_renderList","_renderSlot"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/plugin.ts","../src/composables/useCommerceClient.ts","../src/stores/useConnectivityStore.ts","../src/stores/useSessionStore.ts","../src/stores/useCartStore.ts","../src/stores/useCatalogStore.ts","../src/stores/useSearchStore.ts","../src/components/ProductCard.vue","../src/components/CartSummary.vue","../src/components/AddToCartButton.vue"],"sourcesContent":["import type { App } from 'vue'\nimport { createPinia, type Pinia } from 'pinia'\nimport type { CommerceClient } from '@altazion/commerce-sdk-core'\n\nexport const COMMERCE_CLIENT_KEY = Symbol('altazion:commerce-client')\n\nexport interface AltazionCommercePluginOptions {\n client: CommerceClient\n /** Pinia instance existante (optionnel — le plugin en crée une si absent) */\n pinia?: Pinia\n}\n\n/**\n * Plugin Vue 3 pour le SDK Altazion Commerce.\n *\n * Usage :\n * ```ts\n * import { createApp } from 'vue'\n * import { CommerceClient } from '@altazion/commerce-sdk-core'\n * import { AltazionCommercePlugin } from '@altazion/commerce-sdk-vue'\n *\n * const client = new CommerceClient({ baseUrl: '...', siteUrl: window.location.href })\n * await client.initialize()\n *\n * createApp(App)\n * .use(AltazionCommercePlugin, { client })\n * .mount('#app')\n * ```\n */\nexport const AltazionCommercePlugin = {\n install(app: App, options: AltazionCommercePluginOptions): void {\n const { client, pinia } = options\n\n // Installer Pinia si pas déjà présente\n const piniaInstance = pinia ?? createPinia()\n app.use(piniaInstance)\n\n // Rendre le client accessible via inject()\n app.provide(COMMERCE_CLIENT_KEY, client)\n }\n}\n","import { inject } from 'vue'\nimport { COMMERCE_CLIENT_KEY } from '../plugin.js'\nimport type { CommerceClient } from '@altazion/commerce-sdk-core'\n\n/**\n * Composable pour accéder au CommerceClient injecté par AltazionCommercePlugin.\n * Doit être utilisé dans un composant Vue (setup()) ou un store Pinia.\n */\nexport function useCommerceClient(): CommerceClient {\n const client = inject<CommerceClient>(COMMERCE_CLIENT_KEY)\n if (!client) {\n throw new Error(\n '[AltazionCommerce] useCommerceClient() : aucun client trouvé. ' +\n 'Assurez-vous d\\'avoir installé AltazionCommercePlugin via app.use().'\n )\n }\n return client\n}\n","import { defineStore } from 'pinia'\nimport { computed, ref } from 'vue'\nimport type { ConnectivityStatus } from '@altazion/commerce-sdk-core'\n\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\n\nexport type TerminalScreenMode = 'interactive' | 'offline'\n\nexport const useConnectivityStore = defineStore('altazion:connectivity', () => {\n const client = useCommerceClient()\n\n const status = ref<ConnectivityStatus>(client.connectivity.isOnline ? 'online' : 'offline')\n\n client.connectivity.subscribe((nextStatus: ConnectivityStatus) => {\n status.value = nextStatus\n })\n\n const isOnline = computed(() => status.value === 'online')\n const isOffline = computed(() => status.value === 'offline')\n const screenMode = computed<TerminalScreenMode>(() => isOffline.value ? 'offline' : 'interactive')\n const isInteractiveAvailable = computed(() => !isOffline.value)\n\n return {\n status,\n isOnline,\n isOffline,\n screenMode,\n isInteractiveAvailable,\n }\n})","import { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { SessionInfo, ConnectivityStatus } from '@altazion/commerce-sdk-core'\n\nexport const useSessionStore = defineStore('altazion:session', () => {\n const client = useCommerceClient()\n\n const session = ref<SessionInfo | null>(null)\n const loading = ref(false)\n const error = ref<string | null>(null)\n\n const isOnline = ref(client.connectivity.isOnline)\n client.connectivity.subscribe((status: ConnectivityStatus) => {\n isOnline.value = status === 'online'\n })\n\n const mode = computed(() => client.context.mode)\n const isKiosk = computed(() => mode.value === 'kiosk')\n const isReady = computed(() => session.value !== null || mode.value === 'kiosk')\n\n async function load(): Promise<void> {\n loading.value = true\n error.value = null\n try {\n session.value = await client.session.getSession()\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function associateStore(storeGuid: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n session.value = await client.session.associateStore(storeGuid)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n return { session, loading, error, isOnline, mode, isKiosk, isReady, load, associateStore }\n})\n","import { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { Cart } from '@altazion/commerce-sdk-core'\n\nexport const useCartStore = defineStore('altazion:cart', () => {\n const client = useCommerceClient()\n\n const cart = ref<Cart | null>(null)\n const loading = ref(false)\n const error = ref<string | null>(null)\n\n const isOffline = computed(() => client.isOffline)\n const itemCount = computed(() => cart.value?.totalQuantity ?? 0)\n const total = computed(() => cart.value?.totalAmountWithTax ?? 0)\n const isEmpty = computed(() => itemCount.value === 0)\n\n async function load(): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.getCart()\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function addItem(reference: string, quantity: number, options?: Record<string, unknown>): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.addItem(reference, quantity, options)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function updateItem(lineId: string, quantity: number): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.updateItem(lineId, quantity)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function removeItem(lineId: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.removeItem(lineId)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function applyCoupon(code: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.applyCoupon(code)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n return {\n cart, loading, error, isOffline,\n itemCount, total, isEmpty,\n load, addItem, updateItem, removeItem, applyCoupon\n }\n})\n","import { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { ProductDetails, SearchResult, SearchRequest } from '@altazion/commerce-sdk-core'\n\nexport const useCatalogStore = defineStore('altazion:catalog', () => {\n const client = useCommerceClient()\n\n const currentProduct = ref<ProductDetails | null>(null)\n const categoryResult = ref<SearchResult | null>(null)\n const loading = ref(false)\n const error = ref<string | null>(null)\n\n const isOffline = computed(() => client.isOffline)\n\n async function loadProduct(reference: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n currentProduct.value = await client.catalog.getProduct(reference)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function loadCategory(categoryCode: string, pageIndex = 0, pageSize = 20): Promise<void> {\n loading.value = true\n error.value = null\n try {\n categoryResult.value = await client.catalog.getCategory(categoryCode, pageIndex, pageSize)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n return {\n currentProduct, categoryResult, loading, error, isOffline,\n loadProduct, loadCategory\n }\n})\n","import { defineStore } from 'pinia'\nimport { ref } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { SearchResult, SearchRequest } from '@altazion/commerce-sdk-core'\n\nexport const useSearchStore = defineStore('altazion:search', () => {\n const client = useCommerceClient()\n\n const result = ref<SearchResult | null>(null)\n const suggestions = ref<string[]>([])\n const loading = ref(false)\n const error = ref<string | null>(null)\n const query = ref('')\n\n async function search(request: SearchRequest): Promise<void> {\n query.value = request.q ?? ''\n loading.value = true\n error.value = null\n try {\n result.value = await client.catalog.search(request)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function suggest(q: string): Promise<void> {\n if (!q.trim()) { suggestions.value = []; return }\n try {\n suggestions.value = await client.catalog.suggest(q)\n } catch {\n suggestions.value = []\n }\n }\n\n function clear(): void {\n result.value = null\n suggestions.value = []\n query.value = ''\n }\n\n return { result, suggestions, loading, error, query, search, suggest, clear }\n})\n","<script setup lang=\"ts\">\nimport type { WebProduct } from '@altazion/commerce-sdk-core'\nimport { useCartStore } from '../stores/useCartStore.js'\n\nconst props = defineProps<{\n product: WebProduct\n showAddToCart?: boolean\n}>()\n\nconst cartStore = useCartStore()\n\nasync function addToCart(): Promise<void> {\n await cartStore.addItem(props.product.sku ?? props.product.guid, 1)\n}\n</script>\n\n<template>\n <article class=\"altz-product-card\">\n <a :href=\"product.externalUrl ?? '#'\" class=\"altz-product-card__image-link\">\n <img\n v-if=\"product.mainImage\"\n :src=\"product.mainImage\"\n :alt=\"product.label ?? undefined\"\n class=\"altz-product-card__image\"\n loading=\"lazy\"\n />\n </a>\n\n <div class=\"altz-product-card__body\">\n <h3 class=\"altz-product-card__title\">\n <a :href=\"product.externalUrl ?? '#'\">{{ product.label }}</a>\n </h3>\n\n <div class=\"altz-product-card__price\">\n <span\n v-if=\"product.discountedPrice\"\n class=\"altz-product-card__price--original\"\n >\n {{ product.price.toFixed(2) }} €\n </span>\n <span class=\"altz-product-card__price--current\">\n {{ (product.discountedPrice ?? product.price).toFixed(2) }} €\n </span>\n </div>\n\n <p v-if=\"!product.availableForOrder\" class=\"altz-product-card__unavailable\">\n Indisponible\n </p>\n\n <button\n v-if=\"showAddToCart && product.availableForOrder\"\n class=\"altz-product-card__add-to-cart\"\n :disabled=\"cartStore.loading\"\n @click=\"addToCart\"\n >\n Ajouter au panier\n </button>\n </div>\n </article>\n</template>\n","<script setup lang=\"ts\">\nimport { onMounted } from 'vue'\nimport { useCartStore } from '../stores/useCartStore.js'\n\nconst props = defineProps<{\n showLines?: boolean\n}>()\n\nconst cartStore = useCartStore()\n\nonMounted(() => { cartStore.load() })\n</script>\n\n<template>\n <div class=\"altz-cart-summary\">\n <div v-if=\"cartStore.loading\" class=\"altz-cart-summary__loading\">\n Chargement du panier…\n </div>\n\n <div v-else-if=\"cartStore.isEmpty\" class=\"altz-cart-summary__empty\">\n Votre panier est vide.\n </div>\n\n <template v-else>\n <div v-if=\"showLines\" class=\"altz-cart-summary__lines\">\n <div\n v-for=\"line in cartStore.cart?.content?.flatMap(g => g.lines ?? [])\"\n :key=\"line.id\"\n class=\"altz-cart-summary__line\"\n >\n <span class=\"altz-cart-summary__line-label\">{{ line.label }}</span>\n <span class=\"altz-cart-summary__line-qty\">× {{ line.quantity }}</span>\n <span class=\"altz-cart-summary__line-price\">{{ (line.finalUnitPriceInclTax * line.quantity).toFixed(2) }} €</span>\n </div>\n </div>\n\n <div class=\"altz-cart-summary__total\">\n <span class=\"altz-cart-summary__total-label\">Total</span>\n <span class=\"altz-cart-summary__total-amount\">{{ cartStore.total.toFixed(2) }} €</span>\n </div>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { useCartStore } from '../stores/useCartStore.js'\n\nconst props = defineProps<{\n reference: string\n quantity?: number\n label?: string\n disabled?: boolean\n}>()\n\nconst cartStore = useCartStore()\n\nasync function handleClick(): Promise<void> {\n if (props.disabled) return\n await cartStore.addItem(props.reference, props.quantity ?? 1)\n}\n</script>\n\n<template>\n <button\n class=\"altz-add-to-cart\"\n :disabled=\"disabled || cartStore.loading\"\n :aria-busy=\"cartStore.loading\"\n @click=\"handleClick\"\n >\n <slot>{{ label ?? 'Ajouter au panier' }}</slot>\n </button>\n</template>\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_4","_hoisted_5","_toDisplayString","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_unref","_Fragment","_renderList","_renderSlot"],"mappings":"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"}
|