UNPKG

@cardql/react

Version:

CardQL SDK for React web applications with hooks and context providers

510 lines (504 loc) 12.4 kB
// src/index.ts export * from "@cardql/core"; // src/context.tsx import { createContext, useContext, useMemo } from "react"; import { CardQL } from "@cardql/core"; import { jsx } from "react/jsx-runtime"; var CardQLContext = createContext(void 0); function CardQLProvider({ config, children }) { const cardql = useMemo(() => new CardQL(config), [config]); const value = useMemo( () => ({ cardql, config }), [cardql, config] ); return /* @__PURE__ */ jsx(CardQLContext.Provider, { value, children }); } function useCardQL() { const context = useContext(CardQLContext); if (context === void 0) { throw new Error("useCardQL must be used within a CardQLProvider"); } return context; } function useCardQLClient() { const { cardql } = useCardQL(); return cardql; } function useCardQLApi() { const { cardql } = useCardQL(); return cardql.api; } // src/hooks/useQuery.ts import { useState, useEffect, useCallback, useRef } from "react"; function useQuery(query, variables, options = {}) { const cardql = useCardQLClient(); const [data, setData] = useState(void 0); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const { enabled = true, refetchOnMount = true, refetchInterval, onSuccess, onError } = options; const intervalRef = useRef(); const mountedRef = useRef(true); const fetchData = useCallback(async () => { if (!enabled) return; setLoading(true); setError(null); try { const result = await cardql.client.requestWithRetry(query, variables); if (mountedRef.current) { setData(result); setLoading(false); onSuccess?.(result); } } catch (err) { if (mountedRef.current) { setError(err); setLoading(false); onError?.(err); } } }, [cardql, query, variables, enabled, onSuccess, onError]); const refetch = useCallback(async () => { await fetchData(); }, [fetchData]); const refresh = useCallback(async () => { setData(void 0); await fetchData(); }, [fetchData]); useEffect(() => { if (enabled && refetchOnMount) { fetchData(); } }, [enabled, refetchOnMount, fetchData]); useEffect(() => { if (refetchInterval && enabled) { intervalRef.current = setInterval(fetchData, refetchInterval); return () => { if (intervalRef.current) { clearInterval(intervalRef.current); } }; } }, [refetchInterval, enabled, fetchData]); useEffect(() => { return () => { mountedRef.current = false; if (intervalRef.current) { clearInterval(intervalRef.current); } }; }, []); return { data, loading, error, refetch, refresh }; } // src/hooks/useMutation.ts import { useState as useState2, useCallback as useCallback2 } from "react"; function useMutation(mutation, options = {}) { const cardql = useCardQLClient(); const [data, setData] = useState2(void 0); const [loading, setLoading] = useState2(false); const [error, setError] = useState2(null); const { onSuccess, onError, onSettled } = options; const mutateAsync = useCallback2( async (variables) => { setLoading(true); setError(null); try { const result = await cardql.client.requestWithRetry( mutation, variables ); setData(result); setLoading(false); onSuccess?.(result, variables); onSettled?.(result, null, variables); return result; } catch (err) { setError(err); setLoading(false); onError?.(err, variables); onSettled?.(void 0, err, variables); throw err; } }, [cardql, mutation, onSuccess, onError, onSettled] ); const mutate = useCallback2( async (variables) => { try { return await mutateAsync(variables); } catch (err) { return Promise.reject(err); } }, [mutateAsync] ); const reset = useCallback2(() => { setData(void 0); setError(null); setLoading(false); }, []); return { data, loading, error, mutate, mutateAsync, reset }; } // src/hooks/useCardQL.ts import { GET_ACCOUNTS, GET_ACCOUNT, CREATE_ACCOUNT, UPDATE_ACCOUNT, DELETE_ACCOUNT, GET_APPS, GET_APP, CREATE_APP, UPDATE_APP, DELETE_APP, GET_CUSTOMERS, GET_CUSTOMER, CREATE_CUSTOMER, UPDATE_CUSTOMER, DELETE_CUSTOMER, GET_MERCHANTS, GET_MERCHANT, CREATE_MERCHANT, UPDATE_MERCHANT, DELETE_MERCHANT, GET_PAYMENTS, GET_PAYMENT, CREATE_PAYMENT, UPDATE_PAYMENT, DELETE_PAYMENT, GET_LEDGERS, GET_LEDGER, CREATE_LEDGER, UPDATE_LEDGER, DELETE_LEDGER } from "@cardql/core"; function useAccounts(options) { return useQuery(GET_ACCOUNTS, void 0, options); } function useAccount(accountID, options) { return useQuery( GET_ACCOUNT, { accountID }, options ); } function useCreateAccount(options) { return useMutation( CREATE_ACCOUNT, options ); } function useUpdateAccount(options) { return useMutation( UPDATE_ACCOUNT, options ); } function useDeleteAccount(options) { return useMutation( DELETE_ACCOUNT, options ); } function useApps(options) { return useQuery(GET_APPS, void 0, options); } function useApp(id, options) { return useQuery(GET_APP, { id }, options); } function useCreateApp(options) { return useMutation(CREATE_APP, options); } function useUpdateApp(options) { return useMutation(UPDATE_APP, options); } function useDeleteApp(options) { return useMutation( DELETE_APP, options ); } function useCustomers(options) { return useQuery(GET_CUSTOMERS, void 0, options); } function useCustomer(id, options) { return useQuery(GET_CUSTOMER, { id }, options); } function useCreateCustomer(options) { return useMutation( CREATE_CUSTOMER, options ); } function useUpdateCustomer(options) { return useMutation( UPDATE_CUSTOMER, options ); } function useDeleteCustomer(options) { return useMutation( DELETE_CUSTOMER, options ); } function useMerchants(options) { return useQuery(GET_MERCHANTS, void 0, options); } function useMerchant(id, options) { return useQuery(GET_MERCHANT, { id }, options); } function useCreateMerchant(options) { return useMutation( CREATE_MERCHANT, options ); } function useUpdateMerchant(options) { return useMutation( UPDATE_MERCHANT, options ); } function useDeleteMerchant(options) { return useMutation( DELETE_MERCHANT, options ); } function usePayments(options) { return useQuery(GET_PAYMENTS, void 0, options); } function usePayment(id, options) { return useQuery(GET_PAYMENT, { id }, options); } function useCreatePayment(options) { return useMutation( CREATE_PAYMENT, options ); } function useUpdatePayment(options) { return useMutation( UPDATE_PAYMENT, options ); } function useDeletePayment(options) { return useMutation( DELETE_PAYMENT, options ); } function useLedgers(options) { return useQuery(GET_LEDGERS, void 0, options); } function useLedger(id, options) { return useQuery(GET_LEDGER, { id }, options); } function useCreateLedger(options) { return useMutation( CREATE_LEDGER, options ); } function useUpdateLedger(options) { return useMutation( UPDATE_LEDGER, options ); } function useDeleteLedger(options) { return useMutation( DELETE_LEDGER, options ); } // src/components/PaymentForm.tsx import { useState as useState3 } from "react"; import { jsx as jsx2, jsxs } from "react/jsx-runtime"; function PaymentForm({ merchantID, userID, onSuccess, onError, className = "", disabled = false }) { const [formData, setFormData] = useState3({ amount: "", currency: "USD", description: "" }); const createPayment = useCreatePayment({ onSuccess: (data) => { onSuccess?.(data.createPayment); setFormData({ amount: "", currency: "USD", description: "" }); }, onError: (error) => { onError?.(error); } }); const handleSubmit = async (e) => { e.preventDefault(); if (!formData.amount || !formData.currency) { onError?.(new Error("Amount and currency are required")); return; } const paymentInput = { amount: formData.amount, currency: formData.currency, merchantID, userID, description: formData.description || void 0 }; try { await createPayment.mutateAsync(paymentInput); } catch (error) { } }; const handleInputChange = (field, value) => { setFormData((prev) => ({ ...prev, [field]: value })); }; return /* @__PURE__ */ jsxs( "form", { onSubmit: handleSubmit, className: `cardql-payment-form ${className}`, children: [ /* @__PURE__ */ jsxs("div", { className: "cardql-form-field", children: [ /* @__PURE__ */ jsx2("label", { htmlFor: "amount", children: "Amount" }), /* @__PURE__ */ jsx2( "input", { id: "amount", type: "number", step: "0.01", min: "0", value: formData.amount, onChange: (e) => handleInputChange("amount", e.target.value), placeholder: "0.00", required: true, disabled: disabled || createPayment.loading } ) ] }), /* @__PURE__ */ jsxs("div", { className: "cardql-form-field", children: [ /* @__PURE__ */ jsx2("label", { htmlFor: "currency", children: "Currency" }), /* @__PURE__ */ jsxs( "select", { id: "currency", value: formData.currency, onChange: (e) => handleInputChange("currency", e.target.value), required: true, disabled: disabled || createPayment.loading, children: [ /* @__PURE__ */ jsx2("option", { value: "USD", children: "USD" }), /* @__PURE__ */ jsx2("option", { value: "EUR", children: "EUR" }), /* @__PURE__ */ jsx2("option", { value: "GBP", children: "GBP" }), /* @__PURE__ */ jsx2("option", { value: "CAD", children: "CAD" }), /* @__PURE__ */ jsx2("option", { value: "AUD", children: "AUD" }), /* @__PURE__ */ jsx2("option", { value: "JPY", children: "JPY" }) ] } ) ] }), /* @__PURE__ */ jsxs("div", { className: "cardql-form-field", children: [ /* @__PURE__ */ jsx2("label", { htmlFor: "description", children: "Description (Optional)" }), /* @__PURE__ */ jsx2( "input", { id: "description", type: "text", value: formData.description, onChange: (e) => handleInputChange("description", e.target.value), placeholder: "Payment description", disabled: disabled || createPayment.loading } ) ] }), createPayment.error && /* @__PURE__ */ jsxs("div", { className: "cardql-error", children: [ "Error: ", createPayment.error.message ] }), /* @__PURE__ */ jsx2( "button", { type: "submit", disabled: disabled || createPayment.loading || !formData.amount || !formData.currency, className: "cardql-submit-button", children: createPayment.loading ? "Processing..." : "Create Payment" } ) ] } ); } export { CardQLProvider, PaymentForm, useAccount, useAccounts, useApp, useApps, useCardQL, useCardQLApi, useCardQLClient, useCreateAccount, useCreateApp, useCreateCustomer, useCreateLedger, useCreateMerchant, useCreatePayment, useCustomer, useCustomers, useDeleteAccount, useDeleteApp, useDeleteCustomer, useDeleteLedger, useDeleteMerchant, useDeletePayment, useLedger, useLedgers, useMerchant, useMerchants, useMutation, usePayment, usePayments, useQuery, useUpdateAccount, useUpdateApp, useUpdateCustomer, useUpdateLedger, useUpdateMerchant, useUpdatePayment };