@diviswap/sdk 1.7.15 → 1.7.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +1 -1
- package/dist/cli/templates/nextjs-app/actions.ts.hbs +45 -38
- package/dist/cli/templates/nextjs-app/api-hooks.ts.hbs +10 -10
- package/dist/cli/templates/nextjs-app/api-route.ts.hbs +75 -70
- package/dist/cli/templates/nextjs-app/auth-context.tsx.hbs +1 -1
- package/dist/cli/templates/nextjs-app/client.ts.hbs +4 -4
- package/dist/cli/templates/nextjs-app/dashboard-hooks.ts.hbs +7 -7
- package/dist/cli/templates/nextjs-app/example-page.tsx.hbs +9 -9
- package/dist/cli/templates/nextjs-app/hooks.ts.hbs +7 -7
- package/dist/cli/templates/nextjs-app/kyc-hooks.ts.hbs +2 -2
- package/dist/cli/templates/nextjs-app/kyc-wizard.css.hbs +16 -16
- package/dist/cli/templates/nextjs-app/kyc-wizard.tsx.hbs +71 -38
- package/dist/cli/templates/nextjs-app/layout-wrapper.tsx.hbs +4 -4
- package/dist/cli/templates/nextjs-app/layout.tsx.hbs +4 -4
- package/dist/cli/templates/nextjs-app/middleware.ts.hbs +15 -15
- package/dist/cli/templates/nextjs-app/provider-wrapper.tsx.hbs +4 -4
- package/dist/cli/templates/nextjs-app/provider.tsx.hbs +15 -15
- package/dist/cli/templates/nextjs-app/setup-provider.tsx.hbs +4 -4
- package/dist/cli/templates/react/api-client-wrapper.ts.hbs +11 -11
- package/dist/cli/templates/react/example.tsx.hbs +6 -6
- package/dist/cli/templates/react/tanstack-hooks.ts.hbs +14 -14
- package/dist/cli/templates/webhooks/nextjs.hbs +3 -3
- package/package.json +1 -1
- package/src/cli/templates/nextjs-app/actions.ts.hbs +45 -38
- package/src/cli/templates/nextjs-app/api-hooks.ts.hbs +10 -10
- package/src/cli/templates/nextjs-app/api-route.ts.hbs +75 -70
- package/src/cli/templates/nextjs-app/auth-context.tsx.hbs +1 -1
- package/src/cli/templates/nextjs-app/client.ts.hbs +4 -4
- package/src/cli/templates/nextjs-app/dashboard-hooks.ts.hbs +7 -7
- package/src/cli/templates/nextjs-app/example-page.tsx.hbs +9 -9
- package/src/cli/templates/nextjs-app/hooks.ts.hbs +7 -7
- package/src/cli/templates/nextjs-app/kyc-hooks.ts.hbs +2 -2
- package/src/cli/templates/nextjs-app/kyc-wizard.css.hbs +16 -16
- package/src/cli/templates/nextjs-app/kyc-wizard.tsx.hbs +71 -38
- package/src/cli/templates/nextjs-app/layout-wrapper.tsx.hbs +4 -4
- package/src/cli/templates/nextjs-app/layout.tsx.hbs +4 -4
- package/src/cli/templates/nextjs-app/middleware.ts.hbs +15 -15
- package/src/cli/templates/nextjs-app/provider-wrapper.tsx.hbs +4 -4
- package/src/cli/templates/nextjs-app/provider.tsx.hbs +15 -15
- package/src/cli/templates/nextjs-app/setup-provider.tsx.hbs +4 -4
- package/src/cli/templates/react/api-client-wrapper.ts.hbs +11 -11
- package/src/cli/templates/react/example.tsx.hbs +6 -6
- package/src/cli/templates/react/tanstack-hooks.ts.hbs +14 -14
- package/src/cli/templates/webhooks/nextjs.hbs +3 -3
|
@@ -34,7 +34,7 @@ export function useAuth() {
|
|
|
34
34
|
|
|
35
35
|
const setCustomer = useCallback(async (customerId: string, customerEmail: string) => {
|
|
36
36
|
try {
|
|
37
|
-
const response = await fetch('/api/
|
|
37
|
+
const response = await fetch('/api/diviswap', {
|
|
38
38
|
method: 'POST',
|
|
39
39
|
headers: { 'Content-Type': 'application/json' },
|
|
40
40
|
body: JSON.stringify({
|
|
@@ -56,7 +56,7 @@ export function useAuth() {
|
|
|
56
56
|
|
|
57
57
|
const clearCustomer = useCallback(async () => {
|
|
58
58
|
try {
|
|
59
|
-
await fetch('/api/
|
|
59
|
+
await fetch('/api/diviswap', {
|
|
60
60
|
method: 'POST',
|
|
61
61
|
headers: { 'Content-Type': 'application/json' },
|
|
62
62
|
body: JSON.stringify({ action: 'clearCustomer' })
|
|
@@ -106,7 +106,7 @@ export function useTransactions() {
|
|
|
106
106
|
...filters
|
|
107
107
|
});
|
|
108
108
|
|
|
109
|
-
const response = await fetch(`/api/
|
|
109
|
+
const response = await fetch(`/api/diviswap?${queryParams}`);
|
|
110
110
|
if (!response.ok) throw new Error('Failed to fetch transactions');
|
|
111
111
|
|
|
112
112
|
const data = await response.json();
|
|
@@ -129,7 +129,7 @@ export function useTransactions() {
|
|
|
129
129
|
setError(null);
|
|
130
130
|
|
|
131
131
|
try {
|
|
132
|
-
const response = await fetch('/api/
|
|
132
|
+
const response = await fetch('/api/diviswap', {
|
|
133
133
|
method: 'POST',
|
|
134
134
|
headers: { 'Content-Type': 'application/json' },
|
|
135
135
|
body: JSON.stringify({
|
|
@@ -180,7 +180,7 @@ export function usePayees() {
|
|
|
180
180
|
setError(null);
|
|
181
181
|
|
|
182
182
|
try {
|
|
183
|
-
const response = await fetch(`/api/
|
|
183
|
+
const response = await fetch(`/api/diviswap?resource=payees&customerId=${customerId}&customerEmail=${customerEmail}`);
|
|
184
184
|
if (!response.ok) throw new Error('Failed to fetch payees');
|
|
185
185
|
|
|
186
186
|
const data = await response.json();
|
|
@@ -203,7 +203,7 @@ export function usePayees() {
|
|
|
203
203
|
setError(null);
|
|
204
204
|
|
|
205
205
|
try {
|
|
206
|
-
const response = await fetch('/api/
|
|
206
|
+
const response = await fetch('/api/diviswap', {
|
|
207
207
|
method: 'POST',
|
|
208
208
|
headers: { 'Content-Type': 'application/json' },
|
|
209
209
|
body: JSON.stringify({
|
|
@@ -237,7 +237,7 @@ export function usePayees() {
|
|
|
237
237
|
setError(null);
|
|
238
238
|
|
|
239
239
|
try {
|
|
240
|
-
const response = await fetch(`/api/
|
|
240
|
+
const response = await fetch(`/api/diviswap?resource=payee&id=${id}&customerId=${customerId}&customerEmail=${customerEmail}`, {
|
|
241
241
|
method: 'DELETE'
|
|
242
242
|
});
|
|
243
243
|
|
|
@@ -286,7 +286,7 @@ export function useKYC() {
|
|
|
286
286
|
setError(null);
|
|
287
287
|
|
|
288
288
|
try {
|
|
289
|
-
const response = await fetch(`/api/
|
|
289
|
+
const response = await fetch(`/api/diviswap?resource=kycStatus&customerId=${customerId}&customerEmail=${customerEmail}`);
|
|
290
290
|
if (!response.ok) throw new Error('Failed to fetch KYC status');
|
|
291
291
|
|
|
292
292
|
const data = await response.json();
|
|
@@ -309,7 +309,7 @@ export function useKYC() {
|
|
|
309
309
|
setError(null);
|
|
310
310
|
|
|
311
311
|
try {
|
|
312
|
-
const response = await fetch('/api/
|
|
312
|
+
const response = await fetch('/api/diviswap', {
|
|
313
313
|
method: 'POST',
|
|
314
314
|
headers: { 'Content-Type': 'application/json' },
|
|
315
315
|
body: JSON.stringify({
|
|
@@ -372,7 +372,7 @@ export function useFeeCalculator() {
|
|
|
372
372
|
setError(null);
|
|
373
373
|
|
|
374
374
|
try {
|
|
375
|
-
const response = await fetch('/api/
|
|
375
|
+
const response = await fetch('/api/diviswap', {
|
|
376
376
|
method: 'POST',
|
|
377
377
|
headers: { 'Content-Type': 'application/json' },
|
|
378
378
|
body: JSON.stringify({
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
-
import {
|
|
2
|
+
import { Diviswap } from '@diviswap/sdk';
|
|
3
3
|
import { cookies } from 'next/headers';
|
|
4
|
-
import type {
|
|
4
|
+
import type { Diviswap as DiviswapType } from '@diviswap/sdk';
|
|
5
5
|
|
|
6
|
-
// Initialize
|
|
7
|
-
function
|
|
6
|
+
// Initialize Diviswap SDK with partner authentication
|
|
7
|
+
function getDiviswap() {
|
|
8
8
|
const config = {
|
|
9
9
|
mode: 'partner' as const,
|
|
10
|
-
keyId: process.env.
|
|
11
|
-
secretKey: process.env.
|
|
10
|
+
keyId: process.env.DIVISWAP_PARTNER_KEY_ID!,
|
|
11
|
+
secretKey: process.env.DIVISWAP_PARTNER_SECRET_KEY!,
|
|
12
12
|
authMethod: 'hmac' as const,
|
|
13
|
-
environment: (process.env.
|
|
13
|
+
environment: (process.env.NEXT_PUBLIC_DIVISWAP_ENV as 'production' | 'sandbox') || 'sandbox'
|
|
14
14
|
};
|
|
15
15
|
|
|
16
|
-
return
|
|
16
|
+
return Diviswap.init(config);
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
// Helper function to handle errors
|
|
20
20
|
function handleError(error: unknown) {
|
|
21
|
-
console.error('
|
|
21
|
+
console.error('Diviswap API error:', error);
|
|
22
22
|
|
|
23
23
|
if (error instanceof Error) {
|
|
24
24
|
return NextResponse.json(
|
|
@@ -35,7 +35,7 @@ function handleError(error: unknown) {
|
|
|
35
35
|
|
|
36
36
|
// Type definitions for handlers
|
|
37
37
|
type HandlerContext = {
|
|
38
|
-
|
|
38
|
+
diviswap: DiviswapType;
|
|
39
39
|
cookieStore: Awaited<ReturnType<typeof cookies>>;
|
|
40
40
|
};
|
|
41
41
|
|
|
@@ -43,7 +43,7 @@ type ActionHandler = (params: any, context: HandlerContext) => Promise<NextRespo
|
|
|
43
43
|
type ResourceHandler = (searchParams: URLSearchParams, context: HandlerContext) => Promise<NextResponse>;
|
|
44
44
|
|
|
45
45
|
// Helper function to set customer context from request
|
|
46
|
-
function setCustomerContext(
|
|
46
|
+
function setCustomerContext(diviswap: DiviswapType, params: any) {
|
|
47
47
|
// In partner authentication, you need to identify your user from your session/auth
|
|
48
48
|
// For this example, we'll expect customerId and customerEmail in the request
|
|
49
49
|
// In production, you'd get this from your own authentication system
|
|
@@ -51,14 +51,14 @@ function setCustomerContext(liberex: LiberExType, params: any) {
|
|
|
51
51
|
const customerId = params.customerId || 'demo-customer-123';
|
|
52
52
|
const customerEmail = params.customerEmail || 'demo@yourapp.com';
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
diviswap.setCustomer(customerId, customerEmail);
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
// POST action handlers
|
|
58
58
|
const postHandlers: Record<string, ActionHandler> = {
|
|
59
|
-
setCustomer: async (params, {
|
|
59
|
+
setCustomer: async (params, { diviswap }) => {
|
|
60
60
|
try {
|
|
61
|
-
|
|
61
|
+
diviswap.setCustomer(params.customerId, params.customerEmail);
|
|
62
62
|
return NextResponse.json({
|
|
63
63
|
success: true,
|
|
64
64
|
customerId: params.customerId,
|
|
@@ -70,9 +70,9 @@ const postHandlers: Record<string, ActionHandler> = {
|
|
|
70
70
|
}
|
|
71
71
|
},
|
|
72
72
|
|
|
73
|
-
clearCustomer: async (_, {
|
|
73
|
+
clearCustomer: async (_, { diviswap }) => {
|
|
74
74
|
try {
|
|
75
|
-
|
|
75
|
+
diviswap.clearCustomer();
|
|
76
76
|
return NextResponse.json({ success: true });
|
|
77
77
|
} catch (error: any) {
|
|
78
78
|
console.error('Clear customer error:', error);
|
|
@@ -80,9 +80,9 @@ const postHandlers: Record<string, ActionHandler> = {
|
|
|
80
80
|
}
|
|
81
81
|
},
|
|
82
82
|
|
|
83
|
-
createTransaction: async (params, {
|
|
83
|
+
createTransaction: async (params, { diviswap }) => {
|
|
84
84
|
// Set customer context before API calls
|
|
85
|
-
setCustomerContext(
|
|
85
|
+
setCustomerContext(diviswap, params);
|
|
86
86
|
|
|
87
87
|
// Use the appropriate method based on transaction type
|
|
88
88
|
let transaction;
|
|
@@ -121,17 +121,17 @@ const postHandlers: Record<string, ActionHandler> = {
|
|
|
121
121
|
// Use environment-appropriate method
|
|
122
122
|
// Production: uses regular offramp (creates completed transaction)
|
|
123
123
|
// Sandbox/Development: uses offrampTest (creates pending transaction)
|
|
124
|
-
const isProduction = process.env.
|
|
124
|
+
const isProduction = process.env.NEXT_PUBLIC_DIVISWAP_ENV === 'production';
|
|
125
125
|
transaction = isProduction
|
|
126
|
-
? await
|
|
127
|
-
: await
|
|
126
|
+
? await diviswap.transactions.offramp(sdkParams)
|
|
127
|
+
: await diviswap.transactions.offrampTest(sdkParams);
|
|
128
128
|
}
|
|
129
129
|
return NextResponse.json(transaction);
|
|
130
130
|
},
|
|
131
131
|
|
|
132
|
-
createPayee: async (params, {
|
|
132
|
+
createPayee: async (params, { diviswap }) => {
|
|
133
133
|
// Set customer context before API calls
|
|
134
|
-
setCustomerContext(
|
|
134
|
+
setCustomerContext(diviswap, params);
|
|
135
135
|
|
|
136
136
|
|
|
137
137
|
// Check if the SDK is sending structured debit card data
|
|
@@ -144,7 +144,7 @@ const postHandlers: Record<string, ActionHandler> = {
|
|
|
144
144
|
setAsDefault: params.setAsDefault || false
|
|
145
145
|
};
|
|
146
146
|
|
|
147
|
-
const payee = await
|
|
147
|
+
const payee = await diviswap.payees.create(debitCardPayload);
|
|
148
148
|
return NextResponse.json(payee);
|
|
149
149
|
}
|
|
150
150
|
// Handle legacy flat structure for debit cards
|
|
@@ -172,11 +172,11 @@ const postHandlers: Record<string, ActionHandler> = {
|
|
|
172
172
|
setAsDefault: params.setAsDefault || false
|
|
173
173
|
};
|
|
174
174
|
|
|
175
|
-
const payee = await
|
|
175
|
+
const payee = await diviswap.payees.create(debitCardPayload);
|
|
176
176
|
return NextResponse.json(payee);
|
|
177
177
|
} else {
|
|
178
178
|
// Bank account structure
|
|
179
|
-
const payee = await
|
|
179
|
+
const payee = await diviswap.payees.create({
|
|
180
180
|
nickname: params.nickname,
|
|
181
181
|
accountNumber: params.accountNumber,
|
|
182
182
|
routingNumber: params.routingNumber,
|
|
@@ -188,23 +188,23 @@ const postHandlers: Record<string, ActionHandler> = {
|
|
|
188
188
|
},
|
|
189
189
|
|
|
190
190
|
{{#if (includes features "fees")}}
|
|
191
|
-
calculateFees: async (params, {
|
|
192
|
-
const fees = await
|
|
191
|
+
calculateFees: async (params, { diviswap }) => {
|
|
192
|
+
const fees = await diviswap.fees.calculateFees({
|
|
193
193
|
amount: params.amount,
|
|
194
194
|
userId: undefined
|
|
195
195
|
});
|
|
196
196
|
return NextResponse.json(fees);
|
|
197
197
|
},
|
|
198
198
|
|
|
199
|
-
getIntegratorFees: async (_, {
|
|
200
|
-
const fees = await
|
|
199
|
+
getIntegratorFees: async (_, { diviswap }) => {
|
|
200
|
+
const fees = await diviswap.fees.getFees();
|
|
201
201
|
return NextResponse.json(fees);
|
|
202
202
|
},
|
|
203
203
|
{{/if}}
|
|
204
204
|
|
|
205
|
-
submitKYC: async (params, {
|
|
205
|
+
submitKYC: async (params, { diviswap }) => {
|
|
206
206
|
// Set customer context before KYC submission
|
|
207
|
-
setCustomerContext(
|
|
207
|
+
setCustomerContext(diviswap, params);
|
|
208
208
|
|
|
209
209
|
try {
|
|
210
210
|
|
|
@@ -248,7 +248,7 @@ const postHandlers: Record<string, ActionHandler> = {
|
|
|
248
248
|
};
|
|
249
249
|
|
|
250
250
|
|
|
251
|
-
const result = await
|
|
251
|
+
const result = await diviswap.kyc.submitPersonalInfo(kycPayload);
|
|
252
252
|
|
|
253
253
|
return NextResponse.json(result);
|
|
254
254
|
} catch (error: any) {
|
|
@@ -260,12 +260,12 @@ const postHandlers: Record<string, ActionHandler> = {
|
|
|
260
260
|
}
|
|
261
261
|
},
|
|
262
262
|
|
|
263
|
-
createAddress: async (params, {
|
|
263
|
+
createAddress: async (params, { diviswap }) => {
|
|
264
264
|
// Set customer context before API call
|
|
265
|
-
setCustomerContext(
|
|
265
|
+
setCustomerContext(diviswap, params);
|
|
266
266
|
|
|
267
267
|
try {
|
|
268
|
-
const address = await
|
|
268
|
+
const address = await diviswap.addresses.create({
|
|
269
269
|
chain_id: params.chain_id,
|
|
270
270
|
address: params.address,
|
|
271
271
|
is_default: params.is_default
|
|
@@ -278,12 +278,12 @@ const postHandlers: Record<string, ActionHandler> = {
|
|
|
278
278
|
}
|
|
279
279
|
},
|
|
280
280
|
|
|
281
|
-
setDefaultAddress: async (params, {
|
|
281
|
+
setDefaultAddress: async (params, { diviswap }) => {
|
|
282
282
|
// Set customer context before API call
|
|
283
|
-
setCustomerContext(
|
|
283
|
+
setCustomerContext(diviswap, params);
|
|
284
284
|
|
|
285
285
|
try {
|
|
286
|
-
await
|
|
286
|
+
await diviswap.addresses.setDefault({
|
|
287
287
|
chain_id: params.chain_id,
|
|
288
288
|
address: params.address
|
|
289
289
|
});
|
|
@@ -295,12 +295,12 @@ const postHandlers: Record<string, ActionHandler> = {
|
|
|
295
295
|
}
|
|
296
296
|
},
|
|
297
297
|
|
|
298
|
-
deleteAddress: async (params, {
|
|
298
|
+
deleteAddress: async (params, { diviswap }) => {
|
|
299
299
|
// Set customer context before API call
|
|
300
|
-
setCustomerContext(
|
|
300
|
+
setCustomerContext(diviswap, params);
|
|
301
301
|
|
|
302
302
|
try {
|
|
303
|
-
await
|
|
303
|
+
await diviswap.addresses.delete({
|
|
304
304
|
chain_id: params.chain_id,
|
|
305
305
|
address: params.address
|
|
306
306
|
});
|
|
@@ -330,8 +330,8 @@ export async function POST(request: NextRequest) {
|
|
|
330
330
|
);
|
|
331
331
|
}
|
|
332
332
|
|
|
333
|
-
const
|
|
334
|
-
return await handler(params, {
|
|
333
|
+
const diviswap = getDiviswap();
|
|
334
|
+
return await handler(params, { diviswap, cookieStore });
|
|
335
335
|
} catch (error) {
|
|
336
336
|
return handleError(error);
|
|
337
337
|
}
|
|
@@ -339,12 +339,12 @@ export async function POST(request: NextRequest) {
|
|
|
339
339
|
|
|
340
340
|
// GET resource handlers
|
|
341
341
|
const getHandlers: Record<string, ResourceHandler> = {
|
|
342
|
-
customerStatus: async (searchParams, {
|
|
342
|
+
customerStatus: async (searchParams, { diviswap }) => {
|
|
343
343
|
const customerId = searchParams.get('customerId') || 'demo-customer-123';
|
|
344
344
|
const customerEmail = searchParams.get('customerEmail') || 'demo@yourapp.com';
|
|
345
345
|
|
|
346
346
|
// Set customer context
|
|
347
|
-
|
|
347
|
+
diviswap.setCustomer(customerId, customerEmail);
|
|
348
348
|
|
|
349
349
|
return NextResponse.json({
|
|
350
350
|
customerId,
|
|
@@ -354,30 +354,30 @@ const getHandlers: Record<string, ResourceHandler> = {
|
|
|
354
354
|
});
|
|
355
355
|
},
|
|
356
356
|
|
|
357
|
-
payees: async (searchParams, {
|
|
357
|
+
payees: async (searchParams, { diviswap }) => {
|
|
358
358
|
const customerId = searchParams.get('customerId') || 'demo-customer-123';
|
|
359
359
|
const customerEmail = searchParams.get('customerEmail') || 'demo@yourapp.com';
|
|
360
360
|
|
|
361
361
|
// Set customer context before API call
|
|
362
|
-
|
|
362
|
+
diviswap.setCustomer(customerId, customerEmail);
|
|
363
363
|
|
|
364
|
-
const payees = await
|
|
364
|
+
const payees = await diviswap.payees.list();
|
|
365
365
|
return NextResponse.json(payees);
|
|
366
366
|
},
|
|
367
367
|
|
|
368
|
-
transactions: async (searchParams, {
|
|
368
|
+
transactions: async (searchParams, { diviswap }) => {
|
|
369
369
|
const customerId = searchParams.get('customerId') || 'demo-customer-123';
|
|
370
370
|
const customerEmail = searchParams.get('customerEmail') || 'demo@yourapp.com';
|
|
371
371
|
|
|
372
372
|
// Set customer context before API call
|
|
373
|
-
|
|
373
|
+
diviswap.setCustomer(customerId, customerEmail);
|
|
374
374
|
|
|
375
375
|
const limit = searchParams.get('limit');
|
|
376
376
|
const offset = searchParams.get('offset');
|
|
377
377
|
const status = searchParams.get('status');
|
|
378
378
|
const type = searchParams.get('type');
|
|
379
379
|
|
|
380
|
-
const transactions = await
|
|
380
|
+
const transactions = await diviswap.transactions.list({
|
|
381
381
|
limit: limit ? Number(limit) : 10,
|
|
382
382
|
offset: offset ? Number(offset) : 0,
|
|
383
383
|
status: status as 'pending' | 'processing' | 'completed' | 'failed' | undefined,
|
|
@@ -387,16 +387,16 @@ const getHandlers: Record<string, ResourceHandler> = {
|
|
|
387
387
|
return NextResponse.json(transactions);
|
|
388
388
|
},
|
|
389
389
|
|
|
390
|
-
kycStatus: async (searchParams, {
|
|
390
|
+
kycStatus: async (searchParams, { diviswap }) => {
|
|
391
391
|
const customerId = searchParams.get('customerId') || 'demo-customer-123';
|
|
392
392
|
const customerEmail = searchParams.get('customerEmail') || 'demo@yourapp.com';
|
|
393
393
|
|
|
394
394
|
// Set customer context before API call
|
|
395
|
-
|
|
395
|
+
diviswap.setCustomer(customerId, customerEmail);
|
|
396
396
|
|
|
397
397
|
try {
|
|
398
398
|
|
|
399
|
-
const status = await
|
|
399
|
+
const status = await diviswap.kyc.getComplianceStatus();
|
|
400
400
|
return NextResponse.json(status);
|
|
401
401
|
} catch (error: any) {
|
|
402
402
|
console.error('Failed to get KYC status:', error);
|
|
@@ -412,21 +412,26 @@ const getHandlers: Record<string, ResourceHandler> = {
|
|
|
412
412
|
}
|
|
413
413
|
},
|
|
414
414
|
|
|
415
|
-
addresses: async (searchParams, {
|
|
415
|
+
addresses: async (searchParams, { diviswap }) => {
|
|
416
416
|
const customerId = searchParams.get('customerId') || 'demo-customer-123';
|
|
417
417
|
const customerEmail = searchParams.get('customerEmail') || 'demo@yourapp.com';
|
|
418
418
|
|
|
419
419
|
// Set customer context before API call
|
|
420
|
-
|
|
420
|
+
diviswap.setCustomer(customerId, customerEmail);
|
|
421
421
|
|
|
422
422
|
const chain_id = searchParams.get('chain_id');
|
|
423
423
|
const is_default = searchParams.get('is_default');
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
424
|
+
|
|
425
|
+
let addresses = await diviswap.addresses.list();
|
|
426
|
+
|
|
427
|
+
// Filter client-side if params provided
|
|
428
|
+
if (chain_id) {
|
|
429
|
+
addresses = addresses.filter(addr => addr.chain_id === Number(chain_id));
|
|
430
|
+
}
|
|
431
|
+
if (is_default !== null) {
|
|
432
|
+
addresses = addresses.filter(addr => addr.is_default === (is_default === 'true'));
|
|
433
|
+
}
|
|
434
|
+
|
|
430
435
|
return NextResponse.json(addresses);
|
|
431
436
|
},
|
|
432
437
|
|
|
@@ -447,8 +452,8 @@ export async function GET(request: NextRequest) {
|
|
|
447
452
|
);
|
|
448
453
|
}
|
|
449
454
|
|
|
450
|
-
const
|
|
451
|
-
return await handler(searchParams, {
|
|
455
|
+
const diviswap = getDiviswap();
|
|
456
|
+
return await handler(searchParams, { diviswap, cookieStore });
|
|
452
457
|
} catch (error) {
|
|
453
458
|
return handleError(error);
|
|
454
459
|
}
|
|
@@ -457,7 +462,7 @@ export async function GET(request: NextRequest) {
|
|
|
457
462
|
{{#if (includes features "webhooks")}}
|
|
458
463
|
// DELETE resource handlers
|
|
459
464
|
const deleteHandlers: Record<string, ResourceHandler> = {
|
|
460
|
-
payee: async (searchParams, {
|
|
465
|
+
payee: async (searchParams, { diviswap }) => {
|
|
461
466
|
const customerId = searchParams.get('customerId') || 'demo-customer-123';
|
|
462
467
|
const customerEmail = searchParams.get('customerEmail') || 'demo@yourapp.com';
|
|
463
468
|
const id = searchParams.get('id');
|
|
@@ -470,9 +475,9 @@ const deleteHandlers: Record<string, ResourceHandler> = {
|
|
|
470
475
|
}
|
|
471
476
|
|
|
472
477
|
// Set customer context before API call
|
|
473
|
-
|
|
478
|
+
diviswap.setCustomer(customerId, customerEmail);
|
|
474
479
|
|
|
475
|
-
await
|
|
480
|
+
await diviswap.payees.delete(id);
|
|
476
481
|
return NextResponse.json({ success: true });
|
|
477
482
|
},
|
|
478
483
|
};
|
|
@@ -493,8 +498,8 @@ export async function DELETE(request: NextRequest) {
|
|
|
493
498
|
);
|
|
494
499
|
}
|
|
495
500
|
|
|
496
|
-
const
|
|
497
|
-
return await handler(searchParams, {
|
|
501
|
+
const diviswap = getDiviswap();
|
|
502
|
+
return await handler(searchParams, { diviswap, cookieStore });
|
|
498
503
|
} catch (error) {
|
|
499
504
|
return handleError(error);
|
|
500
505
|
}
|
|
@@ -26,7 +26,7 @@ interface {{prefix}}AuthProviderProps {
|
|
|
26
26
|
clearCustomer: () => Promise<void>;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
// This provider receives props instead of using
|
|
29
|
+
// This provider receives props instead of using useDiviswap directly
|
|
30
30
|
// to avoid circular dependencies
|
|
31
31
|
export function {{prefix}}AuthProvider({
|
|
32
32
|
children,
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
// This file is auto-generated by
|
|
2
|
-
// It provides a client for communicating with the
|
|
1
|
+
// This file is auto-generated by Diviswap SDK CLI
|
|
2
|
+
// It provides a client for communicating with the Diviswap API routes
|
|
3
3
|
|
|
4
|
-
export class
|
|
5
|
-
constructor(private baseUrl: string = '/api/
|
|
4
|
+
export class DiviswapClient {
|
|
5
|
+
constructor(private baseUrl: string = '/api/diviswap') {}
|
|
6
6
|
|
|
7
7
|
private async request<T = any>(
|
|
8
8
|
endpoint: string,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
3
|
import { useEffect, useState } from 'react';
|
|
4
|
-
import { use{{prefix}}Auth } from '~/context/
|
|
4
|
+
import { use{{prefix}}Auth } from '~/context/diviswap-auth-context';
|
|
5
5
|
|
|
6
6
|
export function use{{prefix}}Dashboard() {
|
|
7
7
|
const { customerId, customerEmail, isAuthenticated } = use{{prefix}}Auth();
|
|
@@ -15,14 +15,14 @@ export function use{{prefix}}Dashboard() {
|
|
|
15
15
|
customerEmail,
|
|
16
16
|
...params
|
|
17
17
|
});
|
|
18
|
-
const response = await fetch(`/api/
|
|
18
|
+
const response = await fetch(`/api/diviswap?${queryParams}`);
|
|
19
19
|
if (!response.ok) throw new Error('Failed to fetch transactions');
|
|
20
20
|
return response.json();
|
|
21
21
|
};
|
|
22
22
|
|
|
23
23
|
const getPayees = async () => {
|
|
24
24
|
if (!isAuthenticated || !customerId) return [];
|
|
25
|
-
const response = await fetch(`/api/
|
|
25
|
+
const response = await fetch(`/api/diviswap?resource=payees&customerId=${customerId}&customerEmail=${customerEmail}`);
|
|
26
26
|
if (!response.ok) throw new Error('Failed to fetch payees');
|
|
27
27
|
return response.json();
|
|
28
28
|
};
|
|
@@ -36,14 +36,14 @@ export function use{{prefix}}Dashboard() {
|
|
|
36
36
|
...(params?.chain_id && { chain_id: params.chain_id.toString() }),
|
|
37
37
|
...(params?.is_default !== undefined && { is_default: params.is_default.toString() })
|
|
38
38
|
});
|
|
39
|
-
const response = await fetch(`/api/
|
|
39
|
+
const response = await fetch(`/api/diviswap?${queryParams}`);
|
|
40
40
|
if (!response.ok) throw new Error('Failed to fetch addresses');
|
|
41
41
|
return response.json();
|
|
42
42
|
};
|
|
43
43
|
|
|
44
44
|
const createAddress = async (data: { chain_id: number; address: string; is_default?: boolean }) => {
|
|
45
45
|
if (!isAuthenticated || !customerId) throw new Error('Not authenticated');
|
|
46
|
-
const response = await fetch('/api/
|
|
46
|
+
const response = await fetch('/api/diviswap', {
|
|
47
47
|
method: 'POST',
|
|
48
48
|
headers: { 'Content-Type': 'application/json' },
|
|
49
49
|
body: JSON.stringify({
|
|
@@ -59,7 +59,7 @@ export function use{{prefix}}Dashboard() {
|
|
|
59
59
|
|
|
60
60
|
const setDefaultAddress = async (data: { chain_id: number; address: string }) => {
|
|
61
61
|
if (!isAuthenticated || !customerId) throw new Error('Not authenticated');
|
|
62
|
-
const response = await fetch('/api/
|
|
62
|
+
const response = await fetch('/api/diviswap', {
|
|
63
63
|
method: 'POST',
|
|
64
64
|
headers: { 'Content-Type': 'application/json' },
|
|
65
65
|
body: JSON.stringify({
|
|
@@ -75,7 +75,7 @@ export function use{{prefix}}Dashboard() {
|
|
|
75
75
|
|
|
76
76
|
const deleteAddress = async (data: { chain_id: number; address: string }) => {
|
|
77
77
|
if (!isAuthenticated || !customerId) throw new Error('Not authenticated');
|
|
78
|
-
const response = await fetch('/api/
|
|
78
|
+
const response = await fetch('/api/diviswap', {
|
|
79
79
|
method: 'POST',
|
|
80
80
|
headers: { 'Content-Type': 'application/json' },
|
|
81
81
|
body: JSON.stringify({
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { useState } from 'react';
|
|
4
|
-
import {
|
|
5
|
-
import '@/components/
|
|
4
|
+
import { DiviswapKYC, DiviswapKYCModal } from '@/components/diviswap-kyc-wizard';
|
|
5
|
+
import '@/components/diviswap-kyc-wizard.css';
|
|
6
6
|
|
|
7
|
-
export default function
|
|
7
|
+
export default function DiviswapDemo() {
|
|
8
8
|
// Demo state
|
|
9
9
|
const [currentDemo, setCurrentDemo] = useState<'kyc-inline' | 'kyc-modal' | 'features'>('kyc-inline');
|
|
10
10
|
const [showKYCModal, setShowKYCModal] = useState(false);
|
|
@@ -29,7 +29,7 @@ export default function LiberExDemo() {
|
|
|
29
29
|
<div className="bg-white shadow">
|
|
30
30
|
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
31
31
|
<div className="flex justify-between items-center py-6">
|
|
32
|
-
<h1 className="text-2xl font-bold text-gray-900">
|
|
32
|
+
<h1 className="text-2xl font-bold text-gray-900">Diviswap KYC Wizard Demo</h1>
|
|
33
33
|
<div className="text-sm text-gray-600">
|
|
34
34
|
Ready-to-use KYC component
|
|
35
35
|
</div>
|
|
@@ -101,7 +101,7 @@ export default function LiberExDemo() {
|
|
|
101
101
|
</div>
|
|
102
102
|
|
|
103
103
|
<div className="max-w-4xl mx-auto">
|
|
104
|
-
<
|
|
104
|
+
<DiviswapKYC
|
|
105
105
|
onSuccess={handleKYCSuccess}
|
|
106
106
|
onError={handleKYCError}
|
|
107
107
|
theme="light"
|
|
@@ -132,7 +132,7 @@ export default function LiberExDemo() {
|
|
|
132
132
|
<h3 className="text-lg font-medium text-gray-900 mb-4">Integration Code</h3>
|
|
133
133
|
<div className="bg-gray-50 rounded-md p-4 text-left">
|
|
134
134
|
<pre className="text-sm text-gray-800 overflow-x-auto">
|
|
135
|
-
{`import {
|
|
135
|
+
{`import { DiviswapKYCModal } from '@/components/diviswap-kyc-wizard';
|
|
136
136
|
|
|
137
137
|
function MyComponent() {
|
|
138
138
|
const [showKYC, setShowKYC] = useState(false);
|
|
@@ -143,7 +143,7 @@ function MyComponent() {
|
|
|
143
143
|
Complete Verification
|
|
144
144
|
</button>
|
|
145
145
|
|
|
146
|
-
<
|
|
146
|
+
<DiviswapKYCModal
|
|
147
147
|
isOpen={showKYC}
|
|
148
148
|
onClose={() => setShowKYC(false)}
|
|
149
149
|
onSuccess={(result) => {
|
|
@@ -223,7 +223,7 @@ function MyComponent() {
|
|
|
223
223
|
<div className="mt-6 bg-gray-50 rounded p-3">
|
|
224
224
|
<p className="text-xs text-gray-600 mb-2">Custom theme example:</p>
|
|
225
225
|
<pre className="text-xs text-gray-800 overflow-x-auto">
|
|
226
|
-
{`<
|
|
226
|
+
{`<DiviswapKYC
|
|
227
227
|
theme={{
|
|
228
228
|
primaryColor: '#8B5CF6',
|
|
229
229
|
backgroundColor: '#F8FAFC',
|
|
@@ -261,7 +261,7 @@ function MyComponent() {
|
|
|
261
261
|
</div>
|
|
262
262
|
|
|
263
263
|
{/* KYC Modal */}
|
|
264
|
-
<
|
|
264
|
+
<DiviswapKYCModal
|
|
265
265
|
isOpen={showKYCModal}
|
|
266
266
|
onClose={() => setShowKYCModal(false)}
|
|
267
267
|
onSuccess={(result) => {
|