connect_x_mobile_sdk 1.1.11
connect_x_mobile_sdk: ^1.1.11 copied to clipboard
ConnectX Mobile SDK for Mobile.
example/lib/main.dart
import 'package:connect_x_mobile_sdk/connect_x_mobile_sdk.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await ConnectXMobileSdk.initialize(
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImNvbm5lY3R4LmRldkBnbWFpbC5jb20iLCJ1c2VySWQiOiJuQ0VxVXhrcFJ3VmxxV1hSaWpBWSIsInN1YiI6Im5DRXFVeGtwUndWbHFXWFJpakFZIiwib3JnYW5pemVJZCI6IjAwMDBPcmdSQW5kRENvbm5lY3RYIiwic3RheUxvZ2luIjpmYWxzZSwiY3VzdG9tVG9rZW4iOiJleUpoYkdjaU9pSlNVekkxTmlJc0luUjVjQ0k2SWtwWFZDSjkuZXlKaGRXUWlPaUpvZEhSd2N6b3ZMMmxrWlc1MGFYUjVkRzl2Ykd0cGRDNW5iMjluYkdWaGNHbHpMbU52YlM5bmIyOW5iR1V1YVdSbGJuUnBkSGt1YVdSbGJuUnBkSGwwYjI5c2EybDBMbll4TGtsa1pXNTBhWFI1Vkc5dmJHdHBkQ0lzSW1saGRDSTZNVGN6TmpRNE9UZzFOeXdpWlhod0lqb3hOek0yTkRrek5EVTNMQ0pwYzNNaU9pSm1hWEpsWW1GelpTMWhaRzFwYm5Oa2F5MW5aek00TWtCamIyNXVaV04wTFhndGNISnZaSFZqZEdsdmJpNXBZVzB1WjNObGNuWnBZMlZoWTJOdmRXNTBMbU52YlNJc0luTjFZaUk2SW1acGNtVmlZWE5sTFdGa2JXbHVjMlJyTFdkbk16Z3lRR052Ym01bFkzUXRlQzF3Y205a2RXTjBhVzl1TG1saGJTNW5jMlZ5ZG1salpXRmpZMjkxYm5RdVkyOXRJaXdpZFdsa0lqb2lZMjl1Ym1WamRIZ3VaR1YyUUdkdFlXbHNMbU52YlNJc0ltTnNZV2x0Y3lJNmV5SnZjbWRKWkNJNklqQXdNREJQY21kU1FXNWtSRU52Ym01bFkzUllJbjE5LlN5b3hzZjRqUlh1RkxOM2laa2ZBSDlOdGJKRGpFd3EwdWpkV3d5ZHE1cnQ4a1JCTlZncFQwWjVSX3VpSENZWXFSVVlDeFJTZjlSWmlEd0JZR3padGR4dFEweXhPd05zTVhGYVludHhidTFmQXBKLVIySW5pOHRTdjJ4U2RrSmVIMml4aHR4ajY5R29zbV9CUWM3Q2FWOVpQX0VlZnlGUmk3UklRN1pNNTVfZG9RSnM5NnRWTDNsUXROemtZS3owMVBZbEhLeTB4YzFoXzZlS3V2UEJPQW9KX1RpdjRZTHM3VW5KbmpVNGpOUktLS29Ud2VUZk1qeU10ejc5SEo1d0loeDRsM3VuUGwzQzkxcFhYVFU1N2dnSGtvMUVMNEFLbUc2SjVaRERzd19GUUstajdlMVBQYkNSTkRsTUhVd0FaNGNNMGp0ZHpzc3M4ZUduTHBwZzBfZyIsImltYWdlIjoiaHR0cHM6Ly9maXJlYmFzZXN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vdjAvYi9jb25uZWN0LXgtcHJvZHVjdGlvbi5hcHBzcG90LmNvbS9vL1VzZXJzJTJGbkNFcVV4a3BSd1ZscVdYUmlqQVklMkZVc2Vyc19uQ0VxVXhrcFJ3VmxxV1hSaWpBWV8yOTIxODc2MDVfNDU2NjExMDA5ODAwMzIxXzMxNjkxNDIxMTEzNzM1NTkwMzlfbi5qcGVnP2FsdD1tZWRpYSZ0b2tlbj0zZWU4M2NkOC01OTdmLTQyZWQtOGQyNy04NDk2NzM1ZTQ4ZjkiLCJkaXNwbGF5TmFtZSI6IlN1cGVyIEFkbWluIPCfjoPwn5G7IiwiYXBwSWQiOiIxMjMxMjNhc2Rhc2Rhc2QiLCJpYXQiOjE3MzY0OTIwODEsImV4cCI6MzE3MjgwOTM0NDgxfQ.E_Bh36PXkJ61dLp31AX4vD91OYDl3R37FzS3qFFqMrI',
'0000OrgRAndDConnectX',
);
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'ConnectX SDK Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
useMaterial3: true,
),
// --- กำหนด Routes เพื่อให้ SDK ดึงชื่อไปใช้ใน cx_link ---
initialRoute: '/',
routes: {
'/': (context) => const MainMenuPage(),
'/open-ticket': (context) => const OpenTicketPage(),
},
);
}
}
// --- FIRST PAGE: MENU ---
class MainMenuPage extends StatelessWidget {
const MainMenuPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.primaryContainer,
title: const Text('ConnectX SDK Menu'),
),
body: ListView(
padding: const EdgeInsets.all(16),
children: [
Card(
child: ListTile(
leading:
const Icon(Icons.confirmation_number, color: Colors.blue),
title: const Text('Open Ticket'),
subtitle: const Text('Submit a new ticket to CX system'),
trailing: const Icon(Icons.arrow_forward_ios, size: 16),
onTap: () async {
// เมื่อเรียกตัวนี้ cx_link จะได้ค่าเป็น "/"
await ConnectXMobileSdk.cxTracking({
'cx_title': 'Press Open Ticket Menu',
'cx_event': 'go to open ticket menu',
});
// เปลี่ยนมาใช้ pushNamed
Navigator.pushNamed(context, '/open-ticket');
},
),
),
],
),
);
}
}
// --- SECOND PAGE: FORM ---
class OpenTicketPage extends StatefulWidget {
const OpenTicketPage({super.key});
@override
State<OpenTicketPage> createState() => _OpenTicketPageState();
}
class _OpenTicketPageState extends State<OpenTicketPage> {
final _nameController = TextEditingController();
final _email1Controller =
TextEditingController(text: 'tester.cnw001@gmail.com');
final _email2Controller = TextEditingController();
final _contentController = TextEditingController();
void _submitTicket() async {
// เมื่อเรียกตัวนี้ cx_link จะได้ค่าเป็น "/open-ticket" โดยอัตโนมัติ
await ConnectXMobileSdk.cxTracking({
'cx_title': 'Open Ticket from Mobile SDK',
'cx_event': 'submit_ticket',
});
await ConnectXMobileSdk.cxOpenTicket({
'key': 'cx_Name',
'customers': {
'cx_Name': _nameController.text,
'cx_email': _email2Controller.text,
},
'ticket': {
'cx_subject': 'test email',
'email': {
'text': 'from mobile app',
'html': '<b>${_contentController.text}</b>'
},
},
'lead': {
'cx_email': 'xxxx@hotmail.com',
'cx_channel': 'test_connect_email',
},
});
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Ticket submitted successfully!')),
);
Navigator.pop(context);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("Create Ticket")),
body: SingleChildScrollView(
padding: const EdgeInsets.all(20.0),
child: Column(
children: [
_buildTextField(_nameController, "Customer Name"),
_buildTextField(_email1Controller, "Email (Agent)"),
_buildTextField(_email2Controller, "Email (Customer)"),
_buildTextField(_contentController, "Message Content", maxLines: 4),
const SizedBox(height: 30),
ElevatedButton(
style: ElevatedButton.styleFrom(
minimumSize: const Size.fromHeight(55),
backgroundColor: Colors.blue,
foregroundColor: Colors.white,
),
onPressed: _submitTicket,
child: const Text("SUBMIT TICKET"),
),
],
),
),
);
}
Widget _buildTextField(TextEditingController controller, String label,
{int maxLines = 1}) {
return Padding(
padding: const EdgeInsets.only(bottom: 15),
child: TextField(
controller: controller,
maxLines: maxLines,
decoration: InputDecoration(
labelText: label, border: const OutlineInputBorder()),
),
);
}
}