Skip to content

Commit 10477a7

Browse files
committed
fix(github): repo and user mutations
1 parent 31c43ee commit 10477a7

File tree

10 files changed

+93
-100
lines changed

10 files changed

+93
-100
lines changed

lib/scaffolds/refresh_stateful.dart

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,9 @@ import 'package:git_touch/scaffolds/utils.dart';
55

66
class RefreshStatefulScaffold<T> extends StatefulWidget {
77
final Widget title;
8-
final Widget Function(T data, void Function(VoidCallback fn) setState)
9-
bodyBuilder;
8+
final Widget Function(T data, void Function(T newData) setData) bodyBuilder;
109
final Future<T> Function() fetch;
11-
final Widget Function(T data, void Function(VoidCallback fn) setState)
12-
actionBuilder;
10+
final Widget Function(T data, void Function(T newData) setData) actionBuilder;
1311
final Widget action;
1412
final canRefresh;
1513

@@ -62,13 +60,21 @@ class _RefreshStatefulScaffoldState<T>
6260
Widget get _action {
6361
if (widget.action != null) return widget.action;
6462
if (widget.actionBuilder == null || _data == null) return null;
65-
return widget.actionBuilder(_data, setState);
63+
return widget.actionBuilder(_data, (v) {
64+
setState(() {
65+
_data = v;
66+
});
67+
});
6668
}
6769

6870
@override
6971
Widget build(BuildContext context) {
7072
Widget child = ErrorLoadingWrapper(
71-
bodyBuilder: () => widget.bodyBuilder(_data, setState),
73+
bodyBuilder: () => widget.bodyBuilder(_data, (v) {
74+
setState(() {
75+
_data = v;
76+
});
77+
}),
7278
error: _error,
7379
loading: _data == null,
7480
reload: _refresh,

lib/screens/bb_repo.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class BbRepoScreen extends StatelessWidget {
4040
});
4141
return Tuple3(repo, readme, branches);
4242
},
43-
bodyBuilder: (t, setState) {
43+
bodyBuilder: (t, _) {
4444
final theme = Provider.of<ThemeModel>(context);
4545
final p = t.item1;
4646
final branches = t.item3;

lib/screens/ge_repo.dart

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class GeRepoScreen extends StatelessWidget {
6767
StatusPayload statusPayload = StatusPayload(isWatching, isStarred);
6868
return Tuple4(repo, readmeData, branches, statusPayload);
6969
},
70-
bodyBuilder: (t, setState) {
70+
bodyBuilder: (t, setData) {
7171
final p = t.item1;
7272
final branches = t.item3;
7373
final theme = context.read<ThemeModel>();
@@ -92,9 +92,9 @@ class GeRepoScreen extends StatelessWidget {
9292
await context.read<AuthModel>().fetchGitee(
9393
'/user/subscriptions/$owner/$name?watch_type=$watchType',
9494
requestType: t.item4.isWatching ? 'DELETE' : 'PUT');
95-
setState(() {
96-
t.item4.isWatching = !t.item4.isWatching;
97-
});
95+
96+
t.item4.isWatching = !t.item4.isWatching;
97+
setData(t);
9898
},
9999
),
100100
SizedBox(width: 8),
@@ -106,9 +106,8 @@ class GeRepoScreen extends StatelessWidget {
106106
'/user/starred/$owner/$name',
107107
requestType: t.item4.isStarred ? 'DELETE' : 'PUT');
108108

109-
setState(() {
110-
t.item4.isStarred = !t.item4.isStarred;
111-
});
109+
t.item4.isStarred = !t.item4.isStarred;
110+
setData(t);
112111
},
113112
)
114113
])

lib/screens/ge_user.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,13 @@ class GeUserScreen extends StatelessWidget {
4242
: null,
4343
actionBuilder: isViewer
4444
? null
45-
: (p, setState) {
45+
: (p, _) {
4646
return ActionButton(
4747
title: 'User Actions',
4848
items: [...ActionItem.getUrlActions(p.item1.htmlUrl)],
4949
);
5050
},
51-
bodyBuilder: (p, setState) {
51+
bodyBuilder: (p, _) {
5252
final user = p.item1;
5353
final repos = p.item2;
5454

lib/screens/gh_repo.dart

Lines changed: 30 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ class GhRepoScreen extends StatelessWidget {
8585

8686
return Tuple3(repo, countFuture, readmeData);
8787
},
88-
actionBuilder: (data, setState) {
88+
actionBuilder: (data, _) {
8989
final repo = data.item1;
9090
return ActionButton(
9191
title: S.of(context).repositoryActions,
@@ -102,7 +102,7 @@ class GhRepoScreen extends StatelessWidget {
102102
],
103103
);
104104
},
105-
bodyBuilder: (data, setState) {
105+
bodyBuilder: (data, setData) {
106106
final repo = data.item1;
107107
final contributionFuture = data.item2;
108108
final readmeData = data.item3;
@@ -133,49 +133,34 @@ class GhRepoScreen extends StatelessWidget {
133133
ActionItem(
134134
text: _buildWatchState(v),
135135
onTap: (_) async {
136+
final activityApi =
137+
context.read<AuthModel>().ghClient.activity;
136138
switch (v) {
137139
case GSubscriptionState.SUBSCRIBED:
138140
case GSubscriptionState.IGNORED:
139-
await context
140-
.read<AuthModel>()
141-
.ghClient
142-
.activity
143-
.setRepositorySubscription(
144-
RepositorySlug(
145-
repo.owner.login, repo.name),
146-
subscribed: v ==
147-
GSubscriptionState.SUBSCRIBED,
148-
ignored:
149-
v == GSubscriptionState.IGNORED,
150-
);
151-
setState(() {
152-
// if (res.subscribed) {
153-
// repo.viewerSubscription =
154-
// GSubscriptionState.SUBSCRIBED;
155-
// } else if (res.ignored) {
156-
// repo.viewerSubscription =
157-
// GSubscriptionState.IGNORED;
158-
// }
159-
});
141+
await activityApi.setRepositorySubscription(
142+
RepositorySlug(
143+
repo.owner.login, repo.name),
144+
subscribed:
145+
v == GSubscriptionState.SUBSCRIBED,
146+
ignored: v == GSubscriptionState.IGNORED,
147+
);
160148
break;
161149
case GSubscriptionState.UNSUBSCRIBED:
162-
await context
163-
.read<AuthModel>()
164-
.ghClient
165-
.activity
150+
await activityApi
166151
.deleteRepositorySubscription(
167-
RepositorySlug(
168-
repo.owner.login,
169-
repo.name,
170-
),
171-
);
172-
setState(() {
173-
// repo.viewerSubscription =
174-
// GSubscriptionState.UNSUBSCRIBED;
175-
});
152+
RepositorySlug(
153+
repo.owner.login,
154+
repo.name,
155+
),
156+
);
176157
break;
177158
default:
178159
}
160+
161+
setData(data.withItem1(repo.rebuild((b) {
162+
b.viewerSubscription = v;
163+
})));
179164
},
180165
)
181166
]);
@@ -186,24 +171,18 @@ class GhRepoScreen extends StatelessWidget {
186171
active: repo.viewerHasStarred,
187172
text: repo.viewerHasStarred ? 'Unstar' : 'Star',
188173
onTap: () async {
174+
final activityApi =
175+
context.read<AuthModel>().ghClient.activity;
189176
if (repo.viewerHasStarred) {
190-
await context
191-
.read<AuthModel>()
192-
.ghClient
193-
.activity
194-
.unstar(
195-
RepositorySlug(repo.owner.login, repo.name));
177+
await activityApi.unstar(
178+
RepositorySlug(repo.owner.login, repo.name));
196179
} else {
197-
await context
198-
.read<AuthModel>()
199-
.ghClient
200-
.activity
201-
.star(
202-
RepositorySlug(repo.owner.login, repo.name));
180+
await activityApi.star(
181+
RepositorySlug(repo.owner.login, repo.name));
203182
}
204-
setState(() {
205-
// repo.viewerHasStarred = !repo.viewerHasStarred;
206-
});
183+
setData(data.withItem1(repo.rebuild((b) {
184+
b.viewerHasStarred = !repo.viewerHasStarred;
185+
})));
207186
},
208187
),
209188
],

lib/screens/gh_user.dart

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,12 @@ class _Repos extends StatelessWidget {
5959
class _User extends StatelessWidget {
6060
final GUserParts p;
6161
final bool isViewer;
62-
const _User(this.p, {this.isViewer = false});
62+
final List<Widget> rightWidgets;
63+
const _User(this.p, {this.isViewer = false, this.rightWidgets = const []});
6364

6465
@override
6566
Widget build(BuildContext context) {
6667
final theme = Provider.of<ThemeModel>(context);
67-
final auth = Provider.of<AuthModel>(context);
6868
final login = p.login;
6969

7070
return Column(
@@ -77,25 +77,7 @@ class _User extends StatelessWidget {
7777
createdAt: p.createdAt,
7878
bio: p.bio,
7979
isViewer: isViewer,
80-
rightWidgets: [
81-
if (p.viewerCanFollow)
82-
MutationButton(
83-
active: p.viewerIsFollowing,
84-
text: p.viewerIsFollowing
85-
? S.of(context).unfollow
86-
: S.of(context).follow,
87-
onTap: () async {
88-
if (p.viewerIsFollowing) {
89-
await auth.ghClient.users.unfollowUser(p.login);
90-
} else {
91-
await auth.ghClient.users.followUser(p.login);
92-
}
93-
// setState(() {
94-
// // p.viewerIsFollowing = !p.viewerIsFollowing;
95-
// });
96-
},
97-
)
98-
],
80+
rightWidgets: rightWidgets,
9981
),
10082
CommonStyle.border,
10183
Row(children: [
@@ -297,7 +279,7 @@ class GhViewer extends StatelessWidget {
297279
iconData: Icons.settings,
298280
url: '/settings',
299281
),
300-
bodyBuilder: (p, setState) {
282+
bodyBuilder: (p, _) {
301283
return _User(p, isViewer: true);
302284
},
303285
);
@@ -318,18 +300,44 @@ class GhUser extends StatelessWidget {
318300
return res.data;
319301
},
320302
title: AppBarTitle(login),
321-
actionBuilder: (payload, setState) {
303+
actionBuilder: (payload, _) {
322304
return ActionButton(
323305
title: 'User Actions',
324306
items: ActionItem.getUrlActions(payload.repositoryOwner.url),
325307
);
326308
},
327-
bodyBuilder: (p, setState) {
328-
if (p.repositoryOwner.G__typename == 'User') {
329-
return _User(p.repositoryOwner as GUserData_repositoryOwner__asUser);
309+
bodyBuilder: (data, setData) {
310+
if (data.repositoryOwner.G__typename == 'User') {
311+
final p = data.repositoryOwner as GUserData_repositoryOwner__asUser;
312+
return _User(
313+
p,
314+
rightWidgets: [
315+
if (p.viewerCanFollow)
316+
MutationButton(
317+
active: p.viewerIsFollowing,
318+
text: p.viewerIsFollowing
319+
? S.of(context).unfollow
320+
: S.of(context).follow,
321+
onTap: () async {
322+
if (p.viewerIsFollowing) {
323+
await auth.ghClient.users.unfollowUser(p.login);
324+
} else {
325+
await auth.ghClient.users.followUser(p.login);
326+
}
327+
setData(data.rebuild((b) {
328+
final u = b.repositoryOwner
329+
as GUserData_repositoryOwner__asUser;
330+
b.repositoryOwner = u.rebuild((b1) {
331+
b1.viewerIsFollowing = !b1.viewerIsFollowing;
332+
});
333+
}));
334+
},
335+
)
336+
],
337+
);
330338
} else {
331-
return _Org(
332-
p.repositoryOwner as GUserData_repositoryOwner__asOrganization);
339+
return _Org(data.repositoryOwner
340+
as GUserData_repositoryOwner__asOrganization);
333341
}
334342
},
335343
);

lib/screens/gl_project.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ class GlProjectScreen extends StatelessWidget {
7474

7575
return Tuple5(p, langFuture, memberCountFuture, readmeData, branches);
7676
},
77-
actionBuilder: (t, setState) {
77+
actionBuilder: (t, _) {
7878
return ActionButton(
7979
title: S.of(context).projectActions,
8080
items: [

lib/screens/go_repo.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class GoRepoScreen extends StatelessWidget {
5454

5555
return Tuple3(repo, readmeData, branches);
5656
},
57-
bodyBuilder: (t, setState) {
57+
bodyBuilder: (t, _) {
5858
final p = t.item1;
5959
final branches = t.item3;
6060
final theme = context.read<ThemeModel>();

lib/screens/gt_repo.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class GtRepoScreen extends StatelessWidget {
4747

4848
return Tuple2(repo, readmeData);
4949
},
50-
bodyBuilder: (t, setState) {
50+
bodyBuilder: (t, _) {
5151
final p = t.item1;
5252
return Column(
5353
crossAxisAlignment: CrossAxisAlignment.stretch,

lib/widgets/user_header.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,15 @@ class UserHeader extends StatelessWidget {
2121
@required this.bio,
2222
bool isViewer = false,
2323
List<Widget> rightWidgets,
24-
}) : this.rightWidgets = [
25-
...(rightWidgets ?? []),
24+
}) : rightWidgets = [
2625
if (isViewer)
2726
MutationButton(
2827
active: false,
2928
text: 'Switch accounts',
3029
url: '/login',
3130
)
31+
else
32+
...(rightWidgets ?? []),
3233
];
3334

3435
@override

0 commit comments

Comments
 (0)