From 41372e9e8603e31466e15d1ae5679fdce22fb04d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sun, 10 Mar 2024 22:03:01 +0100 Subject: [PATCH] #8 Added marker to indicate read status in talk chats --- lib/api/apiResponse.dart | 3 +++ lib/api/holidays/getHolidaysResponse.g.dart | 22 ++++++++++----- .../talk/chat/getChatResponse.g.dart | 21 +++++++++++---- .../talk/createRoom/createRoom.dart | 3 ++- .../getParticipantsResponse.dart | 3 ++- .../getParticipantsResponse.g.dart | 21 +++++++++++---- .../getReactions/getReactionsResponse.dart | 3 ++- .../getReactions/getReactionsResponse.g.dart | 23 +++++++++++----- .../talk/leaveRoom/leaveRoom.dart | 3 ++- .../talk/room/getRoomResponse.g.dart | 21 +++++++++++---- .../talk/setFavorite/setFavorite.dart | 6 +++-- .../talk/setReadMarker/setReadMarker.dart | 4 +-- lib/api/marianumcloud/talk/talkApi.dart | 4 ++- .../listFiles/listFilesResponse.g.dart | 21 +++++++++++---- .../getBreakers/getBreakersResponse.g.dart | 24 ++++++++++++----- .../getCustomTimetableEventResponse.g.dart | 21 +++++++++++---- .../getMessages/getMessagesResponse.g.dart | 24 ++++++++++++----- lib/api/requestCache.dart | 3 ++- .../authenticate/authenticateResponse.g.dart | 27 +++++++++++++------ .../getHolidays/getHolidaysResponse.g.dart | 22 ++++++++++----- .../queries/getRooms/getRoomsResponse.g.dart | 21 +++++++++++---- .../getSubjects/getSubjectsResponse.g.dart | 22 ++++++++++----- .../getTimetable/getTimetableResponse.g.dart | 21 +++++++++++---- lib/view/pages/talk/chatView.dart | 12 +++++---- .../pages/talk/components/chatBubble.dart | 23 +++++++++++++--- 25 files changed, 279 insertions(+), 99 deletions(-) diff --git a/lib/api/apiResponse.dart b/lib/api/apiResponse.dart index 7f670c5..547e286 100644 --- a/lib/api/apiResponse.dart +++ b/lib/api/apiResponse.dart @@ -3,4 +3,7 @@ import 'package:json_annotation/json_annotation.dart'; abstract class ApiResponse { @JsonKey(includeFromJson: false, includeToJson: false) late http.Response rawResponse; + + @JsonKey(includeIfNull: false) + late Map? headers; } \ No newline at end of file diff --git a/lib/api/holidays/getHolidaysResponse.g.dart b/lib/api/holidays/getHolidaysResponse.g.dart index 2960c49..3f6225e 100644 --- a/lib/api/holidays/getHolidaysResponse.g.dart +++ b/lib/api/holidays/getHolidaysResponse.g.dart @@ -12,13 +12,23 @@ GetHolidaysResponse _$GetHolidaysResponseFromJson(Map json) => .map((e) => GetHolidaysResponseObject.fromJson(e as Map)) .toList(), - ); + )..headers = (json['headers'] as Map?)?.map( + (k, e) => MapEntry(k, e as String), + ); -Map _$GetHolidaysResponseToJson( - GetHolidaysResponse instance) => - { - 'data': instance.data.map((e) => e.toJson()).toList(), - }; +Map _$GetHolidaysResponseToJson(GetHolidaysResponse instance) { + final val = {}; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('headers', instance.headers); + val['data'] = instance.data.map((e) => e.toJson()).toList(); + return val; +} GetHolidaysResponseObject _$GetHolidaysResponseObjectFromJson( Map json) => diff --git a/lib/api/marianumcloud/talk/chat/getChatResponse.g.dart b/lib/api/marianumcloud/talk/chat/getChatResponse.g.dart index 82c7102..3da4655 100644 --- a/lib/api/marianumcloud/talk/chat/getChatResponse.g.dart +++ b/lib/api/marianumcloud/talk/chat/getChatResponse.g.dart @@ -11,12 +11,23 @@ GetChatResponse _$GetChatResponseFromJson(Map json) => (json['data'] as List) .map((e) => GetChatResponseObject.fromJson(e as Map)) .toSet(), - ); + )..headers = (json['headers'] as Map?)?.map( + (k, e) => MapEntry(k, e as String), + ); -Map _$GetChatResponseToJson(GetChatResponse instance) => - { - 'data': instance.data.map((e) => e.toJson()).toList(), - }; +Map _$GetChatResponseToJson(GetChatResponse instance) { + final val = {}; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('headers', instance.headers); + val['data'] = instance.data.map((e) => e.toJson()).toList(); + return val; +} GetChatResponseObject _$GetChatResponseObjectFromJson( Map json) => diff --git a/lib/api/marianumcloud/talk/createRoom/createRoom.dart b/lib/api/marianumcloud/talk/createRoom/createRoom.dart index ae3afd1..590d395 100644 --- a/lib/api/marianumcloud/talk/createRoom/createRoom.dart +++ b/lib/api/marianumcloud/talk/createRoom/createRoom.dart @@ -4,13 +4,14 @@ import 'package:http/http.dart'; import '../talkApi.dart'; import 'createRoomParams.dart'; -class CreateRoom extends TalkApi { +class CreateRoom extends TalkApi { CreateRoomParams params; CreateRoom(this.params) : super("v4/room", params); @override assemble(String raw) { + return null; } @override diff --git a/lib/api/marianumcloud/talk/getParticipants/getParticipantsResponse.dart b/lib/api/marianumcloud/talk/getParticipants/getParticipantsResponse.dart index 2d7682c..e6f495c 100644 --- a/lib/api/marianumcloud/talk/getParticipants/getParticipantsResponse.dart +++ b/lib/api/marianumcloud/talk/getParticipants/getParticipantsResponse.dart @@ -1,10 +1,11 @@ import 'package:json_annotation/json_annotation.dart'; +import 'package:marianum_mobile/api/apiResponse.dart'; part 'getParticipantsResponse.g.dart'; @JsonSerializable(explicitToJson: true) -class GetParticipantsResponse { +class GetParticipantsResponse extends ApiResponse { Set data; GetParticipantsResponse(this.data); diff --git a/lib/api/marianumcloud/talk/getParticipants/getParticipantsResponse.g.dart b/lib/api/marianumcloud/talk/getParticipants/getParticipantsResponse.g.dart index 6dafc62..e1b3157 100644 --- a/lib/api/marianumcloud/talk/getParticipants/getParticipantsResponse.g.dart +++ b/lib/api/marianumcloud/talk/getParticipants/getParticipantsResponse.g.dart @@ -13,13 +13,24 @@ GetParticipantsResponse _$GetParticipantsResponseFromJson( .map((e) => GetParticipantsResponseObject.fromJson(e as Map)) .toSet(), - ); + )..headers = (json['headers'] as Map?)?.map( + (k, e) => MapEntry(k, e as String), + ); Map _$GetParticipantsResponseToJson( - GetParticipantsResponse instance) => - { - 'data': instance.data.map((e) => e.toJson()).toList(), - }; + GetParticipantsResponse instance) { + final val = {}; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('headers', instance.headers); + val['data'] = instance.data.map((e) => e.toJson()).toList(); + return val; +} GetParticipantsResponseObject _$GetParticipantsResponseObjectFromJson( Map json) => diff --git a/lib/api/marianumcloud/talk/getReactions/getReactionsResponse.dart b/lib/api/marianumcloud/talk/getReactions/getReactionsResponse.dart index f316a13..a2c73d6 100644 --- a/lib/api/marianumcloud/talk/getReactions/getReactionsResponse.dart +++ b/lib/api/marianumcloud/talk/getReactions/getReactionsResponse.dart @@ -1,9 +1,10 @@ import 'package:json_annotation/json_annotation.dart'; +import 'package:marianum_mobile/api/apiResponse.dart'; part 'getReactionsResponse.g.dart'; @JsonSerializable(explicitToJson: true) -class GetReactionsResponse { +class GetReactionsResponse extends ApiResponse { Map> data; GetReactionsResponse(this.data); diff --git a/lib/api/marianumcloud/talk/getReactions/getReactionsResponse.g.dart b/lib/api/marianumcloud/talk/getReactions/getReactionsResponse.g.dart index 0a122e2..c1bf0d1 100644 --- a/lib/api/marianumcloud/talk/getReactions/getReactionsResponse.g.dart +++ b/lib/api/marianumcloud/talk/getReactions/getReactionsResponse.g.dart @@ -17,14 +17,25 @@ GetReactionsResponse _$GetReactionsResponseFromJson( e as Map)) .toList()), ), - ); + )..headers = (json['headers'] as Map?)?.map( + (k, e) => MapEntry(k, e as String), + ); Map _$GetReactionsResponseToJson( - GetReactionsResponse instance) => - { - 'data': instance.data - .map((k, e) => MapEntry(k, e.map((e) => e.toJson()).toList())), - }; + GetReactionsResponse instance) { + final val = {}; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + 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( Map json) => diff --git a/lib/api/marianumcloud/talk/leaveRoom/leaveRoom.dart b/lib/api/marianumcloud/talk/leaveRoom/leaveRoom.dart index 7f22874..849d6ed 100644 --- a/lib/api/marianumcloud/talk/leaveRoom/leaveRoom.dart +++ b/lib/api/marianumcloud/talk/leaveRoom/leaveRoom.dart @@ -3,13 +3,14 @@ import 'package:http/http.dart' as http; import 'package:http/http.dart'; import '../talkApi.dart'; -class LeaveRoom extends TalkApi { +class LeaveRoom extends TalkApi { String chatToken; LeaveRoom(this.chatToken) : super("v4/room/$chatToken/participants/self", null); @override assemble(String raw) { + return null; } @override diff --git a/lib/api/marianumcloud/talk/room/getRoomResponse.g.dart b/lib/api/marianumcloud/talk/room/getRoomResponse.g.dart index 7e2243b..f4fb4f3 100644 --- a/lib/api/marianumcloud/talk/room/getRoomResponse.g.dart +++ b/lib/api/marianumcloud/talk/room/getRoomResponse.g.dart @@ -11,12 +11,23 @@ GetRoomResponse _$GetRoomResponseFromJson(Map json) => (json['data'] as List) .map((e) => GetRoomResponseObject.fromJson(e as Map)) .toSet(), - ); + )..headers = (json['headers'] as Map?)?.map( + (k, e) => MapEntry(k, e as String), + ); -Map _$GetRoomResponseToJson(GetRoomResponse instance) => - { - 'data': instance.data.map((e) => e.toJson()).toList(), - }; +Map _$GetRoomResponseToJson(GetRoomResponse instance) { + final val = {}; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('headers', instance.headers); + val['data'] = instance.data.map((e) => e.toJson()).toList(); + return val; +} GetRoomResponseObject _$GetRoomResponseObjectFromJson( Map json) => diff --git a/lib/api/marianumcloud/talk/setFavorite/setFavorite.dart b/lib/api/marianumcloud/talk/setFavorite/setFavorite.dart index 1d4d44d..3f080f9 100644 --- a/lib/api/marianumcloud/talk/setFavorite/setFavorite.dart +++ b/lib/api/marianumcloud/talk/setFavorite/setFavorite.dart @@ -4,14 +4,16 @@ import 'package:http/http.dart'; import '../talkApi.dart'; -class SetFavorite extends TalkApi { +class SetFavorite extends TalkApi { String chatToken; bool favoriteState; SetFavorite(this.chatToken, this.favoriteState) : super("v4/room/$chatToken/favorite", null); @override - assemble(String raw) {} + assemble(String raw) { + return null; + } @override Future request(Uri uri, Object? body, Map? headers) { diff --git a/lib/api/marianumcloud/talk/setReadMarker/setReadMarker.dart b/lib/api/marianumcloud/talk/setReadMarker/setReadMarker.dart index ec31cfd..f052b59 100644 --- a/lib/api/marianumcloud/talk/setReadMarker/setReadMarker.dart +++ b/lib/api/marianumcloud/talk/setReadMarker/setReadMarker.dart @@ -5,7 +5,7 @@ import 'package:http/http.dart'; import '../talkApi.dart'; import 'setReadMarkerParams.dart'; -class SetReadMarker extends TalkApi { +class SetReadMarker extends TalkApi { String chatToken; bool readState; SetReadMarkerParams? setReadMarkerParams; @@ -16,7 +16,7 @@ class SetReadMarker extends TalkApi { @override assemble(String raw) { - + return null; } @override diff --git a/lib/api/marianumcloud/talk/talkApi.dart b/lib/api/marianumcloud/talk/talkApi.dart index ec01893..233232b 100644 --- a/lib/api/marianumcloud/talk/talkApi.dart +++ b/lib/api/marianumcloud/talk/talkApi.dart @@ -1,6 +1,7 @@ import 'dart:developer'; import 'package:http/http.dart' as http; +import 'package:marianum_mobile/api/apiResponse.dart'; import '../../../model/accountData.dart'; import '../../../model/endpointData.dart'; @@ -15,7 +16,7 @@ enum TalkApiMethod { delete, } -abstract class TalkApi extends ApiRequest { +abstract class TalkApi extends ApiRequest { String path; ApiParams? body; Map? headers = {}; @@ -54,6 +55,7 @@ abstract class TalkApi extends ApiRequest { T assembled; try { assembled = assemble(data.body); + assembled?.headers = data.headers; return assembled; } catch (e) { // TODO report error diff --git a/lib/api/marianumcloud/webdav/queries/listFiles/listFilesResponse.g.dart b/lib/api/marianumcloud/webdav/queries/listFiles/listFilesResponse.g.dart index f6281c4..2c33172 100644 --- a/lib/api/marianumcloud/webdav/queries/listFiles/listFilesResponse.g.dart +++ b/lib/api/marianumcloud/webdav/queries/listFiles/listFilesResponse.g.dart @@ -11,9 +11,20 @@ ListFilesResponse _$ListFilesResponseFromJson(Map json) => (json['files'] as List) .map((e) => CacheableFile.fromJson(e as Map)) .toSet(), - ); + )..headers = (json['headers'] as Map?)?.map( + (k, e) => MapEntry(k, e as String), + ); -Map _$ListFilesResponseToJson(ListFilesResponse instance) => - { - 'files': instance.files.map((e) => e.toJson()).toList(), - }; +Map _$ListFilesResponseToJson(ListFilesResponse instance) { + final val = {}; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('headers', instance.headers); + val['files'] = instance.files.map((e) => e.toJson()).toList(); + return val; +} diff --git a/lib/api/mhsl/breaker/getBreakers/getBreakersResponse.g.dart b/lib/api/mhsl/breaker/getBreakers/getBreakersResponse.g.dart index 58c0986..38dc2d1 100644 --- a/lib/api/mhsl/breaker/getBreakers/getBreakersResponse.g.dart +++ b/lib/api/mhsl/breaker/getBreakers/getBreakersResponse.g.dart @@ -13,14 +13,24 @@ GetBreakersResponse _$GetBreakersResponseFromJson(Map json) => (k, e) => MapEntry( k, GetBreakersReponseObject.fromJson(e as Map)), ), - ); + )..headers = (json['headers'] as Map?)?.map( + (k, e) => MapEntry(k, e as String), + ); -Map _$GetBreakersResponseToJson( - GetBreakersResponse instance) => - { - 'global': instance.global.toJson(), - 'regional': instance.regional.map((k, e) => MapEntry(k, e.toJson())), - }; +Map _$GetBreakersResponseToJson(GetBreakersResponse instance) { + final val = {}; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('headers', instance.headers); + val['global'] = instance.global.toJson(); + val['regional'] = instance.regional.map((k, e) => MapEntry(k, e.toJson())); + return val; +} GetBreakersReponseObject _$GetBreakersReponseObjectFromJson( Map json) => diff --git a/lib/api/mhsl/customTimetableEvent/get/getCustomTimetableEventResponse.g.dart b/lib/api/mhsl/customTimetableEvent/get/getCustomTimetableEventResponse.g.dart index a68bbae..78bdb1b 100644 --- a/lib/api/mhsl/customTimetableEvent/get/getCustomTimetableEventResponse.g.dart +++ b/lib/api/mhsl/customTimetableEvent/get/getCustomTimetableEventResponse.g.dart @@ -12,10 +12,21 @@ GetCustomTimetableEventResponse _$GetCustomTimetableEventResponseFromJson( (json['events'] as List) .map((e) => CustomTimetableEvent.fromJson(e as Map)) .toList(), - ); + )..headers = (json['headers'] as Map?)?.map( + (k, e) => MapEntry(k, e as String), + ); Map _$GetCustomTimetableEventResponseToJson( - GetCustomTimetableEventResponse instance) => - { - 'events': instance.events, - }; + GetCustomTimetableEventResponse instance) { + final val = {}; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('headers', instance.headers); + val['events'] = instance.events; + return val; +} diff --git a/lib/api/mhsl/message/getMessages/getMessagesResponse.g.dart b/lib/api/mhsl/message/getMessages/getMessagesResponse.g.dart index 50498ba..393b020 100644 --- a/lib/api/mhsl/message/getMessages/getMessagesResponse.g.dart +++ b/lib/api/mhsl/message/getMessages/getMessagesResponse.g.dart @@ -13,14 +13,24 @@ GetMessagesResponse _$GetMessagesResponseFromJson(Map json) => .map((e) => GetMessagesResponseObject.fromJson(e as Map)) .toSet(), - ); + )..headers = (json['headers'] as Map?)?.map( + (k, e) => MapEntry(k, e as String), + ); -Map _$GetMessagesResponseToJson( - GetMessagesResponse instance) => - { - 'base': instance.base, - 'messages': instance.messages.map((e) => e.toJson()).toList(), - }; +Map _$GetMessagesResponseToJson(GetMessagesResponse instance) { + final val = {}; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('headers', instance.headers); + val['base'] = instance.base; + val['messages'] = instance.messages.map((e) => e.toJson()).toList(); + return val; +} GetMessagesResponseObject _$GetMessagesResponseObjectFromJson( Map json) => diff --git a/lib/api/requestCache.dart b/lib/api/requestCache.dart index b07ce40..8e15830 100644 --- a/lib/api/requestCache.dart +++ b/lib/api/requestCache.dart @@ -1,10 +1,11 @@ import 'dart:convert'; import 'package:localstore/localstore.dart'; +import 'package:marianum_mobile/api/apiResponse.dart'; import 'webuntis/webuntisError.dart'; -abstract class RequestCache { +abstract class RequestCache { static const int cacheNothing = 0; static const int cacheMinute = 60; static const int cacheHour = 60 * 60; diff --git a/lib/api/webuntis/queries/authenticate/authenticateResponse.g.dart b/lib/api/webuntis/queries/authenticate/authenticateResponse.g.dart index 3e53ed4..4224d4e 100644 --- a/lib/api/webuntis/queries/authenticate/authenticateResponse.g.dart +++ b/lib/api/webuntis/queries/authenticate/authenticateResponse.g.dart @@ -13,13 +13,24 @@ AuthenticateResponse _$AuthenticateResponseFromJson( json['personType'] as int, json['personId'] as int, json['klasseId'] as int, - ); + )..headers = (json['headers'] as Map?)?.map( + (k, e) => MapEntry(k, e as String), + ); Map _$AuthenticateResponseToJson( - AuthenticateResponse instance) => - { - 'sessionId': instance.sessionId, - 'personType': instance.personType, - 'personId': instance.personId, - 'klasseId': instance.klasseId, - }; + AuthenticateResponse instance) { + final val = {}; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('headers', instance.headers); + val['sessionId'] = instance.sessionId; + val['personType'] = instance.personType; + val['personId'] = instance.personId; + val['klasseId'] = instance.klasseId; + return val; +} diff --git a/lib/api/webuntis/queries/getHolidays/getHolidaysResponse.g.dart b/lib/api/webuntis/queries/getHolidays/getHolidaysResponse.g.dart index c43767f..ab150d4 100644 --- a/lib/api/webuntis/queries/getHolidays/getHolidaysResponse.g.dart +++ b/lib/api/webuntis/queries/getHolidays/getHolidaysResponse.g.dart @@ -12,13 +12,23 @@ GetHolidaysResponse _$GetHolidaysResponseFromJson(Map json) => .map((e) => GetHolidaysResponseObject.fromJson(e as Map)) .toSet(), - ); + )..headers = (json['headers'] as Map?)?.map( + (k, e) => MapEntry(k, e as String), + ); -Map _$GetHolidaysResponseToJson( - GetHolidaysResponse instance) => - { - 'result': instance.result.map((e) => e.toJson()).toList(), - }; +Map _$GetHolidaysResponseToJson(GetHolidaysResponse instance) { + final val = {}; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('headers', instance.headers); + val['result'] = instance.result.map((e) => e.toJson()).toList(); + return val; +} GetHolidaysResponseObject _$GetHolidaysResponseObjectFromJson( Map json) => diff --git a/lib/api/webuntis/queries/getRooms/getRoomsResponse.g.dart b/lib/api/webuntis/queries/getRooms/getRoomsResponse.g.dart index 7dbdf7a..5bd3060 100644 --- a/lib/api/webuntis/queries/getRooms/getRoomsResponse.g.dart +++ b/lib/api/webuntis/queries/getRooms/getRoomsResponse.g.dart @@ -12,12 +12,23 @@ GetRoomsResponse _$GetRoomsResponseFromJson(Map json) => .map( (e) => GetRoomsResponseObject.fromJson(e as Map)) .toSet(), - ); + )..headers = (json['headers'] as Map?)?.map( + (k, e) => MapEntry(k, e as String), + ); -Map _$GetRoomsResponseToJson(GetRoomsResponse instance) => - { - 'result': instance.result.map((e) => e.toJson()).toList(), - }; +Map _$GetRoomsResponseToJson(GetRoomsResponse instance) { + final val = {}; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('headers', instance.headers); + val['result'] = instance.result.map((e) => e.toJson()).toList(); + return val; +} GetRoomsResponseObject _$GetRoomsResponseObjectFromJson( Map json) => diff --git a/lib/api/webuntis/queries/getSubjects/getSubjectsResponse.g.dart b/lib/api/webuntis/queries/getSubjects/getSubjectsResponse.g.dart index 05e5626..6cfa395 100644 --- a/lib/api/webuntis/queries/getSubjects/getSubjectsResponse.g.dart +++ b/lib/api/webuntis/queries/getSubjects/getSubjectsResponse.g.dart @@ -12,13 +12,23 @@ GetSubjectsResponse _$GetSubjectsResponseFromJson(Map json) => .map((e) => GetSubjectsResponseObject.fromJson(e as Map)) .toSet(), - ); + )..headers = (json['headers'] as Map?)?.map( + (k, e) => MapEntry(k, e as String), + ); -Map _$GetSubjectsResponseToJson( - GetSubjectsResponse instance) => - { - 'result': instance.result.map((e) => e.toJson()).toList(), - }; +Map _$GetSubjectsResponseToJson(GetSubjectsResponse instance) { + final val = {}; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('headers', instance.headers); + val['result'] = instance.result.map((e) => e.toJson()).toList(); + return val; +} GetSubjectsResponseObject _$GetSubjectsResponseObjectFromJson( Map json) => diff --git a/lib/api/webuntis/queries/getTimetable/getTimetableResponse.g.dart b/lib/api/webuntis/queries/getTimetable/getTimetableResponse.g.dart index 7436b30..7e7a4e6 100644 --- a/lib/api/webuntis/queries/getTimetable/getTimetableResponse.g.dart +++ b/lib/api/webuntis/queries/getTimetable/getTimetableResponse.g.dart @@ -13,13 +13,24 @@ GetTimetableResponse _$GetTimetableResponseFromJson( .map((e) => GetTimetableResponseObject.fromJson(e as Map)) .toSet(), - ); + )..headers = (json['headers'] as Map?)?.map( + (k, e) => MapEntry(k, e as String), + ); Map _$GetTimetableResponseToJson( - GetTimetableResponse instance) => - { - 'result': instance.result.map((e) => e.toJson()).toList(), - }; + GetTimetableResponse instance) { + final val = {}; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('headers', instance.headers); + val['result'] = instance.result.map((e) => e.toJson()).toList(); + return val; +} GetTimetableResponseObject _$GetTimetableResponseObjectFromJson( Map json) => diff --git a/lib/view/pages/talk/chatView.dart b/lib/view/pages/talk/chatView.dart index 1ce1e66..370947a 100644 --- a/lib/view/pages/talk/chatView.dart +++ b/lib/view/pages/talk/chatView.dart @@ -53,6 +53,7 @@ class _ChatViewState extends State { DateTime elementDate = DateTime.fromMillisecondsSinceEpoch(element.timestamp * 1000); if(element.systemMessage.contains("reaction")) return; + int commonRead = int.parse(data.getChatResponse.headers?['x-chat-last-common-read'] ?? "0"); if(!elementDate.isSameDay(lastDate)) { lastDate = elementDate; @@ -66,11 +67,12 @@ class _ChatViewState extends State { } messages.add( ChatBubble( - context: context, - isSender: element.actorId == widget.selfId && element.messageType == GetRoomResponseObjectMessageType.comment, - bubbleData: element, - chatData: widget.room, - refetch: _query + context: context, + isSender: element.actorId == widget.selfId && element.messageType == GetRoomResponseObjectMessageType.comment, + bubbleData: element, + chatData: widget.room, + refetch: _query, + isRead: element.id <= commonRead, ) ); }); diff --git a/lib/view/pages/talk/components/chatBubble.dart b/lib/view/pages/talk/components/chatBubble.dart index 1393c0a..9f94aec 100644 --- a/lib/view/pages/talk/components/chatBubble.dart +++ b/lib/view/pages/talk/components/chatBubble.dart @@ -27,6 +27,11 @@ class ChatBubble extends StatefulWidget { final bool isSender; final GetChatResponseObject bubbleData; final GetRoomResponseObject chatData; + final bool isRead; + + final double spacing = 3; + final double timeIconSize = 11; + final Color timeIconColor = Colors.grey; final void Function({bool renew}) refetch; @@ -36,6 +41,7 @@ class ChatBubble extends StatefulWidget { required this.bubbleData, required this.chatData, required this.refetch, + this.isRead = false, super.key}); @override @@ -110,7 +116,7 @@ class _ChatBubbleState extends State { Text timeText = Text( Jiffy.parseFromMillisecondsSinceEpoch(widget.bubbleData.timestamp * 1000).format(pattern: "HH:mm"), textAlign: TextAlign.end, - style: const TextStyle(color: Colors.grey, fontSize: 12), + style: TextStyle(color: widget.timeIconColor, fontSize: widget.timeIconSize), ); return Column( @@ -128,7 +134,7 @@ class _ChatBubbleState extends State { maxWidth: MediaQuery.of(context).size.width * 0.9, minWidth: showActorDisplayName ? actorText.size.width - : timeText.size.width, + : timeText.size.width + (widget.isSender ? widget.spacing + widget.timeIconSize : 0) + 3, ), child: Stack( children: [ @@ -149,7 +155,18 @@ class _ChatBubbleState extends State { child: Positioned( bottom: 0, right: 0, - child: timeText + child: Row( + children: [ + timeText, + if(widget.isSender) ...[ + SizedBox(width: widget.spacing), + if(widget.isRead) + Icon(Icons.done_all_outlined, size: widget.timeIconSize, color: widget.timeIconColor) + else + Icon(Icons.done_outlined, size: widget.timeIconSize, color: widget.timeIconColor) + ] + ], + ) ), ), Visibility(