Implement Webuntis HTTP Api and Display

This commit is contained in:
Elias Müller 2023-02-15 20:33:05 +01:00
parent 7432972b3c
commit 2b6dc8e3e6
42 changed files with 746 additions and 287 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,22 +1,26 @@
<component name="libraryTable">
<library name="Flutter Plugins" type="FlutterPluginsLibraryType">
<CLASSES>
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_web-2.0.4" />
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.1.3" />
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_windows-2.1.3" />
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_native_splash-2.2.17" />
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_android-2.0.15" />
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_linux-2.1.3" />
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.14" />
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-3.0.3" />
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences-2.0.17" />
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-3.0.2" />
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-3.0.2" />
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_android-6.0.23" />
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_foundation-2.1.3" />
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.1.8" />
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.1.9" />
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_ios-6.1.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_native_splash-2.2.17" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_macos-3.0.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_linux-3.0.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider-2.0.12" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_android-6.0.23" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences-2.0.17" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.1.3" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_web-2.0.14" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher-6.1.9" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_windows-3.0.3" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/sqflite-2.2.4+1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.8" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.1.3" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_ios-6.1.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider_foundation-2.1.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider_android-2.0.22" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.1.3" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_web-2.0.4" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.3" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_android-2.0.15" />
</CLASSES>
<JAVADOC />
<SOURCES />

32
lib/api/requestCache.dart Normal file
View File

@ -0,0 +1,32 @@
import 'dart:convert';
import 'package:localstore/localstore.dart';
abstract class RequestCache<T> {
int maxCacheTime;
Function(T) onUpdate;
RequestCache(this.maxCacheTime, this.onUpdate);
void start(String file, String document) async {
Map<String, dynamic>? tableData = await Localstore.instance.collection(file).doc(document).get();
if(tableData != null) {
onUpdate(onLocalData(tableData['json']));
}
if(DateTime.now().millisecondsSinceEpoch - (maxCacheTime * 1000) < (tableData?['lastupdate'] ?? 0)) {
return;
}
T newValue = await onLoad();
onUpdate(newValue);
Localstore.instance.collection(file).doc(document).set({
"json": jsonEncode(newValue),
"lastupdate": DateTime.now().millisecondsSinceEpoch
});
}
T onLocalData(String json);
Future<T> onLoad();
}

View File

@ -0,0 +1,23 @@
import 'dart:convert';
import 'package:marianum_mobile/api/requestCache.dart';
import 'package:marianum_mobile/api/webuntis/queries/getRooms/getRoomsResponse.dart';
import 'getRooms.dart';
class GetRoomsCache extends RequestCache<GetRoomsResponse> {
GetRoomsCache({onUpdate}) : super(60 * 60, onUpdate) {
start("rooms", "data");
}
@override
Future<GetRoomsResponse> onLoad() {
return GetRooms().run();
}
@override
GetRoomsResponse onLocalData(String json) {
return GetRoomsResponse.fromJson(jsonDecode(json));
}
}

View File

@ -3,7 +3,7 @@ import 'package:marianum_mobile/api/webuntis/apiResponse.dart';
part 'getRoomsResponse.g.dart';
@JsonSerializable()
@JsonSerializable(explicitToJson: true)
class GetRoomsResponse extends ApiResponse {
Set<GetRoomsResponseObject> result;

View File

@ -16,7 +16,7 @@ GetRoomsResponse _$GetRoomsResponseFromJson(Map<String, dynamic> json) =>
Map<String, dynamic> _$GetRoomsResponseToJson(GetRoomsResponse instance) =>
<String, dynamic>{
'result': instance.result.toList(),
'result': instance.result.map((e) => e.toJson()).toList(),
};
GetRoomsResponseObject _$GetRoomsResponseObjectFromJson(

View File

@ -0,0 +1,16 @@
import 'dart:convert';
import 'package:marianum_mobile/api/webuntis/webuntisApi.dart';
import '../../apiResponse.dart';
import 'getSubjectsResponse.dart';
class GetSubjects extends WebuntisApi {
GetSubjects() : super("getSubjects", null);
@override
Future<GetSubjectsResponse> run() async {
String rawAnswer = await query(this);
return finalize(GetSubjectsResponse.fromJson(jsonDecode(rawAnswer)));
}
}

View File

@ -0,0 +1,23 @@
import 'dart:convert';
import 'package:marianum_mobile/api/requestCache.dart';
import 'package:marianum_mobile/api/webuntis/queries/getSubjects/getSubjectsResponse.dart';
import 'getSubjects.dart';
class GetSubjectsCache extends RequestCache<GetSubjectsResponse> {
GetSubjectsCache({onUpdate}) : super(60 * 60, onUpdate) {
start("subjects", "data");
}
@override
Future<GetSubjectsResponse> onLoad() {
return GetSubjects().run();
}
@override
onLocalData(String json) {
return GetSubjectsResponse.fromJson(jsonDecode(json));
}
}

View File

@ -0,0 +1,28 @@
import 'package:json_annotation/json_annotation.dart';
import 'package:marianum_mobile/api/webuntis/apiResponse.dart';
part 'getSubjectsResponse.g.dart';
@JsonSerializable(explicitToJson: true)
class GetSubjectsResponse extends ApiResponse {
Set<GetSubjectsResponseObject> result;
GetSubjectsResponse(this.result);
factory GetSubjectsResponse.fromJson(Map<String, dynamic> json) => _$GetSubjectsResponseFromJson(json);
Map<String, dynamic> toJson() => _$GetSubjectsResponseToJson(this);
}
@JsonSerializable(explicitToJson: true)
class GetSubjectsResponseObject {
int id;
String name;
String longName;
String alternateName;
bool active;
GetSubjectsResponseObject(this.id, this.name, this.longName, this.alternateName, this.active);
factory GetSubjectsResponseObject.fromJson(Map<String, dynamic> json) => _$GetSubjectsResponseObjectFromJson(json);
Map<String, dynamic> toJson() => _$GetSubjectsResponseObjectToJson(this);
}

View File

@ -0,0 +1,41 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'getSubjectsResponse.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
GetSubjectsResponse _$GetSubjectsResponseFromJson(Map<String, dynamic> json) =>
GetSubjectsResponse(
(json['result'] as List<dynamic>)
.map((e) =>
GetSubjectsResponseObject.fromJson(e as Map<String, dynamic>))
.toSet(),
);
Map<String, dynamic> _$GetSubjectsResponseToJson(
GetSubjectsResponse instance) =>
<String, dynamic>{
'result': instance.result.map((e) => e.toJson()).toList(),
};
GetSubjectsResponseObject _$GetSubjectsResponseObjectFromJson(
Map<String, dynamic> json) =>
GetSubjectsResponseObject(
json['id'] as int,
json['name'] as String,
json['longName'] as String,
json['alternateName'] as String,
json['active'] as bool,
);
Map<String, dynamic> _$GetSubjectsResponseObjectToJson(
GetSubjectsResponseObject instance) =>
<String, dynamic>{
'id': instance.id,
'name': instance.name,
'longName': instance.longName,
'alternateName': instance.alternateName,
'active': instance.active,
};

View File

@ -15,7 +15,6 @@ class GetTimetable extends WebuntisApi {
@override
Future<GetTimetableResponse> run() async {
String rawAnswer = await query(this);
log(rawAnswer);
return finalize(GetTimetableResponse.fromJson(jsonDecode(rawAnswer)));
}

View File

@ -0,0 +1,40 @@
import 'dart:convert';
import 'dart:developer';
import 'package:localstore/localstore.dart';
import 'package:marianum_mobile/api/requestCache.dart';
import '../authenticate/authenticate.dart';
import 'getTimetable.dart';
import 'getTimetableParams.dart';
import 'getTimetableResponse.dart';
class GetTimetableCache extends RequestCache<GetTimetableResponse> {
int day;
GetTimetableCache({required onUpdate, required this.day}) : super(30, onUpdate) {
start("timetable", "$day");
}
@override
GetTimetableResponse onLocalData(String json) {
return GetTimetableResponse.fromJson(jsonDecode(json));
}
@override
Future<GetTimetableResponse> onLoad() async {
return GetTimetable(
GetTimetableParams(
options: GetTimetableParamsOptions(
element: GetTimetableParamsOptionsElement(
id: (await Authenticate.getSession()).personId,
type: 5,
keyType: GetTimetableParamsOptionsElementKeyType.id,
),
startDate: day,
endDate: day,
)
)
).run();
}
}

View File

@ -20,7 +20,6 @@ abstract class WebuntisApi extends ApiRequest {
Future<String> query(WebuntisApi untis) async {
String query = '{"id":"ID","method":"$method","params":${untis._body()},"jsonrpc":"2.0"}';
log(query);
String sessionId = "0";
if(authenticatedResponse) {

View File

@ -1,11 +1,11 @@
import 'package:flutter/material.dart';
import 'package:marianum_mobile/data/incommingPackets/talkNotificationsPacket.dart';
import 'package:marianum_mobile/screen/pages/timetable/storedTimetable.dart';
import 'package:marianum_mobile/screen/pages/timetable/testTimetable.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'data/accountModel.dart';
import 'dataOld/incommingPackets/talkNotificationsPacket.dart';
import 'screen/pages/files/files.dart';
import 'screen/pages/more/overhang.dart';
import 'screen/pages/talk/chatOverview.dart';
@ -43,7 +43,7 @@ class _AppState extends State<App> {
PageView(
controller: pageController,
children: const [
TestTimeTable(),
StoredTimetable(),
Talk(),
Files(),
Overhang(),

11
lib/data/dataHolder.dart Normal file
View File

@ -0,0 +1,11 @@
import 'package:flutter/cupertino.dart';
import 'package:localstore/localstore.dart';
abstract class DataHolder extends ChangeNotifier {
CollectionRef storage(String path) {
return Localstore.instance.collection(path);
}
Future<void> run();
}

View File

@ -0,0 +1,12 @@
import 'dart:async';
import 'package:flutter/widgets.dart';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
class PersistantTimetable {
final int id;
final String json;
PersistantTimetable(this.id, this.json);
}

View File

@ -0,0 +1,60 @@
import 'dart:collection';
import 'dart:convert';
import 'dart:developer';
import 'package:intl/intl.dart';
import 'package:marianum_mobile/api/webuntis/queries/authenticate/authenticate.dart';
import 'package:marianum_mobile/api/webuntis/queries/authenticate/authenticateResponse.dart';
import 'package:marianum_mobile/api/webuntis/queries/getRooms/getRoomsCache.dart';
import 'package:marianum_mobile/api/webuntis/queries/getRooms/getRoomsResponse.dart';
import 'package:marianum_mobile/api/webuntis/queries/getSubjects/getSubjectsCache.dart';
import 'package:marianum_mobile/api/webuntis/queries/getSubjects/getSubjectsResponse.dart';
import 'package:marianum_mobile/data/dataHolder.dart';
import '../../api/webuntis/queries/getTimetable/getTimetable.dart';
import '../../api/webuntis/queries/getTimetable/getTimetableCache.dart';
import '../../api/webuntis/queries/getTimetable/getTimetableParams.dart';
import '../../api/webuntis/queries/getTimetable/getTimetableResponse.dart';
class Timetable extends DataHolder {
int day = int.parse(DateFormat("yyyyMMdd").format(DateTime.now()));
Timetable() : super();
GetTimetableResponse? _getTimetableResponse;
GetTimetableResponse? get getTimetableResponse => _getTimetableResponse;
GetRoomsResponse? _getRoomsResponse;
GetRoomsResponse? get getRoomsResponse => _getRoomsResponse;
GetSubjectsResponse? _getSubjectsResponse;
GetSubjectsResponse? get getSubjectsResponse => _getSubjectsResponse;
@override
Future<void> run() async {
GetTimetableCache(
day: day,
onUpdate: (data) =>
{
_getTimetableResponse = data,
notifyListeners(),
}
);
GetRoomsCache(
onUpdate: (data) =>
{
_getRoomsResponse = data,
notifyListeners(),
}
);
GetSubjectsCache(
onUpdate: (data) =>
{
_getSubjectsResponse = data,
notifyListeners(),
}
);
}
}

View File

@ -3,7 +3,7 @@ import 'dart:convert';
import 'dart:developer';
import 'package:flutter/cupertino.dart';
import 'package:marianum_mobile/data/socketConnection.dart';
import 'package:marianum_mobile/dataOld/socketConnection.dart';
class IncomingPacket extends ChangeNotifier {

View File

@ -1,9 +1,10 @@
import 'dart:developer';
import 'package:marianum_mobile/data/incomingPacket.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../incomingPacket.dart';
class AuthenticatePacket extends IncomingPacket {
AuthenticatePacket() : super("authenticate");

View File

@ -1,4 +1,5 @@
import 'package:marianum_mobile/data/incomingPacket.dart';
import '../incomingPacket.dart';
class ErrorPacket extends IncomingPacket {
ErrorPacket() : super("error", useJsonDecode: false);

View File

@ -1,5 +1,5 @@
import 'package:marianum_mobile/data/incomingPacket.dart';
import '../incomingPacket.dart';
class FileEntry {
String name;

View File

@ -1,7 +1,6 @@
import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:marianum_mobile/data/socketConnection.dart';
import '../incomingPacket.dart';

View File

@ -1,4 +1,5 @@
import 'package:marianum_mobile/data/incomingPacket.dart';
import '../incomingPacket.dart';
class TalkMessage {
bool self;

View File

@ -2,7 +2,8 @@ import 'dart:convert';
import 'package:intl/intl.dart';
import 'package:jiffy/jiffy.dart';
import 'package:marianum_mobile/data/incomingPacket.dart';
import '../incomingPacket.dart';
class TalkContact {
String name;

View File

@ -1,4 +1,5 @@
import 'package:marianum_mobile/data/incomingPacket.dart';
import '../incomingPacket.dart';
class TalkNotificationsPacket extends IncomingPacket {
TalkNotificationsPacket() : super("talkNotifications");

View File

@ -1,7 +1,6 @@
import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:marianum_mobile/data/socketConnection.dart';
import '../incomingPacket.dart';

View File

@ -1,6 +1,7 @@
import 'dart:convert';
import 'package:marianum_mobile/data/socketConnection.dart';
import 'package:marianum_mobile/dataOld/socketConnection.dart';
class OutgoingPacket {
final String command;

View File

@ -1,4 +1,5 @@
import 'package:marianum_mobile/data/outgoingPacket.dart';
import '../outgoingPacket.dart';
class TalkContactsAskPacket extends OutgoingPacket {
TalkContactsAskPacket() : super(

View File

@ -2,23 +2,23 @@ import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:marianum_mobile/data/accountModel.dart';
import 'package:marianum_mobile/data/incommingPackets/authenticatePacket.dart';
import 'package:marianum_mobile/data/incommingPackets/errorPacket.dart';
import 'package:marianum_mobile/data/incommingPackets/fileListPacket.dart';
import 'package:marianum_mobile/data/incommingPackets/talkChatPacket.dart';
import 'package:marianum_mobile/data/incommingPackets/talkNotificationsPacket.dart';
import 'package:marianum_mobile/data/timetable/timetable.dart';
import 'package:marianum_mobile/screen/login/login.dart';
import 'package:marianum_mobile/screen/pages/timetable/timetable.dart';
import 'package:marianum_mobile/widget/loadingSpinner.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:web_socket_channel/web_socket_channel.dart';
import 'app.dart';
import 'data/incommingPackets/serverInfoPacket.dart';
import 'data/incommingPackets/talkContactsPacket.dart';
import 'data/incommingPackets/timetablePacket.dart';
import 'dataOld/accountModel.dart';
import 'dataOld/incommingPackets/authenticatePacket.dart';
import 'dataOld/incommingPackets/errorPacket.dart';
import 'dataOld/incommingPackets/fileListPacket.dart';
import 'dataOld/incommingPackets/serverInfoPacket.dart';
import 'dataOld/incommingPackets/talkChatPacket.dart';
import 'dataOld/incommingPackets/talkContactsPacket.dart';
import 'dataOld/incommingPackets/talkNotificationsPacket.dart';
import 'dataOld/incommingPackets/timetablePacket.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
@ -33,12 +33,13 @@ Future<void> main() async {
providers: [
ChangeNotifierProvider(create: (context) => AccountModel()),
ChangeNotifierProvider(create: (context) => ErrorPacket()),
ChangeNotifierProvider(create: (context) => ServerInfoPacket()),
ChangeNotifierProvider(create: (context) => TalkContactsPaket()),
// ChangeNotifierProvider(create: (context) => ServerInfoPacket()),
// ChangeNotifierProvider(create: (context) => TalkContactsPaket()),
ChangeNotifierProvider(create: (context) => TalkNotificationsPacket()),
ChangeNotifierProvider(create: (context) => FileListPacket()),
ChangeNotifierProvider(create: (context) => TalkChatPacket()),
ChangeNotifierProvider(create: (context) => TimetablePacket()),
// ChangeNotifierProvider(create: (context) => FileListPacket()),
// ChangeNotifierProvider(create: (context) => TalkChatPacket()),
// ChangeNotifierProvider(create: (context) => TimetablePacket()),
ChangeNotifierProvider(create: (context) => Timetable()),
],
child: const Main(),
)

View File

@ -11,8 +11,7 @@ import 'package:shared_preferences/shared_preferences.dart';
import '../../api/webuntis/queries/authenticate/authenticateParams.dart';
import '../../api/webuntis/queries/authenticate/authenticate.dart';
import '../../data/accountModel.dart';
import '../../dataOld/accountModel.dart';
class Login extends StatefulWidget {
const Login({Key? key}) : super(key: key);

View File

@ -1,11 +1,10 @@
import 'package:flutter/material.dart';
import 'package:marianum_mobile/data/incommingPackets/fileListPacket.dart';
import 'package:marianum_mobile/widget/loadingPacket.dart';
import 'package:provider/provider.dart';
import 'package:webdav_client/webdav_client.dart';
import '../../../data/accountModel.dart';
import '../../../dataOld/incommingPackets/fileListPacket.dart';
import '../../../widget/loadingSpinner.dart';
class Files extends StatefulWidget {

View File

@ -3,12 +3,10 @@ import 'dart:convert';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:marianum_mobile/data/outgoingPackets/talkContactsAskPacket.dart';
import 'package:marianum_mobile/widget/loadingPacket.dart';
import 'package:provider/provider.dart';
import '../../../data/accountModel.dart';
import '../../../data/incommingPackets/talkContactsPacket.dart';
import '../../../dataOld/incommingPackets/talkContactsPacket.dart';
import '../../../widget/loadingSpinner.dart';
import 'chatView.dart';

View File

@ -1,10 +1,11 @@
import 'package:bubble/bubble.dart';
import 'package:flutter/material.dart';
import 'package:marianum_mobile/data/incommingPackets/talkChatPacket.dart';
import 'package:marianum_mobile/widget/loadingPacket.dart';
import 'package:provider/provider.dart';
import '../../../dataOld/incommingPackets/talkChatPacket.dart';
class ChatView extends StatefulWidget {
final String userToken;
const ChatView({Key? key, required this.userToken}) : super(key: key);

View File

@ -0,0 +1,104 @@
import 'dart:developer';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:jiffy/jiffy.dart';
import 'package:marianum_mobile/api/webuntis/queries/getRooms/getRoomsResponse.dart';
import 'package:marianum_mobile/api/webuntis/queries/getSubjects/getSubjectsResponse.dart';
import 'package:marianum_mobile/data/timetable/timetable.dart';
import 'package:marianum_mobile/screen/pages/timetable/testTimetable.dart';
import 'package:marianum_mobile/widget/loadingSpinner.dart';
import 'package:provider/provider.dart';
import 'package:timetable_view/timetable_view.dart';
import '../../../api/webuntis/queries/getTimetable/getTimetableResponse.dart';
class StoredTimetable extends StatefulWidget {
const StoredTimetable({Key? key}) : super(key: key);
@override
State<StoredTimetable> createState() => _StoredTimetableState();
}
class _StoredTimetableState extends State<StoredTimetable> {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
Provider.of<Timetable>(context, listen: false).run();
});
}
@override
Widget build(BuildContext context) {
return Consumer<Timetable>(
builder: (context, value, child) {
if(value.getTimetableResponse == null) {
return const LoadingSpinner();
}
return TimetableView(
laneEventsList: _buildLaneEvents(value),
onEventTap: (TableEvent event) {},
timetableStyle: CustomTableStyle(context),
onEmptySlotTap: (int laneIndex, TableEventTime start, TableEventTime end) => {},
);
},
);
}
List<LaneEvents> _buildLaneEvents(Timetable data) {
List<LaneEvents> laneEvents = List<LaneEvents>.empty(growable: true);
Jiffy.locale("de"); // todo move outwards
GetTimetableResponse timetable = data.getTimetableResponse!;
GetRoomsResponse rooms = data.getRoomsResponse!;
GetSubjectsResponse subjects = data.getSubjectsResponse!;
List<int> dayList = timetable.result.map((e) => e.date).toSet().toList();
dayList.sort((a, b) => a-b);
dayList.forEach((day) {
//Every Day
laneEvents.add(
LaneEvents(
lane: Lane(
laneIndex: day,
name: "${Jiffy(day.toString()).format("dd.MM.yy")}\n${Jiffy(day.toString()).format("EEEE")}",
textStyle: TextStyle(
color: Theme.of(context).primaryColor,
fontWeight: FontWeight.bold,
fontSize: 14
)
),
events: List<TableEvent>.generate(
timetable.result.where((element) => element.date == day).length,
(index) {
GetTimetableResponseObject tableEvent = timetable.result.where((element) => element.date == day).elementAt(index);
return TableEvent(
title: subjects.result.firstWhere((subject) => subject.id == tableEvent.su[0]['id']).longName,
eventId: tableEvent.id,
laneIndex: day,
startTime: parseTime(tableEvent.startTime),
endTime: parseTime(tableEvent.endTime),
padding: const EdgeInsets.all(5),
backgroundColor: Theme.of(context).primaryColor,
location: "\n${rooms.result.firstWhere((room) => room.id == tableEvent.ro[0]['id']).name}",
);
}
)
)
);
});
return laneEvents;
}
TableEventTime parseTime(int input) {
String time = input.toString().length < 4 ? "0$input" : input.toString();
return TableEventTime(hour: int.parse(time.substring(0, 2)), minute: int.parse(time.substring(2, 4)));
}
}

View File

@ -4,7 +4,6 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:jiffy/jiffy.dart';
import 'package:marianum_mobile/api/webuntis/queries/getRooms/getRooms.dart';
import 'package:marianum_mobile/data/incommingPackets/timetablePacket.dart';
import 'package:marianum_mobile/widget/loadingSpinner.dart';
import 'package:marianum_mobile/widget/offlineError.dart';
import 'package:timetable_view/timetable_view.dart';
@ -132,14 +131,14 @@ class CustomTableStyle extends TimetableStyle {
@override
int get endHour => 17;
@override
double get laneWidth => 100;
double get laneWidth => 300;
@override
Color get cornerColor => Theme.of(context).primaryColor;
@override
Color get timeItemTextColor => Theme.of(context).primaryColor;
@override
double get timeItemHeight => 60;
double get timeItemHeight => 80;
@override
double get timeItemWidth => 40;
double get timeItemWidth => 70;
}

View File

@ -3,11 +3,12 @@ import 'dart:developer';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:marianum_mobile/data/incommingPackets/timetablePacket.dart';
import 'package:marianum_mobile/widget/loadingPacket.dart';
import 'package:provider/provider.dart';
import 'package:timetable_view/timetable_view.dart';
import '../../../dataOld/incommingPackets/timetablePacket.dart';
class Timetable extends StatefulWidget {
const Timetable({Key? key}) : super(key: key);

View File

@ -3,8 +3,8 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../data/accountModel.dart';
import '../../data/incommingPackets/serverInfoPacket.dart';
import '../../dataOld/accountModel.dart';
import '../../dataOld/incommingPackets/serverInfoPacket.dart';
import '../../widget/ListItem.dart';
class Settings extends StatefulWidget {

View File

@ -1,8 +1,9 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:marianum_mobile/data/incomingPacket.dart';
import 'package:provider/provider.dart';
import '../dataOld/incomingPacket.dart';
class LoadingPacket extends StatefulWidget {
final Widget child;
final IncomingPacket packet;

View File

@ -5,10 +5,14 @@
import FlutterMacOS
import Foundation
import path_provider_foundation
import shared_preferences_foundation
import sqflite
import url_launcher_macos
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
}

View File

@ -47,6 +47,9 @@ dependencies:
jiffy: ^5.0.0
timetable_view: ^0.3.0
json_annotation: ^4.8.0
sqflite: ^2.2.4+1
localstore: ^1.2.3
intl: ^0.17.0
dev_dependencies:
flutter_test: