import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../../../backend/transfer/model.dart'; import '../../../shared/widgets/empty_state.dart'; import '../../settings/controller/settings_controller.dart'; import '../controller/transfers_controller.dart'; import '../widgets/transfer_item.dart'; class TransferPage extends ConsumerWidget { const TransferPage({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final transfersAsync = ref.watch(transfersControllerProvider); return Scaffold( appBar: AppBar( title: const Text('Transfer Queue'), actions: [ IconButton( tooltip: '清理已完成', onPressed: () => ref.read(transfersControllerProvider.notifier).clearCompleted(), icon: const Icon(Icons.cleaning_services_rounded), ), IconButton( tooltip: '刷新', onPressed: () => ref.read(transfersControllerProvider.notifier).refresh(), icon: const Icon(Icons.refresh_rounded), ), ], ), body: transfersAsync.when( loading: () => const Center(child: CircularProgressIndicator()), error: (error, _) => AppEmptyState( icon: Icons.warning_amber_rounded, title: '加载失败', message: error.toString(), ), data: (transfers) { if (transfers.isEmpty) { return const AppEmptyState( icon: Icons.inbox_rounded, title: '暂无传输记录', message: '发起或接收一次文件后,会在这里看到记录。', ); } return ListView.separated( padding: const EdgeInsets.all(16), itemBuilder: (context, index) { final item = transfers[index]; final isSender = item.type == TransferType.send; final isReceiver = item.type == TransferType.receive; final canCancel = (isSender && (item.status is TransferStatus_Pending || item.status is TransferStatus_Active)) || (isReceiver && item.status is TransferStatus_Active); return TransferItem( transfer: item, onCancel: canCancel ? () => ref .read(transfersControllerProvider.notifier) .cancel(item.id) : null, onAccept: isReceiver && item.status is TransferStatus_Pending ? () async { final settings = await ref.read( settingsControllerProvider.future, ); await ref .read(transfersControllerProvider.notifier) .accept(item.id, settings.savePath); } : null, onReject: isReceiver && item.status is TransferStatus_Pending ? () => ref .read(transfersControllerProvider.notifier) .reject(item.id) : null, onDelete: () => ref .read(transfersControllerProvider.notifier) .delete(item.id), ); }, separatorBuilder: (_, _) => const SizedBox(height: 12), itemCount: transfers.length, ); }, ), ); } }