Add connections page Add search in connections, requests Add keyword search in connections, requests, logs Add basic viewing editing capabilities Optimize update profile
177 lines
5.1 KiB
Dart
177 lines
5.1 KiB
Dart
import 'package:fl_clash/common/common.dart';
|
|
import 'package:fl_clash/enum/enum.dart';
|
|
import 'package:fl_clash/models/models.dart';
|
|
import 'package:fl_clash/state.dart';
|
|
import 'package:fl_clash/widgets/widgets.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:provider/provider.dart';
|
|
|
|
class EditProfile extends StatefulWidget {
|
|
final Profile profile;
|
|
final BuildContext context;
|
|
|
|
const EditProfile({
|
|
super.key,
|
|
required this.context,
|
|
required this.profile,
|
|
});
|
|
|
|
@override
|
|
State<EditProfile> createState() => _EditProfileState();
|
|
}
|
|
|
|
class _EditProfileState extends State<EditProfile> {
|
|
late TextEditingController labelController;
|
|
late TextEditingController urlController;
|
|
late TextEditingController autoUpdateDurationController;
|
|
late bool autoUpdate;
|
|
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
labelController = TextEditingController(text: widget.profile.label);
|
|
urlController = TextEditingController(text: widget.profile.url);
|
|
autoUpdate = widget.profile.autoUpdate;
|
|
autoUpdateDurationController = TextEditingController(
|
|
text: widget.profile.autoUpdateDuration.inMinutes.toString(),
|
|
);
|
|
}
|
|
|
|
_handleConfirm() {
|
|
if (!_formKey.currentState!.validate()) return;
|
|
final config = widget.context.read<Config>();
|
|
final profile = widget.profile.copyWith(
|
|
url: urlController.text,
|
|
label: labelController.text,
|
|
autoUpdate: autoUpdate,
|
|
autoUpdateDuration: Duration(
|
|
minutes: int.parse(
|
|
autoUpdateDurationController.text,
|
|
),
|
|
),
|
|
);
|
|
final hasUpdate = widget.profile.url != profile.url;
|
|
config.setProfile(profile);
|
|
if (hasUpdate) {
|
|
globalState.homeScaffoldKey.currentState?.loadingRun(
|
|
() async {
|
|
if (hasUpdate) {
|
|
await globalState.appController.updateProfile(profile);
|
|
}
|
|
},
|
|
);
|
|
}
|
|
Navigator.of(context).pop();
|
|
}
|
|
|
|
_setAutoUpdate(bool value) {
|
|
if (autoUpdate == value) return;
|
|
setState(() {
|
|
autoUpdate = value;
|
|
});
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final items = [
|
|
ListItem(
|
|
title: TextFormField(
|
|
controller: labelController,
|
|
decoration: InputDecoration(
|
|
border: const OutlineInputBorder(),
|
|
labelText: appLocalizations.name,
|
|
),
|
|
validator: (String? value) {
|
|
if (value == null || value.isEmpty) {
|
|
return appLocalizations.profileNameNullValidationDesc;
|
|
}
|
|
return null;
|
|
},
|
|
),
|
|
),
|
|
if (widget.profile.type == ProfileType.url) ...[
|
|
ListItem(
|
|
title: TextFormField(
|
|
controller: urlController,
|
|
maxLines: null,
|
|
decoration: InputDecoration(
|
|
border: const OutlineInputBorder(),
|
|
labelText: appLocalizations.url,
|
|
),
|
|
validator: (String? value) {
|
|
if (value == null || value.isEmpty) {
|
|
return appLocalizations.profileUrlNullValidationDesc;
|
|
}
|
|
if (!value.isUrl) {
|
|
return appLocalizations.profileUrlInvalidValidationDesc;
|
|
}
|
|
return null;
|
|
},
|
|
),
|
|
),
|
|
ListItem.switchItem(
|
|
title: Text(appLocalizations.autoUpdate),
|
|
delegate: SwitchDelegate<bool>(
|
|
value: autoUpdate,
|
|
onChanged: _setAutoUpdate,
|
|
),
|
|
),
|
|
if (autoUpdate)
|
|
ListItem(
|
|
title: TextFormField(
|
|
controller: autoUpdateDurationController,
|
|
decoration: InputDecoration(
|
|
border: const OutlineInputBorder(),
|
|
labelText: appLocalizations.autoUpdateInterval,
|
|
),
|
|
validator: (String? value) {
|
|
if (value == null || value.isEmpty) {
|
|
return appLocalizations
|
|
.profileAutoUpdateIntervalNullValidationDesc;
|
|
}
|
|
try {
|
|
int.parse(value);
|
|
} catch (_) {
|
|
return appLocalizations
|
|
.profileAutoUpdateIntervalInvalidValidationDesc;
|
|
}
|
|
return null;
|
|
},
|
|
),
|
|
),
|
|
]
|
|
];
|
|
return FloatLayout(
|
|
floatingWidget: FloatWrapper(
|
|
child: FloatingActionButton.extended(
|
|
heroTag: null,
|
|
onPressed: _handleConfirm,
|
|
label: Text(appLocalizations.save),
|
|
icon: const Icon(Icons.save),
|
|
),
|
|
),
|
|
child: Form(
|
|
key: _formKey,
|
|
child: Padding(
|
|
padding: const EdgeInsets.symmetric(
|
|
vertical: 16,
|
|
),
|
|
child: ListView.separated(
|
|
primary: true,
|
|
itemBuilder: (_, index) {
|
|
return items[index];
|
|
},
|
|
separatorBuilder: (_, __) {
|
|
return const SizedBox(
|
|
height: 24,
|
|
);
|
|
},
|
|
itemCount: items.length,
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|