Added emergency remote breakers
This commit is contained in:
parent
ddae68825c
commit
86c3a397da
lib
api
app.dartmain.dartmodel/breakers
view
@ -20,7 +20,7 @@ CacheableFile _$CacheableFileFromJson(Map<String, dynamic> json) =>
|
|||||||
modifiedAt: json['modifiedAt'] == null
|
modifiedAt: json['modifiedAt'] == null
|
||||||
? null
|
? null
|
||||||
: DateTime.parse(json['modifiedAt'] as String),
|
: DateTime.parse(json['modifiedAt'] as String),
|
||||||
);
|
)..sort = json['sort'] as String?;
|
||||||
|
|
||||||
Map<String, dynamic> _$CacheableFileToJson(CacheableFile instance) =>
|
Map<String, dynamic> _$CacheableFileToJson(CacheableFile instance) =>
|
||||||
<String, dynamic>{
|
<String, dynamic>{
|
||||||
@ -32,4 +32,5 @@ Map<String, dynamic> _$CacheableFileToJson(CacheableFile instance) =>
|
|||||||
'eTag': instance.eTag,
|
'eTag': instance.eTag,
|
||||||
'createdAt': instance.createdAt?.toIso8601String(),
|
'createdAt': instance.createdAt?.toIso8601String(),
|
||||||
'modifiedAt': instance.modifiedAt?.toIso8601String(),
|
'modifiedAt': instance.modifiedAt?.toIso8601String(),
|
||||||
|
'sort': instance.sort,
|
||||||
};
|
};
|
||||||
|
21
lib/api/mhsl/breaker/getBreakers/getBreakers.dart
Normal file
21
lib/api/mhsl/breaker/getBreakers/getBreakers.dart
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
import 'package:http/http.dart' as http;
|
||||||
|
import 'package:http/http.dart';
|
||||||
|
|
||||||
|
import '../../mhslApi.dart';
|
||||||
|
import 'getBreakersResponse.dart';
|
||||||
|
|
||||||
|
class GetBreakers extends MhslApi<GetBreakersResponse> {
|
||||||
|
GetBreakers() : super("breaker/");
|
||||||
|
|
||||||
|
@override
|
||||||
|
GetBreakersResponse assemble(String raw) {
|
||||||
|
return GetBreakersResponse.fromJson(jsonDecode(raw));
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<Response>? request(Uri uri) {
|
||||||
|
return http.get(uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
21
lib/api/mhsl/breaker/getBreakers/getBreakersCache.dart
Normal file
21
lib/api/mhsl/breaker/getBreakers/getBreakersCache.dart
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
import '../../../requestCache.dart';
|
||||||
|
import 'getBreakers.dart';
|
||||||
|
import 'getBreakersResponse.dart';
|
||||||
|
|
||||||
|
|
||||||
|
class GetBreakersCache extends RequestCache<GetBreakersResponse> {
|
||||||
|
GetBreakersCache({onUpdate, renew}) : super(RequestCache.cacheMinute, onUpdate, renew: renew) {
|
||||||
|
start("MarianumMobile", "breakers");
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
GetBreakersResponse onLocalData(String json) {
|
||||||
|
return GetBreakersResponse.fromJson(jsonDecode(json));
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<GetBreakersResponse> onLoad() {
|
||||||
|
return GetBreakers().run();
|
||||||
|
}
|
||||||
|
}
|
36
lib/api/mhsl/breaker/getBreakers/getBreakersResponse.dart
Normal file
36
lib/api/mhsl/breaker/getBreakers/getBreakersResponse.dart
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
|
||||||
|
import 'package:json_annotation/json_annotation.dart';
|
||||||
|
|
||||||
|
import '../../../apiResponse.dart';
|
||||||
|
|
||||||
|
part 'getBreakersResponse.g.dart';
|
||||||
|
|
||||||
|
@JsonSerializable(explicitToJson: true)
|
||||||
|
class GetBreakersResponse extends ApiResponse {
|
||||||
|
GetBreakersReponseObject global;
|
||||||
|
Map<String, GetBreakersReponseObject> regional;
|
||||||
|
|
||||||
|
GetBreakersResponse(this.global, this.regional);
|
||||||
|
|
||||||
|
factory GetBreakersResponse.fromJson(Map<String, dynamic> json) => _$GetBreakersResponseFromJson(json);
|
||||||
|
Map<String, dynamic> toJson() => _$GetBreakersResponseToJson(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonSerializable()
|
||||||
|
class GetBreakersReponseObject {
|
||||||
|
List<BreakerArea> areas;
|
||||||
|
String message;
|
||||||
|
|
||||||
|
GetBreakersReponseObject(this.areas, this.message);
|
||||||
|
|
||||||
|
factory GetBreakersReponseObject.fromJson(Map<String, dynamic> json) => _$GetBreakersReponseObjectFromJson(json);
|
||||||
|
Map<String, dynamic> toJson() => _$GetBreakersReponseObjectToJson(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
enum BreakerArea {
|
||||||
|
@JsonValue("GLOBAL") global,
|
||||||
|
@JsonValue("TIMETABLE") timetable,
|
||||||
|
@JsonValue("TALK") talk,
|
||||||
|
@JsonValue("FILES") files,
|
||||||
|
@JsonValue("MORE") more,
|
||||||
|
}
|
47
lib/api/mhsl/breaker/getBreakers/getBreakersResponse.g.dart
Normal file
47
lib/api/mhsl/breaker/getBreakers/getBreakersResponse.g.dart
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
part of 'getBreakersResponse.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// JsonSerializableGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
GetBreakersResponse _$GetBreakersResponseFromJson(Map<String, dynamic> json) =>
|
||||||
|
GetBreakersResponse(
|
||||||
|
GetBreakersReponseObject.fromJson(json['global'] as Map<String, dynamic>),
|
||||||
|
(json['regional'] as Map<String, dynamic>).map(
|
||||||
|
(k, e) => MapEntry(
|
||||||
|
k, GetBreakersReponseObject.fromJson(e as Map<String, dynamic>)),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$GetBreakersResponseToJson(
|
||||||
|
GetBreakersResponse instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'global': instance.global.toJson(),
|
||||||
|
'regional': instance.regional.map((k, e) => MapEntry(k, e.toJson())),
|
||||||
|
};
|
||||||
|
|
||||||
|
GetBreakersReponseObject _$GetBreakersReponseObjectFromJson(
|
||||||
|
Map<String, dynamic> json) =>
|
||||||
|
GetBreakersReponseObject(
|
||||||
|
(json['areas'] as List<dynamic>)
|
||||||
|
.map((e) => $enumDecode(_$BreakerAreaEnumMap, e))
|
||||||
|
.toList(),
|
||||||
|
json['message'] as String,
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$GetBreakersReponseObjectToJson(
|
||||||
|
GetBreakersReponseObject instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'areas': instance.areas.map((e) => _$BreakerAreaEnumMap[e]!).toList(),
|
||||||
|
'message': instance.message,
|
||||||
|
};
|
||||||
|
|
||||||
|
const _$BreakerAreaEnumMap = {
|
||||||
|
BreakerArea.global: 'GLOBAL',
|
||||||
|
BreakerArea.timetable: 'TIMETABLE',
|
||||||
|
BreakerArea.talk: 'TALK',
|
||||||
|
BreakerArea.files: 'FILES',
|
||||||
|
BreakerArea.more: 'MORE',
|
||||||
|
};
|
@ -2,10 +2,12 @@ import 'dart:convert';
|
|||||||
|
|
||||||
import 'package:http/http.dart' as http;
|
import 'package:http/http.dart' as http;
|
||||||
|
|
||||||
import '../messageApi.dart';
|
import '../../mhslApi.dart';
|
||||||
import 'getMessagesResponse.dart';
|
import 'getMessagesResponse.dart';
|
||||||
|
|
||||||
class GetMessages extends MessageApi<GetMessagesResponse> {
|
class GetMessages extends MhslApi<GetMessagesResponse> {
|
||||||
|
GetMessages() : super("message/messages.json");
|
||||||
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
GetMessagesResponse assemble(String raw) {
|
GetMessagesResponse assemble(String raw) {
|
||||||
|
@ -1,18 +1,20 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:http/http.dart' as http;
|
import 'package:http/http.dart' as http;
|
||||||
import '../../apiError.dart';
|
import '../apiError.dart';
|
||||||
import '../../apiRequest.dart';
|
import '../apiRequest.dart';
|
||||||
|
|
||||||
|
abstract class MhslApi<T> extends ApiRequest {
|
||||||
|
String subpath;
|
||||||
|
MhslApi(this.subpath);
|
||||||
|
|
||||||
abstract class MessageApi<T> extends ApiRequest {
|
|
||||||
String path = "https://mhsl.eu/marianum/marianummobile/message/messages.json";
|
|
||||||
http.Response? response;
|
http.Response? response;
|
||||||
|
|
||||||
Future<http.Response>? request(Uri uri);
|
Future<http.Response>? request(Uri uri);
|
||||||
T assemble(String raw);
|
T assemble(String raw);
|
||||||
|
|
||||||
Future<T> run() async {
|
Future<T> run() async {
|
||||||
Uri endpoint = Uri.parse(path);
|
Uri endpoint = Uri.parse("https://mhsl.eu/marianum/marianummobile/$subpath");
|
||||||
|
|
||||||
http.Response? data = await request(endpoint);
|
http.Response? data = await request(endpoint);
|
||||||
if(data == null) {
|
if(data == null) {
|
21
lib/app.dart
21
lib/app.dart
@ -6,6 +6,9 @@ import 'package:persistent_bottom_nav_bar/persistent_tab_view.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;
|
||||||
|
|
||||||
|
import 'api/mhsl/breaker/getBreakers/getBreakersResponse.dart';
|
||||||
|
import 'model/breakers/Breaker.dart';
|
||||||
|
import 'model/breakers/BreakerProps.dart';
|
||||||
import 'model/chatList/chatListProps.dart';
|
import 'model/chatList/chatListProps.dart';
|
||||||
import 'view/pages/files/files.dart';
|
import 'view/pages/files/files.dart';
|
||||||
import 'view/pages/more/overhang.dart';
|
import 'view/pages/more/overhang.dart';
|
||||||
@ -27,14 +30,16 @@ class _AppState extends State<App> {
|
|||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
|
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
|
||||||
|
Provider.of<BreakerProps>(context, listen: false).run();
|
||||||
Provider.of<ChatListProps>(context, listen: false).run();
|
Provider.of<ChatListProps>(context, listen: false).run();
|
||||||
});
|
});
|
||||||
|
|
||||||
updateTimings = Timer.periodic(const Duration(seconds: 30), (Timer t) => setState((){}));
|
updateTimings = Timer.periodic(const Duration(seconds: 30), (Timer t) => setState((){}));
|
||||||
|
|
||||||
refetchChats = Timer.periodic(const Duration(minutes: 1), (timer) {
|
refetchChats = Timer.periodic(const Duration(seconds: 60), (timer) {
|
||||||
if(!context.mounted) return;
|
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
|
||||||
Provider.of<ChatListProps>(context, listen: false).run();
|
Provider.of<ChatListProps>(context, listen: false).run();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
super.initState();
|
super.initState();
|
||||||
@ -53,11 +58,11 @@ class _AppState extends State<App> {
|
|||||||
border: Border.symmetric(vertical: BorderSide.none, horizontal: BorderSide(color: Colors.grey, width: 1))
|
border: Border.symmetric(vertical: BorderSide.none, horizontal: BorderSide(color: Colors.grey, width: 1))
|
||||||
),
|
),
|
||||||
screenTransitionAnimation: const ScreenTransitionAnimation(animateTabTransition: false, curve: Curves.ease, duration: Duration(milliseconds: 200)),
|
screenTransitionAnimation: const ScreenTransitionAnimation(animateTabTransition: false, curve: Curves.ease, duration: Duration(milliseconds: 200)),
|
||||||
screens: const [
|
screens: [
|
||||||
Timetable(),
|
Breaker(breaker: BreakerArea.timetable, child: Timetable()),
|
||||||
ChatList(),
|
Breaker(breaker: BreakerArea.talk, child: ChatList()),
|
||||||
Files([]),
|
Breaker(breaker: BreakerArea.files, child: Files([])),
|
||||||
Overhang(),
|
Breaker(breaker: BreakerArea.more, child: Overhang()),
|
||||||
],
|
],
|
||||||
items: [
|
items: [
|
||||||
PersistentBottomNavBarItem(
|
PersistentBottomNavBarItem(
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import 'dart:async';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
@ -6,9 +7,12 @@ import 'package:jiffy/jiffy.dart';
|
|||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:flutter_localizations/flutter_localizations.dart';
|
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||||
|
|
||||||
|
import 'api/mhsl/breaker/getBreakers/getBreakersResponse.dart';
|
||||||
import 'app.dart';
|
import 'app.dart';
|
||||||
import 'model/accountData.dart';
|
import 'model/accountData.dart';
|
||||||
import 'model/accountModel.dart';
|
import 'model/accountModel.dart';
|
||||||
|
import 'model/breakers/Breaker.dart';
|
||||||
|
import 'model/breakers/BreakerProps.dart';
|
||||||
import 'model/chatList/chatListProps.dart';
|
import 'model/chatList/chatListProps.dart';
|
||||||
import 'model/chatList/chatProps.dart';
|
import 'model/chatList/chatProps.dart';
|
||||||
import 'model/files/filesProps.dart';
|
import 'model/files/filesProps.dart';
|
||||||
@ -34,6 +38,8 @@ Future<void> main() async {
|
|||||||
runApp(
|
runApp(
|
||||||
MultiProvider(
|
MultiProvider(
|
||||||
providers: [
|
providers: [
|
||||||
|
ChangeNotifierProvider(create: (context) => BreakerProps()),
|
||||||
|
|
||||||
ChangeNotifierProvider(create: (context) => SettingsProvider()),
|
ChangeNotifierProvider(create: (context) => SettingsProvider()),
|
||||||
ChangeNotifierProvider(create: (context) => AccountModel()),
|
ChangeNotifierProvider(create: (context) => AccountModel()),
|
||||||
|
|
||||||
@ -58,6 +64,8 @@ class Main extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _MainState extends State<Main> {
|
class _MainState extends State<Main> {
|
||||||
|
late Timer refetchProps;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
Jiffy.setLocale("de");
|
Jiffy.setLocale("de");
|
||||||
@ -67,6 +75,10 @@ class _MainState extends State<Main> {
|
|||||||
.setState(value ? AccountModelState.loggedIn : AccountModelState.loggedOut);
|
.setState(value ? AccountModelState.loggedIn : AccountModelState.loggedOut);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
refetchProps = Timer.periodic(const Duration(seconds: 60), (timer) {
|
||||||
|
Provider.of<BreakerProps>(context, listen: false).run();
|
||||||
|
});
|
||||||
|
|
||||||
super.initState();
|
super.initState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,18 +105,27 @@ class _MainState extends State<Main> {
|
|||||||
themeMode: settings.val().appTheme,
|
themeMode: settings.val().appTheme,
|
||||||
theme: LightAppTheme.theme,
|
theme: LightAppTheme.theme,
|
||||||
darkTheme: DarkAppTheme.theme,
|
darkTheme: DarkAppTheme.theme,
|
||||||
home: Consumer<AccountModel>(
|
home: Breaker(
|
||||||
builder: (context, accountModel, child) {
|
breaker: BreakerArea.global,
|
||||||
switch(accountModel.state) {
|
child: Consumer<AccountModel>(
|
||||||
case AccountModelState.loggedIn: return const App();
|
builder: (context, accountModel, child) {
|
||||||
case AccountModelState.loggedOut: return const Login();
|
switch(accountModel.state) {
|
||||||
case AccountModelState.undefined: return const PlaceholderView(icon: Icons.timer, text: "Daten werden geladen");
|
case AccountModelState.loggedIn: return const App();
|
||||||
}
|
case AccountModelState.loggedOut: return const Login();
|
||||||
},
|
case AccountModelState.undefined: return const PlaceholderView(icon: Icons.timer, text: "Daten werden geladen");
|
||||||
),
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
)
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
refetchProps.cancel();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
34
lib/model/breakers/Breaker.dart
Normal file
34
lib/model/breakers/Breaker.dart
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
import '../../api/mhsl/breaker/getBreakers/getBreakersResponse.dart';
|
||||||
|
import '../../widget/placeholderView.dart';
|
||||||
|
import 'BreakerProps.dart';
|
||||||
|
|
||||||
|
|
||||||
|
class Breaker extends StatefulWidget {
|
||||||
|
final BreakerArea breaker;
|
||||||
|
final Widget child;
|
||||||
|
|
||||||
|
const Breaker({required this.breaker, required this.child, super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<Breaker> createState() => _BreakerState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _BreakerState extends State<Breaker> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Consumer<BreakerProps>(
|
||||||
|
builder: (context, value, child) {
|
||||||
|
String? blocked = value.isBlocked(widget.breaker);
|
||||||
|
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 widget.child;
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
51
lib/model/breakers/BreakerProps.dart
Normal file
51
lib/model/breakers/BreakerProps.dart
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
import 'package:package_info/package_info.dart';
|
||||||
|
|
||||||
|
import '../../api/apiResponse.dart';
|
||||||
|
import '../../api/mhsl/breaker/getBreakers/getBreakersCache.dart';
|
||||||
|
import '../../api/mhsl/breaker/getBreakers/getBreakersResponse.dart';
|
||||||
|
import '../dataHolder.dart';
|
||||||
|
|
||||||
|
class BreakerProps extends DataHolder {
|
||||||
|
GetBreakersResponse? _getBreakersResponse;
|
||||||
|
GetBreakersResponse get getBreakersResponse => _getBreakersResponse!;
|
||||||
|
|
||||||
|
PackageInfo? packageInfo;
|
||||||
|
|
||||||
|
String? isBlocked(BreakerArea? type) {
|
||||||
|
if(packageInfo == null) {
|
||||||
|
PackageInfo.fromPlatform().then((value) => packageInfo = value);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(primaryLoading()) return null;
|
||||||
|
GetBreakersResponse breakers = _getBreakersResponse!;
|
||||||
|
|
||||||
|
if(breakers.global.areas.contains(type)) return breakers.global.message;
|
||||||
|
|
||||||
|
int selfVersion = int.parse(packageInfo!.buildNumber);
|
||||||
|
for(var key in breakers.regional.keys) {
|
||||||
|
GetBreakersReponseObject value = breakers.regional[key]!;
|
||||||
|
|
||||||
|
if(int.parse(key.split("b")[1]) >= selfVersion) {
|
||||||
|
if(value.areas.contains(type)) return value.message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<ApiResponse?> properties() {
|
||||||
|
return [_getBreakersResponse];
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void run() {
|
||||||
|
GetBreakersCache(
|
||||||
|
onUpdate: (GetBreakersResponse getBreakersResponse) {
|
||||||
|
_getBreakersResponse = getBreakersResponse;
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -3,10 +3,10 @@ import 'dart:developer';
|
|||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_login/flutter_login.dart';
|
import 'package:flutter_login/flutter_login.dart';
|
||||||
import 'package:marianum_mobile/api/marianumcloud/talk/room/getRoom.dart';
|
|
||||||
import 'package:marianum_mobile/api/marianumcloud/talk/room/getRoomParams.dart';
|
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
import '../../api/marianumcloud/talk/room/getRoom.dart';
|
||||||
|
import '../../api/marianumcloud/talk/room/getRoomParams.dart';
|
||||||
import '../../model/accountData.dart';
|
import '../../model/accountData.dart';
|
||||||
import '../../model/accountModel.dart';
|
import '../../model/accountModel.dart';
|
||||||
|
|
||||||
|
@ -2,12 +2,12 @@
|
|||||||
import 'package:cached_network_image/cached_network_image.dart';
|
import 'package:cached_network_image/cached_network_image.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_linkify/flutter_linkify.dart';
|
import 'package:flutter_linkify/flutter_linkify.dart';
|
||||||
import 'package:marianum_mobile/model/endpointData.dart';
|
|
||||||
import 'package:url_launcher/url_launcher_string.dart';
|
import 'package:url_launcher/url_launcher_string.dart';
|
||||||
|
|
||||||
import '../../../api/marianumcloud/talk/chat/getChatResponse.dart';
|
import '../../../api/marianumcloud/talk/chat/getChatResponse.dart';
|
||||||
import '../../../api/marianumcloud/talk/chat/richObjectStringProcessor.dart';
|
import '../../../api/marianumcloud/talk/chat/richObjectStringProcessor.dart';
|
||||||
import '../../../model/accountData.dart';
|
import '../../../model/accountData.dart';
|
||||||
|
import '../../../model/endpointData.dart';
|
||||||
|
|
||||||
class ChatMessage {
|
class ChatMessage {
|
||||||
String originalMessage;
|
String originalMessage;
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:jiffy/jiffy.dart';
|
import 'package:jiffy/jiffy.dart';
|
||||||
import 'package:marianum_mobile/model/endpointData.dart';
|
|
||||||
import 'package:persistent_bottom_nav_bar/persistent_tab_view.dart';
|
import 'package:persistent_bottom_nav_bar/persistent_tab_view.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
|
||||||
@ -10,6 +9,7 @@ import '../../../api/marianumcloud/talk/room/getRoomResponse.dart';
|
|||||||
import '../../../api/marianumcloud/talk/setFavorite/setFavorite.dart';
|
import '../../../api/marianumcloud/talk/setFavorite/setFavorite.dart';
|
||||||
import '../../../api/marianumcloud/talk/setReadMarker/setReadMarker.dart';
|
import '../../../api/marianumcloud/talk/setReadMarker/setReadMarker.dart';
|
||||||
import '../../../api/marianumcloud/talk/setReadMarker/setReadMarkerParams.dart';
|
import '../../../api/marianumcloud/talk/setReadMarker/setReadMarkerParams.dart';
|
||||||
|
import '../../../model/endpointData.dart';
|
||||||
import '../../../widget/confirmDialog.dart';
|
import '../../../widget/confirmDialog.dart';
|
||||||
import '../../../widget/debug/debugTile.dart';
|
import '../../../widget/debug/debugTile.dart';
|
||||||
import 'chatView.dart';
|
import 'chatView.dart';
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
|
|
||||||
import 'package:async/async.dart';
|
import 'package:async/async.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:marianum_mobile/model/endpointData.dart';
|
|
||||||
|
|
||||||
import '../../../api/marianumcloud/autocomplete/autocompleteApi.dart';
|
import '../../../api/marianumcloud/autocomplete/autocompleteApi.dart';
|
||||||
import '../../../api/marianumcloud/autocomplete/autocompleteResponse.dart';
|
import '../../../api/marianumcloud/autocomplete/autocompleteResponse.dart';
|
||||||
|
import '../../../model/endpointData.dart';
|
||||||
import '../../../widget/placeholderView.dart';
|
import '../../../widget/placeholderView.dart';
|
||||||
|
|
||||||
class JoinChat extends SearchDelegate<String> {
|
class JoinChat extends SearchDelegate<String> {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user