Skip to content

Commit 112c180

Browse files
committed
Add per user share management
1 parent d1d6673 commit 112c180

7 files changed

Lines changed: 433 additions & 51 deletions

File tree

lib/screens/shares/shares.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ class _SharesScreenState extends State<SharesScreen> {
101101
for (OpenShockShare share in shares ?? []) {
102102
shareEntries.add(ShockerShareEntry(
103103
share: share,
104-
manager: manager,
105104
key: ValueKey(share.sharedWith.id),
106105
onRebuild: () {
107106
setState(() {

lib/screens/shares/shocker_share_entry.dart

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@ import 'package:shock_alarm_app/services/openshock.dart';
88

99
class ShockerShareEntry extends StatefulWidget {
1010
OpenShockShare share;
11-
final AlarmListManager manager;
1211
Function() onRebuild;
12+
13+
bool showUsername = true;
1314

1415
ShockerShareEntry(
1516
{Key? key,
1617
required this.share,
17-
required this.manager,
18-
required this.onRebuild})
18+
required this.onRebuild,
19+
this.showUsername = true})
1920
: super(key: key);
2021

2122
@override
@@ -35,7 +36,7 @@ class _ShockerShareEntryState extends State<ShockerShareEntry> {
3536
pausing = true;
3637
});
3738
String? error = await OpenShockClient()
38-
.setPauseStateOfShare(widget.share, widget.manager, paused);
39+
.setPauseStateOfShare(widget.share, paused);
3940
setState(() {
4041
pausing = false;
4142
});
@@ -72,7 +73,7 @@ class _ShockerShareEntryState extends State<ShockerShareEntry> {
7273
deleting = true;
7374
});
7475
String? errorMessage =
75-
await widget.manager.deleteShare(widget.share);
76+
await AlarmListManager.getInstance().deleteShare(widget.share);
7677
if (errorMessage != null) {
7778
setState(() {
7879
deleting = false;
@@ -100,7 +101,7 @@ class _ShockerShareEntryState extends State<ShockerShareEntry> {
100101
mainAxisAlignment: MainAxisAlignment.spaceBetween,
101102
children: [
102103
Text(
103-
widget.share.sharedWith.name,
104+
widget.showUsername ? widget.share.sharedWith.name : widget.share.shockerReference?.name ?? "Unknown shocker",
104105
style: t.textTheme.headlineSmall,
105106
),
106107
Row(
@@ -124,7 +125,7 @@ class _ShockerShareEntryState extends State<ShockerShareEntry> {
124125
});
125126
String? error = await OpenShockClient()
126127
.setLimitsOfShare(
127-
widget.share, limits, widget.manager);
128+
widget.share, limits);
128129
setState(() {
129130
saving = false;
130131
});
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:flutter/services.dart';
3+
import 'package:shock_alarm_app/components/padded_card.dart';
4+
import 'package:shock_alarm_app/components/constrained_container.dart';
5+
import 'package:shock_alarm_app/components/desktop_mobile_refresh_indicator.dart';
6+
import 'package:shock_alarm_app/screens/share_links/share_link_edit/share_link_shocker.dart';
7+
import 'package:shock_alarm_app/screens/shares/shocker_share_entry.dart';
8+
import 'package:shock_alarm_app/screens/shockers/shocker_item.dart';
9+
import 'package:share_plus/share_plus.dart';
10+
import 'package:shock_alarm_app/screens/shares/shocker_share_code_entry.dart';
11+
import 'package:shock_alarm_app/dialogs/error_dialog.dart';
12+
import 'package:shock_alarm_app/dialogs/info_dialog.dart';
13+
import 'package:shock_alarm_app/dialogs/loading_dialog.dart';
14+
15+
import '../../../services/alarm_list_manager.dart';
16+
import '../../../services/openshock.dart';
17+
18+
class UserShareEditScreen extends StatefulWidget {
19+
OpenShockUserWithShares user;
20+
21+
UserShareEditScreen({Key? key, required this.user}) : super(key: key);
22+
23+
@override
24+
State<StatefulWidget> createState() => _UserShareEditScreenState();
25+
}
26+
27+
class _UserShareEditScreenState extends State<UserShareEditScreen> {
28+
Color activeColor = Colors.green;
29+
Color inactiveColor = Colors.red;
30+
31+
@override
32+
void initState() {
33+
super.initState();
34+
loadShare();
35+
}
36+
37+
Future<void> loadShare() async {
38+
await AlarmListManager.getInstance().updateUserShares();
39+
widget.user = (widget.user.outgoing ? AlarmListManager.getInstance().userShares?.outgoing : AlarmListManager.getInstance().userShares?.incoming)?.firstWhere((x) => x.id == widget.user.id) ?? widget.user;
40+
setState(() {
41+
42+
});
43+
}
44+
45+
@override
46+
Widget build(BuildContext context) {
47+
ThemeData t = Theme.of(context);
48+
List<Widget> shareEntries = [];
49+
for (OpenShockShare share in widget.user.shares) {
50+
shareEntries.add(ShockerShareEntry(
51+
share: share,
52+
showUsername: false,
53+
key: ValueKey(share.shockerReference?.getIdentifier() ?? share.sharedWith.id),
54+
onRebuild: () {
55+
setState(() {
56+
loadShare();
57+
});
58+
}));
59+
}
60+
61+
if (shareEntries.isEmpty) {
62+
shareEntries.add(Center(
63+
child: Text(
64+
"No shockers associated with this user anymore.",
65+
style: t.textTheme.headlineSmall)));
66+
}
67+
try {
68+
return Scaffold(
69+
appBar: AppBar(
70+
title: Row(
71+
spacing: 10,
72+
children: [Text('Shares with ${widget.user.name}')],
73+
),
74+
),
75+
body: Padding(
76+
padding: const EdgeInsets.only(
77+
bottom: 15,
78+
left: 15,
79+
right: 15,
80+
top: 50,
81+
),
82+
child: ConstrainedContainer(
83+
child: DesktopMobileRefreshIndicator(
84+
onRefresh: () async {
85+
return loadShare();
86+
},
87+
child: ListView(children: shareEntries))),
88+
),
89+
);
90+
} catch (e) {
91+
print(e);
92+
return Scaffold(
93+
body: Center(
94+
child: Text(
95+
"An error occurred while loading the shares with ${widget.user.name}. Please try again later.")));
96+
}
97+
}
98+
}

lib/screens/user_shares/user_share_screen.dart

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@ import 'package:shock_alarm_app/screens/shockers/shocker_item.dart';
1010
import 'package:shock_alarm_app/screens/tools/bottom/shocker_unpause_dialog.dart';
1111
import 'package:shock_alarm_app/screens/user_shares/create_user_share_dialog.dart';
1212
import 'package:shock_alarm_app/screens/user_shares/invites_screen.dart';
13+
import 'package:shock_alarm_app/screens/user_shares/user_shares_screen.dart';
1314
import 'package:shock_alarm_app/services/alarm_list_manager.dart';
1415

1516
class UserShareScreen extends StatefulWidget {
16-
int i = 0;
17+
int i = 1;
1718

1819
@override
1920
State<StatefulWidget> createState() => _UserShareScreen();
@@ -90,7 +91,8 @@ class _UserShareScreen extends State<UserShareScreen> {
9091
SegmentedButton<int>(
9192
segments: [
9293
ButtonSegment(value: 0, label: Text("Share links")),
93-
ButtonSegment(value: 1, label: Text("Invites")),
94+
ButtonSegment(value: 1, label: Text("Shared")),
95+
ButtonSegment(value: 2, label: Text("Invites")),
9496
],
9597
showSelectedIcon: false,
9698
selected: {
@@ -102,6 +104,8 @@ class _UserShareScreen extends State<UserShareScreen> {
102104
if (widget.i == 0)
103105
Expanded(child: ShareLinksScreen())
104106
else if (widget.i == 1)
107+
Expanded(child: UserSharesScreen())
108+
else if (widget.i == 2)
105109
Expanded(child: InvitesScreen())
106110
],
107111
));

0 commit comments

Comments
 (0)