Files
mesh-drop-flutter/lib/app/features/transfer/pages/transfer_page.dart
2026-02-27 21:12:56 +08:00

99 lines
3.6 KiB
Dart

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,
);
},
),
);
}
}