filter group peers without http request

Signed-off-by: 21pages <pages21@163.com>
This commit is contained in:
21pages 2023-06-21 09:30:32 +08:00
parent af309096c9
commit ec9062f505
4 changed files with 108 additions and 91 deletions

View File

@ -48,7 +48,7 @@ class PeerPayload {
note = json['note'] ?? ''; note = json['note'] ?? '';
static Peer toPeer(PeerPayload p) { static Peer toPeer(PeerPayload p) {
return Peer.fromJson({"id": p.id}); return Peer.fromJson({"id": p.id, "username": p.user_name});
} }
} }

View File

@ -16,8 +16,8 @@ class MyGroup extends StatefulWidget {
} }
class _MyGroupState extends State<MyGroup> { class _MyGroupState extends State<MyGroup> {
static final RxString selectedUser = ''.obs; RxString get selectedUser => gFFI.groupModel.selectedUser;
static final RxString searchUserText = ''.obs; RxString get searchUserText => gFFI.groupModel.searchUserText;
static TextEditingController searchUserController = TextEditingController(); static TextEditingController searchUserController = TextEditingController();
@override @override
@ -37,8 +37,10 @@ class _MyGroupState extends State<MyGroup> {
}); });
Future<Widget> buildBody(BuildContext context) async { Future<Widget> buildBody(BuildContext context) async {
gFFI.groupModel.pullUserPeers();
return Obx(() { return Obx(() {
if (gFFI.groupModel.groupLoading.value) { if (gFFI.groupModel.groupLoading.value ||
gFFI.groupModel.peerLoading.value) {
return const Center( return const Center(
child: CircularProgressIndicator(), child: CircularProgressIndicator(),
); );
@ -70,85 +72,81 @@ class _MyGroupState extends State<MyGroup> {
} }
Widget _buildDesktop() { Widget _buildDesktop() {
return Obx( return Row(
() => Row( children: [
children: [ Card(
Card( margin: EdgeInsets.symmetric(horizontal: 4.0),
margin: EdgeInsets.symmetric(horizontal: 4.0), shape: RoundedRectangleBorder(
shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12),
borderRadius: BorderRadius.circular(12), side:
side: BorderSide( BorderSide(color: Theme.of(context).scaffoldBackgroundColor)),
color: Theme.of(context).scaffoldBackgroundColor)), child: Container(
child: Container( width: 200,
width: 200, height: double.infinity,
height: double.infinity, padding:
padding: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 8.0),
const EdgeInsets.symmetric(horizontal: 12.0, vertical: 8.0), child: Column(
child: Column( children: [
children: [ _buildLeftHeader(),
_buildLeftHeader(), Expanded(
Expanded( child: Container(
child: Container( width: double.infinity,
width: double.infinity, height: double.infinity,
height: double.infinity, decoration:
decoration: BoxDecoration(borderRadius: BorderRadius.circular(2)),
BoxDecoration(borderRadius: BorderRadius.circular(2)), child: _buildUserContacts(),
child: _buildUserContacts(), ).marginSymmetric(vertical: 8.0),
).marginSymmetric(vertical: 8.0), )
) ],
],
),
), ),
).marginOnly(right: 8.0), ),
Expanded( ).marginOnly(right: 8.0),
child: Align( Expanded(
alignment: Alignment.topLeft, child: Align(
child: MyGroupPeerView( alignment: Alignment.topLeft,
menuPadding: widget.menuPadding, child: MyGroupPeerView(
initPeers: gFFI.groupModel.peersShow.value)), menuPadding: widget.menuPadding,
) initPeers: gFFI.groupModel.peersShow)),
], )
), ],
); );
} }
Widget _buildMobile() { Widget _buildMobile() {
return Obx( return Column(
() => Column( children: [
children: [ Card(
Card( margin: EdgeInsets.symmetric(horizontal: 4.0),
margin: EdgeInsets.symmetric(horizontal: 4.0), shape: RoundedRectangleBorder(
shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12),
borderRadius: BorderRadius.circular(12), side:
side: BorderSide( BorderSide(color: Theme.of(context).scaffoldBackgroundColor)),
color: Theme.of(context).scaffoldBackgroundColor)), child: Container(
child: Container( padding:
padding: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 8.0),
const EdgeInsets.symmetric(horizontal: 12.0, vertical: 8.0), child: Column(
child: Column( mainAxisSize: MainAxisSize.min,
mainAxisSize: MainAxisSize.min, children: [
children: [ _buildLeftHeader(),
_buildLeftHeader(), Container(
Container( width: double.infinity,
width: double.infinity, decoration:
decoration: BoxDecoration(borderRadius: BorderRadius.circular(4)),
BoxDecoration(borderRadius: BorderRadius.circular(4)), child: _buildUserContacts(),
child: _buildUserContacts(), ).marginSymmetric(vertical: 8.0)
).marginSymmetric(vertical: 8.0) ],
],
),
), ),
), ),
Divider(), ),
Expanded( Divider(),
child: Align( Expanded(
alignment: Alignment.topLeft, child: Align(
child: MyGroupPeerView( alignment: Alignment.topLeft,
menuPadding: widget.menuPadding, child: MyGroupPeerView(
initPeers: gFFI.groupModel.peersShow.value)), menuPadding: widget.menuPadding,
) initPeers: gFFI.groupModel.peersShow)),
], )
), ],
); );
} }
@ -198,7 +196,8 @@ class _MyGroupState extends State<MyGroup> {
return InkWell(onTap: () { return InkWell(onTap: () {
if (selectedUser.value != username) { if (selectedUser.value != username) {
selectedUser.value = username; selectedUser.value = username;
gFFI.groupModel.pullUserPeers(user); } else {
selectedUser.value = '';
} }
}, child: Obx( }, child: Obx(
() { () {

View File

@ -427,10 +427,25 @@ class MyGroupPeerView extends BasePeersView {
key: key, key: key,
name: 'my group peer', name: 'my group peer',
loadEvent: 'load_my_group_peers', loadEvent: 'load_my_group_peers',
peerFilter: filter,
peerCardBuilder: (Peer peer) => MyGroupPeerCard( peerCardBuilder: (Peer peer) => MyGroupPeerCard(
peer: peer, peer: peer,
menuPadding: menuPadding, menuPadding: menuPadding,
), ),
initPeers: initPeers, initPeers: initPeers,
); );
static bool filter(Peer peer) {
if (gFFI.groupModel.searchUserText.isNotEmpty) {
if (!peer.username.contains(gFFI.groupModel.searchUserText)) {
return false;
}
}
if (gFFI.groupModel.selectedUser.isNotEmpty) {
if (gFFI.groupModel.selectedUser.value != peer.username) {
return false;
}
}
return true;
}
} }

View File

@ -16,8 +16,9 @@ class GroupModel {
final RxString groupName = ''.obs; final RxString groupName = ''.obs;
final RxString groupId = ''.obs; final RxString groupId = ''.obs;
final RxList<UserPayload> users = RxList.empty(growable: true); final RxList<UserPayload> users = RxList.empty(growable: true);
final RxList<PeerPayload> peerPayloads = RxList.empty(growable: true); final List<Peer> peersShow = List.empty(growable: true);
final RxList<Peer> peersShow = RxList.empty(growable: true); final RxString selectedUser = ''.obs;
final RxString searchUserText = ''.obs;
WeakReference<FFI> parent; WeakReference<FFI> parent;
GroupModel(this.parent); GroupModel(this.parent);
@ -30,7 +31,6 @@ class GroupModel {
groupName.value = ''; groupName.value = '';
groupId.value = ''; groupId.value = '';
users.clear(); users.clear();
peerPayloads.clear();
peersShow.clear(); peersShow.clear();
} }
@ -45,7 +45,7 @@ class GroupModel {
return; return;
} }
} catch (e) { } catch (e) {
debugPrintStack(label: '$e'); debugPrint('$e');
reset(); reset();
return; return;
} }
@ -98,7 +98,7 @@ class GroupModel {
} }
} while (current * pageSize < total); } while (current * pageSize < total);
} catch (err) { } catch (err) {
debugPrintStack(label: '$err'); debugPrint('$err');
groupLoadError.value = err.toString(); groupLoadError.value = err.toString();
} finally { } finally {
groupLoading.value = false; groupLoading.value = false;
@ -128,23 +128,30 @@ class GroupModel {
groupId.value = data['id'] ?? ''; groupId.value = data['id'] ?? '';
return groupId.value.isNotEmpty && groupName.isNotEmpty; return groupId.value.isNotEmpty && groupName.isNotEmpty;
} catch (e) { } catch (e) {
debugPrintStack(label: '$e'); debugPrint('$e');
} finally {} } finally {}
return false; return false;
} }
Future<void> pullUserPeers(UserPayload user) async { Future<void> pullUserPeers() async {
peerPayloads.clear();
peersShow.clear(); peersShow.clear();
peerLoading.value = true; peerLoading.value = true;
peerLoadError.value = ""; peerLoadError.value = "";
List<PeerPayload> peerPayloads = List.empty(growable: true);
final api = "${await bind.mainGetApiServer()}/api/peers"; final api = "${await bind.mainGetApiServer()}/api/peers";
try { try {
var uri0 = Uri.parse(api); var uri0 = Uri.parse(api);
final pageSize = 20; final pageSize = 20;
var total = 0; var total = 0;
int current = 0; int current = 0;
var queryParameters = {
'current': current.toString(),
'pageSize': pageSize.toString(),
};
if (!gFFI.userModel.isAdmin.value) {
queryParameters.addAll({'grp': groupId.value});
}
do { do {
current += 1; current += 1;
var uri = Uri( var uri = Uri(
@ -152,11 +159,7 @@ class GroupModel {
host: uri0.host, host: uri0.host,
path: uri0.path, path: uri0.path,
port: uri0.port, port: uri0.port,
queryParameters: { queryParameters: queryParameters);
'current': current.toString(),
'pageSize': pageSize.toString(),
'target_user': user.id,
});
final resp = await http.get(uri, headers: getHttpHeaders()); final resp = await http.get(uri, headers: getHttpHeaders());
if (resp.body.isNotEmpty && resp.body.toLowerCase() != "null") { if (resp.body.isNotEmpty && resp.body.toLowerCase() != "null") {
Map<String, dynamic> json = jsonDecode(utf8.decode(resp.bodyBytes)); Map<String, dynamic> json = jsonDecode(utf8.decode(resp.bodyBytes));
@ -180,7 +183,7 @@ class GroupModel {
} }
} while (current * pageSize < total); } while (current * pageSize < total);
} catch (err) { } catch (err) {
debugPrintStack(label: '$err'); debugPrint('$err');
peerLoadError.value = err.toString(); peerLoadError.value = err.toString();
} finally { } finally {
peerLoading.value = false; peerLoading.value = false;