From d38c4bedbd62667919ba648cffaf9db4619a3991 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Tue, 14 Feb 2023 17:20:32 +0100 Subject: [PATCH] Mobile Improvements --- assets/images/Icon-maskable-192.png | Bin 0 -> 2856 bytes .../screens/event/components/fight_list.dart | 49 ++++++++-------- lib/src/screens/home/lists/events_list.dart | 53 ++++++++++-------- lib/src/screens/login/login.dart | 53 +++++++++--------- lib/src/screens/settings/userinfo.dart | 13 +++++ lib/src/util/constants.dart | 2 + 6 files changed, 98 insertions(+), 72 deletions(-) create mode 100644 assets/images/Icon-maskable-192.png diff --git a/assets/images/Icon-maskable-192.png b/assets/images/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..fdb4378cd19944e719abcba3ba302decdfc46332 GIT binary patch literal 2856 zcmbtWc{G%58^33U?6Q^^lG&Z&);_(0|W`$>sDw~|x*RSvE*Ta6NfK`*Du3X*!3|>9w zbV~1#;)UU%qSOBIU9XC8ISnl*bEm(yzftq5tIw0RZ^_lXV>lY^>o0#JtYa&FWvdhd z_vYjYOS7g(WBH;fc#ht@QPemww(4roU!uMICrIH(u>7~G&eL&i)5B!fx(IsrGx78# z&Ph$q%)_<$!leSGuETZm!Ca9_6btLGj?)9tQ(ebnw#vgLMv%&GB(@PP+FF@e+dz{~o;ObR%?69xqp@>5 zHdd9Td869Y)Um?2Kld-M7&78t5@U6K-%tH&N1zs?-~0la(#7c zC*9z<;?a%IjIW1{mriadsvh;y$b;3cWk031^q_UK;ioCkDzGzF<|g10tAqs+-`Ju3=O8p2Z$wtE2n6k~oxw*73lQ3gw0@#BXM;DU4ccfHEXs|CafFMPR4k1YW z>-1wYN*t_O-l5p(OZ&oDdYpBxs=A&GV{&l|gv#UQR6p0;Z$2O^wouXCP^te%g?|!J zvEByP$&XUC==AKnm=th@-M->!B8Z@*wlX{PS1287xYq0}SmYrm@2@F5O@%X?&Bv!D zhp27qgk8$<7Z$heE()MLo*Y0Jr{|+rffnW_A3f@&>e&ctZ~vV&{5;-DZ$z_?eVxhX z`KeAfB(~4Ib1j;G+c!z+)jOk4h?{GYpP?~oj!{=dWwxaY)2MqHde0r#1+pZ}>5oT_ zp9`{dSJV^pDn3c?G;{GvOLy0A3vYeJFjO$WY+3TV!*`M%mK@>uG*@kY`RNz9#K_av z!^(vh7Cj~GB-iN&?+$2kY$|QnkL>KD#rVc|7IY% zJ)OH*(P#pRrrEO}b?qDgmyYJee_|#yJqnk(Emq?0k@966srL3ewM~Nkw3gDza`*Rg z1uw4kE>9^)y>}QB=#Lj|UG$A>pzRFcDaCEESOw?7`n{sp&)*}(`lXcIhif_=vu0gN zyIdbLp!42A<3@jtol4($GwE)PbZ+r_ck|@Xs8Z{$QJe7U=5;}-@A3xgHspmOFs=o= z6$W1goT4jNH$FPaUz=+acIb3Yr=hPavGi#dAlgouskS>)sz2sV5f_I^&WoyUl*WyR z-j&be?S|LoZc|Vr7G?KUa?7u0<&qi2{$^*A(D=5{Y{8*beRJiJ`8n-5ZZ##ITS{4> z7|~g{0DE$SfLd|{ssHkcP`~nClU-r0Kh)MVXW1OH-&GUabIg&!Rh}Hm)Q;#WO|ggA z@SFO@&U{nznHzj=dqazIL91kE0NS=^PA0Qq}BTpo`-o8BT3M0ljVq>njO#G1Fi z?!u(9fT)tMHS=(lFQ)Ggf))_s1`GttEL{jwJUd9v{~* zz`CN|K4Iiyu5#(!!+uz8v+k6&jcXw2<5$iNQ~LMtDi-f}1W>4m9oz26Zt#dHkSmr> zrn(^EpS!sS8Ae#96+f5Ih4`1&87g}iccZ5w-DC;H9kyz>AAB;n%lLNZ#%@m2AwHU% zlYsIn*R7XoIE6xuZl>_?_t&3`HI{=DPFx;W(20TVHj<4=)B*YL$Fs?a~{9 zMrCRR4h*oRG)zo9mpY|XklD9A^t>qZ?)Ff7+lkWc22Mt>&|!Mx7pbaEgQ|N*q7s8| zU0#twurqDzYA>Dzk%#2n>u*XWmmni0ot!;gShfIE<-M##430KmY7f3sjgjpu) zFtb1Uo4y?nU6RPQyLbP3LcNTLWc@dV;>_~pROp_vZe*mGns9-9K_1}ZQ~}1wxd;Qy z%=Wc&u2yuIj=|464*Qmj^bpHUFdtC~bS{^Je((SU4GU1Q|Sviua z3(3cuM9{&95+DF*6dI$7LaVBy9o5x!G%-4w>dGjT4hj{H<$(PMAu!m7=o|gt2`q#= zze5DYUptV9frK!UcVNgrIhs0}sGpmB6^`;eg!I0 z;b8 update(), + ); + }, + ); + }, + label: const Text("Add Fight"), + icon: const Icon(Icons.add), + ), + const SizedBox(width: 8), + FilledButton.icon( + onPressed: () { + context.go("/event/${event.id}/generator"); + }, + label: const Text("Generate Fight"), + icon: const Icon(Icons.shuffle)), + ], + ), Row( children: [ const SizedBox(width: 16), @@ -287,29 +313,6 @@ class EventFightList extends HookConsumerWidget { ], ), const Spacer(), - FilledButton.icon( - onPressed: () { - showDialog( - context: context, - builder: (context) { - return AddFightDialog( - eventData, - () => update(), - ); - }, - ); - }, - label: const Text("Add Fight"), - icon: const Icon(Icons.add), - ), - const SizedBox(width: 8), - FilledButton.icon( - onPressed: () { - context.go("/event/${event.id}/generator"); - }, - label: const Text("Generate Fight"), - icon: const Icon(Icons.shuffle)), - const SizedBox(width: 8), PopupMenuButton( itemBuilder: (context) { return const [ diff --git a/lib/src/screens/home/lists/events_list.dart b/lib/src/screens/home/lists/events_list.dart index e907dce..348a44c 100644 --- a/lib/src/screens/home/lists/events_list.dart +++ b/lib/src/screens/home/lists/events_list.dart @@ -22,6 +22,7 @@ import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:steamwar_multitool/src/components/components.dart'; import 'package:steamwar_multitool/src/dialogs/dialogs.dart'; +import 'package:steamwar_multitool/src/types/event.dart'; import 'package:steamwar_multitool/src/util/constants.dart'; import '../../../provider/events.dart'; @@ -59,11 +60,9 @@ class EventListComponent extends HookConsumerWidget { ListTile( title: Text( data[currentEvent].name, - style: Theme.of(context).textTheme.headline6, ), - subtitle: Text( + subtitle: const Text( "Current Event", - style: Theme.of(context).textTheme.subtitle1, ), leading: const Icon(Icons.priority_high), onTap: () { @@ -73,33 +72,17 @@ class EventListComponent extends HookConsumerWidget { if (upcomingEvents.isNotEmpty) Text( "Upcoming Events", - style: Theme.of(context).textTheme.headline6!, + style: Theme.of(context).textTheme.headlineSmall, ), ...upcomingEvents.map( - (e) => ListTile( - title: Text(e.name), - subtitle: Text( - "${kDateFormat.format(e.start)} - ${kDateFormat.format(e.end)}"), - leading: const Icon(Icons.event), - onTap: () async { - context.go("/event/${e.id}"); - }, - ), + (e) => EventTile(e), ), if (pastEvents.isNotEmpty) Text( "Past Events", - style: Theme.of(context).textTheme.headline6!, + style: Theme.of(context).textTheme.headlineSmall, ), - ...pastEvents.map((e) => ListTile( - title: Text(e.name), - leading: const Icon(Icons.check), - subtitle: Text( - "${kDateFormat.format(e.start)} - ${kDateFormat.format(e.end)}"), - onTap: () async { - context.go("/event/${e.id}"); - }, - )), + ...pastEvents.map((e) => EventTile(e)), ], ); }, error: (err, stack) { @@ -111,3 +94,27 @@ class EventListComponent extends HookConsumerWidget { }); } } + +class EventTile extends StatelessWidget { + final ShortEvent e; + + const EventTile( + this.e, { + super.key, + }); + + @override + Widget build(BuildContext context) { + return ListTile( + title: Text(e.name), + subtitle: kOnlyDateFormat.format(e.start) == kOnlyDateFormat.format(e.end) + ? Text(kOnlyDateFormat.format(e.start)) + : Text( + "${kOnlyDateFormat.format(e.start)} - ${kOnlyDateFormat.format(e.end)}"), + leading: Icon(e.isUpcoming ? Icons.event : Icons.check), + onTap: () async { + context.go("/event/${e.id}"); + }, + ); + } +} diff --git a/lib/src/screens/login/login.dart b/lib/src/screens/login/login.dart index e11f1a0..1277d6d 100644 --- a/lib/src/screens/login/login.dart +++ b/lib/src/screens/login/login.dart @@ -55,6 +55,31 @@ class LoginScreenWidget extends HookConsumerWidget { ); } + void login() async { + final dio = Dio( + BaseOptions( + baseUrl: ref.read(serverUrlProvider), + headers: { + 'X-SW-Auth': keyController.text, + }, + contentType: 'application/json', + ), + ); + try { + await dio.get('/data'); + final prefs = await SharedPreferences.getInstance(); + await prefs.setString("key", keyController.text); + ref.invalidate(userDataProvider); + context.go('/'); + } catch (e) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Invalid Key'), + ), + ); + } + } + return Scaffold( appBar: AppBar( title: const Text('Login'), @@ -77,37 +102,13 @@ class LoginScreenWidget extends HookConsumerWidget { controller: keyController, obscureText: true, onChanged: (v) => updater.value++, + onSubmitted: (v) => login(), ), const SizedBox( height: 10, ), FloatingActionButton.large( - onPressed: keyController.text.isNotEmpty - ? () async { - final dio = Dio( - BaseOptions( - baseUrl: ref.read(serverUrlProvider), - headers: { - 'X-SW-Auth': keyController.text, - }, - contentType: 'application/json', - ), - ); - try { - await dio.get('/data'); - final prefs = await SharedPreferences.getInstance(); - await prefs.setString("key", keyController.text); - ref.invalidate(userDataProvider); - context.go('/'); - } catch (e) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Invalid Key'), - ), - ); - } - } - : null, + onPressed: keyController.text.isNotEmpty ? login : null, child: const Icon(Icons.forward), ) ], diff --git a/lib/src/screens/settings/userinfo.dart b/lib/src/screens/settings/userinfo.dart index 657f8ba..15d280d 100644 --- a/lib/src/screens/settings/userinfo.dart +++ b/lib/src/screens/settings/userinfo.dart @@ -64,6 +64,19 @@ class SettingsScreen extends HookConsumerWidget { : null, icon: const Icon(Icons.save), ), + IconButton( + onPressed: () { + showAboutDialog( + context: context, + applicationIcon: Image.asset( + "assets/images/Icon-maskable-192.png", + fit: BoxFit.contain), + applicationName: "SteamWar MultiTool", + applicationVersion: "1.0.0", + applicationLegalese: "© 2023 SteamWar.de-Serverteam", + ); + }, + icon: Icon(Icons.apps)) ], leading: IconButton( onPressed: () => context.go("/"), diff --git a/lib/src/util/constants.dart b/lib/src/util/constants.dart index 97d432e..e6110e4 100644 --- a/lib/src/util/constants.dart +++ b/lib/src/util/constants.dart @@ -22,3 +22,5 @@ import 'package:intl/intl.dart'; final kDateFormat = DateFormat("dd.MM.yyyy HH:mm:ss"); final kTimeFormat = DateFormat('HH:mm'); + +final kOnlyDateFormat = DateFormat("dd.MM.yyyy");