Files
MWClash/lib/fragments/profiles/add_profile.dart

121 lines
2.9 KiB
Dart
Raw Normal View History

2024-04-30 23:38:49 +08:00
import 'package:fl_clash/common/common.dart';
import 'package:fl_clash/pages/scan.dart';
import 'package:fl_clash/state.dart';
import 'package:fl_clash/widgets/widgets.dart';
import 'package:flutter/material.dart';
class AddProfile extends StatelessWidget {
final BuildContext context;
const AddProfile({
super.key,
required this.context,
});
2024-04-30 23:38:49 +08:00
_handleAddProfileFormFile() async {
globalState.appController.addProfileFormFile();
2024-04-30 23:38:49 +08:00
}
_handleAddProfileFormURL(String url) async {
globalState.appController.addProfileFormURL(url);
2024-04-30 23:38:49 +08:00
}
_toScan() async {
if (system.isDesktop) {
globalState.appController.addProfileFormQrCode();
return;
}
final url = await BaseNavigator.push(
context,
const ScanPage(),
);
2024-04-30 23:38:49 +08:00
if (url != null) {
WidgetsBinding.instance.addPostFrameCallback((_) {
_handleAddProfileFormURL(url);
});
2024-04-30 23:38:49 +08:00
}
}
_toAdd() async {
final url = await globalState.showCommonDialog<String>(
child: const URLFormDialog(),
);
if (url != null) {
_handleAddProfileFormURL(url);
}
}
@override
Widget build(context) {
return ListView(
children: [
ListItem(
leading: const Icon(Icons.qr_code_sharp),
title: Text(appLocalizations.qrcode),
subtitle: Text(appLocalizations.qrcodeDesc),
onTap: _toScan,
),
2024-04-30 23:38:49 +08:00
ListItem(
leading: const Icon(Icons.upload_file_sharp),
2024-04-30 23:38:49 +08:00
title: Text(appLocalizations.file),
subtitle: Text(appLocalizations.fileDesc),
onTap: _handleAddProfileFormFile,
2024-04-30 23:38:49 +08:00
),
ListItem(
leading: const Icon(Icons.cloud_download_sharp),
2024-04-30 23:38:49 +08:00
title: Text(appLocalizations.url),
subtitle: Text(appLocalizations.urlDesc),
onTap: _toAdd,
2024-04-30 23:38:49 +08:00
)
],
);
}
}
class URLFormDialog extends StatefulWidget {
const URLFormDialog({super.key});
@override
State<URLFormDialog> createState() => _URLFormDialogState();
}
class _URLFormDialogState extends State<URLFormDialog> {
final urlController = TextEditingController();
_handleAddProfileFormURL() async {
final url = urlController.value.text;
if (url.isEmpty) return;
Navigator.of(context).pop<String>(url);
}
@override
Widget build(BuildContext context) {
return CommonDialog(
title: appLocalizations.importFromURL,
actions: [
TextButton(
onPressed: _handleAddProfileFormURL,
child: Text(appLocalizations.submit),
)
],
child: SizedBox(
2024-04-30 23:38:49 +08:00
width: 300,
child: Wrap(
runSpacing: 16,
children: [
TextField(
maxLines: 5,
minLines: 1,
2024-04-30 23:38:49 +08:00
controller: urlController,
decoration: InputDecoration(
border: const OutlineInputBorder(),
labelText: appLocalizations.url,
),
),
],
),
),
);
}
}