add beta warning screen

This commit is contained in:
2025-08-29 09:39:20 +02:00
parent 3b89ba8e79
commit ad058d939c
4 changed files with 136 additions and 7 deletions

View File

@@ -24,7 +24,8 @@ const classAvgOnGraph = 1006;
const leftHandedMode = 1007;
const language = 1008;
const appIcon = 1009;
const child_protection = 1010;
const childProtection = 1010;
const betaWarning = 1011;
bool always() {
return true;
@@ -152,7 +153,7 @@ class SettingsStore {
"icon_preview": SettingsAppIconPreview(0, always),
"settings_padding2": SettingsPadding(0, 24, always),
"child_protection": SettingsBoolean(
child_protection,
childProtection,
FirkaIconType.majesticons,
Majesticon.shieldSolid,
l10n.s_ci_child_protection,
@@ -224,6 +225,10 @@ class SettingsStore {
never),
"settings_other_padding": SettingsPadding(0, 20, never),
"settings_other_header": SettingsHeaderSmall(0, "Egyéb", never),
// misc
"beta_warning": SettingsBoolean(
betaWarning, null, null, "Beta warning", false, never)
}),
always);

View File

@@ -0,0 +1,93 @@
import 'dart:io';
import 'package:firka/helpers/db/models/app_settings_model.dart';
import 'package:firka/helpers/settings/setting.dart';
import 'package:firka/helpers/ui/firka_button.dart';
import 'package:firka/ui/model/style.dart';
import 'package:firka/ui/phone/screens/home/home_screen.dart';
import 'package:flutter/material.dart';
import '../../../../main.dart';
class BetaScreen extends StatelessWidget {
final AppInitialization data;
const BetaScreen(this.data, {super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: appStyle.colors.background,
body: SafeArea(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
children: [
Center(
child: Text(data.l10n.beta_title,
style: appStyle.fonts.H_H1
.apply(color: appStyle.colors.textPrimary)),
),
SizedBox(height: 8),
Center(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 24),
child: Text(
data.l10n.beta_body,
style: appStyle.fonts.B_16R
.apply(color: appStyle.colors.textPrimary),
textAlign: TextAlign.center,
),
),
),
],
),
Padding(
padding: const EdgeInsets.only(left: 32, right: 32, bottom: 16),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
GestureDetector(
child: FirkaButton(
text: data.l10n.cancel,
bgColor: appStyle.colors.buttonSecondaryFill,
fontStyle: appStyle.fonts.B_14R
.apply(color: appStyle.colors.textPrimary),
),
onTap: () {
exit(0);
},
),
GestureDetector(
child: FirkaButton(
text: data.l10n.okay,
bgColor: appStyle.colors.accent,
fontStyle: appStyle.fonts.B_14R
.apply(color: appStyle.colors.textPrimary),
),
onTap: () async {
await data.isar.writeTxn(() async {
data.settings
.group("settings")
.setBoolean("beta_warning", true);
await data.settings
.group("settings")["beta_warning"]!
.save(data.isar.appSettingsModels);
Navigator.of(context).pushAndRemoveUntil(
MaterialPageRoute(
builder: (context) => HomeScreen(data, false)),
(route) => false,
);
});
},
),
],
)),
],
)),
);
}
}

View File

@@ -3,12 +3,14 @@ import 'dart:math';
import 'package:firka/helpers/api/client/kreta_client.dart';
import 'package:firka/helpers/api/exceptions/token.dart';
import 'package:firka/helpers/settings/setting.dart';
import 'package:firka/main.dart';
import 'package:firka/ui/model/style.dart';
import 'package:firka/ui/phone/pages/extras/main_wear_pair.dart';
import 'package:firka/ui/phone/pages/home/home_grades.dart';
import 'package:firka/ui/phone/pages/home/home_main.dart';
import 'package:firka/ui/phone/pages/home/home_timetable_mo.dart';
import 'package:firka/ui/phone/screens/home/beta_screen.dart';
import 'package:firka/ui/phone/widgets/bottom_nav_icon.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
@@ -68,10 +70,12 @@ class _HomeScreenState extends State<HomeScreen> {
Widget? toast;
bool pairingDone = false;
bool _disposed = false;
ActiveToastType activeToast = ActiveToastType.none;
void setPageCB(ActiveHomePage newPage, bool setPrev) {
if (_disposed) return;
setState(() {
if (setPrev) previousPages.add(page);
canPop = false;
@@ -90,6 +94,7 @@ class _HomeScreenState extends State<HomeScreen> {
await widget.data.client.getStudent(forceCache: false);
if (res.statusCode >= 400 ||
res.err == TokenExpiredException().toString()) {
if (_disposed) return;
setState(() {
activeToast = ActiveToastType.reauth;
toast = Positioned(
@@ -169,12 +174,14 @@ class _HomeScreenState extends State<HomeScreen> {
dismissDelay = 2;
}
Timer(Duration(seconds: dismissDelay), () {
if (_disposed) return;
setState(() {
activeToast = ActiveToastType.none;
toast = null;
});
});
if (_disposed) return;
setState(() {
// TODO: Make this and the error toast more rounded
toast = Positioned(
@@ -221,11 +228,13 @@ class _HomeScreenState extends State<HomeScreen> {
);
});
} finally {
setState(() {
_fetching = false;
if (!_disposed) {
setState(() {
_fetching = false;
if (activeToast == ActiveToastType.fetching) toast = null;
});
if (activeToast == ActiveToastType.fetching) toast = null;
});
}
}
}
@@ -254,6 +263,17 @@ class _HomeScreenState extends State<HomeScreen> {
Widget build(BuildContext context) {
_updateSystemUI(); // Update system UI on every build, to compensate for the android system being dumb
if (!widget.data.settings.group("settings").boolean("beta_warning")) {
Timer.run(() {
Navigator.of(context).pushAndRemoveUntil(
MaterialPageRoute(builder: (context) => BetaScreen(widget.data)),
(route) => false,
);
});
return SizedBox();
}
if (widget.watchPair && !pairingDone) {
Timer.run(() {
showWearBottomSheet(context, widget.data, widget.model!);
@@ -263,6 +283,7 @@ class _HomeScreenState extends State<HomeScreen> {
}
if (_fetching) {
if (_disposed) return SizedBox();
setState(() {
activeToast = ActiveToastType.fetching;
toast = Positioned(
@@ -436,6 +457,16 @@ class _HomeScreenState extends State<HomeScreen> {
},
);
}
@override
void dispose() {
super.dispose();
_disposed = true;
_fetching = false;
_prefetched = false;
activeToast = ActiveToastType.none;
}
}
class HomeSubPage extends StatelessWidget {