1
1
import { defineStore } from "pinia" ;
2
- import { useQuery , useMutation } from "@vue/apollo-composable" ;
3
- import { computed , ref , watch } from "vue" ;
2
+ import { useMutation } from "@vue/apollo-composable" ;
3
+ import { computed , ref } from "vue" ;
4
4
5
5
import ADD_TO_CART_MUTATION from "@/apollo/mutations/ADD_TO_CART_MUTATION.gql" ;
6
6
import UPDATE_CART_MUTATION from "@/apollo/mutations/UPDATE_CART_MUTATION.gql" ;
@@ -14,21 +14,32 @@ export const useCart = defineStore(
14
14
const error = ref ( null ) ;
15
15
const cartTotals = ref ( { } ) ;
16
16
17
- const { result : cartResult , refetch : refetchCart } = useQuery (
18
- GET_CART_QUERY ,
19
- null ,
20
- {
21
- fetchPolicy : "network-only" ,
22
- } ,
23
- ) ;
17
+ const { $apollo } = useNuxtApp ( ) ;
24
18
25
- watch ( cartResult , ( newCartResult ) => {
26
- if ( newCartResult && newCartResult . cart ) {
27
- updateCartState ( newCartResult . cart ) ;
19
+ const fetchCart = async ( ) => {
20
+ try {
21
+ const { data } = await useAsyncData ( "cart" , async ( ) => {
22
+ const { data } = await $apollo . client . query ( {
23
+ query : GET_CART_QUERY ,
24
+ fetchPolicy : "network-only" ,
25
+ } ) ;
26
+ return data . cart ;
27
+ } ) ;
28
+
29
+ if ( data . value ) {
30
+ updateCartState ( data . value ) ;
31
+ }
32
+ } catch ( e ) {
33
+ error . value = e ;
28
34
}
29
- } ) ;
35
+ } ;
30
36
31
37
const updateCartState = ( newCart ) => {
38
+ if ( ! newCart ) {
39
+ cart . value = [ ] ;
40
+ cartTotals . value = { } ;
41
+ return ;
42
+ }
32
43
cart . value = newCart . contents . nodes . map ( ( item ) => ( {
33
44
key : item . key ,
34
45
product : item . product . node ,
@@ -64,8 +75,9 @@ export const useCart = defineStore(
64
75
quantity : quantity ,
65
76
} ,
66
77
} ) ;
67
- await refetchCart ( ) ;
78
+ await fetchCart ( ) ;
68
79
} catch ( err ) {
80
+ error . value = err ;
69
81
} finally {
70
82
loading . value = false ;
71
83
}
@@ -81,41 +93,33 @@ export const useCart = defineStore(
81
93
items : [ { key, quantity } ] ,
82
94
} ,
83
95
} ) ;
84
- await refetchCart ( ) ;
96
+ await fetchCart ( ) ;
85
97
} catch ( err ) {
86
- await refetchCart ( ) ;
98
+ error . value = err ;
99
+ await fetchCart ( ) ;
87
100
} finally {
88
101
loading . value = false ;
89
102
}
90
103
} ;
91
104
92
105
const removeProductFromCart = async ( key ) => {
93
- loading . value = true ;
94
- error . value = null ;
95
106
try {
96
107
const isLastItem = cart . value . length === 1 ;
97
108
await updateCartItemQuantity ( key , 0 ) ;
98
109
if ( isLastItem ) {
99
110
await navigateTo ( "/" ) ;
100
111
}
101
112
} catch ( err ) {
102
- } finally {
103
- loading . value = false ;
113
+ error . value = err ;
104
114
}
105
115
} ;
106
116
107
117
const clearCart = async ( ) => {
108
- loading . value = true ;
109
- error . value = null ;
110
- try {
111
- for ( const item of cart . value ) {
112
- await removeProductFromCart ( item . key ) ;
113
- }
114
- } catch ( err ) {
115
- } finally {
116
- loading . value = false ;
117
- await refetchCart ( ) ;
118
- }
118
+ const itemKeys = cart . value . map ( ( item ) => ( {
119
+ key : item . key ,
120
+ quantity : 0 ,
121
+ } ) ) ;
122
+ await updateCartItemQuantity ( itemKeys ) ;
119
123
} ;
120
124
121
125
const cartQuantity = computed ( ( ) => {
@@ -142,7 +146,7 @@ export const useCart = defineStore(
142
146
cartQuantity,
143
147
cartSubtotal,
144
148
cartTotal,
145
- refetch : refetchCart ,
149
+ fetchCart ,
146
150
} ;
147
151
} ,
148
152
{
0 commit comments