connect_x_mobile_sdk 1.1.11 copy "connect_x_mobile_sdk: ^1.1.11" to clipboard
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()),
      ),
    );
  }
}