93
93
</cart-total >
94
94
</slot >
95
95
</div >
96
+ <div class =" checkout-delivery__message" >
97
+ <slot name =" delivery-message" :opened =" opened" >
98
+ <cart-checkout-delivery-message :opened =" opened" >
99
+ <template #info-message > </template >
100
+ <template #message-button >
101
+ <div class =" msg-btn-wrapper" >
102
+ <button
103
+ type =" button"
104
+ class =" msg-btn"
105
+ @click =" opened = !opened"
106
+ >
107
+ <span class =" msg-btn__label" > {{ $t('cart.delivery.message-btn') }}</span >
108
+ <icon name =" mdi:message-outline" class =" msg-btn__icon" />
109
+ </button >
110
+ </div >
111
+ </template >
112
+ <template #action =" { opened } " >
113
+ <modal-popup :opened =" opened" @close =" onClose" >
114
+ <template #content >
115
+ <div class =" popup__content " >
116
+ <textarea
117
+ v-model =" messageContent"
118
+ class =" textarea"
119
+ rows =" 4"
120
+ :placeholder =" t('cart.delivery.message-label')"
121
+ >
122
+ </textarea >
123
+ <button
124
+ type =" button"
125
+ class =" modal-btn "
126
+ @click =" onMessageSubmit"
127
+ >
128
+ {{t('cart.delivery.message-btn-label')}}
129
+ </button >
130
+ </div >
131
+ </template >
132
+ </modal-popup >
133
+ </template >
134
+ </cart-checkout-delivery-message >
135
+ </slot >
136
+ </div >
96
137
<div class =" checkout-delivery__footer" >
97
- <button type =" button" class =" btn btn-ghost" @click =" back" >
98
- <icon name =" left" ></icon >
99
- {{ t('cart.back') }}
100
- </button >
138
+ <slot name =" footer" :back =" back" :opened =" opened" >
139
+ <div >
140
+ <button type =" button" class =" btn btn-ghost" @click =" back" >
141
+ <icon name =" left" ></icon >
142
+ {{ t('cart.back') }}
143
+ </button >
144
+ </div >
145
+ </slot >
101
146
</div >
102
147
</template >
103
148
<div v-else class =" checkout-delivery__summary" >
121
166
</div >
122
167
</template >
123
168
<script lang="ts" setup>
124
- import { CartTotal , DeliveryGeneric , Spinner } from ' #components'
169
+ import {
170
+ CartTotal ,
171
+ DeliveryGeneric ,
172
+ Spinner ,
173
+ ModalPopup ,
174
+ CartCheckoutDeliveryMessage
175
+ } from ' #components'
125
176
import type { DeliveryCarrier } from ' #models'
177
+ import type { Cart } from ' @shopinvader/cart'
126
178
interface CarrierWithComponent extends DeliveryCarrier {
127
179
component: any
128
180
carrier: DeliveryCarrier
129
181
}
182
+ const opened = ref (false )
183
+
130
184
const emit = defineEmits ({
131
185
/** Emit to go to the next step */
132
186
next : () => true ,
133
187
/** Emit to go back to the previous step */
134
- back : () => true
188
+ back : () => true ,
189
+ /** Emit to close de popup modal */
190
+ close : () => true
135
191
})
192
+
136
193
/**
137
194
* Checkout delivery step.
138
195
* This component is used in the Checkout funnel.
@@ -159,6 +216,7 @@ const selectedCarrier = ref(null as DeliveryCarrier | null)
159
216
const carriers = shallowRef ([] as CarrierWithComponent [])
160
217
const error = ref (null as string | null )
161
218
const loading = ref (false )
219
+ const messageContent = ref (' ' )
162
220
163
221
const hasValidCarrier = computed (() => {
164
222
if (selectedCarrier ?.value ) {
@@ -178,6 +236,28 @@ onMounted(async () => {
178
236
await fetchCarriers ()
179
237
})
180
238
239
+ const onClose = () => {
240
+ opened .value = false
241
+ emit (' close' )
242
+ }
243
+ const onMessageSubmit = async () => {
244
+ const cartService = useShopinvaderService (' cart' )
245
+ const cart = cartService .getCart ()
246
+ if (cart ?.value ) {
247
+ cart .value .note = messageContent .value
248
+ console .log (cart ?.value ?.note , ' cart' )
249
+
250
+ try {
251
+ loading .value = true
252
+ if (cart ?.value ) {
253
+ await cartService .update (cart .value )
254
+ }
255
+ } catch (err ) {
256
+ console .log (err )
257
+ }
258
+ }
259
+ opened .value = false
260
+ }
181
261
const next = () => {
182
262
if (hasValidCarrier .value ) {
183
263
emit (' next' )
@@ -285,14 +365,29 @@ const selectCarrier = async (carrier: DeliveryCarrier) => {
285
365
@apply col-span-3 flex flex-col justify-between ;
286
366
}
287
367
& __footer {
288
- @apply col-span-3 flex justify-between ;
368
+ @apply col-span-3 flex flex-col justify-between ;
289
369
}
290
370
& __error {
291
371
@apply col-span- 3;
292
372
}
293
373
& __loading {
294
374
@apply col-span-3 flex h-full flex-col items-center justify-center gap-4 md :col- span- 2;
295
375
}
376
+ & __message {
377
+ .msg-btn-wrapper {
378
+ @apply flex items-center ;
379
+ .msg-btn {
380
+ @apply px-6 btn-outline btn btn-primary btn-sm flex items-center ;
381
+ & __label {
382
+
383
+ }
384
+ & __icon {
385
+ @apply text- [0.85rem ];
386
+ }
387
+
388
+ }
389
+ }
390
+ }
296
391
& __summary {
297
392
@apply col-span-3 md :col- span- 2;
298
393
.method {
0 commit comments