From f214a06fbf004956d88c143eca92c1d0d641ec8b Mon Sep 17 00:00:00 2001 From: Armand <4831c0@proton.me> Date: Fri, 8 Aug 2025 14:37:25 +0200 Subject: [PATCH] new settings model --- .../helpers/db/models/app_settings_model.dart | 5 +- .../db/models/app_settings_model.g.dart | 411 +++++++----------- firka/lib/helpers/settings/setting.dart | 246 +++++++++++ firka/lib/main.dart | 42 +- .../ui/phone/screens/login/login_screen.dart | 149 +------ 5 files changed, 429 insertions(+), 424 deletions(-) create mode 100644 firka/lib/helpers/settings/setting.dart diff --git a/firka/lib/helpers/db/models/app_settings_model.dart b/firka/lib/helpers/db/models/app_settings_model.dart index de9a71a..a7967f8 100644 --- a/firka/lib/helpers/db/models/app_settings_model.dart +++ b/firka/lib/helpers/db/models/app_settings_model.dart @@ -5,8 +5,9 @@ part 'app_settings_model.g.dart'; @collection class AppSettingsModel { Id? id; - bool? useCustomHost; - String? customHost; + double? valueDouble; + bool? valueBool; + String? valueString; AppSettingsModel(); } diff --git a/firka/lib/helpers/db/models/app_settings_model.g.dart b/firka/lib/helpers/db/models/app_settings_model.g.dart index 37b7cc3..2a4cb01 100644 --- a/firka/lib/helpers/db/models/app_settings_model.g.dart +++ b/firka/lib/helpers/db/models/app_settings_model.g.dart @@ -17,22 +17,22 @@ const AppSettingsModelSchema = CollectionSchema( name: r'AppSettingsModel', id: -638838212012723081, properties: { - r'customHost': PropertySchema( + r'valueBool': PropertySchema( id: 0, - name: r'customHost', - type: IsarType.string, - ), - r'useCustomHost': PropertySchema( - id: 1, - name: r'useCustomHost', + name: r'valueBool', type: IsarType.bool, + ), + r'valueDouble': PropertySchema( + id: 1, + name: r'valueDouble', + type: IsarType.double, ) }, estimateSize: _appSettingsModelEstimateSize, serialize: _appSettingsModelSerialize, deserialize: _appSettingsModelDeserialize, deserializeProp: _appSettingsModelDeserializeProp, - idName: r'ignored', + idName: r'id', indexes: {}, links: {}, embeddedSchemas: {}, @@ -48,12 +48,6 @@ int _appSettingsModelEstimateSize( Map> allOffsets, ) { var bytesCount = offsets.last; - { - final value = object.customHost; - if (value != null) { - bytesCount += 3 + value.length * 3; - } - } return bytesCount; } @@ -63,8 +57,8 @@ void _appSettingsModelSerialize( List offsets, Map> allOffsets, ) { - writer.writeString(offsets[0], object.customHost); - writer.writeBool(offsets[1], object.useCustomHost); + writer.writeBool(offsets[0], object.valueBool); + writer.writeDouble(offsets[1], object.valueDouble); } AppSettingsModel _appSettingsModelDeserialize( @@ -74,9 +68,9 @@ AppSettingsModel _appSettingsModelDeserialize( Map> allOffsets, ) { final object = AppSettingsModel(); - object.customHost = reader.readStringOrNull(offsets[0]); object.id = id; - object.useCustomHost = reader.readBoolOrNull(offsets[1]); + object.valueBool = reader.readBoolOrNull(offsets[0]); + object.valueDouble = reader.readDoubleOrNull(offsets[1]); return object; } @@ -88,9 +82,9 @@ P _appSettingsModelDeserializeProp

( ) { switch (propertyId) { case 0: - return (reader.readStringOrNull(offset)) as P; - case 1: return (reader.readBoolOrNull(offset)) as P; + case 1: + return (reader.readDoubleOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); } @@ -111,7 +105,7 @@ void _appSettingsModelAttach( extension AppSettingsModelQueryWhereSort on QueryBuilder { - QueryBuilder anyIgnored() { + QueryBuilder anyId() { return QueryBuilder.apply(this, (query) { return query.addWhereClause(const IdWhereClause.any()); }); @@ -120,69 +114,68 @@ extension AppSettingsModelQueryWhereSort extension AppSettingsModelQueryWhere on QueryBuilder { - QueryBuilder - ignoredEqualTo(Id ignored) { + QueryBuilder idEqualTo( + Id id) { return QueryBuilder.apply(this, (query) { return query.addWhereClause(IdWhereClause.between( - lower: ignored, - upper: ignored, + lower: id, + upper: id, )); }); } QueryBuilder - ignoredNotEqualTo(Id ignored) { + idNotEqualTo(Id id) { return QueryBuilder.apply(this, (query) { if (query.whereSort == Sort.asc) { return query .addWhereClause( - IdWhereClause.lessThan(upper: ignored, includeUpper: false), + IdWhereClause.lessThan(upper: id, includeUpper: false), ) .addWhereClause( - IdWhereClause.greaterThan(lower: ignored, includeLower: false), + IdWhereClause.greaterThan(lower: id, includeLower: false), ); } else { return query .addWhereClause( - IdWhereClause.greaterThan(lower: ignored, includeLower: false), + IdWhereClause.greaterThan(lower: id, includeLower: false), ) .addWhereClause( - IdWhereClause.lessThan(upper: ignored, includeUpper: false), + IdWhereClause.lessThan(upper: id, includeUpper: false), ); } }); } QueryBuilder - ignoredGreaterThan(Id ignored, {bool include = false}) { + idGreaterThan(Id id, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.addWhereClause( - IdWhereClause.greaterThan(lower: ignored, includeLower: include), + IdWhereClause.greaterThan(lower: id, includeLower: include), ); }); } QueryBuilder - ignoredLessThan(Id ignored, {bool include = false}) { + idLessThan(Id id, {bool include = false}) { return QueryBuilder.apply(this, (query) { return query.addWhereClause( - IdWhereClause.lessThan(upper: ignored, includeUpper: include), + IdWhereClause.lessThan(upper: id, includeUpper: include), ); }); } - QueryBuilder - ignoredBetween( - Id lowerIgnored, - Id upperIgnored, { + QueryBuilder idBetween( + Id lowerId, + Id upperId, { bool includeLower = true, bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { return query.addWhereClause(IdWhereClause.between( - lower: lowerIgnored, + lower: lowerId, includeLower: includeLower, - upper: upperIgnored, + upper: upperId, includeUpper: includeUpper, )); }); @@ -192,217 +185,63 @@ extension AppSettingsModelQueryWhere extension AppSettingsModelQueryFilter on QueryBuilder { QueryBuilder - customHostIsNull() { + idIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( - property: r'customHost', + property: r'id', )); }); } QueryBuilder - customHostIsNotNull() { + idIsNotNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'customHost', + property: r'id', )); }); } QueryBuilder - customHostEqualTo( - String? value, { - bool caseSensitive = true, - }) { + idEqualTo(Id? value) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.equalTo( - property: r'customHost', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - customHostGreaterThan( - String? value, { - bool include = false, - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'customHost', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - customHostLessThan( - String? value, { - bool include = false, - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'customHost', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - customHostBetween( - String? lower, - String? upper, { - bool includeLower = true, - bool includeUpper = true, - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'customHost', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - customHostStartsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'customHost', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - customHostEndsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'customHost', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - customHostContains(String value, {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'customHost', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - customHostMatches(String pattern, {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'customHost', - wildcard: pattern, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - customHostIsEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'customHost', - value: '', - )); - }); - } - - QueryBuilder - customHostIsNotEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'customHost', - value: '', - )); - }); - } - - QueryBuilder - ignoredIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'ignored', - )); - }); - } - - QueryBuilder - ignoredIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'ignored', - )); - }); - } - - QueryBuilder - ignoredEqualTo(Id? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'ignored', + property: r'id', value: value, )); }); } QueryBuilder - ignoredGreaterThan( + idGreaterThan( Id? value, { bool include = false, }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.greaterThan( include: include, - property: r'ignored', + property: r'id', value: value, )); }); } QueryBuilder - ignoredLessThan( + idLessThan( Id? value, { bool include = false, }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.lessThan( include: include, - property: r'ignored', + property: r'id', value: value, )); }); } QueryBuilder - ignoredBetween( + idBetween( Id? lower, Id? upper, { bool includeLower = true, @@ -410,7 +249,7 @@ extension AppSettingsModelQueryFilter }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.between( - property: r'ignored', + property: r'id', lower: lower, includeLower: includeLower, upper: upper, @@ -420,32 +259,116 @@ extension AppSettingsModelQueryFilter } QueryBuilder - useCustomHostIsNull() { + valueBoolIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( - property: r'useCustomHost', + property: r'valueBool', )); }); } QueryBuilder - useCustomHostIsNotNull() { + valueBoolIsNotNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'useCustomHost', + property: r'valueBool', )); }); } QueryBuilder - useCustomHostEqualTo(bool? value) { + valueBoolEqualTo(bool? value) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.equalTo( - property: r'useCustomHost', + property: r'valueBool', value: value, )); }); } + + QueryBuilder + valueDoubleIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'valueDouble', + )); + }); + } + + QueryBuilder + valueDoubleIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'valueDouble', + )); + }); + } + + QueryBuilder + valueDoubleEqualTo( + double? value, { + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'valueDouble', + value: value, + epsilon: epsilon, + )); + }); + } + + QueryBuilder + valueDoubleGreaterThan( + double? value, { + bool include = false, + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'valueDouble', + value: value, + epsilon: epsilon, + )); + }); + } + + QueryBuilder + valueDoubleLessThan( + double? value, { + bool include = false, + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'valueDouble', + value: value, + epsilon: epsilon, + )); + }); + } + + QueryBuilder + valueDoubleBetween( + double? lower, + double? upper, { + bool includeLower = true, + bool includeUpper = true, + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'valueDouble', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + epsilon: epsilon, + )); + }); + } } extension AppSettingsModelQueryObject @@ -457,75 +380,74 @@ extension AppSettingsModelQueryLinks extension AppSettingsModelQuerySortBy on QueryBuilder { QueryBuilder - sortByCustomHost() { + sortByValueBool() { return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'customHost', Sort.asc); + return query.addSortBy(r'valueBool', Sort.asc); }); } QueryBuilder - sortByCustomHostDesc() { + sortByValueBoolDesc() { return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'customHost', Sort.desc); + return query.addSortBy(r'valueBool', Sort.desc); }); } QueryBuilder - sortByUseCustomHost() { + sortByValueDouble() { return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'useCustomHost', Sort.asc); + return query.addSortBy(r'valueDouble', Sort.asc); }); } QueryBuilder - sortByUseCustomHostDesc() { + sortByValueDoubleDesc() { return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'useCustomHost', Sort.desc); + return query.addSortBy(r'valueDouble', Sort.desc); }); } } extension AppSettingsModelQuerySortThenBy on QueryBuilder { - QueryBuilder - thenByCustomHost() { + QueryBuilder thenById() { return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'customHost', Sort.asc); + return query.addSortBy(r'id', Sort.asc); }); } QueryBuilder - thenByCustomHostDesc() { + thenByIdDesc() { return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'customHost', Sort.desc); + return query.addSortBy(r'id', Sort.desc); }); } QueryBuilder - thenByIgnored() { + thenByValueBool() { return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'ignored', Sort.asc); + return query.addSortBy(r'valueBool', Sort.asc); }); } QueryBuilder - thenByIgnoredDesc() { + thenByValueBoolDesc() { return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'ignored', Sort.desc); + return query.addSortBy(r'valueBool', Sort.desc); }); } QueryBuilder - thenByUseCustomHost() { + thenByValueDouble() { return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'useCustomHost', Sort.asc); + return query.addSortBy(r'valueDouble', Sort.asc); }); } QueryBuilder - thenByUseCustomHostDesc() { + thenByValueDoubleDesc() { return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'useCustomHost', Sort.desc); + return query.addSortBy(r'valueDouble', Sort.desc); }); } } @@ -533,39 +455,38 @@ extension AppSettingsModelQuerySortThenBy extension AppSettingsModelQueryWhereDistinct on QueryBuilder { QueryBuilder - distinctByCustomHost({bool caseSensitive = true}) { + distinctByValueBool() { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'customHost', caseSensitive: caseSensitive); + return query.addDistinctBy(r'valueBool'); }); } QueryBuilder - distinctByUseCustomHost() { + distinctByValueDouble() { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'useCustomHost'); + return query.addDistinctBy(r'valueDouble'); }); } } extension AppSettingsModelQueryProperty on QueryBuilder { - QueryBuilder ignoredProperty() { + QueryBuilder idProperty() { return QueryBuilder.apply(this, (query) { - return query.addPropertyName(r'ignored'); + return query.addPropertyName(r'id'); }); } - QueryBuilder - customHostProperty() { + QueryBuilder valueBoolProperty() { return QueryBuilder.apply(this, (query) { - return query.addPropertyName(r'customHost'); + return query.addPropertyName(r'valueBool'); }); } - QueryBuilder - useCustomHostProperty() { + QueryBuilder + valueDoubleProperty() { return QueryBuilder.apply(this, (query) { - return query.addPropertyName(r'useCustomHost'); + return query.addPropertyName(r'valueDouble'); }); } } diff --git a/firka/lib/helpers/settings/setting.dart b/firka/lib/helpers/settings/setting.dart new file mode 100644 index 0000000..0be8e8e --- /dev/null +++ b/firka/lib/helpers/settings/setting.dart @@ -0,0 +1,246 @@ +import 'dart:collection'; + +import 'package:firka/helpers/db/models/app_settings_model.dart'; +import 'package:firka/ui/widget/firka_icon.dart'; +import 'package:isar/isar.dart'; +import 'package:majesticons_flutter/majesticons_flutter.dart'; + +class SettingsStore { + LinkedHashMap items = LinkedHashMap.of({}); + + SettingsStore() { + items["settings"] = SettingsGroup( + 0_001, + LinkedHashMap.of({ + "application": SettingsSubGroup(1_001, FirkaIconType.Majesticons, + Majesticon.settingsCogSolid, "Alkalmazás", []), + "customization": SettingsSubGroup(2_001, FirkaIconType.Majesticons, + Majesticon.flower2Solid, "Személyre szabás", []), + "notifications": SettingsSubGroup(1_001, FirkaIconType.Majesticons, + Majesticon.bellSolid, "Értesítések", []), + "extras": SettingsSubGroup(1_001, FirkaIconType.Majesticons, + Majesticon.lightningBoltSolid, "Extrák", []), + })); + + items; + } + + LinkedHashMap group(String key) { + return (items[key] as SettingsGroup).children; + } + + Future save(IsarCollection model) async { + for (var item in items.values) { + item.save(model); + } + } + + Future load(IsarCollection model) async { + for (var item in items.values) { + item.load(model); + } + } +} + +extension SettingExt on LinkedHashMap { + LinkedHashMap group(String key) { + return (this[key] as SettingsGroup).children; + } + + String string(String key) { + return (this[key] as SettingsString).value; + } + + void setString(String key, String value) { + (this[key] as SettingsString).value = value; + } + + double dbl(String key) { + return (this[key] as SettingsDouble).value; + } + + void setDbl(String key, double value) { + (this[key] as SettingsDouble).value = value; + } + + bool boolean(String key) { + return (this[key] as SettingsBoolean).value; + } + + void setBoolean(String key, bool value) { + (this[key] as SettingsBoolean).value = value; + } +} + +class SettingsItem { + Id key; + + SettingsItem(this.key); + + void save(IsarCollection model) {} + + void load(IsarCollection model) {} +} + +class SettingsGroup implements SettingsItem { + @override + Id key; + LinkedHashMap children; + + SettingsGroup(this.key, this.children); + + @override + void load(IsarCollection model) { + for (var item in children.values) { + item.load(model); + } + } + + @override + void save(IsarCollection model) { + for (var item in children.values) { + item.save(model); + } + } +} + +class SettingsSubGroup implements SettingsItem { + @override + Id key; + FirkaIconType? iconType; + Object? iconData; + String title; + List children; + + SettingsSubGroup( + this.key, this.iconType, this.iconData, this.title, this.children); + + @override + void load(IsarCollection model) { + for (var item in children) { + item.load(model); + } + } + + @override + void save(IsarCollection model) { + for (var item in children) { + item.save(model); + } + } +} + +class SettingsHeader implements SettingsItem { + @override + Id key; + String title; + + SettingsHeader(this.key, this.title); + + @override + void load(IsarCollection model) {} + + @override + void save(IsarCollection model) {} +} + +class SettingsSubtitle implements SettingsItem { + @override + Id key; + String title; + + SettingsSubtitle(this.key, this.title); + + @override + void load(IsarCollection model) {} + + @override + void save(IsarCollection model) {} +} + +class SettingsBoolean implements SettingsItem { + @override + Id key; + String title; + bool value = false; + bool defaultValue; + + SettingsBoolean(this.key, this.title, this.defaultValue); + + @override + void load(IsarCollection model) { + var v = model.getSync(key); + if (v == null || v.valueBool == null) { + value = defaultValue; + } else { + value = v.valueBool!; + } + } + + @override + void save(IsarCollection model) { + var v = AppSettingsModel(); + v.id = key; + v.valueBool = value; + + model.put(v); + } +} + +class SettingsDouble implements SettingsItem { + @override + Id key; + String title; + double value = 0; + double defaultValue; + + SettingsDouble(this.key, this.title, this.defaultValue); + + @override + void load(IsarCollection model) { + var v = model.getSync(key); + if (v == null || v.valueDouble == null) { + value = defaultValue; + } else { + value = v.valueDouble!; + } + } + + @override + void save(IsarCollection model) { + var v = AppSettingsModel(); + v.id = key; + v.valueDouble = value; + + model.put(v); + } +} + +class SettingsString implements SettingsItem { + @override + Id key; + String title; + String value = ""; + String defaultValue; + + SettingsString(this.key, this.title, this.defaultValue); + + @override + void load(IsarCollection model) { + var v = model.getSync(key); + if (v == null || v.valueString == null) { + value = defaultValue; + } else { + value = v.valueString!; + } + } + + @override + void save(IsarCollection model) { + var v = AppSettingsModel(); + v.id = key; + v.valueString = value; + + model.put(v); + } +} diff --git a/firka/lib/main.dart b/firka/lib/main.dart index 4bab6c7..101cff7 100644 --- a/firka/lib/main.dart +++ b/firka/lib/main.dart @@ -8,6 +8,7 @@ import 'package:firka/helpers/db/models/generic_cache_model.dart'; import 'package:firka/helpers/db/models/timetable_cache_model.dart'; import 'package:firka/helpers/db/models/token_model.dart'; import 'package:firka/helpers/extensions.dart'; +import 'package:firka/helpers/settings/setting.dart'; import 'package:firka/ui/phone/pages/error/error_page.dart'; import 'package:firka/ui/phone/screens/debug/debug_screen.dart'; import 'package:firka/ui/phone/screens/home/home_screen.dart'; @@ -22,7 +23,6 @@ import 'package:path/path.dart' as p; import 'package:path_provider/path_provider.dart'; import 'package:watch_connectivity/watch_connectivity.dart'; -import 'helpers/api/consts.dart'; import 'helpers/db/models/homework_cache_model.dart'; import 'l10n/app_localizations.dart'; @@ -38,26 +38,13 @@ class AppInitialization { int tokenCount; bool hasWatchListener = false; Uint8List? profilePicture; - AppSettingsModel settings; + SettingsStore settings; AppInitialization({ required this.isar, required this.tokenCount, required this.settings, }); - - bool _writing = false; - - Future saveSettings() async { - while (_writing) { - await Future.delayed(const Duration(milliseconds: 50)); - } - _writing = true; - await isar.writeTxn(() async { - await isar.appSettingsModels.put(settings); - }); - _writing = false; - } } Future initDB() async { @@ -82,32 +69,17 @@ Future initDB() async { Future initializeApp() async { final isar = await initDB(); final tokenCount = await isar.tokenModels.count(); - var settings = AppSettingsModel(); - settings.id = 0; if (kDebugMode) { print('Token count: $tokenCount'); } - if (await isar.appSettingsModels.count() != 0) { - settings = (await isar.appSettingsModels.where().findFirst())!; - } - - if (settings.useCustomHost != null && settings.useCustomHost!) { - var host = settings.customHost!; - - KretaEndpoints.kretaBase = "https://$host"; - KretaEndpoints.kretaIdp = KretaEndpoints.kretaBase; - KretaEndpoints.kretaLoginUrl = - "${KretaEndpoints - .kretaBase}/Account/Login?ReturnUrl=%2Fconnect%2Fauthorize%2Fcallback%3Fprompt%3Dlogin%26nonce%3DwylCrqT4oN6PPgQn2yQB0euKei9nJeZ6_ffJ-VpSKZU%26response_type%3Dcode%26code_challenge_method%3DS256%26scope%3Dopenid%2520email%2520offline_access%2520kreta-ellenorzo-webapi.public%2520kreta-eugyintezes-webapi.public%2520kreta-fileservice-webapi.public%2520kreta-mobile-global-webapi.public%2520kreta-dkt-webapi.public%2520kreta-ier-webapi.public%26code_challenge%3DHByZRRnPGb-Ko_wTI7ibIba1HQ6lor0ws4bcgReuYSQ%26redirect_uri%3Dhttps%253A%252F%252Fmobil.e-kreta.hu%252Fellenorzo-student%252Fprod%252Foauthredirect%26client_id%3Dkreta-ellenorzo-student-mobile-ios%26state%3Dkreta_student_mobile%26suppressed_prompt%3Dlogin"; - KretaEndpoints.tokenGrantUrl = "${KretaEndpoints.kretaBase}/connect/token"; - } + var settings = SettingsStore(); var init = AppInitialization( isar: isar, tokenCount: tokenCount, - settings: settings, + settings: SettingsStore(), ); resetOldTimeTableCache(isar); @@ -238,13 +210,11 @@ class InitializationScreen extends StatelessWidget { supportedLocales: AppLocalizations.supportedLocales, home: screen, routes: { - '/login': (context) => - LoginScreen( + '/login': (context) => LoginScreen( initData, key: ValueKey('loginScreen'), ), - '/debug': (context) => - DebugScreen( + '/debug': (context) => DebugScreen( initData, key: ValueKey('debugScreen'), ), diff --git a/firka/lib/ui/phone/screens/login/login_screen.dart b/firka/lib/ui/phone/screens/login/login_screen.dart index f9306e1..97ea321 100644 --- a/firka/lib/ui/phone/screens/login/login_screen.dart +++ b/firka/lib/ui/phone/screens/login/login_screen.dart @@ -1,4 +1,3 @@ -import 'dart:async'; import 'dart:math' as math; import 'package:carousel_slider/carousel_slider.dart'; @@ -27,7 +26,6 @@ class LoginScreen extends StatefulWidget { class _LoginScreenState extends State { late WebViewController _webViewController; - Timer? _timer; @override void initState() { @@ -94,136 +92,9 @@ class _LoginScreenState extends State { @override void dispose() { - _timer?.cancel(); super.dispose(); } - void startTimer() { - _timer = Timer(const Duration(seconds: 3), () { - showModalBottomSheet( - context: context, - elevation: 100, - isScrollControlled: true, - enableDrag: true, - backgroundColor: Colors.transparent, - barrierColor: Colors.transparent, - constraints: BoxConstraints( - maxHeight: MediaQuery.of(context).size.height * 0.5, - ), - builder: (BuildContext context) { - return Stack( - children: [ - Positioned.fill( - child: GestureDetector( - onTap: () => Navigator.pop(context), - behavior: HitTestBehavior.opaque, - child: Container(color: Colors.transparent), - ), - ), - Align( - alignment: Alignment.bottomCenter, - child: Container( - decoration: BoxDecoration( - color: appStyle.colors.card, - borderRadius: - BorderRadius.vertical(top: Radius.circular(16)), - ), - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Center( - child: TextFormField( - decoration: const InputDecoration( - border: UnderlineInputBorder(), - labelText: 'Kréta api hostname(:port)', - ), - onChanged: (v) { - initData.settings.customHost = v; - }, - ), - ), - SizedBox(height: 10), - Container( - width: double.infinity, - height: 48, - padding: const EdgeInsets.symmetric(vertical: 8), - decoration: ShapeDecoration( - color: const Color(0xFFA7DB21), // Accent-Accent - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), - ), - shadows: const [ - BoxShadow( - color: Color(0x33647E22), - blurRadius: 2, - offset: Offset(0, 1), - spreadRadius: 0, - ) - ], - ), - child: GestureDetector( - child: Center( - child: Text( - 'Set hostname', - textAlign: TextAlign.center, - style: appStyle.fonts.H_18px.copyWith( - color: appStyle.colors.textPrimary), - ), - ), - onTap: () { - if (initData.settings.customHost != null && - initData.settings.customHost != "") { - var host = initData.settings.customHost!; - KretaEndpoints.kretaBase = "https://$host"; - KretaEndpoints.kretaIdp = - KretaEndpoints.kretaBase; - KretaEndpoints.kretaLoginUrl = - "${KretaEndpoints.kretaIdp}/Account/Login?ReturnUrl=%2Fconnect%2Fauthorize%2Fcallback%3Fprompt%3Dlogin%26nonce%3DwylCrqT4oN6PPgQn2yQB0euKei9nJeZ6_ffJ-VpSKZU%26response_type%3Dcode%26code_challenge_method%3DS256%26scope%3Dopenid%2520email%2520offline_access%2520kreta-ellenorzo-webapi.public%2520kreta-eugyintezes-webapi.public%2520kreta-fileservice-webapi.public%2520kreta-mobile-global-webapi.public%2520kreta-dkt-webapi.public%2520kreta-ier-webapi.public%26code_challenge%3DHByZRRnPGb-Ko_wTI7ibIba1HQ6lor0ws4bcgReuYSQ%26redirect_uri%3Dhttps%253A%252F%252Fmobil.e-kreta.hu%252Fellenorzo-student%252Fprod%252Foauthredirect%26client_id%3Dkreta-ellenorzo-student-mobile-ios%26state%3Dkreta_student_mobile%26suppressed_prompt%3Dlogin"; - KretaEndpoints.tokenGrantUrl = - "${KretaEndpoints.kretaIdp}/connect/token"; - - initData.settings.useCustomHost = true; - } else { - KretaEndpoints.kretaBase = "e-kreta.hu"; - KretaEndpoints.kretaIdp = - "https://idp.e-kreta.hu"; - KretaEndpoints.kretaLoginUrl = - "${KretaEndpoints.kretaIdp}/Account/Login?ReturnUrl=%2Fconnect%2Fauthorize%2Fcallback%3Fprompt%3Dlogin%26nonce%3DwylCrqT4oN6PPgQn2yQB0euKei9nJeZ6_ffJ-VpSKZU%26response_type%3Dcode%26code_challenge_method%3DS256%26scope%3Dopenid%2520email%2520offline_access%2520kreta-ellenorzo-webapi.public%2520kreta-eugyintezes-webapi.public%2520kreta-fileservice-webapi.public%2520kreta-mobile-global-webapi.public%2520kreta-dkt-webapi.public%2520kreta-ier-webapi.public%26code_challenge%3DHByZRRnPGb-Ko_wTI7ibIba1HQ6lor0ws4bcgReuYSQ%26redirect_uri%3Dhttps%253A%252F%252Fmobil.e-kreta.hu%252Fellenorzo-student%252Fprod%252Foauthredirect%26client_id%3Dkreta-ellenorzo-student-mobile-ios%26state%3Dkreta_student_mobile%26suppressed_prompt%3Dlogin"; - KretaEndpoints.tokenGrantUrl = - "${KretaEndpoints.kretaIdp}/connect/token"; - - initData.settings.useCustomHost = false; - } - - // TODO: Fix this - initData.saveSettings(); - setState(() { - _webViewController.loadRequest( - Uri.parse(KretaEndpoints.kretaLoginUrl)); - }); - - Navigator.pop(context); - }, - )), - // TODO: fix this insane shitcode - SizedBox( - height: MediaQuery.of(context).viewInsets.bottom * - 1000), - SizedBox(height: 75), - ], - ), - ), - ), - ), - ], - ); - }, - ); - }); - } - @override Widget build(BuildContext context) { final paddingWidthHorizontal = MediaQuery.of(context).size.width - @@ -235,8 +106,8 @@ class _LoginScreenState extends State { 'picture': 'assets/images/carousel/slide1.png', 'background': 'assets/images/carousel/slide1_background.gif', 'foreground': '', - 'rotation': - 180.00, // „Mi nekünk két szám típusunk van, int (egy 32 bites szám) meg a double (egy 64 bites tört szám), KURVA ANYÁDAT” + 'rotation': 180.00, + // „Mi nekünk két szám típusunk van, int (egy 32 bites szám) meg a double (egy 64 bites tört szám), KURVA ANYÁDAT” 'scale': 1.5, 'x': 0.00, 'y': 150.00, @@ -247,8 +118,8 @@ class _LoginScreenState extends State { 'picture': 'assets/images/carousel/slide2.png', 'background': 'assets/images/carousel/slide2_background.gif', 'foreground': '', - 'rotation': - 180.00, //Mivel radiáns, és nullával nem lehet osztani (remélem tudtad), ezért ha eggyel osztunk akkor egy marad + 'rotation': 180.00, + //Mivel radiáns, és nullával nem lehet osztani (remélem tudtad), ezért ha eggyel osztunk akkor egy marad 'scale': 1.55, 'x': 10.00, 'y': 160.00, @@ -275,7 +146,7 @@ class _LoginScreenState extends State { 'x': -5.00, 'y': 80.00, } - //TODO: implement simulated physics so that the little boxes can move like the phone moves + //TODO: implement simulated physics so that the little boxes can move like the phone moves ]; return MaterialApp( @@ -579,12 +450,7 @@ class _LoginScreenState extends State { style: appStyle.fonts.H_12px .copyWith(color: appStyle.colors.textTertiary), ), - onTapDown: (_) { - startTimer(); - }, - onTapUp: (_) { - _timer?.cancel(); - }, + onTap: () {}, ) ], ), @@ -604,7 +470,8 @@ class ImageClipper extends CustomClipper { @override Rect getClip(Size size) { - return Rect.fromLTWH(0, -70, _mediaQuery.size.width, _mediaQuery.size.height); + return Rect.fromLTWH( + 0, -70, _mediaQuery.size.width, _mediaQuery.size.height); } @override