opt: enum

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-05-05 15:06:19 +08:00
parent 4e68c765c5
commit 2f4c739f0b
116 changed files with 577 additions and 554 deletions

View File

@@ -3,6 +3,7 @@ import 'dart:io';
import 'package:PiliPlus/build_config.dart';
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
import 'package:PiliPlus/models/common/account_type.dart';
import 'package:PiliPlus/pages/mine/controller.dart';
import 'package:PiliPlus/services/loggeer.dart';
import 'package:PiliPlus/utils/accounts/account.dart';

View File

@@ -7,8 +7,8 @@ import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'
show ReplyInfo;
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/reply_sort_type.dart';
import 'package:PiliPlus/models/common/reply_type.dart';
import 'package:PiliPlus/models/common/reply/reply_sort_type.dart';
import 'package:PiliPlus/models/common/reply/reply_type.dart';
import 'package:PiliPlus/models/dynamics/result.dart' show DynamicStat;
import 'package:PiliPlus/pages/article/controller.dart';
import 'package:PiliPlus/pages/article/widgets/html_render.dart';

View File

@@ -1,6 +1,5 @@
import 'package:PiliPlus/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart'
show SourceModel;
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/models/common/image_preview_type.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:cached_network_image/cached_network_image.dart';

View File

@@ -1,13 +1,12 @@
import 'dart:math';
import 'package:PiliPlus/common/constants.dart';
import 'package:PiliPlus/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart'
show SourceModel;
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/pages/dynamics/widgets/vote.dart';
import 'package:PiliPlus/models/common/image_preview_type.dart';
import 'package:PiliPlus/models/dynamics/article_content_model.dart'
show ArticleContentModel, Style, Word;
import 'package:PiliPlus/models/dynamics/result.dart';
import 'package:PiliPlus/pages/dynamics/widgets/vote.dart';
import 'package:PiliPlus/utils/app_scheme.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/utils.dart';

View File

@@ -2,7 +2,7 @@ import 'package:PiliPlus/http/bangumi.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/bangumi/list.dart';
import 'package:PiliPlus/models/bangumi/pgc_timeline/result.dart';
import 'package:PiliPlus/models/common/tab_type.dart';
import 'package:PiliPlus/models/common/home_tab_type.dart';
import 'package:PiliPlus/pages/common/common_list_controller.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/storage.dart';
@@ -12,12 +12,12 @@ import 'package:get/get.dart';
class BangumiController extends CommonListController<
List<BangumiListItemModel>?, BangumiListItemModel> {
BangumiController({required this.tabType});
final TabType tabType;
final HomeTabType tabType;
int? mid;
late final RxBool isLogin;
late final showPgcTimeline =
tabType == TabType.bangumi && GStorage.showPgcTimeline;
tabType == HomeTabType.bangumi && GStorage.showPgcTimeline;
@override
void onInit() {
@@ -74,7 +74,7 @@ class BangumiController extends CommonListController<
followLoading = true;
dynamic res = await BangumiHttp.bangumiFollowList(
mid: mid,
type: tabType == TabType.bangumi ? 1 : 2,
type: tabType == HomeTabType.bangumi ? 1 : 2,
pn: followPage,
);
@@ -119,7 +119,7 @@ class BangumiController extends CommonListController<
Future<LoadingState<List<BangumiListItemModel>?>> customGetData() =>
BangumiHttp.bangumiList(
page: currentPage,
indexType: tabType == TabType.cinema ? 102 : null, // TODO: sort
indexType: tabType == HomeTabType.cinema ? 102 : null, // TODO: sort
);
@override

View File

@@ -8,7 +8,7 @@ import 'package:PiliPlus/common/widgets/scroll_physics.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/bangumi/list.dart';
import 'package:PiliPlus/models/bangumi/pgc_timeline/result.dart';
import 'package:PiliPlus/models/common/tab_type.dart';
import 'package:PiliPlus/models/common/home_tab_type.dart';
import 'package:PiliPlus/pages/bangumi/controller.dart';
import 'package:PiliPlus/pages/bangumi/widgets/bangumi_card_v.dart';
import 'package:PiliPlus/pages/bangumi/widgets/bangumi_card_v_timeline.dart';
@@ -25,7 +25,7 @@ class BangumiPage extends CommonPage {
required this.tabType,
});
final TabType tabType;
final HomeTabType tabType;
@override
State<BangumiPage> createState() => _BangumiPageState();
@@ -225,7 +225,7 @@ class _BangumiPageState extends CommonPageState<BangumiPage, BangumiController>
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
if (widget.tabType == TabType.bangumi) {
if (widget.tabType == HomeTabType.bangumi) {
Get.to(const PgcIndexPage());
} else {
List<String> titles = const [
@@ -353,7 +353,7 @@ class _BangumiPageState extends CommonPageState<BangumiPage, BangumiController>
children: [
Obx(
() => Text(
'最近${widget.tabType == TabType.bangumi ? '追番' : '追剧'}${controller.followCount.value == -1 ? '' : ' ${controller.followCount.value}'}',
'最近${widget.tabType == HomeTabType.bangumi ? '追番' : '追剧'}${controller.followCount.value == -1 ? '' : ' ${controller.followCount.value}'}',
style: theme.textTheme.titleMedium,
),
),
@@ -381,7 +381,7 @@ class _BangumiPageState extends CommonPageState<BangumiPage, BangumiController>
Get.toNamed(
'/fav',
arguments:
widget.tabType == TabType.bangumi ? 1 : 2,
widget.tabType == HomeTabType.bangumi ? 1 : 2,
);
},
child: Padding(
@@ -446,7 +446,7 @@ class _BangumiPageState extends CommonPageState<BangumiPage, BangumiController>
)
: Center(
child: Text(
'还没有${widget.tabType == TabType.bangumi ? '追番' : '追剧'}')),
'还没有${widget.tabType == HomeTabType.bangumi ? '追番' : '追剧'}')),
Error() => Container(
padding: const EdgeInsets.symmetric(horizontal: 16),
alignment: Alignment.center,

View File

@@ -4,9 +4,9 @@ import 'dart:math';
import 'package:PiliPlus/common/constants.dart';
import 'package:PiliPlus/common/widgets/button/icon_button.dart';
import 'package:PiliPlus/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart'
show SourceModel, SourceType;
import 'package:PiliPlus/http/msg.dart';
import 'package:PiliPlus/models/common/image_preview_type.dart';
import 'package:PiliPlus/models/common/publish_panel_type.dart';
import 'package:PiliPlus/models/live/live_emoticons/emoticon.dart';
import 'package:PiliPlus/models/video/reply/emote.dart';
import 'package:PiliPlus/utils/extension.dart';
@@ -20,8 +20,6 @@ import 'package:get/get.dart';
import 'package:image_cropper/image_cropper.dart';
import 'package:image_picker/image_picker.dart';
enum PanelType { none, keyboard, emoji }
abstract class CommonPublishPage extends StatefulWidget {
const CommonPublishPage({
super.key,

View File

@@ -6,8 +6,8 @@ import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'
import 'package:PiliPlus/grpc/bilibili/pagination.pb.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/reply.dart';
import 'package:PiliPlus/models/common/reply_sort_type.dart';
import 'package:PiliPlus/models/common/reply_type.dart';
import 'package:PiliPlus/models/common/reply/reply_sort_type.dart';
import 'package:PiliPlus/models/common/reply/reply_type.dart';
import 'package:PiliPlus/models/video/reply/data.dart';
import 'package:PiliPlus/pages/common/common_list_controller.dart';
import 'package:PiliPlus/pages/video/reply_new/view.dart';

View File

@@ -2,7 +2,7 @@ import 'dart:async';
import 'package:PiliPlus/http/dynamics.dart';
import 'package:PiliPlus/http/follow.dart';
import 'package:PiliPlus/models/common/dynamics_type.dart';
import 'package:PiliPlus/models/common/dynamic/dynamics_type.dart';
import 'package:PiliPlus/models/dynamics/up.dart';
import 'package:PiliPlus/models/follow/result.dart';
import 'package:PiliPlus/pages/common/common_controller.dart';

View File

@@ -1,6 +1,6 @@
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
import 'package:PiliPlus/models/common/dynamics_type.dart';
import 'package:PiliPlus/models/common/up_panel_position.dart';
import 'package:PiliPlus/models/common/dynamic/dynamics_type.dart';
import 'package:PiliPlus/models/common/dynamic/up_panel_position.dart';
import 'package:PiliPlus/pages/dynamics/controller.dart';
import 'package:PiliPlus/pages/dynamics/widgets/up_panel.dart';
import 'package:PiliPlus/pages/dynamics_create/view.dart';
@@ -8,19 +8,6 @@ import 'package:PiliPlus/utils/storage.dart';
import 'package:easy_debounce/easy_throttle.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
enum ReplyOption { allow, close, choose }
extension ReplyOptionExtension on ReplyOption {
String get title => const ['允许评论', '关闭评论', '精选评论'][index];
IconData get iconData => [
MdiIcons.commentTextOutline,
MdiIcons.commentOffOutline,
MdiIcons.commentProcessingOutline,
][index];
}
class DynamicsPage extends StatefulWidget {
const DynamicsPage({super.key});
@@ -160,7 +147,8 @@ class _DynamicsPageState extends State<DynamicsPage>
labelStyle:
TabBarTheme.of(context).labelStyle?.copyWith(fontSize: 13) ??
const TextStyle(fontSize: 13),
tabs: DynamicsType.values.map((e) => Tab(text: e.labels)).toList(),
tabs:
DynamicsTabType.values.map((e) => Tab(text: e.labels)).toList(),
onTap: (index) {
if (!_dynamicsController.tabController.indexIsChanging) {
_dynamicsController.animateToTop();

View File

@@ -1,7 +1,8 @@
import 'package:PiliPlus/common/widgets/button/toolbar_icon_button.dart';
import 'package:PiliPlus/http/msg.dart';
import 'package:PiliPlus/models/common/publish_panel_type.dart';
import 'package:PiliPlus/models/common/reply/reply_option_type.dart';
import 'package:PiliPlus/pages/common/common_publish_page.dart';
import 'package:PiliPlus/pages/dynamics/view.dart';
import 'package:PiliPlus/pages/emote/controller.dart';
import 'package:PiliPlus/pages/emote/view.dart';
import 'package:PiliPlus/utils/request_utils.dart';
@@ -24,7 +25,7 @@ class CreateDynPanel extends CommonPublishPage {
class _CreateDynPanelState extends CommonPublishPageState<CreateDynPanel> {
bool _isPrivate = false;
DateTime? _publishTime;
ReplyOption _replyOption = ReplyOption.allow;
ReplyOptionType _replyOption = ReplyOptionType.allow;
@override
void dispose() {
@@ -251,7 +252,7 @@ class _CreateDynPanelState extends CommonPublishPageState<CreateDynPanel> {
}
Widget _buildReplyOptionWidget(ThemeData theme) {
final color = _replyOption == ReplyOption.close
final color = _replyOption == ReplyOptionType.close
? theme.colorScheme.error
: theme.colorScheme.secondary;
return PopupMenuButton(
@@ -262,9 +263,9 @@ class _CreateDynPanelState extends CommonPublishPageState<CreateDynPanel> {
_replyOption = item;
});
},
itemBuilder: (context) => ReplyOption.values
itemBuilder: (context) => ReplyOptionType.values
.map(
(item) => PopupMenuItem<ReplyOption>(
(item) => PopupMenuItem<ReplyOptionType>(
value: item,
child: Row(
mainAxisSize: MainAxisSize.min,

View File

@@ -3,7 +3,7 @@ import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'
import 'package:PiliPlus/http/dynamics.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/reply.dart';
import 'package:PiliPlus/models/common/reply_type.dart';
import 'package:PiliPlus/models/common/reply/reply_type.dart';
import 'package:PiliPlus/models/dynamics/result.dart';
import 'package:PiliPlus/pages/common/reply_controller.dart';
import 'package:PiliPlus/utils/id_utils.dart';

View File

@@ -8,8 +8,8 @@ import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'
show ReplyInfo;
import 'package:PiliPlus/http/constants.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/reply_sort_type.dart';
import 'package:PiliPlus/models/common/reply_type.dart';
import 'package:PiliPlus/models/common/reply/reply_sort_type.dart';
import 'package:PiliPlus/models/common/reply/reply_type.dart';
import 'package:PiliPlus/models/dynamics/result.dart';
import 'package:PiliPlus/pages/dynamics/widgets/author_panel.dart';
import 'package:PiliPlus/pages/dynamics/widgets/dynamic_panel.dart';

View File

@@ -1,6 +1,7 @@
import 'package:PiliPlus/common/widgets/button/toolbar_icon_button.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/http/msg.dart';
import 'package:PiliPlus/models/common/publish_panel_type.dart';
import 'package:PiliPlus/models/dynamics/result.dart';
import 'package:PiliPlus/pages/common/common_publish_page.dart';
import 'package:PiliPlus/pages/emote/controller.dart';

View File

@@ -11,6 +11,7 @@ import 'package:PiliPlus/common/widgets/stat/stat.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/video.dart';
import 'package:PiliPlus/models/bangumi/info.dart' as bangumi;
import 'package:PiliPlus/models/common/episode_panel_type.dart';
import 'package:PiliPlus/models/video_detail_res.dart' as video;
import 'package:PiliPlus/pages/common/common_slide_page.dart';
import 'package:PiliPlus/pages/video/controller.dart';
@@ -25,12 +26,6 @@ import 'package:get/get.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
import 'package:scrollable_positioned_list/scrollable_positioned_list.dart';
enum EpisodeType { part, season, bangumi }
extension EpisodeTypeExt on EpisodeType {
String get title => const ['分P', '合集', '番剧'][index];
}
class EpisodePanel extends CommonSlidePage {
const EpisodePanel({
super.key,

View File

@@ -1,29 +1,12 @@
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/fav_type.dart';
import 'package:PiliPlus/models/user/fav_folder.dart';
import 'package:PiliPlus/pages/fav/article/view.dart';
import 'package:PiliPlus/pages/fav/note/view.dart';
import 'package:PiliPlus/pages/fav/pgc/view.dart';
import 'package:PiliPlus/pages/fav/video/controller.dart';
import 'package:PiliPlus/pages/fav/video/view.dart';
import 'package:PiliPlus/pages/fav_folder_sort/view.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
enum _FavType { video, bangumi, cinema, article, note }
extension _FavTypeExt on _FavType {
String get title => const ['视频', '追番', '追剧', '专栏', '笔记'][index];
Widget get page => switch (this) {
_FavType.video => const FavVideoPage(),
_FavType.bangumi => const FavPgcPage(type: 1),
_FavType.cinema => const FavPgcPage(type: 2),
_FavType.article => const FavArticlePage(),
_FavType.note => const FavNotePage(),
};
}
class FavPage extends StatefulWidget {
const FavPage({super.key});
@@ -46,7 +29,7 @@ class _FavPageState extends State<FavPage> with SingleTickerProviderStateMixin {
int initialIndex = Get.arguments is int ? Get.arguments as int : 0;
_showVideoFavMenu = (initialIndex == 0).obs;
_tabController = TabController(
length: _FavType.values.length,
length: FavTabType.values.length,
vsync: this,
initialIndex: initialIndex,
);
@@ -133,7 +116,7 @@ class _FavPageState extends State<FavPage> with SingleTickerProviderStateMixin {
],
bottom: TabBar(
controller: _tabController,
tabs: _FavType.values.map((item) => Tab(text: item.title)).toList(),
tabs: FavTabType.values.map((item) => Tab(text: item.title)).toList(),
),
),
body: SafeArea(
@@ -141,7 +124,7 @@ class _FavPageState extends State<FavPage> with SingleTickerProviderStateMixin {
bottom: false,
child: tabBarView(
controller: _tabController,
children: _FavType.values.map((item) => item.page).toList(),
children: FavTabType.values.map((item) => item.page).toList(),
),
),
);

View File

@@ -1,18 +1,12 @@
import 'package:PiliPlus/http/follow.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/member.dart';
import 'package:PiliPlus/models/common/follow_order_type.dart';
import 'package:PiliPlus/models/follow/result.dart';
import 'package:PiliPlus/pages/common/common_list_controller.dart';
import 'package:PiliPlus/pages/follow/controller.dart';
import 'package:get/get.dart';
enum OrderType { def, attention }
extension OrderTypeExt on OrderType {
String get type => const ['', 'attention'][index];
String get title => const ['最近关注', '最常访问'][index];
}
class FollowChildController
extends CommonListController<FollowDataModel, FollowItemModel> {
FollowChildController(this.controller, this.mid, this.tagid);
@@ -20,7 +14,7 @@ class FollowChildController
final int? tagid;
final int mid;
late final Rx<OrderType> orderType = OrderType.def.obs;
late final Rx<FollowOrderType> orderType = FollowOrderType.def.obs;
@override
void onInit() {

View File

@@ -2,6 +2,7 @@ import 'package:PiliPlus/common/skeleton/msg_feed_top.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/follow_order_type.dart';
import 'package:PiliPlus/models/follow/result.dart';
import 'package:PiliPlus/pages/follow/child_controller.dart';
import 'package:PiliPlus/pages/follow/controller.dart';
@@ -47,9 +48,9 @@ class _FollowChildPageState extends State<FollowChildPage>
onPressed: () {
_followController
..orderType.value =
_followController.orderType.value == OrderType.def
? OrderType.attention
: OrderType.def
_followController.orderType.value == FollowOrderType.def
? FollowOrderType.attention
: FollowOrderType.def
..onReload();
},
icon: const Icon(Icons.format_list_bulleted, size: 20),

View File

@@ -6,7 +6,7 @@ import 'package:PiliPlus/common/widgets/progress_bar/video_progress_indicator.da
import 'package:PiliPlus/http/search.dart';
import 'package:PiliPlus/http/user.dart';
import 'package:PiliPlus/http/video.dart';
import 'package:PiliPlus/models/common/business_type.dart';
import 'package:PiliPlus/models/common/history_business_type.dart';
import 'package:PiliPlus/models/user/history.dart';
import 'package:PiliPlus/pages/common/multi_select_controller.dart';
import 'package:PiliPlus/pages/history/base_controller.dart';
@@ -145,7 +145,7 @@ class HistoryItem extends StatelessWidget {
width: maxWidth,
height: maxHeight,
),
if (!BusinessType
if (!HistoryBusinessType
.hiddenDurationType.hiddenDurationType
.contains(videoItem.history.business))
PBadge(
@@ -157,10 +157,10 @@ class HistoryItem extends StatelessWidget {
type: 'gray',
),
// 右上角
if (BusinessType.showBadge.showBadge
if (HistoryBusinessType.showBadge.showBadge
.contains(videoItem.history.business) ||
videoItem.history.business ==
BusinessType.live.type)
HistoryBusinessType.live.type)
PBadge(
text: videoItem.badge,
top: 6.0,

View File

@@ -3,7 +3,7 @@ import 'dart:math';
import 'package:PiliPlus/http/api.dart';
import 'package:PiliPlus/http/init.dart';
import 'package:PiliPlus/models/common/tab_type.dart';
import 'package:PiliPlus/models/common/home_tab_type.dart';
import 'package:PiliPlus/pages/common/common_controller.dart';
import 'package:PiliPlus/pages/mine/view.dart';
import 'package:PiliPlus/utils/feed_back.dart';
@@ -32,8 +32,8 @@ class HomeController extends GetxController
final index = tabController.index;
return tabsCtrList[index]!(
tag: switch (tabs[index]['type']) {
TabType.bangumi => TabType.bangumi.name,
TabType.cinema => TabType.cinema.name,
HomeTabType.bangumi => HomeTabType.bangumi.name,
HomeTabType.cinema => HomeTabType.cinema.name,
_ => null,
});
}
@@ -77,17 +77,17 @@ class HomeController extends GetxController
final tabbarSort = GStorage.tabbarSort;
defaultTabs
..retainWhere(
(item) => tabbarSort.contains((item['type'] as TabType).name))
(item) => tabbarSort.contains((item['type'] as HomeTabType).name))
..sort((a, b) => tabbarSort
.indexOf((a['type'] as TabType).name)
.compareTo(tabbarSort.indexOf((b['type'] as TabType).name)));
.indexOf((a['type'] as HomeTabType).name)
.compareTo(tabbarSort.indexOf((b['type'] as HomeTabType).name)));
tabs = defaultTabs;
tabsCtrList = tabs.map((e) => e['ctr']).toList();
tabController = TabController(
initialIndex: max(0, tabbarSort.indexOf(TabType.rcmd.name)),
initialIndex: max(0, tabbarSort.indexOf(HomeTabType.rcmd.name)),
length: tabs.length,
vsync: this,
);

View File

@@ -1,7 +1,7 @@
import 'package:PiliPlus/common/constants.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
import 'package:PiliPlus/models/common/dynamic_badge_mode.dart';
import 'package:PiliPlus/models/common/dynamic/dynamic_badge_mode.dart';
import 'package:PiliPlus/pages/home/controller.dart';
import 'package:PiliPlus/pages/main/controller.dart';
import 'package:PiliPlus/pages/mine/controller.dart';

View File

@@ -4,7 +4,7 @@ import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/video_card/video_card_h.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/tab_type.dart';
import 'package:PiliPlus/models/common/home_tab_type.dart';
import 'package:PiliPlus/models/model_hot_video_item.dart';
import 'package:PiliPlus/pages/common/common_page.dart';
import 'package:PiliPlus/pages/home/controller.dart';
@@ -83,7 +83,7 @@ class _HotPageState extends CommonPageState<HotPage, HotController>
HomeController homeController =
Get.find<HomeController>();
int index = homeController.tabs.indexWhere(
(item) => item['type'] == TabType.rank,
(item) => item['type'] == HomeTabType.rank,
);
if (index != -1) {
homeController.tabController.animateTo(index);

View File

@@ -1,4 +1,4 @@
import 'package:PiliPlus/pages/later/view.dart';
import 'package:PiliPlus/models/common/later_view_type.dart';
import 'package:get/get.dart';
class LaterBaseController extends GetxController {

View File

@@ -5,10 +5,9 @@ import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/video_card/video_card_h.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/later_view_type.dart';
import 'package:PiliPlus/models/model_hot_video_item.dart';
import 'package:PiliPlus/pages/later/controller.dart';
import 'package:PiliPlus/pages/later/view.dart'
show LaterViewType, LaterViewTypeExt;
import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/grid.dart';
import 'package:PiliPlus/utils/page_utils.dart';

View File

@@ -1,11 +1,10 @@
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/user.dart';
import 'package:PiliPlus/models/common/later_view_type.dart';
import 'package:PiliPlus/models/model_hot_video_item.dart';
import 'package:PiliPlus/pages/common/multi_select_controller.dart';
import 'package:PiliPlus/pages/later/base_controller.dart';
import 'package:PiliPlus/pages/later/view.dart'
show LaterViewType, LaterViewTypeExt;
import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/page_utils.dart';
import 'package:PiliPlus/utils/storage.dart';

View File

@@ -1,9 +1,9 @@
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/later_view_type.dart';
import 'package:PiliPlus/models/model_hot_video_item.dart';
import 'package:PiliPlus/pages/history/view.dart' show AppBarWidget;
import 'package:PiliPlus/pages/later/base_controller.dart';
import 'package:PiliPlus/pages/later/child_view.dart';
import 'package:PiliPlus/pages/later/controller.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/request_utils.dart';
@@ -12,16 +12,6 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
enum LaterViewType { all, toView, unfinished, viewed }
extension LaterViewTypeExt on LaterViewType {
int get type => index;
String get title => const ['全部', '未看', '未看完', '已看完'][index];
Widget get page => LaterViewChildPage(laterViewType: this);
}
class LaterPage extends StatefulWidget {
const LaterPage({super.key});

View File

@@ -3,8 +3,8 @@ import 'dart:convert';
import 'package:PiliPlus/http/constants.dart';
import 'package:PiliPlus/http/live.dart';
import 'package:PiliPlus/http/video.dart';
import 'package:PiliPlus/models/common/video/live_quality.dart';
import 'package:PiliPlus/models/live/danmu_info.dart';
import 'package:PiliPlus/models/live/quality.dart';
import 'package:PiliPlus/models/live/room_info.dart';
import 'package:PiliPlus/models/live/room_info_h5.dart';
import 'package:PiliPlus/pages/mine/controller.dart';

View File

@@ -2,6 +2,7 @@ import 'dart:async';
import 'package:PiliPlus/common/widgets/button/toolbar_icon_button.dart';
import 'package:PiliPlus/http/live.dart';
import 'package:PiliPlus/models/common/publish_panel_type.dart';
import 'package:PiliPlus/pages/common/common_publish_page.dart';
import 'package:PiliPlus/pages/live_emote/controller.dart';
import 'package:PiliPlus/pages/live_emote/view.dart';

View File

@@ -6,6 +6,7 @@ import 'package:PiliPlus/common/widgets/button/icon_button.dart';
import 'package:PiliPlus/common/widgets/radio_widget.dart';
import 'package:PiliPlus/http/init.dart';
import 'package:PiliPlus/http/login.dart';
import 'package:PiliPlus/models/common/account_type.dart';
import 'package:PiliPlus/models/login/model.dart';
import 'package:PiliPlus/utils/accounts/account.dart';
import 'package:PiliPlus/utils/storage.dart';

View File

@@ -3,7 +3,8 @@ import 'dart:async';
import 'package:PiliPlus/grpc/grpc_repo.dart';
import 'package:PiliPlus/http/api.dart';
import 'package:PiliPlus/http/init.dart';
import 'package:PiliPlus/models/common/dynamic_badge_mode.dart';
import 'package:PiliPlus/models/common/dynamic/dynamic_badge_mode.dart';
import 'package:PiliPlus/models/common/msg/msg_unread_type.dart';
import 'package:PiliPlus/models/common/nav_bar_config.dart';
import 'package:PiliPlus/pages/dynamics/view.dart';
import 'package:PiliPlus/pages/home/view.dart';

View File

@@ -2,7 +2,7 @@ import 'dart:io';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/tabs.dart';
import 'package:PiliPlus/models/common/dynamic_badge_mode.dart';
import 'package:PiliPlus/models/common/dynamic/dynamic_badge_mode.dart';
import 'package:PiliPlus/pages/dynamics/controller.dart';
import 'package:PiliPlus/pages/dynamics/view.dart';
import 'package:PiliPlus/pages/home/controller.dart';

View File

@@ -3,6 +3,7 @@ import 'dart:math';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/member.dart';
import 'package:PiliPlus/http/video.dart';
import 'package:PiliPlus/models/common/member/tab_type.dart';
import 'package:PiliPlus/models/space/data.dart';
import 'package:PiliPlus/models/space/item.dart';
import 'package:PiliPlus/models/space/tab2.dart';
@@ -15,12 +16,6 @@ import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import 'package:intl/intl.dart';
enum MemberTabType { none, home, dynamic, contribute, favorite, bangumi }
extension MemberTabTypeExt on MemberTabType {
String get title => const ['默认', '首页', '动态', '投稿', '收藏', '番剧'][index];
}
class MemberController extends CommonDataController<SpaceData, dynamic>
with GetTickerProviderStateMixin {
MemberController({required this.mid});

View File

@@ -1,7 +1,6 @@
import 'package:PiliPlus/common/constants.dart';
import 'package:PiliPlus/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart'
show SourceModel;
import 'package:PiliPlus/common/widgets/pendant_avatar.dart';
import 'package:PiliPlus/models/common/image_preview_type.dart';
import 'package:PiliPlus/models/space/card.dart';
import 'package:PiliPlus/models/space/images.dart';
import 'package:PiliPlus/utils/extension.dart';

View File

@@ -1,3 +1,4 @@
import 'package:PiliPlus/models/common/member/contribute_type.dart';
import 'package:PiliPlus/pages/member_article/view.dart';
import 'package:PiliPlus/pages/member_audio/view.dart';
import 'package:PiliPlus/pages/member_contribute/controller.dart';
@@ -6,8 +7,6 @@ import 'package:PiliPlus/pages/member_video/view.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
enum ContributeType { video, charging, season, series, bangumi }
class MemberContribute extends StatefulWidget {
const MemberContribute({
super.key,

View File

@@ -1,11 +1,11 @@
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/member.dart';
import 'package:PiliPlus/models/common/member/contribute_type.dart';
import 'package:PiliPlus/models/space/data.dart';
import 'package:PiliPlus/models/space_archive/data.dart';
import 'package:PiliPlus/models/space_archive/item.dart';
import 'package:PiliPlus/pages/common/common_list_controller.dart';
import 'package:PiliPlus/pages/member/controller.dart';
import 'package:PiliPlus/pages/member_contribute/view.dart' show ContributeType;
import 'package:get/get.dart';
class MemberBangumiCtr

View File

@@ -3,6 +3,7 @@ import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
import 'package:PiliPlus/http/constants.dart';
import 'package:PiliPlus/http/init.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/member/profile_type.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/page_utils.dart';
import 'package:PiliPlus/utils/storage.dart';
@@ -19,8 +20,6 @@ import 'package:image_picker/image_picker.dart';
import 'package:intl/intl.dart';
import 'package:mime/mime.dart';
enum ProfileType { uname, sign, sex, birthday }
class EditProfilePage extends StatefulWidget {
const EditProfilePage({super.key});

View File

@@ -1,7 +1,7 @@
import 'package:PiliPlus/common/constants.dart';
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/pages/member_contribute/view.dart';
import 'package:PiliPlus/models/common/member/contribute_type.dart';
import 'package:PiliPlus/pages/member_season_series/controller.dart';
import 'package:PiliPlus/pages/member_season_series/widget/season_series_card.dart';
import 'package:PiliPlus/pages/member_video/view.dart';

View File

@@ -1,11 +1,11 @@
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/member.dart';
import 'package:PiliPlus/http/search.dart';
import 'package:PiliPlus/models/common/member/contribute_type.dart';
import 'package:PiliPlus/models/space_archive/data.dart';
import 'package:PiliPlus/models/space_archive/episodic_button.dart';
import 'package:PiliPlus/models/space_archive/item.dart';
import 'package:PiliPlus/pages/common/common_list_controller.dart';
import 'package:PiliPlus/pages/member_contribute/view.dart' show ContributeType;
import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/id_utils.dart';
import 'package:PiliPlus/utils/page_utils.dart';

View File

@@ -5,9 +5,9 @@ import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
import 'package:PiliPlus/common/widgets/video_card/video_card_h_member_video.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/member/contribute_type.dart';
import 'package:PiliPlus/models/space_archive/item.dart';
import 'package:PiliPlus/pages/member/controller.dart';
import 'package:PiliPlus/pages/member_contribute/view.dart' show ContributeType;
import 'package:PiliPlus/pages/member_video/controller.dart';
import 'package:PiliPlus/utils/grid.dart';
import 'package:flutter/material.dart';

View File

@@ -1,5 +1,6 @@
import 'package:PiliPlus/http/user.dart';
import 'package:PiliPlus/models/common/theme_type.dart';
import 'package:PiliPlus/models/common/account_type.dart';
import 'package:PiliPlus/models/common/theme/theme_type.dart';
import 'package:PiliPlus/models/user/info.dart';
import 'package:PiliPlus/models/user/stat.dart';
import 'package:PiliPlus/utils/accounts/account.dart';

View File

@@ -1,6 +1,6 @@
import 'package:PiliPlus/common/constants.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/models/common/theme_type.dart';
import 'package:PiliPlus/models/common/theme/theme_type.dart';
import 'package:PiliPlus/models/user/info.dart';
import 'package:PiliPlus/pages/mine/controller.dart';
import 'package:flutter/material.dart';

View File

@@ -1,6 +1,6 @@
import 'package:PiliPlus/models/common/color_type.dart';
import 'package:PiliPlus/models/common/nav_bar_config.dart';
import 'package:PiliPlus/models/common/theme_type.dart';
import 'package:PiliPlus/models/common/theme/theme_color_type.dart';
import 'package:PiliPlus/models/common/theme/theme_type.dart';
import 'package:PiliPlus/pages/home/view.dart';
import 'package:PiliPlus/pages/mine/controller.dart';
import 'package:PiliPlus/pages/setting/widgets/select_dialog.dart';

View File

@@ -1,4 +1,4 @@
import 'package:PiliPlus/models/common/tab_type.dart';
import 'package:PiliPlus/models/common/home_tab_type.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
@@ -21,8 +21,8 @@ class _TabbarSetPageState extends State<TabbarSetPage> {
tabbarSort = GStorage.tabbarSort;
// 对 tabData 进行排序
defaultTabs.sort((a, b) {
int indexA = tabbarSort.indexOf((a['type'] as TabType).name);
int indexB = tabbarSort.indexOf((b['type'] as TabType).name);
int indexA = tabbarSort.indexOf((a['type'] as HomeTabType).name);
int indexB = tabbarSort.indexOf((b['type'] as HomeTabType).name);
// 如果类型在 sortOrder 中不存在,则放在末尾
if (indexA == -1) indexA = tabbarSort.length;
@@ -34,8 +34,8 @@ class _TabbarSetPageState extends State<TabbarSetPage> {
void saveEdit() {
List<String> sortedTabbar = defaultTabs
.where((i) => tabbarSort.contains((i['type'] as TabType).name))
.map<String>((i) => (i['type'] as TabType).name)
.where((i) => tabbarSort.contains((i['type'] as HomeTabType).name))
.map<String>((i) => (i['type'] as HomeTabType).name)
.toList();
GStorage.setting.put(SettingBoxKey.tabbarSort, sortedTabbar);
SmartDialog.showToast('保存成功,下次启动时生效');
@@ -57,9 +57,10 @@ class _TabbarSetPageState extends State<TabbarSetPage> {
for (int i = 0; i < defaultTabs.length; i++) ...[
CheckboxListTile(
key: Key(defaultTabs[i]['label']),
value: tabbarSort.contains((defaultTabs[i]['type'] as TabType).name),
value:
tabbarSort.contains((defaultTabs[i]['type'] as HomeTabType).name),
onChanged: (bool? newValue) {
String tabTypeId = (defaultTabs[i]['type'] as TabType).name;
String tabTypeId = (defaultTabs[i]['type'] as HomeTabType).name;
if (!newValue!) {
tabbarSort.remove(tabTypeId);
} else {

View File

@@ -7,22 +7,27 @@ import 'package:PiliPlus/common/widgets/refresh_indicator.dart'
import 'package:PiliPlus/http/reply.dart';
import 'package:PiliPlus/http/video.dart';
import 'package:PiliPlus/main.dart';
import 'package:PiliPlus/models/common/account_type.dart';
import 'package:PiliPlus/models/common/audio_normalization.dart';
import 'package:PiliPlus/models/common/dynamic_badge_mode.dart';
import 'package:PiliPlus/models/common/dynamics_type.dart';
import 'package:PiliPlus/models/common/dynamic/dynamic_badge_mode.dart';
import 'package:PiliPlus/models/common/dynamic/dynamics_type.dart';
import 'package:PiliPlus/models/common/dynamic/up_panel_position.dart';
import 'package:PiliPlus/models/common/member/tab_type.dart';
import 'package:PiliPlus/models/common/msg/msg_unread_type.dart';
import 'package:PiliPlus/models/common/nav_bar_config.dart';
import 'package:PiliPlus/models/common/reply_sort_type.dart';
import 'package:PiliPlus/models/common/reply/reply_sort_type.dart';
import 'package:PiliPlus/models/common/settings_type.dart';
import 'package:PiliPlus/models/common/super_resolution_type.dart';
import 'package:PiliPlus/models/common/theme_type.dart';
import 'package:PiliPlus/models/common/up_panel_position.dart';
import 'package:PiliPlus/models/live/quality.dart';
import 'package:PiliPlus/models/video/play/CDN.dart';
import 'package:PiliPlus/models/video/play/quality.dart';
import 'package:PiliPlus/models/video/play/subtitle.dart';
import 'package:PiliPlus/models/common/theme/theme_type.dart';
import 'package:PiliPlus/models/common/video/CDN.dart';
import 'package:PiliPlus/models/common/video/audio_quality.dart';
import 'package:PiliPlus/models/common/video/live_quality.dart';
import 'package:PiliPlus/models/common/video/subtitle_pref_type.dart';
import 'package:PiliPlus/models/common/video/video_decode_type.dart';
import 'package:PiliPlus/models/common/video/video_quality.dart';
import 'package:PiliPlus/pages/home/controller.dart';
import 'package:PiliPlus/pages/hot/controller.dart';
import 'package:PiliPlus/pages/main/controller.dart';
import 'package:PiliPlus/pages/member/controller.dart';
import 'package:PiliPlus/pages/mine/controller.dart';
import 'package:PiliPlus/pages/rcmd/controller.dart';
import 'package:PiliPlus/pages/setting/pages/color_select.dart';
@@ -120,8 +125,6 @@ class SettingsModel {
});
}
enum SettingsType { normal, sw1tch, divider }
List<SettingsModel> get styleSettings => [
SettingsModel(
settingsType: SettingsType.sw1tch,
@@ -815,7 +818,7 @@ List<SettingsModel> get playSettings => [
title: '自动启用字幕',
leading: const Icon(Icons.closed_caption_outlined),
getSubtitle: () =>
'当前选择偏好:${SubtitlePreferenceCode.fromCode(GStorage.defaultSubtitlePreference)!.description}',
'当前选择偏好:${SubtitlePrefTypeExt.fromCode(GStorage.defaultSubtitlePreference)!.description}',
onTap: (setState) async {
String? result = await showDialog(
context: Get.context!,
@@ -823,8 +826,8 @@ List<SettingsModel> get playSettings => [
return SelectDialog<String>(
title: '字幕选择偏好',
value: GStorage.setting.get(SettingBoxKey.subtitlePreference,
defaultValue: SubtitlePreference.values.first.code),
values: SubtitlePreference.values
defaultValue: SubtitlePrefType.values.first.code),
values: SubtitlePrefType.values
.map((e) => (e.code, e.description))
.toList(),
);
@@ -1061,7 +1064,7 @@ List<SettingsModel> get videoSettings => [
title: '默认画质',
leading: const Icon(Icons.video_settings_outlined),
getSubtitle: () =>
'当前画质:${VideoQualityCode.fromCode(GStorage.defaultVideoQa)!.description}',
'当前画质:${VideoQualityExt.fromCode(GStorage.defaultVideoQa)!.description}',
onTap: (setState) async {
int? result = await showDialog(
context: Get.context!,
@@ -1086,7 +1089,7 @@ List<SettingsModel> get videoSettings => [
title: '蜂窝网络画质',
leading: const Icon(Icons.video_settings_outlined),
getSubtitle: () =>
'当前画质:${VideoQualityCode.fromCode(GStorage.defaultVideoQaCellular)!.description}',
'当前画质:${VideoQualityExt.fromCode(GStorage.defaultVideoQaCellular)!.description}',
onTap: (setState) async {
int? result = await showDialog(
context: Get.context!,
@@ -1112,7 +1115,7 @@ List<SettingsModel> get videoSettings => [
title: '默认音质',
leading: const Icon(Icons.music_video_outlined),
getSubtitle: () =>
'当前音质:${AudioQualityCode.fromCode(GStorage.defaultAudioQa)!.description}',
'当前音质:${AudioQualityExt.fromCode(GStorage.defaultAudioQa)!.description}',
onTap: (setState) async {
int? result = await showDialog(
context: Get.context!,
@@ -1137,7 +1140,7 @@ List<SettingsModel> get videoSettings => [
title: '蜂窝网络音质',
leading: const Icon(Icons.music_video_outlined),
getSubtitle: () =>
'当前音质:${AudioQualityCode.fromCode(GStorage.defaultAudioQaCellular)!.description}',
'当前音质:${AudioQualityExt.fromCode(GStorage.defaultAudioQaCellular)!.description}',
onTap: (setState) async {
int? result = await showDialog(
context: Get.context!,
@@ -1163,7 +1166,7 @@ List<SettingsModel> get videoSettings => [
title: '直播默认画质',
leading: const Icon(Icons.video_settings_outlined),
getSubtitle: () =>
'当前画质:${LiveQualityCode.fromCode(GStorage.liveQuality)!.description}',
'当前画质:${LiveQualityExt.fromCode(GStorage.liveQuality)!.description}',
onTap: (setState) async {
int? result = await showDialog(
context: Get.context!,
@@ -1188,7 +1191,7 @@ List<SettingsModel> get videoSettings => [
title: '蜂窝网络直播默认画质',
leading: const Icon(Icons.video_settings_outlined),
getSubtitle: () =>
'当前画质:${LiveQualityCode.fromCode(GStorage.liveQualityCellular)!.description}',
'当前画质:${LiveQualityExt.fromCode(GStorage.liveQualityCellular)!.description}',
onTap: (setState) async {
int? result = await showDialog(
context: Get.context!,
@@ -1214,7 +1217,7 @@ List<SettingsModel> get videoSettings => [
title: '首选解码格式',
leading: const Icon(Icons.movie_creation_outlined),
getSubtitle: () =>
'首选解码格式:${VideoDecodeFormatsCode.fromCode(GStorage.defaultDecode)!.description},请根据设备支持情况与需求调整',
'首选解码格式:${VideoDecodeFormatTypeExt.fromCode(GStorage.defaultDecode)!.description},请根据设备支持情况与需求调整',
onTap: (setState) async {
String? result = await showDialog(
context: Get.context!,
@@ -1222,7 +1225,7 @@ List<SettingsModel> get videoSettings => [
return SelectDialog<String>(
title: '默认解码格式',
value: GStorage.defaultDecode,
values: VideoDecodeFormats.values
values: VideoDecodeFormatType.values
.map((e) => (e.code, e.description))
.toList());
},
@@ -1237,7 +1240,7 @@ List<SettingsModel> get videoSettings => [
settingsType: SettingsType.normal,
title: '次选解码格式',
getSubtitle: () =>
'非杜比视频次选:${VideoDecodeFormatsCode.fromCode(GStorage.secondDecode)!.description},仍无则选择首个提供的解码格式',
'非杜比视频次选:${VideoDecodeFormatTypeExt.fromCode(GStorage.secondDecode)!.description},仍无则选择首个提供的解码格式',
leading: const Icon(Icons.swap_horizontal_circle_outlined),
onTap: (setState) async {
String? result = await showDialog(
@@ -1246,7 +1249,7 @@ List<SettingsModel> get videoSettings => [
return SelectDialog<String>(
title: '次选解码格式',
value: GStorage.secondDecode,
values: VideoDecodeFormats.values.map((e) {
values: VideoDecodeFormatType.values.map((e) {
return (e.code, e.description);
}).toList());
},
@@ -2358,7 +2361,7 @@ List<SettingsModel> get extraSettings => [
setKey: SettingBoxKey.defaultDynamicType,
leading: const Icon(Icons.dynamic_feed_outlined),
getSubtitle: () =>
'当前优先展示「${DynamicsType.values[GStorage.defaultDynamicType].labels}',
'当前优先展示「${DynamicsTabType.values[GStorage.defaultDynamicType].labels}',
onTap: (setState) async {
int? result = await showDialog(
context: Get.context!,
@@ -2366,7 +2369,7 @@ List<SettingsModel> get extraSettings => [
return SelectDialog<int>(
title: '动态展示',
value: GStorage.defaultDynamicType,
values: DynamicsType.values.sublist(0, 4).map((e) {
values: DynamicsTabType.values.sublist(0, 4).map((e) {
return (e.index, e.labels);
}).toList());
},

View File

@@ -2,7 +2,7 @@ import 'dart:async';
import 'package:PiliPlus/http/constants.dart';
import 'package:PiliPlus/http/video.dart';
import 'package:PiliPlus/models/video/play/CDN.dart';
import 'package:PiliPlus/models/common/video/CDN.dart';
import 'package:PiliPlus/models/video/play/url.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/video_utils.dart';

View File

@@ -1,4 +1,6 @@
import 'package:PiliPlus/models/video/play/quality.dart';
import 'package:PiliPlus/models/common/video/audio_quality.dart';
import 'package:PiliPlus/models/common/video/video_decode_type.dart';
import 'package:PiliPlus/models/common/video/video_quality.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
@@ -65,9 +67,9 @@ class _SetSelectItemState extends State<SetSelectItem> {
];
break;
case 'defaultDecode':
defaultVal = VideoDecodeFormats.values[0].description;
defaultVal = VideoDecodeFormatType.values[0].description;
currentVal = setting.get(widget.setKey, defaultValue: defaultVal);
List<VideoDecodeFormats> list = menus = VideoDecodeFormats.values;
List<VideoDecodeFormatType> list = menus = VideoDecodeFormatType.values;
currentIndex =
list.firstWhere((i) => i.description == currentVal).index;

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/models/common/settings_type.dart';
import 'package:PiliPlus/pages/setting/widgets/model.dart';
import 'package:PiliPlus/utils/grid.dart';
import 'package:easy_debounce/easy_throttle.dart';

View File

@@ -17,8 +17,10 @@ import 'package:PiliPlus/models/common/sponsor_block/post_segment_model.dart';
import 'package:PiliPlus/models/common/sponsor_block/segment_model.dart';
import 'package:PiliPlus/models/common/sponsor_block/segment_type.dart';
import 'package:PiliPlus/models/common/sponsor_block/skip_type.dart';
import 'package:PiliPlus/models/common/video/audio_quality.dart';
import 'package:PiliPlus/models/common/video/video_decode_type.dart';
import 'package:PiliPlus/models/common/video/video_quality.dart';
import 'package:PiliPlus/models/video/later.dart';
import 'package:PiliPlus/models/video/play/quality.dart';
import 'package:PiliPlus/models/video/play/url.dart';
import 'package:PiliPlus/models/video_detail_res.dart';
import 'package:PiliPlus/pages/search/widgets/search_text.dart';
@@ -72,7 +74,7 @@ class VideoDetailController extends GetxController
/// 播放器配置 画质 音质 解码格式
late VideoQuality currentVideoQa;
AudioQuality? currentAudioQa;
late VideoDecodeFormats currentDecodeFormats;
late VideoDecodeFormatType currentDecodeFormats;
// 是否开始自动播放 存在多p的情况下第二p需要为true
RxBool autoPlay = true.obs;
// 封面图的展示
@@ -273,9 +275,9 @@ class VideoDetailController extends GetxController
// 预设的解码格式
cacheDecode = setting.get(SettingBoxKey.defaultDecode,
defaultValue: VideoDecodeFormats.values.last.code);
defaultValue: VideoDecodeFormatType.values.last.code);
cacheSecondDecode = setting.get(SettingBoxKey.secondDecode,
defaultValue: VideoDecodeFormats.values[1].code);
defaultValue: VideoDecodeFormatType.values[1].code);
oid.value = IdUtils.bv2av(Get.parameters['bvid']!);
}
@@ -984,10 +986,10 @@ class VideoDetailController extends GetxController
data.dash!.video!.where((i) => i.id == currentVideoQa.code).toList();
final List supportDecodeFormats = videoList.map((e) => e.codecs!).toList();
VideoDecodeFormats defaultDecodeFormats =
VideoDecodeFormatsCode.fromString(cacheDecode)!;
VideoDecodeFormats secondDecodeFormats =
VideoDecodeFormatsCode.fromString(cacheSecondDecode)!;
VideoDecodeFormatType defaultDecodeFormats =
VideoDecodeFormatTypeExt.fromString(cacheDecode)!;
VideoDecodeFormatType secondDecodeFormats =
VideoDecodeFormatTypeExt.fromString(cacheSecondDecode)!;
try {
// 当前视频没有对应格式返回第一个
int flag = 0;
@@ -1011,7 +1013,7 @@ class VideoDetailController extends GetxController
} else {
if (currentVideoQa == VideoQuality.dolbyVision) {
currentDecodeFormats =
VideoDecodeFormatsCode.fromString(videoList.first.codecs!)!;
VideoDecodeFormatTypeExt.fromString(videoList.first.codecs!)!;
firstVideo = videoList.first;
} else if (flag == 2) {
//defaultDecodeFormats
@@ -1029,7 +1031,7 @@ class VideoDetailController extends GetxController
);
} else if (flag == 0) {
currentDecodeFormats =
VideoDecodeFormatsCode.fromString(supportDecodeFormats.first)!;
VideoDecodeFormatTypeExt.fromString(supportDecodeFormats.first)!;
firstVideo = videoList.first;
}
}
@@ -1167,10 +1169,10 @@ class VideoDetailController extends GetxController
id: data.quality!,
baseUrl: videoUrl,
codecs: 'avc1',
quality: VideoQualityCode.fromCode(data.quality!)!);
quality: VideoQualityExt.fromCode(data.quality!)!);
setVideoHeight();
currentDecodeFormats = VideoDecodeFormatsCode.fromString('avc1')!;
currentVideoQa = VideoQualityCode.fromCode(data.quality!)!;
currentDecodeFormats = VideoDecodeFormatTypeExt.fromString('avc1')!;
currentVideoQa = VideoQualityExt.fromCode(data.quality!)!;
if (autoPlay.value) {
isShowCover.value = false;
await playerInit();
@@ -1204,7 +1206,7 @@ class VideoDetailController extends GetxController
resVideoQa =
Utils.findClosestNumber(plPlayerController.cacheVideoQa!, numbers);
}
currentVideoQa = VideoQualityCode.fromCode(resVideoQa)!;
currentVideoQa = VideoQualityExt.fromCode(resVideoQa)!;
/// 取出符合当前画质的videoList
final List<VideoItem> videosList =
@@ -1218,9 +1220,9 @@ class VideoDetailController extends GetxController
orElse: () => supportFormats.first)
.codecs!;
// 默认从设置中取AV1
currentDecodeFormats = VideoDecodeFormatsCode.fromString(cacheDecode)!;
VideoDecodeFormats secondDecodeFormats =
VideoDecodeFormatsCode.fromString(cacheSecondDecode)!;
currentDecodeFormats = VideoDecodeFormatTypeExt.fromString(cacheDecode)!;
VideoDecodeFormatType secondDecodeFormats =
VideoDecodeFormatTypeExt.fromString(cacheSecondDecode)!;
// 当前视频没有对应格式返回第一个
int flag = 0;
for (var i in supportDecodeFormats) {
@@ -1235,7 +1237,7 @@ class VideoDetailController extends GetxController
currentDecodeFormats = secondDecodeFormats;
} else if (flag == 0) {
currentDecodeFormats =
VideoDecodeFormatsCode.fromString(supportDecodeFormats.first)!;
VideoDecodeFormatTypeExt.fromString(supportDecodeFormats.first)!;
}
/// 取出符合当前解码格式的videoItem
@@ -1272,7 +1274,7 @@ class VideoDetailController extends GetxController
orElse: () => audiosList.first);
audioUrl = VideoUtils.getCdnUrl(firstAudio);
if (firstAudio.id != null) {
currentAudioQa = AudioQualityCode.fromCode(firstAudio.id!)!;
currentAudioQa = AudioQualityExt.fromCode(firstAudio.id!)!;
}
} else {
firstAudio = AudioItem();

View File

@@ -4,12 +4,11 @@ import 'package:PiliPlus/common/constants.dart';
import 'package:PiliPlus/common/widgets/badge.dart';
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart'
show SourceModel;
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/stat/stat.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/bangumi/info.dart';
import 'package:PiliPlus/models/common/image_preview_type.dart';
import 'package:PiliPlus/pages/video/controller.dart';
import 'package:PiliPlus/pages/video/introduction/pgc/controller.dart';
import 'package:PiliPlus/pages/video/introduction/pgc/widgets/bangumi_panel.dart';

View File

@@ -1,10 +1,10 @@
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/member.dart';
import 'package:PiliPlus/models/common/member/contribute_type.dart';
import 'package:PiliPlus/models/member/info.dart';
import 'package:PiliPlus/models/space_archive/data.dart';
import 'package:PiliPlus/models/space_archive/item.dart';
import 'package:PiliPlus/pages/common/common_data_controller.dart';
import 'package:PiliPlus/pages/member_contribute/view.dart' show ContributeType;
import 'package:get/get.dart';
class HorizontalMemberPageController extends CommonDataController {

View File

@@ -1,12 +1,11 @@
import 'package:PiliPlus/common/widgets/button/icon_button.dart';
import 'package:PiliPlus/common/widgets/custom_sliver_persistent_header_delegate.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart'
show SourceModel;
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
import 'package:PiliPlus/common/widgets/video_card/video_card_h_member_video.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/image_preview_type.dart';
import 'package:PiliPlus/models/member/info.dart';
import 'package:PiliPlus/models/space_archive/item.dart';
import 'package:PiliPlus/pages/video/controller.dart';

View File

@@ -5,8 +5,8 @@ import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'
show ReplyInfo;
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/reply_sort_type.dart';
import 'package:PiliPlus/models/common/reply_type.dart';
import 'package:PiliPlus/models/common/reply/reply_sort_type.dart';
import 'package:PiliPlus/models/common/reply/reply_type.dart';
import 'package:PiliPlus/pages/video/reply/controller.dart';
import 'package:PiliPlus/pages/video/reply/widgets/reply_item_grpc.dart';
import 'package:PiliPlus/utils/extension.dart';

View File

@@ -3,7 +3,8 @@ import 'dart:async';
import 'package:PiliPlus/common/widgets/button/toolbar_icon_button.dart';
import 'package:PiliPlus/http/video.dart';
import 'package:PiliPlus/main.dart';
import 'package:PiliPlus/models/common/reply_type.dart';
import 'package:PiliPlus/models/common/publish_panel_type.dart';
import 'package:PiliPlus/models/common/reply/reply_type.dart';
import 'package:PiliPlus/pages/common/common_publish_page.dart';
import 'package:PiliPlus/pages/emote/view.dart';
import 'package:PiliPlus/utils/storage.dart';

View File

@@ -2,7 +2,7 @@ import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'
show ReplyInfo, DetailListReply, Mode;
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/reply.dart';
import 'package:PiliPlus/models/common/reply_type.dart';
import 'package:PiliPlus/models/common/reply/reply_type.dart';
import 'package:PiliPlus/pages/common/reply_controller.dart';
import 'package:PiliPlus/utils/id_utils.dart';
import 'package:PiliPlus/utils/storage.dart';

View File

@@ -4,7 +4,7 @@ import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'
show ReplyInfo, Mode;
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/reply_type.dart';
import 'package:PiliPlus/models/common/reply/reply_type.dart';
import 'package:PiliPlus/pages/common/common_slide_page.dart';
import 'package:PiliPlus/pages/video/reply/widgets/reply_item_grpc.dart';
import 'package:PiliPlus/pages/video/reply_new/view.dart';

View File

@@ -3,6 +3,7 @@ import 'dart:async';
import 'package:PiliPlus/common/widgets/button/icon_button.dart';
import 'package:PiliPlus/http/danmaku.dart';
import 'package:PiliPlus/main.dart';
import 'package:PiliPlus/models/common/publish_panel_type.dart';
import 'package:PiliPlus/pages/common/common_publish_page.dart';
import 'package:PiliPlus/pages/setting/slide_color_picker.dart';
import 'package:PiliPlus/utils/extension.dart';

View File

@@ -11,7 +11,8 @@ import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/main.dart';
import 'package:PiliPlus/models/bangumi/info.dart' as bangumi;
import 'package:PiliPlus/models/bangumi/info.dart';
import 'package:PiliPlus/models/common/reply_type.dart';
import 'package:PiliPlus/models/common/episode_panel_type.dart';
import 'package:PiliPlus/models/common/reply/reply_type.dart';
import 'package:PiliPlus/models/common/search_type.dart';
import 'package:PiliPlus/models/video_detail_res.dart' as video;
import 'package:PiliPlus/pages/danmaku/view.dart';

View File

@@ -6,8 +6,10 @@ import 'package:PiliPlus/common/widgets/button/icon_button.dart';
import 'package:PiliPlus/common/widgets/self_sized_horizontal_list.dart';
import 'package:PiliPlus/models/common/search_type.dart';
import 'package:PiliPlus/models/common/super_resolution_type.dart';
import 'package:PiliPlus/models/video/play/CDN.dart';
import 'package:PiliPlus/models/video/play/quality.dart';
import 'package:PiliPlus/models/common/video/CDN.dart';
import 'package:PiliPlus/models/common/video/audio_quality.dart';
import 'package:PiliPlus/models/common/video/video_decode_type.dart';
import 'package:PiliPlus/models/common/video/video_quality.dart';
import 'package:PiliPlus/models/video/play/url.dart';
import 'package:PiliPlus/pages/setting/widgets/select_dialog.dart';
import 'package:PiliPlus/pages/setting/widgets/switch_item.dart';
@@ -648,7 +650,7 @@ class HeaderControlState extends State<HeaderControl> {
final int quality = videoFormat[i].quality!;
videoDetailCtr
..currentVideoQa =
VideoQualityCode.fromCode(quality)!
VideoQualityExt.fromCode(quality)!
..updatePlayer();
// update
@@ -657,7 +659,7 @@ class HeaderControlState extends State<HeaderControl> {
.checkConnectivity()
.then((res) {
if (res.contains(ConnectivityResult.wifi)) {
oldQualityDesc = VideoQualityCode.fromCode(
oldQualityDesc = VideoQualityExt.fromCode(
GStorage.defaultVideoQa)!
.description;
setting.put(
@@ -665,7 +667,7 @@ class HeaderControlState extends State<HeaderControl> {
quality,
);
} else {
oldQualityDesc = VideoQualityCode.fromCode(
oldQualityDesc = VideoQualityExt.fromCode(
GStorage.defaultVideoQaCellular)!
.description;
setting.put(
@@ -675,7 +677,7 @@ class HeaderControlState extends State<HeaderControl> {
}
});
SmartDialog.showToast(
"默认画质由:$oldQualityDesc 变为:${VideoQualityCode.fromCode(quality)!.description}",
"默认画质由:$oldQualityDesc 变为:${VideoQualityExt.fromCode(quality)!.description}",
);
},
// 可能包含会员解锁画质
@@ -743,7 +745,7 @@ class HeaderControlState extends State<HeaderControl> {
final int quality = i.id!;
videoDetailCtr
..currentAudioQa =
AudioQualityCode.fromCode(quality)!
AudioQualityExt.fromCode(quality)!
..updatePlayer();
// update
@@ -752,7 +754,7 @@ class HeaderControlState extends State<HeaderControl> {
.checkConnectivity()
.then((res) {
if (res.contains(ConnectivityResult.wifi)) {
oldQualityDesc = AudioQualityCode.fromCode(
oldQualityDesc = AudioQualityExt.fromCode(
GStorage.defaultAudioQa)!
.description;
setting.put(
@@ -760,7 +762,7 @@ class HeaderControlState extends State<HeaderControl> {
quality,
);
} else {
oldQualityDesc = AudioQualityCode.fromCode(
oldQualityDesc = AudioQualityExt.fromCode(
GStorage.defaultAudioQaCellular)!
.description;
setting.put(
@@ -770,7 +772,7 @@ class HeaderControlState extends State<HeaderControl> {
}
});
SmartDialog.showToast(
"默认音质由:$oldQualityDesc 变为:${AudioQualityCode.fromCode(quality)!.description}",
"默认音质由:$oldQualityDesc 变为:${AudioQualityExt.fromCode(quality)!.description}",
);
},
contentPadding:
@@ -803,7 +805,7 @@ class HeaderControlState extends State<HeaderControl> {
// 选择解码格式
void showSetDecodeFormats() {
// 当前选中的解码格式
final VideoDecodeFormats currentDecodeFormats =
final VideoDecodeFormatType currentDecodeFormats =
videoDetailCtr.currentDecodeFormats;
final VideoItem firstVideo = videoDetailCtr.firstVideo;
// 当前视频可用的解码格式
@@ -845,13 +847,13 @@ class HeaderControlState extends State<HeaderControl> {
}
videoDetailCtr
..currentDecodeFormats =
VideoDecodeFormatsCode.fromString(i)!
VideoDecodeFormatTypeExt.fromString(i)!
..updatePlayer();
Get.back();
},
contentPadding:
const EdgeInsets.only(left: 20, right: 20),
title: Text(VideoDecodeFormatsCode.fromString(i)!
title: Text(VideoDecodeFormatTypeExt.fromString(i)!
.description),
subtitle: Text(
i!,

View File

@@ -1,6 +1,7 @@
import 'dart:io';
import 'package:PiliPlus/http/init.dart';
import 'package:PiliPlus/models/common/webview_menu_type.dart';
import 'package:PiliPlus/utils/accounts/account.dart';
import 'package:PiliPlus/utils/app_scheme.dart';
import 'package:PiliPlus/utils/cache_manage.dart';
@@ -12,26 +13,6 @@ import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
enum _WebviewMenuItem {
refresh,
copy,
openInBrowser,
clearCache,
resetCookie,
goBack,
}
extension _WebviewMenuItemExt on _WebviewMenuItem {
String get title => const [
'刷新',
'复制链接',
'浏览器中打开',
'清除缓存',
'重新设置Cookie',
'返回',
][index];
}
class WebviewPage extends StatefulWidget {
const WebviewPage({super.key, this.url, this.oid, this.title, this.uaType});
@@ -96,22 +77,22 @@ class _WebviewPageState extends State<WebviewPage> {
PopupMenuButton(
onSelected: (item) async {
switch (item) {
case _WebviewMenuItem.refresh:
case WebviewMenuItem.refresh:
_webViewController?.reload();
break;
case _WebviewMenuItem.copy:
case WebviewMenuItem.copy:
WebUri? uri = await _webViewController?.getUrl();
if (uri != null) {
Utils.copyText(uri.toString());
}
break;
case _WebviewMenuItem.openInBrowser:
case WebviewMenuItem.openInBrowser:
WebUri? uri = await _webViewController?.getUrl();
if (uri != null) {
PageUtils.launchURL(uri.toString());
}
break;
case _WebviewMenuItem.clearCache:
case WebviewMenuItem.clearCache:
try {
await InAppWebViewController.clearAllCache();
await _webViewController?.clearHistory();
@@ -120,14 +101,14 @@ class _WebviewPageState extends State<WebviewPage> {
SmartDialog.showToast(e.toString());
}
break;
case _WebviewMenuItem.goBack:
case WebviewMenuItem.goBack:
if (await _webViewController?.canGoBack() == true) {
_webViewController?.goBack();
} else {
Get.back();
}
break;
case _WebviewMenuItem.resetCookie:
case WebviewMenuItem.resetCookie:
final cookies = Accounts.main.cookieJar.toList();
for (var item in cookies) {
await CookieManager().setCookie(
@@ -144,16 +125,16 @@ class _WebviewPageState extends State<WebviewPage> {
break;
}
},
itemBuilder: (context) => <PopupMenuEntry<_WebviewMenuItem>>[
..._WebviewMenuItem.values
.sublist(0, _WebviewMenuItem.values.length - 1)
itemBuilder: (context) => <PopupMenuEntry<WebviewMenuItem>>[
...WebviewMenuItem.values
.sublist(0, WebviewMenuItem.values.length - 1)
.map((item) => PopupMenuItem(
value: item, child: Text(item.title))),
const PopupMenuDivider(),
PopupMenuItem(
value: _WebviewMenuItem.goBack,
value: WebviewMenuItem.goBack,
child: Text(
_WebviewMenuItem.goBack.title,
WebviewMenuItem.goBack.title,
style: TextStyle(
color: Theme.of(context).colorScheme.error),
)),

View File

@@ -1,23 +1,24 @@
import 'dart:async';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/msg.dart';
import 'package:PiliPlus/models/common/publish_panel_type.dart';
import 'package:PiliPlus/models/msg/session.dart';
import 'package:PiliPlus/pages/common/common_publish_page.dart';
import 'package:PiliPlus/pages/emote/view.dart';
import 'package:PiliPlus/pages/whisper_detail/controller.dart';
import 'package:PiliPlus/pages/whisper_detail/widget/chat_item.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/feed_back.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import 'package:mime/mime.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/pages/whisper_detail/controller.dart';
import 'package:PiliPlus/utils/feed_back.dart';
import 'package:image_picker/image_picker.dart';
import 'package:PiliPlus/pages/whisper_detail/widget/chat_item.dart';
import 'package:mime/mime.dart';
class WhisperDetailPage extends CommonPublishPage {
const WhisperDetailPage({

View File

@@ -1,8 +1,9 @@
import 'dart:convert';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart';
import 'package:PiliPlus/http/search.dart';
import 'package:PiliPlus/models/common/image_preview_type.dart';
import 'package:PiliPlus/models/common/msg/msg_type.dart';
import 'package:PiliPlus/models/msg/session.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/id_utils.dart';
@@ -12,34 +13,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
enum MsgType {
invalid(value: 0, label: "空空的~"),
text(value: 1, label: "文本消息"),
pic(value: 2, label: "图片消息"),
audio(value: 3, label: "语音消息"),
share(value: 4, label: "分享消息"),
revoke(value: 5, label: "撤回消息"),
customFace(value: 6, label: "自定义表情"),
shareV2(value: 7, label: "分享v2消息"),
sysCancel(value: 8, label: "系统撤销"),
miniProgram(value: 9, label: "小程序"),
notifyMsg(value: 10, label: "业务通知"),
archiveCard(value: 11, label: "投稿卡片"),
articleCard(value: 12, label: "专栏卡片"),
picCard(value: 13, label: "图片卡片"),
commonShare(value: 14, label: "异形卡片"),
autoReplyPush(value: 16, label: "自动回复推送"),
notifyText(value: 18, label: "文本提示");
final int value;
final String label;
const MsgType({required this.value, required this.label});
static MsgType parse(int value) {
return MsgType.values
.firstWhere((e) => e.value == value, orElse: () => MsgType.invalid);
}
}
class ChatItem extends StatelessWidget {
final MessageItem item;
final List? eInfos;