"use server" import { sdk } from "@lib/config" import medusaError from "@lib/util/medusa-error" import { HttpTypes } from "@medusajs/types" import { revalidateTag } from "next/cache" import { redirect } from "next/navigation" import { getAuthHeaders, getCacheOptions, getCacheTag, getCartId, removeAuthToken, removeCartId, setAuthToken, } from "./cookies" export const retrieveCustomer = async (): Promise => { const authHeaders = await getAuthHeaders() if (!authHeaders) return null const headers = { ...authHeaders, } const next = { ...(await getCacheOptions("customers")), } return await sdk.client .fetch<{ customer: HttpTypes.StoreCustomer }>(`/store/customers/me`, { method: "GET", query: { fields: "*orders", }, headers, next, cache: "force-cache", }) .then(({ customer }) => customer) .catch(() => null) } export const updateCustomer = async (body: HttpTypes.StoreUpdateCustomer) => { const headers = { ...(await getAuthHeaders()), } const updateRes = await sdk.store.customer .update(body, {}, headers) .then(({ customer }) => customer) .catch(medusaError) const cacheTag = await getCacheTag("customers") revalidateTag(cacheTag) return updateRes } export async function signup(_currentState: unknown, formData: FormData) { const password = formData.get("password") as string const customerForm = { email: formData.get("email") as string, first_name: formData.get("first_name") as string, last_name: formData.get("last_name") as string, phone: formData.get("phone") as string, } try { const token = await sdk.auth.register("customer", "emailpass", { email: customerForm.email, password: password, }) await setAuthToken(token as string) const headers = { ...(await getAuthHeaders()), } const { customer: createdCustomer } = await sdk.store.customer.create( customerForm, {}, headers ) const loginToken = await sdk.auth.login("customer", "emailpass", { email: customerForm.email, password, }) await setAuthToken(loginToken as string) const customerCacheTag = await getCacheTag("customers") revalidateTag(customerCacheTag) await transferCart() return createdCustomer } catch (error: any) { return error.toString() } } export async function login(_currentState: unknown, formData: FormData) { const email = formData.get("email") as string const password = formData.get("password") as string try { await sdk.auth .login("customer", "emailpass", { email, password }) .then(async (token) => { await setAuthToken(token as string) const customerCacheTag = await getCacheTag("customers") revalidateTag(customerCacheTag) }) } catch (error: any) { return error.toString() } try { await transferCart() } catch (error: any) { return error.toString() } } export async function signout(countryCode: string) { await sdk.auth.logout() await removeAuthToken() const customerCacheTag = await getCacheTag("customers") revalidateTag(customerCacheTag) await removeCartId() const cartCacheTag = await getCacheTag("carts") revalidateTag(cartCacheTag) redirect(`/${countryCode}/account`) } export async function transferCart() { const cartId = await getCartId() if (!cartId) { return } const headers = await getAuthHeaders() await sdk.store.cart.transferCart(cartId, {}, headers) const cartCacheTag = await getCacheTag("carts") revalidateTag(cartCacheTag) } export const addCustomerAddress = async ( currentState: Record, formData: FormData ): Promise => { const isDefaultBilling = (currentState.isDefaultBilling as boolean) || false const isDefaultShipping = (currentState.isDefaultShipping as boolean) || false const address = { first_name: formData.get("first_name") as string, last_name: formData.get("last_name") as string, company: formData.get("company") as string, address_1: formData.get("address_1") as string, address_2: formData.get("address_2") as string, city: formData.get("city") as string, postal_code: formData.get("postal_code") as string, province: formData.get("province") as string, country_code: formData.get("country_code") as string, phone: formData.get("phone") as string, is_default_billing: isDefaultBilling, is_default_shipping: isDefaultShipping, } const headers = { ...(await getAuthHeaders()), } return sdk.store.customer .createAddress(address, {}, headers) .then(async ({ customer }) => { const customerCacheTag = await getCacheTag("customers") revalidateTag(customerCacheTag) return { success: true, error: null } }) .catch((err) => { return { success: false, error: err.toString() } }) } export const deleteCustomerAddress = async ( addressId: string ): Promise => { const headers = { ...(await getAuthHeaders()), } await sdk.store.customer .deleteAddress(addressId, headers) .then(async () => { const customerCacheTag = await getCacheTag("customers") revalidateTag(customerCacheTag) return { success: true, error: null } }) .catch((err) => { return { success: false, error: err.toString() } }) } export const updateCustomerAddress = async ( currentState: Record, formData: FormData ): Promise => { const addressId = (currentState.addressId as string) || (formData.get("addressId") as string) if (!addressId) { return { success: false, error: "Address ID is required" } } const address = { first_name: formData.get("first_name") as string, last_name: formData.get("last_name") as string, company: formData.get("company") as string, address_1: formData.get("address_1") as string, address_2: formData.get("address_2") as string, city: formData.get("city") as string, postal_code: formData.get("postal_code") as string, province: formData.get("province") as string, country_code: formData.get("country_code") as string, } as HttpTypes.StoreUpdateCustomerAddress const phone = formData.get("phone") as string if (phone) { address.phone = phone } const headers = { ...(await getAuthHeaders()), } return sdk.store.customer .updateAddress(addressId, address, {}, headers) .then(async () => { const customerCacheTag = await getCacheTag("customers") revalidateTag(customerCacheTag) return { success: true, error: null } }) .catch((err) => { return { success: false, error: err.toString() } }) }