From 91d6a4b2a3ba72738885ff8f5032c6c8fd6ed728 Mon Sep 17 00:00:00 2001 From: Rongjian Zhang Date: Tue, 24 Sep 2019 20:45:55 +0800 Subject: [PATCH] feat: add trending developers --- lib/scaffolds/tab.dart | 8 ++-- lib/screens/notifications.dart | 20 ++++---- lib/screens/trending.dart | 84 +++++++++++++++++++--------------- 3 files changed, 63 insertions(+), 49 deletions(-) diff --git a/lib/scaffolds/tab.dart b/lib/scaffolds/tab.dart index 821efdf..2e50d31 100644 --- a/lib/scaffolds/tab.dart +++ b/lib/scaffolds/tab.dart @@ -7,7 +7,7 @@ import '../widgets/error_reload.dart'; class TabScaffold extends StatefulWidget { final Widget title; - final Widget Function(T payload) bodyBuilder; + final Widget Function(T payload, int activeTab) bodyBuilder; final Future Function(int activeTab) onRefresh; final List tabs; final Widget Function(T payload) trailingBuilder; @@ -73,7 +73,7 @@ class _TabScaffoldState extends State> { } else if (_payload == null) { return Loading(more: false); } else { - return widget.bodyBuilder(_payload); + return widget.bodyBuilder(_payload, _activeTab); } } @@ -96,12 +96,12 @@ class _TabScaffoldState extends State> { } } - Future _switch(int selected)async { + Future _switch(int selected) async { setState(() { _activeTab = selected; }); if (_getPayload(selected) == null) { -await _refresh(); + await _refresh(); } } diff --git a/lib/screens/notifications.dart b/lib/screens/notifications.dart index 75b7026..b9af11b 100644 --- a/lib/screens/notifications.dart +++ b/lib/screens/notifications.dart @@ -181,15 +181,17 @@ $key: pullRequest(number: ${item.number}) { }, ), onRefresh: fetchNotifications, - bodyBuilder: (groupMap) { - return groupMap.isEmpty - ? EmptyWidget() - : Column(children: [ - Padding(padding: EdgeInsets.only(top: 10)), - ...groupMap.entries - .map((entry) => _buildGroupItem(context, entry, groupMap)) - .toList() - ]); + bodyBuilder: (groupMap, activeTab) { + if (groupMap.isEmpty) return EmptyWidget(); + + return Column( + children: [ + Padding(padding: EdgeInsets.only(top: 10)), + ...groupMap.entries + .map((entry) => _buildGroupItem(context, entry, groupMap)) + .toList() + ], + ); }, ); } diff --git a/lib/screens/trending.dart b/lib/screens/trending.dart index cfb17d1..3c26afb 100644 --- a/lib/screens/trending.dart +++ b/lib/screens/trending.dart @@ -1,53 +1,65 @@ import 'dart:convert'; import 'package:flutter/material.dart'; +import 'package:git_touch/scaffolds/tab.dart'; import 'package:git_touch/utils/utils.dart'; import 'package:git_touch/widgets/app_bar_title.dart'; +import 'package:git_touch/widgets/user_item.dart'; import 'package:http/http.dart' as http; -import '../scaffolds/refresh.dart'; import 'package:git_touch/widgets/repository_item.dart'; -class TrendingScreen extends StatefulWidget { - @override - _TrendingScreenState createState() => _TrendingScreenState(); -} - -class _TrendingScreenState extends State { - @override +class TrendingScreen extends StatelessWidget { Widget build(BuildContext context) { - return RefreshScaffold( + return TabScaffold( title: AppBarTitle('Trending'), - onRefresh: (_) async { - var res = await http.get('https://github-trending-api.now.sh'); - var items = json.decode(res.body); - - return items.map((item) { - return { - 'owner': {'login': item['author'], 'avatarUrl': item['avatar']}, - 'name': item['name'], - 'description': item['description'], - 'stargazers': { - 'totalCount': item['stars'], - }, - 'forks': { - 'totalCount': item['forks'], - }, - 'primaryLanguage': item['language'] == null - ? null - : { - 'name': item['language'], - 'color': item['languageColor'], - }, - 'isPrivate': false, - 'isFork': false // TODO: - }; - }).toList(); + tabs: ['Repositories', 'Users'], + onRefresh: (tabIndex) async { + var uri = Uri.parse('https://github-trending-api.now.sh') + .resolve(tabIndex == 1 ? '/developers' : '/'); + var res = await http.get(uri); + var items = json.decode(res.body) as List; + return items; }, - bodyBuilder: (payload) { + bodyBuilder: (payload, activeTab) { return Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: join( borderView, - payload.map((item) => RepositoryItem(item)).toList(), + payload.map((item) { + switch (activeTab) { + case 0: + return RepositoryItem({ + 'owner': { + 'login': item['author'], + 'avatarUrl': item['avatar'] + }, + 'name': item['name'], + 'description': item['description'], + 'stargazers': { + 'totalCount': item['stars'], + }, + 'forks': { + 'totalCount': item['forks'], + }, + 'primaryLanguage': item['language'] == null + ? null + : { + 'name': item['language'], + 'color': item['languageColor'], + }, + 'isPrivate': false, + 'isFork': false // TODO: + }); + case 1: + return UserItem( + item['username'], + name: item['name'], + avatarUrl: item['avatar'], + bio: '', + ); + default: + throw ''; + } + }).toList(), ), ); },