From 66c040e5239c9a45fd55cfa5a0acfe8fd676c6e7 Mon Sep 17 00:00:00 2001 From: Rongjian Zhang Date: Sat, 9 Feb 2019 14:06:18 +0800 Subject: [PATCH] feat: add users screen: following and followers --- lib/screens/repos.dart | 3 +- lib/screens/user.dart | 6 ++-- lib/screens/users.dart | 68 +++++++++++++++++++++++++++++++++++++++++- 3 files changed, 73 insertions(+), 4 deletions(-) diff --git a/lib/screens/repos.dart b/lib/screens/repos.dart index eb9f880..ccacac6 100644 --- a/lib/screens/repos.dart +++ b/lib/screens/repos.dart @@ -49,8 +49,9 @@ class _ReposScreenState extends State { @override Widget build(BuildContext context) { + var title = widget.star ? 'stars' : 'repositories'; return ListScaffold( - title: Text('$login\'s repositories'), + title: Text('$login\'s $title'), onRefresh: () => _queryRepos(), onLoadMore: (cursor) => _queryRepos(cursor), itemBuilder: (payload) => RepoItem(payload), diff --git a/lib/screens/user.dart b/lib/screens/user.dart index d79b72e..2debb5c 100644 --- a/lib/screens/user.dart +++ b/lib/screens/user.dart @@ -197,12 +197,14 @@ class _UserScreenState extends State { EntryItem( count: payload['followers']['totalCount'], text: 'Followers', - screenBuilder: (context) => UsersScreen(), + screenBuilder: (context) => + UsersScreen(login: widget.login), ), EntryItem( count: payload['following']['totalCount'], text: 'Following', - screenBuilder: (context) => UsersScreen(), + screenBuilder: (context) => + UsersScreen(login: widget.login, following: true), ), ], ), diff --git a/lib/screens/users.dart b/lib/screens/users.dart index b656522..4552078 100644 --- a/lib/screens/users.dart +++ b/lib/screens/users.dart @@ -1,13 +1,79 @@ import 'package:flutter/material.dart'; +import '../scaffolds/list.dart'; +import '../providers/settings.dart'; +import '../utils/utils.dart'; +import '../widgets/link.dart'; +import '../screens/user.dart'; class UsersScreen extends StatefulWidget { + final String login; + final bool following; + + UsersScreen({this.login, this.following = false}); + @override _UsersScreenState createState() => _UsersScreenState(); } class _UsersScreenState extends State { + get login => widget.login; + get resource => widget.following ? 'following' : 'followers'; + + Future _queryUsers([String cursor]) async { + var cursorChunk = cursor == null ? '' : ', after: "$cursor"'; + + var data = await SettingsProvider.of(context).query(''' +{ + user(login: "$login") { + $resource(first: $pageSize$cursorChunk) { + pageInfo { + hasNextPage + endCursor + } + nodes { + login + avatarUrl + } + } + } +} + '''); + var repo = data["user"][resource]; + + return ListPayload( + cursor: repo["pageInfo"]["endCursor"], + end: repo['pageInfo']['hasNextPage'], + items: repo["nodes"], + ); + } + + Widget _buildItem(payload) { + return Link( + screenBuilder: (_) => UserScreen(payload['login']), + child: Container( + padding: EdgeInsets.all(10), + child: Row( + children: [ + CircleAvatar( + backgroundColor: Colors.transparent, + backgroundImage: NetworkImage(payload['avatarUrl']), + radius: 18, + ), + Padding(padding: EdgeInsets.only(left: 10)), + Text(payload['login'], style: TextStyle(fontSize: 18)) + ], + ), + ), + ); + } + @override Widget build(BuildContext context) { - return Container(); + return ListScaffold( + title: Text('$login\'s $resource'), + onRefresh: () => _queryUsers(), + onLoadMore: (cursor) => _queryUsers(cursor), + itemBuilder: _buildItem, + ); } }