mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-06 09:13:48 +08:00
refa: search dyn
Closes #641 Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
@@ -370,7 +370,9 @@ class Api {
|
|||||||
static const String memberArchive = '/x/space/wbi/arc/search';
|
static const String memberArchive = '/x/space/wbi/arc/search';
|
||||||
|
|
||||||
// 用户动态搜索
|
// 用户动态搜索
|
||||||
static const String memberDynamicSearch = '/x/space/dynamic/search';
|
// static const String memberDynamicSearch = '/x/space/dynamic/search';
|
||||||
|
static const String memberDynamicSearch =
|
||||||
|
'/x/polymer/web-dynamic/v1/feed/space/search';
|
||||||
|
|
||||||
// 用户动态
|
// 用户动态
|
||||||
static const String memberDynamic = '/x/polymer/web-dynamic/v1/feed/space';
|
static const String memberDynamic = '/x/polymer/web-dynamic/v1/feed/space';
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ class DynamicsHttp {
|
|||||||
if (id != null) 'id': id,
|
if (id != null) 'id': id,
|
||||||
if (rid != null) 'rid': rid,
|
if (rid != null) 'rid': rid,
|
||||||
if (type != null) 'type': type,
|
if (type != null) 'type': type,
|
||||||
'features': 'itemOpusStyle',
|
'features': 'itemOpusStyle,listOnlyfans',
|
||||||
},
|
},
|
||||||
options:
|
options:
|
||||||
clearCookie ? Options(extra: {'account': AnonymousAccount()}) : null,
|
clearCookie ? Options(extra: {'account': AnonymousAccount()}) : null,
|
||||||
|
|||||||
@@ -428,23 +428,27 @@ class MemberHttp {
|
|||||||
|
|
||||||
// 搜索用户动态
|
// 搜索用户动态
|
||||||
static Future memberDynamicSearch({
|
static Future memberDynamicSearch({
|
||||||
int? pn,
|
required int pn,
|
||||||
int? ps,
|
required dynamic mid,
|
||||||
int? mid,
|
required dynamic offset,
|
||||||
required String keyword,
|
required String keyword,
|
||||||
}) async {
|
}) async {
|
||||||
var res = await Request().get(Api.memberDynamicSearch, queryParameters: {
|
var res = await Request().get(
|
||||||
|
Api.memberDynamicSearch,
|
||||||
|
queryParameters: {
|
||||||
|
'host_mid': mid,
|
||||||
|
'page': pn,
|
||||||
|
'offset': offset,
|
||||||
'keyword': keyword,
|
'keyword': keyword,
|
||||||
'mid': mid,
|
'features': 'itemOpusStyle,listOnlyfans',
|
||||||
'pn': pn,
|
'web_location': 333.1387,
|
||||||
'ps': ps,
|
},
|
||||||
'platform': 'web'
|
);
|
||||||
});
|
|
||||||
if (res.data['code'] == 0) {
|
if (res.data['code'] == 0) {
|
||||||
return {
|
return {
|
||||||
'status': true,
|
'status': true,
|
||||||
'data': res.data['data']['cards'],
|
'data': DynamicsDataModel.fromJson(res.data['data']).items,
|
||||||
'count': res.data['data']['total']
|
'count': res.data['data']?['total'],
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ class MemberSearchController extends GetxController
|
|||||||
bool isEndArchive = false;
|
bool isEndArchive = false;
|
||||||
Rx<LoadingState> archiveState = LoadingState.loading().obs;
|
Rx<LoadingState> archiveState = LoadingState.loading().obs;
|
||||||
|
|
||||||
|
String offset = '';
|
||||||
int dynamicPn = 1;
|
int dynamicPn = 1;
|
||||||
RxInt dynamicCount = (-1).obs;
|
RxInt dynamicCount = (-1).obs;
|
||||||
bool isEndDynamic = false;
|
bool isEndDynamic = false;
|
||||||
@@ -66,6 +67,7 @@ class MemberSearchController extends GetxController
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future refreshDynamic() async {
|
Future refreshDynamic() async {
|
||||||
|
offset = '';
|
||||||
dynamicPn = 1;
|
dynamicPn = 1;
|
||||||
isEndDynamic = false;
|
isEndDynamic = false;
|
||||||
await searchDynamic();
|
await searchDynamic();
|
||||||
@@ -82,12 +84,12 @@ class MemberSearchController extends GetxController
|
|||||||
dynamic res = await MemberHttp.memberDynamicSearch(
|
dynamic res = await MemberHttp.memberDynamicSearch(
|
||||||
mid: mid,
|
mid: mid,
|
||||||
pn: dynamicPn,
|
pn: dynamicPn,
|
||||||
ps: 30,
|
offset: offset,
|
||||||
keyword: textEditingController.text,
|
keyword: textEditingController.text,
|
||||||
);
|
);
|
||||||
if (res['status']) {
|
if (res['status']) {
|
||||||
if (isRefresh) {
|
if (isRefresh) {
|
||||||
dynamicCount.value = res['count'];
|
dynamicCount.value = res['count'] ?? -1;
|
||||||
}
|
}
|
||||||
if (isRefresh.not && dynamicState.value is Success) {
|
if (isRefresh.not && dynamicState.value is Success) {
|
||||||
res['data'].insertAll(0, (dynamicState.value as Success).response);
|
res['data'].insertAll(0, (dynamicState.value as Success).response);
|
||||||
|
|||||||
@@ -1,14 +1,12 @@
|
|||||||
import 'dart:convert';
|
|
||||||
|
|
||||||
import 'package:PiliPlus/common/constants.dart';
|
import 'package:PiliPlus/common/constants.dart';
|
||||||
import 'package:PiliPlus/common/widgets/loading_widget.dart';
|
import 'package:PiliPlus/common/widgets/loading_widget.dart';
|
||||||
import 'package:PiliPlus/common/widgets/network_img_layer.dart';
|
import 'package:PiliPlus/common/widgets/network_img_layer.dart';
|
||||||
import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
|
import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
|
||||||
import 'package:PiliPlus/http/loading_state.dart';
|
import 'package:PiliPlus/http/loading_state.dart';
|
||||||
|
import 'package:PiliPlus/pages/dynamics/widgets/dynamic_panel.dart';
|
||||||
import 'package:PiliPlus/pages/member_search/controller.dart';
|
import 'package:PiliPlus/pages/member_search/controller.dart';
|
||||||
import 'package:PiliPlus/utils/extension.dart';
|
import 'package:PiliPlus/utils/extension.dart';
|
||||||
import 'package:PiliPlus/utils/grid.dart';
|
import 'package:PiliPlus/utils/grid.dart';
|
||||||
import 'package:PiliPlus/utils/id_utils.dart';
|
|
||||||
import 'package:PiliPlus/utils/storage.dart';
|
import 'package:PiliPlus/utils/storage.dart';
|
||||||
import 'package:PiliPlus/utils/utils.dart';
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:easy_debounce/easy_throttle.dart';
|
import 'package:easy_debounce/easy_throttle.dart';
|
||||||
@@ -63,7 +61,7 @@ class SearchDynamic extends StatelessWidget {
|
|||||||
: LastChildLayoutType.none;
|
: LastChildLayoutType.none;
|
||||||
},
|
},
|
||||||
children: (loadingState.response as List)
|
children: (loadingState.response as List)
|
||||||
.map((item) => _buildItem(context, item))
|
.map((item) => DynamicPanel(item: item))
|
||||||
.toList(),
|
.toList(),
|
||||||
)
|
)
|
||||||
: SliverCrossAxisGroup(
|
: SliverCrossAxisGroup(
|
||||||
@@ -82,9 +80,8 @@ class SearchDynamic extends StatelessWidget {
|
|||||||
ctr.searchDynamic(false);
|
ctr.searchDynamic(false);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return _buildItem(
|
return DynamicPanel(
|
||||||
context,
|
item: loadingState.response[index],
|
||||||
loadingState.response[index],
|
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
childCount: loadingState.response.length,
|
childCount: loadingState.response.length,
|
||||||
@@ -163,131 +160,4 @@ class SearchDynamic extends StatelessWidget {
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildItem(context, item) {
|
|
||||||
try {
|
|
||||||
dynamic json = jsonDecode('${item['card']}');
|
|
||||||
return switch (item['desc']['type']) {
|
|
||||||
1 => _buildDynamic(
|
|
||||||
context: context,
|
|
||||||
id: item['desc']['dynamic_id_str'],
|
|
||||||
face: json['user']['face'],
|
|
||||||
name: json['user']['uname'],
|
|
||||||
vip: item['desc']['user_profile']['vip'],
|
|
||||||
pubTime: item['desc']['timestamp'],
|
|
||||||
content: json['item']['content'],
|
|
||||||
),
|
|
||||||
2 => _buildDynamic(
|
|
||||||
context: context,
|
|
||||||
id: item['desc']['dynamic_id_str'],
|
|
||||||
face: json['user']['head_url'],
|
|
||||||
name: json['user']['name'],
|
|
||||||
vip: json['user']['vip'],
|
|
||||||
pubTime: json['item']['upload_time'],
|
|
||||||
content: json['item']['description'],
|
|
||||||
),
|
|
||||||
4 => _buildDynamic(
|
|
||||||
context: context,
|
|
||||||
id: item['desc']['dynamic_id_str'],
|
|
||||||
face: json['user']['face'],
|
|
||||||
name: json['user']['uname'],
|
|
||||||
vip: item['desc']['user_profile']['vip'],
|
|
||||||
pubTime: item['desc']['timestamp'],
|
|
||||||
content: json['item']['content'],
|
|
||||||
),
|
|
||||||
8 => _buildVideo(context, json),
|
|
||||||
_ => _buildDef(item),
|
|
||||||
};
|
|
||||||
} catch (e) {
|
|
||||||
debugPrint('$e');
|
|
||||||
return _buildDef(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_buildDynamic({
|
|
||||||
required dynamic id,
|
|
||||||
required BuildContext context,
|
|
||||||
required String face,
|
|
||||||
required String name,
|
|
||||||
required dynamic vip,
|
|
||||||
required dynamic pubTime,
|
|
||||||
required String content,
|
|
||||||
}) {
|
|
||||||
return InkWell(
|
|
||||||
onTap: () {
|
|
||||||
Utils.pushDynFromId(id);
|
|
||||||
},
|
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10),
|
|
||||||
child: Column(
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
_buildHeader(
|
|
||||||
context: context,
|
|
||||||
face: face,
|
|
||||||
name: name,
|
|
||||||
vip: vip,
|
|
||||||
pubTime: pubTime,
|
|
||||||
),
|
|
||||||
const SizedBox(height: 5),
|
|
||||||
Text(
|
|
||||||
content,
|
|
||||||
style: TextStyle(fontSize: 15),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
_buildVideo(context, json) {
|
|
||||||
return ListTile(
|
|
||||||
dense: true,
|
|
||||||
onTap: () {
|
|
||||||
Utils.toViewPage(
|
|
||||||
'bvid=${IdUtils.av2bv(json['aid'])}&cid=${json['cid']}',
|
|
||||||
arguments: {
|
|
||||||
'heroTag': Utils.makeHeroTag(json['aid']),
|
|
||||||
},
|
|
||||||
);
|
|
||||||
},
|
|
||||||
title: Text(
|
|
||||||
'${json['title']}',
|
|
||||||
maxLines: 20,
|
|
||||||
style: TextStyle(fontSize: 15),
|
|
||||||
),
|
|
||||||
subtitle: Text(
|
|
||||||
'${Utils.dateFormat(json['pubdate'])} · ${Utils.numFormat(json['stat']['view'])}观看 · ${Utils.numFormat(json['stat']['danmaku'])}弹幕',
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 13,
|
|
||||||
color: Theme.of(context).colorScheme.outline,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
leading: (json['pic'] as String?)?.isNotEmpty == true
|
|
||||||
? Container(
|
|
||||||
margin: const EdgeInsets.symmetric(vertical: 6),
|
|
||||||
child: LayoutBuilder(
|
|
||||||
builder: (context, constraints) {
|
|
||||||
return NetworkImgLayer(
|
|
||||||
radius: 6,
|
|
||||||
src: json['pic'],
|
|
||||||
width: constraints.maxHeight * StyleString.aspectRatio,
|
|
||||||
height: constraints.maxHeight,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
)
|
|
||||||
: null,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
_buildDef(item) => ListTile(
|
|
||||||
dense: true,
|
|
||||||
onTap: () {
|
|
||||||
Utils.copyText(jsonEncode(item));
|
|
||||||
},
|
|
||||||
title: Text('$item'),
|
|
||||||
subtitle: Text('${item['desc']['type']}'),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user