new settings model

This commit is contained in:
2025-08-08 14:37:25 +02:00
parent 5404202c47
commit f214a06fbf
5 changed files with 429 additions and 424 deletions

View File

@@ -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();
}

View File

@@ -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<Type, List<int>> 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<int> offsets,
Map<Type, List<int>> 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<Type, List<int>> 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<P>(
) {
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<AppSettingsModel, AppSettingsModel, QWhere> {
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterWhere> anyIgnored() {
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterWhere> anyId() {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(const IdWhereClause.any());
});
@@ -120,69 +114,68 @@ extension AppSettingsModelQueryWhereSort
extension AppSettingsModelQueryWhere
on QueryBuilder<AppSettingsModel, AppSettingsModel, QWhereClause> {
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterWhereClause>
ignoredEqualTo(Id ignored) {
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterWhereClause> idEqualTo(
Id id) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(IdWhereClause.between(
lower: ignored,
upper: ignored,
lower: id,
upper: id,
));
});
}
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterWhereClause>
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<AppSettingsModel, AppSettingsModel, QAfterWhereClause>
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<AppSettingsModel, AppSettingsModel, QAfterWhereClause>
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<AppSettingsModel, AppSettingsModel, QAfterWhereClause>
ignoredBetween(
Id lowerIgnored,
Id upperIgnored, {
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterWhereClause> 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<AppSettingsModel, AppSettingsModel, QFilterCondition> {
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
customHostIsNull() {
idIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'customHost',
property: r'id',
));
});
}
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
customHostIsNotNull() {
idIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'customHost',
property: r'id',
));
});
}
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
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<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
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<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
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<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
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<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
customHostStartsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.startsWith(
property: r'customHost',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
customHostEndsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.endsWith(
property: r'customHost',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
customHostContains(String value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.contains(
property: r'customHost',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
customHostMatches(String pattern, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.matches(
property: r'customHost',
wildcard: pattern,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
customHostIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'customHost',
value: '',
));
});
}
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
customHostIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
property: r'customHost',
value: '',
));
});
}
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
ignoredIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'ignored',
));
});
}
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
ignoredIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'ignored',
));
});
}
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
ignoredEqualTo(Id? value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'ignored',
property: r'id',
value: value,
));
});
}
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
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<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
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<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
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<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
useCustomHostIsNull() {
valueBoolIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'useCustomHost',
property: r'valueBool',
));
});
}
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
useCustomHostIsNotNull() {
valueBoolIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'useCustomHost',
property: r'valueBool',
));
});
}
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
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<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
valueDoubleIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'valueDouble',
));
});
}
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
valueDoubleIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'valueDouble',
));
});
}
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
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<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
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<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
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<AppSettingsModel, AppSettingsModel, QAfterFilterCondition>
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<AppSettingsModel, AppSettingsModel, QSortBy> {
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterSortBy>
sortByCustomHost() {
sortByValueBool() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'customHost', Sort.asc);
return query.addSortBy(r'valueBool', Sort.asc);
});
}
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterSortBy>
sortByCustomHostDesc() {
sortByValueBoolDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'customHost', Sort.desc);
return query.addSortBy(r'valueBool', Sort.desc);
});
}
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterSortBy>
sortByUseCustomHost() {
sortByValueDouble() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'useCustomHost', Sort.asc);
return query.addSortBy(r'valueDouble', Sort.asc);
});
}
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterSortBy>
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<AppSettingsModel, AppSettingsModel, QSortThenBy> {
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterSortBy>
thenByCustomHost() {
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterSortBy> thenById() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'customHost', Sort.asc);
return query.addSortBy(r'id', Sort.asc);
});
}
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterSortBy>
thenByCustomHostDesc() {
thenByIdDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'customHost', Sort.desc);
return query.addSortBy(r'id', Sort.desc);
});
}
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterSortBy>
thenByIgnored() {
thenByValueBool() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'ignored', Sort.asc);
return query.addSortBy(r'valueBool', Sort.asc);
});
}
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterSortBy>
thenByIgnoredDesc() {
thenByValueBoolDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'ignored', Sort.desc);
return query.addSortBy(r'valueBool', Sort.desc);
});
}
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterSortBy>
thenByUseCustomHost() {
thenByValueDouble() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'useCustomHost', Sort.asc);
return query.addSortBy(r'valueDouble', Sort.asc);
});
}
QueryBuilder<AppSettingsModel, AppSettingsModel, QAfterSortBy>
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<AppSettingsModel, AppSettingsModel, QDistinct> {
QueryBuilder<AppSettingsModel, AppSettingsModel, QDistinct>
distinctByCustomHost({bool caseSensitive = true}) {
distinctByValueBool() {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'customHost', caseSensitive: caseSensitive);
return query.addDistinctBy(r'valueBool');
});
}
QueryBuilder<AppSettingsModel, AppSettingsModel, QDistinct>
distinctByUseCustomHost() {
distinctByValueDouble() {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'useCustomHost');
return query.addDistinctBy(r'valueDouble');
});
}
}
extension AppSettingsModelQueryProperty
on QueryBuilder<AppSettingsModel, AppSettingsModel, QQueryProperty> {
QueryBuilder<AppSettingsModel, int, QQueryOperations> ignoredProperty() {
QueryBuilder<AppSettingsModel, int, QQueryOperations> idProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'ignored');
return query.addPropertyName(r'id');
});
}
QueryBuilder<AppSettingsModel, String?, QQueryOperations>
customHostProperty() {
QueryBuilder<AppSettingsModel, bool?, QQueryOperations> valueBoolProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'customHost');
return query.addPropertyName(r'valueBool');
});
}
QueryBuilder<AppSettingsModel, bool?, QQueryOperations>
useCustomHostProperty() {
QueryBuilder<AppSettingsModel, double?, QQueryOperations>
valueDoubleProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'useCustomHost');
return query.addPropertyName(r'valueDouble');
});
}
}

View File

@@ -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<String, SettingsItem> 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<String, SettingsItem> group(String key) {
return (items[key] as SettingsGroup).children;
}
Future<void> save(IsarCollection<AppSettingsModel> model) async {
for (var item in items.values) {
item.save(model);
}
}
Future<void> load(IsarCollection<AppSettingsModel> model) async {
for (var item in items.values) {
item.load(model);
}
}
}
extension SettingExt on LinkedHashMap<String, SettingsItem> {
LinkedHashMap<String, SettingsItem> 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<AppSettingsModel> model) {}
void load(IsarCollection<AppSettingsModel> model) {}
}
class SettingsGroup implements SettingsItem {
@override
Id key;
LinkedHashMap<String, SettingsItem> children;
SettingsGroup(this.key, this.children);
@override
void load(IsarCollection<AppSettingsModel> model) {
for (var item in children.values) {
item.load(model);
}
}
@override
void save(IsarCollection<AppSettingsModel> model) {
for (var item in children.values) {
item.save(model);
}
}
}
class SettingsSubGroup implements SettingsItem {
@override
Id key;
FirkaIconType? iconType;
Object? iconData;
String title;
List<SettingsItem> children;
SettingsSubGroup(
this.key, this.iconType, this.iconData, this.title, this.children);
@override
void load(IsarCollection<AppSettingsModel> model) {
for (var item in children) {
item.load(model);
}
}
@override
void save(IsarCollection<AppSettingsModel> 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<AppSettingsModel> model) {}
@override
void save(IsarCollection<AppSettingsModel> model) {}
}
class SettingsSubtitle implements SettingsItem {
@override
Id key;
String title;
SettingsSubtitle(this.key, this.title);
@override
void load(IsarCollection<AppSettingsModel> model) {}
@override
void save(IsarCollection<AppSettingsModel> 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<AppSettingsModel> model) {
var v = model.getSync(key);
if (v == null || v.valueBool == null) {
value = defaultValue;
} else {
value = v.valueBool!;
}
}
@override
void save(IsarCollection<AppSettingsModel> 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<AppSettingsModel> model) {
var v = model.getSync(key);
if (v == null || v.valueDouble == null) {
value = defaultValue;
} else {
value = v.valueDouble!;
}
}
@override
void save(IsarCollection<AppSettingsModel> 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<AppSettingsModel> model) {
var v = model.getSync(key);
if (v == null || v.valueString == null) {
value = defaultValue;
} else {
value = v.valueString!;
}
}
@override
void save(IsarCollection<AppSettingsModel> model) {
var v = AppSettingsModel();
v.id = key;
v.valueString = value;
model.put(v);
}
}

View File

@@ -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<void> 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<Isar> initDB() async {
@@ -82,32 +69,17 @@ Future<Isar> initDB() async {
Future<AppInitialization> 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'),
),

View File

@@ -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<LoginScreen> {
late WebViewController _webViewController;
Timer? _timer;
@override
void initState() {
@@ -94,136 +92,9 @@ class _LoginScreenState extends State<LoginScreen> {
@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<LoginScreen> {
'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<LoginScreen> {
'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<LoginScreen> {
'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<LoginScreen> {
style: appStyle.fonts.H_12px
.copyWith(color: appStyle.colors.textTertiary),
),
onTapDown: (_) {
startTimer();
},
onTapUp: (_) {
_timer?.cancel();
},
onTap: () {},
)
],
),
@@ -604,7 +470,8 @@ class ImageClipper extends CustomClipper<Rect> {
@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