qriib_meet 0.2.0 copy "qriib_meet: ^0.2.0" to clipboard
qriib_meet: ^0.2.0 copied to clipboard

Qriib Flutter room management and embedded meeting APIs.

example/lib/main.dart

import 'package:flutter/material.dart';
import 'package:qriib_meet/qriib_meet.dart';

const _apiKey = String.fromEnvironment('QRIIB_API_KEY');
const _secretKey = String.fromEnvironment('QRIIB_SECRET_KEY');
const _finalLink = String.fromEnvironment('QRIIB_FINAL_LINK');

void main() => runApp(const QriibMeetExampleApp());

class QriibMeetExampleApp extends StatelessWidget {
  const QriibMeetExampleApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Qriib Meet Example',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: const Color(0xFF6750A4)),
        useMaterial3: true,
      ),
      home: const _JoinPage(),
    );
  }
}

class _JoinPage extends StatefulWidget {
  const _JoinPage();

  @override
  State<_JoinPage> createState() => _JoinPageState();
}

class _JoinPageState extends State<_JoinPage> {
  late final QriibMeetClient _client = QriibMeetClient.withProjectCredentials(
    apiKey: _apiKey,
    secretKey: _secretKey,
    enableNetworkLogging: false,
  );

  bool _joining = false;

  bool get _isConfigured =>
      _apiKey.isNotEmpty && _secretKey.isNotEmpty && _finalLink.isNotEmpty;

  Future<void> _join() async {
    if (!_isConfigured || _joining) return;
    setState(() => _joining = true);

    try {
      await _client.meetings.join(context: context, finalLink: _finalLink);
    } on QriibMeetException {
      if (mounted) {
        ScaffoldMessenger.of(context).showSnackBar(
          const SnackBar(content: Text('Unable to join the Qriib meeting.')),
        );
      }
    } finally {
      if (mounted) setState(() => _joining = false);
    }
  }

  @override
  void dispose() {
    _client.close();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Qriib Meet')),
      body: Center(
        child: Padding(
          padding: const EdgeInsets.all(24),
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              Text(
                _isConfigured
                    ? 'Ready to join with the public qriib_meet API.'
                    : 'Provide QRIIB_API_KEY, QRIIB_SECRET_KEY, and a fresh '
                          'QRIIB_FINAL_LINK with secure dart-defines.',
                textAlign: TextAlign.center,
              ),
              const SizedBox(height: 24),
              FilledButton.icon(
                onPressed: _isConfigured && !_joining ? _join : null,
                icon: _joining
                    ? const SizedBox.square(
                        dimension: 18,
                        child: CircularProgressIndicator(strokeWidth: 2),
                      )
                    : const Icon(Icons.video_call_outlined),
                label: const Text('Join meeting'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}