@t402/vue 2.0.0 → 2.3.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/README.md +137 -0
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +5 -5
- package/dist/esm/index.d.ts +5 -5
- package/dist/esm/index.js.map +1 -1
- package/package.json +8 -7
package/README.md
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# @t402/vue
|
|
2
|
+
|
|
3
|
+
Vue components and composables for the t402 Payment Protocol. Build payment-aware UIs with pre-built components and reactive composables.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @t402/vue
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
```vue
|
|
14
|
+
<script setup lang="ts">
|
|
15
|
+
import { PaymentButton, usePaymentRequired } from "@t402/vue";
|
|
16
|
+
|
|
17
|
+
const { paymentRequired, requirements, pay, status } = usePaymentRequired("/api/data");
|
|
18
|
+
</script>
|
|
19
|
+
|
|
20
|
+
<template>
|
|
21
|
+
<div v-if="paymentRequired">
|
|
22
|
+
<PaymentButton :requirements="requirements" :status="status" @pay="pay" />
|
|
23
|
+
</div>
|
|
24
|
+
<div v-else>
|
|
25
|
+
Premium content loaded!
|
|
26
|
+
</div>
|
|
27
|
+
</template>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Components
|
|
31
|
+
|
|
32
|
+
### PaymentButton
|
|
33
|
+
|
|
34
|
+
Renders a payment action button with loading and status states.
|
|
35
|
+
|
|
36
|
+
```vue
|
|
37
|
+
<PaymentButton
|
|
38
|
+
:requirements="requirements"
|
|
39
|
+
:status="status"
|
|
40
|
+
@pay="handlePay"
|
|
41
|
+
/>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### PaymentDetails
|
|
45
|
+
|
|
46
|
+
Displays payment requirements (amount, network, recipient).
|
|
47
|
+
|
|
48
|
+
```vue
|
|
49
|
+
<PaymentDetails :requirements="requirements" />
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### PaymentStatusDisplay
|
|
53
|
+
|
|
54
|
+
Shows the current payment status with appropriate UI feedback.
|
|
55
|
+
|
|
56
|
+
```vue
|
|
57
|
+
<PaymentStatusDisplay :status="status" />
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### AddressDisplay
|
|
61
|
+
|
|
62
|
+
Renders a blockchain address with truncation and copy functionality.
|
|
63
|
+
|
|
64
|
+
```vue
|
|
65
|
+
<AddressDisplay address="0x1234...5678" />
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Composables
|
|
69
|
+
|
|
70
|
+
### usePaymentRequired
|
|
71
|
+
|
|
72
|
+
Detects 402 responses and extracts payment requirements.
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
const {
|
|
76
|
+
paymentRequired, // Ref<boolean>
|
|
77
|
+
requirements, // Ref<PaymentRequirements[]>
|
|
78
|
+
pay, // () => Promise<void>
|
|
79
|
+
status, // Ref<PaymentStatus>
|
|
80
|
+
} = usePaymentRequired(url, options);
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### usePaymentStatus
|
|
84
|
+
|
|
85
|
+
Tracks the lifecycle of a payment (idle, pending, confirming, complete, error).
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
const { status, error, reset } = usePaymentStatus();
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### useAsyncPayment
|
|
92
|
+
|
|
93
|
+
Manages async payment flows with automatic retry and status tracking.
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
const { execute, status, error } = useAsyncPayment(paymentFn);
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Utilities
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
import {
|
|
103
|
+
isEvmNetwork,
|
|
104
|
+
isSvmNetwork,
|
|
105
|
+
isTonNetwork,
|
|
106
|
+
getNetworkDisplayName,
|
|
107
|
+
truncateAddress,
|
|
108
|
+
formatTokenAmount,
|
|
109
|
+
choosePaymentRequirement,
|
|
110
|
+
} from "@t402/vue";
|
|
111
|
+
|
|
112
|
+
// Network detection
|
|
113
|
+
isEvmNetwork("eip155:8453"); // true
|
|
114
|
+
|
|
115
|
+
// Display helpers
|
|
116
|
+
getNetworkDisplayName("eip155:8453"); // "Base"
|
|
117
|
+
truncateAddress("0x1234567890abcdef"); // "0x1234...cdef"
|
|
118
|
+
formatTokenAmount(1500000n, 6); // "1.50"
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Peer Dependencies
|
|
122
|
+
|
|
123
|
+
- `vue` ^3.3.0
|
|
124
|
+
|
|
125
|
+
## Development
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
pnpm build # Build the package
|
|
129
|
+
pnpm test # Run unit tests
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## Related Packages
|
|
133
|
+
|
|
134
|
+
- `@t402/core` - Core protocol types
|
|
135
|
+
- `@t402/react` - React components & hooks
|
|
136
|
+
- `@t402/paywall` - Universal paywall UI
|
|
137
|
+
- `@t402/fetch` - Fetch wrapper with automatic payment
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/Spinner.ts","../../src/components/PaymentButton.ts","../../src/components/PaymentStatusDisplay.ts","../../src/utils/index.ts","../../src/components/PaymentDetails.ts","../../src/components/AddressDisplay.ts","../../src/composables/usePaymentRequired.ts","../../src/composables/usePaymentStatus.ts","../../src/composables/useAsyncPayment.ts"],"names":["defineComponent","h","ref","computed","baseStyles","containerStyles"],"mappings":"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","file":"index.cjs","sourcesContent":["import { defineComponent, h, type PropType } from \"vue\";\n\nconst sizeConfig = {\n sm: { width: \"16px\", height: \"16px\", borderWidth: \"2px\" },\n md: { width: \"24px\", height: \"24px\", borderWidth: \"3px\" },\n lg: { width: \"32px\", height: \"32px\", borderWidth: \"4px\" },\n};\n\n/**\n * A simple loading spinner component.\n *\n * @example\n * ```vue\n * <template>\n * <Spinner size=\"md\" />\n * </template>\n * ```\n */\nexport const Spinner = defineComponent({\n name: \"T402Spinner\",\n props: {\n size: {\n type: String as PropType<\"sm\" | \"md\" | \"lg\">,\n default: \"md\",\n },\n },\n setup(props) {\n return () => {\n const config = sizeConfig[props.size];\n return h(\"span\", {\n role: \"status\",\n \"aria-label\": \"Loading\",\n style: {\n width: config.width,\n height: config.height,\n borderWidth: config.borderWidth,\n borderStyle: \"solid\",\n borderColor: \"#e5e7eb\",\n borderTopColor: \"#3b82f6\",\n borderRadius: \"50%\",\n animation: \"t402-spin 0.8s linear infinite\",\n display: \"inline-block\",\n },\n });\n };\n },\n});\n\n// CSS keyframes for the spinner animation\nexport const spinnerStyles = `\n@keyframes t402-spin {\n to { transform: rotate(360deg); }\n}\n`;\n","import { defineComponent, h, ref, type PropType, computed } from \"vue\";\nimport { Spinner } from \"./Spinner.js\";\n\nconst baseStyles = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"8px\",\n fontWeight: \"600\",\n borderRadius: \"8px\",\n cursor: \"pointer\",\n transition: \"all 0.15s ease\",\n border: \"none\",\n fontFamily: \"inherit\",\n};\n\nconst variantStyles = {\n primary: {\n backgroundColor: \"#2563eb\",\n color: \"#ffffff\",\n },\n secondary: {\n backgroundColor: \"#6b7280\",\n color: \"#ffffff\",\n },\n outline: {\n backgroundColor: \"transparent\",\n color: \"#2563eb\",\n border: \"2px solid #2563eb\",\n },\n};\n\nconst sizeStyles = {\n sm: {\n padding: \"8px 16px\",\n fontSize: \"14px\",\n },\n md: {\n padding: \"12px 24px\",\n fontSize: \"16px\",\n },\n lg: {\n padding: \"16px 32px\",\n fontSize: \"18px\",\n },\n};\n\n/**\n * A payment button component with loading state support.\n *\n * @example\n * ```vue\n * <template>\n * <PaymentButton\n * @click=\"handlePayment\"\n * :loading=\"isProcessing\"\n * variant=\"primary\"\n * size=\"lg\"\n * >\n * Pay $10.00\n * </PaymentButton>\n * </template>\n * ```\n */\nexport const PaymentButton = defineComponent({\n name: \"T402PaymentButton\",\n props: {\n disabled: {\n type: Boolean,\n default: false,\n },\n loading: {\n type: Boolean,\n default: false,\n },\n variant: {\n type: String as PropType<\"primary\" | \"secondary\" | \"outline\">,\n default: \"primary\",\n },\n size: {\n type: String as PropType<\"sm\" | \"md\" | \"lg\">,\n default: \"md\",\n },\n },\n emits: [\"click\"],\n setup(props, { emit, slots }) {\n const isHovered = ref(false);\n\n const isDisabled = computed(() => props.disabled || props.loading);\n\n const buttonStyle = computed(() => ({\n ...baseStyles,\n ...variantStyles[props.variant],\n ...sizeStyles[props.size],\n ...(isDisabled.value ? { opacity: \"0.6\", cursor: \"not-allowed\" } : {}),\n ...(isHovered.value && !isDisabled.value\n ? { filter: \"brightness(1.1)\", transform: \"translateY(-1px)\" }\n : {}),\n }));\n\n const handleClick = () => {\n if (!isDisabled.value) {\n emit(\"click\");\n }\n };\n\n return () =>\n h(\n \"button\",\n {\n type: \"button\",\n disabled: isDisabled.value,\n style: buttonStyle.value,\n onClick: handleClick,\n onMouseenter: () => (isHovered.value = true),\n onMouseleave: () => (isHovered.value = false),\n },\n [\n props.loading ? h(Spinner, { size: \"sm\" }) : null,\n slots.default ? slots.default() : \"Pay Now\",\n ],\n );\n },\n});\n","import { defineComponent, h, type PropType, computed } from \"vue\";\nimport { Spinner } from \"./Spinner.js\";\nimport type { PaymentStatus } from \"../types/index.js\";\n\nconst statusStyles = {\n idle: {\n backgroundColor: \"#f3f4f6\",\n color: \"#374151\",\n borderColor: \"#d1d5db\",\n },\n loading: {\n backgroundColor: \"#eff6ff\",\n color: \"#1d4ed8\",\n borderColor: \"#93c5fd\",\n },\n success: {\n backgroundColor: \"#f0fdf4\",\n color: \"#166534\",\n borderColor: \"#86efac\",\n },\n error: {\n backgroundColor: \"#fef2f2\",\n color: \"#dc2626\",\n borderColor: \"#fca5a5\",\n },\n};\n\nconst baseStyles = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"12px 16px\",\n borderRadius: \"8px\",\n borderWidth: \"1px\",\n borderStyle: \"solid\",\n fontSize: \"14px\",\n fontWeight: \"500\",\n};\n\nconst icons: Record<PaymentStatus, string> = {\n idle: \"○\",\n loading: \"\",\n success: \"✓\",\n error: \"✕\",\n};\n\nconst defaultMessages: Record<PaymentStatus, string> = {\n idle: \"Ready to pay\",\n loading: \"Processing...\",\n success: \"Payment successful\",\n error: \"Payment failed\",\n};\n\n/**\n * A component to display payment status with appropriate styling.\n *\n * @example\n * ```vue\n * <template>\n * <PaymentStatusDisplay\n * :status=\"status\"\n * message=\"Processing payment...\"\n * />\n * </template>\n * ```\n */\nexport const PaymentStatusDisplay = defineComponent({\n name: \"T402PaymentStatusDisplay\",\n props: {\n status: {\n type: String as PropType<PaymentStatus>,\n required: true,\n },\n message: {\n type: String,\n default: undefined,\n },\n },\n setup(props) {\n const combinedStyle = computed(() => ({\n ...baseStyles,\n ...statusStyles[props.status],\n }));\n\n const displayMessage = computed(() => props.message || defaultMessages[props.status]);\n\n return () =>\n h(\n \"div\",\n {\n role: \"status\",\n \"aria-live\": \"polite\",\n style: combinedStyle.value,\n },\n [\n props.status === \"loading\"\n ? h(Spinner, { size: \"sm\" })\n : h(\"span\", { style: { fontSize: \"16px\" } }, icons[props.status]),\n h(\"span\", displayMessage.value),\n ],\n );\n },\n});\n","import type { PaymentRequirements } from \"@t402/core/types\";\n\n// Chain configuration constants\n\n/** EVM Chain IDs (CAIP-2 format: eip155:chainId) */\nexport const EVM_CHAIN_IDS = {\n ETHEREUM_MAINNET: \"1\",\n BASE_MAINNET: \"8453\",\n BASE_SEPOLIA: \"84532\",\n ARBITRUM_MAINNET: \"42161\",\n ARBITRUM_SEPOLIA: \"421614\",\n} as const;\n\n/** Solana Network References (CAIP-2 format: solana:genesisHash) */\nexport const SOLANA_NETWORK_REFS = {\n MAINNET: \"5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\",\n DEVNET: \"EtWTRABZaYq6iMfeYKouRu166VU2xqa1\",\n} as const;\n\n/** TON Network References (CAIP-2 format: ton:workchain) */\nexport const TON_NETWORK_REFS = {\n MAINNET: \"-239\",\n TESTNET: \"-3\",\n} as const;\n\n/** TRON Network References */\nexport const TRON_NETWORK_REFS = {\n MAINNET: \"mainnet\",\n NILE: \"nile\",\n SHASTA: \"shasta\",\n} as const;\n\n/**\n * Normalizes payment requirements into an array.\n *\n * @param paymentRequirements - A single requirement or array of requirements.\n * @returns An array of payment requirements.\n */\nexport function normalizePaymentRequirements(\n paymentRequirements: PaymentRequirements | PaymentRequirements[],\n): PaymentRequirements[] {\n if (Array.isArray(paymentRequirements)) {\n return paymentRequirements;\n }\n return [paymentRequirements];\n}\n\n/**\n * Returns preferred networks for payment selection.\n *\n * @param testnet - Whether to prefer testnet networks.\n * @returns Ordered list of preferred networks (CAIP-2 format).\n */\nexport function getPreferredNetworks(testnet: boolean): string[] {\n if (testnet) {\n return [\n `eip155:${EVM_CHAIN_IDS.BASE_SEPOLIA}`,\n `eip155:${EVM_CHAIN_IDS.ARBITRUM_SEPOLIA}`,\n `solana:${SOLANA_NETWORK_REFS.DEVNET}`,\n ];\n }\n return [\n `eip155:${EVM_CHAIN_IDS.BASE_MAINNET}`,\n `eip155:${EVM_CHAIN_IDS.ARBITRUM_MAINNET}`,\n `solana:${SOLANA_NETWORK_REFS.MAINNET}`,\n ];\n}\n\n/**\n * Selects the most appropriate payment requirement.\n *\n * @param paymentRequirements - Available payment requirements.\n * @param testnet - Whether to prefer testnet networks.\n * @returns The selected payment requirement.\n */\nexport function choosePaymentRequirement(\n paymentRequirements: PaymentRequirements | PaymentRequirements[],\n testnet: boolean,\n): PaymentRequirements {\n const normalized = normalizePaymentRequirements(paymentRequirements);\n const preferredNetworks = getPreferredNetworks(testnet);\n\n for (const preferredNetwork of preferredNetworks) {\n const match = normalized.find(req => req.network === preferredNetwork);\n if (match) {\n return match;\n }\n }\n\n return normalized[0];\n}\n\n/**\n * Determines if the network is EVM-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is EVM-based.\n */\nexport function isEvmNetwork(network: string): boolean {\n return network.startsWith(\"eip155:\");\n}\n\n/**\n * Determines if the network is Solana-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is Solana-based.\n */\nexport function isSvmNetwork(network: string): boolean {\n return network.startsWith(\"solana:\");\n}\n\n/**\n * Determines if the network is TON-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is TON-based.\n */\nexport function isTonNetwork(network: string): boolean {\n return network.startsWith(\"ton:\");\n}\n\n/**\n * Determines if the network is TRON-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is TRON-based.\n */\nexport function isTronNetwork(network: string): boolean {\n return network.startsWith(\"tron:\");\n}\n\n/** Known EVM chain names */\nconst EVM_CHAIN_NAMES: Record<string, string> = {\n \"1\": \"Ethereum\",\n \"10\": \"Optimism\",\n \"137\": \"Polygon\",\n \"8453\": \"Base\",\n \"42161\": \"Arbitrum One\",\n \"84532\": \"Base Sepolia\",\n \"421614\": \"Arbitrum Sepolia\",\n \"11155111\": \"Sepolia\",\n};\n\n/**\n * Gets a human-readable display name for a network.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns A display name suitable for UI use.\n */\nexport function getNetworkDisplayName(network: string): string {\n if (network.startsWith(\"eip155:\")) {\n const chainId = network.split(\":\")[1];\n return EVM_CHAIN_NAMES[chainId] ?? `Chain ${chainId}`;\n }\n\n if (network.startsWith(\"solana:\")) {\n const ref = network.split(\":\")[1];\n return ref === SOLANA_NETWORK_REFS.DEVNET ? \"Solana Devnet\" : \"Solana\";\n }\n\n if (network.startsWith(\"ton:\")) {\n const ref = network.split(\":\")[1];\n return ref === TON_NETWORK_REFS.TESTNET ? \"TON Testnet\" : \"TON\";\n }\n\n if (network.startsWith(\"tron:\")) {\n const ref = network.split(\":\")[1];\n if (ref === TRON_NETWORK_REFS.NILE) return \"TRON Nile\";\n if (ref === TRON_NETWORK_REFS.SHASTA) return \"TRON Shasta\";\n return \"TRON\";\n }\n\n return network;\n}\n\n/** Known testnet chain IDs */\nconst TESTNET_CHAIN_IDS = new Set([\"84532\", \"421614\", \"11155111\", \"80001\", \"97\"]);\n\n/**\n * Determines if the network is a testnet.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is a testnet.\n */\nexport function isTestnetNetwork(network: string): boolean {\n if (network.startsWith(\"eip155:\")) {\n const chainId = network.split(\":\")[1];\n return TESTNET_CHAIN_IDS.has(chainId);\n }\n\n if (network.startsWith(\"solana:\")) {\n const ref = network.split(\":\")[1];\n return ref === SOLANA_NETWORK_REFS.DEVNET;\n }\n\n if (network.startsWith(\"ton:\")) {\n const ref = network.split(\":\")[1];\n return ref === TON_NETWORK_REFS.TESTNET;\n }\n\n if (network.startsWith(\"tron:\")) {\n const ref = network.split(\":\")[1];\n return ref === TRON_NETWORK_REFS.NILE || ref === TRON_NETWORK_REFS.SHASTA;\n }\n\n return false;\n}\n\n/**\n * Truncates an address for display.\n *\n * @param address - The full address.\n * @param startChars - Number of characters to show at start (default: 6).\n * @param endChars - Number of characters to show at end (default: 4).\n * @returns The truncated address.\n */\nexport function truncateAddress(address: string, startChars = 6, endChars = 4): string {\n if (address.length <= startChars + endChars + 3) {\n return address;\n }\n return `${address.slice(0, startChars)}...${address.slice(-endChars)}`;\n}\n\n/**\n * Formats a token amount for display.\n *\n * @param amount - The amount as a string (in smallest unit).\n * @param decimals - The token decimals (default: 6 for USDT).\n * @param maxDecimals - Maximum decimal places to show (default: 2).\n * @returns The formatted amount.\n */\nexport function formatTokenAmount(amount: string, decimals = 6, maxDecimals = 2): string {\n const value = BigInt(amount);\n const divisor = BigInt(10 ** decimals);\n const integerPart = value / divisor;\n const fractionalPart = value % divisor;\n\n if (fractionalPart === 0n) {\n return integerPart.toString();\n }\n\n const fractionalStr = fractionalPart.toString().padStart(decimals, \"0\");\n const trimmed = fractionalStr.slice(0, maxDecimals).replace(/0+$/, \"\");\n\n if (trimmed === \"\") {\n return integerPart.toString();\n }\n\n return `${integerPart}.${trimmed}`;\n}\n\n/**\n * Gets the asset display name.\n *\n * @param asset - The asset identifier (e.g., \"usdt\", \"usdt0\").\n * @returns A display name suitable for UI use.\n */\nexport function getAssetDisplayName(asset: string): string {\n const assetLower = asset.toLowerCase();\n\n switch (assetLower) {\n case \"usdt\":\n return \"USDT\";\n case \"usdt0\":\n return \"USDT0\";\n case \"usdc\":\n return \"USDC\";\n default:\n return asset.toUpperCase();\n }\n}\n","import { defineComponent, h, type PropType, computed } from \"vue\";\nimport type { PaymentRequirements } from \"@t402/core/types\";\nimport {\n formatTokenAmount,\n getNetworkDisplayName,\n getAssetDisplayName,\n truncateAddress,\n} from \"../utils/index.js\";\n\nconst containerStyles = {\n backgroundColor: \"#f9fafb\",\n borderRadius: \"12px\",\n padding: \"16px\",\n borderWidth: \"1px\",\n borderStyle: \"solid\",\n borderColor: \"#e5e7eb\",\n};\n\nconst rowStyles = {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n padding: \"8px 0\",\n borderBottomWidth: \"1px\",\n borderBottomStyle: \"solid\",\n borderBottomColor: \"#e5e7eb\",\n};\n\nconst lastRowStyles = {\n ...rowStyles,\n borderBottomWidth: \"0\",\n};\n\nconst labelStyles = {\n color: \"#6b7280\",\n fontSize: \"14px\",\n};\n\nconst valueStyles = {\n color: \"#111827\",\n fontSize: \"14px\",\n fontWeight: \"500\",\n};\n\nconst amountStyles = {\n color: \"#111827\",\n fontSize: \"20px\",\n fontWeight: \"700\",\n};\n\n/**\n * A component to display payment requirement details.\n *\n * @example\n * ```vue\n * <template>\n * <PaymentDetails\n * :requirement=\"requirement\"\n * show-network\n * show-asset\n * show-recipient\n * />\n * </template>\n * ```\n */\nexport const PaymentDetails = defineComponent({\n name: \"T402PaymentDetails\",\n props: {\n requirement: {\n type: Object as PropType<PaymentRequirements>,\n required: true,\n },\n showNetwork: {\n type: Boolean,\n default: true,\n },\n showAsset: {\n type: Boolean,\n default: true,\n },\n showRecipient: {\n type: Boolean,\n default: false,\n },\n },\n setup(props) {\n const formattedAmount = computed(() => formatTokenAmount(props.requirement.amount));\n const assetName = computed(() => getAssetDisplayName(props.requirement.asset));\n const networkName = computed(() => getNetworkDisplayName(props.requirement.network));\n const truncatedAddress = computed(() => truncateAddress(props.requirement.payTo));\n\n return () => {\n const rows = [];\n\n // Amount row - always shown\n rows.push(\n h(\"div\", { style: rowStyles }, [\n h(\"span\", { style: labelStyles }, \"Amount\"),\n h(\"span\", { style: amountStyles }, `${formattedAmount.value} ${assetName.value}`),\n ]),\n );\n\n // Network row\n if (props.showNetwork) {\n rows.push(\n h(\"div\", { style: rowStyles }, [\n h(\"span\", { style: labelStyles }, \"Network\"),\n h(\"span\", { style: valueStyles }, networkName.value),\n ]),\n );\n }\n\n // Asset row\n if (props.showAsset) {\n rows.push(\n h(\"div\", { style: rowStyles }, [\n h(\"span\", { style: labelStyles }, \"Asset\"),\n h(\"span\", { style: valueStyles }, assetName.value),\n ]),\n );\n }\n\n // Recipient row\n if (props.showRecipient) {\n rows.push(\n h(\"div\", { style: lastRowStyles }, [\n h(\"span\", { style: labelStyles }, \"Recipient\"),\n h(\n \"span\",\n {\n style: { ...valueStyles, fontFamily: \"monospace\" },\n title: props.requirement.payTo,\n },\n truncatedAddress.value,\n ),\n ]),\n );\n }\n\n return h(\"div\", { style: containerStyles }, rows);\n };\n },\n});\n","import { defineComponent, h, ref, computed } from \"vue\";\nimport { truncateAddress } from \"../utils/index.js\";\n\nconst containerStyles = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"8px\",\n fontFamily: \"monospace\",\n fontSize: \"14px\",\n};\n\nconst addressStyles = {\n color: \"#374151\",\n};\n\nconst buttonStyles = {\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: \"4px\",\n borderRadius: \"4px\",\n color: \"#6b7280\",\n transition: \"all 0.15s ease\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n};\n\nconst copiedButtonStyles = {\n ...buttonStyles,\n color: \"#22c55e\",\n};\n\n/**\n * A component to display blockchain addresses with optional copy functionality.\n *\n * @example\n * ```vue\n * <template>\n * <AddressDisplay\n * address=\"0x1234567890abcdef1234567890abcdef12345678\"\n * copyable\n * :start-chars=\"6\"\n * :end-chars=\"4\"\n * />\n * </template>\n * ```\n */\nexport const AddressDisplay = defineComponent({\n name: \"T402AddressDisplay\",\n props: {\n address: {\n type: String,\n required: true,\n },\n startChars: {\n type: Number,\n default: 6,\n },\n endChars: {\n type: Number,\n default: 4,\n },\n copyable: {\n type: Boolean,\n default: false,\n },\n },\n setup(props) {\n const copied = ref(false);\n\n const displayAddress = computed(() =>\n truncateAddress(props.address, props.startChars, props.endChars),\n );\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(props.address);\n copied.value = true;\n setTimeout(() => (copied.value = false), 2000);\n } catch {\n // Fallback for older browsers\n const textArea = document.createElement(\"textarea\");\n textArea.value = props.address;\n document.body.appendChild(textArea);\n textArea.select();\n document.execCommand(\"copy\");\n document.body.removeChild(textArea);\n copied.value = true;\n setTimeout(() => (copied.value = false), 2000);\n }\n };\n\n // Copy icon SVG\n const copyIcon = () =>\n h(\n \"svg\",\n {\n width: \"16\",\n height: \"16\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n \"stroke-width\": \"2\",\n },\n [\n h(\"rect\", { x: \"9\", y: \"9\", width: \"13\", height: \"13\", rx: \"2\", ry: \"2\" }),\n h(\"path\", { d: \"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" }),\n ],\n );\n\n // Checkmark icon SVG\n const checkIcon = () =>\n h(\n \"svg\",\n {\n width: \"16\",\n height: \"16\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n \"stroke-width\": \"2\",\n },\n [h(\"polyline\", { points: \"20 6 9 17 4 12\" })],\n );\n\n return () =>\n h(\"span\", { style: containerStyles, title: props.address }, [\n h(\"span\", { style: addressStyles }, displayAddress.value),\n props.copyable\n ? h(\n \"button\",\n {\n type: \"button\",\n onClick: handleCopy,\n style: copied.value ? copiedButtonStyles : buttonStyles,\n \"aria-label\": copied.value ? \"Copied\" : \"Copy address\",\n },\n [copied.value ? checkIcon() : copyIcon()],\n )\n : null,\n ]);\n },\n});\n","import { ref, type Ref } from \"vue\";\nimport type { PaymentRequired } from \"@t402/core/types\";\nimport type { PaymentStatus } from \"../types/index.js\";\n\ninterface UsePaymentRequiredOptions {\n /** Callback when payment is successful */\n onSuccess?: (response: Response) => void;\n /** Callback when payment fails */\n onError?: (error: Error) => void;\n}\n\ninterface UsePaymentRequiredReturn {\n /** The payment required data from a 402 response */\n paymentRequired: Ref<PaymentRequired | null>;\n /** Current status of the fetch operation */\n status: Ref<PaymentStatus>;\n /** Error message if status is 'error' */\n error: Ref<string | null>;\n /** Fetch a resource and capture 402 response */\n fetchResource: (url: string, options?: RequestInit) => Promise<Response | null>;\n /** Reset the state */\n reset: () => void;\n}\n\n/**\n * Composable to fetch a resource and capture 402 Payment Required responses.\n *\n * @param options - Configuration options.\n * @returns State and methods for handling 402 responses.\n *\n * @example\n * ```vue\n * <script setup>\n * import { usePaymentRequired } from \"@t402/vue\";\n *\n * const { paymentRequired, status, fetchResource } = usePaymentRequired({\n * onSuccess: (response) => console.log(\"Access granted!\"),\n * });\n *\n * const handleFetch = async () => {\n * const response = await fetchResource(\"/api/protected\");\n * if (response?.ok) {\n * const data = await response.json();\n * // Handle successful response\n * }\n * };\n * </script>\n * ```\n */\nexport function usePaymentRequired(options: UsePaymentRequiredOptions = {}): UsePaymentRequiredReturn {\n const { onSuccess, onError } = options;\n\n const paymentRequired = ref<PaymentRequired | null>(null);\n const status = ref<PaymentStatus>(\"idle\");\n const error = ref<string | null>(null);\n\n const fetchResource = async (url: string, fetchOptions?: RequestInit): Promise<Response | null> => {\n status.value = \"loading\";\n error.value = null;\n paymentRequired.value = null;\n\n try {\n const response = await fetch(url, fetchOptions);\n\n if (response.status === 402) {\n const data = (await response.json()) as PaymentRequired;\n paymentRequired.value = data;\n status.value = \"idle\";\n return null;\n }\n\n if (response.ok) {\n status.value = \"success\";\n onSuccess?.(response);\n return response;\n }\n\n throw new Error(`Request failed with status ${response.status}`);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Unknown error\";\n error.value = errorMessage;\n status.value = \"error\";\n onError?.(err instanceof Error ? err : new Error(errorMessage));\n return null;\n }\n };\n\n const reset = () => {\n paymentRequired.value = null;\n status.value = \"idle\";\n error.value = null;\n };\n\n return {\n paymentRequired,\n status,\n error,\n fetchResource,\n reset,\n };\n}\n","import { ref, type Ref } from \"vue\";\nimport type { PaymentStatus } from \"../types/index.js\";\n\ninterface StatusMessage {\n /** Message text */\n text: string;\n /** Message type */\n type: \"info\" | \"success\" | \"error\" | \"warning\";\n /** Optional auto-dismiss timeout in ms */\n timeout?: number;\n}\n\ninterface UsePaymentStatusReturn {\n /** Current payment status */\n status: Ref<PaymentStatus>;\n /** Current status message */\n message: Ref<StatusMessage | null>;\n /** Set the status */\n setStatus: (status: PaymentStatus, message?: string) => void;\n /** Set a success message */\n setSuccess: (message: string, timeout?: number) => void;\n /** Set an error message */\n setError: (message: string) => void;\n /** Set an info message */\n setInfo: (message: string, timeout?: number) => void;\n /** Set a warning message */\n setWarning: (message: string, timeout?: number) => void;\n /** Clear the current message */\n clearMessage: () => void;\n /** Reset to idle state */\n reset: () => void;\n}\n\n/**\n * Composable for managing payment status and status messages.\n *\n * @returns State and methods for status management.\n *\n * @example\n * ```vue\n * <script setup>\n * import { usePaymentStatus } from \"@t402/vue\";\n *\n * const {\n * status,\n * message,\n * setStatus,\n * setSuccess,\n * setError,\n * } = usePaymentStatus();\n *\n * const handlePayment = async () => {\n * setStatus(\"loading\", \"Processing payment...\");\n * try {\n * await processPayment();\n * setSuccess(\"Payment successful!\", 3000);\n * } catch (err) {\n * setError(\"Payment failed. Please try again.\");\n * }\n * };\n * </script>\n * ```\n */\nexport function usePaymentStatus(): UsePaymentStatusReturn {\n const status = ref<PaymentStatus>(\"idle\");\n const message = ref<StatusMessage | null>(null);\n\n const scheduleMessageClear = (timeout?: number) => {\n if (timeout && timeout > 0) {\n setTimeout(() => {\n message.value = null;\n }, timeout);\n }\n };\n\n const setStatus = (newStatus: PaymentStatus, messageText?: string) => {\n status.value = newStatus;\n if (messageText) {\n const type = newStatus === \"error\" ? \"error\" : newStatus === \"success\" ? \"success\" : \"info\";\n message.value = { text: messageText, type };\n }\n };\n\n const setSuccess = (text: string, timeout?: number) => {\n status.value = \"success\";\n message.value = { text, type: \"success\", timeout };\n scheduleMessageClear(timeout);\n };\n\n const setError = (text: string) => {\n status.value = \"error\";\n message.value = { text, type: \"error\" };\n };\n\n const setInfo = (text: string, timeout?: number) => {\n message.value = { text, type: \"info\", timeout };\n scheduleMessageClear(timeout);\n };\n\n const setWarning = (text: string, timeout?: number) => {\n message.value = { text, type: \"warning\", timeout };\n scheduleMessageClear(timeout);\n };\n\n const clearMessage = () => {\n message.value = null;\n };\n\n const reset = () => {\n status.value = \"idle\";\n message.value = null;\n };\n\n return {\n status,\n message,\n setStatus,\n setSuccess,\n setError,\n setInfo,\n setWarning,\n clearMessage,\n reset,\n };\n}\n","import { ref, computed, type Ref, type ComputedRef } from \"vue\";\nimport type { PaymentStatus } from \"../types/index.js\";\n\ninterface UseAsyncPaymentOptions<T> {\n /** The async payment function to execute */\n paymentFn: () => Promise<T>;\n /** Callback on successful payment */\n onSuccess?: (result: T) => void;\n /** Callback on payment error */\n onError?: (error: Error) => void;\n /** Callback when payment starts */\n onStart?: () => void;\n}\n\ninterface UseAsyncPaymentReturn<T> {\n /** Execute the payment */\n execute: () => Promise<T | null>;\n /** Current payment status */\n status: Ref<PaymentStatus>;\n /** Result of successful payment */\n result: Ref<T | null>;\n /** Error message if payment failed */\n error: Ref<string | null>;\n /** Whether payment is in progress */\n isLoading: ComputedRef<boolean>;\n /** Whether payment succeeded */\n isSuccess: ComputedRef<boolean>;\n /** Whether payment failed */\n isError: ComputedRef<boolean>;\n /** Reset the state */\n reset: () => void;\n}\n\n/**\n * Composable for managing async payment operations with loading states.\n *\n * @param options - Configuration including the payment function and callbacks.\n * @returns State and methods for managing the async payment.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useAsyncPayment } from \"@t402/vue\";\n *\n * const { execute, isLoading, isSuccess, error } = useAsyncPayment({\n * paymentFn: async () => {\n * const response = await fetch(\"/api/protected\", {\n * headers: { \"X-Payment\": paymentPayload },\n * });\n * return response.json();\n * },\n * onSuccess: (data) => console.log(\"Payment succeeded:\", data),\n * onError: (err) => console.error(\"Payment failed:\", err),\n * });\n * </script>\n *\n * <template>\n * <button @click=\"execute\" :disabled=\"isLoading\">\n * {{ isLoading ? \"Processing...\" : \"Pay Now\" }}\n * </button>\n * </template>\n * ```\n */\nexport function useAsyncPayment<T>(options: UseAsyncPaymentOptions<T>): UseAsyncPaymentReturn<T> {\n const { paymentFn, onSuccess, onError, onStart } = options;\n\n const status = ref<PaymentStatus>(\"idle\");\n const result = ref<T | null>(null) as Ref<T | null>;\n const error = ref<string | null>(null);\n\n const isLoading = computed(() => status.value === \"loading\");\n const isSuccess = computed(() => status.value === \"success\");\n const isError = computed(() => status.value === \"error\");\n\n const execute = async (): Promise<T | null> => {\n status.value = \"loading\";\n error.value = null;\n onStart?.();\n\n try {\n const paymentResult = await paymentFn();\n result.value = paymentResult;\n status.value = \"success\";\n onSuccess?.(paymentResult);\n return paymentResult;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Payment failed\";\n error.value = errorMessage;\n status.value = \"error\";\n onError?.(err instanceof Error ? err : new Error(errorMessage));\n return null;\n }\n };\n\n const reset = () => {\n status.value = \"idle\";\n result.value = null;\n error.value = null;\n };\n\n return {\n execute,\n status,\n result,\n error,\n isLoading,\n isSuccess,\n isError,\n reset,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/Spinner.ts","../../src/components/PaymentButton.ts","../../src/components/PaymentStatusDisplay.ts","../../src/utils/index.ts","../../src/components/PaymentDetails.ts","../../src/components/AddressDisplay.ts","../../src/composables/usePaymentRequired.ts","../../src/composables/usePaymentStatus.ts","../../src/composables/useAsyncPayment.ts"],"names":["defineComponent","h","ref","computed","baseStyles","containerStyles"],"mappings":"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","file":"index.cjs","sourcesContent":["import { defineComponent, h, type PropType } from 'vue'\n\nconst sizeConfig = {\n sm: { width: '16px', height: '16px', borderWidth: '2px' },\n md: { width: '24px', height: '24px', borderWidth: '3px' },\n lg: { width: '32px', height: '32px', borderWidth: '4px' },\n}\n\n/**\n * A simple loading spinner component.\n *\n * @example\n * ```vue\n * <template>\n * <Spinner size=\"md\" />\n * </template>\n * ```\n */\nexport const Spinner = defineComponent({\n name: 'T402Spinner',\n props: {\n size: {\n type: String as PropType<'sm' | 'md' | 'lg'>,\n default: 'md',\n },\n },\n setup(props) {\n return () => {\n const config = sizeConfig[props.size]\n return h('span', {\n role: 'status',\n 'aria-label': 'Loading',\n style: {\n width: config.width,\n height: config.height,\n borderWidth: config.borderWidth,\n borderStyle: 'solid',\n borderColor: '#e5e7eb',\n borderTopColor: '#3b82f6',\n borderRadius: '50%',\n animation: 't402-spin 0.8s linear infinite',\n display: 'inline-block',\n },\n })\n }\n },\n})\n\n// CSS keyframes for the spinner animation\nexport const spinnerStyles = `\n@keyframes t402-spin {\n to { transform: rotate(360deg); }\n}\n`\n","import { defineComponent, h, ref, type PropType, computed } from 'vue'\nimport { Spinner } from './Spinner.js'\n\nconst baseStyles = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n fontWeight: '600',\n borderRadius: '8px',\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n border: 'none',\n fontFamily: 'inherit',\n}\n\nconst variantStyles = {\n primary: {\n backgroundColor: '#2563eb',\n color: '#ffffff',\n },\n secondary: {\n backgroundColor: '#6b7280',\n color: '#ffffff',\n },\n outline: {\n backgroundColor: 'transparent',\n color: '#2563eb',\n border: '2px solid #2563eb',\n },\n}\n\nconst sizeStyles = {\n sm: {\n padding: '8px 16px',\n fontSize: '14px',\n },\n md: {\n padding: '12px 24px',\n fontSize: '16px',\n },\n lg: {\n padding: '16px 32px',\n fontSize: '18px',\n },\n}\n\n/**\n * A payment button component with loading state support.\n *\n * @example\n * ```vue\n * <template>\n * <PaymentButton\n * @click=\"handlePayment\"\n * :loading=\"isProcessing\"\n * variant=\"primary\"\n * size=\"lg\"\n * >\n * Pay $10.00\n * </PaymentButton>\n * </template>\n * ```\n */\nexport const PaymentButton = defineComponent({\n name: 'T402PaymentButton',\n props: {\n disabled: {\n type: Boolean,\n default: false,\n },\n loading: {\n type: Boolean,\n default: false,\n },\n variant: {\n type: String as PropType<'primary' | 'secondary' | 'outline'>,\n default: 'primary',\n },\n size: {\n type: String as PropType<'sm' | 'md' | 'lg'>,\n default: 'md',\n },\n },\n emits: ['click'],\n setup(props, { emit, slots }) {\n const isHovered = ref(false)\n\n const isDisabled = computed(() => props.disabled || props.loading)\n\n const buttonStyle = computed(() => ({\n ...baseStyles,\n ...variantStyles[props.variant],\n ...sizeStyles[props.size],\n ...(isDisabled.value ? { opacity: '0.6', cursor: 'not-allowed' } : {}),\n ...(isHovered.value && !isDisabled.value\n ? { filter: 'brightness(1.1)', transform: 'translateY(-1px)' }\n : {}),\n }))\n\n const handleClick = () => {\n if (!isDisabled.value) {\n emit('click')\n }\n }\n\n return () =>\n h(\n 'button',\n {\n type: 'button',\n disabled: isDisabled.value,\n style: buttonStyle.value,\n onClick: handleClick,\n onMouseenter: () => (isHovered.value = true),\n onMouseleave: () => (isHovered.value = false),\n },\n [\n props.loading ? h(Spinner, { size: 'sm' }) : null,\n slots.default ? slots.default() : 'Pay Now',\n ],\n )\n },\n})\n","import { defineComponent, h, type PropType, computed } from 'vue'\nimport { Spinner } from './Spinner.js'\nimport type { PaymentStatus } from '../types/index.js'\n\nconst statusStyles = {\n idle: {\n backgroundColor: '#f3f4f6',\n color: '#374151',\n borderColor: '#d1d5db',\n },\n loading: {\n backgroundColor: '#eff6ff',\n color: '#1d4ed8',\n borderColor: '#93c5fd',\n },\n success: {\n backgroundColor: '#f0fdf4',\n color: '#166534',\n borderColor: '#86efac',\n },\n error: {\n backgroundColor: '#fef2f2',\n color: '#dc2626',\n borderColor: '#fca5a5',\n },\n}\n\nconst baseStyles = {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '12px 16px',\n borderRadius: '8px',\n borderWidth: '1px',\n borderStyle: 'solid',\n fontSize: '14px',\n fontWeight: '500',\n}\n\nconst icons: Record<PaymentStatus, string> = {\n idle: '○',\n loading: '',\n success: '✓',\n error: '✕',\n}\n\nconst defaultMessages: Record<PaymentStatus, string> = {\n idle: 'Ready to pay',\n loading: 'Processing...',\n success: 'Payment successful',\n error: 'Payment failed',\n}\n\n/**\n * A component to display payment status with appropriate styling.\n *\n * @example\n * ```vue\n * <template>\n * <PaymentStatusDisplay\n * :status=\"status\"\n * message=\"Processing payment...\"\n * />\n * </template>\n * ```\n */\nexport const PaymentStatusDisplay = defineComponent({\n name: 'T402PaymentStatusDisplay',\n props: {\n status: {\n type: String as PropType<PaymentStatus>,\n required: true,\n },\n message: {\n type: String,\n default: undefined,\n },\n },\n setup(props) {\n const combinedStyle = computed(() => ({\n ...baseStyles,\n ...statusStyles[props.status],\n }))\n\n const displayMessage = computed(() => props.message || defaultMessages[props.status])\n\n return () =>\n h(\n 'div',\n {\n role: 'status',\n 'aria-live': 'polite',\n style: combinedStyle.value,\n },\n [\n props.status === 'loading'\n ? h(Spinner, { size: 'sm' })\n : h('span', { style: { fontSize: '16px' } }, icons[props.status]),\n h('span', displayMessage.value),\n ],\n )\n },\n})\n","import type { PaymentRequirements } from '@t402/core/types'\n\n// Chain configuration constants\n\n/** EVM Chain IDs (CAIP-2 format: eip155:chainId) */\nexport const EVM_CHAIN_IDS = {\n ETHEREUM_MAINNET: '1',\n BASE_MAINNET: '8453',\n BASE_SEPOLIA: '84532',\n ARBITRUM_MAINNET: '42161',\n ARBITRUM_SEPOLIA: '421614',\n} as const\n\n/** Solana Network References (CAIP-2 format: solana:genesisHash) */\nexport const SOLANA_NETWORK_REFS = {\n MAINNET: '5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n DEVNET: 'EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n} as const\n\n/** TON Network References (CAIP-2 format: ton:workchain) */\nexport const TON_NETWORK_REFS = {\n MAINNET: '-239',\n TESTNET: '-3',\n} as const\n\n/** TRON Network References */\nexport const TRON_NETWORK_REFS = {\n MAINNET: 'mainnet',\n NILE: 'nile',\n SHASTA: 'shasta',\n} as const\n\n/**\n * Normalizes payment requirements into an array.\n *\n * @param paymentRequirements - A single requirement or array of requirements.\n * @returns An array of payment requirements.\n */\nexport function normalizePaymentRequirements(\n paymentRequirements: PaymentRequirements | PaymentRequirements[],\n): PaymentRequirements[] {\n if (Array.isArray(paymentRequirements)) {\n return paymentRequirements\n }\n return [paymentRequirements]\n}\n\n/**\n * Returns preferred networks for payment selection.\n *\n * @param testnet - Whether to prefer testnet networks.\n * @returns Ordered list of preferred networks (CAIP-2 format).\n */\nexport function getPreferredNetworks(testnet: boolean): string[] {\n if (testnet) {\n return [\n `eip155:${EVM_CHAIN_IDS.BASE_SEPOLIA}`,\n `eip155:${EVM_CHAIN_IDS.ARBITRUM_SEPOLIA}`,\n `solana:${SOLANA_NETWORK_REFS.DEVNET}`,\n ]\n }\n return [\n `eip155:${EVM_CHAIN_IDS.BASE_MAINNET}`,\n `eip155:${EVM_CHAIN_IDS.ARBITRUM_MAINNET}`,\n `solana:${SOLANA_NETWORK_REFS.MAINNET}`,\n ]\n}\n\n/**\n * Selects the most appropriate payment requirement.\n *\n * @param paymentRequirements - Available payment requirements.\n * @param testnet - Whether to prefer testnet networks.\n * @returns The selected payment requirement.\n */\nexport function choosePaymentRequirement(\n paymentRequirements: PaymentRequirements | PaymentRequirements[],\n testnet: boolean,\n): PaymentRequirements {\n const normalized = normalizePaymentRequirements(paymentRequirements)\n const preferredNetworks = getPreferredNetworks(testnet)\n\n for (const preferredNetwork of preferredNetworks) {\n const match = normalized.find((req) => req.network === preferredNetwork)\n if (match) {\n return match\n }\n }\n\n return normalized[0]\n}\n\n/**\n * Determines if the network is EVM-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is EVM-based.\n */\nexport function isEvmNetwork(network: string): boolean {\n return network.startsWith('eip155:')\n}\n\n/**\n * Determines if the network is Solana-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is Solana-based.\n */\nexport function isSvmNetwork(network: string): boolean {\n return network.startsWith('solana:')\n}\n\n/**\n * Determines if the network is TON-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is TON-based.\n */\nexport function isTonNetwork(network: string): boolean {\n return network.startsWith('ton:')\n}\n\n/**\n * Determines if the network is TRON-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is TRON-based.\n */\nexport function isTronNetwork(network: string): boolean {\n return network.startsWith('tron:')\n}\n\n/** Known EVM chain names */\nconst EVM_CHAIN_NAMES: Record<string, string> = {\n '1': 'Ethereum',\n '10': 'Optimism',\n '137': 'Polygon',\n '8453': 'Base',\n '42161': 'Arbitrum One',\n '84532': 'Base Sepolia',\n '421614': 'Arbitrum Sepolia',\n '11155111': 'Sepolia',\n}\n\n/**\n * Gets a human-readable display name for a network.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns A display name suitable for UI use.\n */\nexport function getNetworkDisplayName(network: string): string {\n if (network.startsWith('eip155:')) {\n const chainId = network.split(':')[1]\n return EVM_CHAIN_NAMES[chainId] ?? `Chain ${chainId}`\n }\n\n if (network.startsWith('solana:')) {\n const ref = network.split(':')[1]\n return ref === SOLANA_NETWORK_REFS.DEVNET ? 'Solana Devnet' : 'Solana'\n }\n\n if (network.startsWith('ton:')) {\n const ref = network.split(':')[1]\n return ref === TON_NETWORK_REFS.TESTNET ? 'TON Testnet' : 'TON'\n }\n\n if (network.startsWith('tron:')) {\n const ref = network.split(':')[1]\n if (ref === TRON_NETWORK_REFS.NILE) return 'TRON Nile'\n if (ref === TRON_NETWORK_REFS.SHASTA) return 'TRON Shasta'\n return 'TRON'\n }\n\n return network\n}\n\n/** Known testnet chain IDs */\nconst TESTNET_CHAIN_IDS = new Set(['84532', '421614', '11155111', '80001', '97'])\n\n/**\n * Determines if the network is a testnet.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is a testnet.\n */\nexport function isTestnetNetwork(network: string): boolean {\n if (network.startsWith('eip155:')) {\n const chainId = network.split(':')[1]\n return TESTNET_CHAIN_IDS.has(chainId)\n }\n\n if (network.startsWith('solana:')) {\n const ref = network.split(':')[1]\n return ref === SOLANA_NETWORK_REFS.DEVNET\n }\n\n if (network.startsWith('ton:')) {\n const ref = network.split(':')[1]\n return ref === TON_NETWORK_REFS.TESTNET\n }\n\n if (network.startsWith('tron:')) {\n const ref = network.split(':')[1]\n return ref === TRON_NETWORK_REFS.NILE || ref === TRON_NETWORK_REFS.SHASTA\n }\n\n return false\n}\n\n/**\n * Truncates an address for display.\n *\n * @param address - The full address.\n * @param startChars - Number of characters to show at start (default: 6).\n * @param endChars - Number of characters to show at end (default: 4).\n * @returns The truncated address.\n */\nexport function truncateAddress(address: string, startChars = 6, endChars = 4): string {\n if (address.length <= startChars + endChars + 3) {\n return address\n }\n return `${address.slice(0, startChars)}...${address.slice(-endChars)}`\n}\n\n/**\n * Formats a token amount for display.\n *\n * @param amount - The amount as a string (in smallest unit).\n * @param decimals - The token decimals (default: 6 for USDT).\n * @param maxDecimals - Maximum decimal places to show (default: 2).\n * @returns The formatted amount.\n */\nexport function formatTokenAmount(amount: string, decimals = 6, maxDecimals = 2): string {\n const value = BigInt(amount)\n const divisor = BigInt(10 ** decimals)\n const integerPart = value / divisor\n const fractionalPart = value % divisor\n\n if (fractionalPart === 0n) {\n return integerPart.toString()\n }\n\n const fractionalStr = fractionalPart.toString().padStart(decimals, '0')\n const trimmed = fractionalStr.slice(0, maxDecimals).replace(/0+$/, '')\n\n if (trimmed === '') {\n return integerPart.toString()\n }\n\n return `${integerPart}.${trimmed}`\n}\n\n/**\n * Gets the asset display name.\n *\n * @param asset - The asset identifier (e.g., \"usdt\", \"usdt0\").\n * @returns A display name suitable for UI use.\n */\nexport function getAssetDisplayName(asset: string): string {\n const assetLower = asset.toLowerCase()\n\n switch (assetLower) {\n case 'usdt':\n return 'USDT'\n case 'usdt0':\n return 'USDT0'\n case 'usdc':\n return 'USDC'\n default:\n return asset.toUpperCase()\n }\n}\n","import { defineComponent, h, type PropType, computed } from 'vue'\nimport type { PaymentRequirements } from '@t402/core/types'\nimport {\n formatTokenAmount,\n getNetworkDisplayName,\n getAssetDisplayName,\n truncateAddress,\n} from '../utils/index.js'\n\nconst containerStyles = {\n backgroundColor: '#f9fafb',\n borderRadius: '12px',\n padding: '16px',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: '#e5e7eb',\n}\n\nconst rowStyles = {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '8px 0',\n borderBottomWidth: '1px',\n borderBottomStyle: 'solid',\n borderBottomColor: '#e5e7eb',\n}\n\nconst lastRowStyles = {\n ...rowStyles,\n borderBottomWidth: '0',\n}\n\nconst labelStyles = {\n color: '#6b7280',\n fontSize: '14px',\n}\n\nconst valueStyles = {\n color: '#111827',\n fontSize: '14px',\n fontWeight: '500',\n}\n\nconst amountStyles = {\n color: '#111827',\n fontSize: '20px',\n fontWeight: '700',\n}\n\n/**\n * A component to display payment requirement details.\n *\n * @example\n * ```vue\n * <template>\n * <PaymentDetails\n * :requirement=\"requirement\"\n * show-network\n * show-asset\n * show-recipient\n * />\n * </template>\n * ```\n */\nexport const PaymentDetails = defineComponent({\n name: 'T402PaymentDetails',\n props: {\n requirement: {\n type: Object as PropType<PaymentRequirements>,\n required: true,\n },\n showNetwork: {\n type: Boolean,\n default: true,\n },\n showAsset: {\n type: Boolean,\n default: true,\n },\n showRecipient: {\n type: Boolean,\n default: false,\n },\n },\n setup(props) {\n const formattedAmount = computed(() => formatTokenAmount(props.requirement.amount))\n const assetName = computed(() => getAssetDisplayName(props.requirement.asset))\n const networkName = computed(() => getNetworkDisplayName(props.requirement.network))\n const truncatedAddress = computed(() => truncateAddress(props.requirement.payTo))\n\n return () => {\n const rows = []\n\n // Amount row - always shown\n rows.push(\n h('div', { style: rowStyles }, [\n h('span', { style: labelStyles }, 'Amount'),\n h('span', { style: amountStyles }, `${formattedAmount.value} ${assetName.value}`),\n ]),\n )\n\n // Network row\n if (props.showNetwork) {\n rows.push(\n h('div', { style: rowStyles }, [\n h('span', { style: labelStyles }, 'Network'),\n h('span', { style: valueStyles }, networkName.value),\n ]),\n )\n }\n\n // Asset row\n if (props.showAsset) {\n rows.push(\n h('div', { style: rowStyles }, [\n h('span', { style: labelStyles }, 'Asset'),\n h('span', { style: valueStyles }, assetName.value),\n ]),\n )\n }\n\n // Recipient row\n if (props.showRecipient) {\n rows.push(\n h('div', { style: lastRowStyles }, [\n h('span', { style: labelStyles }, 'Recipient'),\n h(\n 'span',\n {\n style: { ...valueStyles, fontFamily: 'monospace' },\n title: props.requirement.payTo,\n },\n truncatedAddress.value,\n ),\n ]),\n )\n }\n\n return h('div', { style: containerStyles }, rows)\n }\n },\n})\n","import { defineComponent, h, ref, computed } from 'vue'\nimport { truncateAddress } from '../utils/index.js'\n\nconst containerStyles = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n fontFamily: 'monospace',\n fontSize: '14px',\n}\n\nconst addressStyles = {\n color: '#374151',\n}\n\nconst buttonStyles = {\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: '4px',\n borderRadius: '4px',\n color: '#6b7280',\n transition: 'all 0.15s ease',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n}\n\nconst copiedButtonStyles = {\n ...buttonStyles,\n color: '#22c55e',\n}\n\n/**\n * A component to display blockchain addresses with optional copy functionality.\n *\n * @example\n * ```vue\n * <template>\n * <AddressDisplay\n * address=\"0x1234567890abcdef1234567890abcdef12345678\"\n * copyable\n * :start-chars=\"6\"\n * :end-chars=\"4\"\n * />\n * </template>\n * ```\n */\nexport const AddressDisplay = defineComponent({\n name: 'T402AddressDisplay',\n props: {\n address: {\n type: String,\n required: true,\n },\n startChars: {\n type: Number,\n default: 6,\n },\n endChars: {\n type: Number,\n default: 4,\n },\n copyable: {\n type: Boolean,\n default: false,\n },\n },\n setup(props) {\n const copied = ref(false)\n\n const displayAddress = computed(() =>\n truncateAddress(props.address, props.startChars, props.endChars),\n )\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(props.address)\n copied.value = true\n setTimeout(() => (copied.value = false), 2000)\n } catch {\n // Fallback for older browsers\n const textArea = document.createElement('textarea')\n textArea.value = props.address\n document.body.appendChild(textArea)\n textArea.select()\n document.execCommand('copy')\n document.body.removeChild(textArea)\n copied.value = true\n setTimeout(() => (copied.value = false), 2000)\n }\n }\n\n // Copy icon SVG\n const copyIcon = () =>\n h(\n 'svg',\n {\n width: '16',\n height: '16',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': '2',\n },\n [\n h('rect', { x: '9', y: '9', width: '13', height: '13', rx: '2', ry: '2' }),\n h('path', { d: 'M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1' }),\n ],\n )\n\n // Checkmark icon SVG\n const checkIcon = () =>\n h(\n 'svg',\n {\n width: '16',\n height: '16',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': '2',\n },\n [h('polyline', { points: '20 6 9 17 4 12' })],\n )\n\n return () =>\n h('span', { style: containerStyles, title: props.address }, [\n h('span', { style: addressStyles }, displayAddress.value),\n props.copyable\n ? h(\n 'button',\n {\n type: 'button',\n onClick: handleCopy,\n style: copied.value ? copiedButtonStyles : buttonStyles,\n 'aria-label': copied.value ? 'Copied' : 'Copy address',\n },\n [copied.value ? checkIcon() : copyIcon()],\n )\n : null,\n ])\n },\n})\n","import { ref, type Ref } from 'vue'\nimport type { PaymentRequired } from '@t402/core/types'\nimport type { PaymentStatus } from '../types/index.js'\n\ninterface UsePaymentRequiredOptions {\n /** Callback when payment is successful */\n onSuccess?: (response: Response) => void\n /** Callback when payment fails */\n onError?: (error: Error) => void\n}\n\ninterface UsePaymentRequiredReturn {\n /** The payment required data from a 402 response */\n paymentRequired: Ref<PaymentRequired | null>\n /** Current status of the fetch operation */\n status: Ref<PaymentStatus>\n /** Error message if status is 'error' */\n error: Ref<string | null>\n /** Fetch a resource and capture 402 response */\n fetchResource: (url: string, options?: RequestInit) => Promise<Response | null>\n /** Reset the state */\n reset: () => void\n}\n\n/**\n * Composable to fetch a resource and capture 402 Payment Required responses.\n *\n * @param options - Configuration options.\n * @returns State and methods for handling 402 responses.\n *\n * @example\n * ```vue\n * <script setup>\n * import { usePaymentRequired } from \"@t402/vue\";\n *\n * const { paymentRequired, status, fetchResource } = usePaymentRequired({\n * onSuccess: (response) => console.log(\"Access granted!\"),\n * });\n *\n * const handleFetch = async () => {\n * const response = await fetchResource(\"/api/protected\");\n * if (response?.ok) {\n * const data = await response.json();\n * // Handle successful response\n * }\n * };\n * </script>\n * ```\n */\nexport function usePaymentRequired(\n options: UsePaymentRequiredOptions = {},\n): UsePaymentRequiredReturn {\n const { onSuccess, onError } = options\n\n const paymentRequired = ref<PaymentRequired | null>(null)\n const status = ref<PaymentStatus>('idle')\n const error = ref<string | null>(null)\n\n const fetchResource = async (\n url: string,\n fetchOptions?: RequestInit,\n ): Promise<Response | null> => {\n status.value = 'loading'\n error.value = null\n paymentRequired.value = null\n\n try {\n const response = await fetch(url, fetchOptions)\n\n if (response.status === 402) {\n const data = (await response.json()) as PaymentRequired\n paymentRequired.value = data\n status.value = 'idle'\n return null\n }\n\n if (response.ok) {\n status.value = 'success'\n onSuccess?.(response)\n return response\n }\n\n throw new Error(`Request failed with status ${response.status}`)\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error'\n error.value = errorMessage\n status.value = 'error'\n onError?.(err instanceof Error ? err : new Error(errorMessage))\n return null\n }\n }\n\n const reset = () => {\n paymentRequired.value = null\n status.value = 'idle'\n error.value = null\n }\n\n return {\n paymentRequired,\n status,\n error,\n fetchResource,\n reset,\n }\n}\n","import { ref, type Ref } from 'vue'\nimport type { PaymentStatus } from '../types/index.js'\n\ninterface StatusMessage {\n /** Message text */\n text: string\n /** Message type */\n type: 'info' | 'success' | 'error' | 'warning'\n /** Optional auto-dismiss timeout in ms */\n timeout?: number\n}\n\ninterface UsePaymentStatusReturn {\n /** Current payment status */\n status: Ref<PaymentStatus>\n /** Current status message */\n message: Ref<StatusMessage | null>\n /** Set the status */\n setStatus: (status: PaymentStatus, message?: string) => void\n /** Set a success message */\n setSuccess: (message: string, timeout?: number) => void\n /** Set an error message */\n setError: (message: string) => void\n /** Set an info message */\n setInfo: (message: string, timeout?: number) => void\n /** Set a warning message */\n setWarning: (message: string, timeout?: number) => void\n /** Clear the current message */\n clearMessage: () => void\n /** Reset to idle state */\n reset: () => void\n}\n\n/**\n * Composable for managing payment status and status messages.\n *\n * @returns State and methods for status management.\n *\n * @example\n * ```vue\n * <script setup>\n * import { usePaymentStatus } from \"@t402/vue\";\n *\n * const {\n * status,\n * message,\n * setStatus,\n * setSuccess,\n * setError,\n * } = usePaymentStatus();\n *\n * const handlePayment = async () => {\n * setStatus(\"loading\", \"Processing payment...\");\n * try {\n * await processPayment();\n * setSuccess(\"Payment successful!\", 3000);\n * } catch (err) {\n * setError(\"Payment failed. Please try again.\");\n * }\n * };\n * </script>\n * ```\n */\nexport function usePaymentStatus(): UsePaymentStatusReturn {\n const status = ref<PaymentStatus>('idle')\n const message = ref<StatusMessage | null>(null)\n\n const scheduleMessageClear = (timeout?: number) => {\n if (timeout && timeout > 0) {\n setTimeout(() => {\n message.value = null\n }, timeout)\n }\n }\n\n const setStatus = (newStatus: PaymentStatus, messageText?: string) => {\n status.value = newStatus\n if (messageText) {\n const type = newStatus === 'error' ? 'error' : newStatus === 'success' ? 'success' : 'info'\n message.value = { text: messageText, type }\n }\n }\n\n const setSuccess = (text: string, timeout?: number) => {\n status.value = 'success'\n message.value = { text, type: 'success', timeout }\n scheduleMessageClear(timeout)\n }\n\n const setError = (text: string) => {\n status.value = 'error'\n message.value = { text, type: 'error' }\n }\n\n const setInfo = (text: string, timeout?: number) => {\n message.value = { text, type: 'info', timeout }\n scheduleMessageClear(timeout)\n }\n\n const setWarning = (text: string, timeout?: number) => {\n message.value = { text, type: 'warning', timeout }\n scheduleMessageClear(timeout)\n }\n\n const clearMessage = () => {\n message.value = null\n }\n\n const reset = () => {\n status.value = 'idle'\n message.value = null\n }\n\n return {\n status,\n message,\n setStatus,\n setSuccess,\n setError,\n setInfo,\n setWarning,\n clearMessage,\n reset,\n }\n}\n","import { ref, computed, type Ref, type ComputedRef } from 'vue'\nimport type { PaymentStatus } from '../types/index.js'\n\ninterface UseAsyncPaymentOptions<T> {\n /** The async payment function to execute */\n paymentFn: () => Promise<T>\n /** Callback on successful payment */\n onSuccess?: (result: T) => void\n /** Callback on payment error */\n onError?: (error: Error) => void\n /** Callback when payment starts */\n onStart?: () => void\n}\n\ninterface UseAsyncPaymentReturn<T> {\n /** Execute the payment */\n execute: () => Promise<T | null>\n /** Current payment status */\n status: Ref<PaymentStatus>\n /** Result of successful payment */\n result: Ref<T | null>\n /** Error message if payment failed */\n error: Ref<string | null>\n /** Whether payment is in progress */\n isLoading: ComputedRef<boolean>\n /** Whether payment succeeded */\n isSuccess: ComputedRef<boolean>\n /** Whether payment failed */\n isError: ComputedRef<boolean>\n /** Reset the state */\n reset: () => void\n}\n\n/**\n * Composable for managing async payment operations with loading states.\n *\n * @param options - Configuration including the payment function and callbacks.\n * @returns State and methods for managing the async payment.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useAsyncPayment } from \"@t402/vue\";\n *\n * const { execute, isLoading, isSuccess, error } = useAsyncPayment({\n * paymentFn: async () => {\n * const response = await fetch(\"/api/protected\", {\n * headers: { \"X-Payment\": paymentPayload },\n * });\n * return response.json();\n * },\n * onSuccess: (data) => console.log(\"Payment succeeded:\", data),\n * onError: (err) => console.error(\"Payment failed:\", err),\n * });\n * </script>\n *\n * <template>\n * <button @click=\"execute\" :disabled=\"isLoading\">\n * {{ isLoading ? \"Processing...\" : \"Pay Now\" }}\n * </button>\n * </template>\n * ```\n */\nexport function useAsyncPayment<T>(options: UseAsyncPaymentOptions<T>): UseAsyncPaymentReturn<T> {\n const { paymentFn, onSuccess, onError, onStart } = options\n\n const status = ref<PaymentStatus>('idle')\n const result = ref<T | null>(null) as Ref<T | null>\n const error = ref<string | null>(null)\n\n const isLoading = computed(() => status.value === 'loading')\n const isSuccess = computed(() => status.value === 'success')\n const isError = computed(() => status.value === 'error')\n\n const execute = async (): Promise<T | null> => {\n status.value = 'loading'\n error.value = null\n onStart?.()\n\n try {\n const paymentResult = await paymentFn()\n result.value = paymentResult\n status.value = 'success'\n onSuccess?.(paymentResult)\n return paymentResult\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Payment failed'\n error.value = errorMessage\n status.value = 'error'\n onError?.(err instanceof Error ? err : new Error(errorMessage))\n return null\n }\n }\n\n const reset = () => {\n status.value = 'idle'\n result.value = null\n error.value = null\n }\n\n return {\n execute,\n status,\n result,\n error,\n isLoading,\n isSuccess,\n isError,\n reset,\n }\n}\n"]}
|
package/dist/cjs/index.d.cts
CHANGED
|
@@ -95,7 +95,7 @@ declare const PaymentButton: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
|
95
95
|
/**
|
|
96
96
|
* Payment status states
|
|
97
97
|
*/
|
|
98
|
-
type PaymentStatus =
|
|
98
|
+
type PaymentStatus = 'idle' | 'loading' | 'success' | 'error';
|
|
99
99
|
/**
|
|
100
100
|
* Payment state for composables
|
|
101
101
|
*/
|
|
@@ -120,9 +120,9 @@ interface PaymentButtonProps {
|
|
|
120
120
|
/** Whether the button is in loading state */
|
|
121
121
|
loading?: boolean;
|
|
122
122
|
/** Button variant */
|
|
123
|
-
variant?:
|
|
123
|
+
variant?: 'primary' | 'secondary' | 'outline';
|
|
124
124
|
/** Button size */
|
|
125
|
-
size?:
|
|
125
|
+
size?: 'sm' | 'md' | 'lg';
|
|
126
126
|
}
|
|
127
127
|
/**
|
|
128
128
|
* Props for PaymentStatusDisplay component
|
|
@@ -151,7 +151,7 @@ interface PaymentDetailsProps {
|
|
|
151
151
|
*/
|
|
152
152
|
interface SpinnerProps {
|
|
153
153
|
/** Spinner size */
|
|
154
|
-
size?:
|
|
154
|
+
size?: 'sm' | 'md' | 'lg';
|
|
155
155
|
}
|
|
156
156
|
/**
|
|
157
157
|
* Props for AddressDisplay component
|
|
@@ -367,7 +367,7 @@ interface StatusMessage {
|
|
|
367
367
|
/** Message text */
|
|
368
368
|
text: string;
|
|
369
369
|
/** Message type */
|
|
370
|
-
type:
|
|
370
|
+
type: 'info' | 'success' | 'error' | 'warning';
|
|
371
371
|
/** Optional auto-dismiss timeout in ms */
|
|
372
372
|
timeout?: number;
|
|
373
373
|
}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -95,7 +95,7 @@ declare const PaymentButton: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
|
95
95
|
/**
|
|
96
96
|
* Payment status states
|
|
97
97
|
*/
|
|
98
|
-
type PaymentStatus =
|
|
98
|
+
type PaymentStatus = 'idle' | 'loading' | 'success' | 'error';
|
|
99
99
|
/**
|
|
100
100
|
* Payment state for composables
|
|
101
101
|
*/
|
|
@@ -120,9 +120,9 @@ interface PaymentButtonProps {
|
|
|
120
120
|
/** Whether the button is in loading state */
|
|
121
121
|
loading?: boolean;
|
|
122
122
|
/** Button variant */
|
|
123
|
-
variant?:
|
|
123
|
+
variant?: 'primary' | 'secondary' | 'outline';
|
|
124
124
|
/** Button size */
|
|
125
|
-
size?:
|
|
125
|
+
size?: 'sm' | 'md' | 'lg';
|
|
126
126
|
}
|
|
127
127
|
/**
|
|
128
128
|
* Props for PaymentStatusDisplay component
|
|
@@ -151,7 +151,7 @@ interface PaymentDetailsProps {
|
|
|
151
151
|
*/
|
|
152
152
|
interface SpinnerProps {
|
|
153
153
|
/** Spinner size */
|
|
154
|
-
size?:
|
|
154
|
+
size?: 'sm' | 'md' | 'lg';
|
|
155
155
|
}
|
|
156
156
|
/**
|
|
157
157
|
* Props for AddressDisplay component
|
|
@@ -367,7 +367,7 @@ interface StatusMessage {
|
|
|
367
367
|
/** Message text */
|
|
368
368
|
text: string;
|
|
369
369
|
/** Message type */
|
|
370
|
-
type:
|
|
370
|
+
type: 'info' | 'success' | 'error' | 'warning';
|
|
371
371
|
/** Optional auto-dismiss timeout in ms */
|
|
372
372
|
timeout?: number;
|
|
373
373
|
}
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/Spinner.ts","../../src/components/PaymentButton.ts","../../src/components/PaymentStatusDisplay.ts","../../src/utils/index.ts","../../src/components/PaymentDetails.ts","../../src/components/AddressDisplay.ts","../../src/composables/usePaymentRequired.ts","../../src/composables/usePaymentStatus.ts","../../src/composables/useAsyncPayment.ts"],"names":["defineComponent","h","baseStyles","computed","ref","containerStyles"],"mappings":"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","file":"index.js","sourcesContent":["import { defineComponent, h, type PropType } from \"vue\";\n\nconst sizeConfig = {\n sm: { width: \"16px\", height: \"16px\", borderWidth: \"2px\" },\n md: { width: \"24px\", height: \"24px\", borderWidth: \"3px\" },\n lg: { width: \"32px\", height: \"32px\", borderWidth: \"4px\" },\n};\n\n/**\n * A simple loading spinner component.\n *\n * @example\n * ```vue\n * <template>\n * <Spinner size=\"md\" />\n * </template>\n * ```\n */\nexport const Spinner = defineComponent({\n name: \"T402Spinner\",\n props: {\n size: {\n type: String as PropType<\"sm\" | \"md\" | \"lg\">,\n default: \"md\",\n },\n },\n setup(props) {\n return () => {\n const config = sizeConfig[props.size];\n return h(\"span\", {\n role: \"status\",\n \"aria-label\": \"Loading\",\n style: {\n width: config.width,\n height: config.height,\n borderWidth: config.borderWidth,\n borderStyle: \"solid\",\n borderColor: \"#e5e7eb\",\n borderTopColor: \"#3b82f6\",\n borderRadius: \"50%\",\n animation: \"t402-spin 0.8s linear infinite\",\n display: \"inline-block\",\n },\n });\n };\n },\n});\n\n// CSS keyframes for the spinner animation\nexport const spinnerStyles = `\n@keyframes t402-spin {\n to { transform: rotate(360deg); }\n}\n`;\n","import { defineComponent, h, ref, type PropType, computed } from \"vue\";\nimport { Spinner } from \"./Spinner.js\";\n\nconst baseStyles = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"8px\",\n fontWeight: \"600\",\n borderRadius: \"8px\",\n cursor: \"pointer\",\n transition: \"all 0.15s ease\",\n border: \"none\",\n fontFamily: \"inherit\",\n};\n\nconst variantStyles = {\n primary: {\n backgroundColor: \"#2563eb\",\n color: \"#ffffff\",\n },\n secondary: {\n backgroundColor: \"#6b7280\",\n color: \"#ffffff\",\n },\n outline: {\n backgroundColor: \"transparent\",\n color: \"#2563eb\",\n border: \"2px solid #2563eb\",\n },\n};\n\nconst sizeStyles = {\n sm: {\n padding: \"8px 16px\",\n fontSize: \"14px\",\n },\n md: {\n padding: \"12px 24px\",\n fontSize: \"16px\",\n },\n lg: {\n padding: \"16px 32px\",\n fontSize: \"18px\",\n },\n};\n\n/**\n * A payment button component with loading state support.\n *\n * @example\n * ```vue\n * <template>\n * <PaymentButton\n * @click=\"handlePayment\"\n * :loading=\"isProcessing\"\n * variant=\"primary\"\n * size=\"lg\"\n * >\n * Pay $10.00\n * </PaymentButton>\n * </template>\n * ```\n */\nexport const PaymentButton = defineComponent({\n name: \"T402PaymentButton\",\n props: {\n disabled: {\n type: Boolean,\n default: false,\n },\n loading: {\n type: Boolean,\n default: false,\n },\n variant: {\n type: String as PropType<\"primary\" | \"secondary\" | \"outline\">,\n default: \"primary\",\n },\n size: {\n type: String as PropType<\"sm\" | \"md\" | \"lg\">,\n default: \"md\",\n },\n },\n emits: [\"click\"],\n setup(props, { emit, slots }) {\n const isHovered = ref(false);\n\n const isDisabled = computed(() => props.disabled || props.loading);\n\n const buttonStyle = computed(() => ({\n ...baseStyles,\n ...variantStyles[props.variant],\n ...sizeStyles[props.size],\n ...(isDisabled.value ? { opacity: \"0.6\", cursor: \"not-allowed\" } : {}),\n ...(isHovered.value && !isDisabled.value\n ? { filter: \"brightness(1.1)\", transform: \"translateY(-1px)\" }\n : {}),\n }));\n\n const handleClick = () => {\n if (!isDisabled.value) {\n emit(\"click\");\n }\n };\n\n return () =>\n h(\n \"button\",\n {\n type: \"button\",\n disabled: isDisabled.value,\n style: buttonStyle.value,\n onClick: handleClick,\n onMouseenter: () => (isHovered.value = true),\n onMouseleave: () => (isHovered.value = false),\n },\n [\n props.loading ? h(Spinner, { size: \"sm\" }) : null,\n slots.default ? slots.default() : \"Pay Now\",\n ],\n );\n },\n});\n","import { defineComponent, h, type PropType, computed } from \"vue\";\nimport { Spinner } from \"./Spinner.js\";\nimport type { PaymentStatus } from \"../types/index.js\";\n\nconst statusStyles = {\n idle: {\n backgroundColor: \"#f3f4f6\",\n color: \"#374151\",\n borderColor: \"#d1d5db\",\n },\n loading: {\n backgroundColor: \"#eff6ff\",\n color: \"#1d4ed8\",\n borderColor: \"#93c5fd\",\n },\n success: {\n backgroundColor: \"#f0fdf4\",\n color: \"#166534\",\n borderColor: \"#86efac\",\n },\n error: {\n backgroundColor: \"#fef2f2\",\n color: \"#dc2626\",\n borderColor: \"#fca5a5\",\n },\n};\n\nconst baseStyles = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"12px 16px\",\n borderRadius: \"8px\",\n borderWidth: \"1px\",\n borderStyle: \"solid\",\n fontSize: \"14px\",\n fontWeight: \"500\",\n};\n\nconst icons: Record<PaymentStatus, string> = {\n idle: \"○\",\n loading: \"\",\n success: \"✓\",\n error: \"✕\",\n};\n\nconst defaultMessages: Record<PaymentStatus, string> = {\n idle: \"Ready to pay\",\n loading: \"Processing...\",\n success: \"Payment successful\",\n error: \"Payment failed\",\n};\n\n/**\n * A component to display payment status with appropriate styling.\n *\n * @example\n * ```vue\n * <template>\n * <PaymentStatusDisplay\n * :status=\"status\"\n * message=\"Processing payment...\"\n * />\n * </template>\n * ```\n */\nexport const PaymentStatusDisplay = defineComponent({\n name: \"T402PaymentStatusDisplay\",\n props: {\n status: {\n type: String as PropType<PaymentStatus>,\n required: true,\n },\n message: {\n type: String,\n default: undefined,\n },\n },\n setup(props) {\n const combinedStyle = computed(() => ({\n ...baseStyles,\n ...statusStyles[props.status],\n }));\n\n const displayMessage = computed(() => props.message || defaultMessages[props.status]);\n\n return () =>\n h(\n \"div\",\n {\n role: \"status\",\n \"aria-live\": \"polite\",\n style: combinedStyle.value,\n },\n [\n props.status === \"loading\"\n ? h(Spinner, { size: \"sm\" })\n : h(\"span\", { style: { fontSize: \"16px\" } }, icons[props.status]),\n h(\"span\", displayMessage.value),\n ],\n );\n },\n});\n","import type { PaymentRequirements } from \"@t402/core/types\";\n\n// Chain configuration constants\n\n/** EVM Chain IDs (CAIP-2 format: eip155:chainId) */\nexport const EVM_CHAIN_IDS = {\n ETHEREUM_MAINNET: \"1\",\n BASE_MAINNET: \"8453\",\n BASE_SEPOLIA: \"84532\",\n ARBITRUM_MAINNET: \"42161\",\n ARBITRUM_SEPOLIA: \"421614\",\n} as const;\n\n/** Solana Network References (CAIP-2 format: solana:genesisHash) */\nexport const SOLANA_NETWORK_REFS = {\n MAINNET: \"5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\",\n DEVNET: \"EtWTRABZaYq6iMfeYKouRu166VU2xqa1\",\n} as const;\n\n/** TON Network References (CAIP-2 format: ton:workchain) */\nexport const TON_NETWORK_REFS = {\n MAINNET: \"-239\",\n TESTNET: \"-3\",\n} as const;\n\n/** TRON Network References */\nexport const TRON_NETWORK_REFS = {\n MAINNET: \"mainnet\",\n NILE: \"nile\",\n SHASTA: \"shasta\",\n} as const;\n\n/**\n * Normalizes payment requirements into an array.\n *\n * @param paymentRequirements - A single requirement or array of requirements.\n * @returns An array of payment requirements.\n */\nexport function normalizePaymentRequirements(\n paymentRequirements: PaymentRequirements | PaymentRequirements[],\n): PaymentRequirements[] {\n if (Array.isArray(paymentRequirements)) {\n return paymentRequirements;\n }\n return [paymentRequirements];\n}\n\n/**\n * Returns preferred networks for payment selection.\n *\n * @param testnet - Whether to prefer testnet networks.\n * @returns Ordered list of preferred networks (CAIP-2 format).\n */\nexport function getPreferredNetworks(testnet: boolean): string[] {\n if (testnet) {\n return [\n `eip155:${EVM_CHAIN_IDS.BASE_SEPOLIA}`,\n `eip155:${EVM_CHAIN_IDS.ARBITRUM_SEPOLIA}`,\n `solana:${SOLANA_NETWORK_REFS.DEVNET}`,\n ];\n }\n return [\n `eip155:${EVM_CHAIN_IDS.BASE_MAINNET}`,\n `eip155:${EVM_CHAIN_IDS.ARBITRUM_MAINNET}`,\n `solana:${SOLANA_NETWORK_REFS.MAINNET}`,\n ];\n}\n\n/**\n * Selects the most appropriate payment requirement.\n *\n * @param paymentRequirements - Available payment requirements.\n * @param testnet - Whether to prefer testnet networks.\n * @returns The selected payment requirement.\n */\nexport function choosePaymentRequirement(\n paymentRequirements: PaymentRequirements | PaymentRequirements[],\n testnet: boolean,\n): PaymentRequirements {\n const normalized = normalizePaymentRequirements(paymentRequirements);\n const preferredNetworks = getPreferredNetworks(testnet);\n\n for (const preferredNetwork of preferredNetworks) {\n const match = normalized.find(req => req.network === preferredNetwork);\n if (match) {\n return match;\n }\n }\n\n return normalized[0];\n}\n\n/**\n * Determines if the network is EVM-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is EVM-based.\n */\nexport function isEvmNetwork(network: string): boolean {\n return network.startsWith(\"eip155:\");\n}\n\n/**\n * Determines if the network is Solana-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is Solana-based.\n */\nexport function isSvmNetwork(network: string): boolean {\n return network.startsWith(\"solana:\");\n}\n\n/**\n * Determines if the network is TON-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is TON-based.\n */\nexport function isTonNetwork(network: string): boolean {\n return network.startsWith(\"ton:\");\n}\n\n/**\n * Determines if the network is TRON-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is TRON-based.\n */\nexport function isTronNetwork(network: string): boolean {\n return network.startsWith(\"tron:\");\n}\n\n/** Known EVM chain names */\nconst EVM_CHAIN_NAMES: Record<string, string> = {\n \"1\": \"Ethereum\",\n \"10\": \"Optimism\",\n \"137\": \"Polygon\",\n \"8453\": \"Base\",\n \"42161\": \"Arbitrum One\",\n \"84532\": \"Base Sepolia\",\n \"421614\": \"Arbitrum Sepolia\",\n \"11155111\": \"Sepolia\",\n};\n\n/**\n * Gets a human-readable display name for a network.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns A display name suitable for UI use.\n */\nexport function getNetworkDisplayName(network: string): string {\n if (network.startsWith(\"eip155:\")) {\n const chainId = network.split(\":\")[1];\n return EVM_CHAIN_NAMES[chainId] ?? `Chain ${chainId}`;\n }\n\n if (network.startsWith(\"solana:\")) {\n const ref = network.split(\":\")[1];\n return ref === SOLANA_NETWORK_REFS.DEVNET ? \"Solana Devnet\" : \"Solana\";\n }\n\n if (network.startsWith(\"ton:\")) {\n const ref = network.split(\":\")[1];\n return ref === TON_NETWORK_REFS.TESTNET ? \"TON Testnet\" : \"TON\";\n }\n\n if (network.startsWith(\"tron:\")) {\n const ref = network.split(\":\")[1];\n if (ref === TRON_NETWORK_REFS.NILE) return \"TRON Nile\";\n if (ref === TRON_NETWORK_REFS.SHASTA) return \"TRON Shasta\";\n return \"TRON\";\n }\n\n return network;\n}\n\n/** Known testnet chain IDs */\nconst TESTNET_CHAIN_IDS = new Set([\"84532\", \"421614\", \"11155111\", \"80001\", \"97\"]);\n\n/**\n * Determines if the network is a testnet.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is a testnet.\n */\nexport function isTestnetNetwork(network: string): boolean {\n if (network.startsWith(\"eip155:\")) {\n const chainId = network.split(\":\")[1];\n return TESTNET_CHAIN_IDS.has(chainId);\n }\n\n if (network.startsWith(\"solana:\")) {\n const ref = network.split(\":\")[1];\n return ref === SOLANA_NETWORK_REFS.DEVNET;\n }\n\n if (network.startsWith(\"ton:\")) {\n const ref = network.split(\":\")[1];\n return ref === TON_NETWORK_REFS.TESTNET;\n }\n\n if (network.startsWith(\"tron:\")) {\n const ref = network.split(\":\")[1];\n return ref === TRON_NETWORK_REFS.NILE || ref === TRON_NETWORK_REFS.SHASTA;\n }\n\n return false;\n}\n\n/**\n * Truncates an address for display.\n *\n * @param address - The full address.\n * @param startChars - Number of characters to show at start (default: 6).\n * @param endChars - Number of characters to show at end (default: 4).\n * @returns The truncated address.\n */\nexport function truncateAddress(address: string, startChars = 6, endChars = 4): string {\n if (address.length <= startChars + endChars + 3) {\n return address;\n }\n return `${address.slice(0, startChars)}...${address.slice(-endChars)}`;\n}\n\n/**\n * Formats a token amount for display.\n *\n * @param amount - The amount as a string (in smallest unit).\n * @param decimals - The token decimals (default: 6 for USDT).\n * @param maxDecimals - Maximum decimal places to show (default: 2).\n * @returns The formatted amount.\n */\nexport function formatTokenAmount(amount: string, decimals = 6, maxDecimals = 2): string {\n const value = BigInt(amount);\n const divisor = BigInt(10 ** decimals);\n const integerPart = value / divisor;\n const fractionalPart = value % divisor;\n\n if (fractionalPart === 0n) {\n return integerPart.toString();\n }\n\n const fractionalStr = fractionalPart.toString().padStart(decimals, \"0\");\n const trimmed = fractionalStr.slice(0, maxDecimals).replace(/0+$/, \"\");\n\n if (trimmed === \"\") {\n return integerPart.toString();\n }\n\n return `${integerPart}.${trimmed}`;\n}\n\n/**\n * Gets the asset display name.\n *\n * @param asset - The asset identifier (e.g., \"usdt\", \"usdt0\").\n * @returns A display name suitable for UI use.\n */\nexport function getAssetDisplayName(asset: string): string {\n const assetLower = asset.toLowerCase();\n\n switch (assetLower) {\n case \"usdt\":\n return \"USDT\";\n case \"usdt0\":\n return \"USDT0\";\n case \"usdc\":\n return \"USDC\";\n default:\n return asset.toUpperCase();\n }\n}\n","import { defineComponent, h, type PropType, computed } from \"vue\";\nimport type { PaymentRequirements } from \"@t402/core/types\";\nimport {\n formatTokenAmount,\n getNetworkDisplayName,\n getAssetDisplayName,\n truncateAddress,\n} from \"../utils/index.js\";\n\nconst containerStyles = {\n backgroundColor: \"#f9fafb\",\n borderRadius: \"12px\",\n padding: \"16px\",\n borderWidth: \"1px\",\n borderStyle: \"solid\",\n borderColor: \"#e5e7eb\",\n};\n\nconst rowStyles = {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n padding: \"8px 0\",\n borderBottomWidth: \"1px\",\n borderBottomStyle: \"solid\",\n borderBottomColor: \"#e5e7eb\",\n};\n\nconst lastRowStyles = {\n ...rowStyles,\n borderBottomWidth: \"0\",\n};\n\nconst labelStyles = {\n color: \"#6b7280\",\n fontSize: \"14px\",\n};\n\nconst valueStyles = {\n color: \"#111827\",\n fontSize: \"14px\",\n fontWeight: \"500\",\n};\n\nconst amountStyles = {\n color: \"#111827\",\n fontSize: \"20px\",\n fontWeight: \"700\",\n};\n\n/**\n * A component to display payment requirement details.\n *\n * @example\n * ```vue\n * <template>\n * <PaymentDetails\n * :requirement=\"requirement\"\n * show-network\n * show-asset\n * show-recipient\n * />\n * </template>\n * ```\n */\nexport const PaymentDetails = defineComponent({\n name: \"T402PaymentDetails\",\n props: {\n requirement: {\n type: Object as PropType<PaymentRequirements>,\n required: true,\n },\n showNetwork: {\n type: Boolean,\n default: true,\n },\n showAsset: {\n type: Boolean,\n default: true,\n },\n showRecipient: {\n type: Boolean,\n default: false,\n },\n },\n setup(props) {\n const formattedAmount = computed(() => formatTokenAmount(props.requirement.amount));\n const assetName = computed(() => getAssetDisplayName(props.requirement.asset));\n const networkName = computed(() => getNetworkDisplayName(props.requirement.network));\n const truncatedAddress = computed(() => truncateAddress(props.requirement.payTo));\n\n return () => {\n const rows = [];\n\n // Amount row - always shown\n rows.push(\n h(\"div\", { style: rowStyles }, [\n h(\"span\", { style: labelStyles }, \"Amount\"),\n h(\"span\", { style: amountStyles }, `${formattedAmount.value} ${assetName.value}`),\n ]),\n );\n\n // Network row\n if (props.showNetwork) {\n rows.push(\n h(\"div\", { style: rowStyles }, [\n h(\"span\", { style: labelStyles }, \"Network\"),\n h(\"span\", { style: valueStyles }, networkName.value),\n ]),\n );\n }\n\n // Asset row\n if (props.showAsset) {\n rows.push(\n h(\"div\", { style: rowStyles }, [\n h(\"span\", { style: labelStyles }, \"Asset\"),\n h(\"span\", { style: valueStyles }, assetName.value),\n ]),\n );\n }\n\n // Recipient row\n if (props.showRecipient) {\n rows.push(\n h(\"div\", { style: lastRowStyles }, [\n h(\"span\", { style: labelStyles }, \"Recipient\"),\n h(\n \"span\",\n {\n style: { ...valueStyles, fontFamily: \"monospace\" },\n title: props.requirement.payTo,\n },\n truncatedAddress.value,\n ),\n ]),\n );\n }\n\n return h(\"div\", { style: containerStyles }, rows);\n };\n },\n});\n","import { defineComponent, h, ref, computed } from \"vue\";\nimport { truncateAddress } from \"../utils/index.js\";\n\nconst containerStyles = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"8px\",\n fontFamily: \"monospace\",\n fontSize: \"14px\",\n};\n\nconst addressStyles = {\n color: \"#374151\",\n};\n\nconst buttonStyles = {\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: \"4px\",\n borderRadius: \"4px\",\n color: \"#6b7280\",\n transition: \"all 0.15s ease\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n};\n\nconst copiedButtonStyles = {\n ...buttonStyles,\n color: \"#22c55e\",\n};\n\n/**\n * A component to display blockchain addresses with optional copy functionality.\n *\n * @example\n * ```vue\n * <template>\n * <AddressDisplay\n * address=\"0x1234567890abcdef1234567890abcdef12345678\"\n * copyable\n * :start-chars=\"6\"\n * :end-chars=\"4\"\n * />\n * </template>\n * ```\n */\nexport const AddressDisplay = defineComponent({\n name: \"T402AddressDisplay\",\n props: {\n address: {\n type: String,\n required: true,\n },\n startChars: {\n type: Number,\n default: 6,\n },\n endChars: {\n type: Number,\n default: 4,\n },\n copyable: {\n type: Boolean,\n default: false,\n },\n },\n setup(props) {\n const copied = ref(false);\n\n const displayAddress = computed(() =>\n truncateAddress(props.address, props.startChars, props.endChars),\n );\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(props.address);\n copied.value = true;\n setTimeout(() => (copied.value = false), 2000);\n } catch {\n // Fallback for older browsers\n const textArea = document.createElement(\"textarea\");\n textArea.value = props.address;\n document.body.appendChild(textArea);\n textArea.select();\n document.execCommand(\"copy\");\n document.body.removeChild(textArea);\n copied.value = true;\n setTimeout(() => (copied.value = false), 2000);\n }\n };\n\n // Copy icon SVG\n const copyIcon = () =>\n h(\n \"svg\",\n {\n width: \"16\",\n height: \"16\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n \"stroke-width\": \"2\",\n },\n [\n h(\"rect\", { x: \"9\", y: \"9\", width: \"13\", height: \"13\", rx: \"2\", ry: \"2\" }),\n h(\"path\", { d: \"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" }),\n ],\n );\n\n // Checkmark icon SVG\n const checkIcon = () =>\n h(\n \"svg\",\n {\n width: \"16\",\n height: \"16\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n \"stroke-width\": \"2\",\n },\n [h(\"polyline\", { points: \"20 6 9 17 4 12\" })],\n );\n\n return () =>\n h(\"span\", { style: containerStyles, title: props.address }, [\n h(\"span\", { style: addressStyles }, displayAddress.value),\n props.copyable\n ? h(\n \"button\",\n {\n type: \"button\",\n onClick: handleCopy,\n style: copied.value ? copiedButtonStyles : buttonStyles,\n \"aria-label\": copied.value ? \"Copied\" : \"Copy address\",\n },\n [copied.value ? checkIcon() : copyIcon()],\n )\n : null,\n ]);\n },\n});\n","import { ref, type Ref } from \"vue\";\nimport type { PaymentRequired } from \"@t402/core/types\";\nimport type { PaymentStatus } from \"../types/index.js\";\n\ninterface UsePaymentRequiredOptions {\n /** Callback when payment is successful */\n onSuccess?: (response: Response) => void;\n /** Callback when payment fails */\n onError?: (error: Error) => void;\n}\n\ninterface UsePaymentRequiredReturn {\n /** The payment required data from a 402 response */\n paymentRequired: Ref<PaymentRequired | null>;\n /** Current status of the fetch operation */\n status: Ref<PaymentStatus>;\n /** Error message if status is 'error' */\n error: Ref<string | null>;\n /** Fetch a resource and capture 402 response */\n fetchResource: (url: string, options?: RequestInit) => Promise<Response | null>;\n /** Reset the state */\n reset: () => void;\n}\n\n/**\n * Composable to fetch a resource and capture 402 Payment Required responses.\n *\n * @param options - Configuration options.\n * @returns State and methods for handling 402 responses.\n *\n * @example\n * ```vue\n * <script setup>\n * import { usePaymentRequired } from \"@t402/vue\";\n *\n * const { paymentRequired, status, fetchResource } = usePaymentRequired({\n * onSuccess: (response) => console.log(\"Access granted!\"),\n * });\n *\n * const handleFetch = async () => {\n * const response = await fetchResource(\"/api/protected\");\n * if (response?.ok) {\n * const data = await response.json();\n * // Handle successful response\n * }\n * };\n * </script>\n * ```\n */\nexport function usePaymentRequired(options: UsePaymentRequiredOptions = {}): UsePaymentRequiredReturn {\n const { onSuccess, onError } = options;\n\n const paymentRequired = ref<PaymentRequired | null>(null);\n const status = ref<PaymentStatus>(\"idle\");\n const error = ref<string | null>(null);\n\n const fetchResource = async (url: string, fetchOptions?: RequestInit): Promise<Response | null> => {\n status.value = \"loading\";\n error.value = null;\n paymentRequired.value = null;\n\n try {\n const response = await fetch(url, fetchOptions);\n\n if (response.status === 402) {\n const data = (await response.json()) as PaymentRequired;\n paymentRequired.value = data;\n status.value = \"idle\";\n return null;\n }\n\n if (response.ok) {\n status.value = \"success\";\n onSuccess?.(response);\n return response;\n }\n\n throw new Error(`Request failed with status ${response.status}`);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Unknown error\";\n error.value = errorMessage;\n status.value = \"error\";\n onError?.(err instanceof Error ? err : new Error(errorMessage));\n return null;\n }\n };\n\n const reset = () => {\n paymentRequired.value = null;\n status.value = \"idle\";\n error.value = null;\n };\n\n return {\n paymentRequired,\n status,\n error,\n fetchResource,\n reset,\n };\n}\n","import { ref, type Ref } from \"vue\";\nimport type { PaymentStatus } from \"../types/index.js\";\n\ninterface StatusMessage {\n /** Message text */\n text: string;\n /** Message type */\n type: \"info\" | \"success\" | \"error\" | \"warning\";\n /** Optional auto-dismiss timeout in ms */\n timeout?: number;\n}\n\ninterface UsePaymentStatusReturn {\n /** Current payment status */\n status: Ref<PaymentStatus>;\n /** Current status message */\n message: Ref<StatusMessage | null>;\n /** Set the status */\n setStatus: (status: PaymentStatus, message?: string) => void;\n /** Set a success message */\n setSuccess: (message: string, timeout?: number) => void;\n /** Set an error message */\n setError: (message: string) => void;\n /** Set an info message */\n setInfo: (message: string, timeout?: number) => void;\n /** Set a warning message */\n setWarning: (message: string, timeout?: number) => void;\n /** Clear the current message */\n clearMessage: () => void;\n /** Reset to idle state */\n reset: () => void;\n}\n\n/**\n * Composable for managing payment status and status messages.\n *\n * @returns State and methods for status management.\n *\n * @example\n * ```vue\n * <script setup>\n * import { usePaymentStatus } from \"@t402/vue\";\n *\n * const {\n * status,\n * message,\n * setStatus,\n * setSuccess,\n * setError,\n * } = usePaymentStatus();\n *\n * const handlePayment = async () => {\n * setStatus(\"loading\", \"Processing payment...\");\n * try {\n * await processPayment();\n * setSuccess(\"Payment successful!\", 3000);\n * } catch (err) {\n * setError(\"Payment failed. Please try again.\");\n * }\n * };\n * </script>\n * ```\n */\nexport function usePaymentStatus(): UsePaymentStatusReturn {\n const status = ref<PaymentStatus>(\"idle\");\n const message = ref<StatusMessage | null>(null);\n\n const scheduleMessageClear = (timeout?: number) => {\n if (timeout && timeout > 0) {\n setTimeout(() => {\n message.value = null;\n }, timeout);\n }\n };\n\n const setStatus = (newStatus: PaymentStatus, messageText?: string) => {\n status.value = newStatus;\n if (messageText) {\n const type = newStatus === \"error\" ? \"error\" : newStatus === \"success\" ? \"success\" : \"info\";\n message.value = { text: messageText, type };\n }\n };\n\n const setSuccess = (text: string, timeout?: number) => {\n status.value = \"success\";\n message.value = { text, type: \"success\", timeout };\n scheduleMessageClear(timeout);\n };\n\n const setError = (text: string) => {\n status.value = \"error\";\n message.value = { text, type: \"error\" };\n };\n\n const setInfo = (text: string, timeout?: number) => {\n message.value = { text, type: \"info\", timeout };\n scheduleMessageClear(timeout);\n };\n\n const setWarning = (text: string, timeout?: number) => {\n message.value = { text, type: \"warning\", timeout };\n scheduleMessageClear(timeout);\n };\n\n const clearMessage = () => {\n message.value = null;\n };\n\n const reset = () => {\n status.value = \"idle\";\n message.value = null;\n };\n\n return {\n status,\n message,\n setStatus,\n setSuccess,\n setError,\n setInfo,\n setWarning,\n clearMessage,\n reset,\n };\n}\n","import { ref, computed, type Ref, type ComputedRef } from \"vue\";\nimport type { PaymentStatus } from \"../types/index.js\";\n\ninterface UseAsyncPaymentOptions<T> {\n /** The async payment function to execute */\n paymentFn: () => Promise<T>;\n /** Callback on successful payment */\n onSuccess?: (result: T) => void;\n /** Callback on payment error */\n onError?: (error: Error) => void;\n /** Callback when payment starts */\n onStart?: () => void;\n}\n\ninterface UseAsyncPaymentReturn<T> {\n /** Execute the payment */\n execute: () => Promise<T | null>;\n /** Current payment status */\n status: Ref<PaymentStatus>;\n /** Result of successful payment */\n result: Ref<T | null>;\n /** Error message if payment failed */\n error: Ref<string | null>;\n /** Whether payment is in progress */\n isLoading: ComputedRef<boolean>;\n /** Whether payment succeeded */\n isSuccess: ComputedRef<boolean>;\n /** Whether payment failed */\n isError: ComputedRef<boolean>;\n /** Reset the state */\n reset: () => void;\n}\n\n/**\n * Composable for managing async payment operations with loading states.\n *\n * @param options - Configuration including the payment function and callbacks.\n * @returns State and methods for managing the async payment.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useAsyncPayment } from \"@t402/vue\";\n *\n * const { execute, isLoading, isSuccess, error } = useAsyncPayment({\n * paymentFn: async () => {\n * const response = await fetch(\"/api/protected\", {\n * headers: { \"X-Payment\": paymentPayload },\n * });\n * return response.json();\n * },\n * onSuccess: (data) => console.log(\"Payment succeeded:\", data),\n * onError: (err) => console.error(\"Payment failed:\", err),\n * });\n * </script>\n *\n * <template>\n * <button @click=\"execute\" :disabled=\"isLoading\">\n * {{ isLoading ? \"Processing...\" : \"Pay Now\" }}\n * </button>\n * </template>\n * ```\n */\nexport function useAsyncPayment<T>(options: UseAsyncPaymentOptions<T>): UseAsyncPaymentReturn<T> {\n const { paymentFn, onSuccess, onError, onStart } = options;\n\n const status = ref<PaymentStatus>(\"idle\");\n const result = ref<T | null>(null) as Ref<T | null>;\n const error = ref<string | null>(null);\n\n const isLoading = computed(() => status.value === \"loading\");\n const isSuccess = computed(() => status.value === \"success\");\n const isError = computed(() => status.value === \"error\");\n\n const execute = async (): Promise<T | null> => {\n status.value = \"loading\";\n error.value = null;\n onStart?.();\n\n try {\n const paymentResult = await paymentFn();\n result.value = paymentResult;\n status.value = \"success\";\n onSuccess?.(paymentResult);\n return paymentResult;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Payment failed\";\n error.value = errorMessage;\n status.value = \"error\";\n onError?.(err instanceof Error ? err : new Error(errorMessage));\n return null;\n }\n };\n\n const reset = () => {\n status.value = \"idle\";\n result.value = null;\n error.value = null;\n };\n\n return {\n execute,\n status,\n result,\n error,\n isLoading,\n isSuccess,\n isError,\n reset,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/Spinner.ts","../../src/components/PaymentButton.ts","../../src/components/PaymentStatusDisplay.ts","../../src/utils/index.ts","../../src/components/PaymentDetails.ts","../../src/components/AddressDisplay.ts","../../src/composables/usePaymentRequired.ts","../../src/composables/usePaymentStatus.ts","../../src/composables/useAsyncPayment.ts"],"names":["defineComponent","h","baseStyles","computed","ref","containerStyles"],"mappings":"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","file":"index.js","sourcesContent":["import { defineComponent, h, type PropType } from 'vue'\n\nconst sizeConfig = {\n sm: { width: '16px', height: '16px', borderWidth: '2px' },\n md: { width: '24px', height: '24px', borderWidth: '3px' },\n lg: { width: '32px', height: '32px', borderWidth: '4px' },\n}\n\n/**\n * A simple loading spinner component.\n *\n * @example\n * ```vue\n * <template>\n * <Spinner size=\"md\" />\n * </template>\n * ```\n */\nexport const Spinner = defineComponent({\n name: 'T402Spinner',\n props: {\n size: {\n type: String as PropType<'sm' | 'md' | 'lg'>,\n default: 'md',\n },\n },\n setup(props) {\n return () => {\n const config = sizeConfig[props.size]\n return h('span', {\n role: 'status',\n 'aria-label': 'Loading',\n style: {\n width: config.width,\n height: config.height,\n borderWidth: config.borderWidth,\n borderStyle: 'solid',\n borderColor: '#e5e7eb',\n borderTopColor: '#3b82f6',\n borderRadius: '50%',\n animation: 't402-spin 0.8s linear infinite',\n display: 'inline-block',\n },\n })\n }\n },\n})\n\n// CSS keyframes for the spinner animation\nexport const spinnerStyles = `\n@keyframes t402-spin {\n to { transform: rotate(360deg); }\n}\n`\n","import { defineComponent, h, ref, type PropType, computed } from 'vue'\nimport { Spinner } from './Spinner.js'\n\nconst baseStyles = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n fontWeight: '600',\n borderRadius: '8px',\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n border: 'none',\n fontFamily: 'inherit',\n}\n\nconst variantStyles = {\n primary: {\n backgroundColor: '#2563eb',\n color: '#ffffff',\n },\n secondary: {\n backgroundColor: '#6b7280',\n color: '#ffffff',\n },\n outline: {\n backgroundColor: 'transparent',\n color: '#2563eb',\n border: '2px solid #2563eb',\n },\n}\n\nconst sizeStyles = {\n sm: {\n padding: '8px 16px',\n fontSize: '14px',\n },\n md: {\n padding: '12px 24px',\n fontSize: '16px',\n },\n lg: {\n padding: '16px 32px',\n fontSize: '18px',\n },\n}\n\n/**\n * A payment button component with loading state support.\n *\n * @example\n * ```vue\n * <template>\n * <PaymentButton\n * @click=\"handlePayment\"\n * :loading=\"isProcessing\"\n * variant=\"primary\"\n * size=\"lg\"\n * >\n * Pay $10.00\n * </PaymentButton>\n * </template>\n * ```\n */\nexport const PaymentButton = defineComponent({\n name: 'T402PaymentButton',\n props: {\n disabled: {\n type: Boolean,\n default: false,\n },\n loading: {\n type: Boolean,\n default: false,\n },\n variant: {\n type: String as PropType<'primary' | 'secondary' | 'outline'>,\n default: 'primary',\n },\n size: {\n type: String as PropType<'sm' | 'md' | 'lg'>,\n default: 'md',\n },\n },\n emits: ['click'],\n setup(props, { emit, slots }) {\n const isHovered = ref(false)\n\n const isDisabled = computed(() => props.disabled || props.loading)\n\n const buttonStyle = computed(() => ({\n ...baseStyles,\n ...variantStyles[props.variant],\n ...sizeStyles[props.size],\n ...(isDisabled.value ? { opacity: '0.6', cursor: 'not-allowed' } : {}),\n ...(isHovered.value && !isDisabled.value\n ? { filter: 'brightness(1.1)', transform: 'translateY(-1px)' }\n : {}),\n }))\n\n const handleClick = () => {\n if (!isDisabled.value) {\n emit('click')\n }\n }\n\n return () =>\n h(\n 'button',\n {\n type: 'button',\n disabled: isDisabled.value,\n style: buttonStyle.value,\n onClick: handleClick,\n onMouseenter: () => (isHovered.value = true),\n onMouseleave: () => (isHovered.value = false),\n },\n [\n props.loading ? h(Spinner, { size: 'sm' }) : null,\n slots.default ? slots.default() : 'Pay Now',\n ],\n )\n },\n})\n","import { defineComponent, h, type PropType, computed } from 'vue'\nimport { Spinner } from './Spinner.js'\nimport type { PaymentStatus } from '../types/index.js'\n\nconst statusStyles = {\n idle: {\n backgroundColor: '#f3f4f6',\n color: '#374151',\n borderColor: '#d1d5db',\n },\n loading: {\n backgroundColor: '#eff6ff',\n color: '#1d4ed8',\n borderColor: '#93c5fd',\n },\n success: {\n backgroundColor: '#f0fdf4',\n color: '#166534',\n borderColor: '#86efac',\n },\n error: {\n backgroundColor: '#fef2f2',\n color: '#dc2626',\n borderColor: '#fca5a5',\n },\n}\n\nconst baseStyles = {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '12px 16px',\n borderRadius: '8px',\n borderWidth: '1px',\n borderStyle: 'solid',\n fontSize: '14px',\n fontWeight: '500',\n}\n\nconst icons: Record<PaymentStatus, string> = {\n idle: '○',\n loading: '',\n success: '✓',\n error: '✕',\n}\n\nconst defaultMessages: Record<PaymentStatus, string> = {\n idle: 'Ready to pay',\n loading: 'Processing...',\n success: 'Payment successful',\n error: 'Payment failed',\n}\n\n/**\n * A component to display payment status with appropriate styling.\n *\n * @example\n * ```vue\n * <template>\n * <PaymentStatusDisplay\n * :status=\"status\"\n * message=\"Processing payment...\"\n * />\n * </template>\n * ```\n */\nexport const PaymentStatusDisplay = defineComponent({\n name: 'T402PaymentStatusDisplay',\n props: {\n status: {\n type: String as PropType<PaymentStatus>,\n required: true,\n },\n message: {\n type: String,\n default: undefined,\n },\n },\n setup(props) {\n const combinedStyle = computed(() => ({\n ...baseStyles,\n ...statusStyles[props.status],\n }))\n\n const displayMessage = computed(() => props.message || defaultMessages[props.status])\n\n return () =>\n h(\n 'div',\n {\n role: 'status',\n 'aria-live': 'polite',\n style: combinedStyle.value,\n },\n [\n props.status === 'loading'\n ? h(Spinner, { size: 'sm' })\n : h('span', { style: { fontSize: '16px' } }, icons[props.status]),\n h('span', displayMessage.value),\n ],\n )\n },\n})\n","import type { PaymentRequirements } from '@t402/core/types'\n\n// Chain configuration constants\n\n/** EVM Chain IDs (CAIP-2 format: eip155:chainId) */\nexport const EVM_CHAIN_IDS = {\n ETHEREUM_MAINNET: '1',\n BASE_MAINNET: '8453',\n BASE_SEPOLIA: '84532',\n ARBITRUM_MAINNET: '42161',\n ARBITRUM_SEPOLIA: '421614',\n} as const\n\n/** Solana Network References (CAIP-2 format: solana:genesisHash) */\nexport const SOLANA_NETWORK_REFS = {\n MAINNET: '5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n DEVNET: 'EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n} as const\n\n/** TON Network References (CAIP-2 format: ton:workchain) */\nexport const TON_NETWORK_REFS = {\n MAINNET: '-239',\n TESTNET: '-3',\n} as const\n\n/** TRON Network References */\nexport const TRON_NETWORK_REFS = {\n MAINNET: 'mainnet',\n NILE: 'nile',\n SHASTA: 'shasta',\n} as const\n\n/**\n * Normalizes payment requirements into an array.\n *\n * @param paymentRequirements - A single requirement or array of requirements.\n * @returns An array of payment requirements.\n */\nexport function normalizePaymentRequirements(\n paymentRequirements: PaymentRequirements | PaymentRequirements[],\n): PaymentRequirements[] {\n if (Array.isArray(paymentRequirements)) {\n return paymentRequirements\n }\n return [paymentRequirements]\n}\n\n/**\n * Returns preferred networks for payment selection.\n *\n * @param testnet - Whether to prefer testnet networks.\n * @returns Ordered list of preferred networks (CAIP-2 format).\n */\nexport function getPreferredNetworks(testnet: boolean): string[] {\n if (testnet) {\n return [\n `eip155:${EVM_CHAIN_IDS.BASE_SEPOLIA}`,\n `eip155:${EVM_CHAIN_IDS.ARBITRUM_SEPOLIA}`,\n `solana:${SOLANA_NETWORK_REFS.DEVNET}`,\n ]\n }\n return [\n `eip155:${EVM_CHAIN_IDS.BASE_MAINNET}`,\n `eip155:${EVM_CHAIN_IDS.ARBITRUM_MAINNET}`,\n `solana:${SOLANA_NETWORK_REFS.MAINNET}`,\n ]\n}\n\n/**\n * Selects the most appropriate payment requirement.\n *\n * @param paymentRequirements - Available payment requirements.\n * @param testnet - Whether to prefer testnet networks.\n * @returns The selected payment requirement.\n */\nexport function choosePaymentRequirement(\n paymentRequirements: PaymentRequirements | PaymentRequirements[],\n testnet: boolean,\n): PaymentRequirements {\n const normalized = normalizePaymentRequirements(paymentRequirements)\n const preferredNetworks = getPreferredNetworks(testnet)\n\n for (const preferredNetwork of preferredNetworks) {\n const match = normalized.find((req) => req.network === preferredNetwork)\n if (match) {\n return match\n }\n }\n\n return normalized[0]\n}\n\n/**\n * Determines if the network is EVM-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is EVM-based.\n */\nexport function isEvmNetwork(network: string): boolean {\n return network.startsWith('eip155:')\n}\n\n/**\n * Determines if the network is Solana-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is Solana-based.\n */\nexport function isSvmNetwork(network: string): boolean {\n return network.startsWith('solana:')\n}\n\n/**\n * Determines if the network is TON-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is TON-based.\n */\nexport function isTonNetwork(network: string): boolean {\n return network.startsWith('ton:')\n}\n\n/**\n * Determines if the network is TRON-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is TRON-based.\n */\nexport function isTronNetwork(network: string): boolean {\n return network.startsWith('tron:')\n}\n\n/** Known EVM chain names */\nconst EVM_CHAIN_NAMES: Record<string, string> = {\n '1': 'Ethereum',\n '10': 'Optimism',\n '137': 'Polygon',\n '8453': 'Base',\n '42161': 'Arbitrum One',\n '84532': 'Base Sepolia',\n '421614': 'Arbitrum Sepolia',\n '11155111': 'Sepolia',\n}\n\n/**\n * Gets a human-readable display name for a network.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns A display name suitable for UI use.\n */\nexport function getNetworkDisplayName(network: string): string {\n if (network.startsWith('eip155:')) {\n const chainId = network.split(':')[1]\n return EVM_CHAIN_NAMES[chainId] ?? `Chain ${chainId}`\n }\n\n if (network.startsWith('solana:')) {\n const ref = network.split(':')[1]\n return ref === SOLANA_NETWORK_REFS.DEVNET ? 'Solana Devnet' : 'Solana'\n }\n\n if (network.startsWith('ton:')) {\n const ref = network.split(':')[1]\n return ref === TON_NETWORK_REFS.TESTNET ? 'TON Testnet' : 'TON'\n }\n\n if (network.startsWith('tron:')) {\n const ref = network.split(':')[1]\n if (ref === TRON_NETWORK_REFS.NILE) return 'TRON Nile'\n if (ref === TRON_NETWORK_REFS.SHASTA) return 'TRON Shasta'\n return 'TRON'\n }\n\n return network\n}\n\n/** Known testnet chain IDs */\nconst TESTNET_CHAIN_IDS = new Set(['84532', '421614', '11155111', '80001', '97'])\n\n/**\n * Determines if the network is a testnet.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is a testnet.\n */\nexport function isTestnetNetwork(network: string): boolean {\n if (network.startsWith('eip155:')) {\n const chainId = network.split(':')[1]\n return TESTNET_CHAIN_IDS.has(chainId)\n }\n\n if (network.startsWith('solana:')) {\n const ref = network.split(':')[1]\n return ref === SOLANA_NETWORK_REFS.DEVNET\n }\n\n if (network.startsWith('ton:')) {\n const ref = network.split(':')[1]\n return ref === TON_NETWORK_REFS.TESTNET\n }\n\n if (network.startsWith('tron:')) {\n const ref = network.split(':')[1]\n return ref === TRON_NETWORK_REFS.NILE || ref === TRON_NETWORK_REFS.SHASTA\n }\n\n return false\n}\n\n/**\n * Truncates an address for display.\n *\n * @param address - The full address.\n * @param startChars - Number of characters to show at start (default: 6).\n * @param endChars - Number of characters to show at end (default: 4).\n * @returns The truncated address.\n */\nexport function truncateAddress(address: string, startChars = 6, endChars = 4): string {\n if (address.length <= startChars + endChars + 3) {\n return address\n }\n return `${address.slice(0, startChars)}...${address.slice(-endChars)}`\n}\n\n/**\n * Formats a token amount for display.\n *\n * @param amount - The amount as a string (in smallest unit).\n * @param decimals - The token decimals (default: 6 for USDT).\n * @param maxDecimals - Maximum decimal places to show (default: 2).\n * @returns The formatted amount.\n */\nexport function formatTokenAmount(amount: string, decimals = 6, maxDecimals = 2): string {\n const value = BigInt(amount)\n const divisor = BigInt(10 ** decimals)\n const integerPart = value / divisor\n const fractionalPart = value % divisor\n\n if (fractionalPart === 0n) {\n return integerPart.toString()\n }\n\n const fractionalStr = fractionalPart.toString().padStart(decimals, '0')\n const trimmed = fractionalStr.slice(0, maxDecimals).replace(/0+$/, '')\n\n if (trimmed === '') {\n return integerPart.toString()\n }\n\n return `${integerPart}.${trimmed}`\n}\n\n/**\n * Gets the asset display name.\n *\n * @param asset - The asset identifier (e.g., \"usdt\", \"usdt0\").\n * @returns A display name suitable for UI use.\n */\nexport function getAssetDisplayName(asset: string): string {\n const assetLower = asset.toLowerCase()\n\n switch (assetLower) {\n case 'usdt':\n return 'USDT'\n case 'usdt0':\n return 'USDT0'\n case 'usdc':\n return 'USDC'\n default:\n return asset.toUpperCase()\n }\n}\n","import { defineComponent, h, type PropType, computed } from 'vue'\nimport type { PaymentRequirements } from '@t402/core/types'\nimport {\n formatTokenAmount,\n getNetworkDisplayName,\n getAssetDisplayName,\n truncateAddress,\n} from '../utils/index.js'\n\nconst containerStyles = {\n backgroundColor: '#f9fafb',\n borderRadius: '12px',\n padding: '16px',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: '#e5e7eb',\n}\n\nconst rowStyles = {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '8px 0',\n borderBottomWidth: '1px',\n borderBottomStyle: 'solid',\n borderBottomColor: '#e5e7eb',\n}\n\nconst lastRowStyles = {\n ...rowStyles,\n borderBottomWidth: '0',\n}\n\nconst labelStyles = {\n color: '#6b7280',\n fontSize: '14px',\n}\n\nconst valueStyles = {\n color: '#111827',\n fontSize: '14px',\n fontWeight: '500',\n}\n\nconst amountStyles = {\n color: '#111827',\n fontSize: '20px',\n fontWeight: '700',\n}\n\n/**\n * A component to display payment requirement details.\n *\n * @example\n * ```vue\n * <template>\n * <PaymentDetails\n * :requirement=\"requirement\"\n * show-network\n * show-asset\n * show-recipient\n * />\n * </template>\n * ```\n */\nexport const PaymentDetails = defineComponent({\n name: 'T402PaymentDetails',\n props: {\n requirement: {\n type: Object as PropType<PaymentRequirements>,\n required: true,\n },\n showNetwork: {\n type: Boolean,\n default: true,\n },\n showAsset: {\n type: Boolean,\n default: true,\n },\n showRecipient: {\n type: Boolean,\n default: false,\n },\n },\n setup(props) {\n const formattedAmount = computed(() => formatTokenAmount(props.requirement.amount))\n const assetName = computed(() => getAssetDisplayName(props.requirement.asset))\n const networkName = computed(() => getNetworkDisplayName(props.requirement.network))\n const truncatedAddress = computed(() => truncateAddress(props.requirement.payTo))\n\n return () => {\n const rows = []\n\n // Amount row - always shown\n rows.push(\n h('div', { style: rowStyles }, [\n h('span', { style: labelStyles }, 'Amount'),\n h('span', { style: amountStyles }, `${formattedAmount.value} ${assetName.value}`),\n ]),\n )\n\n // Network row\n if (props.showNetwork) {\n rows.push(\n h('div', { style: rowStyles }, [\n h('span', { style: labelStyles }, 'Network'),\n h('span', { style: valueStyles }, networkName.value),\n ]),\n )\n }\n\n // Asset row\n if (props.showAsset) {\n rows.push(\n h('div', { style: rowStyles }, [\n h('span', { style: labelStyles }, 'Asset'),\n h('span', { style: valueStyles }, assetName.value),\n ]),\n )\n }\n\n // Recipient row\n if (props.showRecipient) {\n rows.push(\n h('div', { style: lastRowStyles }, [\n h('span', { style: labelStyles }, 'Recipient'),\n h(\n 'span',\n {\n style: { ...valueStyles, fontFamily: 'monospace' },\n title: props.requirement.payTo,\n },\n truncatedAddress.value,\n ),\n ]),\n )\n }\n\n return h('div', { style: containerStyles }, rows)\n }\n },\n})\n","import { defineComponent, h, ref, computed } from 'vue'\nimport { truncateAddress } from '../utils/index.js'\n\nconst containerStyles = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n fontFamily: 'monospace',\n fontSize: '14px',\n}\n\nconst addressStyles = {\n color: '#374151',\n}\n\nconst buttonStyles = {\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: '4px',\n borderRadius: '4px',\n color: '#6b7280',\n transition: 'all 0.15s ease',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n}\n\nconst copiedButtonStyles = {\n ...buttonStyles,\n color: '#22c55e',\n}\n\n/**\n * A component to display blockchain addresses with optional copy functionality.\n *\n * @example\n * ```vue\n * <template>\n * <AddressDisplay\n * address=\"0x1234567890abcdef1234567890abcdef12345678\"\n * copyable\n * :start-chars=\"6\"\n * :end-chars=\"4\"\n * />\n * </template>\n * ```\n */\nexport const AddressDisplay = defineComponent({\n name: 'T402AddressDisplay',\n props: {\n address: {\n type: String,\n required: true,\n },\n startChars: {\n type: Number,\n default: 6,\n },\n endChars: {\n type: Number,\n default: 4,\n },\n copyable: {\n type: Boolean,\n default: false,\n },\n },\n setup(props) {\n const copied = ref(false)\n\n const displayAddress = computed(() =>\n truncateAddress(props.address, props.startChars, props.endChars),\n )\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(props.address)\n copied.value = true\n setTimeout(() => (copied.value = false), 2000)\n } catch {\n // Fallback for older browsers\n const textArea = document.createElement('textarea')\n textArea.value = props.address\n document.body.appendChild(textArea)\n textArea.select()\n document.execCommand('copy')\n document.body.removeChild(textArea)\n copied.value = true\n setTimeout(() => (copied.value = false), 2000)\n }\n }\n\n // Copy icon SVG\n const copyIcon = () =>\n h(\n 'svg',\n {\n width: '16',\n height: '16',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': '2',\n },\n [\n h('rect', { x: '9', y: '9', width: '13', height: '13', rx: '2', ry: '2' }),\n h('path', { d: 'M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1' }),\n ],\n )\n\n // Checkmark icon SVG\n const checkIcon = () =>\n h(\n 'svg',\n {\n width: '16',\n height: '16',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': '2',\n },\n [h('polyline', { points: '20 6 9 17 4 12' })],\n )\n\n return () =>\n h('span', { style: containerStyles, title: props.address }, [\n h('span', { style: addressStyles }, displayAddress.value),\n props.copyable\n ? h(\n 'button',\n {\n type: 'button',\n onClick: handleCopy,\n style: copied.value ? copiedButtonStyles : buttonStyles,\n 'aria-label': copied.value ? 'Copied' : 'Copy address',\n },\n [copied.value ? checkIcon() : copyIcon()],\n )\n : null,\n ])\n },\n})\n","import { ref, type Ref } from 'vue'\nimport type { PaymentRequired } from '@t402/core/types'\nimport type { PaymentStatus } from '../types/index.js'\n\ninterface UsePaymentRequiredOptions {\n /** Callback when payment is successful */\n onSuccess?: (response: Response) => void\n /** Callback when payment fails */\n onError?: (error: Error) => void\n}\n\ninterface UsePaymentRequiredReturn {\n /** The payment required data from a 402 response */\n paymentRequired: Ref<PaymentRequired | null>\n /** Current status of the fetch operation */\n status: Ref<PaymentStatus>\n /** Error message if status is 'error' */\n error: Ref<string | null>\n /** Fetch a resource and capture 402 response */\n fetchResource: (url: string, options?: RequestInit) => Promise<Response | null>\n /** Reset the state */\n reset: () => void\n}\n\n/**\n * Composable to fetch a resource and capture 402 Payment Required responses.\n *\n * @param options - Configuration options.\n * @returns State and methods for handling 402 responses.\n *\n * @example\n * ```vue\n * <script setup>\n * import { usePaymentRequired } from \"@t402/vue\";\n *\n * const { paymentRequired, status, fetchResource } = usePaymentRequired({\n * onSuccess: (response) => console.log(\"Access granted!\"),\n * });\n *\n * const handleFetch = async () => {\n * const response = await fetchResource(\"/api/protected\");\n * if (response?.ok) {\n * const data = await response.json();\n * // Handle successful response\n * }\n * };\n * </script>\n * ```\n */\nexport function usePaymentRequired(\n options: UsePaymentRequiredOptions = {},\n): UsePaymentRequiredReturn {\n const { onSuccess, onError } = options\n\n const paymentRequired = ref<PaymentRequired | null>(null)\n const status = ref<PaymentStatus>('idle')\n const error = ref<string | null>(null)\n\n const fetchResource = async (\n url: string,\n fetchOptions?: RequestInit,\n ): Promise<Response | null> => {\n status.value = 'loading'\n error.value = null\n paymentRequired.value = null\n\n try {\n const response = await fetch(url, fetchOptions)\n\n if (response.status === 402) {\n const data = (await response.json()) as PaymentRequired\n paymentRequired.value = data\n status.value = 'idle'\n return null\n }\n\n if (response.ok) {\n status.value = 'success'\n onSuccess?.(response)\n return response\n }\n\n throw new Error(`Request failed with status ${response.status}`)\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error'\n error.value = errorMessage\n status.value = 'error'\n onError?.(err instanceof Error ? err : new Error(errorMessage))\n return null\n }\n }\n\n const reset = () => {\n paymentRequired.value = null\n status.value = 'idle'\n error.value = null\n }\n\n return {\n paymentRequired,\n status,\n error,\n fetchResource,\n reset,\n }\n}\n","import { ref, type Ref } from 'vue'\nimport type { PaymentStatus } from '../types/index.js'\n\ninterface StatusMessage {\n /** Message text */\n text: string\n /** Message type */\n type: 'info' | 'success' | 'error' | 'warning'\n /** Optional auto-dismiss timeout in ms */\n timeout?: number\n}\n\ninterface UsePaymentStatusReturn {\n /** Current payment status */\n status: Ref<PaymentStatus>\n /** Current status message */\n message: Ref<StatusMessage | null>\n /** Set the status */\n setStatus: (status: PaymentStatus, message?: string) => void\n /** Set a success message */\n setSuccess: (message: string, timeout?: number) => void\n /** Set an error message */\n setError: (message: string) => void\n /** Set an info message */\n setInfo: (message: string, timeout?: number) => void\n /** Set a warning message */\n setWarning: (message: string, timeout?: number) => void\n /** Clear the current message */\n clearMessage: () => void\n /** Reset to idle state */\n reset: () => void\n}\n\n/**\n * Composable for managing payment status and status messages.\n *\n * @returns State and methods for status management.\n *\n * @example\n * ```vue\n * <script setup>\n * import { usePaymentStatus } from \"@t402/vue\";\n *\n * const {\n * status,\n * message,\n * setStatus,\n * setSuccess,\n * setError,\n * } = usePaymentStatus();\n *\n * const handlePayment = async () => {\n * setStatus(\"loading\", \"Processing payment...\");\n * try {\n * await processPayment();\n * setSuccess(\"Payment successful!\", 3000);\n * } catch (err) {\n * setError(\"Payment failed. Please try again.\");\n * }\n * };\n * </script>\n * ```\n */\nexport function usePaymentStatus(): UsePaymentStatusReturn {\n const status = ref<PaymentStatus>('idle')\n const message = ref<StatusMessage | null>(null)\n\n const scheduleMessageClear = (timeout?: number) => {\n if (timeout && timeout > 0) {\n setTimeout(() => {\n message.value = null\n }, timeout)\n }\n }\n\n const setStatus = (newStatus: PaymentStatus, messageText?: string) => {\n status.value = newStatus\n if (messageText) {\n const type = newStatus === 'error' ? 'error' : newStatus === 'success' ? 'success' : 'info'\n message.value = { text: messageText, type }\n }\n }\n\n const setSuccess = (text: string, timeout?: number) => {\n status.value = 'success'\n message.value = { text, type: 'success', timeout }\n scheduleMessageClear(timeout)\n }\n\n const setError = (text: string) => {\n status.value = 'error'\n message.value = { text, type: 'error' }\n }\n\n const setInfo = (text: string, timeout?: number) => {\n message.value = { text, type: 'info', timeout }\n scheduleMessageClear(timeout)\n }\n\n const setWarning = (text: string, timeout?: number) => {\n message.value = { text, type: 'warning', timeout }\n scheduleMessageClear(timeout)\n }\n\n const clearMessage = () => {\n message.value = null\n }\n\n const reset = () => {\n status.value = 'idle'\n message.value = null\n }\n\n return {\n status,\n message,\n setStatus,\n setSuccess,\n setError,\n setInfo,\n setWarning,\n clearMessage,\n reset,\n }\n}\n","import { ref, computed, type Ref, type ComputedRef } from 'vue'\nimport type { PaymentStatus } from '../types/index.js'\n\ninterface UseAsyncPaymentOptions<T> {\n /** The async payment function to execute */\n paymentFn: () => Promise<T>\n /** Callback on successful payment */\n onSuccess?: (result: T) => void\n /** Callback on payment error */\n onError?: (error: Error) => void\n /** Callback when payment starts */\n onStart?: () => void\n}\n\ninterface UseAsyncPaymentReturn<T> {\n /** Execute the payment */\n execute: () => Promise<T | null>\n /** Current payment status */\n status: Ref<PaymentStatus>\n /** Result of successful payment */\n result: Ref<T | null>\n /** Error message if payment failed */\n error: Ref<string | null>\n /** Whether payment is in progress */\n isLoading: ComputedRef<boolean>\n /** Whether payment succeeded */\n isSuccess: ComputedRef<boolean>\n /** Whether payment failed */\n isError: ComputedRef<boolean>\n /** Reset the state */\n reset: () => void\n}\n\n/**\n * Composable for managing async payment operations with loading states.\n *\n * @param options - Configuration including the payment function and callbacks.\n * @returns State and methods for managing the async payment.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useAsyncPayment } from \"@t402/vue\";\n *\n * const { execute, isLoading, isSuccess, error } = useAsyncPayment({\n * paymentFn: async () => {\n * const response = await fetch(\"/api/protected\", {\n * headers: { \"X-Payment\": paymentPayload },\n * });\n * return response.json();\n * },\n * onSuccess: (data) => console.log(\"Payment succeeded:\", data),\n * onError: (err) => console.error(\"Payment failed:\", err),\n * });\n * </script>\n *\n * <template>\n * <button @click=\"execute\" :disabled=\"isLoading\">\n * {{ isLoading ? \"Processing...\" : \"Pay Now\" }}\n * </button>\n * </template>\n * ```\n */\nexport function useAsyncPayment<T>(options: UseAsyncPaymentOptions<T>): UseAsyncPaymentReturn<T> {\n const { paymentFn, onSuccess, onError, onStart } = options\n\n const status = ref<PaymentStatus>('idle')\n const result = ref<T | null>(null) as Ref<T | null>\n const error = ref<string | null>(null)\n\n const isLoading = computed(() => status.value === 'loading')\n const isSuccess = computed(() => status.value === 'success')\n const isError = computed(() => status.value === 'error')\n\n const execute = async (): Promise<T | null> => {\n status.value = 'loading'\n error.value = null\n onStart?.()\n\n try {\n const paymentResult = await paymentFn()\n result.value = paymentResult\n status.value = 'success'\n onSuccess?.(paymentResult)\n return paymentResult\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Payment failed'\n error.value = errorMessage\n status.value = 'error'\n onError?.(err instanceof Error ? err : new Error(errorMessage))\n return null\n }\n }\n\n const reset = () => {\n status.value = 'idle'\n result.value = null\n error.value = null\n }\n\n return {\n execute,\n status,\n result,\n error,\n isLoading,\n isSuccess,\n isError,\n reset,\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@t402/vue",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.1",
|
|
4
4
|
"main": "./dist/cjs/index.js",
|
|
5
5
|
"module": "./dist/esm/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -23,24 +23,25 @@
|
|
|
23
23
|
"@types/node": "^22.13.4",
|
|
24
24
|
"@typescript-eslint/eslint-plugin": "^8.29.1",
|
|
25
25
|
"@typescript-eslint/parser": "^8.29.1",
|
|
26
|
-
"@vitejs/plugin-vue": "^
|
|
26
|
+
"@vitejs/plugin-vue": "^6.0.3",
|
|
27
27
|
"@vue/test-utils": "^2.4.0",
|
|
28
28
|
"eslint": "^9.24.0",
|
|
29
29
|
"eslint-plugin-import": "^2.31.0",
|
|
30
30
|
"eslint-plugin-jsdoc": "^50.6.9",
|
|
31
31
|
"eslint-plugin-prettier": "^5.2.6",
|
|
32
|
-
"
|
|
32
|
+
"glob": "^13.0.0",
|
|
33
|
+
"happy-dom": "^17.6.3",
|
|
33
34
|
"prettier": "3.5.2",
|
|
34
35
|
"tsup": "^8.4.0",
|
|
35
|
-
"tsx": "^4.
|
|
36
|
+
"tsx": "^4.21.0",
|
|
36
37
|
"typescript": "^5.7.3",
|
|
37
|
-
"vite": "^
|
|
38
|
+
"vite": "^7.3.1",
|
|
38
39
|
"vite-tsconfig-paths": "^5.1.4",
|
|
39
|
-
"vitest": "^3.
|
|
40
|
+
"vitest": "^3.2.4",
|
|
40
41
|
"vue": "^3.5.0"
|
|
41
42
|
},
|
|
42
43
|
"dependencies": {
|
|
43
|
-
"@t402/core": "2.
|
|
44
|
+
"@t402/core": "2.3.1"
|
|
44
45
|
},
|
|
45
46
|
"peerDependencies": {
|
|
46
47
|
"vue": "^3.3.0"
|