Compare commits
27 Commits
develop-bl
...
develop-fi
Author | SHA1 | Date | |
---|---|---|---|
f3de0bc165 | |||
8000475c1f | |||
da772f17cc | |||
9d0cf8e313 | |||
f0009dad88 | |||
905206f242 | |||
769fbc1b6a | |||
8daf57bcee | |||
33d488946a | |||
41a5e021c5 | |||
8f58893553 | |||
626d3d5564 | |||
d833cdb733 | |||
8868914a76 | |||
70e6f82b10 | |||
6651613331 | |||
9ad0f624de | |||
82c143f847 | |||
1fdf731b81 | |||
2d3ccd25b4 | |||
385ee806d6 | |||
92aef41031 | |||
65b29ec4b8 | |||
9f51d68531 | |||
5bc4ba6332 | |||
e9739ac2d5 | |||
4d3a33dd9b |
android
assets/img
lib
api
apiResponse.dartrequestCache.dart
app.dartmain.dartholidays
marianumcloud
files-sharing
talk
webdav
queries
mhsl
breaker
getBreakers
customTimetableEvent
server
webuntis
queries
authenticate
getHolidays
getRooms
getSubjects
getTimetable
model
notification
state
app
infrastructure
loadableState
utilityWidgets
loadableHydratedBloc
modules
storage
base
general
timetable
theming
view
widget
@ -25,9 +25,10 @@ if (flutterVersionName == null) {
|
|||||||
android {
|
android {
|
||||||
namespace "eu.mhsl.marianum.mobile.client"
|
namespace "eu.mhsl.marianum.mobile.client"
|
||||||
compileSdk flutter.compileSdkVersion
|
compileSdk flutter.compileSdkVersion
|
||||||
ndkVersion flutter.ndkVersion
|
ndkVersion "27.0.12077973"
|
||||||
|
|
||||||
compileOptions {
|
compileOptions {
|
||||||
|
coreLibraryDesugaringEnabled true
|
||||||
sourceCompatibility JavaVersion.VERSION_1_8
|
sourceCompatibility JavaVersion.VERSION_1_8
|
||||||
targetCompatibility JavaVersion.VERSION_1_8
|
targetCompatibility JavaVersion.VERSION_1_8
|
||||||
}
|
}
|
||||||
@ -41,11 +42,8 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
|
||||||
applicationId "eu.mhsl.marianum.mobile.client"
|
applicationId "eu.mhsl.marianum.mobile.client"
|
||||||
// You can update the following values to match your application needs.
|
minSdkVersion 26
|
||||||
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
|
|
||||||
minSdkVersion 21
|
|
||||||
targetSdkVersion flutter.targetSdkVersion
|
targetSdkVersion flutter.targetSdkVersion
|
||||||
versionCode flutterVersionCode.toInteger()
|
versionCode flutterVersionCode.toInteger()
|
||||||
versionName flutterVersionName
|
versionName flutterVersionName
|
||||||
@ -66,5 +64,6 @@ flutter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation 'com.android.support:multidex:1.0.3'
|
implementation 'com.android.support:multidex:2.0.1'
|
||||||
|
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'
|
||||||
}
|
}
|
||||||
|
0
android/app/proguard-rules.pro
vendored
Normal file
0
android/app/proguard-rules.pro
vendored
Normal file
@ -1,3 +1,6 @@
|
|||||||
org.gradle.jvmargs=-Xmx4G
|
org.gradle.jvmargs=-Xmx4G
|
||||||
android.useAndroidX=true
|
android.useAndroidX=true
|
||||||
android.enableJetifier=true
|
android.enableJetifier=true
|
||||||
|
android.defaults.buildfeatures.buildconfig=true
|
||||||
|
android.nonTransitiveRClass=false
|
||||||
|
android.nonFinalResIds=false
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
|
||||||
networkTimeout=10000
|
networkTimeout=10000
|
||||||
|
validateDistributionUrl=true
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
@ -19,7 +19,7 @@ pluginManagement {
|
|||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
|
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
|
||||||
id "com.android.application" version "7.3.0" apply false
|
id "com.android.application" version '8.7.3' apply false
|
||||||
id "org.jetbrains.kotlin.android" version "1.8.10" apply false
|
id "org.jetbrains.kotlin.android" version "1.8.10" apply false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Binary file not shown.
Before ![]() (image error) Size: 108 KiB After ![]() (image error) Size: 101 KiB ![]() ![]() |
@ -5,5 +5,5 @@ abstract class ApiResponse {
|
|||||||
late http.Response rawResponse;
|
late http.Response rawResponse;
|
||||||
|
|
||||||
@JsonKey(includeIfNull: false)
|
@JsonKey(includeIfNull: false)
|
||||||
late Map<String, String>? headers;
|
Map<String, String>? headers;
|
||||||
}
|
}
|
||||||
|
@ -16,26 +16,19 @@ GetHolidaysResponse _$GetHolidaysResponseFromJson(Map<String, dynamic> json) =>
|
|||||||
(k, e) => MapEntry(k, e as String),
|
(k, e) => MapEntry(k, e as String),
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$GetHolidaysResponseToJson(GetHolidaysResponse instance) {
|
Map<String, dynamic> _$GetHolidaysResponseToJson(
|
||||||
final val = <String, dynamic>{};
|
GetHolidaysResponse instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
void writeNotNull(String key, dynamic value) {
|
if (instance.headers case final value?) 'headers': value,
|
||||||
if (value != null) {
|
'data': instance.data.map((e) => e.toJson()).toList(),
|
||||||
val[key] = value;
|
};
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
writeNotNull('headers', instance.headers);
|
|
||||||
val['data'] = instance.data.map((e) => e.toJson()).toList();
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
GetHolidaysResponseObject _$GetHolidaysResponseObjectFromJson(
|
GetHolidaysResponseObject _$GetHolidaysResponseObjectFromJson(
|
||||||
Map<String, dynamic> json) =>
|
Map<String, dynamic> json) =>
|
||||||
GetHolidaysResponseObject(
|
GetHolidaysResponseObject(
|
||||||
start: json['start'] as String,
|
start: json['start'] as String,
|
||||||
end: json['end'] as String,
|
end: json['end'] as String,
|
||||||
year: json['year'] as int,
|
year: (json['year'] as num).toInt(),
|
||||||
stateCode: json['stateCode'] as String,
|
stateCode: json['stateCode'] as String,
|
||||||
name: json['name'] as String,
|
name: json['name'] as String,
|
||||||
slug: json['slug'] as String,
|
slug: json['slug'] as String,
|
||||||
|
@ -9,7 +9,7 @@ part of 'fileSharingApiParams.dart';
|
|||||||
FileSharingApiParams _$FileSharingApiParamsFromJson(
|
FileSharingApiParams _$FileSharingApiParamsFromJson(
|
||||||
Map<String, dynamic> json) =>
|
Map<String, dynamic> json) =>
|
||||||
FileSharingApiParams(
|
FileSharingApiParams(
|
||||||
shareType: json['shareType'] as int,
|
shareType: (json['shareType'] as num).toInt(),
|
||||||
shareWith: json['shareWith'] as String,
|
shareWith: json['shareWith'] as String,
|
||||||
path: json['path'] as String,
|
path: json['path'] as String,
|
||||||
referenceId: json['referenceId'] as String?,
|
referenceId: json['referenceId'] as String?,
|
||||||
|
@ -10,38 +10,33 @@ GetChatParams _$GetChatParamsFromJson(Map<String, dynamic> json) =>
|
|||||||
GetChatParams(
|
GetChatParams(
|
||||||
lookIntoFuture:
|
lookIntoFuture:
|
||||||
$enumDecode(_$GetChatParamsSwitchEnumMap, json['lookIntoFuture']),
|
$enumDecode(_$GetChatParamsSwitchEnumMap, json['lookIntoFuture']),
|
||||||
limit: json['limit'] as int?,
|
limit: (json['limit'] as num?)?.toInt(),
|
||||||
lastKnownMessageId: json['lastKnownMessageId'] as int?,
|
lastKnownMessageId: (json['lastKnownMessageId'] as num?)?.toInt(),
|
||||||
lastCommonReadId: json['lastCommonReadId'] as int?,
|
lastCommonReadId: (json['lastCommonReadId'] as num?)?.toInt(),
|
||||||
timeout: json['timeout'] as int?,
|
timeout: (json['timeout'] as num?)?.toInt(),
|
||||||
setReadMarker: $enumDecodeNullable(
|
setReadMarker: $enumDecodeNullable(
|
||||||
_$GetChatParamsSwitchEnumMap, json['setReadMarker']),
|
_$GetChatParamsSwitchEnumMap, json['setReadMarker']),
|
||||||
includeLastKnown: $enumDecodeNullable(
|
includeLastKnown: $enumDecodeNullable(
|
||||||
_$GetChatParamsSwitchEnumMap, json['includeLastKnown']),
|
_$GetChatParamsSwitchEnumMap, json['includeLastKnown']),
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$GetChatParamsToJson(GetChatParams instance) {
|
Map<String, dynamic> _$GetChatParamsToJson(GetChatParams instance) =>
|
||||||
final val = <String, dynamic>{
|
<String, dynamic>{
|
||||||
'lookIntoFuture': _$GetChatParamsSwitchEnumMap[instance.lookIntoFuture]!,
|
'lookIntoFuture': _$GetChatParamsSwitchEnumMap[instance.lookIntoFuture]!,
|
||||||
|
if (instance.limit case final value?) 'limit': value,
|
||||||
|
if (instance.lastKnownMessageId case final value?)
|
||||||
|
'lastKnownMessageId': value,
|
||||||
|
if (instance.lastCommonReadId case final value?)
|
||||||
|
'lastCommonReadId': value,
|
||||||
|
if (instance.timeout case final value?) 'timeout': value,
|
||||||
|
if (_$GetChatParamsSwitchEnumMap[instance.setReadMarker]
|
||||||
|
case final value?)
|
||||||
|
'setReadMarker': value,
|
||||||
|
if (_$GetChatParamsSwitchEnumMap[instance.includeLastKnown]
|
||||||
|
case final value?)
|
||||||
|
'includeLastKnown': value,
|
||||||
};
|
};
|
||||||
|
|
||||||
void writeNotNull(String key, dynamic value) {
|
|
||||||
if (value != null) {
|
|
||||||
val[key] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
writeNotNull('limit', instance.limit);
|
|
||||||
writeNotNull('lastKnownMessageId', instance.lastKnownMessageId);
|
|
||||||
writeNotNull('lastCommonReadId', instance.lastCommonReadId);
|
|
||||||
writeNotNull('timeout', instance.timeout);
|
|
||||||
writeNotNull(
|
|
||||||
'setReadMarker', _$GetChatParamsSwitchEnumMap[instance.setReadMarker]);
|
|
||||||
writeNotNull('includeLastKnown',
|
|
||||||
_$GetChatParamsSwitchEnumMap[instance.includeLastKnown]);
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
const _$GetChatParamsSwitchEnumMap = {
|
const _$GetChatParamsSwitchEnumMap = {
|
||||||
GetChatParamsSwitch.on: 1,
|
GetChatParamsSwitch.on: 1,
|
||||||
GetChatParamsSwitch.off: 0,
|
GetChatParamsSwitch.off: 0,
|
||||||
|
@ -15,30 +15,22 @@ GetChatResponse _$GetChatResponseFromJson(Map<String, dynamic> json) =>
|
|||||||
(k, e) => MapEntry(k, e as String),
|
(k, e) => MapEntry(k, e as String),
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$GetChatResponseToJson(GetChatResponse instance) {
|
Map<String, dynamic> _$GetChatResponseToJson(GetChatResponse instance) =>
|
||||||
final val = <String, dynamic>{};
|
<String, dynamic>{
|
||||||
|
if (instance.headers case final value?) 'headers': value,
|
||||||
void writeNotNull(String key, dynamic value) {
|
'data': instance.data.map((e) => e.toJson()).toList(),
|
||||||
if (value != null) {
|
};
|
||||||
val[key] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
writeNotNull('headers', instance.headers);
|
|
||||||
val['data'] = instance.data.map((e) => e.toJson()).toList();
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
GetChatResponseObject _$GetChatResponseObjectFromJson(
|
GetChatResponseObject _$GetChatResponseObjectFromJson(
|
||||||
Map<String, dynamic> json) =>
|
Map<String, dynamic> json) =>
|
||||||
GetChatResponseObject(
|
GetChatResponseObject(
|
||||||
json['id'] as int,
|
(json['id'] as num).toInt(),
|
||||||
json['token'] as String,
|
json['token'] as String,
|
||||||
$enumDecode(
|
$enumDecode(
|
||||||
_$GetRoomResponseObjectMessageActorTypeEnumMap, json['actorType']),
|
_$GetRoomResponseObjectMessageActorTypeEnumMap, json['actorType']),
|
||||||
json['actorId'] as String,
|
json['actorId'] as String,
|
||||||
json['actorDisplayName'] as String,
|
json['actorDisplayName'] as String,
|
||||||
json['timestamp'] as int,
|
(json['timestamp'] as num).toInt(),
|
||||||
json['systemMessage'] as String,
|
json['systemMessage'] as String,
|
||||||
$enumDecode(
|
$enumDecode(
|
||||||
_$GetRoomResponseObjectMessageTypeEnumMap, json['messageType']),
|
_$GetRoomResponseObjectMessageTypeEnumMap, json['messageType']),
|
||||||
@ -47,7 +39,7 @@ GetChatResponseObject _$GetChatResponseObjectFromJson(
|
|||||||
json['message'] as String,
|
json['message'] as String,
|
||||||
_fromJson(json['messageParameters']),
|
_fromJson(json['messageParameters']),
|
||||||
(json['reactions'] as Map<String, dynamic>?)?.map(
|
(json['reactions'] as Map<String, dynamic>?)?.map(
|
||||||
(k, e) => MapEntry(k, e as int),
|
(k, e) => MapEntry(k, (e as num).toInt()),
|
||||||
),
|
),
|
||||||
(json['reactionsSelf'] as List<dynamic>?)
|
(json['reactionsSelf'] as List<dynamic>?)
|
||||||
?.map((e) => e as String)
|
?.map((e) => e as String)
|
||||||
|
@ -8,7 +8,7 @@ part of 'createRoomParams.dart';
|
|||||||
|
|
||||||
CreateRoomParams _$CreateRoomParamsFromJson(Map<String, dynamic> json) =>
|
CreateRoomParams _$CreateRoomParamsFromJson(Map<String, dynamic> json) =>
|
||||||
CreateRoomParams(
|
CreateRoomParams(
|
||||||
roomType: json['roomType'] as int,
|
roomType: (json['roomType'] as num).toInt(),
|
||||||
invite: json['invite'] as String,
|
invite: json['invite'] as String,
|
||||||
source: json['source'] as String?,
|
source: json['source'] as String?,
|
||||||
roomName: json['roomName'] as String?,
|
roomName: json['roomName'] as String?,
|
||||||
|
@ -18,34 +18,26 @@ GetParticipantsResponse _$GetParticipantsResponseFromJson(
|
|||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$GetParticipantsResponseToJson(
|
Map<String, dynamic> _$GetParticipantsResponseToJson(
|
||||||
GetParticipantsResponse instance) {
|
GetParticipantsResponse instance) =>
|
||||||
final val = <String, dynamic>{};
|
<String, dynamic>{
|
||||||
|
if (instance.headers case final value?) 'headers': value,
|
||||||
void writeNotNull(String key, dynamic value) {
|
'data': instance.data.map((e) => e.toJson()).toList(),
|
||||||
if (value != null) {
|
};
|
||||||
val[key] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
writeNotNull('headers', instance.headers);
|
|
||||||
val['data'] = instance.data.map((e) => e.toJson()).toList();
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
GetParticipantsResponseObject _$GetParticipantsResponseObjectFromJson(
|
GetParticipantsResponseObject _$GetParticipantsResponseObjectFromJson(
|
||||||
Map<String, dynamic> json) =>
|
Map<String, dynamic> json) =>
|
||||||
GetParticipantsResponseObject(
|
GetParticipantsResponseObject(
|
||||||
json['attendeeId'] as int,
|
(json['attendeeId'] as num).toInt(),
|
||||||
json['actorType'] as String,
|
json['actorType'] as String,
|
||||||
json['actorId'] as String,
|
json['actorId'] as String,
|
||||||
json['displayName'] as String,
|
json['displayName'] as String,
|
||||||
$enumDecode(_$GetParticipantsResponseObjectParticipantTypeEnumMap,
|
$enumDecode(_$GetParticipantsResponseObjectParticipantTypeEnumMap,
|
||||||
json['participantType']),
|
json['participantType']),
|
||||||
json['lastPing'] as int,
|
(json['lastPing'] as num).toInt(),
|
||||||
$enumDecode(_$GetParticipantsResponseObjectParticipantsInCallFlagsEnumMap,
|
$enumDecode(_$GetParticipantsResponseObjectParticipantsInCallFlagsEnumMap,
|
||||||
json['inCall']),
|
json['inCall']),
|
||||||
json['permissions'] as int,
|
(json['permissions'] as num).toInt(),
|
||||||
json['attendeePermissions'] as int,
|
(json['attendeePermissions'] as num).toInt(),
|
||||||
json['sessionId'] as String?,
|
json['sessionId'] as String?,
|
||||||
(json['sessionIds'] as List<dynamic>).map((e) => e as String).toList(),
|
(json['sessionIds'] as List<dynamic>).map((e) => e as String).toList(),
|
||||||
json['status'] as String?,
|
json['status'] as String?,
|
||||||
|
@ -22,20 +22,12 @@ GetReactionsResponse _$GetReactionsResponseFromJson(
|
|||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$GetReactionsResponseToJson(
|
Map<String, dynamic> _$GetReactionsResponseToJson(
|
||||||
GetReactionsResponse instance) {
|
GetReactionsResponse instance) =>
|
||||||
final val = <String, dynamic>{};
|
<String, dynamic>{
|
||||||
|
if (instance.headers case final value?) 'headers': value,
|
||||||
void writeNotNull(String key, dynamic value) {
|
'data': instance.data
|
||||||
if (value != null) {
|
.map((k, e) => MapEntry(k, e.map((e) => e.toJson()).toList())),
|
||||||
val[key] = value;
|
};
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
writeNotNull('headers', instance.headers);
|
|
||||||
val['data'] = instance.data
|
|
||||||
.map((k, e) => MapEntry(k, e.map((e) => e.toJson()).toList()));
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
GetReactionsResponseObject _$GetReactionsResponseObjectFromJson(
|
GetReactionsResponseObject _$GetReactionsResponseObjectFromJson(
|
||||||
Map<String, dynamic> json) =>
|
Map<String, dynamic> json) =>
|
||||||
@ -44,7 +36,7 @@ GetReactionsResponseObject _$GetReactionsResponseObjectFromJson(
|
|||||||
_$GetReactionsResponseObjectActorTypeEnumMap, json['actorType']),
|
_$GetReactionsResponseObjectActorTypeEnumMap, json['actorType']),
|
||||||
json['actorId'] as String,
|
json['actorId'] as String,
|
||||||
json['actorDisplayName'] as String,
|
json['actorDisplayName'] as String,
|
||||||
json['timestamp'] as int,
|
(json['timestamp'] as num).toInt(),
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$GetReactionsResponseObjectToJson(
|
Map<String, dynamic> _$GetReactionsResponseObjectToJson(
|
||||||
|
@ -11,7 +11,7 @@ GetRoomParams _$GetRoomParamsFromJson(Map<String, dynamic> json) =>
|
|||||||
noStatusUpdate: $enumDecodeNullable(
|
noStatusUpdate: $enumDecodeNullable(
|
||||||
_$GetRoomParamsStatusUpdateEnumMap, json['noStatusUpdate']),
|
_$GetRoomParamsStatusUpdateEnumMap, json['noStatusUpdate']),
|
||||||
includeStatus: json['includeStatus'] as bool?,
|
includeStatus: json['includeStatus'] as bool?,
|
||||||
modifiedSince: json['modifiedSince'] as int?,
|
modifiedSince: (json['modifiedSince'] as num?)?.toInt(),
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$GetRoomParamsToJson(GetRoomParams instance) =>
|
Map<String, dynamic> _$GetRoomParamsToJson(GetRoomParams instance) =>
|
||||||
|
@ -110,6 +110,7 @@ enum GetRoomResponseObjectConversationType {
|
|||||||
@JsonValue(3) public,
|
@JsonValue(3) public,
|
||||||
@JsonValue(4) changelog,
|
@JsonValue(4) changelog,
|
||||||
@JsonValue(5) deleted,
|
@JsonValue(5) deleted,
|
||||||
|
@JsonValue(6) noteToSelf,
|
||||||
}
|
}
|
||||||
|
|
||||||
enum GetRoomResponseObjectParticipantNotificationLevel {
|
enum GetRoomResponseObjectParticipantNotificationLevel {
|
||||||
|
@ -15,50 +15,42 @@ GetRoomResponse _$GetRoomResponseFromJson(Map<String, dynamic> json) =>
|
|||||||
(k, e) => MapEntry(k, e as String),
|
(k, e) => MapEntry(k, e as String),
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$GetRoomResponseToJson(GetRoomResponse instance) {
|
Map<String, dynamic> _$GetRoomResponseToJson(GetRoomResponse instance) =>
|
||||||
final val = <String, dynamic>{};
|
<String, dynamic>{
|
||||||
|
if (instance.headers case final value?) 'headers': value,
|
||||||
void writeNotNull(String key, dynamic value) {
|
'data': instance.data.map((e) => e.toJson()).toList(),
|
||||||
if (value != null) {
|
};
|
||||||
val[key] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
writeNotNull('headers', instance.headers);
|
|
||||||
val['data'] = instance.data.map((e) => e.toJson()).toList();
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
GetRoomResponseObject _$GetRoomResponseObjectFromJson(
|
GetRoomResponseObject _$GetRoomResponseObjectFromJson(
|
||||||
Map<String, dynamic> json) =>
|
Map<String, dynamic> json) =>
|
||||||
GetRoomResponseObject(
|
GetRoomResponseObject(
|
||||||
json['id'] as int,
|
(json['id'] as num).toInt(),
|
||||||
json['token'] as String,
|
json['token'] as String,
|
||||||
$enumDecode(_$GetRoomResponseObjectConversationTypeEnumMap, json['type']),
|
$enumDecode(_$GetRoomResponseObjectConversationTypeEnumMap, json['type']),
|
||||||
json['name'] as String,
|
json['name'] as String,
|
||||||
json['displayName'] as String,
|
json['displayName'] as String,
|
||||||
json['description'] as String,
|
json['description'] as String,
|
||||||
json['participantType'] as int,
|
(json['participantType'] as num).toInt(),
|
||||||
json['participantFlags'] as int,
|
(json['participantFlags'] as num).toInt(),
|
||||||
json['readOnly'] as int,
|
(json['readOnly'] as num).toInt(),
|
||||||
json['listable'] as int,
|
(json['listable'] as num).toInt(),
|
||||||
json['lastPing'] as int,
|
(json['lastPing'] as num).toInt(),
|
||||||
json['sessionId'] as String,
|
json['sessionId'] as String,
|
||||||
json['hasPassword'] as bool,
|
json['hasPassword'] as bool,
|
||||||
json['hasCall'] as bool,
|
json['hasCall'] as bool,
|
||||||
json['callFlag'] as int,
|
(json['callFlag'] as num).toInt(),
|
||||||
json['canStartCall'] as bool,
|
json['canStartCall'] as bool,
|
||||||
json['canDeleteConversation'] as bool,
|
json['canDeleteConversation'] as bool,
|
||||||
json['canLeaveConversation'] as bool,
|
json['canLeaveConversation'] as bool,
|
||||||
json['lastActivity'] as int,
|
(json['lastActivity'] as num).toInt(),
|
||||||
json['isFavorite'] as bool,
|
json['isFavorite'] as bool,
|
||||||
$enumDecode(_$GetRoomResponseObjectParticipantNotificationLevelEnumMap,
|
$enumDecode(_$GetRoomResponseObjectParticipantNotificationLevelEnumMap,
|
||||||
json['notificationLevel']),
|
json['notificationLevel']),
|
||||||
json['unreadMessages'] as int,
|
(json['unreadMessages'] as num).toInt(),
|
||||||
json['unreadMention'] as bool,
|
json['unreadMention'] as bool,
|
||||||
json['unreadMentionDirect'] as bool,
|
json['unreadMentionDirect'] as bool,
|
||||||
json['lastReadMessage'] as int,
|
(json['lastReadMessage'] as num).toInt(),
|
||||||
json['lastCommonReadMessage'] as int,
|
(json['lastCommonReadMessage'] as num).toInt(),
|
||||||
GetChatResponseObject.fromJson(
|
GetChatResponseObject.fromJson(
|
||||||
json['lastMessage'] as Map<String, dynamic>),
|
json['lastMessage'] as Map<String, dynamic>),
|
||||||
json['status'] as String?,
|
json['status'] as String?,
|
||||||
@ -110,6 +102,7 @@ const _$GetRoomResponseObjectConversationTypeEnumMap = {
|
|||||||
GetRoomResponseObjectConversationType.public: 3,
|
GetRoomResponseObjectConversationType.public: 3,
|
||||||
GetRoomResponseObjectConversationType.changelog: 4,
|
GetRoomResponseObjectConversationType.changelog: 4,
|
||||||
GetRoomResponseObjectConversationType.deleted: 5,
|
GetRoomResponseObjectConversationType.deleted: 5,
|
||||||
|
GetRoomResponseObjectConversationType.noteToSelf: 6,
|
||||||
};
|
};
|
||||||
|
|
||||||
const _$GetRoomResponseObjectParticipantNotificationLevelEnumMap = {
|
const _$GetRoomResponseObjectParticipantNotificationLevelEnumMap = {
|
||||||
|
@ -12,17 +12,8 @@ SendMessageParams _$SendMessageParamsFromJson(Map<String, dynamic> json) =>
|
|||||||
replyTo: json['replyTo'] as String?,
|
replyTo: json['replyTo'] as String?,
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$SendMessageParamsToJson(SendMessageParams instance) {
|
Map<String, dynamic> _$SendMessageParamsToJson(SendMessageParams instance) =>
|
||||||
final val = <String, dynamic>{
|
<String, dynamic>{
|
||||||
'message': instance.message,
|
'message': instance.message,
|
||||||
|
if (instance.replyTo case final value?) 'replyTo': value,
|
||||||
};
|
};
|
||||||
|
|
||||||
void writeNotNull(String key, dynamic value) {
|
|
||||||
if (value != null) {
|
|
||||||
val[key] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
writeNotNull('replyTo', instance.replyTo);
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
@ -8,7 +8,7 @@ part of 'setReadMarkerParams.dart';
|
|||||||
|
|
||||||
SetReadMarkerParams _$SetReadMarkerParamsFromJson(Map<String, dynamic> json) =>
|
SetReadMarkerParams _$SetReadMarkerParamsFromJson(Map<String, dynamic> json) =>
|
||||||
SetReadMarkerParams(
|
SetReadMarkerParams(
|
||||||
lastReadMessage: json['lastReadMessage'] as int?,
|
lastReadMessage: (json['lastReadMessage'] as num?)?.toInt(),
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$SetReadMarkerParamsToJson(
|
Map<String, dynamic> _$SetReadMarkerParamsToJson(
|
||||||
|
@ -58,11 +58,9 @@ abstract class TalkApi<T extends ApiResponse?> extends ApiRequest {
|
|||||||
assembled?.headers = data.headers;
|
assembled?.headers = data.headers;
|
||||||
return assembled;
|
return assembled;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// TODO report error
|
var message = 'Error assembling Talk API ${T.toString()} message: ${e.toString()} response with request body: $body and request headers: ${headers.toString()}';
|
||||||
log('Error assembling Talk API ${T.toString()} message: ${e.toString()} response on ${endpoint.path} with request body: $body and request headers: ${headers.toString()}');
|
log(message);
|
||||||
|
throw Exception(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw Exception('Error assembling Talk API response');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@ CacheableFile _$CacheableFileFromJson(Map<String, dynamic> json) =>
|
|||||||
isDirectory: json['isDirectory'] as bool,
|
isDirectory: json['isDirectory'] as bool,
|
||||||
name: json['name'] as String,
|
name: json['name'] as String,
|
||||||
mimeType: json['mimeType'] as String?,
|
mimeType: json['mimeType'] as String?,
|
||||||
size: json['size'] as int?,
|
size: (json['size'] as num?)?.toInt(),
|
||||||
eTag: json['eTag'] as String?,
|
eTag: json['eTag'] as String?,
|
||||||
createdAt: json['createdAt'] == null
|
createdAt: json['createdAt'] == null
|
||||||
? null
|
? null
|
||||||
|
@ -15,16 +15,8 @@ ListFilesResponse _$ListFilesResponseFromJson(Map<String, dynamic> json) =>
|
|||||||
(k, e) => MapEntry(k, e as String),
|
(k, e) => MapEntry(k, e as String),
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$ListFilesResponseToJson(ListFilesResponse instance) {
|
Map<String, dynamic> _$ListFilesResponseToJson(ListFilesResponse instance) =>
|
||||||
final val = <String, dynamic>{};
|
<String, dynamic>{
|
||||||
|
if (instance.headers case final value?) 'headers': value,
|
||||||
void writeNotNull(String key, dynamic value) {
|
'files': instance.files.map((e) => e.toJson()).toList(),
|
||||||
if (value != null) {
|
};
|
||||||
val[key] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
writeNotNull('headers', instance.headers);
|
|
||||||
val['files'] = instance.files.map((e) => e.toJson()).toList();
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
@ -17,20 +17,13 @@ GetBreakersResponse _$GetBreakersResponseFromJson(Map<String, dynamic> json) =>
|
|||||||
(k, e) => MapEntry(k, e as String),
|
(k, e) => MapEntry(k, e as String),
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$GetBreakersResponseToJson(GetBreakersResponse instance) {
|
Map<String, dynamic> _$GetBreakersResponseToJson(
|
||||||
final val = <String, dynamic>{};
|
GetBreakersResponse instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
void writeNotNull(String key, dynamic value) {
|
if (instance.headers case final value?) 'headers': value,
|
||||||
if (value != null) {
|
'global': instance.global.toJson(),
|
||||||
val[key] = value;
|
'regional': instance.regional.map((k, e) => MapEntry(k, e.toJson())),
|
||||||
}
|
};
|
||||||
}
|
|
||||||
|
|
||||||
writeNotNull('headers', instance.headers);
|
|
||||||
val['global'] = instance.global.toJson();
|
|
||||||
val['regional'] = instance.regional.map((k, e) => MapEntry(k, e.toJson()));
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
GetBreakersReponseObject _$GetBreakersReponseObjectFromJson(
|
GetBreakersReponseObject _$GetBreakersReponseObjectFromJson(
|
||||||
Map<String, dynamic> json) =>
|
Map<String, dynamic> json) =>
|
||||||
|
@ -17,16 +17,8 @@ GetCustomTimetableEventResponse _$GetCustomTimetableEventResponseFromJson(
|
|||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$GetCustomTimetableEventResponseToJson(
|
Map<String, dynamic> _$GetCustomTimetableEventResponseToJson(
|
||||||
GetCustomTimetableEventResponse instance) {
|
GetCustomTimetableEventResponse instance) =>
|
||||||
final val = <String, dynamic>{};
|
<String, dynamic>{
|
||||||
|
if (instance.headers case final value?) 'headers': value,
|
||||||
void writeNotNull(String key, dynamic value) {
|
'events': instance.events,
|
||||||
if (value != null) {
|
};
|
||||||
val[key] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
writeNotNull('headers', instance.headers);
|
|
||||||
val['events'] = instance.events;
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
@ -11,7 +11,7 @@ AddFeedbackParams _$AddFeedbackParamsFromJson(Map<String, dynamic> json) =>
|
|||||||
user: json['user'] as String,
|
user: json['user'] as String,
|
||||||
feedback: json['feedback'] as String,
|
feedback: json['feedback'] as String,
|
||||||
screenshot: json['screenshot'] as String?,
|
screenshot: json['screenshot'] as String?,
|
||||||
appVersion: json['appVersion'] as int,
|
appVersion: (json['appVersion'] as num).toInt(),
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$AddFeedbackParamsToJson(AddFeedbackParams instance) =>
|
Map<String, dynamic> _$AddFeedbackParamsToJson(AddFeedbackParams instance) =>
|
||||||
|
@ -12,7 +12,7 @@ UpdateUserIndexParams _$UpdateUserIndexParamsFromJson(
|
|||||||
user: json['user'] as String,
|
user: json['user'] as String,
|
||||||
username: json['username'] as String,
|
username: json['username'] as String,
|
||||||
device: json['device'] as String,
|
device: json['device'] as String,
|
||||||
appVersion: json['appVersion'] as int,
|
appVersion: (json['appVersion'] as num).toInt(),
|
||||||
deviceInfo: json['deviceInfo'] as String,
|
deviceInfo: json['deviceInfo'] as String,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ import 'dart:developer';
|
|||||||
|
|
||||||
import 'package:device_info_plus/device_info_plus.dart';
|
import 'package:device_info_plus/device_info_plus.dart';
|
||||||
import 'package:http/http.dart' as http;
|
import 'package:http/http.dart' as http;
|
||||||
import 'package:package_info/package_info.dart';
|
import 'package:package_info_plus/package_info_plus.dart';
|
||||||
|
|
||||||
import '../../../../../model/accountData.dart';
|
import '../../../../../model/accountData.dart';
|
||||||
import '../../../mhslApi.dart';
|
import '../../../mhslApi.dart';
|
||||||
|
@ -3,7 +3,6 @@ import 'dart:convert';
|
|||||||
import 'package:localstore/localstore.dart';
|
import 'package:localstore/localstore.dart';
|
||||||
|
|
||||||
import 'apiResponse.dart';
|
import 'apiResponse.dart';
|
||||||
import 'webuntis/webuntisError.dart';
|
|
||||||
|
|
||||||
abstract class RequestCache<T extends ApiResponse?> {
|
abstract class RequestCache<T extends ApiResponse?> {
|
||||||
static const int cacheNothing = 0;
|
static const int cacheNothing = 0;
|
||||||
@ -40,7 +39,7 @@ abstract class RequestCache<T extends ApiResponse?> {
|
|||||||
'json': jsonEncode(newValue),
|
'json': jsonEncode(newValue),
|
||||||
'lastupdate': DateTime.now().millisecondsSinceEpoch
|
'lastupdate': DateTime.now().millisecondsSinceEpoch
|
||||||
});
|
});
|
||||||
} on WebuntisError catch(e) {
|
} on Exception catch(e) {
|
||||||
onError(e);
|
onError(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,27 +10,19 @@ AuthenticateResponse _$AuthenticateResponseFromJson(
|
|||||||
Map<String, dynamic> json) =>
|
Map<String, dynamic> json) =>
|
||||||
AuthenticateResponse(
|
AuthenticateResponse(
|
||||||
json['sessionId'] as String,
|
json['sessionId'] as String,
|
||||||
json['personType'] as int,
|
(json['personType'] as num).toInt(),
|
||||||
json['personId'] as int,
|
(json['personId'] as num).toInt(),
|
||||||
json['klasseId'] as int,
|
(json['klasseId'] as num).toInt(),
|
||||||
)..headers = (json['headers'] as Map<String, dynamic>?)?.map(
|
)..headers = (json['headers'] as Map<String, dynamic>?)?.map(
|
||||||
(k, e) => MapEntry(k, e as String),
|
(k, e) => MapEntry(k, e as String),
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$AuthenticateResponseToJson(
|
Map<String, dynamic> _$AuthenticateResponseToJson(
|
||||||
AuthenticateResponse instance) {
|
AuthenticateResponse instance) =>
|
||||||
final val = <String, dynamic>{};
|
<String, dynamic>{
|
||||||
|
if (instance.headers case final value?) 'headers': value,
|
||||||
void writeNotNull(String key, dynamic value) {
|
'sessionId': instance.sessionId,
|
||||||
if (value != null) {
|
'personType': instance.personType,
|
||||||
val[key] = value;
|
'personId': instance.personId,
|
||||||
}
|
'klasseId': instance.klasseId,
|
||||||
}
|
};
|
||||||
|
|
||||||
writeNotNull('headers', instance.headers);
|
|
||||||
val['sessionId'] = instance.sessionId;
|
|
||||||
val['personType'] = instance.personType;
|
|
||||||
val['personId'] = instance.personId;
|
|
||||||
val['klasseId'] = instance.klasseId;
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
@ -16,28 +16,21 @@ GetHolidaysResponse _$GetHolidaysResponseFromJson(Map<String, dynamic> json) =>
|
|||||||
(k, e) => MapEntry(k, e as String),
|
(k, e) => MapEntry(k, e as String),
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$GetHolidaysResponseToJson(GetHolidaysResponse instance) {
|
Map<String, dynamic> _$GetHolidaysResponseToJson(
|
||||||
final val = <String, dynamic>{};
|
GetHolidaysResponse instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
void writeNotNull(String key, dynamic value) {
|
if (instance.headers case final value?) 'headers': value,
|
||||||
if (value != null) {
|
'result': instance.result.map((e) => e.toJson()).toList(),
|
||||||
val[key] = value;
|
};
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
writeNotNull('headers', instance.headers);
|
|
||||||
val['result'] = instance.result.map((e) => e.toJson()).toList();
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
GetHolidaysResponseObject _$GetHolidaysResponseObjectFromJson(
|
GetHolidaysResponseObject _$GetHolidaysResponseObjectFromJson(
|
||||||
Map<String, dynamic> json) =>
|
Map<String, dynamic> json) =>
|
||||||
GetHolidaysResponseObject(
|
GetHolidaysResponseObject(
|
||||||
json['id'] as int,
|
(json['id'] as num).toInt(),
|
||||||
json['name'] as String,
|
json['name'] as String,
|
||||||
json['longName'] as String,
|
json['longName'] as String,
|
||||||
json['startDate'] as int,
|
(json['startDate'] as num).toInt(),
|
||||||
json['endDate'] as int,
|
(json['endDate'] as num).toInt(),
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$GetHolidaysResponseObjectToJson(
|
Map<String, dynamic> _$GetHolidaysResponseObjectToJson(
|
||||||
|
@ -16,24 +16,16 @@ GetRoomsResponse _$GetRoomsResponseFromJson(Map<String, dynamic> json) =>
|
|||||||
(k, e) => MapEntry(k, e as String),
|
(k, e) => MapEntry(k, e as String),
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$GetRoomsResponseToJson(GetRoomsResponse instance) {
|
Map<String, dynamic> _$GetRoomsResponseToJson(GetRoomsResponse instance) =>
|
||||||
final val = <String, dynamic>{};
|
<String, dynamic>{
|
||||||
|
if (instance.headers case final value?) 'headers': value,
|
||||||
void writeNotNull(String key, dynamic value) {
|
'result': instance.result.map((e) => e.toJson()).toList(),
|
||||||
if (value != null) {
|
};
|
||||||
val[key] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
writeNotNull('headers', instance.headers);
|
|
||||||
val['result'] = instance.result.map((e) => e.toJson()).toList();
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
GetRoomsResponseObject _$GetRoomsResponseObjectFromJson(
|
GetRoomsResponseObject _$GetRoomsResponseObjectFromJson(
|
||||||
Map<String, dynamic> json) =>
|
Map<String, dynamic> json) =>
|
||||||
GetRoomsResponseObject(
|
GetRoomsResponseObject(
|
||||||
json['id'] as int,
|
(json['id'] as num).toInt(),
|
||||||
json['name'] as String,
|
json['name'] as String,
|
||||||
json['longName'] as String,
|
json['longName'] as String,
|
||||||
json['active'] as bool,
|
json['active'] as bool,
|
||||||
|
@ -16,24 +16,17 @@ GetSubjectsResponse _$GetSubjectsResponseFromJson(Map<String, dynamic> json) =>
|
|||||||
(k, e) => MapEntry(k, e as String),
|
(k, e) => MapEntry(k, e as String),
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$GetSubjectsResponseToJson(GetSubjectsResponse instance) {
|
Map<String, dynamic> _$GetSubjectsResponseToJson(
|
||||||
final val = <String, dynamic>{};
|
GetSubjectsResponse instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
void writeNotNull(String key, dynamic value) {
|
if (instance.headers case final value?) 'headers': value,
|
||||||
if (value != null) {
|
'result': instance.result.map((e) => e.toJson()).toList(),
|
||||||
val[key] = value;
|
};
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
writeNotNull('headers', instance.headers);
|
|
||||||
val['result'] = instance.result.map((e) => e.toJson()).toList();
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
GetSubjectsResponseObject _$GetSubjectsResponseObjectFromJson(
|
GetSubjectsResponseObject _$GetSubjectsResponseObjectFromJson(
|
||||||
Map<String, dynamic> json) =>
|
Map<String, dynamic> json) =>
|
||||||
GetSubjectsResponseObject(
|
GetSubjectsResponseObject(
|
||||||
json['id'] as int,
|
(json['id'] as num).toInt(),
|
||||||
json['name'] as String,
|
json['name'] as String,
|
||||||
json['longName'] as String,
|
json['longName'] as String,
|
||||||
json['alternateName'] as String,
|
json['alternateName'] as String,
|
||||||
|
@ -22,8 +22,8 @@ GetTimetableParamsOptions _$GetTimetableParamsOptionsFromJson(
|
|||||||
GetTimetableParamsOptions(
|
GetTimetableParamsOptions(
|
||||||
element: GetTimetableParamsOptionsElement.fromJson(
|
element: GetTimetableParamsOptionsElement.fromJson(
|
||||||
json['element'] as Map<String, dynamic>),
|
json['element'] as Map<String, dynamic>),
|
||||||
startDate: json['startDate'] as int?,
|
startDate: (json['startDate'] as num?)?.toInt(),
|
||||||
endDate: json['endDate'] as int?,
|
endDate: (json['endDate'] as num?)?.toInt(),
|
||||||
onlyBaseTimetable: json['onlyBaseTimetable'] as bool?,
|
onlyBaseTimetable: json['onlyBaseTimetable'] as bool?,
|
||||||
showBooking: json['showBooking'] as bool?,
|
showBooking: json['showBooking'] as bool?,
|
||||||
showInfo: json['showInfo'] as bool?,
|
showInfo: json['showInfo'] as bool?,
|
||||||
@ -46,49 +46,42 @@ GetTimetableParamsOptions _$GetTimetableParamsOptionsFromJson(
|
|||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$GetTimetableParamsOptionsToJson(
|
Map<String, dynamic> _$GetTimetableParamsOptionsToJson(
|
||||||
GetTimetableParamsOptions instance) {
|
GetTimetableParamsOptions instance) =>
|
||||||
final val = <String, dynamic>{
|
<String, dynamic>{
|
||||||
'element': instance.element.toJson(),
|
'element': instance.element.toJson(),
|
||||||
|
if (instance.startDate case final value?) 'startDate': value,
|
||||||
|
if (instance.endDate case final value?) 'endDate': value,
|
||||||
|
if (instance.onlyBaseTimetable case final value?)
|
||||||
|
'onlyBaseTimetable': value,
|
||||||
|
if (instance.showBooking case final value?) 'showBooking': value,
|
||||||
|
if (instance.showInfo case final value?) 'showInfo': value,
|
||||||
|
if (instance.showSubstText case final value?) 'showSubstText': value,
|
||||||
|
if (instance.showLsText case final value?) 'showLsText': value,
|
||||||
|
if (instance.showLsNumber case final value?) 'showLsNumber': value,
|
||||||
|
if (instance.showStudentgroup case final value?)
|
||||||
|
'showStudentgroup': value,
|
||||||
|
if (instance.klasseFields
|
||||||
|
?.map((e) => _$GetTimetableParamsOptionsFieldsEnumMap[e]!)
|
||||||
|
.toList()
|
||||||
|
case final value?)
|
||||||
|
'klasseFields': value,
|
||||||
|
if (instance.roomFields
|
||||||
|
?.map((e) => _$GetTimetableParamsOptionsFieldsEnumMap[e]!)
|
||||||
|
.toList()
|
||||||
|
case final value?)
|
||||||
|
'roomFields': value,
|
||||||
|
if (instance.subjectFields
|
||||||
|
?.map((e) => _$GetTimetableParamsOptionsFieldsEnumMap[e]!)
|
||||||
|
.toList()
|
||||||
|
case final value?)
|
||||||
|
'subjectFields': value,
|
||||||
|
if (instance.teacherFields
|
||||||
|
?.map((e) => _$GetTimetableParamsOptionsFieldsEnumMap[e]!)
|
||||||
|
.toList()
|
||||||
|
case final value?)
|
||||||
|
'teacherFields': value,
|
||||||
};
|
};
|
||||||
|
|
||||||
void writeNotNull(String key, dynamic value) {
|
|
||||||
if (value != null) {
|
|
||||||
val[key] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
writeNotNull('startDate', instance.startDate);
|
|
||||||
writeNotNull('endDate', instance.endDate);
|
|
||||||
writeNotNull('onlyBaseTimetable', instance.onlyBaseTimetable);
|
|
||||||
writeNotNull('showBooking', instance.showBooking);
|
|
||||||
writeNotNull('showInfo', instance.showInfo);
|
|
||||||
writeNotNull('showSubstText', instance.showSubstText);
|
|
||||||
writeNotNull('showLsText', instance.showLsText);
|
|
||||||
writeNotNull('showLsNumber', instance.showLsNumber);
|
|
||||||
writeNotNull('showStudentgroup', instance.showStudentgroup);
|
|
||||||
writeNotNull(
|
|
||||||
'klasseFields',
|
|
||||||
instance.klasseFields
|
|
||||||
?.map((e) => _$GetTimetableParamsOptionsFieldsEnumMap[e]!)
|
|
||||||
.toList());
|
|
||||||
writeNotNull(
|
|
||||||
'roomFields',
|
|
||||||
instance.roomFields
|
|
||||||
?.map((e) => _$GetTimetableParamsOptionsFieldsEnumMap[e]!)
|
|
||||||
.toList());
|
|
||||||
writeNotNull(
|
|
||||||
'subjectFields',
|
|
||||||
instance.subjectFields
|
|
||||||
?.map((e) => _$GetTimetableParamsOptionsFieldsEnumMap[e]!)
|
|
||||||
.toList());
|
|
||||||
writeNotNull(
|
|
||||||
'teacherFields',
|
|
||||||
instance.teacherFields
|
|
||||||
?.map((e) => _$GetTimetableParamsOptionsFieldsEnumMap[e]!)
|
|
||||||
.toList());
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
const _$GetTimetableParamsOptionsFieldsEnumMap = {
|
const _$GetTimetableParamsOptionsFieldsEnumMap = {
|
||||||
GetTimetableParamsOptionsFields.id: 'id',
|
GetTimetableParamsOptionsFields.id: 'id',
|
||||||
GetTimetableParamsOptionsFields.name: 'name',
|
GetTimetableParamsOptionsFields.name: 'name',
|
||||||
@ -99,30 +92,22 @@ const _$GetTimetableParamsOptionsFieldsEnumMap = {
|
|||||||
GetTimetableParamsOptionsElement _$GetTimetableParamsOptionsElementFromJson(
|
GetTimetableParamsOptionsElement _$GetTimetableParamsOptionsElementFromJson(
|
||||||
Map<String, dynamic> json) =>
|
Map<String, dynamic> json) =>
|
||||||
GetTimetableParamsOptionsElement(
|
GetTimetableParamsOptionsElement(
|
||||||
id: json['id'] as int,
|
id: (json['id'] as num).toInt(),
|
||||||
type: json['type'] as int,
|
type: (json['type'] as num).toInt(),
|
||||||
keyType: $enumDecodeNullable(
|
keyType: $enumDecodeNullable(
|
||||||
_$GetTimetableParamsOptionsElementKeyTypeEnumMap, json['keyType']),
|
_$GetTimetableParamsOptionsElementKeyTypeEnumMap, json['keyType']),
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$GetTimetableParamsOptionsElementToJson(
|
Map<String, dynamic> _$GetTimetableParamsOptionsElementToJson(
|
||||||
GetTimetableParamsOptionsElement instance) {
|
GetTimetableParamsOptionsElement instance) =>
|
||||||
final val = <String, dynamic>{
|
<String, dynamic>{
|
||||||
'id': instance.id,
|
'id': instance.id,
|
||||||
'type': instance.type,
|
'type': instance.type,
|
||||||
|
if (_$GetTimetableParamsOptionsElementKeyTypeEnumMap[instance.keyType]
|
||||||
|
case final value?)
|
||||||
|
'keyType': value,
|
||||||
};
|
};
|
||||||
|
|
||||||
void writeNotNull(String key, dynamic value) {
|
|
||||||
if (value != null) {
|
|
||||||
val[key] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
writeNotNull('keyType',
|
|
||||||
_$GetTimetableParamsOptionsElementKeyTypeEnumMap[instance.keyType]);
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
const _$GetTimetableParamsOptionsElementKeyTypeEnumMap = {
|
const _$GetTimetableParamsOptionsElementKeyTypeEnumMap = {
|
||||||
GetTimetableParamsOptionsElementKeyType.id: 'id',
|
GetTimetableParamsOptionsElementKeyType.id: 'id',
|
||||||
GetTimetableParamsOptionsElementKeyType.name: 'name',
|
GetTimetableParamsOptionsElementKeyType.name: 'name',
|
||||||
|
@ -18,33 +18,25 @@ GetTimetableResponse _$GetTimetableResponseFromJson(
|
|||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$GetTimetableResponseToJson(
|
Map<String, dynamic> _$GetTimetableResponseToJson(
|
||||||
GetTimetableResponse instance) {
|
GetTimetableResponse instance) =>
|
||||||
final val = <String, dynamic>{};
|
<String, dynamic>{
|
||||||
|
if (instance.headers case final value?) 'headers': value,
|
||||||
void writeNotNull(String key, dynamic value) {
|
'result': instance.result.map((e) => e.toJson()).toList(),
|
||||||
if (value != null) {
|
};
|
||||||
val[key] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
writeNotNull('headers', instance.headers);
|
|
||||||
val['result'] = instance.result.map((e) => e.toJson()).toList();
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
GetTimetableResponseObject _$GetTimetableResponseObjectFromJson(
|
GetTimetableResponseObject _$GetTimetableResponseObjectFromJson(
|
||||||
Map<String, dynamic> json) =>
|
Map<String, dynamic> json) =>
|
||||||
GetTimetableResponseObject(
|
GetTimetableResponseObject(
|
||||||
id: json['id'] as int,
|
id: (json['id'] as num).toInt(),
|
||||||
date: json['date'] as int,
|
date: (json['date'] as num).toInt(),
|
||||||
startTime: json['startTime'] as int,
|
startTime: (json['startTime'] as num).toInt(),
|
||||||
endTime: json['endTime'] as int,
|
endTime: (json['endTime'] as num).toInt(),
|
||||||
lstype: json['lstype'] as String?,
|
lstype: json['lstype'] as String?,
|
||||||
code: json['code'] as String?,
|
code: json['code'] as String?,
|
||||||
info: json['info'] as String?,
|
info: json['info'] as String?,
|
||||||
substText: json['substText'] as String?,
|
substText: json['substText'] as String?,
|
||||||
lstext: json['lstext'] as String?,
|
lstext: json['lstext'] as String?,
|
||||||
lsnumber: json['lsnumber'] as int?,
|
lsnumber: (json['lsnumber'] as num?)?.toInt(),
|
||||||
statflags: json['statflags'] as String?,
|
statflags: json['statflags'] as String?,
|
||||||
activityType: json['activityType'] as String?,
|
activityType: json['activityType'] as String?,
|
||||||
sg: json['sg'] as String?,
|
sg: json['sg'] as String?,
|
||||||
@ -110,7 +102,7 @@ GetTimetableResponseObjectFieldsObject
|
|||||||
_$GetTimetableResponseObjectFieldsObjectFromJson(
|
_$GetTimetableResponseObjectFieldsObjectFromJson(
|
||||||
Map<String, dynamic> json) =>
|
Map<String, dynamic> json) =>
|
||||||
GetTimetableResponseObjectFieldsObject(
|
GetTimetableResponseObjectFieldsObject(
|
||||||
id: json['id'] as int?,
|
id: (json['id'] as num?)?.toInt(),
|
||||||
name: json['name'] as String?,
|
name: json['name'] as String?,
|
||||||
longname: json['longname'] as String?,
|
longname: json['longname'] as String?,
|
||||||
externalkey: json['externalkey'] as String?,
|
externalkey: json['externalkey'] as String?,
|
||||||
@ -128,7 +120,7 @@ Map<String, dynamic> _$GetTimetableResponseObjectFieldsObjectToJson(
|
|||||||
GetTimetableResponseObjectClass _$GetTimetableResponseObjectClassFromJson(
|
GetTimetableResponseObjectClass _$GetTimetableResponseObjectClassFromJson(
|
||||||
Map<String, dynamic> json) =>
|
Map<String, dynamic> json) =>
|
||||||
GetTimetableResponseObjectClass(
|
GetTimetableResponseObjectClass(
|
||||||
json['id'] as int,
|
(json['id'] as num).toInt(),
|
||||||
json['name'] as String,
|
json['name'] as String,
|
||||||
json['longname'] as String,
|
json['longname'] as String,
|
||||||
json['externalkey'] as String?,
|
json['externalkey'] as String?,
|
||||||
@ -146,10 +138,10 @@ Map<String, dynamic> _$GetTimetableResponseObjectClassToJson(
|
|||||||
GetTimetableResponseObjectTeacher _$GetTimetableResponseObjectTeacherFromJson(
|
GetTimetableResponseObjectTeacher _$GetTimetableResponseObjectTeacherFromJson(
|
||||||
Map<String, dynamic> json) =>
|
Map<String, dynamic> json) =>
|
||||||
GetTimetableResponseObjectTeacher(
|
GetTimetableResponseObjectTeacher(
|
||||||
json['id'] as int,
|
(json['id'] as num).toInt(),
|
||||||
json['name'] as String,
|
json['name'] as String,
|
||||||
json['longname'] as String,
|
json['longname'] as String,
|
||||||
json['orgid'] as int?,
|
(json['orgid'] as num?)?.toInt(),
|
||||||
json['orgname'] as String?,
|
json['orgname'] as String?,
|
||||||
json['externalkey'] as String?,
|
json['externalkey'] as String?,
|
||||||
);
|
);
|
||||||
@ -168,7 +160,7 @@ Map<String, dynamic> _$GetTimetableResponseObjectTeacherToJson(
|
|||||||
GetTimetableResponseObjectSubject _$GetTimetableResponseObjectSubjectFromJson(
|
GetTimetableResponseObjectSubject _$GetTimetableResponseObjectSubjectFromJson(
|
||||||
Map<String, dynamic> json) =>
|
Map<String, dynamic> json) =>
|
||||||
GetTimetableResponseObjectSubject(
|
GetTimetableResponseObjectSubject(
|
||||||
json['id'] as int,
|
(json['id'] as num).toInt(),
|
||||||
json['name'] as String,
|
json['name'] as String,
|
||||||
json['longname'] as String,
|
json['longname'] as String,
|
||||||
);
|
);
|
||||||
@ -184,7 +176,7 @@ Map<String, dynamic> _$GetTimetableResponseObjectSubjectToJson(
|
|||||||
GetTimetableResponseObjectRoom _$GetTimetableResponseObjectRoomFromJson(
|
GetTimetableResponseObjectRoom _$GetTimetableResponseObjectRoomFromJson(
|
||||||
Map<String, dynamic> json) =>
|
Map<String, dynamic> json) =>
|
||||||
GetTimetableResponseObjectRoom(
|
GetTimetableResponseObjectRoom(
|
||||||
json['id'] as int,
|
(json['id'] as num).toInt(),
|
||||||
json['name'] as String,
|
json['name'] as String,
|
||||||
json['longname'] as String,
|
json['longname'] as String,
|
||||||
);
|
);
|
||||||
|
29
lib/app.dart
29
lib/app.dart
@ -8,7 +8,6 @@ import 'package:flutter/material.dart';
|
|||||||
import 'state/app/modules/app_modules.dart';
|
import 'state/app/modules/app_modules.dart';
|
||||||
import 'package:persistent_bottom_nav_bar_v2/persistent_bottom_nav_bar_v2.dart';
|
import 'package:persistent_bottom_nav_bar_v2/persistent_bottom_nav_bar_v2.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:badges/badges.dart' as badges;
|
|
||||||
|
|
||||||
import 'api/mhsl/breaker/getBreakers/getBreakersResponse.dart';
|
import 'api/mhsl/breaker/getBreakers/getBreakersResponse.dart';
|
||||||
import 'api/mhsl/server/userIndex/update/updateUserindex.dart';
|
import 'api/mhsl/server/userIndex/update/updateUserindex.dart';
|
||||||
@ -93,7 +92,7 @@ class _AppState extends State<App> with WidgetsBindingObserver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) => PersistentTabView(
|
Widget build(BuildContext context) => Consumer<SettingsProvider>(builder: (context, settings, child) => PersistentTabView(
|
||||||
controller: Main.bottomNavigator,
|
controller: Main.bottomNavigator,
|
||||||
navBarOverlap: const NavBarOverlap.none(),
|
navBarOverlap: const NavBarOverlap.none(),
|
||||||
backgroundColor: Theme.of(context).colorScheme.primary,
|
backgroundColor: Theme.of(context).colorScheme.primary,
|
||||||
@ -101,29 +100,7 @@ class _AppState extends State<App> with WidgetsBindingObserver {
|
|||||||
|
|
||||||
screenTransitionAnimation: const ScreenTransitionAnimation(curve: Curves.easeOutQuad, duration: Duration(milliseconds: 200)),
|
screenTransitionAnimation: const ScreenTransitionAnimation(curve: Curves.easeOutQuad, duration: Duration(milliseconds: 200)),
|
||||||
tabs: [
|
tabs: [
|
||||||
AppModule.getModule(Modules.timetable).toBottomTab(context),
|
...AppModule.getBottomBarModules(context).map((e) => e.toBottomTab(context)),
|
||||||
AppModule.getModule(Modules.talk).toBottomTab(
|
|
||||||
context,
|
|
||||||
itemBuilder: (icon) => Consumer<ChatListProps>(
|
|
||||||
builder: (context, value, child) {
|
|
||||||
if(value.primaryLoading()) return Icon(icon);
|
|
||||||
var messages = value.getRoomsResponse.data.map((e) => e.unreadMessages).reduce((a, b) => a+b);
|
|
||||||
return badges.Badge(
|
|
||||||
showBadge: messages > 0,
|
|
||||||
position: badges.BadgePosition.topEnd(top: -3, end: -3),
|
|
||||||
stackFit: StackFit.loose,
|
|
||||||
badgeStyle: badges.BadgeStyle(
|
|
||||||
padding: const EdgeInsets.all(3),
|
|
||||||
badgeColor: Theme.of(context).primaryColor,
|
|
||||||
elevation: 1,
|
|
||||||
),
|
|
||||||
badgeContent: Text('$messages', style: const TextStyle(color: Colors.white, fontSize: 10, fontWeight: FontWeight.bold)),
|
|
||||||
child: Icon(icon),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
AppModule.getModule(Modules.files).toBottomTab(context),
|
|
||||||
|
|
||||||
PersistentTabConfig(
|
PersistentTabConfig(
|
||||||
screen: const Breaker(breaker: BreakerArea.more, child: Overhang()),
|
screen: const Breaker(breaker: BreakerArea.more, child: Overhang()),
|
||||||
@ -142,7 +119,7 @@ class _AppState extends State<App> with WidgetsBindingObserver {
|
|||||||
color: Theme.of(context).colorScheme.surface,
|
color: Theme.of(context).colorScheme.surface,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
));
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
|
@ -7,13 +7,13 @@ import 'package:firebase_messaging/firebase_messaging.dart';
|
|||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||||
import 'package:hydrated_bloc/hydrated_bloc.dart';
|
import 'package:hydrated_bloc/hydrated_bloc.dart';
|
||||||
import 'package:jiffy/jiffy.dart';
|
import 'package:jiffy/jiffy.dart';
|
||||||
import 'package:loader_overlay/loader_overlay.dart';
|
import 'package:loader_overlay/loader_overlay.dart';
|
||||||
import 'package:path_provider/path_provider.dart';
|
import 'package:path_provider/path_provider.dart';
|
||||||
import 'package:persistent_bottom_nav_bar_v2/persistent_bottom_nav_bar_v2.dart';
|
import 'package:persistent_bottom_nav_bar_v2/persistent_bottom_nav_bar_v2.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:flutter_localizations/flutter_localizations.dart';
|
|
||||||
|
|
||||||
import 'api/mhsl/breaker/getBreakers/getBreakersResponse.dart';
|
import 'api/mhsl/breaker/getBreakers/getBreakersResponse.dart';
|
||||||
import 'app.dart';
|
import 'app.dart';
|
||||||
@ -48,7 +48,9 @@ Future<void> main() async {
|
|||||||
PlatformAssetBundle().load('assets/ca/lets-encrypt-r10.pem').then(addCertificateAsTrusted),
|
PlatformAssetBundle().load('assets/ca/lets-encrypt-r10.pem').then(addCertificateAsTrusted),
|
||||||
|
|
||||||
Future(() async {
|
Future(() async {
|
||||||
await HydratedStorage.build(storageDirectory: await getTemporaryDirectory()).then((storage) => HydratedBloc.storage = storage);
|
await HydratedStorage.build(
|
||||||
|
storageDirectory: HydratedStorageDirectory((await getTemporaryDirectory()).path)
|
||||||
|
).then((storage) => HydratedBloc.storage = storage);
|
||||||
})
|
})
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -23,7 +23,11 @@ class _BreakerState extends State<Breaker> {
|
|||||||
builder: (context, value, child) {
|
builder: (context, value, child) {
|
||||||
var blocked = value.isBlocked(widget.breaker);
|
var blocked = value.isBlocked(widget.breaker);
|
||||||
if(blocked != null) {
|
if(blocked != null) {
|
||||||
return PlaceholderView(icon: Icons.security_outlined, text: "Die App/ Dieser Bereich wurde als Schutzmaßnahme deaktiviert!\n\n${blocked.isEmpty ? "Es wurde vom Server kein Grund übermittelt." : blocked}");
|
return PlaceholderView(
|
||||||
|
icon: Icons.app_blocking_outlined,
|
||||||
|
text: 'Die App / Dieser Bereich ist zurzeit nicht verfügbar!\n\n'
|
||||||
|
"${blocked.isEmpty ? "Es wurde vom Server kein Grund übermittelt.\nAktualisiere die App und versuche es später erneut" : blocked}"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return widget.child;
|
return widget.child;
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import 'package:package_info/package_info.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
|
import 'package:package_info_plus/package_info_plus.dart';
|
||||||
|
|
||||||
import '../../api/apiResponse.dart';
|
import '../../api/apiResponse.dart';
|
||||||
import '../../api/mhsl/breaker/getBreakers/getBreakersCache.dart';
|
import '../../api/mhsl/breaker/getBreakers/getBreakersCache.dart';
|
||||||
@ -12,6 +13,8 @@ class BreakerProps extends DataHolder {
|
|||||||
PackageInfo? packageInfo;
|
PackageInfo? packageInfo;
|
||||||
|
|
||||||
String? isBlocked(BreakerArea? type) {
|
String? isBlocked(BreakerArea? type) {
|
||||||
|
if(kDebugMode) return null;
|
||||||
|
|
||||||
if(packageInfo == null) {
|
if(packageInfo == null) {
|
||||||
PackageInfo.fromPlatform().then((value) => packageInfo = value);
|
PackageInfo.fromPlatform().then((value) => packageInfo = value);
|
||||||
return null;
|
return null;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
import 'package:flutter_app_badger/flutter_app_badger.dart';
|
import 'package:flutter_app_badge/flutter_app_badge.dart';
|
||||||
|
|
||||||
import '../../api/apiResponse.dart';
|
import '../../api/apiResponse.dart';
|
||||||
import '../../api/marianumcloud/talk/room/getRoomCache.dart';
|
import '../../api/marianumcloud/talk/room/getRoomCache.dart';
|
||||||
@ -20,7 +20,7 @@ class ChatListProps extends DataHolder {
|
|||||||
onUpdate: (GetRoomResponse data) => {
|
onUpdate: (GetRoomResponse data) => {
|
||||||
_getRoomResponse = data,
|
_getRoomResponse = data,
|
||||||
notifyListeners(),
|
notifyListeners(),
|
||||||
FlutterAppBadger.updateBadgeCount(data.data.map((e) => e.unreadMessages).reduce((a, b) => a+b))
|
FlutterAppBadge.count(data.data.map((e) => e.unreadMessages).reduce((a, b) => a+b))
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,7 @@ class NotificationController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static Future<void> onAppOpenedByNotification(RemoteMessage message, BuildContext context) async {
|
static Future<void> onAppOpenedByNotification(RemoteMessage message, BuildContext context) async {
|
||||||
NotificationTasks.navigateToTalk();
|
NotificationTasks.navigateToTalk(context);
|
||||||
NotificationTasks.updateProviders(context);
|
NotificationTasks.updateProviders(context);
|
||||||
|
|
||||||
DebugTile(context).run(() {
|
DebugTile(context).run(() {
|
||||||
|
@ -15,9 +15,6 @@ class NotificationService {
|
|||||||
);
|
);
|
||||||
|
|
||||||
final iosSettings = DarwinInitializationSettings(
|
final iosSettings = DarwinInitializationSettings(
|
||||||
onDidReceiveLocalNotification: (id, title, body, payload) {
|
|
||||||
// TODO Navigate to Talk section (This runs when an Notification is tapped)
|
|
||||||
},
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,15 +1,16 @@
|
|||||||
import 'package:firebase_messaging/firebase_messaging.dart';
|
import 'package:firebase_messaging/firebase_messaging.dart';
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter_app_badger/flutter_app_badger.dart';
|
import 'package:flutter_app_badge/flutter_app_badge.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
import '../main.dart';
|
import '../main.dart';
|
||||||
import '../model/chatList/chatListProps.dart';
|
import '../model/chatList/chatListProps.dart';
|
||||||
import '../model/chatList/chatProps.dart';
|
import '../model/chatList/chatProps.dart';
|
||||||
|
import '../state/app/modules/app_modules.dart';
|
||||||
|
|
||||||
class NotificationTasks {
|
class NotificationTasks {
|
||||||
static void updateBadgeCount(RemoteMessage notification) {
|
static void updateBadgeCount(RemoteMessage notification) {
|
||||||
FlutterAppBadger.updateBadgeCount(int.parse(notification.data['unreadCount'] ?? 0));
|
FlutterAppBadge.count(int.parse(notification.data['unreadCount'] ?? 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void updateProviders(BuildContext context) {
|
static void updateProviders(BuildContext context) {
|
||||||
@ -17,7 +18,9 @@ class NotificationTasks {
|
|||||||
Provider.of<ChatProps>(context, listen: false).run();
|
Provider.of<ChatProps>(context, listen: false).run();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void navigateToTalk() {
|
static void navigateToTalk(BuildContext context) {
|
||||||
Main.bottomNavigator.jumpToTab(1);
|
var talkTab = AppModule.getBottomBarModules(context).map((e) => e.module).toList().indexOf(Modules.talk);
|
||||||
|
if(talkTab == -1) return;
|
||||||
|
Main.bottomNavigator.jumpToTab(talkTab);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,9 @@ mixin _$LoadableStateState {
|
|||||||
List<ConnectivityResult>? get connections =>
|
List<ConnectivityResult>? get connections =>
|
||||||
throw _privateConstructorUsedError;
|
throw _privateConstructorUsedError;
|
||||||
|
|
||||||
@JsonKey(ignore: true)
|
/// Create a copy of LoadableStateState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
$LoadableStateStateCopyWith<LoadableStateState> get copyWith =>
|
$LoadableStateStateCopyWith<LoadableStateState> get copyWith =>
|
||||||
throw _privateConstructorUsedError;
|
throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
@ -43,6 +45,8 @@ class _$LoadableStateStateCopyWithImpl<$Res, $Val extends LoadableStateState>
|
|||||||
// ignore: unused_field
|
// ignore: unused_field
|
||||||
final $Res Function($Val) _then;
|
final $Res Function($Val) _then;
|
||||||
|
|
||||||
|
/// Create a copy of LoadableStateState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
@ -76,6 +80,8 @@ class __$$LoadableStateStateImplCopyWithImpl<$Res>
|
|||||||
$Res Function(_$LoadableStateStateImpl) _then)
|
$Res Function(_$LoadableStateStateImpl) _then)
|
||||||
: super(_value, _then);
|
: super(_value, _then);
|
||||||
|
|
||||||
|
/// Create a copy of LoadableStateState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
@ -125,7 +131,9 @@ class _$LoadableStateStateImpl implements _LoadableStateState {
|
|||||||
int get hashCode => Object.hash(
|
int get hashCode => Object.hash(
|
||||||
runtimeType, const DeepCollectionEquality().hash(_connections));
|
runtimeType, const DeepCollectionEquality().hash(_connections));
|
||||||
|
|
||||||
@JsonKey(ignore: true)
|
/// Create a copy of LoadableStateState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@override
|
@override
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
_$$LoadableStateStateImplCopyWith<_$LoadableStateStateImpl> get copyWith =>
|
_$$LoadableStateStateImplCopyWith<_$LoadableStateStateImpl> get copyWith =>
|
||||||
@ -140,8 +148,11 @@ abstract class _LoadableStateState implements LoadableStateState {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
List<ConnectivityResult>? get connections;
|
List<ConnectivityResult>? get connections;
|
||||||
|
|
||||||
|
/// Create a copy of LoadableStateState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@override
|
@override
|
||||||
@JsonKey(ignore: true)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
_$$LoadableStateStateImplCopyWith<_$LoadableStateStateImpl> get copyWith =>
|
_$$LoadableStateStateImplCopyWith<_$LoadableStateStateImpl> get copyWith =>
|
||||||
throw _privateConstructorUsedError;
|
throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,9 @@ mixin _$LoadableState<TState> {
|
|||||||
void Function()? get reFetch => throw _privateConstructorUsedError;
|
void Function()? get reFetch => throw _privateConstructorUsedError;
|
||||||
LoadingError? get error => throw _privateConstructorUsedError;
|
LoadingError? get error => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
@JsonKey(ignore: true)
|
/// Create a copy of LoadableState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
$LoadableStateCopyWith<TState, LoadableState<TState>> get copyWith =>
|
$LoadableStateCopyWith<TState, LoadableState<TState>> get copyWith =>
|
||||||
throw _privateConstructorUsedError;
|
throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
@ -54,6 +56,8 @@ class _$LoadableStateCopyWithImpl<TState, $Res,
|
|||||||
// ignore: unused_field
|
// ignore: unused_field
|
||||||
final $Res Function($Val) _then;
|
final $Res Function($Val) _then;
|
||||||
|
|
||||||
|
/// Create a copy of LoadableState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
@ -87,6 +91,8 @@ class _$LoadableStateCopyWithImpl<TState, $Res,
|
|||||||
) as $Val);
|
) as $Val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Create a copy of LoadableState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@override
|
@override
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
$LoadingErrorCopyWith<$Res>? get error {
|
$LoadingErrorCopyWith<$Res>? get error {
|
||||||
@ -128,6 +134,8 @@ class __$$LoadableStateImplCopyWithImpl<TState, $Res>
|
|||||||
$Res Function(_$LoadableStateImpl<TState>) _then)
|
$Res Function(_$LoadableStateImpl<TState>) _then)
|
||||||
: super(_value, _then);
|
: super(_value, _then);
|
||||||
|
|
||||||
|
/// Create a copy of LoadableState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
@ -166,27 +174,22 @@ class __$$LoadableStateImplCopyWithImpl<TState, $Res>
|
|||||||
|
|
||||||
class _$LoadableStateImpl<TState> extends _LoadableState<TState> {
|
class _$LoadableStateImpl<TState> extends _LoadableState<TState> {
|
||||||
const _$LoadableStateImpl(
|
const _$LoadableStateImpl(
|
||||||
{this.isLoading = true,
|
{required this.isLoading,
|
||||||
this.data = null,
|
required this.data,
|
||||||
this.lastFetch = null,
|
required this.lastFetch,
|
||||||
this.reFetch = null,
|
required this.reFetch,
|
||||||
this.error = null})
|
required this.error})
|
||||||
: super._();
|
: super._();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@JsonKey()
|
|
||||||
final bool isLoading;
|
final bool isLoading;
|
||||||
@override
|
@override
|
||||||
@JsonKey()
|
|
||||||
final TState? data;
|
final TState? data;
|
||||||
@override
|
@override
|
||||||
@JsonKey()
|
|
||||||
final int? lastFetch;
|
final int? lastFetch;
|
||||||
@override
|
@override
|
||||||
@JsonKey()
|
|
||||||
final void Function()? reFetch;
|
final void Function()? reFetch;
|
||||||
@override
|
@override
|
||||||
@JsonKey()
|
|
||||||
final LoadingError? error;
|
final LoadingError? error;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -212,7 +215,9 @@ class _$LoadableStateImpl<TState> extends _LoadableState<TState> {
|
|||||||
int get hashCode => Object.hash(runtimeType, isLoading,
|
int get hashCode => Object.hash(runtimeType, isLoading,
|
||||||
const DeepCollectionEquality().hash(data), lastFetch, reFetch, error);
|
const DeepCollectionEquality().hash(data), lastFetch, reFetch, error);
|
||||||
|
|
||||||
@JsonKey(ignore: true)
|
/// Create a copy of LoadableState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@override
|
@override
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
_$$LoadableStateImplCopyWith<TState, _$LoadableStateImpl<TState>>
|
_$$LoadableStateImplCopyWith<TState, _$LoadableStateImpl<TState>>
|
||||||
@ -222,11 +227,11 @@ class _$LoadableStateImpl<TState> extends _LoadableState<TState> {
|
|||||||
|
|
||||||
abstract class _LoadableState<TState> extends LoadableState<TState> {
|
abstract class _LoadableState<TState> extends LoadableState<TState> {
|
||||||
const factory _LoadableState(
|
const factory _LoadableState(
|
||||||
{final bool isLoading,
|
{required final bool isLoading,
|
||||||
final TState? data,
|
required final TState? data,
|
||||||
final int? lastFetch,
|
required final int? lastFetch,
|
||||||
final void Function()? reFetch,
|
required final void Function()? reFetch,
|
||||||
final LoadingError? error}) = _$LoadableStateImpl<TState>;
|
required final LoadingError? error}) = _$LoadableStateImpl<TState>;
|
||||||
const _LoadableState._() : super._();
|
const _LoadableState._() : super._();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -239,8 +244,11 @@ abstract class _LoadableState<TState> extends LoadableState<TState> {
|
|||||||
void Function()? get reFetch;
|
void Function()? get reFetch;
|
||||||
@override
|
@override
|
||||||
LoadingError? get error;
|
LoadingError? get error;
|
||||||
|
|
||||||
|
/// Create a copy of LoadableState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@override
|
@override
|
||||||
@JsonKey(ignore: true)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
_$$LoadableStateImplCopyWith<TState, _$LoadableStateImpl<TState>>
|
_$$LoadableStateImplCopyWith<TState, _$LoadableStateImpl<TState>>
|
||||||
get copyWith => throw _privateConstructorUsedError;
|
get copyWith => throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,9 @@ mixin _$LoadingError {
|
|||||||
String get message => throw _privateConstructorUsedError;
|
String get message => throw _privateConstructorUsedError;
|
||||||
bool get allowRetry => throw _privateConstructorUsedError;
|
bool get allowRetry => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
@JsonKey(ignore: true)
|
/// Create a copy of LoadingError
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
$LoadingErrorCopyWith<LoadingError> get copyWith =>
|
$LoadingErrorCopyWith<LoadingError> get copyWith =>
|
||||||
throw _privateConstructorUsedError;
|
throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
@ -43,6 +45,8 @@ class _$LoadingErrorCopyWithImpl<$Res, $Val extends LoadingError>
|
|||||||
// ignore: unused_field
|
// ignore: unused_field
|
||||||
final $Res Function($Val) _then;
|
final $Res Function($Val) _then;
|
||||||
|
|
||||||
|
/// Create a copy of LoadingError
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
@ -81,6 +85,8 @@ class __$$LoadingErrorImplCopyWithImpl<$Res>
|
|||||||
_$LoadingErrorImpl _value, $Res Function(_$LoadingErrorImpl) _then)
|
_$LoadingErrorImpl _value, $Res Function(_$LoadingErrorImpl) _then)
|
||||||
: super(_value, _then);
|
: super(_value, _then);
|
||||||
|
|
||||||
|
/// Create a copy of LoadingError
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
@ -129,7 +135,9 @@ class _$LoadingErrorImpl implements _LoadingError {
|
|||||||
@override
|
@override
|
||||||
int get hashCode => Object.hash(runtimeType, message, allowRetry);
|
int get hashCode => Object.hash(runtimeType, message, allowRetry);
|
||||||
|
|
||||||
@JsonKey(ignore: true)
|
/// Create a copy of LoadingError
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@override
|
@override
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
_$$LoadingErrorImplCopyWith<_$LoadingErrorImpl> get copyWith =>
|
_$$LoadingErrorImplCopyWith<_$LoadingErrorImpl> get copyWith =>
|
||||||
@ -145,8 +153,11 @@ abstract class _LoadingError implements LoadingError {
|
|||||||
String get message;
|
String get message;
|
||||||
@override
|
@override
|
||||||
bool get allowRetry;
|
bool get allowRetry;
|
||||||
|
|
||||||
|
/// Create a copy of LoadingError
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@override
|
@override
|
||||||
@JsonKey(ignore: true)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
_$$LoadingErrorImplCopyWith<_$LoadingErrorImpl> get copyWith =>
|
_$$LoadingErrorImplCopyWith<_$LoadingErrorImpl> get copyWith =>
|
||||||
throw _privateConstructorUsedError;
|
throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
|
21
lib/state/app/infrastructure/utilityWidgets/loadableHydratedBloc/loadable_save_context.freezed.dart
21
lib/state/app/infrastructure/utilityWidgets/loadableHydratedBloc/loadable_save_context.freezed.dart
@ -22,8 +22,12 @@ LoadableSaveContext _$LoadableSaveContextFromJson(Map<String, dynamic> json) {
|
|||||||
mixin _$LoadableSaveContext {
|
mixin _$LoadableSaveContext {
|
||||||
int get timestamp => throw _privateConstructorUsedError;
|
int get timestamp => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
|
/// Serializes this LoadableSaveContext to a JSON map.
|
||||||
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
||||||
@JsonKey(ignore: true)
|
|
||||||
|
/// Create a copy of LoadableSaveContext
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
$LoadableSaveContextCopyWith<LoadableSaveContext> get copyWith =>
|
$LoadableSaveContextCopyWith<LoadableSaveContext> get copyWith =>
|
||||||
throw _privateConstructorUsedError;
|
throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
@ -47,6 +51,8 @@ class _$LoadableSaveContextCopyWithImpl<$Res, $Val extends LoadableSaveContext>
|
|||||||
// ignore: unused_field
|
// ignore: unused_field
|
||||||
final $Res Function($Val) _then;
|
final $Res Function($Val) _then;
|
||||||
|
|
||||||
|
/// Create a copy of LoadableSaveContext
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
@ -80,6 +86,8 @@ class __$$LoadableSaveContextImplCopyWithImpl<$Res>
|
|||||||
$Res Function(_$LoadableSaveContextImpl) _then)
|
$Res Function(_$LoadableSaveContextImpl) _then)
|
||||||
: super(_value, _then);
|
: super(_value, _then);
|
||||||
|
|
||||||
|
/// Create a copy of LoadableSaveContext
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
@ -119,11 +127,13 @@ class _$LoadableSaveContextImpl extends _LoadableSaveContext {
|
|||||||
other.timestamp == timestamp));
|
other.timestamp == timestamp));
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsonKey(ignore: true)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@override
|
@override
|
||||||
int get hashCode => Object.hash(runtimeType, timestamp);
|
int get hashCode => Object.hash(runtimeType, timestamp);
|
||||||
|
|
||||||
@JsonKey(ignore: true)
|
/// Create a copy of LoadableSaveContext
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@override
|
@override
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
_$$LoadableSaveContextImplCopyWith<_$LoadableSaveContextImpl> get copyWith =>
|
_$$LoadableSaveContextImplCopyWith<_$LoadableSaveContextImpl> get copyWith =>
|
||||||
@ -148,8 +158,11 @@ abstract class _LoadableSaveContext extends LoadableSaveContext {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
int get timestamp;
|
int get timestamp;
|
||||||
|
|
||||||
|
/// Create a copy of LoadableSaveContext
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@override
|
@override
|
||||||
@JsonKey(ignore: true)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
_$$LoadableSaveContextImplCopyWith<_$LoadableSaveContextImpl> get copyWith =>
|
_$$LoadableSaveContextImplCopyWith<_$LoadableSaveContextImpl> get copyWith =>
|
||||||
throw _privateConstructorUsedError;
|
throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ part of 'loadable_save_context.dart';
|
|||||||
_$LoadableSaveContextImpl _$$LoadableSaveContextImplFromJson(
|
_$LoadableSaveContextImpl _$$LoadableSaveContextImplFromJson(
|
||||||
Map<String, dynamic> json) =>
|
Map<String, dynamic> json) =>
|
||||||
_$LoadableSaveContextImpl(
|
_$LoadableSaveContextImpl(
|
||||||
timestamp: json['timestamp'] as int,
|
timestamp: (json['timestamp'] as num).toInt(),
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$$LoadableSaveContextImplToJson(
|
Map<String, dynamic> _$$LoadableSaveContextImplToJson(
|
||||||
|
@ -1,8 +1,11 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:persistent_bottom_nav_bar_v2/persistent_bottom_nav_bar_v2.dart';
|
import 'package:persistent_bottom_nav_bar_v2/persistent_bottom_nav_bar_v2.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
import '../../../api/mhsl/breaker/getBreakers/getBreakersResponse.dart';
|
import '../../../api/mhsl/breaker/getBreakers/getBreakersResponse.dart';
|
||||||
import '../../../model/breakers/Breaker.dart';
|
import '../../../model/breakers/Breaker.dart';
|
||||||
|
import '../../../model/chatList/chatListProps.dart';
|
||||||
|
import '../../../storage/base/settingsProvider.dart';
|
||||||
import '../../../view/pages/files/files.dart';
|
import '../../../view/pages/files/files.dart';
|
||||||
import '../../../view/pages/more/roomplan/roomplan.dart';
|
import '../../../view/pages/more/roomplan/roomplan.dart';
|
||||||
import '../../../view/pages/talk/chatList.dart';
|
import '../../../view/pages/talk/chatList.dart';
|
||||||
@ -12,38 +15,115 @@ import 'gradeAverages/view/grade_averages_view.dart';
|
|||||||
import 'holidays/view/holidays_view.dart';
|
import 'holidays/view/holidays_view.dart';
|
||||||
import 'marianumMessage/view/marianum_message_list_view.dart';
|
import 'marianumMessage/view/marianum_message_list_view.dart';
|
||||||
|
|
||||||
|
import 'package:badges/badges.dart' as badges;
|
||||||
|
|
||||||
class AppModule {
|
class AppModule {
|
||||||
|
Modules module;
|
||||||
String name;
|
String name;
|
||||||
IconData icon;
|
Widget Function() icon;
|
||||||
|
BreakerArea breakerArea;
|
||||||
Widget Function() create;
|
Widget Function() create;
|
||||||
|
|
||||||
AppModule(this.name, this.icon, this.create);
|
AppModule(this.module, {required this.name, required this.icon, this.breakerArea = BreakerArea.global, required this.create});
|
||||||
|
|
||||||
static Map<Modules, AppModule> modules() => {
|
static Map<Modules, AppModule> modules(BuildContext context, { showFiltered = false }) {
|
||||||
Modules.timetable: AppModule('Vertretung', Icons.calendar_month, Timetable.new),
|
var settings = Provider.of<SettingsProvider>(context, listen: false);
|
||||||
Modules.talk: AppModule('Talk', Icons.chat, ChatList.new),
|
var available = {
|
||||||
Modules.files: AppModule('Files', Icons.folder, Files.new),
|
Modules.timetable: AppModule(
|
||||||
Modules.marianumMessage: AppModule('Marianum Message', Icons.newspaper, MarianumMessageListView.new),
|
Modules.timetable,
|
||||||
Modules.roomPlan: AppModule('Raumplan', Icons.location_pin, Roomplan.new),
|
name: 'Vertretung',
|
||||||
Modules.gradeAveragesCalculator: AppModule('Notendurschnittsrechner', Icons.calculate, GradeAveragesView.new),
|
icon: () => Icon(Icons.calendar_month),
|
||||||
Modules.holidays: AppModule('Schulferien', Icons.flight, HolidaysView.new),
|
breakerArea: BreakerArea.timetable,
|
||||||
|
create: Timetable.new,
|
||||||
|
),
|
||||||
|
Modules.talk: AppModule(
|
||||||
|
Modules.talk,
|
||||||
|
name: 'Talk',
|
||||||
|
icon: () => Consumer<ChatListProps>(
|
||||||
|
builder: (context, value, child) {
|
||||||
|
if(value.primaryLoading()) return Icon(Icons.chat);
|
||||||
|
var messages = value.getRoomsResponse.data.map((e) => e.unreadMessages).reduce((a, b) => a+b);
|
||||||
|
return badges.Badge(
|
||||||
|
showBadge: messages > 0,
|
||||||
|
position: badges.BadgePosition.topEnd(top: -3, end: -3),
|
||||||
|
stackFit: StackFit.loose,
|
||||||
|
badgeStyle: badges.BadgeStyle(
|
||||||
|
padding: const EdgeInsets.all(3),
|
||||||
|
badgeColor: Theme.of(context).primaryColor,
|
||||||
|
elevation: 1,
|
||||||
|
),
|
||||||
|
badgeContent: Text('$messages', style: const TextStyle(color: Colors.white, fontSize: 10, fontWeight: FontWeight.bold)),
|
||||||
|
child: Icon(Icons.chat),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
breakerArea: BreakerArea.talk,
|
||||||
|
create: ChatList.new,
|
||||||
|
),
|
||||||
|
Modules.files: AppModule(
|
||||||
|
Modules.files,
|
||||||
|
name: 'Dateien',
|
||||||
|
icon: () => Icon(Icons.folder),
|
||||||
|
breakerArea: BreakerArea.files,
|
||||||
|
create: Files.new,
|
||||||
|
),
|
||||||
|
Modules.marianumMessage: AppModule(
|
||||||
|
Modules.marianumMessage,
|
||||||
|
name: 'Marianum Message',
|
||||||
|
icon: () => Icon(Icons.newspaper),
|
||||||
|
breakerArea: BreakerArea.more,
|
||||||
|
create: MarianumMessageListView.new,
|
||||||
|
),
|
||||||
|
Modules.roomPlan: AppModule(
|
||||||
|
Modules.roomPlan,
|
||||||
|
name: 'Raumplan',
|
||||||
|
icon: () => Icon(Icons.location_pin),
|
||||||
|
breakerArea: BreakerArea.more,
|
||||||
|
create: Roomplan.new,
|
||||||
|
),
|
||||||
|
Modules.gradeAveragesCalculator: AppModule(
|
||||||
|
Modules.gradeAveragesCalculator,
|
||||||
|
name: 'Notendurschnittsrechner',
|
||||||
|
icon: () => Icon(Icons.calculate),
|
||||||
|
breakerArea: BreakerArea.more,
|
||||||
|
create: GradeAveragesView.new,
|
||||||
|
),
|
||||||
|
Modules.holidays: AppModule(
|
||||||
|
Modules.holidays,
|
||||||
|
name: 'Schulferien',
|
||||||
|
icon: () => Icon(Icons.flight),
|
||||||
|
breakerArea: BreakerArea.more,
|
||||||
|
create: HolidaysView.new,
|
||||||
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
static AppModule getModule(Modules module) => modules()[module]!;
|
if(!showFiltered) available.removeWhere((key, value) => settings.val().modulesSettings.hiddenModules.contains(key));
|
||||||
|
|
||||||
Widget toListTile(BuildContext context) => ListTile(
|
return { for (var element in settings.val().modulesSettings.moduleOrder.where((element) => available.containsKey(element))) element : available[element]! };
|
||||||
leading: CenteredLeading(Icon(icon)),
|
}
|
||||||
|
|
||||||
|
static List<AppModule> getBottomBarModules(BuildContext context) => modules(context).values.toList().getRange(0, 3).toList();
|
||||||
|
static List<AppModule> getOverhangModules(BuildContext context) => modules(context).values.skip(3).toList();
|
||||||
|
|
||||||
|
Widget toListTile(BuildContext context, {Key? key, bool isReorder = false, Function()? onVisibleChange, bool isVisible = true}) => ListTile(
|
||||||
|
key: key,
|
||||||
|
leading: CenteredLeading(icon()),
|
||||||
title: Text(name),
|
title: Text(name),
|
||||||
onTap: () => pushScreen(context, withNavBar: false, screen: create()),
|
onTap: isReorder ? null : () => pushScreen(context, withNavBar: false, screen: create()),
|
||||||
trailing: const Icon(Icons.arrow_right),
|
trailing: isReorder
|
||||||
|
? Row(mainAxisSize: MainAxisSize.min, children: [
|
||||||
|
IconButton(onPressed: onVisibleChange, icon: Icon(isVisible ? Icons.visibility_outlined : Icons.visibility_off_outlined)),
|
||||||
|
Icon(Icons.drag_handle_outlined)
|
||||||
|
])
|
||||||
|
: const Icon(Icons.arrow_right),
|
||||||
);
|
);
|
||||||
|
|
||||||
PersistentTabConfig toBottomTab(BuildContext context, {Widget Function(IconData icon)? itemBuilder}) => PersistentTabConfig(
|
PersistentTabConfig toBottomTab(BuildContext context, {Widget Function(IconData icon)? iconBuilder}) => PersistentTabConfig(
|
||||||
screen: Breaker(breaker: BreakerArea.global, child: create()),
|
screen: Breaker(breaker: breakerArea, child: create()),
|
||||||
item: ItemConfig(
|
item: ItemConfig(
|
||||||
activeForegroundColor: Theme.of(context).primaryColor,
|
activeForegroundColor: Theme.of(context).primaryColor,
|
||||||
inactiveForegroundColor: Theme.of(context).colorScheme.secondary,
|
inactiveForegroundColor: Theme.of(context).colorScheme.secondary,
|
||||||
icon: itemBuilder == null ? Icon(icon) : itemBuilder(icon),
|
icon: icon(),
|
||||||
title: name
|
title: name
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -24,8 +24,12 @@ mixin _$GradeAveragesState {
|
|||||||
throw _privateConstructorUsedError;
|
throw _privateConstructorUsedError;
|
||||||
List<int> get grades => throw _privateConstructorUsedError;
|
List<int> get grades => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
|
/// Serializes this GradeAveragesState to a JSON map.
|
||||||
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
||||||
@JsonKey(ignore: true)
|
|
||||||
|
/// Create a copy of GradeAveragesState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
$GradeAveragesStateCopyWith<GradeAveragesState> get copyWith =>
|
$GradeAveragesStateCopyWith<GradeAveragesState> get copyWith =>
|
||||||
throw _privateConstructorUsedError;
|
throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
@ -49,6 +53,8 @@ class _$GradeAveragesStateCopyWithImpl<$Res, $Val extends GradeAveragesState>
|
|||||||
// ignore: unused_field
|
// ignore: unused_field
|
||||||
final $Res Function($Val) _then;
|
final $Res Function($Val) _then;
|
||||||
|
|
||||||
|
/// Create a copy of GradeAveragesState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
@ -87,6 +93,8 @@ class __$$GradeAveragesStateImplCopyWithImpl<$Res>
|
|||||||
$Res Function(_$GradeAveragesStateImpl) _then)
|
$Res Function(_$GradeAveragesStateImpl) _then)
|
||||||
: super(_value, _then);
|
: super(_value, _then);
|
||||||
|
|
||||||
|
/// Create a copy of GradeAveragesState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
@ -141,12 +149,14 @@ class _$GradeAveragesStateImpl implements _GradeAveragesState {
|
|||||||
const DeepCollectionEquality().equals(other._grades, _grades));
|
const DeepCollectionEquality().equals(other._grades, _grades));
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsonKey(ignore: true)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@override
|
@override
|
||||||
int get hashCode => Object.hash(
|
int get hashCode => Object.hash(
|
||||||
runtimeType, gradingSystem, const DeepCollectionEquality().hash(_grades));
|
runtimeType, gradingSystem, const DeepCollectionEquality().hash(_grades));
|
||||||
|
|
||||||
@JsonKey(ignore: true)
|
/// Create a copy of GradeAveragesState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@override
|
@override
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
_$$GradeAveragesStateImplCopyWith<_$GradeAveragesStateImpl> get copyWith =>
|
_$$GradeAveragesStateImplCopyWith<_$GradeAveragesStateImpl> get copyWith =>
|
||||||
@ -173,8 +183,11 @@ abstract class _GradeAveragesState implements GradeAveragesState {
|
|||||||
GradeAveragesGradingSystem get gradingSystem;
|
GradeAveragesGradingSystem get gradingSystem;
|
||||||
@override
|
@override
|
||||||
List<int> get grades;
|
List<int> get grades;
|
||||||
|
|
||||||
|
/// Create a copy of GradeAveragesState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@override
|
@override
|
||||||
@JsonKey(ignore: true)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
_$$GradeAveragesStateImplCopyWith<_$GradeAveragesStateImpl> get copyWith =>
|
_$$GradeAveragesStateImplCopyWith<_$GradeAveragesStateImpl> get copyWith =>
|
||||||
throw _privateConstructorUsedError;
|
throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,9 @@ _$GradeAveragesStateImpl _$$GradeAveragesStateImplFromJson(
|
|||||||
_$GradeAveragesStateImpl(
|
_$GradeAveragesStateImpl(
|
||||||
gradingSystem: $enumDecode(
|
gradingSystem: $enumDecode(
|
||||||
_$GradeAveragesGradingSystemEnumMap, json['gradingSystem']),
|
_$GradeAveragesGradingSystemEnumMap, json['gradingSystem']),
|
||||||
grades: (json['grades'] as List<dynamic>).map((e) => e as int).toList(),
|
grades: (json['grades'] as List<dynamic>)
|
||||||
|
.map((e) => (e as num).toInt())
|
||||||
|
.toList(),
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$$GradeAveragesStateImplToJson(
|
Map<String, dynamic> _$$GradeAveragesStateImplToJson(
|
||||||
|
@ -24,8 +24,12 @@ mixin _$HolidaysState {
|
|||||||
bool get showDisclaimer => throw _privateConstructorUsedError;
|
bool get showDisclaimer => throw _privateConstructorUsedError;
|
||||||
List<Holiday> get holidays => throw _privateConstructorUsedError;
|
List<Holiday> get holidays => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
|
/// Serializes this HolidaysState to a JSON map.
|
||||||
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
||||||
@JsonKey(ignore: true)
|
|
||||||
|
/// Create a copy of HolidaysState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
$HolidaysStateCopyWith<HolidaysState> get copyWith =>
|
$HolidaysStateCopyWith<HolidaysState> get copyWith =>
|
||||||
throw _privateConstructorUsedError;
|
throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
@ -50,6 +54,8 @@ class _$HolidaysStateCopyWithImpl<$Res, $Val extends HolidaysState>
|
|||||||
// ignore: unused_field
|
// ignore: unused_field
|
||||||
final $Res Function($Val) _then;
|
final $Res Function($Val) _then;
|
||||||
|
|
||||||
|
/// Create a copy of HolidaysState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
@ -94,6 +100,8 @@ class __$$HolidaysStateImplCopyWithImpl<$Res>
|
|||||||
_$HolidaysStateImpl _value, $Res Function(_$HolidaysStateImpl) _then)
|
_$HolidaysStateImpl _value, $Res Function(_$HolidaysStateImpl) _then)
|
||||||
: super(_value, _then);
|
: super(_value, _then);
|
||||||
|
|
||||||
|
/// Create a copy of HolidaysState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
@ -171,12 +179,14 @@ class _$HolidaysStateImpl
|
|||||||
const DeepCollectionEquality().equals(other._holidays, _holidays));
|
const DeepCollectionEquality().equals(other._holidays, _holidays));
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsonKey(ignore: true)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@override
|
@override
|
||||||
int get hashCode => Object.hash(runtimeType, showPastHolidays, showDisclaimer,
|
int get hashCode => Object.hash(runtimeType, showPastHolidays, showDisclaimer,
|
||||||
const DeepCollectionEquality().hash(_holidays));
|
const DeepCollectionEquality().hash(_holidays));
|
||||||
|
|
||||||
@JsonKey(ignore: true)
|
/// Create a copy of HolidaysState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@override
|
@override
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
_$$HolidaysStateImplCopyWith<_$HolidaysStateImpl> get copyWith =>
|
_$$HolidaysStateImplCopyWith<_$HolidaysStateImpl> get copyWith =>
|
||||||
@ -205,8 +215,11 @@ abstract class _HolidaysState implements HolidaysState {
|
|||||||
bool get showDisclaimer;
|
bool get showDisclaimer;
|
||||||
@override
|
@override
|
||||||
List<Holiday> get holidays;
|
List<Holiday> get holidays;
|
||||||
|
|
||||||
|
/// Create a copy of HolidaysState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@override
|
@override
|
||||||
@JsonKey(ignore: true)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
_$$HolidaysStateImplCopyWith<_$HolidaysStateImpl> get copyWith =>
|
_$$HolidaysStateImplCopyWith<_$HolidaysStateImpl> get copyWith =>
|
||||||
throw _privateConstructorUsedError;
|
throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
@ -224,8 +237,12 @@ mixin _$Holiday {
|
|||||||
String get name => throw _privateConstructorUsedError;
|
String get name => throw _privateConstructorUsedError;
|
||||||
String get slug => throw _privateConstructorUsedError;
|
String get slug => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
|
/// Serializes this Holiday to a JSON map.
|
||||||
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
||||||
@JsonKey(ignore: true)
|
|
||||||
|
/// Create a copy of Holiday
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
$HolidayCopyWith<Holiday> get copyWith => throw _privateConstructorUsedError;
|
$HolidayCopyWith<Holiday> get copyWith => throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -253,6 +270,8 @@ class _$HolidayCopyWithImpl<$Res, $Val extends Holiday>
|
|||||||
// ignore: unused_field
|
// ignore: unused_field
|
||||||
final $Res Function($Val) _then;
|
final $Res Function($Val) _then;
|
||||||
|
|
||||||
|
/// Create a copy of Holiday
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
@ -316,6 +335,8 @@ class __$$HolidayImplCopyWithImpl<$Res>
|
|||||||
_$HolidayImpl _value, $Res Function(_$HolidayImpl) _then)
|
_$HolidayImpl _value, $Res Function(_$HolidayImpl) _then)
|
||||||
: super(_value, _then);
|
: super(_value, _then);
|
||||||
|
|
||||||
|
/// Create a copy of Holiday
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
@ -414,12 +435,14 @@ class _$HolidayImpl with DiagnosticableTreeMixin implements _Holiday {
|
|||||||
(identical(other.slug, slug) || other.slug == slug));
|
(identical(other.slug, slug) || other.slug == slug));
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsonKey(ignore: true)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@override
|
@override
|
||||||
int get hashCode =>
|
int get hashCode =>
|
||||||
Object.hash(runtimeType, start, end, year, stateCode, name, slug);
|
Object.hash(runtimeType, start, end, year, stateCode, name, slug);
|
||||||
|
|
||||||
@JsonKey(ignore: true)
|
/// Create a copy of Holiday
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@override
|
@override
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
_$$HolidayImplCopyWith<_$HolidayImpl> get copyWith =>
|
_$$HolidayImplCopyWith<_$HolidayImpl> get copyWith =>
|
||||||
@ -456,8 +479,11 @@ abstract class _Holiday implements Holiday {
|
|||||||
String get name;
|
String get name;
|
||||||
@override
|
@override
|
||||||
String get slug;
|
String get slug;
|
||||||
|
|
||||||
|
/// Create a copy of Holiday
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@override
|
@override
|
||||||
@JsonKey(ignore: true)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
_$$HolidayImplCopyWith<_$HolidayImpl> get copyWith =>
|
_$$HolidayImplCopyWith<_$HolidayImpl> get copyWith =>
|
||||||
throw _privateConstructorUsedError;
|
throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@ _$HolidayImpl _$$HolidayImplFromJson(Map<String, dynamic> json) =>
|
|||||||
_$HolidayImpl(
|
_$HolidayImpl(
|
||||||
start: json['start'] as String,
|
start: json['start'] as String,
|
||||||
end: json['end'] as String,
|
end: json['end'] as String,
|
||||||
year: json['year'] as int,
|
year: (json['year'] as num).toInt(),
|
||||||
stateCode: json['stateCode'] as String,
|
stateCode: json['stateCode'] as String,
|
||||||
name: json['name'] as String,
|
name: json['name'] as String,
|
||||||
slug: json['slug'] as String,
|
slug: json['slug'] as String,
|
||||||
|
@ -22,8 +22,12 @@ MarianumMessageState _$MarianumMessageStateFromJson(Map<String, dynamic> json) {
|
|||||||
mixin _$MarianumMessageState {
|
mixin _$MarianumMessageState {
|
||||||
MarianumMessageList get messageList => throw _privateConstructorUsedError;
|
MarianumMessageList get messageList => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
|
/// Serializes this MarianumMessageState to a JSON map.
|
||||||
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
||||||
@JsonKey(ignore: true)
|
|
||||||
|
/// Create a copy of MarianumMessageState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
$MarianumMessageStateCopyWith<MarianumMessageState> get copyWith =>
|
$MarianumMessageStateCopyWith<MarianumMessageState> get copyWith =>
|
||||||
throw _privateConstructorUsedError;
|
throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
@ -50,6 +54,8 @@ class _$MarianumMessageStateCopyWithImpl<$Res,
|
|||||||
// ignore: unused_field
|
// ignore: unused_field
|
||||||
final $Res Function($Val) _then;
|
final $Res Function($Val) _then;
|
||||||
|
|
||||||
|
/// Create a copy of MarianumMessageState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
@ -63,6 +69,8 @@ class _$MarianumMessageStateCopyWithImpl<$Res,
|
|||||||
) as $Val);
|
) as $Val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Create a copy of MarianumMessageState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@override
|
@override
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
$MarianumMessageListCopyWith<$Res> get messageList {
|
$MarianumMessageListCopyWith<$Res> get messageList {
|
||||||
@ -94,6 +102,8 @@ class __$$MarianumMessageStateImplCopyWithImpl<$Res>
|
|||||||
$Res Function(_$MarianumMessageStateImpl) _then)
|
$Res Function(_$MarianumMessageStateImpl) _then)
|
||||||
: super(_value, _then);
|
: super(_value, _then);
|
||||||
|
|
||||||
|
/// Create a copy of MarianumMessageState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
@ -133,11 +143,13 @@ class _$MarianumMessageStateImpl implements _MarianumMessageState {
|
|||||||
other.messageList == messageList));
|
other.messageList == messageList));
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsonKey(ignore: true)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@override
|
@override
|
||||||
int get hashCode => Object.hash(runtimeType, messageList);
|
int get hashCode => Object.hash(runtimeType, messageList);
|
||||||
|
|
||||||
@JsonKey(ignore: true)
|
/// Create a copy of MarianumMessageState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@override
|
@override
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
_$$MarianumMessageStateImplCopyWith<_$MarianumMessageStateImpl>
|
_$$MarianumMessageStateImplCopyWith<_$MarianumMessageStateImpl>
|
||||||
@ -163,8 +175,11 @@ abstract class _MarianumMessageState implements MarianumMessageState {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
MarianumMessageList get messageList;
|
MarianumMessageList get messageList;
|
||||||
|
|
||||||
|
/// Create a copy of MarianumMessageState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@override
|
@override
|
||||||
@JsonKey(ignore: true)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
_$$MarianumMessageStateImplCopyWith<_$MarianumMessageStateImpl>
|
_$$MarianumMessageStateImplCopyWith<_$MarianumMessageStateImpl>
|
||||||
get copyWith => throw _privateConstructorUsedError;
|
get copyWith => throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
@ -178,8 +193,12 @@ mixin _$MarianumMessageList {
|
|||||||
String get base => throw _privateConstructorUsedError;
|
String get base => throw _privateConstructorUsedError;
|
||||||
List<MarianumMessage> get messages => throw _privateConstructorUsedError;
|
List<MarianumMessage> get messages => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
|
/// Serializes this MarianumMessageList to a JSON map.
|
||||||
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
||||||
@JsonKey(ignore: true)
|
|
||||||
|
/// Create a copy of MarianumMessageList
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
$MarianumMessageListCopyWith<MarianumMessageList> get copyWith =>
|
$MarianumMessageListCopyWith<MarianumMessageList> get copyWith =>
|
||||||
throw _privateConstructorUsedError;
|
throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
@ -203,6 +222,8 @@ class _$MarianumMessageListCopyWithImpl<$Res, $Val extends MarianumMessageList>
|
|||||||
// ignore: unused_field
|
// ignore: unused_field
|
||||||
final $Res Function($Val) _then;
|
final $Res Function($Val) _then;
|
||||||
|
|
||||||
|
/// Create a copy of MarianumMessageList
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
@ -241,6 +262,8 @@ class __$$MarianumMessageListImplCopyWithImpl<$Res>
|
|||||||
$Res Function(_$MarianumMessageListImpl) _then)
|
$Res Function(_$MarianumMessageListImpl) _then)
|
||||||
: super(_value, _then);
|
: super(_value, _then);
|
||||||
|
|
||||||
|
/// Create a copy of MarianumMessageList
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
@ -294,12 +317,14 @@ class _$MarianumMessageListImpl implements _MarianumMessageList {
|
|||||||
const DeepCollectionEquality().equals(other._messages, _messages));
|
const DeepCollectionEquality().equals(other._messages, _messages));
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsonKey(ignore: true)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@override
|
@override
|
||||||
int get hashCode => Object.hash(
|
int get hashCode => Object.hash(
|
||||||
runtimeType, base, const DeepCollectionEquality().hash(_messages));
|
runtimeType, base, const DeepCollectionEquality().hash(_messages));
|
||||||
|
|
||||||
@JsonKey(ignore: true)
|
/// Create a copy of MarianumMessageList
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@override
|
@override
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
_$$MarianumMessageListImplCopyWith<_$MarianumMessageListImpl> get copyWith =>
|
_$$MarianumMessageListImplCopyWith<_$MarianumMessageListImpl> get copyWith =>
|
||||||
@ -327,8 +352,11 @@ abstract class _MarianumMessageList implements MarianumMessageList {
|
|||||||
String get base;
|
String get base;
|
||||||
@override
|
@override
|
||||||
List<MarianumMessage> get messages;
|
List<MarianumMessage> get messages;
|
||||||
|
|
||||||
|
/// Create a copy of MarianumMessageList
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@override
|
@override
|
||||||
@JsonKey(ignore: true)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
_$$MarianumMessageListImplCopyWith<_$MarianumMessageListImpl> get copyWith =>
|
_$$MarianumMessageListImplCopyWith<_$MarianumMessageListImpl> get copyWith =>
|
||||||
throw _privateConstructorUsedError;
|
throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
@ -343,8 +371,12 @@ mixin _$MarianumMessage {
|
|||||||
String get date => throw _privateConstructorUsedError;
|
String get date => throw _privateConstructorUsedError;
|
||||||
String get url => throw _privateConstructorUsedError;
|
String get url => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
|
/// Serializes this MarianumMessage to a JSON map.
|
||||||
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
||||||
@JsonKey(ignore: true)
|
|
||||||
|
/// Create a copy of MarianumMessage
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
$MarianumMessageCopyWith<MarianumMessage> get copyWith =>
|
$MarianumMessageCopyWith<MarianumMessage> get copyWith =>
|
||||||
throw _privateConstructorUsedError;
|
throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
@ -368,6 +400,8 @@ class _$MarianumMessageCopyWithImpl<$Res, $Val extends MarianumMessage>
|
|||||||
// ignore: unused_field
|
// ignore: unused_field
|
||||||
final $Res Function($Val) _then;
|
final $Res Function($Val) _then;
|
||||||
|
|
||||||
|
/// Create a copy of MarianumMessage
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
@ -411,6 +445,8 @@ class __$$MarianumMessageImplCopyWithImpl<$Res>
|
|||||||
_$MarianumMessageImpl _value, $Res Function(_$MarianumMessageImpl) _then)
|
_$MarianumMessageImpl _value, $Res Function(_$MarianumMessageImpl) _then)
|
||||||
: super(_value, _then);
|
: super(_value, _then);
|
||||||
|
|
||||||
|
/// Create a copy of MarianumMessage
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
@ -466,11 +502,13 @@ class _$MarianumMessageImpl implements _MarianumMessage {
|
|||||||
(identical(other.url, url) || other.url == url));
|
(identical(other.url, url) || other.url == url));
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsonKey(ignore: true)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@override
|
@override
|
||||||
int get hashCode => Object.hash(runtimeType, name, date, url);
|
int get hashCode => Object.hash(runtimeType, name, date, url);
|
||||||
|
|
||||||
@JsonKey(ignore: true)
|
/// Create a copy of MarianumMessage
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@override
|
@override
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
_$$MarianumMessageImplCopyWith<_$MarianumMessageImpl> get copyWith =>
|
_$$MarianumMessageImplCopyWith<_$MarianumMessageImpl> get copyWith =>
|
||||||
@ -500,8 +538,11 @@ abstract class _MarianumMessage implements MarianumMessage {
|
|||||||
String get date;
|
String get date;
|
||||||
@override
|
@override
|
||||||
String get url;
|
String get url;
|
||||||
|
|
||||||
|
/// Create a copy of MarianumMessage
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@override
|
@override
|
||||||
@JsonKey(ignore: true)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
_$$MarianumMessageImplCopyWith<_$MarianumMessageImpl> get copyWith =>
|
_$$MarianumMessageImplCopyWith<_$MarianumMessageImpl> get copyWith =>
|
||||||
throw _privateConstructorUsedError;
|
throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ import 'package:json_annotation/json_annotation.dart';
|
|||||||
import '../devTools/devToolsSettings.dart';
|
import '../devTools/devToolsSettings.dart';
|
||||||
import '../file/fileSettings.dart';
|
import '../file/fileSettings.dart';
|
||||||
import '../fileView/fileViewSettings.dart';
|
import '../fileView/fileViewSettings.dart';
|
||||||
|
import '../general/modulesSettings.dart';
|
||||||
import '../holidays/holidaysSettings.dart';
|
import '../holidays/holidaysSettings.dart';
|
||||||
import '../notification/notificationSettings.dart';
|
import '../notification/notificationSettings.dart';
|
||||||
import '../talk/talkSettings.dart';
|
import '../talk/talkSettings.dart';
|
||||||
@ -20,6 +21,7 @@ class Settings {
|
|||||||
ThemeMode appTheme;
|
ThemeMode appTheme;
|
||||||
bool devToolsEnabled;
|
bool devToolsEnabled;
|
||||||
|
|
||||||
|
ModulesSettings modulesSettings;
|
||||||
TimetableSettings timetableSettings;
|
TimetableSettings timetableSettings;
|
||||||
TalkSettings talkSettings;
|
TalkSettings talkSettings;
|
||||||
FileSettings fileSettings;
|
FileSettings fileSettings;
|
||||||
@ -31,6 +33,7 @@ class Settings {
|
|||||||
Settings({
|
Settings({
|
||||||
required this.appTheme,
|
required this.appTheme,
|
||||||
required this.devToolsEnabled,
|
required this.devToolsEnabled,
|
||||||
|
required this.modulesSettings,
|
||||||
required this.timetableSettings,
|
required this.timetableSettings,
|
||||||
required this.talkSettings,
|
required this.talkSettings,
|
||||||
required this.fileSettings,
|
required this.fileSettings,
|
||||||
|
@ -9,6 +9,8 @@ part of 'settings.dart';
|
|||||||
Settings _$SettingsFromJson(Map<String, dynamic> json) => Settings(
|
Settings _$SettingsFromJson(Map<String, dynamic> json) => Settings(
|
||||||
appTheme: Settings._themeFromJson(json['appTheme'] as String),
|
appTheme: Settings._themeFromJson(json['appTheme'] as String),
|
||||||
devToolsEnabled: json['devToolsEnabled'] as bool,
|
devToolsEnabled: json['devToolsEnabled'] as bool,
|
||||||
|
modulesSettings: ModulesSettings.fromJson(
|
||||||
|
json['modulesSettings'] as Map<String, dynamic>),
|
||||||
timetableSettings: TimetableSettings.fromJson(
|
timetableSettings: TimetableSettings.fromJson(
|
||||||
json['timetableSettings'] as Map<String, dynamic>),
|
json['timetableSettings'] as Map<String, dynamic>),
|
||||||
talkSettings:
|
talkSettings:
|
||||||
@ -28,6 +30,7 @@ Settings _$SettingsFromJson(Map<String, dynamic> json) => Settings(
|
|||||||
Map<String, dynamic> _$SettingsToJson(Settings instance) => <String, dynamic>{
|
Map<String, dynamic> _$SettingsToJson(Settings instance) => <String, dynamic>{
|
||||||
'appTheme': Settings._themeToJson(instance.appTheme),
|
'appTheme': Settings._themeToJson(instance.appTheme),
|
||||||
'devToolsEnabled': instance.devToolsEnabled,
|
'devToolsEnabled': instance.devToolsEnabled,
|
||||||
|
'modulesSettings': instance.modulesSettings.toJson(),
|
||||||
'timetableSettings': instance.timetableSettings.toJson(),
|
'timetableSettings': instance.timetableSettings.toJson(),
|
||||||
'talkSettings': instance.talkSettings.toJson(),
|
'talkSettings': instance.talkSettings.toJson(),
|
||||||
'fileSettings': instance.fileSettings.toJson(),
|
'fileSettings': instance.fileSettings.toJson(),
|
||||||
|
19
lib/storage/general/modulesSettings.dart
Normal file
19
lib/storage/general/modulesSettings.dart
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||||
|
|
||||||
|
import '../../state/app/modules/app_modules.dart';
|
||||||
|
|
||||||
|
part 'modulesSettings.g.dart';
|
||||||
|
|
||||||
|
@JsonSerializable()
|
||||||
|
class ModulesSettings {
|
||||||
|
List<Modules> moduleOrder;
|
||||||
|
List<Modules> hiddenModules;
|
||||||
|
|
||||||
|
ModulesSettings({
|
||||||
|
required this.moduleOrder,
|
||||||
|
required this.hiddenModules
|
||||||
|
});
|
||||||
|
|
||||||
|
factory ModulesSettings.fromJson(Map<String, dynamic> json) => _$ModulesSettingsFromJson(json);
|
||||||
|
Map<String, dynamic> toJson() => _$ModulesSettingsToJson(this);
|
||||||
|
}
|
35
lib/storage/general/modulesSettings.g.dart
Normal file
35
lib/storage/general/modulesSettings.g.dart
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
part of 'modulesSettings.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// JsonSerializableGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
ModulesSettings _$ModulesSettingsFromJson(Map<String, dynamic> json) =>
|
||||||
|
ModulesSettings(
|
||||||
|
moduleOrder: (json['moduleOrder'] as List<dynamic>)
|
||||||
|
.map((e) => $enumDecode(_$ModulesEnumMap, e))
|
||||||
|
.toList(),
|
||||||
|
hiddenModules: (json['hiddenModules'] as List<dynamic>)
|
||||||
|
.map((e) => $enumDecode(_$ModulesEnumMap, e))
|
||||||
|
.toList(),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$ModulesSettingsToJson(ModulesSettings instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'moduleOrder':
|
||||||
|
instance.moduleOrder.map((e) => _$ModulesEnumMap[e]!).toList(),
|
||||||
|
'hiddenModules':
|
||||||
|
instance.hiddenModules.map((e) => _$ModulesEnumMap[e]!).toList(),
|
||||||
|
};
|
||||||
|
|
||||||
|
const _$ModulesEnumMap = {
|
||||||
|
Modules.timetable: 'timetable',
|
||||||
|
Modules.talk: 'talk',
|
||||||
|
Modules.files: 'files',
|
||||||
|
Modules.marianumMessage: 'marianumMessage',
|
||||||
|
Modules.roomPlan: 'roomPlan',
|
||||||
|
Modules.gradeAveragesCalculator: 'gradeAveragesCalculator',
|
||||||
|
Modules.holidays: 'holidays',
|
||||||
|
};
|
@ -1,12 +1,18 @@
|
|||||||
import 'package:json_annotation/json_annotation.dart';
|
import 'package:json_annotation/json_annotation.dart';
|
||||||
|
|
||||||
|
import '../../view/pages/timetable/timetableNameMode.dart';
|
||||||
|
|
||||||
part 'timetableSettings.g.dart';
|
part 'timetableSettings.g.dart';
|
||||||
|
|
||||||
@JsonSerializable()
|
@JsonSerializable()
|
||||||
class TimetableSettings {
|
class TimetableSettings {
|
||||||
bool connectDoubleLessons;
|
bool connectDoubleLessons;
|
||||||
|
TimetableNameMode timetableNameMode;
|
||||||
|
|
||||||
TimetableSettings({required this.connectDoubleLessons});
|
TimetableSettings({
|
||||||
|
required this.connectDoubleLessons,
|
||||||
|
required this.timetableNameMode
|
||||||
|
});
|
||||||
|
|
||||||
factory TimetableSettings.fromJson(Map<String, dynamic> json) => _$TimetableSettingsFromJson(json);
|
factory TimetableSettings.fromJson(Map<String, dynamic> json) => _$TimetableSettingsFromJson(json);
|
||||||
Map<String, dynamic> toJson() => _$TimetableSettingsToJson(this);
|
Map<String, dynamic> toJson() => _$TimetableSettingsToJson(this);
|
||||||
|
@ -9,9 +9,19 @@ part of 'timetableSettings.dart';
|
|||||||
TimetableSettings _$TimetableSettingsFromJson(Map<String, dynamic> json) =>
|
TimetableSettings _$TimetableSettingsFromJson(Map<String, dynamic> json) =>
|
||||||
TimetableSettings(
|
TimetableSettings(
|
||||||
connectDoubleLessons: json['connectDoubleLessons'] as bool,
|
connectDoubleLessons: json['connectDoubleLessons'] as bool,
|
||||||
|
timetableNameMode:
|
||||||
|
$enumDecode(_$TimetableNameModeEnumMap, json['timetableNameMode']),
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$TimetableSettingsToJson(TimetableSettings instance) =>
|
Map<String, dynamic> _$TimetableSettingsToJson(TimetableSettings instance) =>
|
||||||
<String, dynamic>{
|
<String, dynamic>{
|
||||||
'connectDoubleLessons': instance.connectDoubleLessons,
|
'connectDoubleLessons': instance.connectDoubleLessons,
|
||||||
|
'timetableNameMode':
|
||||||
|
_$TimetableNameModeEnumMap[instance.timetableNameMode]!,
|
||||||
|
};
|
||||||
|
|
||||||
|
const _$TimetableNameModeEnumMap = {
|
||||||
|
TimetableNameMode.name: 'name',
|
||||||
|
TimetableNameMode.longName: 'longName',
|
||||||
|
TimetableNameMode.alternateName: 'alternateName',
|
||||||
};
|
};
|
||||||
|
@ -1,26 +1,21 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
import '../widget/dropdownDisplay.dart';
|
||||||
|
|
||||||
class AppTheme {
|
class AppTheme {
|
||||||
static ThemeModeDisplay getDisplayOptions(ThemeMode theme) {
|
static DropdownDisplay getDisplayOptions(ThemeMode theme) {
|
||||||
switch(theme) {
|
switch(theme) {
|
||||||
case ThemeMode.system:
|
case ThemeMode.system:
|
||||||
return ThemeModeDisplay(icon: Icons.auto_fix_high_outlined, displayName: 'Systemvorgabe');
|
return DropdownDisplay(icon: Icons.auto_fix_high_outlined, displayName: 'Systemvorgabe');
|
||||||
|
|
||||||
case ThemeMode.light:
|
case ThemeMode.light:
|
||||||
return ThemeModeDisplay(icon: Icons.wb_sunny_outlined, displayName: 'Hell');
|
return DropdownDisplay(icon: Icons.wb_sunny_outlined, displayName: 'Hell');
|
||||||
|
|
||||||
case ThemeMode.dark:
|
case ThemeMode.dark:
|
||||||
return ThemeModeDisplay(icon: Icons.dark_mode_outlined, displayName: 'Dunkel');
|
return DropdownDisplay(icon: Icons.dark_mode_outlined, displayName: 'Dunkel');
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool isDarkMode(BuildContext context) => Theme.of(context).brightness == Brightness.dark;
|
static bool isDarkMode(BuildContext context) => Theme.of(context).brightness == Brightness.dark;
|
||||||
}
|
}
|
||||||
|
|
||||||
class ThemeModeDisplay {
|
|
||||||
final IconData icon;
|
|
||||||
final String displayName;
|
|
||||||
|
|
||||||
ThemeModeDisplay({required this.icon, required this.displayName});
|
|
||||||
}
|
|
||||||
|
@ -5,7 +5,7 @@ import 'dart:typed_data';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:image_picker/image_picker.dart';
|
import 'package:image_picker/image_picker.dart';
|
||||||
import 'package:loader_overlay/loader_overlay.dart';
|
import 'package:loader_overlay/loader_overlay.dart';
|
||||||
import 'package:package_info/package_info.dart';
|
import 'package:package_info_plus/package_info_plus.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:badges/badges.dart' as badges;
|
import 'package:badges/badges.dart' as badges;
|
||||||
|
|
||||||
@ -70,7 +70,7 @@ class _FeedbackDialogState extends State<FeedbackDialog> {
|
|||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
border: const OutlineInputBorder(),
|
border: const OutlineInputBorder(),
|
||||||
label: const Text('Feedback und Verbesserungen'),
|
label: const Text('Feedback und Verbesserungen'),
|
||||||
errorText: _textFieldEmpty ? 'Bitte gib eine Beschreibung an???' : null,
|
errorText: _textFieldEmpty ? 'Bitte gib eine Beschreibung an!' : null,
|
||||||
),
|
),
|
||||||
minLines: 4,
|
minLines: 4,
|
||||||
maxLines: 7,
|
maxLines: 7,
|
||||||
|
@ -3,33 +3,82 @@ import 'dart:io';
|
|||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:in_app_review/in_app_review.dart';
|
import 'package:in_app_review/in_app_review.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
import '../../extensions/renderNotNull.dart';
|
import '../../extensions/renderNotNull.dart';
|
||||||
import 'package:persistent_bottom_nav_bar_v2/persistent_bottom_nav_bar_v2.dart';
|
import 'package:persistent_bottom_nav_bar_v2/persistent_bottom_nav_bar_v2.dart';
|
||||||
|
|
||||||
import '../../state/app/modules/app_modules.dart';
|
import '../../state/app/modules/app_modules.dart';
|
||||||
|
import '../../storage/base/settingsProvider.dart';
|
||||||
import '../../widget/centeredLeading.dart';
|
import '../../widget/centeredLeading.dart';
|
||||||
import '../../widget/infoDialog.dart';
|
import '../../widget/infoDialog.dart';
|
||||||
|
import '../settings/defaultSettings.dart';
|
||||||
import '../settings/settings.dart';
|
import '../settings/settings.dart';
|
||||||
import 'more/feedback/feedbackDialog.dart';
|
import 'more/feedback/feedbackDialog.dart';
|
||||||
import 'more/share/selectShareTypeDialog.dart';
|
import 'more/share/selectShareTypeDialog.dart';
|
||||||
|
|
||||||
class Overhang extends StatelessWidget {
|
class Overhang extends StatefulWidget {
|
||||||
const Overhang({super.key});
|
const Overhang({super.key});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) => Scaffold(
|
State<Overhang> createState() => _OverhangState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _OverhangState extends State<Overhang> {
|
||||||
|
bool editMode = false;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) => Consumer<SettingsProvider>(builder: (context, settings, child) => Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: const Text('Mehr'),
|
title: const Text('Mehr'),
|
||||||
actions: [
|
actions: [
|
||||||
IconButton(onPressed: () => pushScreen(context, screen: const Settings(), withNavBar: false), icon: const Icon(Icons.settings))
|
if(editMode) IconButton(
|
||||||
|
onPressed: settings.val().modulesSettings.toJson().toString() != DefaultSettings.get().modulesSettings.toJson().toString()
|
||||||
|
? () => settings.val(write: true).modulesSettings = DefaultSettings.get().modulesSettings
|
||||||
|
: null,
|
||||||
|
icon: Icon(Icons.undo_outlined)
|
||||||
|
),
|
||||||
|
IconButton(onPressed: () => setState(() => editMode = !editMode), icon: Icon(Icons.edit_note_outlined), color: editMode ? Theme.of(context).primaryColor : null),
|
||||||
|
IconButton(onPressed: editMode ? null : () => pushScreen(context, screen: const Settings(), withNavBar: false), icon: const Icon(Icons.settings)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
body: ListView(
|
body: editMode ? _sorting() : _overhang(),
|
||||||
|
));
|
||||||
|
|
||||||
|
Widget _sorting() => Consumer<SettingsProvider>(builder: (context, settings, child) {
|
||||||
|
void changeVisibility(Modules module) {
|
||||||
|
var hidden = settings.val(write: true).modulesSettings.hiddenModules;
|
||||||
|
hidden.contains(module) ? hidden.remove(module) : (hidden.length < 3 ? hidden.add(module) : null);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ReorderableListView(
|
||||||
|
header: const Center(
|
||||||
|
heightFactor: 2,
|
||||||
|
child: Text('Halte und ziehe einen Eintrag, um ihn zu verschieben.\nEs können 3 Bereiche ausgeblendet werden.', textAlign: TextAlign.center)
|
||||||
|
),
|
||||||
|
children: AppModule.modules(context, showFiltered: true)
|
||||||
|
.map((key, value) => MapEntry(key, value.toListTile(
|
||||||
|
context,
|
||||||
|
key: Key(key.name),
|
||||||
|
isReorder: true,
|
||||||
|
onVisibleChange: () => changeVisibility(key),
|
||||||
|
isVisible: !settings.val().modulesSettings.hiddenModules.contains(key)
|
||||||
|
)))
|
||||||
|
.values
|
||||||
|
.toList(),
|
||||||
|
onReorder: (oldIndex, newIndex) {
|
||||||
|
if (newIndex > oldIndex) newIndex -= 1;
|
||||||
|
|
||||||
|
var order = settings.val().modulesSettings.moduleOrder.toList();
|
||||||
|
final movedModule = order.removeAt(oldIndex);
|
||||||
|
order.insert(newIndex, movedModule);
|
||||||
|
settings.val(write: true).modulesSettings.moduleOrder = order;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
Widget _overhang() => ListView(
|
||||||
children: [
|
children: [
|
||||||
AppModule.getModule(Modules.marianumMessage).toListTile(context),
|
...AppModule.getOverhangModules(context).map((e) => e.toListTile(context)),
|
||||||
AppModule.getModule(Modules.roomPlan).toListTile(context),
|
|
||||||
AppModule.getModule(Modules.gradeAveragesCalculator).toListTile(context),
|
|
||||||
AppModule.getModule(Modules.holidays).toListTile(context),
|
|
||||||
|
|
||||||
const Divider(),
|
const Divider(),
|
||||||
|
|
||||||
@ -73,6 +122,5 @@ class Overhang extends StatelessWidget {
|
|||||||
onTap: () => pushScreen(context, withNavBar: false, screen: const FeedbackDialog()),
|
onTap: () => pushScreen(context, withNavBar: false, screen: const FeedbackDialog()),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -130,7 +130,7 @@ class _ChatBubbleState extends State<ChatBubble> with SingleTickerProviderStateM
|
|||||||
emojis.EmojiPicker(
|
emojis.EmojiPicker(
|
||||||
config: emojis.Config(
|
config: emojis.Config(
|
||||||
height: 256,
|
height: 256,
|
||||||
swapCategoryAndBottomBar: true,
|
// swapCategoryAndBottomBar: true, // TODO this property is no longer supported, need to find an replacement
|
||||||
emojiViewConfig: emojis.EmojiViewConfig(
|
emojiViewConfig: emojis.EmojiViewConfig(
|
||||||
backgroundColor: Theme.of(context).canvasColor,
|
backgroundColor: Theme.of(context).canvasColor,
|
||||||
recentsLimit: 67,
|
recentsLimit: 67,
|
||||||
@ -148,7 +148,7 @@ class _ChatBubbleState extends State<ChatBubble> with SingleTickerProviderStateM
|
|||||||
),
|
),
|
||||||
searchViewConfig: emojis.SearchViewConfig(
|
searchViewConfig: emojis.SearchViewConfig(
|
||||||
backgroundColor: Theme.of(context).dividerColor,
|
backgroundColor: Theme.of(context).dividerColor,
|
||||||
buttonColor: Theme.of(context).dividerColor,
|
// buttonColor: Theme.of(context).dividerColor, // TODO property no longer supported
|
||||||
hintText: 'Suchen',
|
hintText: 'Suchen',
|
||||||
buttonIconColor: Colors.white,
|
buttonIconColor: Colors.white,
|
||||||
),
|
),
|
||||||
@ -206,7 +206,7 @@ class _ChatBubbleState extends State<ChatBubble> with SingleTickerProviderStateM
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
Visibility(
|
Visibility(
|
||||||
visible: !message.containsFile,
|
visible: widget.bubbleData.message != '{file}',
|
||||||
child: ListTile(
|
child: ListTile(
|
||||||
leading: const Icon(Icons.copy),
|
leading: const Icon(Icons.copy),
|
||||||
title: const Text('Nachricht kopieren'),
|
title: const Text('Nachricht kopieren'),
|
||||||
@ -282,14 +282,15 @@ class _ChatBubbleState extends State<ChatBubble> with SingleTickerProviderStateM
|
|||||||
if(!widget.bubbleData.isReplyable) return;
|
if(!widget.bubbleData.isReplyable) return;
|
||||||
var dx = details.delta.dx - _dragStartPosition.dx;
|
var dx = details.delta.dx - _dragStartPosition.dx;
|
||||||
setState(() {
|
setState(() {
|
||||||
_position = (_position.dx + dx).abs() > 30 ? Offset(_position.dx, 0) : Offset(_position.dx + dx, 0);
|
_position = (_position.dx + dx).abs() > 60 ? Offset(_position.dx, 0) : Offset(_position.dx + dx, 0);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
onHorizontalDragEnd: (DragEndDetails details) {
|
onHorizontalDragEnd: (DragEndDetails details) {
|
||||||
|
var isAction = _position.dx.abs() > 50;
|
||||||
setState(() {
|
setState(() {
|
||||||
_position = const Offset(0, 0);
|
_position = const Offset(0, 0);
|
||||||
});
|
});
|
||||||
if(widget.bubbleData.isReplyable) {
|
if(widget.bubbleData.isReplyable && isAction) {
|
||||||
Provider.of<ChatProps>(context, listen: false).setReferenceMessageId(widget.bubbleData.id, context, widget.chatData.token);
|
Provider.of<ChatProps>(context, listen: false).setReferenceMessageId(widget.bubbleData.id, context, widget.chatData.token);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -21,23 +21,30 @@ class ChatMessage {
|
|||||||
ChatMessage({required this.originalMessage, this.originalData}) {
|
ChatMessage({required this.originalMessage, this.originalData}) {
|
||||||
if(originalData?.containsKey('file') ?? false) {
|
if(originalData?.containsKey('file') ?? false) {
|
||||||
file = originalData?['file'];
|
file = originalData?['file'];
|
||||||
content = file?.name ?? 'Datei';
|
|
||||||
} else {
|
|
||||||
content = RichObjectStringProcessor.parseToString(originalMessage, originalData);
|
|
||||||
}
|
}
|
||||||
|
content = RichObjectStringProcessor.parseToString(originalMessage, originalData);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget getWidget() {
|
Widget getWidget() {
|
||||||
|
|
||||||
if(file == null) {
|
var contentWidget = Linkify(
|
||||||
return Linkify(
|
|
||||||
text: content,
|
text: content,
|
||||||
onOpen: onOpen,
|
onOpen: onOpen,
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
return CachedNetworkImage(
|
if(file == null) return contentWidget;
|
||||||
errorWidget: (context, url, error) => Padding(padding: const EdgeInsets.only(top: 10), child: Row(
|
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.only(top: 5),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
mainAxisSize: MainAxisSize.max,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
CachedNetworkImage(
|
||||||
|
errorWidget: (context, url, error) => Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
@ -46,13 +53,20 @@ class ChatMessage {
|
|||||||
Flexible(child: Text(file!.name, maxLines: 2, overflow: TextOverflow.ellipsis, style: const TextStyle(fontWeight: FontWeight.bold))),
|
Flexible(child: Text(file!.name, maxLines: 2, overflow: TextOverflow.ellipsis, style: const TextStyle(fontWeight: FontWeight.bold))),
|
||||||
const SizedBox(width: 10),
|
const SizedBox(width: 10),
|
||||||
],
|
],
|
||||||
)),
|
),
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
placeholder: (context, url) => const Padding(padding: EdgeInsets.all(10), child: CircularProgressIndicator()),
|
placeholder: (context, url) => const Padding(padding: EdgeInsets.all(15), child: SizedBox(width: 50, child: LinearProgressIndicator())),
|
||||||
fadeInDuration: Duration.zero,
|
fadeInDuration: Duration.zero,
|
||||||
fadeOutDuration: Duration.zero,
|
fadeOutDuration: Duration.zero,
|
||||||
errorListener: (value) {},
|
errorListener: (value) {},
|
||||||
imageUrl: 'https://${AccountData().buildHttpAuthString()}@${EndpointData().nextcloud().full()}/index.php/core/preview?fileId=${file!.id}&x=100&y=-1&a=1',
|
imageUrl: 'https://${AccountData().buildHttpAuthString()}@${EndpointData().nextcloud().full()}/index.php/core/preview?fileId=${file!.id}&x=100&y=-1&a=1',
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
SizedBox(height: 5),
|
||||||
|
contentWidget
|
||||||
|
],
|
||||||
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ import 'customTimetableColors.dart';
|
|||||||
import 'customTimetableEventEditDialog.dart';
|
import 'customTimetableEventEditDialog.dart';
|
||||||
import 'timeRegionComponent.dart';
|
import 'timeRegionComponent.dart';
|
||||||
import 'timetableEvents.dart';
|
import 'timetableEvents.dart';
|
||||||
|
import 'timetableNameMode.dart';
|
||||||
import 'viewCustomTimetableEvents.dart';
|
import 'viewCustomTimetableEvents.dart';
|
||||||
|
|
||||||
class Timetable extends StatefulWidget {
|
class Timetable extends StatefulWidget {
|
||||||
@ -72,7 +73,6 @@ class _TimetableState extends State<Timetable> {
|
|||||||
title = 'Kalendereintrag hinzufügen';
|
title = 'Kalendereintrag hinzufügen';
|
||||||
icon = const Icon(Icons.add);
|
icon = const Icon(Icons.add);
|
||||||
case CalendarActions.viewEvents:
|
case CalendarActions.viewEvents:
|
||||||
default:
|
|
||||||
title = 'Kalendereinträge anzeigen';
|
title = 'Kalendereinträge anzeigen';
|
||||||
icon = const Icon(Icons.perm_contact_calendar_outlined);
|
icon = const Icon(Icons.perm_contact_calendar_outlined);
|
||||||
}
|
}
|
||||||
@ -123,6 +123,7 @@ class _TimetableState extends State<Timetable> {
|
|||||||
|
|
||||||
return RefreshIndicator(
|
return RefreshIndicator(
|
||||||
child: SfCalendar(
|
child: SfCalendar(
|
||||||
|
timeZone: 'W. Europe Standard Time',
|
||||||
view: CalendarView.workWeek,
|
view: CalendarView.workWeek,
|
||||||
dataSource: _buildTableEvents(value),
|
dataSource: _buildTableEvents(value),
|
||||||
|
|
||||||
@ -300,11 +301,20 @@ class _TimetableState extends State<Timetable> {
|
|||||||
try {
|
try {
|
||||||
var startTime = _parseWebuntisTimestamp(element.date, element.startTime);
|
var startTime = _parseWebuntisTimestamp(element.date, element.startTime);
|
||||||
var endTime = _parseWebuntisTimestamp(element.date, element.endTime);
|
var endTime = _parseWebuntisTimestamp(element.date, element.endTime);
|
||||||
|
|
||||||
|
var subject = subjects.result.firstWhere((subject) => subject.id == element.su[0].id);
|
||||||
|
var subjectName = {
|
||||||
|
TimetableNameMode.name: subject.name,
|
||||||
|
TimetableNameMode.longName: subject.longName,
|
||||||
|
TimetableNameMode.alternateName: subject.alternateName,
|
||||||
|
}[settings.val().timetableSettings.timetableNameMode];
|
||||||
|
|
||||||
|
|
||||||
return Appointment(
|
return Appointment(
|
||||||
id: ArbitraryAppointment(webuntis: element),
|
id: ArbitraryAppointment(webuntis: element),
|
||||||
startTime: startTime,
|
startTime: startTime,
|
||||||
endTime: endTime,
|
endTime: endTime,
|
||||||
subject: subjects.result.firstWhere((subject) => subject.id == element.su[0].id).name,
|
subject: subjectName!,
|
||||||
location: ''
|
location: ''
|
||||||
'${rooms.result.firstWhere((room) => room.id == element.ro[0].id).name}'
|
'${rooms.result.firstWhere((room) => room.id == element.ro[0].id).name}'
|
||||||
'\n'
|
'\n'
|
||||||
@ -358,6 +368,9 @@ class _TimetableState extends State<Timetable> {
|
|||||||
// Any changes or no teacher at this element
|
// Any changes or no teacher at this element
|
||||||
if(webuntisElement.code == 'irregular' || webuntisElement.te.first.id == 0) return const Color(0xff8F19B3).withAlpha(alpha);
|
if(webuntisElement.code == 'irregular' || webuntisElement.te.first.id == 0) return const Color(0xff8F19B3).withAlpha(alpha);
|
||||||
|
|
||||||
|
// Teacher has changed
|
||||||
|
if(webuntisElement.te.any((element) => element.orgname != null)) return const Color(0xFF29639B).withAlpha(alpha);
|
||||||
|
|
||||||
// Event was in the past
|
// Event was in the past
|
||||||
if(endTime.isBefore(DateTime.now())) return Theme.of(context).primaryColor.withAlpha(alpha);
|
if(endTime.isBefore(DateTime.now())) return Theme.of(context).primaryColor.withAlpha(alpha);
|
||||||
|
|
||||||
|
25
lib/view/pages/timetable/timetableNameMode.dart
Normal file
25
lib/view/pages/timetable/timetableNameMode.dart
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
import '../../../widget/dropdownDisplay.dart';
|
||||||
|
|
||||||
|
enum TimetableNameMode {
|
||||||
|
name,
|
||||||
|
longName,
|
||||||
|
alternateName
|
||||||
|
}
|
||||||
|
|
||||||
|
class TimetableNameModes {
|
||||||
|
static DropdownDisplay getDisplayOptions(TimetableNameMode theme) {
|
||||||
|
switch(theme) {
|
||||||
|
case TimetableNameMode.name:
|
||||||
|
return DropdownDisplay(icon: Icons.device_unknown_outlined, displayName: 'Name');
|
||||||
|
|
||||||
|
case TimetableNameMode.longName:
|
||||||
|
return DropdownDisplay(icon: Icons.perm_device_info_outlined, displayName: 'Langname');
|
||||||
|
|
||||||
|
case TimetableNameMode.alternateName:
|
||||||
|
return DropdownDisplay(icon: Icons.on_device_training_outlined, displayName: 'Kurzform');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,22 +2,38 @@ import 'dart:io';
|
|||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
import '../../state/app/modules/app_modules.dart';
|
||||||
import '../../storage/base/settings.dart';
|
import '../../storage/base/settings.dart';
|
||||||
import '../../storage/devTools/devToolsSettings.dart';
|
import '../../storage/devTools/devToolsSettings.dart';
|
||||||
import '../../storage/file/fileSettings.dart';
|
import '../../storage/file/fileSettings.dart';
|
||||||
import '../../storage/fileView/fileViewSettings.dart';
|
import '../../storage/fileView/fileViewSettings.dart';
|
||||||
|
import '../../storage/general/modulesSettings.dart';
|
||||||
import '../../storage/holidays/holidaysSettings.dart';
|
import '../../storage/holidays/holidaysSettings.dart';
|
||||||
import '../../storage/notification/notificationSettings.dart';
|
import '../../storage/notification/notificationSettings.dart';
|
||||||
import '../../storage/talk/talkSettings.dart';
|
import '../../storage/talk/talkSettings.dart';
|
||||||
import '../../storage/timetable/timetableSettings.dart';
|
import '../../storage/timetable/timetableSettings.dart';
|
||||||
import '../pages/files/files.dart';
|
import '../pages/files/files.dart';
|
||||||
|
import '../pages/timetable/timetableNameMode.dart';
|
||||||
|
|
||||||
class DefaultSettings {
|
class DefaultSettings {
|
||||||
static Settings get() => Settings(
|
static Settings get() => Settings(
|
||||||
appTheme: ThemeMode.system,
|
appTheme: ThemeMode.system,
|
||||||
devToolsEnabled: false,
|
devToolsEnabled: false,
|
||||||
|
modulesSettings: ModulesSettings(
|
||||||
|
moduleOrder: [
|
||||||
|
Modules.timetable,
|
||||||
|
Modules.talk,
|
||||||
|
Modules.files,
|
||||||
|
Modules.marianumMessage,
|
||||||
|
Modules.roomPlan,
|
||||||
|
Modules.gradeAveragesCalculator,
|
||||||
|
Modules.holidays
|
||||||
|
],
|
||||||
|
hiddenModules: [],
|
||||||
|
),
|
||||||
timetableSettings: TimetableSettings(
|
timetableSettings: TimetableSettings(
|
||||||
connectDoubleLessons: false,
|
connectDoubleLessons: false,
|
||||||
|
timetableNameMode: TimetableNameMode.name
|
||||||
),
|
),
|
||||||
talkSettings: TalkSettings(
|
talkSettings: TalkSettings(
|
||||||
sortFavoritesToTop: true,
|
sortFavoritesToTop: true,
|
||||||
|
@ -10,15 +10,15 @@ import '../../widget/confirmDialog.dart';
|
|||||||
import '../../widget/debug/cacheView.dart';
|
import '../../widget/debug/cacheView.dart';
|
||||||
import '../../widget/debug/jsonViewer.dart';
|
import '../../widget/debug/jsonViewer.dart';
|
||||||
|
|
||||||
class DevToolsSettingsDialog extends StatefulWidget {
|
class DevToolsSettings extends StatefulWidget {
|
||||||
final SettingsProvider settings;
|
final SettingsProvider settings;
|
||||||
const DevToolsSettingsDialog({required this.settings, super.key});
|
const DevToolsSettings({required this.settings, super.key});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<DevToolsSettingsDialog> createState() => _DevToolsSettingsDialogState();
|
State<DevToolsSettings> createState() => _DevToolsSettingsState();
|
||||||
}
|
}
|
||||||
|
|
||||||
class _DevToolsSettingsDialogState extends State<DevToolsSettingsDialog> {
|
class _DevToolsSettingsState extends State<DevToolsSettings> {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) => Column(
|
Widget build(BuildContext context) => Column(
|
||||||
children: [
|
children: [
|
||||||
@ -59,9 +59,9 @@ class _DevToolsSettingsDialogState extends State<DevToolsSettingsDialog> {
|
|||||||
),
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
leading: const CenteredLeading(Icon(Icons.image_outlined)),
|
leading: const CenteredLeading(Icon(Icons.image_outlined)),
|
||||||
title: const Text('Cached Thumbnails löschen'),
|
title: const Text('Thumb-storage'),
|
||||||
subtitle: Text('etwa ${filesize(PaintingBinding.instance.imageCache.currentSizeBytes)}'),
|
subtitle: Text('etwa ${filesize(PaintingBinding.instance.imageCache.currentSizeBytes)}\nLange tippen um zu löschen'),
|
||||||
onTap: () {
|
onLongPress: () {
|
||||||
ConfirmDialog(
|
ConfirmDialog(
|
||||||
title: 'Thumbs cache löschen',
|
title: 'Thumbs cache löschen',
|
||||||
content: 'Alle zwischengespeicherten Bilder werden gelöscht.',
|
content: 'Alle zwischengespeicherten Bilder werden gelöscht.',
|
||||||
@ -69,7 +69,6 @@ class _DevToolsSettingsDialogState extends State<DevToolsSettingsDialog> {
|
|||||||
onConfirm: () => PaintingBinding.instance.imageCache.clear(),
|
onConfirm: () => PaintingBinding.instance.imageCache.clear(),
|
||||||
).asDialog(context);
|
).asDialog(context);
|
||||||
},
|
},
|
||||||
trailing: const Icon(Icons.arrow_right),
|
|
||||||
),
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
leading: const CenteredLeading(Icon(Icons.settings_applications_outlined)),
|
leading: const CenteredLeading(Icon(Icons.settings_applications_outlined)),
|
||||||
@ -80,7 +79,7 @@ class _DevToolsSettingsDialogState extends State<DevToolsSettingsDialog> {
|
|||||||
},
|
},
|
||||||
onLongPress: () {
|
onLongPress: () {
|
||||||
ConfirmDialog(
|
ConfirmDialog(
|
||||||
title: 'App-Speicher löschen',
|
title: 'Einstellungen löschen',
|
||||||
content: 'Alle Einstellungen gehen verloren! Accountdaten sowie App-Daten sind nicht betroffen.',
|
content: 'Alle Einstellungen gehen verloren! Accountdaten sowie App-Daten sind nicht betroffen.',
|
||||||
confirmButton: 'Unwiederruflich Löschen',
|
confirmButton: 'Unwiederruflich Löschen',
|
||||||
onConfirm: () {
|
onConfirm: () {
|
||||||
@ -112,7 +111,7 @@ class _DevToolsSettingsDialogState extends State<DevToolsSettingsDialog> {
|
|||||||
),
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
leading: const CenteredLeading(Icon(Icons.data_object)),
|
leading: const CenteredLeading(Icon(Icons.data_object)),
|
||||||
title: const Text('BLOC State cache'),
|
title: const Text('BLOC-storage state cache'),
|
||||||
subtitle: const Text('Lange tippen um zu löschen'),
|
subtitle: const Text('Lange tippen um zu löschen'),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
// Navigator.push(context, MaterialPageRoute(builder: (context) => const CacheView()));
|
// Navigator.push(context, MaterialPageRoute(builder: (context) => const CacheView()));
|
||||||
@ -125,7 +124,6 @@ class _DevToolsSettingsDialogState extends State<DevToolsSettingsDialog> {
|
|||||||
onConfirm: () => HydratedBloc.storage.clear(),
|
onConfirm: () => HydratedBloc.storage.clear(),
|
||||||
).asDialog(context);
|
).asDialog(context);
|
||||||
},
|
},
|
||||||
trailing: const Icon(Icons.arrow_right),
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
@ -2,7 +2,7 @@
|
|||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:jiffy/jiffy.dart';
|
import 'package:jiffy/jiffy.dart';
|
||||||
import 'package:package_info/package_info.dart';
|
import 'package:package_info_plus/package_info_plus.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
|
||||||
@ -14,8 +14,9 @@ import '../../theming/appTheme.dart';
|
|||||||
import '../../widget/centeredLeading.dart';
|
import '../../widget/centeredLeading.dart';
|
||||||
import '../../widget/confirmDialog.dart';
|
import '../../widget/confirmDialog.dart';
|
||||||
import '../../widget/debug/cacheView.dart';
|
import '../../widget/debug/cacheView.dart';
|
||||||
|
import '../pages/timetable/timetableNameMode.dart';
|
||||||
import 'defaultSettings.dart';
|
import 'defaultSettings.dart';
|
||||||
import 'devToolsSettingsDialog.dart';
|
import 'devToolsSettings.dart';
|
||||||
import 'privacyInfo.dart';
|
import 'privacyInfo.dart';
|
||||||
|
|
||||||
class Settings extends StatefulWidget {
|
class Settings extends StatefulWidget {
|
||||||
@ -95,6 +96,29 @@ class _SettingsState extends State<Settings> {
|
|||||||
|
|
||||||
const Divider(),
|
const Divider(),
|
||||||
|
|
||||||
|
ListTile(
|
||||||
|
leading: const Icon(Icons.abc_outlined),
|
||||||
|
title: const Text('Fachbezeichnung'),
|
||||||
|
trailing: DropdownButton<TimetableNameMode>(
|
||||||
|
value: settings.val().timetableSettings.timetableNameMode,
|
||||||
|
icon: Icon(Icons.arrow_drop_down),
|
||||||
|
items: TimetableNameMode.values.map((e) => DropdownMenuItem(
|
||||||
|
value: e,
|
||||||
|
enabled: e != settings.val().timetableSettings.timetableNameMode,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Icon(TimetableNameModes.getDisplayOptions(e).icon),
|
||||||
|
const SizedBox(width: 10),
|
||||||
|
Text(TimetableNameModes.getDisplayOptions(e).displayName),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)).toList(),
|
||||||
|
onChanged: (value) {
|
||||||
|
settings.val(write: true).timetableSettings.timetableNameMode = value!;
|
||||||
|
Provider.of<TimetableProps>(context, listen: false).run(renew: false);
|
||||||
|
},
|
||||||
|
)
|
||||||
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
leading: const Icon(Icons.calendar_view_day_outlined),
|
leading: const Icon(Icons.calendar_view_day_outlined),
|
||||||
title: const Text('Doppelstunden zusammenhängend anzeigen'),
|
title: const Text('Doppelstunden zusammenhängend anzeigen'),
|
||||||
@ -131,34 +155,6 @@ class _SettingsState extends State<Settings> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
const Divider(),
|
|
||||||
|
|
||||||
ListTile(
|
|
||||||
leading: const Icon(Icons.drive_folder_upload_outlined),
|
|
||||||
title: const Text('Ordner in Dateien nach oben sortieren'),
|
|
||||||
trailing: Checkbox(
|
|
||||||
value: settings.val().fileSettings.sortFoldersToTop,
|
|
||||||
onChanged: (e) {
|
|
||||||
settings.val(write: true).fileSettings.sortFoldersToTop = e!;
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
|
|
||||||
const Divider(),
|
|
||||||
|
|
||||||
ListTile(
|
|
||||||
leading: const Icon(Icons.open_in_new_outlined),
|
|
||||||
title: const Text('Dateien immer mit Systemdialog öffnen'),
|
|
||||||
trailing: Checkbox(
|
|
||||||
value: settings.val().fileViewSettings.alwaysOpenExternally,
|
|
||||||
onChanged: (e) {
|
|
||||||
settings.val(write: true).fileViewSettings.alwaysOpenExternally = e!;
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
|
|
||||||
const Divider(),
|
|
||||||
|
|
||||||
ListTile(
|
ListTile(
|
||||||
leading: const CenteredLeading(Icon(Icons.notifications_active_outlined)),
|
leading: const CenteredLeading(Icon(Icons.notifications_active_outlined)),
|
||||||
title: const Text('Push-Benachrichtigungen aktivieren'),
|
title: const Text('Push-Benachrichtigungen aktivieren'),
|
||||||
@ -190,6 +186,30 @@ class _SettingsState extends State<Settings> {
|
|||||||
|
|
||||||
const Divider(),
|
const Divider(),
|
||||||
|
|
||||||
|
ListTile(
|
||||||
|
leading: const Icon(Icons.drive_folder_upload_outlined),
|
||||||
|
title: const Text('Ordner in Dateien nach oben sortieren'),
|
||||||
|
trailing: Checkbox(
|
||||||
|
value: settings.val().fileSettings.sortFoldersToTop,
|
||||||
|
onChanged: (e) {
|
||||||
|
settings.val(write: true).fileSettings.sortFoldersToTop = e!;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
ListTile(
|
||||||
|
leading: const Icon(Icons.open_in_new_outlined),
|
||||||
|
title: const Text('Dateien immer mit Systemdialog öffnen'),
|
||||||
|
trailing: Checkbox(
|
||||||
|
value: settings.val().fileViewSettings.alwaysOpenExternally,
|
||||||
|
onChanged: (e) {
|
||||||
|
settings.val(write: true).fileViewSettings.alwaysOpenExternally = e!;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
const Divider(),
|
||||||
|
|
||||||
ListTile(
|
ListTile(
|
||||||
leading: const Icon(Icons.live_help_outlined),
|
leading: const Icon(Icons.live_help_outlined),
|
||||||
title: const Text('Informationen und Lizenzen'),
|
title: const Text('Informationen und Lizenzen'),
|
||||||
@ -245,15 +265,12 @@ class _SettingsState extends State<Settings> {
|
|||||||
|
|
||||||
const Divider(),
|
const Divider(),
|
||||||
|
|
||||||
Visibility(
|
ListTile(
|
||||||
visible: !kReleaseMode,
|
|
||||||
child: ListTile(
|
|
||||||
leading: const CenteredLeading(Icon(Icons.code)),
|
leading: const CenteredLeading(Icon(Icons.code)),
|
||||||
title: const Text('Quellcode MarianumMobile/Client'),
|
title: const Text('Quellcode MarianumMobile/Client'),
|
||||||
subtitle: const Text('GNU GPL v3'),
|
subtitle: const Text('GNU GPL v3'),
|
||||||
onTap: () => ConfirmDialog.openBrowser(context, 'https://mhsl.eu/gitea/MarianumMobile/Client'),
|
onTap: () => ConfirmDialog.openBrowser(context, 'https://mhsl.eu/gitea/MarianumMobile/Client'),
|
||||||
),
|
),
|
||||||
),
|
|
||||||
|
|
||||||
ListTile(
|
ListTile(
|
||||||
leading: const Icon(Icons.developer_mode_outlined),
|
leading: const Icon(Icons.developer_mode_outlined),
|
||||||
@ -287,7 +304,7 @@ class _SettingsState extends State<Settings> {
|
|||||||
|
|
||||||
Visibility(
|
Visibility(
|
||||||
visible: settings.val().devToolsEnabled,
|
visible: settings.val().devToolsEnabled,
|
||||||
child: DevToolsSettingsDialog(settings: settings),
|
child: DevToolsSettings(settings: settings),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -3,7 +3,6 @@ import 'dart:async';
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'package:filesize/filesize.dart';
|
import 'package:filesize/filesize.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
|
||||||
import 'package:jiffy/jiffy.dart';
|
import 'package:jiffy/jiffy.dart';
|
||||||
import 'package:localstore/localstore.dart';
|
import 'package:localstore/localstore.dart';
|
||||||
|
|
||||||
@ -41,7 +40,7 @@ class _CacheViewState extends State<CacheView> {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) => Scaffold(
|
Widget build(BuildContext context) => Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: const Text('Lokaler cache'),
|
title: const Text('Cache storage'),
|
||||||
),
|
),
|
||||||
body: FutureBuilder(
|
body: FutureBuilder(
|
||||||
future: files,
|
future: files,
|
||||||
@ -58,27 +57,7 @@ class _CacheViewState extends State<CacheView> {
|
|||||||
title: Text(filename),
|
title: Text(filename),
|
||||||
subtitle: Text("${filesize(jsonEncode(element).length * 8)}, ${Jiffy.parseFromMillisecondsSinceEpoch(element['lastupdate']).fromNow()}"),
|
subtitle: Text("${filesize(jsonEncode(element).length * 8)}, ${Jiffy.parseFromMillisecondsSinceEpoch(element['lastupdate']).fromNow()}"),
|
||||||
trailing: const Icon(Icons.arrow_right),
|
trailing: const Icon(Icons.arrow_right),
|
||||||
onTap: () {
|
onTap: () => JsonViewer.asDialog(context, jsonDecode(element['json'])),
|
||||||
Navigator.push(context, MaterialPageRoute(builder: (context) => JsonViewer(title: filename, data: jsonDecode(element['json'])),));
|
|
||||||
},
|
|
||||||
onLongPress: () {
|
|
||||||
showDialog(context: context, builder: (context) => SimpleDialog(
|
|
||||||
children: [
|
|
||||||
const ListTile(
|
|
||||||
leading: Icon(Icons.delete_forever),
|
|
||||||
title: Text('Diese Datei löschen'),
|
|
||||||
),
|
|
||||||
ListTile(
|
|
||||||
leading: const Icon(Icons.copy),
|
|
||||||
title: const Text('Dateitext kopieren'),
|
|
||||||
onTap: () {
|
|
||||||
Clipboard.setData(ClipboardData(text: jsonEncode(element)));
|
|
||||||
Navigator.of(context).pop();
|
|
||||||
},
|
|
||||||
)
|
|
||||||
],
|
|
||||||
));
|
|
||||||
},
|
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
8
lib/widget/dropdownDisplay.dart
Normal file
8
lib/widget/dropdownDisplay.dart
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class DropdownDisplay {
|
||||||
|
final IconData icon;
|
||||||
|
final String displayName;
|
||||||
|
|
||||||
|
DropdownDisplay({required this.icon, required this.displayName});
|
||||||
|
}
|
@ -7,22 +7,19 @@ class PlaceholderView extends StatelessWidget {
|
|||||||
const PlaceholderView({super.key, required this.icon, required this.text, this.button});
|
const PlaceholderView({super.key, required this.icon, required this.text, this.button});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) => DefaultTextStyle(
|
Widget build(BuildContext context) => Scaffold(
|
||||||
style: const TextStyle(),
|
body: Center(
|
||||||
child: Center(
|
|
||||||
child: Container(
|
child: Container(
|
||||||
margin: const EdgeInsets.only(top: 100, left: 20, right: 20),
|
margin: const EdgeInsets.only(top: 100, left: 20, right: 20),
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Container(
|
Container(
|
||||||
margin: const EdgeInsets.all(30),
|
margin: const EdgeInsets.all(30),
|
||||||
child: Icon(icon, color: Colors.grey, size: 60),
|
child: Icon(icon, size: 60),
|
||||||
),
|
|
||||||
Text(text,
|
|
||||||
style: const TextStyle(
|
|
||||||
fontSize: 20,
|
|
||||||
color: Colors.grey,
|
|
||||||
),
|
),
|
||||||
|
Text(
|
||||||
|
text,
|
||||||
|
style: const TextStyle(fontSize: 20,),
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
),
|
),
|
||||||
const SizedBox(height: 30),
|
const SizedBox(height: 30),
|
||||||
|
125
pubspec.yaml
125
pubspec.yaml
@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
|||||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
||||||
# In Windows, build-name is used as the major, minor, and patch parts
|
# In Windows, build-name is used as the major, minor, and patch parts
|
||||||
# of the product and file versions while build-number is used as the build suffix.
|
# of the product and file versions while build-number is used as the build suffix.
|
||||||
version: 0.0.9+35
|
version: 0.1.3+41
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: '>3.0.0'
|
sdk: '>3.0.0'
|
||||||
@ -30,7 +30,7 @@ environment:
|
|||||||
# versions available, run `flutter pub outdated`.
|
# versions available, run `flutter pub outdated`.
|
||||||
|
|
||||||
dependency_overrides:
|
dependency_overrides:
|
||||||
#xml: ^6.2.2
|
intl: any
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
flutter:
|
flutter:
|
||||||
@ -39,85 +39,82 @@ dependencies:
|
|||||||
flutter_localizations:
|
flutter_localizations:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
|
|
||||||
# The following adds the Cupertino Icons font to your application.
|
animated_digit: ^3.2.3
|
||||||
# Use with the CupertinoIcons class for iOS style icons.
|
async: ^2.11.0
|
||||||
cupertino_icons: ^1.0.2
|
badges: ^3.1.2
|
||||||
flutter_native_splash: ^2.2.14
|
better_open_file: ^3.6.5
|
||||||
flutter_login: ^5.0.0
|
bloc: ^9.0.0
|
||||||
|
bottom_sheet: ^4.0.4
|
||||||
bubble: ^1.2.1
|
bubble: ^1.2.1
|
||||||
http: ^1.1.0
|
cached_network_image: ^3.4.1
|
||||||
shared_preferences: ^2.0.15
|
connectivity_plus: ^6.1.2
|
||||||
provider: ^6.0.4
|
crypto: ^3.0.6
|
||||||
jiffy: ^6.1.0
|
cupertino_icons: ^1.0.8
|
||||||
json_annotation: ^4.8.1
|
device_info_plus: ^11.2.1
|
||||||
localstore: ^1.2.3
|
dio: ^4.0.6
|
||||||
intl: ^0.18.0
|
easy_debounce: ^2.0.3
|
||||||
nextcloud:
|
emoji_picker_flutter: ^4.3.0
|
||||||
git:
|
fast_rsa: ^3.7.1
|
||||||
url: https://github.com/provokateurin/nextcloud-neon
|
file_picker: ^8.1.7
|
||||||
path: packages/nextcloud
|
|
||||||
ref: 3683491a94670393e46cbc83ad85b994f7df7481
|
|
||||||
flutter_launcher_icons: ^0.13.1
|
|
||||||
pretty_json: ^2.0.0
|
|
||||||
cached_network_image: ^3.2.3
|
|
||||||
url_launcher: ^6.1.10
|
|
||||||
flutter_linkify: ^6.0.0
|
|
||||||
filesize: ^2.0.1
|
filesize: ^2.0.1
|
||||||
path_provider: ^2.0.13
|
firebase_core: ^3.10.1
|
||||||
better_open_file: ^3.6.4
|
firebase_in_app_messaging: ^0.8.1+1
|
||||||
|
firebase_messaging: ^15.2.1
|
||||||
flowder:
|
flowder:
|
||||||
git:
|
git:
|
||||||
url: https://github.com/Harsh223/flowder.git
|
url: https://github.com/Harsh223/flowder.git
|
||||||
persistent_bottom_nav_bar_v2: ^5.0.0
|
flutter_app_badge: ^2.0.2
|
||||||
badges: ^3.0.2
|
flutter_bloc: ^9.0.0
|
||||||
image_picker: ^1.0.0
|
flutter_launcher_icons: ^0.14.3
|
||||||
file_picker: ^8.0.0+1
|
flutter_linkify: ^6.0.0
|
||||||
loader_overlay: ^4.0.0
|
flutter_local_notifications: ^18.0.1
|
||||||
crypto: ^3.0.3
|
flutter_login: ^5.0.0
|
||||||
package_info: ^2.0.2
|
flutter_native_splash: ^2.4.4
|
||||||
syncfusion_flutter_calendar: ^24.1.44
|
|
||||||
async: ^2.11.0
|
|
||||||
animated_digit: ^3.2.1
|
|
||||||
syncfusion_flutter_pdfviewer: ^24.1.44
|
|
||||||
photo_view: ^0.14.0
|
|
||||||
uuid: ^4.2.2
|
|
||||||
firebase_messaging: ^14.6.5
|
|
||||||
firebase_core: ^2.15.0
|
|
||||||
firebase_in_app_messaging: ^0.7.3+4
|
|
||||||
flutter_local_notifications: ^17.0.0
|
|
||||||
fast_rsa: ^3.6.1
|
|
||||||
share_plus: ^8.0.2
|
|
||||||
flutter_split_view: ^0.1.2
|
flutter_split_view: ^0.1.2
|
||||||
bottom_sheet: ^4.0.0
|
freezed_annotation: ^2.4.4
|
||||||
device_info_plus: ^9.0.3
|
http: ^1.3.0
|
||||||
flutter_app_badger: ^1.5.0
|
hydrated_bloc: ^10.0.0
|
||||||
|
image_picker: ^1.1.2
|
||||||
|
in_app_review: ^2.0.10
|
||||||
|
jiffy: ^6.2.1
|
||||||
|
json_annotation: ^4.9.0
|
||||||
|
loader_overlay: ^5.0.0
|
||||||
|
localstore: ^1.4.0
|
||||||
|
nextcloud:
|
||||||
|
git:
|
||||||
|
path: packages/nextcloud
|
||||||
|
ref: 3683491a94670393e46cbc83ad85b994f7df7481
|
||||||
|
url: https://github.com/provokateurin/nextcloud-neon
|
||||||
|
package_info_plus: ^8.1.3
|
||||||
|
path_provider: ^2.1.5
|
||||||
|
persistent_bottom_nav_bar_v2: ^5.3.1
|
||||||
|
photo_view: ^0.15.0
|
||||||
|
pretty_json: ^2.0.0
|
||||||
|
provider: ^6.1.2
|
||||||
qr_flutter: ^4.1.0
|
qr_flutter: ^4.1.0
|
||||||
easy_debounce: ^2.0.3
|
rrule: ^0.2.17
|
||||||
rrule_generator: ^0.7.0+1
|
rrule_generator: ^0.9.0
|
||||||
rrule: ^0.2.16
|
share_plus: ^10.1.4
|
||||||
time_range_picker: ^2.2.0
|
shared_preferences: ^2.3.5
|
||||||
in_app_review: ^2.0.8
|
syncfusion_flutter_calendar: ^28.1.41
|
||||||
emoji_picker_flutter: ^2.1.1
|
syncfusion_flutter_pdfviewer: ^28.1.41
|
||||||
bloc: ^8.1.4
|
time_range_picker: ^2.3.0
|
||||||
flutter_bloc: ^8.1.5
|
url_launcher: ^6.3.1
|
||||||
freezed_annotation: ^2.4.1
|
uuid: ^4.5.1
|
||||||
connectivity_plus: ^6.0.3
|
|
||||||
hydrated_bloc: ^9.1.5
|
|
||||||
dio: ^4.0.6
|
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
json_serializable: ^6.7.1
|
json_serializable: any
|
||||||
build_runner: ^2.4.9
|
build_runner: any
|
||||||
|
|
||||||
# The "flutter_lints" package below contains a set of recommended lints to
|
# The "flutter_lints" package below contains a set of recommended lints to
|
||||||
# encourage good coding practices. The lint set provided by the package is
|
# encourage good coding practices. The lint set provided by the package is
|
||||||
# activated in the `analysis_options.yaml` file located at the root of your
|
# activated in the `analysis_options.yaml` file located at the root of your
|
||||||
# package. See that file for information about deactivating specific lint
|
# package. See that file for information about deactivating specific lint
|
||||||
# rules and activating additional ones.
|
# rules and activating additional ones.
|
||||||
flutter_lints: ^3.0.1
|
flutter_lints: any
|
||||||
freezed: ^2.5.2
|
freezed: any
|
||||||
|
|
||||||
# For information on the generic Dart part of this file, see the
|
# For information on the generic Dart part of this file, see the
|
||||||
# following page: https://dart.dev/tools/pub/pubspec
|
# following page: https://dart.dev/tools/pub/pubspec
|
||||||
|
Reference in New Issue
Block a user