@mohasinac/appkit 3.2.20 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_internal/server/features/checkout/actions.d.ts +2 -0
- package/dist/_internal/server/features/checkout/actions.js +239 -190
- package/dist/_internal/server/functions/scheduled.d.ts +2 -1
- package/dist/_internal/server/functions/scheduled.js +9 -1
- package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +8 -11
- package/dist/_internal/server/jobs/core/emiInstallmentReminder.d.ts +8 -0
- package/dist/_internal/server/jobs/core/emiInstallmentReminder.js +78 -0
- package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.d.ts +2 -2
- package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +15 -10
- package/dist/_internal/server/jobs/handlers/emiInstallmentReminder.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/emiInstallmentReminder.js +2 -0
- package/dist/_internal/server/jobs/handlers/index.d.ts +1 -0
- package/dist/_internal/server/jobs/handlers/index.js +2 -0
- package/dist/_internal/server/providers/index.d.ts +4 -4
- package/dist/_internal/server/providers/index.js +4 -4
- package/dist/_internal/server/providers/payment/razorpay-mock.d.ts +3 -2
- package/dist/_internal/server/providers/payment/razorpay-mock.js +3 -1
- package/dist/_internal/server/providers/resolve.d.ts +10 -13
- package/dist/_internal/server/providers/resolve.js +9 -15
- package/dist/_internal/shared/actions/action-registry.js +28 -0
- package/dist/_internal/shared/checkout/rules/_defaults.js +1 -0
- package/dist/_internal/shared/checkout/rules/_registry.js +4 -0
- package/dist/_internal/shared/checkout/rules/art.rule.d.ts +9 -0
- package/dist/_internal/shared/checkout/rules/art.rule.js +5 -0
- package/dist/_internal/shared/checkout/rules/auction.rule.js +1 -0
- package/dist/_internal/shared/checkout/rules/classified.rule.js +1 -0
- package/dist/_internal/shared/checkout/rules/index.d.ts +2 -0
- package/dist/_internal/shared/checkout/rules/index.js +2 -0
- package/dist/_internal/shared/checkout/rules/stickers.rule.d.ts +9 -0
- package/dist/_internal/shared/checkout/rules/stickers.rule.js +5 -0
- package/dist/_internal/shared/checkout/rules/types.d.ts +6 -0
- package/dist/_internal/shared/features/checkout/config.d.ts +16 -1
- package/dist/_internal/shared/features/checkout/config.js +16 -1
- package/dist/_internal/shared/features/emi/schedule.d.ts +63 -0
- package/dist/_internal/shared/features/emi/schedule.js +62 -0
- package/dist/_internal/shared/fees/calculator.d.ts +53 -0
- package/dist/_internal/shared/fees/calculator.js +40 -0
- package/dist/_internal/shared/listing-types/_registry.d.ts +22 -66
- package/dist/_internal/shared/listing-types/_registry.js +19 -2
- package/dist/_internal/shared/listing-types/art/config.d.ts +15 -0
- package/dist/_internal/shared/listing-types/art/config.js +14 -0
- package/dist/_internal/shared/listing-types/art/ctas.d.ts +1 -0
- package/dist/_internal/shared/listing-types/art/ctas.js +3 -0
- package/dist/_internal/shared/listing-types/art/og.d.ts +1 -0
- package/dist/_internal/shared/listing-types/art/og.js +1 -0
- package/dist/_internal/shared/listing-types/art/schema.d.ts +2 -0
- package/dist/_internal/shared/listing-types/art/schema.js +3 -0
- package/dist/_internal/shared/listing-types/art/seed-factory.d.ts +1 -0
- package/dist/_internal/shared/listing-types/art/seed-factory.js +1 -0
- package/dist/_internal/shared/listing-types/auction/config.d.ts +8 -0
- package/dist/_internal/shared/listing-types/auction/config.js +6 -0
- package/dist/_internal/shared/listing-types/capabilities.js +17 -0
- package/dist/_internal/shared/listing-types/classified/config.d.ts +8 -0
- package/dist/_internal/shared/listing-types/classified/config.js +6 -0
- package/dist/_internal/shared/listing-types/digital-code/config.d.ts +8 -0
- package/dist/_internal/shared/listing-types/digital-code/config.js +6 -0
- package/dist/_internal/shared/listing-types/live/config.d.ts +8 -0
- package/dist/_internal/shared/listing-types/live/config.js +6 -0
- package/dist/_internal/shared/listing-types/pre-order/config.d.ts +8 -0
- package/dist/_internal/shared/listing-types/pre-order/config.js +6 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +8 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.js +6 -0
- package/dist/_internal/shared/listing-types/standard/config.d.ts +8 -0
- package/dist/_internal/shared/listing-types/standard/config.js +6 -0
- package/dist/_internal/shared/listing-types/stickers/config.d.ts +15 -0
- package/dist/_internal/shared/listing-types/stickers/config.js +14 -0
- package/dist/_internal/shared/listing-types/stickers/ctas.d.ts +1 -0
- package/dist/_internal/shared/listing-types/stickers/ctas.js +3 -0
- package/dist/_internal/shared/listing-types/stickers/og.d.ts +1 -0
- package/dist/_internal/shared/listing-types/stickers/og.js +1 -0
- package/dist/_internal/shared/listing-types/stickers/schema.d.ts +2 -0
- package/dist/_internal/shared/listing-types/stickers/schema.js +3 -0
- package/dist/_internal/shared/listing-types/stickers/seed-factory.d.ts +1 -0
- package/dist/_internal/shared/listing-types/stickers/seed-factory.js +1 -0
- package/dist/client.d.ts +7 -2
- package/dist/client.js +4 -2
- package/dist/constants/field-names.d.ts +2 -6
- package/dist/constants/field-names.js +2 -6
- package/dist/contracts/index.d.ts +4 -2
- package/dist/contracts/index.js +6 -0
- package/dist/contracts/payment.d.ts +14 -9
- package/dist/contracts/payment.js +11 -1
- package/dist/contracts/shipping.d.ts +14 -9
- package/dist/contracts/shipping.js +11 -1
- package/dist/features/about/components/PublicProfileView.js +3 -6
- package/dist/features/admin/components/AdminAddressBookView.d.ts +11 -0
- package/dist/features/admin/components/AdminAddressBookView.js +30 -0
- package/dist/features/admin/components/AdminArtView.d.ts +3 -0
- package/dist/features/admin/components/AdminArtView.js +45 -0
- package/dist/features/admin/components/AdminSiteConfigGuideView.js +1 -1
- package/dist/features/admin/components/AdminSiteSettingsView.js +14 -9
- package/dist/features/admin/components/AdminStickersView.d.ts +3 -0
- package/dist/features/admin/components/AdminStickersView.js +45 -0
- package/dist/features/admin/components/index.d.ts +6 -0
- package/dist/features/admin/components/index.js +4 -0
- package/dist/features/admin/schemas/firestore.d.ts +19 -11
- package/dist/features/admin/schemas/firestore.js +12 -2
- package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +3 -2
- package/dist/features/auth/hooks/useAuth.js +35 -9
- package/dist/features/auth/schemas/firestore.d.ts +2 -6
- package/dist/features/cart/schemas/firestore.d.ts +3 -2
- package/dist/features/consultation/schemas/index.d.ts +2 -2
- package/dist/features/loyalty/schemas/index.d.ts +6 -6
- package/dist/features/orders/repository/orders.repository.d.ts +20 -2
- package/dist/features/orders/repository/orders.repository.js +34 -5
- package/dist/features/orders/schemas/firestore.d.ts +33 -7
- package/dist/features/orders/schemas/firestore.js +1 -1
- package/dist/features/orders/schemas/index.d.ts +176 -31
- package/dist/features/orders/schemas/index.js +20 -6
- package/dist/features/orders/types/index.d.ts +3 -3
- package/dist/features/payments/repository/payout.repository.js +2 -2
- package/dist/features/payments/schemas/firestore.d.ts +3 -3
- package/dist/features/payments/schemas/firestore.js +2 -2
- package/dist/features/payments/schemas/index.d.ts +5 -5
- package/dist/features/payments/schemas/index.js +2 -2
- package/dist/features/products/api/[id]/route.js +4 -1
- package/dist/features/products/api/route.js +4 -1
- package/dist/features/products/components/CompareOverlay.js +7 -9
- package/dist/features/products/components/ProductDetailPageView.d.ts +3 -1
- package/dist/features/products/components/ProductDetailPageView.js +2 -2
- package/dist/features/products/components/ProductForm.js +18 -7
- package/dist/features/products/components/ProductGrid.js +7 -12
- package/dist/features/products/components/ShowGroupSection.js +3 -5
- package/dist/features/products/components/SublistingCarouselSection.js +3 -6
- package/dist/features/products/constants/listing-tabs.d.ts +32 -0
- package/dist/features/products/constants/listing-tabs.js +8 -0
- package/dist/features/products/index.d.ts +1 -1
- package/dist/features/products/index.js +3 -1
- package/dist/features/products/schemas/firestore.d.ts +20 -1
- package/dist/features/products/schemas/firestore.js +2 -0
- package/dist/features/products/schemas/index.d.ts +48 -0
- package/dist/features/products/schemas/index.js +9 -0
- package/dist/features/products/schemas/product-features.d.ts +1 -1
- package/dist/features/products/types/index.d.ts +5 -3
- package/dist/features/products/utils/listing-type.d.ts +6 -0
- package/dist/features/products/utils/listing-type.js +3 -0
- package/dist/features/reviews/api/[id]/route.js +5 -4
- package/dist/features/seller/actions/seller-actions.d.ts +29 -14
- package/dist/features/seller/actions/seller-actions.js +101 -27
- package/dist/features/seller/components/SellerArtView.d.ts +7 -0
- package/dist/features/seller/components/SellerArtView.js +114 -0
- package/dist/features/seller/components/SellerOrdersView.js +38 -1
- package/dist/features/seller/components/SellerProductShell.d.ts +5 -1
- package/dist/features/seller/components/SellerProductShell.js +69 -59
- package/dist/features/seller/components/SellerShippingView.js +6 -25
- package/dist/features/seller/components/SellerStickersView.d.ts +7 -0
- package/dist/features/seller/components/SellerStickersView.js +114 -0
- package/dist/features/seller/components/index.d.ts +4 -0
- package/dist/features/seller/components/index.js +2 -0
- package/dist/features/seller/messages/en.json +1 -1
- package/dist/features/seller/schemas/index.d.ts +7 -7
- package/dist/features/seller/schemas/index.js +1 -1
- package/dist/features/seller/types/index.d.ts +1 -1
- package/dist/features/stores/components/StoreDetailLayoutView.js +18 -2
- package/dist/features/stores/schemas/firestore.d.ts +7 -1
- package/dist/features/stores/schemas/index.d.ts +19 -16
- package/dist/features/stores/schemas/index.js +1 -1
- package/dist/index.d.ts +21 -36
- package/dist/index.js +27 -39
- package/dist/next/routing/route-map.d.ts +22 -0
- package/dist/next/routing/route-map.js +10 -0
- package/dist/providers/payment-manual/index.d.ts +40 -0
- package/dist/providers/payment-manual/index.js +91 -0
- package/dist/providers/payment-razorpay/index.d.ts +4 -2
- package/dist/providers/payment-razorpay/index.js +4 -1
- package/dist/providers/shipping-manual/index.d.ts +22 -0
- package/dist/providers/shipping-manual/index.js +47 -0
- package/dist/providers.d.ts +2 -2
- package/dist/providers.js +5 -3
- package/dist/schemas/registry.d.ts +129 -70
- package/dist/schemas/registry.js +0 -4
- package/dist/security/pii-encrypt.js +0 -7
- package/dist/security/pii-redact.js +0 -1
- package/dist/seed/conversations-seed-data.js +2 -2
- package/dist/seed/faq-seed-data.js +7 -7
- package/dist/seed/grouped-listings-seed-data.d.ts +2 -0
- package/dist/seed/index.d.ts +2 -0
- package/dist/seed/index.js +2 -0
- package/dist/seed/manifest.js +20 -16
- package/dist/seed/payouts-seed-data.js +5 -5
- package/dist/seed/products-art-seed-data.d.ts +11 -0
- package/dist/seed/products-art-seed-data.js +125 -0
- package/dist/seed/products-preorders-seed-data.d.ts +2 -0
- package/dist/seed/products-stickers-seed-data.d.ts +11 -0
- package/dist/seed/products-stickers-seed-data.js +125 -0
- package/dist/seed/site-settings-seed-data.js +13 -4
- package/dist/seed/stores-seed-data.js +11 -11
- package/dist/server.d.ts +7 -15
- package/dist/server.js +17 -42
- package/package.json +1 -1
|
@@ -7,11 +7,8 @@ import { StoreAddressSelectorCreate } from "../../stores/components/StoreAddress
|
|
|
7
7
|
import { StepForm } from "../../shell";
|
|
8
8
|
import { normalizeError } from "../../../errors/normalize";
|
|
9
9
|
const DEFAULT_DRAFT = {
|
|
10
|
-
method: "custom",
|
|
11
10
|
customCarrierName: "",
|
|
12
11
|
customShippingPrice: "",
|
|
13
|
-
shiprocketEmail: "",
|
|
14
|
-
shiprocketPassword: "",
|
|
15
12
|
pickupAddressId: "",
|
|
16
13
|
freeShippingThreshold: "",
|
|
17
14
|
fragileSurcharge: "",
|
|
@@ -31,11 +28,8 @@ export function SellerShippingView({ apiBase = "/api/store/shipping" }) {
|
|
|
31
28
|
const cfg = res?.data?.shippingConfig ?? { method: "custom", isConfigured: false };
|
|
32
29
|
setCurrent(cfg);
|
|
33
30
|
setDraft({
|
|
34
|
-
method: cfg.method,
|
|
35
31
|
customCarrierName: cfg.customCarrierName ?? "",
|
|
36
32
|
customShippingPrice: cfg.customShippingPrice ? String(cfg.customShippingPrice / 100) : "",
|
|
37
|
-
shiprocketEmail: cfg.shiprocketEmail ?? "",
|
|
38
|
-
shiprocketPassword: "",
|
|
39
33
|
pickupAddressId: "",
|
|
40
34
|
freeShippingThreshold: (res?.data?.freeShippingThreshold ?? 0)
|
|
41
35
|
? String(res.data.freeShippingThreshold / 100)
|
|
@@ -57,20 +51,9 @@ export function SellerShippingView({ apiBase = "/api/store/shipping" }) {
|
|
|
57
51
|
setSuccess(false);
|
|
58
52
|
setSaving(true);
|
|
59
53
|
try {
|
|
60
|
-
const methodFields = draft.method === "custom"
|
|
61
|
-
? {
|
|
62
|
-
method: "custom",
|
|
63
|
-
customCarrierName: draft.customCarrierName.trim(),
|
|
64
|
-
customShippingPrice: Math.round(parseFloat(draft.customShippingPrice || "0") * 100),
|
|
65
|
-
}
|
|
66
|
-
: {
|
|
67
|
-
method: "shiprocket",
|
|
68
|
-
...(draft.shiprocketPassword
|
|
69
|
-
? { shiprocketCredentials: { email: draft.shiprocketEmail, password: draft.shiprocketPassword } }
|
|
70
|
-
: {}),
|
|
71
|
-
};
|
|
72
54
|
const body = {
|
|
73
|
-
|
|
55
|
+
customCarrierName: draft.customCarrierName.trim(),
|
|
56
|
+
customShippingPrice: Math.round(parseFloat(draft.customShippingPrice || "0") * 100),
|
|
74
57
|
...(draft.pickupAddressId ? { pickupAddressId: draft.pickupAddressId } : {}),
|
|
75
58
|
freeShippingThreshold: Math.round(parseFloat(draft.freeShippingThreshold || "0") * 100),
|
|
76
59
|
fragileSurcharge: Math.round(parseFloat(draft.fragileSurcharge || "0") * 100),
|
|
@@ -84,7 +67,7 @@ export function SellerShippingView({ apiBase = "/api/store/shipping" }) {
|
|
|
84
67
|
if (!res.ok)
|
|
85
68
|
throw new Error(json?.error ?? "Failed to save");
|
|
86
69
|
setSuccess(true);
|
|
87
|
-
const cfg = json?.data?.shippingConfig ?? { method:
|
|
70
|
+
const cfg = json?.data?.shippingConfig ?? { method: "custom", isConfigured: false };
|
|
88
71
|
setCurrent(cfg);
|
|
89
72
|
}
|
|
90
73
|
catch (err) {
|
|
@@ -98,14 +81,12 @@ export function SellerShippingView({ apiBase = "/api/store/shipping" }) {
|
|
|
98
81
|
const busy = loading || saving;
|
|
99
82
|
const steps = [
|
|
100
83
|
{
|
|
101
|
-
label: "
|
|
102
|
-
render: ({ values, onChange }) => (_jsxs(Stack, { gap: "md", children: [_jsx(Heading, { level: 3, className: "mb-2", children: "Shipping
|
|
103
|
-
? "Set a fixed shipping fee and carrier name for all orders."
|
|
104
|
-
: "Automated shipping via Shiprocket — connect your account for label generation and tracking." })] })] }, m))) }), values.method === "custom" && (_jsxs(Stack, { gap: "md", className: "mt-2", children: [_jsx(FormField, { name: "customCarrierName", label: "Carrier Name", type: "text", value: values.customCarrierName, onChange: (v) => onChange({ customCarrierName: v }), placeholder: "e.g. India Post, DTDC, Delhivery", disabled: busy }), _jsx(FormField, { name: "customShippingPrice", label: "Shipping Price (\u20B9)", type: "number", value: values.customShippingPrice, onChange: (v) => onChange({ customShippingPrice: v }), placeholder: "0 for free shipping", helpText: "Charged to buyer at checkout. Enter 0 for free shipping.", disabled: busy })] })), values.method === "shiprocket" && (_jsxs(Stack, { gap: "md", className: "mt-2", children: [_jsx(FormField, { name: "shiprocketEmail", label: "Shiprocket Email", type: "email", value: values.shiprocketEmail, onChange: (v) => onChange({ shiprocketEmail: v }), placeholder: "your@email.com", disabled: busy }), _jsx(FormField, { name: "shiprocketPassword", label: current?.isTokenValid ? "Password (leave blank to keep existing token)" : "Password", type: "password", value: values.shiprocketPassword, onChange: (v) => onChange({ shiprocketPassword: v }), placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022", helpText: current?.isTokenValid ? "Only fill this to re-authenticate." : "Required to connect your Shiprocket account.", disabled: busy })] }))] })),
|
|
84
|
+
label: "Carrier",
|
|
85
|
+
render: ({ values, onChange }) => (_jsxs(Stack, { gap: "md", children: [_jsx(Heading, { level: 3, className: "mb-2", children: "Shipping Carrier" }), current && (_jsx(Row, { className: "mb-2", align: "center", gap: "sm", children: _jsx(Badge, { variant: current.isConfigured ? "success" : "warning", children: current.isConfigured ? "Configured" : "Not configured" }) })), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "sm", children: "Set a fixed shipping fee and carrier name for all orders. You enter the carrier and tracking number yourself when you ship each order." }), _jsxs(Stack, { gap: "md", className: "mt-2", children: [_jsx(FormField, { name: "customCarrierName", label: "Carrier Name", type: "text", value: values.customCarrierName, onChange: (v) => onChange({ customCarrierName: v }), placeholder: "e.g. India Post, DTDC, Delhivery", disabled: busy }), _jsx(FormField, { name: "customShippingPrice", label: "Shipping Price (\u20B9)", type: "number", value: values.customShippingPrice, onChange: (v) => onChange({ customShippingPrice: v }), placeholder: "0 for free shipping", helpText: "Charged to buyer at checkout. Enter 0 for free shipping.", disabled: busy })] })] })),
|
|
105
86
|
},
|
|
106
87
|
{
|
|
107
88
|
label: "Pickup Address",
|
|
108
|
-
render: ({ values, onChange }) => (_jsxs(Stack, { gap: "md", children: [_jsx(Heading, { level: 3, className: "mb-2", children: "Pickup Address" }), current?.pickupAddress && (_jsxs(Alert, { variant: "info", children: ["Current pickup: ", current.pickupAddress.locationName ?? "", current.pickupAddress.city ? `, ${current.pickupAddress.city}` : ""
|
|
89
|
+
render: ({ values, onChange }) => (_jsxs(Stack, { gap: "md", children: [_jsx(Heading, { level: 3, className: "mb-2", children: "Pickup Address" }), current?.pickupAddress && (_jsxs(Alert, { variant: "info", children: ["Current pickup: ", current.pickupAddress.locationName ?? "", current.pickupAddress.city ? `, ${current.pickupAddress.city}` : ""] })), _jsx(StoreAddressSelectorCreate, { value: values.pickupAddressId, onChange: (id) => onChange({ pickupAddressId: id }), label: "Pickup Address", disabled: busy })] })),
|
|
109
90
|
},
|
|
110
91
|
{
|
|
111
92
|
label: "Rules",
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface SellerStickersViewProps {
|
|
2
|
+
onCreateClick?: () => void;
|
|
3
|
+
onEditClick?: (id: string) => void;
|
|
4
|
+
onDelete?: (id: string) => Promise<void>;
|
|
5
|
+
onBulkDelete?: (ids: string[]) => Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export declare function SellerStickersView({ onCreateClick, onEditClick, onDelete, onBulkDelete, }: SellerStickersViewProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* SellerStickersView — seller browse/manage of sticker listings
|
|
5
|
+
* (EMI/art-stickers session). Mirrors SellerClassifiedView's pattern.
|
|
6
|
+
*/
|
|
7
|
+
import { Badge, sortBy } from "@mohasinac/appkit";
|
|
8
|
+
import { useState, useCallback } from "react";
|
|
9
|
+
import { useEntityDelete } from "../../../react/hooks/useEntityDelete";
|
|
10
|
+
import { ConfirmDeleteModal, RowActionMenu, Text } from "../../../ui";
|
|
11
|
+
import { SELLER_ENDPOINTS } from "../../../constants/api-endpoints";
|
|
12
|
+
import { ACTIONS } from "../../../_internal/shared/actions/action-registry";
|
|
13
|
+
import { ROUTES } from "../../..";
|
|
14
|
+
import { toRecordArray, toRelativeDate, toRupees, toStringValue, } from "../../admin/hooks/useAdminListingData";
|
|
15
|
+
import { DataListingView } from "../../admin/components/DataListingView";
|
|
16
|
+
const COLUMNS = [
|
|
17
|
+
{ key: "title", header: "Listing", render: (row) => _jsx(Text, { size: "sm", weight: "medium", children: row.title }) },
|
|
18
|
+
{ key: "price", header: "Price", render: (row) => _jsx(Text, { className: "tabular-nums", size: "sm", children: row.price }) },
|
|
19
|
+
{
|
|
20
|
+
key: "size",
|
|
21
|
+
header: "Size",
|
|
22
|
+
render: (row) => _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "sm", children: row.size || "—" }),
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
key: "status",
|
|
26
|
+
header: "Status",
|
|
27
|
+
render: (row) => (_jsx(Badge, { variant: row.status === "active" ? "active" : "inactive", size: "xs", className: "capitalize", children: row.status })),
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
key: "createdAt",
|
|
31
|
+
header: "Created",
|
|
32
|
+
render: (row) => _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "sm", children: row.createdAt }),
|
|
33
|
+
},
|
|
34
|
+
];
|
|
35
|
+
export function SellerStickersView({ onCreateClick, onEditClick, onDelete, onBulkDelete, }) {
|
|
36
|
+
const [deleteTargetId, setDeleteTargetId] = useState(null);
|
|
37
|
+
const { deletingId, handleDelete: performDelete } = useEntityDelete({
|
|
38
|
+
endpoint: (id) => `/api/store/products/${id}`,
|
|
39
|
+
deleteFn: onDelete,
|
|
40
|
+
successMessage: "Listing deleted.",
|
|
41
|
+
fetchOptions: { credentials: "include" },
|
|
42
|
+
});
|
|
43
|
+
const handleDelete = useCallback(async (id) => {
|
|
44
|
+
await performDelete(id);
|
|
45
|
+
setDeleteTargetId(null);
|
|
46
|
+
}, [performDelete]);
|
|
47
|
+
const handleEdit = useCallback((id) => {
|
|
48
|
+
if (onEditClick)
|
|
49
|
+
onEditClick(id);
|
|
50
|
+
else
|
|
51
|
+
window.location.href = String(ROUTES.STORE.STICKERS_EDIT(id));
|
|
52
|
+
}, [onEditClick]);
|
|
53
|
+
const handleCreate = useCallback(() => {
|
|
54
|
+
if (onCreateClick)
|
|
55
|
+
onCreateClick();
|
|
56
|
+
else
|
|
57
|
+
window.location.href = String(ROUTES.STORE.STICKERS_NEW);
|
|
58
|
+
}, [onCreateClick]);
|
|
59
|
+
const config = {
|
|
60
|
+
portal: "seller",
|
|
61
|
+
title: "Stickers",
|
|
62
|
+
searchPlaceholder: "Search sticker listings...",
|
|
63
|
+
emptyLabel: "No sticker listings yet — list your first pack",
|
|
64
|
+
filterKeys: [],
|
|
65
|
+
defaultSort: sortBy("createdAt", "DESC"),
|
|
66
|
+
queryKey: ["seller", "stickers"],
|
|
67
|
+
endpoint: SELLER_ENDPOINTS.PRODUCTS,
|
|
68
|
+
sortOptions: [
|
|
69
|
+
{ value: sortBy("createdAt", "DESC"), label: "Newest" },
|
|
70
|
+
{ value: sortBy("createdAt", "ASC"), label: "Oldest" },
|
|
71
|
+
{ value: "productTitle", label: "Name A–Z" },
|
|
72
|
+
{ value: sortBy("price", "ASC"), label: "Price: Low–High" },
|
|
73
|
+
{ value: sortBy("price", "DESC"), label: "Price: High–Low" },
|
|
74
|
+
],
|
|
75
|
+
columns: COLUMNS,
|
|
76
|
+
mapRows: (response) => toRecordArray(response.products).map((item, index) => {
|
|
77
|
+
const printMeta = (item.printMeta ?? {});
|
|
78
|
+
return {
|
|
79
|
+
id: toStringValue(item.id, `stickers-${index}`),
|
|
80
|
+
title: toStringValue(item.productTitle ?? item.title, "Untitled"),
|
|
81
|
+
price: toRupees(item.price),
|
|
82
|
+
size: toStringValue(printMeta.size, ""),
|
|
83
|
+
status: toStringValue(item.status, "draft"),
|
|
84
|
+
createdAt: toRelativeDate(item.createdAt),
|
|
85
|
+
};
|
|
86
|
+
}),
|
|
87
|
+
getTotal: (response, mappedRows) => typeof response.meta?.total === "number" ? response.meta.total : mappedRows.length,
|
|
88
|
+
buildFilters: () => "listingType==stickers",
|
|
89
|
+
primaryAction: { label: "New Sticker Listing", onClick: () => handleCreate() },
|
|
90
|
+
buildBulkActions: onBulkDelete
|
|
91
|
+
? (selection) => [
|
|
92
|
+
{
|
|
93
|
+
id: "bulk-delete",
|
|
94
|
+
label: ACTIONS.STORE["delete-listing"].label,
|
|
95
|
+
variant: "danger",
|
|
96
|
+
onClick: async () => {
|
|
97
|
+
await onBulkDelete(selection.selectedIds);
|
|
98
|
+
selection.clearSelection();
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
]
|
|
102
|
+
: undefined,
|
|
103
|
+
renderRowActions: (row) => (_jsx(RowActionMenu, { actions: [
|
|
104
|
+
{ label: ACTIONS.STORE["edit-listing"].label, onClick: () => handleEdit(row.id) },
|
|
105
|
+
{
|
|
106
|
+
label: ACTIONS.STORE["delete-listing"].label,
|
|
107
|
+
destructive: true,
|
|
108
|
+
onClick: () => setDeleteTargetId(row.id),
|
|
109
|
+
disabled: deletingId === row.id,
|
|
110
|
+
},
|
|
111
|
+
] })),
|
|
112
|
+
};
|
|
113
|
+
return (_jsxs(_Fragment, { children: [_jsx(DataListingView, { config: config }), deleteTargetId && (_jsx(ConfirmDeleteModal, { isOpen: true, title: "Delete Sticker Listing", message: "Are you sure you want to delete this sticker listing? This cannot be undone.", onConfirm: () => handleDelete(deleteTargetId), onClose: () => setDeleteTargetId(null), isDeleting: deletingId === deleteTargetId }))] }));
|
|
114
|
+
}
|
|
@@ -124,6 +124,10 @@ export { SellerBundlesView } from "./SellerBundlesView";
|
|
|
124
124
|
export type { SellerBundlesViewProps } from "./SellerBundlesView";
|
|
125
125
|
export { SellerClassifiedView } from "./SellerClassifiedView";
|
|
126
126
|
export type { SellerClassifiedViewProps } from "./SellerClassifiedView";
|
|
127
|
+
export { SellerArtView } from "./SellerArtView";
|
|
128
|
+
export type { SellerArtViewProps } from "./SellerArtView";
|
|
129
|
+
export { SellerStickersView } from "./SellerStickersView";
|
|
130
|
+
export type { SellerStickersViewProps } from "./SellerStickersView";
|
|
127
131
|
export { SellerDigitalCodesView } from "./SellerDigitalCodesView";
|
|
128
132
|
export type { SellerDigitalCodesViewProps } from "./SellerDigitalCodesView";
|
|
129
133
|
export { SellerLiveView } from "./SellerLiveView";
|
|
@@ -65,6 +65,8 @@ export { SellerShippingConfigsView } from "./SellerShippingConfigsView";
|
|
|
65
65
|
export { SellerGoogleReviewsView } from "./SellerGoogleReviewsView";
|
|
66
66
|
export { SellerBundlesView } from "./SellerBundlesView";
|
|
67
67
|
export { SellerClassifiedView } from "./SellerClassifiedView";
|
|
68
|
+
export { SellerArtView } from "./SellerArtView";
|
|
69
|
+
export { SellerStickersView } from "./SellerStickersView";
|
|
68
70
|
export { SellerDigitalCodesView } from "./SellerDigitalCodesView";
|
|
69
71
|
export { SellerLiveView } from "./SellerLiveView";
|
|
70
72
|
export { BarcodeField } from "./BarcodeField";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export * from "./firestore";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
export declare const storeStatusSchema: z.ZodEnum<["pending", "active", "suspended", "rejected"]>;
|
|
4
|
-
export declare const payoutStatusSchema: z.ZodEnum<["pending", "processing", "
|
|
4
|
+
export declare const payoutStatusSchema: z.ZodEnum<["pending", "processing", "paid", "failed"]>;
|
|
5
5
|
export declare const payoutPaymentMethodSchema: z.ZodEnum<["bank_transfer", "upi"]>;
|
|
6
6
|
export declare const socialLinksSchema: z.ZodObject<{
|
|
7
7
|
twitter: z.ZodOptional<z.ZodString>;
|
|
@@ -159,7 +159,7 @@ export declare const payoutRecordSchema: z.ZodObject<{
|
|
|
159
159
|
platformFee: z.ZodNumber;
|
|
160
160
|
platformFeeRate: z.ZodNumber;
|
|
161
161
|
currency: z.ZodString;
|
|
162
|
-
status: z.ZodEnum<["pending", "processing", "
|
|
162
|
+
status: z.ZodEnum<["pending", "processing", "paid", "failed"]>;
|
|
163
163
|
paymentMethod: z.ZodEnum<["bank_transfer", "upi"]>;
|
|
164
164
|
orderIds: z.ZodArray<z.ZodString, "many">;
|
|
165
165
|
requestedAt: z.ZodString;
|
|
@@ -167,7 +167,7 @@ export declare const payoutRecordSchema: z.ZodObject<{
|
|
|
167
167
|
createdAt: z.ZodString;
|
|
168
168
|
updatedAt: z.ZodString;
|
|
169
169
|
}, "strip", z.ZodTypeAny, {
|
|
170
|
-
status: "pending" | "
|
|
170
|
+
status: "pending" | "paid" | "failed" | "processing";
|
|
171
171
|
currency: string;
|
|
172
172
|
createdAt: string;
|
|
173
173
|
id: string;
|
|
@@ -184,7 +184,7 @@ export declare const payoutRecordSchema: z.ZodObject<{
|
|
|
184
184
|
sellerId: string;
|
|
185
185
|
processedAt?: string | undefined;
|
|
186
186
|
}, {
|
|
187
|
-
status: "pending" | "
|
|
187
|
+
status: "pending" | "paid" | "failed" | "processing";
|
|
188
188
|
currency: string;
|
|
189
189
|
createdAt: string;
|
|
190
190
|
id: string;
|
|
@@ -225,18 +225,18 @@ export declare const sellerListParamsSchema: z.ZodObject<{
|
|
|
225
225
|
}>;
|
|
226
226
|
export declare const payoutListParamsSchema: z.ZodObject<{
|
|
227
227
|
sellerId: z.ZodOptional<z.ZodString>;
|
|
228
|
-
status: z.ZodOptional<z.ZodEnum<["pending", "processing", "
|
|
228
|
+
status: z.ZodOptional<z.ZodEnum<["pending", "processing", "paid", "failed"]>>;
|
|
229
229
|
page: z.ZodOptional<z.ZodNumber>;
|
|
230
230
|
perPage: z.ZodOptional<z.ZodNumber>;
|
|
231
231
|
sort: z.ZodOptional<z.ZodString>;
|
|
232
232
|
}, "strip", z.ZodTypeAny, {
|
|
233
|
-
status?: "pending" | "
|
|
233
|
+
status?: "pending" | "paid" | "failed" | "processing" | undefined;
|
|
234
234
|
sort?: string | undefined;
|
|
235
235
|
page?: number | undefined;
|
|
236
236
|
perPage?: number | undefined;
|
|
237
237
|
sellerId?: string | undefined;
|
|
238
238
|
}, {
|
|
239
|
-
status?: "pending" | "
|
|
239
|
+
status?: "pending" | "paid" | "failed" | "processing" | undefined;
|
|
240
240
|
sort?: string | undefined;
|
|
241
241
|
page?: number | undefined;
|
|
242
242
|
perPage?: number | undefined;
|
|
@@ -32,7 +32,7 @@ export interface SellerStore {
|
|
|
32
32
|
createdAt: string;
|
|
33
33
|
updatedAt: string;
|
|
34
34
|
}
|
|
35
|
-
export type PayoutStatus = "pending" | "processing" | "
|
|
35
|
+
export type PayoutStatus = "pending" | "processing" | "paid" | "failed";
|
|
36
36
|
export type PayoutPaymentMethod = "bank_transfer" | "upi";
|
|
37
37
|
export interface PayoutBankAccount {
|
|
38
38
|
accountHolderName: string;
|
|
@@ -17,6 +17,10 @@ const STORE_LISTING_HREF = {
|
|
|
17
17
|
classifieds: (slug) => String(ROUTES.PUBLIC.STORE_CLASSIFIEDS(slug)),
|
|
18
18
|
"digital-codes": (slug) => String(ROUTES.PUBLIC.STORE_DIGITAL_CODES(slug)),
|
|
19
19
|
live: (slug) => String(ROUTES.PUBLIC.STORE_LIVE(slug)),
|
|
20
|
+
// Art / stickers have no dedicated storefront tab page — they're browsable
|
|
21
|
+
// (alongside everything else the store sells) on the "Products" tab.
|
|
22
|
+
art: (slug) => String(ROUTES.PUBLIC.STORE_PRODUCTS(slug)),
|
|
23
|
+
stickers: (slug) => String(ROUTES.PUBLIC.STORE_PRODUCTS(slug)),
|
|
20
24
|
};
|
|
21
25
|
export const getStoreBySlug = cache((slug) => storeRepository.findBySlug(slug).catch(() => undefined));
|
|
22
26
|
function tabLabel(base, count) {
|
|
@@ -31,7 +35,7 @@ export async function StoreDetailLayoutView({ storeSlug, activeTab, children, })
|
|
|
31
35
|
}
|
|
32
36
|
const storeId = store?.id;
|
|
33
37
|
const settings = await siteSettingsRepository.findById("global").catch(() => null);
|
|
34
|
-
const [productsCount, auctionsCount, preOrdersCount, prizeDrawsCount, bundlesCount, classifiedsCount, digitalCodesCount, liveCount, couponsCount, reviewsCount] = storeId
|
|
38
|
+
const [productsCount, auctionsCount, preOrdersCount, prizeDrawsCount, bundlesCount, classifiedsCount, digitalCodesCount, liveCount, artCount, stickersCount, couponsCount, reviewsCount] = storeId
|
|
35
39
|
? await Promise.all([
|
|
36
40
|
productRepository
|
|
37
41
|
.list({ filters: sieveAnd(sieveFilter("storeId", SIEVE_OP.EQ, storeId), sieveFilter("status", SIEVE_OP.EQ, "published"), sieveFilter("listingType", SIEVE_OP.EQ, "standard")), page: 1, pageSize: 1 })
|
|
@@ -67,6 +71,14 @@ export async function StoreDetailLayoutView({ storeSlug, activeTab, children, })
|
|
|
67
71
|
.list({ filters: sieveAnd(sieveFilter("storeId", SIEVE_OP.EQ, storeId), sieveFilter("status", SIEVE_OP.EQ, "published"), sieveFilter("listingType", SIEVE_OP.EQ, "live")), page: 1, pageSize: 1 })
|
|
68
72
|
.then((r) => r.total)
|
|
69
73
|
.catch(() => 0),
|
|
74
|
+
productRepository
|
|
75
|
+
.list({ filters: sieveAnd(sieveFilter("storeId", SIEVE_OP.EQ, storeId), sieveFilter("status", SIEVE_OP.EQ, "published"), sieveFilter("listingType", SIEVE_OP.EQ, "art")), page: 1, pageSize: 1 })
|
|
76
|
+
.then((r) => r.total)
|
|
77
|
+
.catch(() => 0),
|
|
78
|
+
productRepository
|
|
79
|
+
.list({ filters: sieveAnd(sieveFilter("storeId", SIEVE_OP.EQ, storeId), sieveFilter("status", SIEVE_OP.EQ, "published"), sieveFilter("listingType", SIEVE_OP.EQ, "stickers")), page: 1, pageSize: 1 })
|
|
80
|
+
.then((r) => r.total)
|
|
81
|
+
.catch(() => 0),
|
|
70
82
|
couponsRepository
|
|
71
83
|
.list({ filters: sieveAnd(sieveFilter("sellerId", SIEVE_OP.EQ, storeId), sieveFilter("validity.isActive", SIEVE_OP.EQ, "true")), page: 1, pageSize: 1 })
|
|
72
84
|
.then((r) => r.total)
|
|
@@ -76,7 +88,7 @@ export async function StoreDetailLayoutView({ storeSlug, activeTab, children, })
|
|
|
76
88
|
.then((r) => r.total)
|
|
77
89
|
.catch(() => 0),
|
|
78
90
|
])
|
|
79
|
-
: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
|
91
|
+
: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
|
80
92
|
const listingCounts = {
|
|
81
93
|
products: productsCount,
|
|
82
94
|
auctions: auctionsCount,
|
|
@@ -86,6 +98,8 @@ export async function StoreDetailLayoutView({ storeSlug, activeTab, children, })
|
|
|
86
98
|
classifieds: classifiedsCount,
|
|
87
99
|
"digital-codes": digitalCodesCount,
|
|
88
100
|
live: liveCount,
|
|
101
|
+
art: artCount,
|
|
102
|
+
stickers: stickersCount,
|
|
89
103
|
};
|
|
90
104
|
const TAB_LISTING_TYPE = {
|
|
91
105
|
products: "standard",
|
|
@@ -95,6 +109,8 @@ export async function StoreDetailLayoutView({ storeSlug, activeTab, children, })
|
|
|
95
109
|
classifieds: "classified",
|
|
96
110
|
"digital-codes": "digital-code",
|
|
97
111
|
live: "live",
|
|
112
|
+
art: "art",
|
|
113
|
+
stickers: "stickers",
|
|
98
114
|
};
|
|
99
115
|
const visibleStoreTabs = STORE_PAGE_TABS.filter((tab) => {
|
|
100
116
|
if (tab.id === "bundles")
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import type { StoreCapability } from "../../auth/permissions/constants";
|
|
8
8
|
import type { BaseDocument } from "../../../_internal/shared/types/base-document";
|
|
9
|
-
export type ShippingProviderType = "
|
|
9
|
+
export type ShippingProviderType = "self-courier" | "store-pickup" | "custom";
|
|
10
10
|
export interface ShippingProviderConfig {
|
|
11
11
|
/** Stable slug — never changes after creation. */
|
|
12
12
|
providerId: string;
|
|
@@ -101,6 +101,12 @@ export interface StoreDocument extends BaseDocument {
|
|
|
101
101
|
* ShippingPicker; the chosen provider + fee lock onto each CartItem.
|
|
102
102
|
*/
|
|
103
103
|
shippingConfig?: StoreShippingConfig;
|
|
104
|
+
/**
|
|
105
|
+
* Seller opt-in for EMI (installment) checkout. EMI is offered on this
|
|
106
|
+
* store's items only when this AND `siteSettings.emi.enabled` are both
|
|
107
|
+
* true. Default false — sellers must explicitly opt in.
|
|
108
|
+
*/
|
|
109
|
+
emiEnabled?: boolean;
|
|
104
110
|
whatsappConfig?: {
|
|
105
111
|
/** Seller's WhatsApp Business phone number, digits-only with country code e.g. "919876543210" */
|
|
106
112
|
phoneNumber?: string;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
export * from "./firestore";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
export declare const shippingProviderTypeSchema: z.ZodEnum<["
|
|
3
|
+
export declare const shippingProviderTypeSchema: z.ZodEnum<["self-courier", "store-pickup", "custom"]>;
|
|
4
4
|
export declare const shippingProviderConfigSchema: z.ZodObject<{
|
|
5
5
|
providerId: z.ZodString;
|
|
6
6
|
label: z.ZodString;
|
|
7
|
-
type: z.ZodEnum<["
|
|
7
|
+
type: z.ZodEnum<["self-courier", "store-pickup", "custom"]>;
|
|
8
8
|
fee: z.ZodObject<{
|
|
9
9
|
flatInPaise: z.ZodOptional<z.ZodNumber>;
|
|
10
10
|
perKgInPaise: z.ZodOptional<z.ZodNumber>;
|
|
@@ -29,7 +29,7 @@ export declare const shippingProviderConfigSchema: z.ZodObject<{
|
|
|
29
29
|
regions: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
30
30
|
requiresAwbUpload: z.ZodOptional<z.ZodBoolean>;
|
|
31
31
|
}, "strip", z.ZodTypeAny, {
|
|
32
|
-
type: "custom" | "
|
|
32
|
+
type: "custom" | "self-courier" | "store-pickup";
|
|
33
33
|
label: string;
|
|
34
34
|
providerId: string;
|
|
35
35
|
fee: {
|
|
@@ -44,7 +44,7 @@ export declare const shippingProviderConfigSchema: z.ZodObject<{
|
|
|
44
44
|
regions?: string[] | undefined;
|
|
45
45
|
requiresAwbUpload?: boolean | undefined;
|
|
46
46
|
}, {
|
|
47
|
-
type: "custom" | "
|
|
47
|
+
type: "custom" | "self-courier" | "store-pickup";
|
|
48
48
|
label: string;
|
|
49
49
|
providerId: string;
|
|
50
50
|
fee: {
|
|
@@ -63,7 +63,7 @@ export declare const storeShippingConfigSchema: z.ZodObject<{
|
|
|
63
63
|
providers: z.ZodArray<z.ZodObject<{
|
|
64
64
|
providerId: z.ZodString;
|
|
65
65
|
label: z.ZodString;
|
|
66
|
-
type: z.ZodEnum<["
|
|
66
|
+
type: z.ZodEnum<["self-courier", "store-pickup", "custom"]>;
|
|
67
67
|
fee: z.ZodObject<{
|
|
68
68
|
flatInPaise: z.ZodOptional<z.ZodNumber>;
|
|
69
69
|
perKgInPaise: z.ZodOptional<z.ZodNumber>;
|
|
@@ -88,7 +88,7 @@ export declare const storeShippingConfigSchema: z.ZodObject<{
|
|
|
88
88
|
regions: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
89
89
|
requiresAwbUpload: z.ZodOptional<z.ZodBoolean>;
|
|
90
90
|
}, "strip", z.ZodTypeAny, {
|
|
91
|
-
type: "custom" | "
|
|
91
|
+
type: "custom" | "self-courier" | "store-pickup";
|
|
92
92
|
label: string;
|
|
93
93
|
providerId: string;
|
|
94
94
|
fee: {
|
|
@@ -103,7 +103,7 @@ export declare const storeShippingConfigSchema: z.ZodObject<{
|
|
|
103
103
|
regions?: string[] | undefined;
|
|
104
104
|
requiresAwbUpload?: boolean | undefined;
|
|
105
105
|
}, {
|
|
106
|
-
type: "custom" | "
|
|
106
|
+
type: "custom" | "self-courier" | "store-pickup";
|
|
107
107
|
label: string;
|
|
108
108
|
providerId: string;
|
|
109
109
|
fee: {
|
|
@@ -121,7 +121,7 @@ export declare const storeShippingConfigSchema: z.ZodObject<{
|
|
|
121
121
|
defaultProviderId: z.ZodString;
|
|
122
122
|
}, "strip", z.ZodTypeAny, {
|
|
123
123
|
providers: {
|
|
124
|
-
type: "custom" | "
|
|
124
|
+
type: "custom" | "self-courier" | "store-pickup";
|
|
125
125
|
label: string;
|
|
126
126
|
providerId: string;
|
|
127
127
|
fee: {
|
|
@@ -139,7 +139,7 @@ export declare const storeShippingConfigSchema: z.ZodObject<{
|
|
|
139
139
|
defaultProviderId: string;
|
|
140
140
|
}, {
|
|
141
141
|
providers: {
|
|
142
|
-
type: "custom" | "
|
|
142
|
+
type: "custom" | "self-courier" | "store-pickup";
|
|
143
143
|
label: string;
|
|
144
144
|
providerId: string;
|
|
145
145
|
fee: {
|
|
@@ -253,7 +253,7 @@ export declare const storeFirestoreSchema: z.ZodObject<{
|
|
|
253
253
|
providers: z.ZodArray<z.ZodObject<{
|
|
254
254
|
providerId: z.ZodString;
|
|
255
255
|
label: z.ZodString;
|
|
256
|
-
type: z.ZodEnum<["
|
|
256
|
+
type: z.ZodEnum<["self-courier", "store-pickup", "custom"]>;
|
|
257
257
|
fee: z.ZodObject<{
|
|
258
258
|
flatInPaise: z.ZodOptional<z.ZodNumber>;
|
|
259
259
|
perKgInPaise: z.ZodOptional<z.ZodNumber>;
|
|
@@ -278,7 +278,7 @@ export declare const storeFirestoreSchema: z.ZodObject<{
|
|
|
278
278
|
regions: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
279
279
|
requiresAwbUpload: z.ZodOptional<z.ZodBoolean>;
|
|
280
280
|
}, "strip", z.ZodTypeAny, {
|
|
281
|
-
type: "custom" | "
|
|
281
|
+
type: "custom" | "self-courier" | "store-pickup";
|
|
282
282
|
label: string;
|
|
283
283
|
providerId: string;
|
|
284
284
|
fee: {
|
|
@@ -293,7 +293,7 @@ export declare const storeFirestoreSchema: z.ZodObject<{
|
|
|
293
293
|
regions?: string[] | undefined;
|
|
294
294
|
requiresAwbUpload?: boolean | undefined;
|
|
295
295
|
}, {
|
|
296
|
-
type: "custom" | "
|
|
296
|
+
type: "custom" | "self-courier" | "store-pickup";
|
|
297
297
|
label: string;
|
|
298
298
|
providerId: string;
|
|
299
299
|
fee: {
|
|
@@ -311,7 +311,7 @@ export declare const storeFirestoreSchema: z.ZodObject<{
|
|
|
311
311
|
defaultProviderId: z.ZodString;
|
|
312
312
|
}, "strip", z.ZodTypeAny, {
|
|
313
313
|
providers: {
|
|
314
|
-
type: "custom" | "
|
|
314
|
+
type: "custom" | "self-courier" | "store-pickup";
|
|
315
315
|
label: string;
|
|
316
316
|
providerId: string;
|
|
317
317
|
fee: {
|
|
@@ -329,7 +329,7 @@ export declare const storeFirestoreSchema: z.ZodObject<{
|
|
|
329
329
|
defaultProviderId: string;
|
|
330
330
|
}, {
|
|
331
331
|
providers: {
|
|
332
|
-
type: "custom" | "
|
|
332
|
+
type: "custom" | "self-courier" | "store-pickup";
|
|
333
333
|
label: string;
|
|
334
334
|
providerId: string;
|
|
335
335
|
fee: {
|
|
@@ -346,6 +346,7 @@ export declare const storeFirestoreSchema: z.ZodObject<{
|
|
|
346
346
|
}[];
|
|
347
347
|
defaultProviderId: string;
|
|
348
348
|
}>>;
|
|
349
|
+
emiEnabled: z.ZodOptional<z.ZodBoolean>;
|
|
349
350
|
whatsappConfig: z.ZodOptional<z.ZodObject<{
|
|
350
351
|
phoneNumber: z.ZodOptional<z.ZodString>;
|
|
351
352
|
wabaId: z.ZodOptional<z.ZodString>;
|
|
@@ -422,10 +423,11 @@ export declare const storeFirestoreSchema: z.ZodObject<{
|
|
|
422
423
|
averageRating?: number | undefined;
|
|
423
424
|
} | undefined;
|
|
424
425
|
isFeatured?: boolean | undefined;
|
|
426
|
+
emiEnabled?: boolean | undefined;
|
|
425
427
|
website?: string | undefined;
|
|
426
428
|
shippingConfig?: {
|
|
427
429
|
providers: {
|
|
428
|
-
type: "custom" | "
|
|
430
|
+
type: "custom" | "self-courier" | "store-pickup";
|
|
429
431
|
label: string;
|
|
430
432
|
providerId: string;
|
|
431
433
|
fee: {
|
|
@@ -506,10 +508,11 @@ export declare const storeFirestoreSchema: z.ZodObject<{
|
|
|
506
508
|
averageRating?: number | undefined;
|
|
507
509
|
} | undefined;
|
|
508
510
|
isFeatured?: boolean | undefined;
|
|
511
|
+
emiEnabled?: boolean | undefined;
|
|
509
512
|
website?: string | undefined;
|
|
510
513
|
shippingConfig?: {
|
|
511
514
|
providers: {
|
|
512
|
-
type: "custom" | "
|
|
515
|
+
type: "custom" | "self-courier" | "store-pickup";
|
|
513
516
|
label: string;
|
|
514
517
|
providerId: string;
|
|
515
518
|
fee: {
|
|
@@ -5,7 +5,6 @@ import { auditTimestampsShape, firestoreDateSchema, paiseSchema } from "../../..
|
|
|
5
5
|
// ─── Firestore document schema (W2) ───────────────────────────────────────────
|
|
6
6
|
// Mirrors StoreDocument in ./firestore.ts. Registered into SCHEMAS.firestore.stores.
|
|
7
7
|
export const shippingProviderTypeSchema = z.enum([
|
|
8
|
-
"shiprocket",
|
|
9
8
|
"self-courier",
|
|
10
9
|
"store-pickup",
|
|
11
10
|
"custom",
|
|
@@ -83,6 +82,7 @@ export const storeFirestoreSchema = z.object({
|
|
|
83
82
|
})
|
|
84
83
|
.optional(),
|
|
85
84
|
shippingConfig: storeShippingConfigSchema.optional(),
|
|
85
|
+
emiEnabled: z.boolean().optional(),
|
|
86
86
|
whatsappConfig: z
|
|
87
87
|
.object({
|
|
88
88
|
phoneNumber: z.string().optional(),
|