import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:gap/gap.dart'; import 'package:liteauthconfig/l10n/app_localizations.dart'; import 'package:liteauthconfig/models/appconfig.dart'; import 'package:liteauthconfig/pages/qrscanner.dart'; import 'package:mobile_scanner/mobile_scanner.dart'; import 'package:qr_flutter/qr_flutter.dart'; class TokenInfo extends StatefulWidget { final int deviceIndex; final String token; const TokenInfo(this.deviceIndex, this.token, {super.key}); @override State createState() => _TokenInfoState(); } class _TokenInfoState extends State { TextEditingController tokenController = TextEditingController(); bool showToken = false; @override void initState() { tokenController.text = widget.token; super.initState(); } Future saveToken() async { final appLocal = AppLocalizations.of(context)!; var config = AppConfig(); config.devices[widget.deviceIndex].token = tokenController.text; await config.save(); if (mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(appLocal.saved)), ); } } Future scanQrCode() async { var code = await Navigator.push( context, MaterialPageRoute(builder: (ctx) => QRScanner()), ); var value = code?.barcodes.first.rawValue; if (code == null || value == null) return; tokenController.text = value; await saveToken(); } @override Widget build(BuildContext context) { final appLocal = AppLocalizations.of(context)!; return Scaffold( appBar: AppBar(title: Text(appLocal.token)), body: SingleChildScrollView( child: Padding( padding: EdgeInsetsGeometry.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(appLocal.viewTokenWarn), Row( children: [ Checkbox.adaptive( semanticLabel: appLocal.showToken, value: showToken, onChanged: (newValue) { setState(() { showToken = newValue!; }); }, ), Text(appLocal.showToken), ], ), Visibility( visible: showToken, child: Center( child: Column( children: [ Visibility( visible: tokenController.text.isNotEmpty, replacement: Text(appLocal.tokenNotFound), child: Column( children: [ SizedBox.square( dimension: 200, child: QrImageView( data: tokenController.text, backgroundColor: Colors.white, padding: EdgeInsets.all(16), ), ), Gap(16), OutlinedButton( onPressed: () async { await Clipboard.setData( ClipboardData(text: tokenController.text), ); ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(appLocal.copied)), ); }, child: Row( mainAxisSize: MainAxisSize.min, children: [ const Icon(Icons.copy), Gap(8), Text(appLocal.copyToken), ], ), ), ], ), ), Gap(16), TextField( controller: tokenController, decoration: InputDecoration( border: OutlineInputBorder(), labelText: appLocal.token, suffixIcon: IconButton( onPressed: Platform.isLinux || Platform.isWindows ? null : scanQrCode, icon: const Icon(Icons.qr_code_scanner), ), ), onChanged: (newValue) { setState(() {}); }, ), Gap(16), FilledButton( onPressed: tokenController.text == widget.token ? null : saveToken, child: Text(appLocal.saveToken), ), ], ), ), ), ], ), ), ), ); } }