showDeviceRegistration method

Future<void> showDeviceRegistration()

Implementation

Future<void> showDeviceRegistration() async {
  final context = navigatorKey.currentContext;
  if (!_active || !_foreground || isPresentingUi || context == null) return;
  _deviceDialogOpen = true;
  final pairingPoll = Timer.periodic(const Duration(seconds: 5), (_) {
    if (_active) unawaited(deviceRegistration.refresh());
  });
  _notifyUi();
  try {
    if (deviceRegistration.credential == null ||
        deviceRegistration.status == 'expired') {
      unawaited(deviceRegistration.requestCode());
    } else {
      unawaited(deviceRegistration.refresh());
    }
    final registrationRoute = MaterialPageRoute<void>(
      settings: _ReporterRouteSettings(this),
      builder: (_) => Scaffold(
        appBar: AppBar(title: const Text('Connect this device')),
        body: AnimatedBuilder(
          animation: deviceRegistration,
          builder: (context, _) => Padding(
            padding: const EdgeInsets.all(24),
            child: ListView(
              children: [
                Text('App: ${config.recipient}'),
                const Text(
                  'Ask your workspace administrator to approve this app installation.',
                ),
                const SizedBox(height: 24),
                Text(
                  deviceRegistration.approved
                      ? 'Device approved'
                      : deviceRegistration.status == 'approved'
                      ? 'Approval check needed'
                      : 'Status: ${deviceRegistration.status}',
                  style: Theme.of(context).textTheme.titleLarge,
                ),
                if (deviceRegistration.code != null)
                  SelectableText(
                    deviceRegistration.code!,
                    style: Theme.of(context).textTheme.headlineLarge,
                  ),
                if (deviceRegistration.code != null)
                  const Text(
                    'In the web console, choose this app → Devices → Connect device. Codes expire after 10 minutes.',
                  ),
                if (deviceRegistration.error != null)
                  Text(deviceRegistration.error!),
                const SizedBox(height: 24),
                FilledButton(
                  onPressed: () async {
                    await deviceRegistration.requestCode();
                  },
                  child: const Text('Refresh connection'),
                ),
                if (deviceRegistration.approved)
                  TextButton(
                    onPressed: () => Navigator.pop(context),
                    child: const Text('Done'),
                  ),
              ],
            ),
          ),
        ),
      ),
    );
    _deviceRoute = registrationRoute;
    await Navigator.of(context).push(registrationRoute);
    await registrationRoute.completed;
  } finally {
    pairingPoll.cancel();
    _deviceRoute = null;
    _deviceDialogOpen = false;
    _notifyUi();
  }
}