Initial commit: Meshkee dashboards monorepo.
Includes business, customer, and super-admin apps with shared packages and production deploy scripts. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,110 @@
|
||||
import { apiRequest } from '../lib/api'
|
||||
import { getActiveBusinessId } from '../lib/businessContext'
|
||||
|
||||
export interface ShoppingCardCustomer {
|
||||
id: string
|
||||
firstName: string | null
|
||||
lastName: string | null
|
||||
cellNumber: string
|
||||
email: string | null
|
||||
}
|
||||
|
||||
export interface ShoppingCardItem {
|
||||
id: string
|
||||
storeItemVariantId: string | null
|
||||
productId: string
|
||||
productTitle: string
|
||||
variantSku: string | null
|
||||
unitPrice: number
|
||||
compareAtPrice: number | null
|
||||
quantity: number
|
||||
lineTotal: number
|
||||
selections: {
|
||||
variationId: string
|
||||
variationName: string
|
||||
optionId: string
|
||||
value: string
|
||||
}[]
|
||||
}
|
||||
|
||||
export interface ShoppingCard {
|
||||
id: string
|
||||
businessId: string
|
||||
subtotal: number
|
||||
total: number
|
||||
createdBy: string | null
|
||||
createdAt: string
|
||||
updatedAt: string
|
||||
customer: ShoppingCardCustomer
|
||||
items: ShoppingCardItem[]
|
||||
}
|
||||
|
||||
export interface ShoppingCardsListResponse {
|
||||
items: ShoppingCard[]
|
||||
total: number
|
||||
page: number
|
||||
pageSize: number
|
||||
}
|
||||
|
||||
export interface ListShoppingCardsParams {
|
||||
page?: number
|
||||
pageSize?: number
|
||||
customerQuery?: string
|
||||
dateFrom?: string
|
||||
dateTo?: string
|
||||
minTotal?: number
|
||||
maxTotal?: number
|
||||
}
|
||||
|
||||
export interface CreateShoppingCardPayload {
|
||||
customerUserId: string
|
||||
items: { storeItemVariantId: string; quantity: number }[]
|
||||
}
|
||||
|
||||
function businessPath(suffix = '') {
|
||||
const businessId = getActiveBusinessId()
|
||||
if (!businessId) {
|
||||
throw new Error('No active business selected. Please sign in again.')
|
||||
}
|
||||
return `/businesses/${businessId}/shopping-cards${suffix}`
|
||||
}
|
||||
|
||||
export async function listShoppingCards(
|
||||
params: ListShoppingCardsParams = {},
|
||||
signal?: AbortSignal,
|
||||
) {
|
||||
const q = new URLSearchParams()
|
||||
if (params.page !== undefined) q.set('page', String(params.page))
|
||||
if (params.pageSize !== undefined) q.set('pageSize', String(params.pageSize))
|
||||
if (params.customerQuery) q.set('customerQuery', params.customerQuery)
|
||||
if (params.dateFrom) q.set('dateFrom', params.dateFrom)
|
||||
if (params.dateTo) q.set('dateTo', params.dateTo)
|
||||
if (params.minTotal !== undefined) q.set('minTotal', String(params.minTotal))
|
||||
if (params.maxTotal !== undefined) q.set('maxTotal', String(params.maxTotal))
|
||||
|
||||
const query = q.toString()
|
||||
const path = `${businessPath()}${query ? `?${query}` : ''}`
|
||||
return apiRequest<ShoppingCardsListResponse>(path, { auth: true, signal })
|
||||
}
|
||||
|
||||
export async function getShoppingCard(cardId: string, signal?: AbortSignal) {
|
||||
return apiRequest<{ card: ShoppingCard }>(businessPath(`/${cardId}`), {
|
||||
auth: true,
|
||||
signal,
|
||||
})
|
||||
}
|
||||
|
||||
export async function createShoppingCard(payload: CreateShoppingCardPayload) {
|
||||
return apiRequest<{ message: string; card: ShoppingCard }>(businessPath(), {
|
||||
method: 'POST',
|
||||
auth: true,
|
||||
body: payload,
|
||||
})
|
||||
}
|
||||
|
||||
export async function removeShoppingCard(cardId: string) {
|
||||
return apiRequest<{ message: string }>(businessPath(`/${cardId}`), {
|
||||
method: 'DELETE',
|
||||
auth: true,
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user