web archive

Signed-off-by: dom <githubaccount56556@proton.me>
This commit is contained in:
dom
2026-03-23 18:28:38 +08:00
parent 2220372e4f
commit b4b3764e5f
39 changed files with 1005 additions and 306 deletions

View File

@@ -0,0 +1,63 @@
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/member.dart';
import 'package:PiliPlus/models/common/member/archive_order_type_web.dart';
import 'package:PiliPlus/models_new/member/search_archive/data.dart';
import 'package:PiliPlus/models_new/member/search_archive/slist.dart';
import 'package:PiliPlus/models_new/member/search_archive/vlist.dart';
import 'package:PiliPlus/pages/member_video_web/base/controller.dart';
import 'package:get/get.dart';
class MemberVideoWebCtr
extends
BaseVideoWebCtr<
SearchArchiveData,
VListItemModel,
ArchiveOrderTypeWeb
> {
int? _totalCount;
@override
final Rx<ArchiveOrderTypeWeb> order = Rx(.pubdate);
int tid = 0;
String? specialType;
List<ListTag>? tags;
@override
List<VListItemModel>? getDataList(SearchArchiveData response) {
return response.list?.vlist;
}
@override
bool customHandleResponse(
bool isRefresh,
Success<SearchArchiveData> response,
) {
if (isRefresh) {
final data = response.response;
if (data.page?.count case final count?) {
if (tid == 0 && specialType == null) {
_totalCount = count;
}
this.count = count;
totalPage = (count / ps).ceil();
}
final tags = data.list?.tags;
if (tags?.isNotEmpty ?? false) {
this.tags = tags!
..insert(0, ListTag(tid: 0, name: '全部类型', count: _totalCount));
}
}
return false;
}
@override
Future<LoadingState<SearchArchiveData>> customGetData() =>
MemberHttp.searchArchive(
mid: mid,
ps: ps,
pn: page,
order: order.value,
tid: tid,
specialType: specialType,
);
}

View File

@@ -0,0 +1,87 @@
import 'package:PiliPlus/common/widgets/self_sized_horizontal_list.dart';
import 'package:PiliPlus/common/widgets/sliver/sliver_pinned_header.dart';
import 'package:PiliPlus/models/common/member/archive_order_type_web.dart';
import 'package:PiliPlus/models_new/member/search_archive/data.dart';
import 'package:PiliPlus/models_new/member/search_archive/vlist.dart';
import 'package:PiliPlus/pages/member_video_web/archive/controller.dart';
import 'package:PiliPlus/pages/member_video_web/base/view.dart';
import 'package:PiliPlus/pages/search/widgets/search_text.dart';
import 'package:PiliPlus/utils/grid.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
class MemberVideoWeb extends StatefulWidget {
const MemberVideoWeb({super.key});
@override
State<MemberVideoWeb> createState() => _MemberVideoWebState();
static Future<void>? toMemberVideoWeb({
required Object mid,
required String name,
}) {
return Get.toNamed(
'/videoWeb',
arguments: {
'mid': mid,
'name': name,
},
);
}
}
class _MemberVideoWebState
extends
BaseVideoWebState<
MemberVideoWeb,
SearchArchiveData,
VListItemModel,
ArchiveOrderTypeWeb
>
with GridMixin {
@override
late final MemberVideoWebCtr controller;
@override
void initState() {
super.initState();
controller = Get.put(MemberVideoWebCtr(), tag: name);
}
@override
List<ArchiveOrderTypeWeb> get values => ArchiveOrderTypeWeb.values;
@override
Widget? buildTags(ColorScheme colorScheme) {
if (controller.tags case final tags?) {
return SliverPinnedHeader(
backgroundColor: colorScheme.surface,
child: SelfSizedHorizontalList(
itemCount: tags.length,
padding: const .fromLTRB(10, 0, 10, 8),
itemBuilder: (context, index) {
final item = tags[index];
final isCurr = controller.specialType != null
? item.specialType == controller.specialType
: item.tid == controller.tid;
return SearchText(
padding: const .symmetric(horizontal: 8, vertical: 4),
text: '${item.name!} ${item.count}',
bgColor: isCurr ? colorScheme.secondaryContainer : null,
textColor: isCurr ? colorScheme.onSecondaryContainer : null,
onTap: (_) {
if (isCurr) return;
controller
..tid = item.tid ?? 0
..specialType = item.specialType
..onReload();
},
);
},
separatorBuilder: (_, _) => const SizedBox(width: 10),
),
);
}
return null;
}
}