Refactor
This commit is contained in:
92
lib/features/proxy/widget/proxy_tile.dart
Normal file
92
lib/features/proxy/widget/proxy_tile.dart
Normal file
@@ -0,0 +1,92 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hiddify/features/proxy/model/proxy_entity.dart';
|
||||
import 'package:hiddify/utils/custom_loggers.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
|
||||
class ProxyTile extends HookConsumerWidget with PresLogger {
|
||||
const ProxyTile(
|
||||
this.proxy, {
|
||||
super.key,
|
||||
required this.selected,
|
||||
required this.onSelect,
|
||||
});
|
||||
|
||||
final ProxyItemEntity proxy;
|
||||
final bool selected;
|
||||
final VoidCallback onSelect;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final theme = Theme.of(context);
|
||||
|
||||
return ListTile(
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
|
||||
title: Text(
|
||||
proxy.name,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
leading: Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8),
|
||||
child: Container(
|
||||
width: 6,
|
||||
height: double.maxFinite,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
color: selected ? theme.colorScheme.primary : Colors.transparent,
|
||||
),
|
||||
),
|
||||
),
|
||||
subtitle: Text.rich(
|
||||
TextSpan(
|
||||
text: proxy.type.label,
|
||||
children: [
|
||||
if (proxy.selectedName != null)
|
||||
TextSpan(
|
||||
text: ' (${proxy.selectedName})',
|
||||
style: Theme.of(context).textTheme.bodySmall,
|
||||
),
|
||||
],
|
||||
),
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
trailing: proxy.urlTestDelay != 0
|
||||
? Text(
|
||||
proxy.urlTestDelay.toString(),
|
||||
style: TextStyle(color: delayColor(context, proxy.urlTestDelay)),
|
||||
)
|
||||
: null,
|
||||
selected: selected,
|
||||
onTap: onSelect,
|
||||
onLongPress: () async {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) => AlertDialog(
|
||||
content: SelectionArea(child: Text(proxy.name)),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: Navigator.of(context).pop,
|
||||
child: Text(MaterialLocalizations.of(context).closeButtonLabel),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
horizontalTitleGap: 4,
|
||||
);
|
||||
}
|
||||
|
||||
Color delayColor(BuildContext context, int delay) {
|
||||
if (Theme.of(context).brightness == Brightness.dark) {
|
||||
return switch (delay) {
|
||||
< 800 => Colors.lightGreen,
|
||||
< 1500 => Colors.orange,
|
||||
_ => Colors.redAccent
|
||||
};
|
||||
}
|
||||
return switch (delay) {
|
||||
< 800 => Colors.green,
|
||||
< 1500 => Colors.deepOrangeAccent,
|
||||
_ => Colors.red
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user