ਦਸਤਾਵੇਜ਼

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();

  // File storage directory comes from a host-app plugin; the SDK stays pure.
  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, // required so the SDK can open the chat
      home: Scaffold(
        body: Center(
          child: FilledButton(
            onPressed: () => Respondo.open(),
            child: const Text('Support'),
          ),
        ),
      ),
    );
  }
}

facade ਦੇ ਸਾਰੇ ਢੰਗ ਵਾਰ-ਵਾਰ ਸੱਦਣ ਉੱਤੇ ਵੀ ਓਹੀ ਨਤੀਜਾ ਦਿੰਦੇ ਹਨ, init ਤੋਂ ਪਹਿਲਾਂ ਸੱਦਣੇ ਵੀ ਸੁਰੱਖਿਅਤ ਹਨ (ਉਹ ਸਾਂਭ ਕੇ ਬਾਅਦ ਵਿੱਚ ਚਲਾ ਦਿੱਤੇ ਜਾਂਦੇ ਹਨ), ਅਤੇ ਇਹ ਕਦੇ ਤੁਹਾਡੀ ਐਪ ਵਿੱਚ ਕੋਈ ਗ਼ਲਤੀ ਨਹੀਂ ਸੁੱਟਦੇ।

ਵਰਤੋਂਕਾਰਾਂ ਦੀ ਪਛਾਣ#

ਮੂਲ ਰੂਪ ਵਿੱਚ ਹਰ ਵਿਜ਼ਿਟਰ ਗੁਮਨਾਮ ਹੁੰਦਾ ਹੈ। ਪਹਿਲੀ ਵਾਰ ਚੱਲਣ ਉੱਤੇ SDK ਇੱਕ ਪੱਕਾ visitor_id ਬਣਾਉਂਦਾ ਹੈ ਅਤੇ ਉਸ ਨੂੰ ਲੋਕਲ ਸਟੋਰੇਜ ਵਿੱਚ ਰੱਖਦਾ ਹੈ, ਤਾਂ ਜੋ ਮੁੜ ਆਉਣ ਵਾਲੇ ਵਰਤੋਂਕਾਰ ਨੂੰ ਆਪਣੀ ਗੱਲਬਾਤ ਦੁਬਾਰਾ ਲੱਭ ਜਾਵੇ। ਐਪ ਵਿੱਚ ਕੋਈ API ਕੁੰਜੀ ਪਾਉਣ ਦੀ ਲੋੜ ਨਹੀਂ — ਹਰ ਗੱਲਬਾਤ ਨੂੰ ਉਸ ਦਾ ਆਪਣਾ ਸੈਸ਼ਨ ਟੋਕਨ ਸੁਰੱਖਿਅਤ ਰੱਖਦਾ ਹੈ, ਜੋ backend ਬਣਾਉਂਦਾ ਹੈ ਅਤੇ ਹਰ ਸੁਨੇਹੇ ਨਾਲ ਅੱਗੇ ਵਧਾਉਂਦਾ ਰਹਿੰਦਾ ਹੈ; ਇਸ ਲਈ ਗੁਮਨਾਮ ਵਿਜ਼ਿਟਰ ਨੂੰ ਕਦੇ ਦੁਬਾਰਾ ਪਛਾਣ ਨਹੀਂ ਕਰਵਾਉਣੀ ਪੈਂਦੀ।

ਜਿਵੇਂ ਹੀ ਤੁਹਾਡਾ ਵਰਤੋਂਕਾਰ ਸਾਈਨ-ਇਨ ਕਰ ਲਵੇ, identify ਇੱਕ ਵਾਰ ਸੱਦੋ। ਇਸ ਨਾਲ ਉਸ ਦੀ ਅਸਲੀ ਪਛਾਣ ਜੁੜ ਜਾਂਦੀ ਹੈ: ਉਸ ਦਾ ਇਤਿਹਾਸ ਹਰ ਡਿਵਾਈਸ ਅਤੇ ਮੁੜ-ਇੰਸਟਾਲ ਮਗਰੋਂ ਵੀ ਨਾਲ ਰਹਿੰਦਾ ਹੈ, ਅਤੇ ਤੁਹਾਡੇ ਇਨਬਾਕਸ ਵਿੱਚ ਗੱਲਬਾਤ ਕੋਲ ਗੁਮਨਾਮ ਵਿਜ਼ਿਟਰ ਦੀ ਥਾਂ ਉਸ ਦਾ ਨਾਂ ਤੇ ਈਮੇਲ ਦਿਸਦਾ ਹੈ।

userHash ਉਹ ਦਸਤਖ਼ਤ ਹੈ ਜੋ ਤੁਹਾਡਾ backend ਏਜੰਟ ਦੇ identity_secret ਤੋਂ ਗਿਣਦਾ ਹੈ — HMAC-SHA256(secret, userId) (ਜਾਂ ਜਦੋਂ userId ਨਾ ਹੋਵੇ ਤਾਂ ਈਮੇਲ ਤੋਂ), ਛੋਟੇ ਅੱਖਰਾਂ ਵਾਲੇ hex ਵਿੱਚ। ਇਹ ਗੁਪਤ ਕੁੰਜੀ ਹੀ ਸਾਬਤ ਕਰਦੀ ਹੈ ਕਿ ਪਛਾਣ ਅਸਲੀ ਹੈ, ਇਸ ਲਈ ਇਹ ਸਿਰਫ਼ ਤੁਹਾਡੇ backend ਉੱਤੇ ਰਹਿਣੀ ਚਾਹੀਦੀ ਹੈ ਅਤੇ ਕਦੇ ਐਪ ਵਿੱਚ ਨਹੀਂ ਭੇਜੀ ਜਾਂਦੀ। ਪੂਰਾ ਫ਼ਾਰਮੂਲਾ ਅਤੇ ਸਰਵਰ ਵਾਲੀਆਂ ਮਿਸਾਲਾਂ Identity verification ਪੰਨੇ ਉੱਤੇ ਹਨ।

Dartdart
// 1. Sign in against your own backend and read the precomputed hash
//    (for example, a field returned alongside the login response).
final session = await api.login(email, password);

// 2. Hand the finished userHash to the SDK — never compute it in the app.
Respondo.identify(RespondoIdentity(
  userId: session.userId,
  email: session.email,
  name: session.fullName,
  userHash: session.respondoUserHash,
));

// 3. On logout: revoke the session and start a fresh anonymous visitor.
Respondo.reset();

ਜੇ hash ਗ਼ੈਰਹਾਜ਼ਰ ਜਾਂ ਗ਼ਲਤ ਹੋਵੇ ਤਾਂ ਕੋਈ ਗ਼ਲਤੀ ਨਹੀਂ ਸੁੱਟੀ ਜਾਂਦੀ: backend ਚੁੱਪਚਾਪ ਵਿਜ਼ਿਟਰ ਨੂੰ ਗੁਮਨਾਮ ਹੀ ਰੱਖਦਾ ਹੈ, ਚੈਟ ਚੱਲਦਾ ਰਹਿੰਦਾ ਹੈ, ਅਤੇ ਸਹੀ hash ਮਿਲਣ ਤੱਕ ਸਿਰਫ਼ ਡਿਵਾਈਸਾਂ ਵਿਚਲਾ ਜੋੜ ਟੁੱਟਿਆ ਰਹਿੰਦਾ ਹੈ। ਪੁਸ਼ਟੀ ਸਿਰਫ਼ ਉਦੋਂ ਹੁੰਦੀ ਹੈ ਜਦੋਂ ਏਜੰਟ ਲਈ identity_secret ਸੈੱਟ ਹੋਵੇ — ਵਿਕਾਸ ਦੌਰਾਨ ਇਸ ਨੂੰ ਖਾਲੀ ਛੱਡੋ, ਤਾਂ userId ਅਤੇ ਈਮੇਲ ਜਿਵੇਂ ਦੇ ਤਿਵੇਂ ਮੰਨ ਲਏ ਜਾਂਦੇ ਹਨ।

ਆਬਜ਼ਰਵੇਬਲ ਤੇ ਕਾਲਬੈਕ#

ਹਰ ਚੀਜ਼ ਤਿੰਨ ਰੂਪਾਂ ਵਿੱਚ ਮਿਲਦੀ ਹੈ: ਬਰਾਡਕਾਸਟ Stream, ਕਾਲਬੈਕ ਸੈੱਟਰ, ਅਤੇ ਮੌਜੂਦਾ ਕੀਮਤ ਵਾਲਾ ਗੈੱਟਰ।

Dartdart
// Reactive stream of unread counts (for a badge).
Respondo.unreadCountStream.listen((n) => setBadge(n));

// Or a callback setter.
Respondo.onUnreadChanged = (n) => setBadge(n);

// Intercept links/CTAs; return true if the host opened the URL itself.
Respondo.onUrlRequested = (url) {
  openInAppBrowser(url);
  return true;
};

ਸਕਰੀਨ ਟਰੈਕਿੰਗ#

ਹਰ ਨੈਵੀਗੇਸ਼ਨ ਉੱਤੇ ਮੌਜੂਦਾ ਸਕਰੀਨ ਦੀ ਸੂਚਨਾ ਦਿਓ, ਤਾਂ ਜੋ ਪਹਿਲ ਕਰਨ ਵਾਲੇ ਟੀਜ਼ਰ ਅਤੇ ਪੰਨਾ-ਪੱਧਰੀ ਟਾਰਗੇਟਿੰਗ ਇਸ ਨਾਲ ਮੇਲ ਕਰ ਸਕਣ। ਖ਼ਾਲੀ ਕਰਨ ਲਈ null ਭੇਜੋ; ਹਰ ਬਦਲਾਅ ਉੱਤੇ ਨਵੀਂ ਸਕਰੀਨ ਲਈ ਪਹਿਲ ਕਰਨ ਵਾਲਾ ਟੀਜ਼ਰ ਮੁੜ ਪਰਖਿਆ ਜਾਂਦਾ ਹੈ।

Dartdart
Respondo.setCurrentScreen('pricing');

ਅੱਗੇ ਦੇ ਕਦਮ#

Push notifications ਅਤੇ Identity verification ਜੋੜੋ। ਪੂਰੀ API ਸਤ੍ਹਾ, ਜੁੜਾਅ ਵਾਲੀਆਂ ਸਤ੍ਹਾਵਾਂ ਅਤੇ ਸਮੱਸਿਆਵਾਂ ਦਾ ਹੱਲ Flutter SDK ਦੀ ਸ਼ੁਰੂਆਤੀ ਗਾਈਡ ਵਿੱਚ ਦਿੱਤੇ ਹਨ, ਜੋ pub.dev ਪੈਕੇਜ ਪੰਨੇ ਉੱਤੇ ਹੈ।