import 'package:PiliPlus/models/user/fav_folder.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:PiliPlus/common/widgets/http_error.dart'; import 'package:PiliPlus/utils/feed_back.dart'; import '../../../../../utils/utils.dart'; class FavPanel extends StatefulWidget { const FavPanel({ super.key, this.ctr, this.scrollController, }); final dynamic ctr; final ScrollController? scrollController; @override State createState() => _FavPanelState(); } class _FavPanelState extends State { late Future _futureBuilderFuture; @override void initState() { super.initState(); _futureBuilderFuture = widget.ctr.queryVideoInFolder(); } @override Widget build(BuildContext context) { return NotificationListener( onNotification: (notification) { if (notification.extent <= 1e-5) { Get.back(); } return false; }, child: Column( children: [ AppBar( backgroundColor: Colors.transparent, leading: IconButton( tooltip: '关闭', onPressed: Get.back, icon: const Icon(Icons.close_outlined), ), title: const Text('添加到收藏夹'), actions: [ TextButton.icon( onPressed: () { Get.toNamed('/createFav')?.then((data) { if (data != null) { (widget.ctr?.favFolderData.value as FavFolderData?) ?.list ?.insert(1, data); widget.ctr?.favFolderData.refresh(); } }); }, icon: Icon( Icons.add, color: Theme.of(context).colorScheme.primary, ), label: const Text('新建收藏夹'), style: TextButton.styleFrom( padding: const EdgeInsets.symmetric(horizontal: 18, vertical: 14), visualDensity: const VisualDensity( horizontal: -2, vertical: -2, ), ), ), const SizedBox(width: 16), ], ), Expanded( child: FutureBuilder( future: _futureBuilderFuture, builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.connectionState == ConnectionState.done) { // TODO: refactor if (snapshot.data is! Map) { return HttpError( isSliver: false, callback: () => setState(() { _futureBuilderFuture = widget.ctr.queryVideoInFolder(); }), ); } Map data = snapshot.data as Map; if (data['status']) { return Obx( () => Material( color: Colors.transparent, child: ListView.builder( controller: widget.scrollController, itemCount: widget.ctr.favFolderData.value.list.length, itemBuilder: (context, index) { return ListTile( onTap: () => widget.ctr.onChoose( widget.ctr.favFolderData.value.list[index] .favState != 1, index), dense: true, leading: Utils.isPublic(widget .ctr.favFolderData.value.list[index].attr) ? const Icon(Icons.folder_outlined) : const Icon(Icons.lock_outline), minLeadingWidth: 0, title: Text(widget .ctr.favFolderData.value.list[index].title!), subtitle: Text( '${widget.ctr.favFolderData.value.list[index].mediaCount}个内容 . ${Utils.isPublicText(widget.ctr.favFolderData.value.list[index].attr)}', ), trailing: Transform.scale( scale: 0.9, child: Checkbox( value: widget.ctr.favFolderData.value .list[index].favState == 1, onChanged: (bool? checkValue) => widget.ctr.onChoose(checkValue!, index), ), ), ); }, ), ), ); } else { return CustomScrollView( controller: widget.scrollController, slivers: [ HttpError( errMsg: data['msg'], callback: () => setState(() { _futureBuilderFuture = widget.ctr.queryVideoInFolder(); }), ) ], ); } } else { // 骨架屏 return const Center( child: CircularProgressIndicator(), ); } }, ), ), Divider( height: 1, color: Theme.of(context).disabledColor.withOpacity(0.08), ), Padding( padding: EdgeInsets.only( left: 20, right: 20, top: 12, bottom: MediaQuery.of(context).padding.bottom + 12, ), child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ TextButton( onPressed: () => Get.back(), style: TextButton.styleFrom( padding: const EdgeInsets.symmetric( horizontal: 20, vertical: 10), visualDensity: const VisualDensity( horizontal: -1, vertical: -2, ), foregroundColor: Theme.of(context).colorScheme.outline, backgroundColor: Theme.of(context).colorScheme.onInverseSurface, ), child: const Text('取消'), ), const SizedBox(width: 25), FilledButton.tonal( onPressed: () async { feedBack(); await widget.ctr.actionFavVideo(); }, style: FilledButton.styleFrom( padding: const EdgeInsets.symmetric( horizontal: 20, vertical: 10), visualDensity: const VisualDensity( horizontal: -1, vertical: -2, ), ), child: const Text('完成'), ), ], ), ), ], ), ); } }