दस्तावेज़

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';

इनिशियलाइज़ करें#

Respondo.navigatorKey को अपने MaterialApp से बाँधें ताकि SDK आपके BuildContext के बिना चैट शीट खोल सके, 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'),
          ),
        ),
      ),
    );
  }
}

सभी फ़साड मेथड idempotent हैं, init से पहले कॉल करने के लिए सुरक्षित हैं (वे बफ़र करके दोबारा चलाते हैं), और आपके ऐप में कभी थ्रो नहीं करते।

यूज़र्स की पहचान#

डिफ़ॉल्ट रूप से हर विज़िटर एनॉनिमस होता है। पहली बार लॉन्च पर SDK एक स्थिर visitor_id जनरेट करता है और उसे लोकल स्टोरेज में रखता है, ताकि लौटने वाला यूज़र अपनी बातचीत फिर से पा सके। एम्बेड करने के लिए कोई API key नहीं है — हर बातचीत को एक per-conversation session token से सुरक्षित किया जाता है जिसे backend बनाता है और हर मैसेज पर आगे सरका देता है, इसलिए एक एनॉनिमस विज़िटर को कभी दोबारा प्रमाणित नहीं होना पड़ता।

आपका यूज़र साइन-इन हो जाने पर identify को एक बार कॉल करें। यह उनकी असली पहचान जोड़ता है ताकि उनका इतिहास डिवाइसों और रीइंस्टॉल के आर-पार उनके साथ चले, और आपके इनबॉक्स में बातचीत के बगल में किसी एनॉनिमस विज़िटर के बजाय उनका नाम और ईमेल दिखे।

userHash एक सिग्नेचर है जिसे आपका backend एजेंट के identity_secret से गणना करता है — HMAC-SHA256(secret, userId) (या जब userId न हो तो ईमेल पर), लोअरकेस hex के रूप में एन्कोडेड। यह secret साबित करता है कि पहचान वास्तविक है, इसलिए इसे केवल आपके 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 / ईमेल जैसे हैं वैसे ही स्वीकार किए जाते हैं।

Observables और callbacks#

सब कुछ एक ब्रॉडकास्ट Stream, एक callback setter, और एक current-value getter के रूप में उपलब्ध है।

Dartdart
// unread counts की प्रतिक्रियात्मक स्ट्रीम (बैज के लिए)।
Respondo.unreadCountStream.listen((n) => setBadge(n));

// या एक callback setter।
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 के getting-started गाइड में शामिल हैं।