Repository navigation
Expand file tree
/
Copy pathcloud-api-buttons.ts
More file actions
256 lines (233 loc) · 7.19 KB
/
Copy pathcloud-api-buttons.ts
File metadata and controls
256 lines (233 loc) · 7.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
/**
* Example: CloudAPIProvider with Interactive Buttons
*
* Demonstrates how to use Meta's WhatsApp Cloud API to send
* interactive button messages through WaSP.
*
* Requirements:
* - Meta WhatsApp Business Account
* - Access token from Meta Business Manager
* - Phone Number ID from WhatsApp Cloud API
*/
import { WaSP } from '../src/index.js';
async function main() {
// Create WaSP instance with Cloud API as default provider
const wasp = new WaSP({
defaultProvider: 'CLOUD_API',
debug: true,
});
try {
// Create session with Cloud API provider
const session = await wasp.createSession('cloud-session-1', 'CLOUD_API', {
accessToken: process.env.META_ACCESS_TOKEN || 'YOUR_ACCESS_TOKEN',
phoneNumberId: process.env.META_PHONE_NUMBER_ID || '123456789012345',
webhookVerifyToken: 'my-secret-verify-token',
});
console.log('✓ Session created:', session.id);
console.log('✓ Phone number:', session.phone);
// Listen for events
wasp.on('MESSAGE_RECEIVED', (event) => {
console.log('📩 Received message:', event.data);
});
wasp.on('MESSAGE_SENT', (event) => {
console.log('✉️ Sent message:', event.data);
});
// Example 1: Simple text message
console.log('\n--- Example 1: Text Message ---');
await wasp.sendMessage(
'cloud-session-1',
'15551234567',
'Hello! This is a text message from Cloud API.',
{ immediate: true }
);
// Example 2: Interactive button message
console.log('\n--- Example 2: Button Message ---');
await wasp.sendMessage(
'cloud-session-1',
'15551234567',
{
type: 'interactive',
interactive: {
type: 'button',
body: { text: 'Would you like to continue?' },
footer: { text: 'Powered by WaSP' },
action: {
buttons: [
{ type: 'reply', reply: { id: 'yes', title: 'Yes, continue' } },
{ type: 'reply', reply: { id: 'no', title: 'No, cancel' } },
],
},
},
},
{ immediate: true }
);
// Example 3: Button message with header
console.log('\n--- Example 3: Button with Header ---');
await wasp.sendMessage(
'cloud-session-1',
'15551234567',
{
type: 'interactive',
interactive: {
type: 'button',
header: {
type: 'text',
text: '🎉 Special Offer!',
},
body: { text: 'Get 50% off your first purchase. Interested?' },
footer: { text: 'Offer expires in 24 hours' },
action: {
buttons: [
{ type: 'reply', reply: { id: 'claim', title: 'Claim Offer' } },
{ type: 'reply', reply: { id: 'later', title: 'Remind me later' } },
{ type: 'reply', reply: { id: 'skip', title: 'Not interested' } },
],
},
},
},
{ immediate: true }
);
// Example 4: List message
console.log('\n--- Example 4: List Message ---');
await wasp.sendMessage(
'cloud-session-1',
'15551234567',
{
type: 'interactive',
interactive: {
type: 'list',
header: {
type: 'text',
text: 'Our Menu',
},
body: { text: 'Select your favorite dish' },
footer: { text: 'All items freshly prepared' },
action: {
button: 'View Menu',
sections: [
{
title: 'Main Dishes',
rows: [
{ id: 'pizza', title: 'Pizza Margherita', description: 'Classic Italian pizza - R89' },
{ id: 'burger', title: 'Beef Burger', description: 'Juicy angus beef - R75' },
{ id: 'pasta', title: 'Pasta Carbonara', description: 'Creamy pasta - R82' },
],
},
{
title: 'Desserts',
rows: [
{ id: 'cake', title: 'Chocolate Cake', description: 'Rich chocolate - R45' },
{ id: 'icecream', title: 'Ice Cream', description: 'Vanilla/Chocolate - R35' },
],
},
],
},
},
},
{ immediate: true }
);
// Example 5: Location message
console.log('\n--- Example 5: Location Message ---');
await wasp.sendMessage(
'cloud-session-1',
'15551234567',
{
type: 'location',
location: {
latitude: -33.9249,
longitude: 18.4241,
name: 'Table Mountain',
address: 'Cape Town, South Africa',
},
},
{ immediate: true }
);
// Example 6: Template message (requires pre-approved template)
console.log('\n--- Example 6: Template Message ---');
await wasp.sendMessage(
'cloud-session-1',
'15551234567',
{
type: 'template',
template: {
name: 'welcome_message',
language: { code: 'en' },
components: [
{
type: 'body',
parameters: [
{ type: 'text', text: 'John' }, // Replace {{1}} in template
],
},
],
},
},
{ immediate: true }
);
// Example 7: Contact message
console.log('\n--- Example 7: Contact Message ---');
await wasp.sendMessage(
'cloud-session-1',
'15551234567',
{
type: 'contacts',
contacts: [
{
name: {
formatted_name: 'John Doe',
first_name: 'John',
last_name: 'Doe',
},
phones: [
{ phone: '+27821234567', type: 'MOBILE' },
{ phone: '+27215551234', type: 'WORK' },
],
emails: [{ email: 'john.doe@example.com', type: 'WORK' }],
},
],
},
{ immediate: true }
);
console.log('\n✓ All examples sent successfully!');
// Keep process alive to receive messages
console.log('\n🔄 Listening for incoming messages... (Ctrl+C to exit)');
// Handle incoming webhooks
// In a real application, you would set up an Express server:
/*
import express from 'express';
import { CloudAPIProvider } from '@wasp/core';
const app = express();
app.use(express.json());
// Webhook verification
app.get('/webhook', (req, res) => {
const challenge = CloudAPIProvider.verifyWebhook(req, 'my-secret-verify-token');
if (challenge) {
res.send(challenge);
} else {
res.sendStatus(403);
}
});
// Webhook receiver
app.post('/webhook', (req, res) => {
const messages = CloudAPIProvider.parseWebhook(req.body);
for (const message of messages) {
wasp.emit('MESSAGE_RECEIVED', {
type: 'MESSAGE_RECEIVED',
sessionId: 'cloud-session-1',
timestamp: new Date(),
data: message,
});
}
res.sendStatus(200);
});
app.listen(3000, () => console.log('Webhook server listening on port 3000'));
*/
} catch (error) {
console.error('❌ Error:', error);
process.exit(1);
}
}
// Run example
if (import.meta.url === `file://${process.argv[1]}`) {
main().catch(console.error);
}