ডকুমেন্টেশন

Flutter SDK

Respondo সহায়তা-চ্যাটের জন্য বিশুদ্ধ Dart ক্লায়েন্ট — কম্পাইল বা ডিবাগ করার মতো কোনো নেটিভ প্ল্যাটফর্ম কোড নেই।

প্রয়োজনীয়তা#

  • Dart >=3.4.0 <4.0.0।
  • Flutter >=3.16.0 (3.x ধারা)।
  • বিশুদ্ধ Dart: কোনো নেটিভ ব্রিজ নেই, কোনো pod install নেই, Gradle-এ কোনো সম্পাদনা নেই। ট্রানজিটিভ নির্ভরতাগুলো সাধারণ Dart প্যাকেজ (http, web_socket_channel, uuid)।

ইনস্টলেশন#

প্যাকেজটি যোগ করুন pub.dev থেকে:

pubspec.yamlyaml
dependencies:
  respondo_sdk: ^0.1.2
Dartdart
import 'package:respondo_sdk/respondo_sdk.dart';

চালু করা#

আপনার MaterialApp-এ Respondo.navigatorKey যুক্ত করুন, যাতে আপনার BuildContext ছাড়াই SDK চ্যাট শিট খুলতে পারে; একবার Respondo.init ডাকুন, তারপর Respondo.open()।

main.dartdart
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:respondo_sdk/respondo_sdk.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // ফাইল স্টোরেজের ডিরেক্টরি আসে হোস্ট অ্যাপের প্লাগইন থেকে; SDK নিজে বিশুদ্ধ থাকে।
  final dir = await getApplicationSupportDirectory();

  await Respondo.init(
    RespondoConfig(
      agentId: '<agent-uuid>',
      channelId: '<channel-uuid>',
      storageDirectory: dir.path,
    ),
  );

  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorKey: Respondo.navigatorKey, // চ্যাট খোলার জন্য SDK-র এটি দরকার
      home: Scaffold(
        body: Center(
          child: FilledButton(
            onPressed: () => Respondo.open(),
            child: const Text('Support'),
          ),
        ),
      ),
    );
  }
}

ফ্যাসাডের সব মেথড আইডেমপোটেন্ট, init-এর আগেও নিরাপদে ডাকা যায় (সেগুলো জমা রেখে পরে চালিয়ে দেয়) এবং কখনোই আপনার অ্যাপে এক্সেপশন ছুড়ে দেয় না।

ব্যবহারকারী শনাক্ত করা#

ডিফল্টভাবে প্রতিটি দর্শনার্থী বেনামি। প্রথমবার চালু হলে SDK একটি স্থিতিশীল visitor_id তৈরি করে লোকাল স্টোরেজে রাখে, ফলে ফিরে আসা ব্যবহারকারী নিজের কথোপকথন আবার খুঁজে পান। অ্যাপে কোনো API কি বসাতে হয় না — প্রতিটি কথোপকথন সুরক্ষিত থাকে কথোপকথন-ভিত্তিক একটি সেশন টোকেন দিয়ে, যা backend তৈরি করে এবং প্রতিটি বার্তায় এগিয়ে নেয়; তাই বেনামি দর্শনার্থীকে কখনো নতুন করে প্রমাণীকরণ করতে হয় না।

ব্যবহারকারী সাইন ইন করার পরে একবার identify ডাকুন। এতে তাঁর আসল পরিচয় যুক্ত হয়, ফলে ডিভাইস বদলালে বা অ্যাপ আবার ইনস্টল করলেও তাঁর ইতিহাস সঙ্গে যায়, আর আপনার inbox-এ কথোপকথনের পাশে বেনামি দর্শনার্থীর বদলে তাঁর নাম ও ইমেইল দেখা যায়।

userHash হলো এমন একটি স্বাক্ষর, যা আপনার backend এজেন্টের identity_secret থেকে হিসাব করে — HMAC-SHA256(secret, userId) (userId না থাকলে ইমেইল), ছোট হাতের হেক্স হিসেবে এনকোড করা। এই সিক্রেটই প্রমাণ করে পরিচয়টি আসল, তাই এটি কেবল আপনার backend-এ থাকতে হবে এবং কখনো অ্যাপের সঙ্গে পাঠানো যাবে না। পুরো সূত্র ও সার্ভার-সাইড উদাহরণের জন্য পরিচয় যাচাই পৃষ্ঠাটি দেখুন।

Dartdart
// 1. নিজের backend-এ সাইন ইন করান এবং আগে থেকে হিসাব করা হ্যাশটি পড়ুন
//    (যেমন, লগইনের উত্তরের সঙ্গে ফেরত আসা একটি ফিল্ড)।
final session = await api.login(email, password);

// 2. তৈরি userHash SDK-কে দিন — কখনোই অ্যাপের ভিতরে এটি হিসাব করবেন না।
Respondo.identify(RespondoIdentity(
  userId: session.userId,
  email: session.email,
  name: session.fullName,
  userHash: session.respondoUserHash,
));

// 3. লগআউটের সময়: সেশনটি বাতিল করুন এবং নতুন বেনামি দর্শনার্থী শুরু করুন।
Respondo.reset();

হ্যাশ না থাকলে বা ভুল হলে কিছুই ভেঙে পড়ে না: backend চুপচাপ দর্শনার্থীকে বেনামি রেখে দেয়, চ্যাট আগের মতোই চলে, শুধু বৈধ হ্যাশ না দেওয়া পর্যন্ত ডিভাইসের মধ্যেকার যোগসূত্রটি থাকে না। যাচাই তখনই চলে, যখন এজেন্টের identity_secret সেট করা থাকে — ডেভেলপমেন্টের সময় এটি খালি রাখুন, তাহলে userId / ইমেইল যেমন আছে তেমনই গ্রহণ করা হয়।

অবজারভেবল ও কলব্যাক#

সবকিছুই পাওয়া যায় ব্রডকাস্ট Stream হিসেবে, কলব্যাক সেটার হিসেবে এবং বর্তমান মান পাওয়ার গেটার হিসেবে।

Dartdart
// অপঠিত বার্তার সংখ্যার রিঅ্যাকটিভ স্ট্রিম (ব্যাজের জন্য)।
Respondo.unreadCountStream.listen((n) => setBadge(n));

// অথবা একটি কলব্যাক সেটার।
Respondo.onUnreadChanged = (n) => setBadge(n);

// লিঙ্ক/CTA ইন্টারসেপ্ট করুন; হোস্ট নিজেই URL খুলে থাকলে true ফেরত দিন।
Respondo.onUrlRequested = (url) {
  openInAppBrowser(url);
  return true;
};

স্ক্রিন ট্র্যাকিং#

প্রতিটি নেভিগেশনে বর্তমান স্ক্রিনটি জানান, যাতে প্রোঅ্যাকটিভ টিজার ও পেজ-স্তরের টার্গেটিং সেটির সঙ্গে মেলাতে পারে। মুছতে null পাঠান; প্রতিবার বদলালে নতুন স্ক্রিনের জন্য প্রোঅ্যাকটিভ টিজার আবার মূল্যায়ন করা হয়।

Dartdart
Respondo.setCurrentScreen('pricing');

পরবর্তী ধাপ#

পুশ নোটিফিকেশন ও পরিচয় যাচাই যোগ করুন। পুরো API, এনগেজমেন্টের সব সারফেস ও সমস্যা সমাধানের নির্দেশনা আছে pub.dev প্যাকেজ পৃষ্ঠার Flutter SDK শুরু-করার গাইডে।