-
Notifications
You must be signed in to change notification settings - Fork 5.5k
Expand file tree
/
Copy pathactions.ts
More file actions
102 lines (87 loc) · 2.27 KB
/
Copy pathactions.ts
File metadata and controls
102 lines (87 loc) · 2.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
'use server';
import { TAGS } from 'lib/constants';
import { addToCart, createCart, getCart, removeFromCart, updateCart } from 'lib/shopify';
import { revalidateTag } from 'next/cache';
import { cookies } from 'next/headers';
import { ShopifyAnalyticsProduct } from '@shopify/hydrogen-react';
import { productToAnalytics } from 'lib/utils';
type AddItemResponse = {
cartId?: string;
success: boolean;
message?: string;
products?: ShopifyAnalyticsProduct[];
};
export async function addItem(
prevState: any,
selectedVariantId: string | undefined
): Promise<AddItemResponse> {
let cartId = cookies().get('cartId')?.value;
let cart;
const quantity = 1;
if (cartId) {
cart = await getCart(cartId);
}
if (!cartId || !cart) {
cart = await createCart();
cartId = cart.id;
cookies().set('cartId', cartId);
}
if (!selectedVariantId) {
return { success: false, message: 'Missing product variant ID' };
}
try {
const response = await addToCart(cartId, [{ merchandiseId: selectedVariantId, quantity }]);
revalidateTag(TAGS.cart);
return {
success: true,
message: 'Item added to cart',
cartId,
products: productToAnalytics(response.lines, quantity, selectedVariantId)
};
} catch (e) {
return { success: false, message: 'Error adding item to cart' };
}
}
export async function removeItem(prevState: any, lineId: string) {
const cartId = cookies().get('cartId')?.value;
if (!cartId) {
return 'Missing cart ID';
}
try {
await removeFromCart(cartId, [lineId]);
revalidateTag(TAGS.cart);
} catch (e) {
return 'Error removing item from cart';
}
}
export async function updateItemQuantity(
prevState: any,
payload: {
lineId: string;
variantId: string;
quantity: number;
}
) {
const cartId = cookies().get('cartId')?.value;
if (!cartId) {
return 'Missing cart ID';
}
const { lineId, variantId, quantity } = payload;
try {
if (quantity === 0) {
await removeFromCart(cartId, [lineId]);
revalidateTag(TAGS.cart);
return;
}
await updateCart(cartId, [
{
id: lineId,
merchandiseId: variantId,
quantity
}
]);
revalidateTag(TAGS.cart);
} catch (e) {
return 'Error updating item quantity';
}
}