@gait-financial/react 0.1.0 → 0.1.1

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/index.cjs ADDED
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ "use client";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+
31
+ // src/index.ts
32
+ var src_exports = {};
33
+ __export(src_exports, {
34
+ GaitButton: () => GaitButton
35
+ });
36
+ module.exports = __toCommonJS(src_exports);
37
+
38
+ // src/components/GaitButton.tsx
39
+ var import_react = __toESM(require("react"), 1);
40
+ var GaitButton = (0, import_react.forwardRef)(function GaitButton2({
41
+ "data-id": dataId,
42
+ disabled,
43
+ size,
44
+ style,
45
+ items,
46
+ priceBreakdown,
47
+ totalCost,
48
+ customer,
49
+ webhook,
50
+ merchantStoreUrl,
51
+ onClick,
52
+ onLoaded,
53
+ onDataProcessed,
54
+ onSplitFeedback,
55
+ onMerchantIdError,
56
+ onConfirm,
57
+ className,
58
+ id,
59
+ ...rest
60
+ }, ref) {
61
+ const elementRef = (0, import_react.useRef)(null);
62
+ (0, import_react.useImperativeHandle)(ref, () => elementRef.current, []);
63
+ (0, import_react.useEffect)(() => {
64
+ const el = elementRef.current;
65
+ if (!el) return;
66
+ if (dataId !== void 0) el.setAttribute("data-id", dataId);
67
+ if (size !== void 0) el.setAttribute("size", size);
68
+ if (disabled) {
69
+ el.setAttribute("disabled", "");
70
+ } else {
71
+ el.removeAttribute("disabled");
72
+ }
73
+ if (style !== void 0) {
74
+ const styleStr = typeof style === "string" ? style : Object.entries(style).map(
75
+ ([k, v]) => `${k.replace(/([A-Z])/g, "-$1").toLowerCase()}: ${v}`
76
+ ).join("; ");
77
+ el.setAttribute("style", styleStr);
78
+ }
79
+ if (items !== void 0) {
80
+ el.setAttribute(
81
+ "items",
82
+ typeof items === "string" ? items : JSON.stringify(items)
83
+ );
84
+ }
85
+ if (priceBreakdown !== void 0) {
86
+ el.setAttribute(
87
+ "price-breakdown",
88
+ typeof priceBreakdown === "string" ? priceBreakdown : JSON.stringify(priceBreakdown)
89
+ );
90
+ }
91
+ if (totalCost !== void 0) {
92
+ el.setAttribute("total-cost", String(totalCost));
93
+ }
94
+ if (customer !== void 0) {
95
+ el.setAttribute(
96
+ "customer",
97
+ typeof customer === "string" ? customer : JSON.stringify(customer)
98
+ );
99
+ }
100
+ if (webhook !== void 0) {
101
+ el.setAttribute(
102
+ "webhook",
103
+ typeof webhook === "string" ? webhook : JSON.stringify(webhook)
104
+ );
105
+ }
106
+ if (merchantStoreUrl !== void 0) {
107
+ el.setAttribute("merchant-store-url", merchantStoreUrl);
108
+ }
109
+ }, [
110
+ dataId,
111
+ disabled,
112
+ size,
113
+ style,
114
+ items,
115
+ priceBreakdown,
116
+ totalCost,
117
+ customer,
118
+ webhook,
119
+ merchantStoreUrl
120
+ ]);
121
+ (0, import_react.useEffect)(() => {
122
+ const el = elementRef.current;
123
+ if (!el) return;
124
+ const handleClick = (e) => {
125
+ if (onClick && e instanceof CustomEvent && e.detail) {
126
+ onClick(e.detail);
127
+ }
128
+ };
129
+ const handleLoaded = (e) => {
130
+ if (onLoaded && e instanceof CustomEvent && e.detail) {
131
+ onLoaded(e.detail);
132
+ }
133
+ };
134
+ const handleDataProcessed = (e) => {
135
+ if (onDataProcessed && e instanceof CustomEvent && e.detail) {
136
+ onDataProcessed(e.detail);
137
+ }
138
+ };
139
+ const handleSplitFeedback = (e) => {
140
+ if (onSplitFeedback && e instanceof CustomEvent && e.detail) {
141
+ onSplitFeedback(e.detail);
142
+ }
143
+ };
144
+ const handleMerchantIdError = (e) => {
145
+ if (onMerchantIdError && e instanceof CustomEvent && e.detail) {
146
+ onMerchantIdError(e.detail);
147
+ }
148
+ };
149
+ const handleConfirm = (e) => {
150
+ if (onConfirm && e instanceof CustomEvent && e.detail) {
151
+ onConfirm(e.detail);
152
+ }
153
+ };
154
+ el.addEventListener("gait-click", handleClick);
155
+ el.addEventListener("gait-loaded", handleLoaded);
156
+ el.addEventListener("gait-data-processed", handleDataProcessed);
157
+ el.addEventListener("gait-split-feedback", handleSplitFeedback);
158
+ el.addEventListener("gait-merchant-id-error", handleMerchantIdError);
159
+ el.addEventListener("gait-confirm", handleConfirm);
160
+ return () => {
161
+ el.removeEventListener("gait-click", handleClick);
162
+ el.removeEventListener("gait-loaded", handleLoaded);
163
+ el.removeEventListener("gait-data-processed", handleDataProcessed);
164
+ el.removeEventListener("gait-split-feedback", handleSplitFeedback);
165
+ el.removeEventListener("gait-merchant-id-error", handleMerchantIdError);
166
+ el.removeEventListener("gait-confirm", handleConfirm);
167
+ };
168
+ }, [
169
+ onClick,
170
+ onLoaded,
171
+ onDataProcessed,
172
+ onSplitFeedback,
173
+ onMerchantIdError,
174
+ onConfirm
175
+ ]);
176
+ const passthrough = {};
177
+ if (className) passthrough.className = className;
178
+ if (id) passthrough.id = id;
179
+ Object.assign(passthrough, rest);
180
+ return import_react.default.createElement("gait-button", {
181
+ ref: elementRef,
182
+ ...passthrough
183
+ });
184
+ });
185
+ GaitButton.displayName = "GaitButton";
186
+ // Annotate the CommonJS export names for ESM import in node:
187
+ 0 && (module.exports = {
188
+ GaitButton
189
+ });
190
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/components/GaitButton.tsx"],"sourcesContent":["'use client';\n\n/**\n * @gait-financial/react - React wrappers for Gait Web Components\n *\n * Usage:\n * 1. Register the Web Component (run once, e.g. in _app.tsx or layout):\n * import '@gait-financial/react/register';\n *\n * 2. Use the React components:\n * import { GaitButton } from '@gait-financial/react';\n */\n\nexport { GaitButton } from './components/GaitButton';\nexport type { GaitButtonProps } from './components/GaitButton';\n\nexport type {\n ButtonSize,\n GaitButtonItem,\n GaitPriceBreakdownItem,\n GaitCustomer,\n GaitWebhook,\n GaitClickDetail,\n GaitLoadedDetail,\n GaitDataProcessedDetail,\n GaitSplitFeedbackDetail,\n GaitMerchantIdErrorDetail,\n GaitConfirmDetail,\n} from './types';\n","'use client';\n\n/**\n * React wrapper for GaitButton Web Component\n * Maps React props to element attributes (WC uses attributes as source of truth).\n * Uses ref + useEffect for binding - no direct JSX attribute spread to avoid React's\n * string coercion of booleans/objects.\n */\n\nimport React, {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n} from 'react';\nimport type {\n GaitButtonItem,\n GaitPriceBreakdownItem,\n GaitCustomer,\n GaitWebhook,\n GaitClickDetail,\n GaitLoadedDetail,\n GaitDataProcessedDetail,\n GaitSplitFeedbackDetail,\n GaitMerchantIdErrorDetail,\n GaitConfirmDetail,\n} from '../types';\n\nexport interface GaitButtonProps\n extends Omit<React.HTMLAttributes<HTMLElement>, 'onClick' | 'style'> {\n /** Checkout/data identity (required for payment flow) */\n 'data-id'?: string;\n /** Disable the button */\n disabled?: boolean;\n /** Button size */\n size?: 'small' | 'medium' | 'large';\n /** Inline styles - string (for WC) or React.CSSProperties */\n style?: React.CSSProperties | string;\n /** Cart/order items for split payment modal */\n items?: GaitButtonItem[] | string;\n /** Price breakdown items */\n priceBreakdown?: GaitPriceBreakdownItem[] | string;\n /** Total cost */\n totalCost?: number | string;\n /** Customer info for split payment */\n customer?: GaitCustomer | string;\n /** Webhook config for split payment callbacks */\n webhook?: GaitWebhook | string;\n /** Merchant store URL (defaults to window.location.origin) */\n merchantStoreUrl?: string;\n\n /** Button clicked */\n onClick?: (detail: GaitClickDetail) => void;\n /** Component loaded/rendered */\n onLoaded?: (detail: GaitLoadedDetail) => void;\n /** Data processed (e.g. checkoutId resolved) */\n onDataProcessed?: (detail: GaitDataProcessedDetail) => void;\n /** Split payment API feedback (success/failure) */\n onSplitFeedback?: (detail: GaitSplitFeedbackDetail) => void;\n /** Merchant ID lookup failed */\n onMerchantIdError?: (detail: GaitMerchantIdErrorDetail) => void;\n /** Pay remaining confirmed */\n onConfirm?: (detail: GaitConfirmDetail) => void;\n}\n\nconst GaitButton = forwardRef<HTMLElement, GaitButtonProps>(function GaitButton(\n {\n 'data-id': dataId,\n disabled,\n size,\n style,\n items,\n priceBreakdown,\n totalCost,\n customer,\n webhook,\n merchantStoreUrl,\n onClick,\n onLoaded,\n onDataProcessed,\n onSplitFeedback,\n onMerchantIdError,\n onConfirm,\n className,\n id,\n ...rest\n },\n ref\n) {\n const elementRef = useRef<HTMLElement>(null);\n\n useImperativeHandle(ref, () => elementRef.current as HTMLElement, []);\n\n // Sync props to element attributes via ref (WC reads attributes)\n useEffect(() => {\n const el = elementRef.current;\n if (!el) return;\n\n if (dataId !== undefined) el.setAttribute('data-id', dataId);\n if (size !== undefined) el.setAttribute('size', size);\n\n if (disabled) {\n el.setAttribute('disabled', '');\n } else {\n el.removeAttribute('disabled');\n }\n\n if (style !== undefined) {\n const styleStr =\n typeof style === 'string'\n ? style\n : Object.entries(style)\n .map(\n ([k, v]) =>\n `${k.replace(/([A-Z])/g, '-$1').toLowerCase()}: ${v}`\n )\n .join('; ');\n el.setAttribute('style', styleStr);\n }\n\n if (items !== undefined) {\n el.setAttribute(\n 'items',\n typeof items === 'string' ? items : JSON.stringify(items)\n );\n }\n\n if (priceBreakdown !== undefined) {\n el.setAttribute(\n 'price-breakdown',\n typeof priceBreakdown === 'string'\n ? priceBreakdown\n : JSON.stringify(priceBreakdown)\n );\n }\n\n if (totalCost !== undefined) {\n el.setAttribute('total-cost', String(totalCost));\n }\n\n if (customer !== undefined) {\n el.setAttribute(\n 'customer',\n typeof customer === 'string' ? customer : JSON.stringify(customer)\n );\n }\n\n if (webhook !== undefined) {\n el.setAttribute(\n 'webhook',\n typeof webhook === 'string' ? webhook : JSON.stringify(webhook)\n );\n }\n\n if (merchantStoreUrl !== undefined) {\n el.setAttribute('merchant-store-url', merchantStoreUrl);\n }\n }, [\n dataId,\n disabled,\n size,\n style,\n items,\n priceBreakdown,\n totalCost,\n customer,\n webhook,\n merchantStoreUrl,\n ]);\n\n // Event listeners\n useEffect(() => {\n const el = elementRef.current;\n if (!el) return;\n\n const handleClick = (e: Event) => {\n if (onClick && e instanceof CustomEvent && e.detail) {\n onClick(e.detail as GaitClickDetail);\n }\n };\n const handleLoaded = (e: Event) => {\n if (onLoaded && e instanceof CustomEvent && e.detail) {\n onLoaded(e.detail as GaitLoadedDetail);\n }\n };\n const handleDataProcessed = (e: Event) => {\n if (onDataProcessed && e instanceof CustomEvent && e.detail) {\n onDataProcessed(e.detail as GaitDataProcessedDetail);\n }\n };\n const handleSplitFeedback = (e: Event) => {\n if (onSplitFeedback && e instanceof CustomEvent && e.detail) {\n onSplitFeedback(e.detail as GaitSplitFeedbackDetail);\n }\n };\n const handleMerchantIdError = (e: Event) => {\n if (onMerchantIdError && e instanceof CustomEvent && e.detail) {\n onMerchantIdError(e.detail as GaitMerchantIdErrorDetail);\n }\n };\n const handleConfirm = (e: Event) => {\n if (onConfirm && e instanceof CustomEvent && e.detail) {\n onConfirm(e.detail as GaitConfirmDetail);\n }\n };\n\n el.addEventListener('gait-click', handleClick as EventListener);\n el.addEventListener('gait-loaded', handleLoaded as EventListener);\n el.addEventListener('gait-data-processed', handleDataProcessed as EventListener);\n el.addEventListener('gait-split-feedback', handleSplitFeedback as EventListener);\n el.addEventListener('gait-merchant-id-error', handleMerchantIdError as EventListener);\n el.addEventListener('gait-confirm', handleConfirm as EventListener);\n\n return () => {\n el.removeEventListener('gait-click', handleClick as EventListener);\n el.removeEventListener('gait-loaded', handleLoaded as EventListener);\n el.removeEventListener('gait-data-processed', handleDataProcessed as EventListener);\n el.removeEventListener('gait-split-feedback', handleSplitFeedback as EventListener);\n el.removeEventListener('gait-merchant-id-error', handleMerchantIdError as EventListener);\n el.removeEventListener('gait-confirm', handleConfirm as EventListener);\n };\n }, [\n onClick,\n onLoaded,\n onDataProcessed,\n onSplitFeedback,\n onMerchantIdError,\n onConfirm,\n ]);\n\n const passthrough: Record<string, unknown> = {};\n if (className) passthrough.className = className;\n if (id) passthrough.id = id;\n Object.assign(passthrough, rest);\n\n return React.createElement('gait-button', {\n ref: elementRef,\n ...passthrough,\n });\n});\n\nGaitButton.displayName = 'GaitButton';\n\nexport { GaitButton };\n"],"mappings":"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","names":["GaitButton","React"]}
@@ -0,0 +1,114 @@
1
+ import React from 'react';
2
+
3
+ /**
4
+ * Shared types for Gait React components
5
+ * Mirrors the Web Component API (source of truth)
6
+ */
7
+ type ButtonSize = 'small' | 'medium' | 'large';
8
+ interface GaitButtonItem {
9
+ name: string;
10
+ image: string;
11
+ id: string;
12
+ quantity: number;
13
+ category?: string;
14
+ price: number;
15
+ }
16
+ interface GaitPriceBreakdownItem {
17
+ name: string;
18
+ price: number | string;
19
+ }
20
+ interface GaitCustomer {
21
+ email: string;
22
+ name?: string;
23
+ }
24
+ interface GaitWebhook {
25
+ url: string;
26
+ body?: Record<string, unknown>;
27
+ }
28
+ /** gait-click event detail */
29
+ interface GaitClickDetail {
30
+ label: string;
31
+ dataId: string | null;
32
+ dataAttributes: Record<string, string>;
33
+ timestamp: string;
34
+ }
35
+ /** gait-loaded event detail */
36
+ interface GaitLoadedDetail {
37
+ attributes: Record<string, string | null>;
38
+ dataId: string | null;
39
+ dataAttributes: Record<string, string>;
40
+ label: string;
41
+ size: ButtonSize;
42
+ disabled: boolean;
43
+ timestamp: string;
44
+ }
45
+ /** gait-data-processed event detail */
46
+ interface GaitDataProcessedDetail {
47
+ id?: string;
48
+ timestamp: string;
49
+ [key: string]: unknown;
50
+ }
51
+ /** gait-split-feedback event detail */
52
+ interface GaitSplitFeedbackDetail {
53
+ success: boolean;
54
+ message?: string;
55
+ data?: unknown;
56
+ error?: string;
57
+ timestamp: string;
58
+ }
59
+ /** gait-merchant-id-error event detail */
60
+ interface GaitMerchantIdErrorDetail {
61
+ message: string;
62
+ timestamp: string;
63
+ }
64
+ /** gait-confirm event detail */
65
+ interface GaitConfirmDetail {
66
+ merchantId: string;
67
+ splitId: string;
68
+ paymentId: string;
69
+ }
70
+
71
+ /**
72
+ * React wrapper for GaitButton Web Component
73
+ * Maps React props to element attributes (WC uses attributes as source of truth).
74
+ * Uses ref + useEffect for binding - no direct JSX attribute spread to avoid React's
75
+ * string coercion of booleans/objects.
76
+ */
77
+
78
+ interface GaitButtonProps extends Omit<React.HTMLAttributes<HTMLElement>, 'onClick' | 'style'> {
79
+ /** Checkout/data identity (required for payment flow) */
80
+ 'data-id'?: string;
81
+ /** Disable the button */
82
+ disabled?: boolean;
83
+ /** Button size */
84
+ size?: 'small' | 'medium' | 'large';
85
+ /** Inline styles - string (for WC) or React.CSSProperties */
86
+ style?: React.CSSProperties | string;
87
+ /** Cart/order items for split payment modal */
88
+ items?: GaitButtonItem[] | string;
89
+ /** Price breakdown items */
90
+ priceBreakdown?: GaitPriceBreakdownItem[] | string;
91
+ /** Total cost */
92
+ totalCost?: number | string;
93
+ /** Customer info for split payment */
94
+ customer?: GaitCustomer | string;
95
+ /** Webhook config for split payment callbacks */
96
+ webhook?: GaitWebhook | string;
97
+ /** Merchant store URL (defaults to window.location.origin) */
98
+ merchantStoreUrl?: string;
99
+ /** Button clicked */
100
+ onClick?: (detail: GaitClickDetail) => void;
101
+ /** Component loaded/rendered */
102
+ onLoaded?: (detail: GaitLoadedDetail) => void;
103
+ /** Data processed (e.g. checkoutId resolved) */
104
+ onDataProcessed?: (detail: GaitDataProcessedDetail) => void;
105
+ /** Split payment API feedback (success/failure) */
106
+ onSplitFeedback?: (detail: GaitSplitFeedbackDetail) => void;
107
+ /** Merchant ID lookup failed */
108
+ onMerchantIdError?: (detail: GaitMerchantIdErrorDetail) => void;
109
+ /** Pay remaining confirmed */
110
+ onConfirm?: (detail: GaitConfirmDetail) => void;
111
+ }
112
+ declare const GaitButton: React.ForwardRefExoticComponent<GaitButtonProps & React.RefAttributes<HTMLElement>>;
113
+
114
+ export { type ButtonSize, GaitButton, type GaitButtonItem, type GaitButtonProps, type GaitClickDetail, type GaitConfirmDetail, type GaitCustomer, type GaitDataProcessedDetail, type GaitLoadedDetail, type GaitMerchantIdErrorDetail, type GaitPriceBreakdownItem, type GaitSplitFeedbackDetail, type GaitWebhook };
@@ -0,0 +1,114 @@
1
+ import React from 'react';
2
+
3
+ /**
4
+ * Shared types for Gait React components
5
+ * Mirrors the Web Component API (source of truth)
6
+ */
7
+ type ButtonSize = 'small' | 'medium' | 'large';
8
+ interface GaitButtonItem {
9
+ name: string;
10
+ image: string;
11
+ id: string;
12
+ quantity: number;
13
+ category?: string;
14
+ price: number;
15
+ }
16
+ interface GaitPriceBreakdownItem {
17
+ name: string;
18
+ price: number | string;
19
+ }
20
+ interface GaitCustomer {
21
+ email: string;
22
+ name?: string;
23
+ }
24
+ interface GaitWebhook {
25
+ url: string;
26
+ body?: Record<string, unknown>;
27
+ }
28
+ /** gait-click event detail */
29
+ interface GaitClickDetail {
30
+ label: string;
31
+ dataId: string | null;
32
+ dataAttributes: Record<string, string>;
33
+ timestamp: string;
34
+ }
35
+ /** gait-loaded event detail */
36
+ interface GaitLoadedDetail {
37
+ attributes: Record<string, string | null>;
38
+ dataId: string | null;
39
+ dataAttributes: Record<string, string>;
40
+ label: string;
41
+ size: ButtonSize;
42
+ disabled: boolean;
43
+ timestamp: string;
44
+ }
45
+ /** gait-data-processed event detail */
46
+ interface GaitDataProcessedDetail {
47
+ id?: string;
48
+ timestamp: string;
49
+ [key: string]: unknown;
50
+ }
51
+ /** gait-split-feedback event detail */
52
+ interface GaitSplitFeedbackDetail {
53
+ success: boolean;
54
+ message?: string;
55
+ data?: unknown;
56
+ error?: string;
57
+ timestamp: string;
58
+ }
59
+ /** gait-merchant-id-error event detail */
60
+ interface GaitMerchantIdErrorDetail {
61
+ message: string;
62
+ timestamp: string;
63
+ }
64
+ /** gait-confirm event detail */
65
+ interface GaitConfirmDetail {
66
+ merchantId: string;
67
+ splitId: string;
68
+ paymentId: string;
69
+ }
70
+
71
+ /**
72
+ * React wrapper for GaitButton Web Component
73
+ * Maps React props to element attributes (WC uses attributes as source of truth).
74
+ * Uses ref + useEffect for binding - no direct JSX attribute spread to avoid React's
75
+ * string coercion of booleans/objects.
76
+ */
77
+
78
+ interface GaitButtonProps extends Omit<React.HTMLAttributes<HTMLElement>, 'onClick' | 'style'> {
79
+ /** Checkout/data identity (required for payment flow) */
80
+ 'data-id'?: string;
81
+ /** Disable the button */
82
+ disabled?: boolean;
83
+ /** Button size */
84
+ size?: 'small' | 'medium' | 'large';
85
+ /** Inline styles - string (for WC) or React.CSSProperties */
86
+ style?: React.CSSProperties | string;
87
+ /** Cart/order items for split payment modal */
88
+ items?: GaitButtonItem[] | string;
89
+ /** Price breakdown items */
90
+ priceBreakdown?: GaitPriceBreakdownItem[] | string;
91
+ /** Total cost */
92
+ totalCost?: number | string;
93
+ /** Customer info for split payment */
94
+ customer?: GaitCustomer | string;
95
+ /** Webhook config for split payment callbacks */
96
+ webhook?: GaitWebhook | string;
97
+ /** Merchant store URL (defaults to window.location.origin) */
98
+ merchantStoreUrl?: string;
99
+ /** Button clicked */
100
+ onClick?: (detail: GaitClickDetail) => void;
101
+ /** Component loaded/rendered */
102
+ onLoaded?: (detail: GaitLoadedDetail) => void;
103
+ /** Data processed (e.g. checkoutId resolved) */
104
+ onDataProcessed?: (detail: GaitDataProcessedDetail) => void;
105
+ /** Split payment API feedback (success/failure) */
106
+ onSplitFeedback?: (detail: GaitSplitFeedbackDetail) => void;
107
+ /** Merchant ID lookup failed */
108
+ onMerchantIdError?: (detail: GaitMerchantIdErrorDetail) => void;
109
+ /** Pay remaining confirmed */
110
+ onConfirm?: (detail: GaitConfirmDetail) => void;
111
+ }
112
+ declare const GaitButton: React.ForwardRefExoticComponent<GaitButtonProps & React.RefAttributes<HTMLElement>>;
113
+
114
+ export { type ButtonSize, GaitButton, type GaitButtonItem, type GaitButtonProps, type GaitClickDetail, type GaitConfirmDetail, type GaitCustomer, type GaitDataProcessedDetail, type GaitLoadedDetail, type GaitMerchantIdErrorDetail, type GaitPriceBreakdownItem, type GaitSplitFeedbackDetail, type GaitWebhook };
package/dist/index.js ADDED
@@ -0,0 +1,159 @@
1
+ "use client";
2
+
3
+ // src/components/GaitButton.tsx
4
+ import React, {
5
+ forwardRef,
6
+ useEffect,
7
+ useImperativeHandle,
8
+ useRef
9
+ } from "react";
10
+ var GaitButton = forwardRef(function GaitButton2({
11
+ "data-id": dataId,
12
+ disabled,
13
+ size,
14
+ style,
15
+ items,
16
+ priceBreakdown,
17
+ totalCost,
18
+ customer,
19
+ webhook,
20
+ merchantStoreUrl,
21
+ onClick,
22
+ onLoaded,
23
+ onDataProcessed,
24
+ onSplitFeedback,
25
+ onMerchantIdError,
26
+ onConfirm,
27
+ className,
28
+ id,
29
+ ...rest
30
+ }, ref) {
31
+ const elementRef = useRef(null);
32
+ useImperativeHandle(ref, () => elementRef.current, []);
33
+ useEffect(() => {
34
+ const el = elementRef.current;
35
+ if (!el) return;
36
+ if (dataId !== void 0) el.setAttribute("data-id", dataId);
37
+ if (size !== void 0) el.setAttribute("size", size);
38
+ if (disabled) {
39
+ el.setAttribute("disabled", "");
40
+ } else {
41
+ el.removeAttribute("disabled");
42
+ }
43
+ if (style !== void 0) {
44
+ const styleStr = typeof style === "string" ? style : Object.entries(style).map(
45
+ ([k, v]) => `${k.replace(/([A-Z])/g, "-$1").toLowerCase()}: ${v}`
46
+ ).join("; ");
47
+ el.setAttribute("style", styleStr);
48
+ }
49
+ if (items !== void 0) {
50
+ el.setAttribute(
51
+ "items",
52
+ typeof items === "string" ? items : JSON.stringify(items)
53
+ );
54
+ }
55
+ if (priceBreakdown !== void 0) {
56
+ el.setAttribute(
57
+ "price-breakdown",
58
+ typeof priceBreakdown === "string" ? priceBreakdown : JSON.stringify(priceBreakdown)
59
+ );
60
+ }
61
+ if (totalCost !== void 0) {
62
+ el.setAttribute("total-cost", String(totalCost));
63
+ }
64
+ if (customer !== void 0) {
65
+ el.setAttribute(
66
+ "customer",
67
+ typeof customer === "string" ? customer : JSON.stringify(customer)
68
+ );
69
+ }
70
+ if (webhook !== void 0) {
71
+ el.setAttribute(
72
+ "webhook",
73
+ typeof webhook === "string" ? webhook : JSON.stringify(webhook)
74
+ );
75
+ }
76
+ if (merchantStoreUrl !== void 0) {
77
+ el.setAttribute("merchant-store-url", merchantStoreUrl);
78
+ }
79
+ }, [
80
+ dataId,
81
+ disabled,
82
+ size,
83
+ style,
84
+ items,
85
+ priceBreakdown,
86
+ totalCost,
87
+ customer,
88
+ webhook,
89
+ merchantStoreUrl
90
+ ]);
91
+ useEffect(() => {
92
+ const el = elementRef.current;
93
+ if (!el) return;
94
+ const handleClick = (e) => {
95
+ if (onClick && e instanceof CustomEvent && e.detail) {
96
+ onClick(e.detail);
97
+ }
98
+ };
99
+ const handleLoaded = (e) => {
100
+ if (onLoaded && e instanceof CustomEvent && e.detail) {
101
+ onLoaded(e.detail);
102
+ }
103
+ };
104
+ const handleDataProcessed = (e) => {
105
+ if (onDataProcessed && e instanceof CustomEvent && e.detail) {
106
+ onDataProcessed(e.detail);
107
+ }
108
+ };
109
+ const handleSplitFeedback = (e) => {
110
+ if (onSplitFeedback && e instanceof CustomEvent && e.detail) {
111
+ onSplitFeedback(e.detail);
112
+ }
113
+ };
114
+ const handleMerchantIdError = (e) => {
115
+ if (onMerchantIdError && e instanceof CustomEvent && e.detail) {
116
+ onMerchantIdError(e.detail);
117
+ }
118
+ };
119
+ const handleConfirm = (e) => {
120
+ if (onConfirm && e instanceof CustomEvent && e.detail) {
121
+ onConfirm(e.detail);
122
+ }
123
+ };
124
+ el.addEventListener("gait-click", handleClick);
125
+ el.addEventListener("gait-loaded", handleLoaded);
126
+ el.addEventListener("gait-data-processed", handleDataProcessed);
127
+ el.addEventListener("gait-split-feedback", handleSplitFeedback);
128
+ el.addEventListener("gait-merchant-id-error", handleMerchantIdError);
129
+ el.addEventListener("gait-confirm", handleConfirm);
130
+ return () => {
131
+ el.removeEventListener("gait-click", handleClick);
132
+ el.removeEventListener("gait-loaded", handleLoaded);
133
+ el.removeEventListener("gait-data-processed", handleDataProcessed);
134
+ el.removeEventListener("gait-split-feedback", handleSplitFeedback);
135
+ el.removeEventListener("gait-merchant-id-error", handleMerchantIdError);
136
+ el.removeEventListener("gait-confirm", handleConfirm);
137
+ };
138
+ }, [
139
+ onClick,
140
+ onLoaded,
141
+ onDataProcessed,
142
+ onSplitFeedback,
143
+ onMerchantIdError,
144
+ onConfirm
145
+ ]);
146
+ const passthrough = {};
147
+ if (className) passthrough.className = className;
148
+ if (id) passthrough.id = id;
149
+ Object.assign(passthrough, rest);
150
+ return React.createElement("gait-button", {
151
+ ref: elementRef,
152
+ ...passthrough
153
+ });
154
+ });
155
+ GaitButton.displayName = "GaitButton";
156
+ export {
157
+ GaitButton
158
+ };
159
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/GaitButton.tsx"],"sourcesContent":["'use client';\n\n/**\n * React wrapper for GaitButton Web Component\n * Maps React props to element attributes (WC uses attributes as source of truth).\n * Uses ref + useEffect for binding - no direct JSX attribute spread to avoid React's\n * string coercion of booleans/objects.\n */\n\nimport React, {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n} from 'react';\nimport type {\n GaitButtonItem,\n GaitPriceBreakdownItem,\n GaitCustomer,\n GaitWebhook,\n GaitClickDetail,\n GaitLoadedDetail,\n GaitDataProcessedDetail,\n GaitSplitFeedbackDetail,\n GaitMerchantIdErrorDetail,\n GaitConfirmDetail,\n} from '../types';\n\nexport interface GaitButtonProps\n extends Omit<React.HTMLAttributes<HTMLElement>, 'onClick' | 'style'> {\n /** Checkout/data identity (required for payment flow) */\n 'data-id'?: string;\n /** Disable the button */\n disabled?: boolean;\n /** Button size */\n size?: 'small' | 'medium' | 'large';\n /** Inline styles - string (for WC) or React.CSSProperties */\n style?: React.CSSProperties | string;\n /** Cart/order items for split payment modal */\n items?: GaitButtonItem[] | string;\n /** Price breakdown items */\n priceBreakdown?: GaitPriceBreakdownItem[] | string;\n /** Total cost */\n totalCost?: number | string;\n /** Customer info for split payment */\n customer?: GaitCustomer | string;\n /** Webhook config for split payment callbacks */\n webhook?: GaitWebhook | string;\n /** Merchant store URL (defaults to window.location.origin) */\n merchantStoreUrl?: string;\n\n /** Button clicked */\n onClick?: (detail: GaitClickDetail) => void;\n /** Component loaded/rendered */\n onLoaded?: (detail: GaitLoadedDetail) => void;\n /** Data processed (e.g. checkoutId resolved) */\n onDataProcessed?: (detail: GaitDataProcessedDetail) => void;\n /** Split payment API feedback (success/failure) */\n onSplitFeedback?: (detail: GaitSplitFeedbackDetail) => void;\n /** Merchant ID lookup failed */\n onMerchantIdError?: (detail: GaitMerchantIdErrorDetail) => void;\n /** Pay remaining confirmed */\n onConfirm?: (detail: GaitConfirmDetail) => void;\n}\n\nconst GaitButton = forwardRef<HTMLElement, GaitButtonProps>(function GaitButton(\n {\n 'data-id': dataId,\n disabled,\n size,\n style,\n items,\n priceBreakdown,\n totalCost,\n customer,\n webhook,\n merchantStoreUrl,\n onClick,\n onLoaded,\n onDataProcessed,\n onSplitFeedback,\n onMerchantIdError,\n onConfirm,\n className,\n id,\n ...rest\n },\n ref\n) {\n const elementRef = useRef<HTMLElement>(null);\n\n useImperativeHandle(ref, () => elementRef.current as HTMLElement, []);\n\n // Sync props to element attributes via ref (WC reads attributes)\n useEffect(() => {\n const el = elementRef.current;\n if (!el) return;\n\n if (dataId !== undefined) el.setAttribute('data-id', dataId);\n if (size !== undefined) el.setAttribute('size', size);\n\n if (disabled) {\n el.setAttribute('disabled', '');\n } else {\n el.removeAttribute('disabled');\n }\n\n if (style !== undefined) {\n const styleStr =\n typeof style === 'string'\n ? style\n : Object.entries(style)\n .map(\n ([k, v]) =>\n `${k.replace(/([A-Z])/g, '-$1').toLowerCase()}: ${v}`\n )\n .join('; ');\n el.setAttribute('style', styleStr);\n }\n\n if (items !== undefined) {\n el.setAttribute(\n 'items',\n typeof items === 'string' ? items : JSON.stringify(items)\n );\n }\n\n if (priceBreakdown !== undefined) {\n el.setAttribute(\n 'price-breakdown',\n typeof priceBreakdown === 'string'\n ? priceBreakdown\n : JSON.stringify(priceBreakdown)\n );\n }\n\n if (totalCost !== undefined) {\n el.setAttribute('total-cost', String(totalCost));\n }\n\n if (customer !== undefined) {\n el.setAttribute(\n 'customer',\n typeof customer === 'string' ? customer : JSON.stringify(customer)\n );\n }\n\n if (webhook !== undefined) {\n el.setAttribute(\n 'webhook',\n typeof webhook === 'string' ? webhook : JSON.stringify(webhook)\n );\n }\n\n if (merchantStoreUrl !== undefined) {\n el.setAttribute('merchant-store-url', merchantStoreUrl);\n }\n }, [\n dataId,\n disabled,\n size,\n style,\n items,\n priceBreakdown,\n totalCost,\n customer,\n webhook,\n merchantStoreUrl,\n ]);\n\n // Event listeners\n useEffect(() => {\n const el = elementRef.current;\n if (!el) return;\n\n const handleClick = (e: Event) => {\n if (onClick && e instanceof CustomEvent && e.detail) {\n onClick(e.detail as GaitClickDetail);\n }\n };\n const handleLoaded = (e: Event) => {\n if (onLoaded && e instanceof CustomEvent && e.detail) {\n onLoaded(e.detail as GaitLoadedDetail);\n }\n };\n const handleDataProcessed = (e: Event) => {\n if (onDataProcessed && e instanceof CustomEvent && e.detail) {\n onDataProcessed(e.detail as GaitDataProcessedDetail);\n }\n };\n const handleSplitFeedback = (e: Event) => {\n if (onSplitFeedback && e instanceof CustomEvent && e.detail) {\n onSplitFeedback(e.detail as GaitSplitFeedbackDetail);\n }\n };\n const handleMerchantIdError = (e: Event) => {\n if (onMerchantIdError && e instanceof CustomEvent && e.detail) {\n onMerchantIdError(e.detail as GaitMerchantIdErrorDetail);\n }\n };\n const handleConfirm = (e: Event) => {\n if (onConfirm && e instanceof CustomEvent && e.detail) {\n onConfirm(e.detail as GaitConfirmDetail);\n }\n };\n\n el.addEventListener('gait-click', handleClick as EventListener);\n el.addEventListener('gait-loaded', handleLoaded as EventListener);\n el.addEventListener('gait-data-processed', handleDataProcessed as EventListener);\n el.addEventListener('gait-split-feedback', handleSplitFeedback as EventListener);\n el.addEventListener('gait-merchant-id-error', handleMerchantIdError as EventListener);\n el.addEventListener('gait-confirm', handleConfirm as EventListener);\n\n return () => {\n el.removeEventListener('gait-click', handleClick as EventListener);\n el.removeEventListener('gait-loaded', handleLoaded as EventListener);\n el.removeEventListener('gait-data-processed', handleDataProcessed as EventListener);\n el.removeEventListener('gait-split-feedback', handleSplitFeedback as EventListener);\n el.removeEventListener('gait-merchant-id-error', handleMerchantIdError as EventListener);\n el.removeEventListener('gait-confirm', handleConfirm as EventListener);\n };\n }, [\n onClick,\n onLoaded,\n onDataProcessed,\n onSplitFeedback,\n onMerchantIdError,\n onConfirm,\n ]);\n\n const passthrough: Record<string, unknown> = {};\n if (className) passthrough.className = className;\n if (id) passthrough.id = id;\n Object.assign(passthrough, rest);\n\n return React.createElement('gait-button', {\n ref: elementRef,\n ...passthrough,\n });\n});\n\nGaitButton.displayName = 'GaitButton';\n\nexport { GaitButton };\n"],"mappings":"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","names":["GaitButton"]}