Files
PiliPlus/lib/pages/fav_folder_sort/view.dart
bggRGjQaUbCoE caa58e9d7d mod: lint
mod: tweaks

opt: publish page

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
2025-05-04 14:56:56 +08:00

145 lines
3.9 KiB
Dart

import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/user.dart';
import 'package:PiliPlus/models/user/fav_folder.dart';
import 'package:PiliPlus/pages/fav/video/controller.dart';
import 'package:PiliPlus/pages/fav/video/widgets/item.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
class FavFolderSortPage extends StatefulWidget {
const FavFolderSortPage({super.key, required this.favController});
final FavController favController;
@override
State<FavFolderSortPage> createState() => _FavFolderSortPageState();
}
class _FavFolderSortPageState extends State<FavFolderSortPage> {
FavController get _favController => widget.favController;
final GlobalKey _key = GlobalKey();
late List<FavFolderItemData> sortList = List<FavFolderItemData>.from(
(_favController.loadingState.value as Success).response);
final ScrollController _scrollController = ScrollController();
void listener() {
if (_favController.isEnd) {
return;
}
if (_scrollController.position.pixels >=
_scrollController.position.maxScrollExtent - 200) {
_favController.onLoadMore().then((_) {
try {
if (_favController.loadingState.value is Success) {
List<FavFolderItemData> list =
(_favController.loadingState.value as Success).response;
sortList.addAll(list.sublist(sortList.length));
if (mounted) {
setState(() {});
}
}
} catch (_) {}
});
}
}
@override
void initState() {
super.initState();
if (_favController.isEnd.not) {
_scrollController.addListener(listener);
}
}
@override
void dispose() {
_scrollController
..removeListener(listener)
..dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('收藏夹排序'),
actions: [
TextButton(
onPressed: () async {
dynamic res = await UserHttp.sortFavFolder(
sort: sortList.map((item) => item.id).toList(),
);
if (res['status']) {
SmartDialog.showToast('排序完成');
_favController.loadingState.value =
LoadingState.success(sortList);
Get.back();
} else {
SmartDialog.showToast(res['msg']);
}
},
child: const Text('完成'),
),
const SizedBox(width: 16),
],
),
body: SafeArea(
top: false,
bottom: false,
child: _buildBody,
),
);
}
void onReorder(int oldIndex, int newIndex) {
if (oldIndex == 0 || newIndex == 0) {
SmartDialog.showToast('默认收藏夹不支持排序');
return;
}
if (newIndex > oldIndex) {
newIndex -= 1;
}
final tabsItem = sortList.removeAt(oldIndex);
sortList.insert(newIndex, tabsItem);
setState(() {});
}
Widget get _buildBody {
return ReorderableListView.builder(
key: _key,
scrollController: _scrollController,
onReorder: onReorder,
physics: const AlwaysScrollableScrollPhysics(),
footer: SizedBox(
height: MediaQuery.of(context).padding.bottom + 80,
),
itemCount: sortList.length,
itemBuilder: (context, index) {
final item = sortList[index];
final key = item.id.toString();
return SizedBox(
key: Key(key),
height: 98,
child: FavItem(
heroTag: key,
favFolderItem: item,
onLongPress: index == 0
? () {
SmartDialog.showToast('默认收藏夹不支持排序');
}
: null,
),
);
},
);
}
}