@jytextiles/medusa-plugin-faire-store-sync 0.2.4 → 0.2.6
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/.medusa/server/src/__tests__/faire-client.spec.js +27 -7
- package/.medusa/server/src/__tests__/ingest-faire-order-support.spec.js +61 -1
- package/.medusa/server/src/admin/index.js +182 -132
- package/.medusa/server/src/admin/index.mjs +184 -134
- package/.medusa/server/src/lib/faire-client.js +100 -18
- package/.medusa/server/src/lib/types.js +6 -2
- package/.medusa/server/src/modules/faire-sync/migrations/Migration20260709161201.js +14 -0
- package/.medusa/server/src/modules/faire-sync/models/faire-sync-account.js +5 -1
- package/.medusa/server/src/modules/faire-sync/service.js +33 -14
- package/.medusa/server/src/workflows/ingest-faire-order-support.js +81 -28
- package/.medusa/server/src/workflows/ingest-faire-orders-bulk.js +2 -2
- package/.medusa/server/src/workflows/sync-product-to-faire.js +109 -37
- package/package.json +1 -1
- package/src/__tests__/faire-client.spec.ts +28 -6
- package/src/__tests__/ingest-faire-order-support.spec.ts +63 -0
- package/src/admin/routes/settings/faire/[id]/page.tsx +56 -61
- package/src/admin/routes/settings/faire/page.tsx +78 -8
- package/src/lib/faire-client.ts +112 -16
- package/src/lib/types.ts +57 -18
- package/src/modules/faire-sync/migrations/.snapshot-medusa-faire-sync.json +19 -0
- package/src/modules/faire-sync/migrations/Migration20260709161201.ts +13 -0
- package/src/modules/faire-sync/models/faire-sync-account.ts +4 -0
- package/src/modules/faire-sync/service.ts +42 -16
- package/src/workflows/ingest-faire-order-support.ts +96 -29
- package/src/workflows/ingest-faire-orders-bulk.ts +1 -1
- package/src/workflows/sync-product-to-faire.ts +143 -41
|
@@ -27,7 +27,7 @@ describe("FaireClient — issue #952 corrections", () => {
|
|
|
27
27
|
it("uses the verified base / auth / token URLs by default", () => {
|
|
28
28
|
const c = new faire_client_1.FaireClient({});
|
|
29
29
|
// defaults are exported from types and consumed verbatim
|
|
30
|
-
expect(types_1.DEFAULT_API_BASE).toBe("https://faire.com/external-api/v2");
|
|
30
|
+
expect(types_1.DEFAULT_API_BASE).toBe("https://www.faire.com/external-api/v2");
|
|
31
31
|
expect(types_1.DEFAULT_AUTH_URL).toBe("https://faire.com/oauth2/authorize");
|
|
32
32
|
expect(types_1.DEFAULT_TOKEN_URL).toBe("https://www.faire.com/api/external-api-oauth2/token");
|
|
33
33
|
});
|
|
@@ -85,21 +85,41 @@ describe("FaireClient — issue #952 corrections", () => {
|
|
|
85
85
|
});
|
|
86
86
|
it("pushes inventory via PATCH /product-inventory/by-skus (not GET /inventory)", async () => {
|
|
87
87
|
const c = new faire_client_1.FaireClient(oauthOpts);
|
|
88
|
-
await c.updateInventory("t", [{ sku: "S1",
|
|
88
|
+
await c.updateInventory("t", [{ sku: "S1", on_hand_quantity: 7 }]);
|
|
89
89
|
expect(lastInit.method).toBe("PATCH");
|
|
90
90
|
expect(lastUrl).toBe(`${types_1.DEFAULT_API_BASE}/product-inventory/by-skus`);
|
|
91
91
|
expect(JSON.parse(lastInit.body)).toEqual({
|
|
92
|
-
inventories: [{ sku: "S1",
|
|
92
|
+
inventories: [{ sku: "S1", on_hand_quantity: 7 }],
|
|
93
93
|
});
|
|
94
94
|
});
|
|
95
|
-
it("lists orders with
|
|
95
|
+
it("lists orders with numeric page + updated_at_min", async () => {
|
|
96
96
|
const c = new faire_client_1.FaireClient(oauthOpts);
|
|
97
|
-
await c.listOrders("t", { page: "
|
|
97
|
+
await c.listOrders("t", { page: "2", updated_at_min: "2026-01-01T00:00:00Z" });
|
|
98
98
|
const url = new URL(lastUrl);
|
|
99
99
|
expect(url.pathname).toBe("/external-api/v2/orders");
|
|
100
|
-
expect(url.searchParams.get("page")).toBe("
|
|
100
|
+
expect(url.searchParams.get("page")).toBe("2");
|
|
101
101
|
expect(url.searchParams.get("updated_at_min")).toBe("2026-01-01T00:00:00Z");
|
|
102
102
|
});
|
|
103
|
+
it("derives next_page from numeric page (Faire returns no cursor)", async () => {
|
|
104
|
+
const c = new faire_client_1.FaireClient(oauthOpts);
|
|
105
|
+
const page = (rows) => ({
|
|
106
|
+
ok: true,
|
|
107
|
+
status: 200,
|
|
108
|
+
headers: new Map(),
|
|
109
|
+
text: async () => JSON.stringify({
|
|
110
|
+
page: undefined,
|
|
111
|
+
orders: Array.from({ length: rows }, (_, i) => ({ id: `bo_${i}` })),
|
|
112
|
+
}),
|
|
113
|
+
});
|
|
114
|
+
// A full page (rows === limit) → there may be more → next_page = current+1.
|
|
115
|
+
fetchMock.mockImplementationOnce(async () => page(2));
|
|
116
|
+
const full = await c.listOrders("t", { limit: 2, page: "1" });
|
|
117
|
+
expect(full.next_page).toBe("2");
|
|
118
|
+
// A short page → last page → no next_page.
|
|
119
|
+
fetchMock.mockImplementationOnce(async () => page(1));
|
|
120
|
+
const short = await c.listOrders("t", { limit: 2, page: "2" });
|
|
121
|
+
expect(short.next_page).toBeUndefined();
|
|
122
|
+
});
|
|
103
123
|
it("posts order processing (PUT) and shipments (POST) on the right paths", async () => {
|
|
104
124
|
const c = new faire_client_1.FaireClient(oauthOpts);
|
|
105
125
|
await c.setOrderProcessing("t", "o_1", { accepted: true });
|
|
@@ -123,4 +143,4 @@ describe("FaireClient — issue #952 corrections", () => {
|
|
|
123
143
|
});
|
|
124
144
|
});
|
|
125
145
|
});
|
|
126
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFpcmUtY2xpZW50LnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvX190ZXN0c19fL2ZhaXJlLWNsaWVudC5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0RBQWdFO0FBQ2hFLHdDQUFvRjtBQUVwRiwyQ0FBMkM7QUFDM0MsSUFBSSxPQUFlLENBQUE7QUFDbkIsSUFBSSxRQUFhLENBQUE7QUFDakIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBVyxFQUFFLElBQVMsRUFBRSxFQUFFO0lBQ3pELE9BQU8sR0FBRyxHQUFHLENBQUE7SUFDYixRQUFRLEdBQUcsSUFBSSxDQUFBO0lBQ2YsT0FBTztRQUNMLEVBQUUsRUFBRSxJQUFJO1FBQ1IsTUFBTSxFQUFFLEdBQUc7UUFDWCxPQUFPLEVBQUUsSUFBSSxHQUFHLEVBQUU7UUFDbEIsSUFBSSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7S0FDbEYsQ0FBQTtBQUNWLENBQUMsQ0FBQyxDQUVEO0FBQUMsTUFBYyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUE7QUFFbEMsTUFBTSxTQUFTLEdBQUc7SUFDaEIsUUFBUSxFQUFFLE9BQWdCO0lBQzFCLFFBQVEsRUFBRSxTQUFTO0lBQ25CLFlBQVksRUFBRSxZQUFZO0lBQzFCLFdBQVcsRUFBRSxxREFBcUQ7Q0FDbkUsQ0FBQTtBQUVELFFBQVEsQ0FBQyxzQ0FBc0MsRUFBRSxHQUFHLEVBQUU7SUFDcEQsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFBO0lBRXZDLEVBQUUsQ0FBQyx1REFBdUQsRUFBRSxHQUFHLEVBQUU7UUFDL0QsTUFBTSxDQUFDLEdBQUcs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
|
|
@@ -62,6 +62,66 @@ describe("mapFaireOrderToOrder", () => {
|
|
|
62
62
|
expect(mapped.shipping_address.first_name).toBe("Faire");
|
|
63
63
|
expect(mapped.items).toEqual([]);
|
|
64
64
|
});
|
|
65
|
+
it("maps a real ExternalOrderV2 (customer/address/item.price, no top-level total)", () => {
|
|
66
|
+
const order = {
|
|
67
|
+
id: "bo_bxdmjbwxid",
|
|
68
|
+
state: "NEW",
|
|
69
|
+
customer: { first_name: "John", last_name: "Smith" },
|
|
70
|
+
address: {
|
|
71
|
+
name: "John Smith",
|
|
72
|
+
company_name: "Faire Wholesale, Inc",
|
|
73
|
+
address1: "41 King Street West",
|
|
74
|
+
address2: "3rd Floor",
|
|
75
|
+
city: "Kitchener",
|
|
76
|
+
state: "Ontario",
|
|
77
|
+
state_code: "ON",
|
|
78
|
+
postal_code: "N2G 1A1",
|
|
79
|
+
country: "Canada",
|
|
80
|
+
country_code: "CAN",
|
|
81
|
+
phone_number: "555-123-4567",
|
|
82
|
+
},
|
|
83
|
+
items: [
|
|
84
|
+
{
|
|
85
|
+
id: "oi_bq425ju5vh",
|
|
86
|
+
product_id: "p_fccaefnahr",
|
|
87
|
+
variant_id: "po_3745tjzrpc",
|
|
88
|
+
sku: "goldenretriever",
|
|
89
|
+
quantity: 2,
|
|
90
|
+
product_name: "Golden Dog",
|
|
91
|
+
price: { amount_minor: 4999, currency: "USD" },
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
payout_costs: { total_payout: { amount_minor: 8000, currency: "USD" } },
|
|
95
|
+
};
|
|
96
|
+
const mapped = (0, ingest_faire_order_support_1.mapFaireOrderToOrder)(order);
|
|
97
|
+
expect(mapped.order_token).toBe("bo_bxdmjbwxid");
|
|
98
|
+
expect(mapped.currency_code).toBe("usd");
|
|
99
|
+
// no order-level total → sum of line values: 49.99 × 2
|
|
100
|
+
expect(mapped.total).toBe(99.98);
|
|
101
|
+
expect(mapped.buyer_name).toBe("John Smith");
|
|
102
|
+
expect(mapped.shipping_address).toMatchObject({
|
|
103
|
+
first_name: "John",
|
|
104
|
+
last_name: "Smith",
|
|
105
|
+
company: "Faire Wholesale, Inc",
|
|
106
|
+
address_1: "41 King Street West",
|
|
107
|
+
address_2: "3rd Floor",
|
|
108
|
+
city: "Kitchener",
|
|
109
|
+
province: "ON",
|
|
110
|
+
postal_code: "N2G 1A1",
|
|
111
|
+
country_code: "ca", // ISO-3 CAN → ISO-2 ca
|
|
112
|
+
phone: "555-123-4567",
|
|
113
|
+
});
|
|
114
|
+
expect(mapped.items[0]).toMatchObject({
|
|
115
|
+
title: "Golden Dog",
|
|
116
|
+
quantity: 2,
|
|
117
|
+
unit_price: 49.99,
|
|
118
|
+
});
|
|
119
|
+
expect(mapped.items[0].metadata).toMatchObject({
|
|
120
|
+
faire_product_token: "p_fccaefnahr",
|
|
121
|
+
faire_variant_id: "po_3745tjzrpc",
|
|
122
|
+
faire_sku: "goldenretriever",
|
|
123
|
+
});
|
|
124
|
+
});
|
|
65
125
|
it("uses buyer email when provided", () => {
|
|
66
126
|
const mapped = (0, ingest_faire_order_support_1.mapFaireOrderToOrder)({
|
|
67
127
|
order_token: "o_2",
|
|
@@ -71,4 +131,4 @@ describe("mapFaireOrderToOrder", () => {
|
|
|
71
131
|
expect(mapped.email).toBe("retailer@example.com");
|
|
72
132
|
});
|
|
73
133
|
});
|
|
74
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
134
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5nZXN0LWZhaXJlLW9yZGVyLXN1cHBvcnQuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9fX3Rlc3RzX18vaW5nZXN0LWZhaXJlLW9yZGVyLXN1cHBvcnQuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHdGQUEwRjtBQUUxRixRQUFRLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRTtJQUMxQixFQUFFLENBQUMsK0NBQStDLEVBQUUsR0FBRyxFQUFFO1FBQ3ZELE1BQU0sQ0FBQyxJQUFBLHVDQUFVLEVBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDakMsTUFBTSxDQUFDLElBQUEsdUNBQVUsRUFBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN0QyxDQUFDLENBQUMsQ0FBQTtJQUNGLEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSxHQUFHLEVBQUU7UUFDcEMsTUFBTSxDQUFDLElBQUEsdUNBQVUsRUFBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNyQyxNQUFNLENBQUMsSUFBQSx1Q0FBVSxFQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2pDLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUE7QUFFRixRQUFRLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxFQUFFO0lBQ3BDLEVBQUUsQ0FBQywyQ0FBMkMsRUFBRSxHQUFHLEVBQUU7UUFDbkQsTUFBTSxLQUFLLEdBQUc7WUFDWixXQUFXLEVBQUUsT0FBTztZQUNwQixRQUFRLEVBQUUsS0FBSztZQUNmLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFVBQVUsRUFBRSxjQUFjO1lBQzFCLE9BQU8sRUFBRTtnQkFDUCxVQUFVLEVBQUUsS0FBSztnQkFDakIsU0FBUyxFQUFFLFVBQVU7Z0JBQ3JCLE9BQU8sRUFBRSxXQUFXO2dCQUNwQixJQUFJLEVBQUUsUUFBUTtnQkFDZCxLQUFLLEVBQUUsS0FBSztnQkFDWixHQUFHLEVBQUUsS0FBSztnQkFDVixPQUFPLEVBQUUsSUFBSTthQUNkO1lBQ0QsS0FBSyxFQUFFO2dCQUNMO29CQUNFLEVBQUUsRUFBRSxLQUFLO29CQUNULGFBQWEsRUFBRSxLQUFLO29CQUNwQixHQUFHLEVBQUUsT0FBTztvQkFDWixRQUFRLEVBQUUsQ0FBQztvQkFDWCxxQkFBcUIsRUFBRSxJQUFJO29CQUMzQixJQUFJLEVBQUUsU0FBUztpQkFDaEI7YUFDRjtTQUNGLENBQUE7UUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFBLGlEQUFvQixFQUFDLEtBQUssQ0FBQyxDQUFBO1FBRTFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3hDLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3hDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2hDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQzlDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLENBQUE7UUFDNUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDdkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDcEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7WUFDcEMsS0FBSyxFQUFFLFNBQVM7WUFDaEIsUUFBUSxFQUFFLENBQUM7WUFDWCxVQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFDLENBQUE7UUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLENBQUM7WUFDN0MsaUJBQWlCLEVBQUUsT0FBTztZQUMxQixtQkFBbUIsRUFBRSxLQUFLO1lBQzFCLFNBQVMsRUFBRSxPQUFPO1NBQ25CLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLEdBQUcsRUFBRTtRQUNwRCxNQUFNLE1BQU0sR0FBRyxJQUFBLGlEQUFvQixFQUFDLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUN0RSxNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUN4RCxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNsQyxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQywrRUFBK0UsRUFBRSxHQUFHLEVBQUU7UUFDdkYsTUFBTSxLQUFLLEdBQUc7WUFDWixFQUFFLEVBQUUsZUFBZTtZQUNuQixLQUFLLEVBQUUsS0FBSztZQUNaLFFBQVEsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRTtZQUNwRCxPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLFlBQVk7Z0JBQ2xCLFlBQVksRUFBRSxzQkFBc0I7Z0JBQ3BDLFFBQVEsRUFBRSxxQkFBcUI7Z0JBQy9CLFFBQVEsRUFBRSxXQUFXO2dCQUNyQixJQUFJLEVBQUUsV0FBVztnQkFDakIsS0FBSyxFQUFFLFNBQVM7Z0JBQ2hCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixXQUFXLEVBQUUsU0FBUztnQkFDdEIsT0FBTyxFQUFFLFFBQVE7Z0JBQ2pCLFlBQVksRUFBRSxLQUFLO2dCQUNuQixZQUFZLEVBQUUsY0FBYzthQUM3QjtZQUNELEtBQUssRUFBRTtnQkFDTDtvQkFDRSxFQUFFLEVBQUUsZUFBZTtvQkFDbkIsVUFBVSxFQUFFLGNBQWM7b0JBQzFCLFVBQVUsRUFBRSxlQUFlO29CQUMzQixHQUFHLEVBQUUsaUJBQWlCO29CQUN0QixRQUFRLEVBQUUsQ0FBQztvQkFDWCxZQUFZLEVBQUUsWUFBWTtvQkFDMUIsS0FBSyxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO2lCQUMvQzthQUNGO1lBQ0QsWUFBWSxFQUFFLEVBQUUsWUFBWSxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUU7U0FDeEUsQ0FBQTtRQUVELE1BQU0sTUFBTSxHQUFHLElBQUEsaURBQW9CLEVBQUMsS0FBSyxDQUFDLENBQUE7UUFFMUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUE7UUFDaEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDeEMsdURBQXVEO1FBQ3ZELE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2hDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQzVDLE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxhQUFhLENBQUM7WUFDNUMsVUFBVSxFQUFFLE1BQU07WUFDbEIsU0FBUyxFQUFFLE9BQU87WUFDbEIsT0FBTyxFQUFFLHNCQUFzQjtZQUMvQixTQUFTLEVBQUUscUJBQXFCO1lBQ2hDLFNBQVMsRUFBRSxXQUFXO1lBQ3RCLElBQUksRUFBRSxXQUFXO1lBQ2pCLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLFNBQVM7WUFDdEIsWUFBWSxFQUFFLElBQUksRUFBRSx1QkFBdUI7WUFDM0MsS0FBSyxFQUFFLGNBQWM7U0FDdEIsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7WUFDcEMsS0FBSyxFQUFFLFlBQVk7WUFDbkIsUUFBUSxFQUFFLENBQUM7WUFDWCxVQUFVLEVBQUUsS0FBSztTQUNsQixDQUFDLENBQUE7UUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLENBQUM7WUFDN0MsbUJBQW1CLEVBQUUsY0FBYztZQUNuQyxnQkFBZ0IsRUFBRSxlQUFlO1lBQ2pDLFNBQVMsRUFBRSxpQkFBaUI7U0FDN0IsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO1FBQ3hDLE1BQU0sTUFBTSxHQUFHLElBQUEsaURBQW9CLEVBQUM7WUFDbEMsV0FBVyxFQUFFLEtBQUs7WUFDbEIsV0FBVyxFQUFFLHNCQUFzQjtZQUNuQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDO1NBQ3BDLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUE7SUFDbkQsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSJ9
|
|
@@ -239,6 +239,8 @@ const FaireSettingsPage = () => {
|
|
|
239
239
|
pageSize: PAGE_SIZE$1
|
|
240
240
|
});
|
|
241
241
|
const [filtering, setFiltering] = react.useState({});
|
|
242
|
+
const [apiKeyOpen, setApiKeyOpen] = react.useState(false);
|
|
243
|
+
const [apiKey, setApiKey] = react.useState("");
|
|
242
244
|
const statusQuery = reactQuery.useQuery({
|
|
243
245
|
queryKey: STATUS_KEY$1,
|
|
244
246
|
queryFn: () => faireApi.status()
|
|
@@ -271,6 +273,18 @@ const FaireSettingsPage = () => {
|
|
|
271
273
|
description: err.message
|
|
272
274
|
})
|
|
273
275
|
});
|
|
276
|
+
const apiKeyMutation = reactQuery.useMutation({
|
|
277
|
+
mutationFn: () => faireApi.connectApiKey(apiKey.trim()),
|
|
278
|
+
onSuccess: () => {
|
|
279
|
+
queryClient.invalidateQueries({ queryKey: STATUS_KEY$1 });
|
|
280
|
+
setApiKeyOpen(false);
|
|
281
|
+
setApiKey("");
|
|
282
|
+
ui.toast.success("Connected to Faire with API key");
|
|
283
|
+
},
|
|
284
|
+
onError: (err) => ui.toast.error("Failed to connect with API key", {
|
|
285
|
+
description: err.message
|
|
286
|
+
})
|
|
287
|
+
});
|
|
274
288
|
const disconnectMutation = reactQuery.useMutation({
|
|
275
289
|
mutationFn: () => faireApi.disconnect(),
|
|
276
290
|
onSuccess: () => {
|
|
@@ -366,15 +380,16 @@ const FaireSettingsPage = () => {
|
|
|
366
380
|
children: "Disconnect"
|
|
367
381
|
}
|
|
368
382
|
)
|
|
369
|
-
] }) : /* @__PURE__ */ jsxRuntime.
|
|
370
|
-
ui.Button,
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
children: "Connect
|
|
376
|
-
|
|
377
|
-
|
|
383
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu, { children: [
|
|
384
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Button, { size: "small", isLoading: connectMutation.isPending, children: [
|
|
385
|
+
"Connect Faire",
|
|
386
|
+
/* @__PURE__ */ jsxRuntime.jsx(icons.ChevronDownMini, {})
|
|
387
|
+
] }) }),
|
|
388
|
+
/* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu.Content, { children: [
|
|
389
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Item, { onClick: () => connectMutation.mutate(), children: "Connect with OAuth" }),
|
|
390
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Item, { onClick: () => setApiKeyOpen(true), children: "Connect with API key (private)" })
|
|
391
|
+
] })
|
|
392
|
+
] })
|
|
378
393
|
] }),
|
|
379
394
|
connected && (status == null ? void 0 : status.account) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "px-6 py-4 grid grid-cols-4 gap-4", children: [
|
|
380
395
|
/* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Brand", value: status.account.brand_name }),
|
|
@@ -412,6 +427,46 @@ const FaireSettingsPage = () => {
|
|
|
412
427
|
/* @__PURE__ */ jsxRuntime.jsx(ui.DataTable.Table, {}),
|
|
413
428
|
/* @__PURE__ */ jsxRuntime.jsx(ui.DataTable.Pagination, {})
|
|
414
429
|
] }) }),
|
|
430
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Drawer, { open: apiKeyOpen, onOpenChange: setApiKeyOpen, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Drawer.Content, { children: [
|
|
431
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Drawer.Header, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Drawer.Title, { children: "Connect with API key" }) }),
|
|
432
|
+
/* @__PURE__ */ jsxRuntime.jsxs(ui.Drawer.Body, { className: "flex flex-col gap-y-3", children: [
|
|
433
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-fg-subtle", size: "small", children: "For private / unpublished Faire integrations, paste the API key your Faire brand issued for this app. This connects without OAuth." }),
|
|
434
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-1", children: [
|
|
435
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Label, { size: "small", children: "Faire API key" }),
|
|
436
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
437
|
+
ui.Input,
|
|
438
|
+
{
|
|
439
|
+
type: "password",
|
|
440
|
+
placeholder: "Paste the Faire API key…",
|
|
441
|
+
value: apiKey,
|
|
442
|
+
onChange: (e) => setApiKey(e.target.value),
|
|
443
|
+
autoComplete: "off"
|
|
444
|
+
}
|
|
445
|
+
)
|
|
446
|
+
] })
|
|
447
|
+
] }),
|
|
448
|
+
/* @__PURE__ */ jsxRuntime.jsxs(ui.Drawer.Footer, { children: [
|
|
449
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
450
|
+
ui.Button,
|
|
451
|
+
{
|
|
452
|
+
variant: "secondary",
|
|
453
|
+
size: "small",
|
|
454
|
+
onClick: () => setApiKeyOpen(false),
|
|
455
|
+
children: "Cancel"
|
|
456
|
+
}
|
|
457
|
+
),
|
|
458
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
459
|
+
ui.Button,
|
|
460
|
+
{
|
|
461
|
+
size: "small",
|
|
462
|
+
onClick: () => apiKeyMutation.mutate(),
|
|
463
|
+
isLoading: apiKeyMutation.isPending,
|
|
464
|
+
disabled: !apiKey.trim(),
|
|
465
|
+
children: "Connect"
|
|
466
|
+
}
|
|
467
|
+
)
|
|
468
|
+
] })
|
|
469
|
+
] }) }),
|
|
415
470
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Toaster, {})
|
|
416
471
|
] });
|
|
417
472
|
};
|
|
@@ -426,124 +481,6 @@ const config = adminSdk.defineRouteConfig({
|
|
|
426
481
|
const handle$3 = {
|
|
427
482
|
breadcrumb: () => "Faire Sync"
|
|
428
483
|
};
|
|
429
|
-
const STATUS_COLORS = {
|
|
430
|
-
success: "green",
|
|
431
|
-
failed: "red",
|
|
432
|
-
draft: "orange",
|
|
433
|
-
pending: "grey",
|
|
434
|
-
syncing: "grey"
|
|
435
|
-
};
|
|
436
|
-
const FaireSyncDetailPage = () => {
|
|
437
|
-
const { id } = reactRouterDom.useParams();
|
|
438
|
-
const navigate = reactRouterDom.useNavigate();
|
|
439
|
-
const [record, setRecord] = react.useState(null);
|
|
440
|
-
const [loading, setLoading] = react.useState(true);
|
|
441
|
-
const [retrying, setRetrying] = react.useState(false);
|
|
442
|
-
const [error, setError] = react.useState(null);
|
|
443
|
-
react.useEffect(() => {
|
|
444
|
-
if (!id) return;
|
|
445
|
-
setLoading(true);
|
|
446
|
-
faireApi.getSync(id).then((res) => {
|
|
447
|
-
setRecord(res.sync || res);
|
|
448
|
-
}).catch((err) => setError(err.message || "Failed to load sync record")).finally(() => setLoading(false));
|
|
449
|
-
}, [id]);
|
|
450
|
-
const handleRetry = async () => {
|
|
451
|
-
if (!record) return;
|
|
452
|
-
setRetrying(true);
|
|
453
|
-
setError(null);
|
|
454
|
-
try {
|
|
455
|
-
await faireApi.retrySync(record.id);
|
|
456
|
-
const updated = await faireApi.getSync(record.id).catch(() => null);
|
|
457
|
-
if (updated) setRecord(updated.sync || updated);
|
|
458
|
-
} catch (err) {
|
|
459
|
-
setError(err.message || "Retry failed");
|
|
460
|
-
} finally {
|
|
461
|
-
setRetrying(false);
|
|
462
|
-
}
|
|
463
|
-
};
|
|
464
|
-
if (loading) {
|
|
465
|
-
return /* @__PURE__ */ jsxRuntime.jsx(ui.Container, { className: "p-6", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Skeleton, { className: "h-7 w-12 rounded-md" }) });
|
|
466
|
-
}
|
|
467
|
-
if (!record) {
|
|
468
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "p-6 flex flex-col gap-4", children: [
|
|
469
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h1", children: "Sync record not found" }),
|
|
470
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", onClick: () => navigate("/settings/faire"), children: "Back to Faire settings" })
|
|
471
|
-
] });
|
|
472
|
-
}
|
|
473
|
-
const warnings = record.error_message ? record.error_message.split(" | ") : [];
|
|
474
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-4", children: [
|
|
475
|
-
error && /* @__PURE__ */ jsxRuntime.jsx(ui.Container, { className: "p-4", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-tag-red-text", children: error }) }),
|
|
476
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "divide-y p-0", children: [
|
|
477
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-6 py-4", children: [
|
|
478
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
479
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h1", children: "Sync record" }),
|
|
480
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-fg-subtle font-mono text-xs", children: record.id })
|
|
481
|
-
] }),
|
|
482
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
|
|
483
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.StatusBadge, { color: STATUS_COLORS[record.status] || "grey", children: record.status }),
|
|
484
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu, { children: [
|
|
485
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.IconButton, { size: "small", variant: "transparent", disabled: retrying, children: /* @__PURE__ */ jsxRuntime.jsx(icons.EllipsisHorizontal, {}) }) }),
|
|
486
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu.Content, { align: "end", children: [
|
|
487
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
488
|
-
ui.DropdownMenu.Item,
|
|
489
|
-
{
|
|
490
|
-
className: "gap-x-2",
|
|
491
|
-
onClick: handleRetry,
|
|
492
|
-
disabled: retrying,
|
|
493
|
-
children: [
|
|
494
|
-
/* @__PURE__ */ jsxRuntime.jsx(icons.ArrowPath, { className: "text-ui-fg-subtle" }),
|
|
495
|
-
retrying ? "Re-syncing…" : "Re-sync product"
|
|
496
|
-
]
|
|
497
|
-
}
|
|
498
|
-
),
|
|
499
|
-
record.product_url && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
500
|
-
ui.DropdownMenu.Item,
|
|
501
|
-
{
|
|
502
|
-
className: "gap-x-2",
|
|
503
|
-
onClick: () => window.open(record.product_url, "_blank"),
|
|
504
|
-
children: [
|
|
505
|
-
/* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpRightOnBox, { className: "text-ui-fg-subtle" }),
|
|
506
|
-
"Open on Faire"
|
|
507
|
-
]
|
|
508
|
-
}
|
|
509
|
-
)
|
|
510
|
-
] })
|
|
511
|
-
] })
|
|
512
|
-
] })
|
|
513
|
-
] }),
|
|
514
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "px-6 py-4 grid grid-cols-2 gap-4", children: [
|
|
515
|
-
/* @__PURE__ */ jsxRuntime.jsx(Detail, { label: "Product", value: record.product_id, mono: true }),
|
|
516
|
-
/* @__PURE__ */ jsxRuntime.jsx(Detail, { label: "Action", value: record.action }),
|
|
517
|
-
/* @__PURE__ */ jsxRuntime.jsx(Detail, { label: "Faire product token", value: record.product_token || "—", mono: true }),
|
|
518
|
-
/* @__PURE__ */ jsxRuntime.jsx(Detail, { label: "State", value: record.product_state || "—" }),
|
|
519
|
-
/* @__PURE__ */ jsxRuntime.jsx(Detail, { label: "Published", value: record.published ? "Yes" : "No" }),
|
|
520
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
521
|
-
Detail,
|
|
522
|
-
{
|
|
523
|
-
label: "Synced at",
|
|
524
|
-
value: record.synced_at ? new Date(record.synced_at).toLocaleString() : "—"
|
|
525
|
-
}
|
|
526
|
-
)
|
|
527
|
-
] })
|
|
528
|
-
] }),
|
|
529
|
-
warnings.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "divide-y p-0", children: [
|
|
530
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-6 py-4", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", children: "Issues" }) }),
|
|
531
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-6 py-4 flex flex-col gap-2", children: warnings.map((w, i) => /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-tag-red-text text-sm", children: w }, i)) })
|
|
532
|
-
] }),
|
|
533
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Toaster, {})
|
|
534
|
-
] });
|
|
535
|
-
};
|
|
536
|
-
const Detail = ({
|
|
537
|
-
label,
|
|
538
|
-
value,
|
|
539
|
-
mono
|
|
540
|
-
}) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
541
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Label, { children: label }),
|
|
542
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: mono ? "font-mono text-xs" : "", children: value })
|
|
543
|
-
] });
|
|
544
|
-
const handle$2 = {
|
|
545
|
-
breadcrumb: () => "Sync record"
|
|
546
|
-
};
|
|
547
484
|
const Root = ({ prev = "..", children }) => {
|
|
548
485
|
const navigate = reactRouterDom.useNavigate();
|
|
549
486
|
const [open, setOpen] = react.useState(false);
|
|
@@ -840,9 +777,122 @@ const FaireBulkPage = () => {
|
|
|
840
777
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Toaster, {})
|
|
841
778
|
] });
|
|
842
779
|
};
|
|
843
|
-
const handle$
|
|
780
|
+
const handle$2 = {
|
|
844
781
|
breadcrumb: () => "Bulk sync"
|
|
845
782
|
};
|
|
783
|
+
const PARENT$1 = "/settings/faire";
|
|
784
|
+
const STATUS_COLORS = {
|
|
785
|
+
success: "green",
|
|
786
|
+
failed: "red",
|
|
787
|
+
draft: "orange",
|
|
788
|
+
pending: "grey",
|
|
789
|
+
syncing: "grey"
|
|
790
|
+
};
|
|
791
|
+
const FaireSyncDetailPage = () => {
|
|
792
|
+
const { id } = reactRouterDom.useParams();
|
|
793
|
+
const navigate = reactRouterDom.useNavigate();
|
|
794
|
+
const [record, setRecord] = react.useState(null);
|
|
795
|
+
const [loading, setLoading] = react.useState(true);
|
|
796
|
+
const [retrying, setRetrying] = react.useState(false);
|
|
797
|
+
const [error, setError] = react.useState(null);
|
|
798
|
+
react.useEffect(() => {
|
|
799
|
+
if (!id) return;
|
|
800
|
+
setLoading(true);
|
|
801
|
+
faireApi.getSync(id).then((res) => {
|
|
802
|
+
setRecord(res.sync || res);
|
|
803
|
+
}).catch((err) => setError(err.message || "Failed to load sync record")).finally(() => setLoading(false));
|
|
804
|
+
}, [id]);
|
|
805
|
+
const handleRetry = async () => {
|
|
806
|
+
if (!record) return;
|
|
807
|
+
setRetrying(true);
|
|
808
|
+
setError(null);
|
|
809
|
+
try {
|
|
810
|
+
await faireApi.retrySync(record.id);
|
|
811
|
+
const updated = await faireApi.getSync(record.id).catch(() => null);
|
|
812
|
+
if (updated) setRecord(updated.sync || updated);
|
|
813
|
+
} catch (err) {
|
|
814
|
+
setError(err.message || "Retry failed");
|
|
815
|
+
} finally {
|
|
816
|
+
setRetrying(false);
|
|
817
|
+
}
|
|
818
|
+
};
|
|
819
|
+
const warnings = (record == null ? void 0 : record.error_message) ? record.error_message.split(" | ") : [];
|
|
820
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(RouteFocusModal, { prev: PARENT$1, children: [
|
|
821
|
+
/* @__PURE__ */ jsxRuntime.jsxs(RouteFocusModal.Header, { children: [
|
|
822
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
|
|
823
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h1", children: "Sync record" }),
|
|
824
|
+
record && /* @__PURE__ */ jsxRuntime.jsx(ui.StatusBadge, { color: STATUS_COLORS[record.status] || "grey", children: record.status })
|
|
825
|
+
] }),
|
|
826
|
+
record && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu, { children: [
|
|
827
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.IconButton, { size: "small", variant: "transparent", disabled: retrying, children: /* @__PURE__ */ jsxRuntime.jsx(icons.EllipsisHorizontal, {}) }) }),
|
|
828
|
+
/* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu.Content, { align: "end", children: [
|
|
829
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
830
|
+
ui.DropdownMenu.Item,
|
|
831
|
+
{
|
|
832
|
+
className: "gap-x-2",
|
|
833
|
+
onClick: handleRetry,
|
|
834
|
+
disabled: retrying,
|
|
835
|
+
children: [
|
|
836
|
+
/* @__PURE__ */ jsxRuntime.jsx(icons.ArrowPath, { className: "text-ui-fg-subtle" }),
|
|
837
|
+
retrying ? "Re-syncing…" : "Re-sync product"
|
|
838
|
+
]
|
|
839
|
+
}
|
|
840
|
+
),
|
|
841
|
+
record.product_url && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
842
|
+
ui.DropdownMenu.Item,
|
|
843
|
+
{
|
|
844
|
+
className: "gap-x-2",
|
|
845
|
+
onClick: () => window.open(record.product_url, "_blank"),
|
|
846
|
+
children: [
|
|
847
|
+
/* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpRightOnBox, { className: "text-ui-fg-subtle" }),
|
|
848
|
+
"Open on Faire"
|
|
849
|
+
]
|
|
850
|
+
}
|
|
851
|
+
)
|
|
852
|
+
] })
|
|
853
|
+
] }) })
|
|
854
|
+
] }),
|
|
855
|
+
/* @__PURE__ */ jsxRuntime.jsxs(RouteFocusModal.Body, { className: "flex flex-col gap-4 overflow-y-auto p-6", children: [
|
|
856
|
+
error && /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-tag-red-text", children: error }),
|
|
857
|
+
loading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-3", children: Array.from({ length: 4 }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(ui.Skeleton, { className: "h-10 w-full" }, i)) }) : !record ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-start gap-4", children: [
|
|
858
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", children: "Sync record not found" }),
|
|
859
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", onClick: () => navigate(PARENT$1), children: "Back to Faire settings" })
|
|
860
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
861
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-ui-border-base grid grid-cols-2 gap-4 rounded-lg border p-4", children: [
|
|
862
|
+
/* @__PURE__ */ jsxRuntime.jsx(Detail, { label: "Record id", value: record.id, mono: true }),
|
|
863
|
+
/* @__PURE__ */ jsxRuntime.jsx(Detail, { label: "Product", value: record.product_id, mono: true }),
|
|
864
|
+
/* @__PURE__ */ jsxRuntime.jsx(Detail, { label: "Action", value: record.action }),
|
|
865
|
+
/* @__PURE__ */ jsxRuntime.jsx(Detail, { label: "Faire product token", value: record.product_token || "—", mono: true }),
|
|
866
|
+
/* @__PURE__ */ jsxRuntime.jsx(Detail, { label: "State", value: record.product_state || "—" }),
|
|
867
|
+
/* @__PURE__ */ jsxRuntime.jsx(Detail, { label: "Published", value: record.published ? "Yes" : "No" }),
|
|
868
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
869
|
+
Detail,
|
|
870
|
+
{
|
|
871
|
+
label: "Synced at",
|
|
872
|
+
value: record.synced_at ? new Date(record.synced_at).toLocaleString() : "—"
|
|
873
|
+
}
|
|
874
|
+
)
|
|
875
|
+
] }),
|
|
876
|
+
warnings.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-ui-border-base flex flex-col gap-2 rounded-lg border p-4", children: [
|
|
877
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", children: "Issues" }),
|
|
878
|
+
warnings.map((w, i) => /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-tag-red-text text-sm", children: w }, i))
|
|
879
|
+
] })
|
|
880
|
+
] })
|
|
881
|
+
] }),
|
|
882
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Toaster, {})
|
|
883
|
+
] });
|
|
884
|
+
};
|
|
885
|
+
const Detail = ({
|
|
886
|
+
label,
|
|
887
|
+
value,
|
|
888
|
+
mono
|
|
889
|
+
}) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
890
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Label, { children: label }),
|
|
891
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: mono ? "font-mono text-xs" : "", children: value })
|
|
892
|
+
] });
|
|
893
|
+
const handle$1 = {
|
|
894
|
+
breadcrumb: () => "Sync record"
|
|
895
|
+
};
|
|
846
896
|
const STATUS_KEY = ["faire", "status"];
|
|
847
897
|
const PARENT = "/settings/faire";
|
|
848
898
|
const NONE = "__none__";
|
|
@@ -1110,13 +1160,13 @@ const routeModule = {
|
|
|
1110
1160
|
handle: handle$3
|
|
1111
1161
|
},
|
|
1112
1162
|
{
|
|
1113
|
-
Component:
|
|
1114
|
-
path: "/settings/faire
|
|
1163
|
+
Component: FaireBulkPage,
|
|
1164
|
+
path: "/settings/faire/bulk",
|
|
1115
1165
|
handle: handle$2
|
|
1116
1166
|
},
|
|
1117
1167
|
{
|
|
1118
|
-
Component:
|
|
1119
|
-
path: "/settings/faire
|
|
1168
|
+
Component: FaireSyncDetailPage,
|
|
1169
|
+
path: "/settings/faire/:id",
|
|
1120
1170
|
handle: handle$1
|
|
1121
1171
|
},
|
|
1122
1172
|
{
|