fist commit ftc staff app clone
This commit is contained in:
116
lib/controllers/home/dashboard_screen_controller.dart
Normal file
116
lib/controllers/home/dashboard_screen_controller.dart
Normal file
@@ -0,0 +1,116 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:ftc_mobile_app/models/profile_screen_model.dart';
|
||||
import 'package:ftc_mobile_app/models/rota/LiveRoasterResponseData.dart';
|
||||
import 'package:ftc_mobile_app/models/rota/WeekArrayData.dart';
|
||||
import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import '../../ftc_mobile_app.dart';
|
||||
|
||||
class DashboardScreenController extends GetxController {
|
||||
static DashboardScreenController get instance =>
|
||||
Get.find<DashboardScreenController>();
|
||||
|
||||
final GlobalKey<ScaffoldState> screenKey = GlobalKey<ScaffoldState>();
|
||||
|
||||
final selectedIndex = 1.obs;
|
||||
final myShiftsList = RxList<DaysArrayData>();
|
||||
final ongoingShift = Rx<DaysArrayData?>(null);
|
||||
final myProfileData = Rx<StaffMembers?>(null);
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
_initOngoingShift();
|
||||
super.onInit();
|
||||
}
|
||||
|
||||
@override
|
||||
void onReady() {
|
||||
getProfileDetail();
|
||||
getMyShifts();
|
||||
super.onReady();
|
||||
}
|
||||
|
||||
void removeFocus() {
|
||||
FocusScope.of(screenKey.currentContext!).unfocus();
|
||||
}
|
||||
|
||||
_initOngoingShift() {
|
||||
final shift = LocalStorageManager.getOngoingShift();
|
||||
|
||||
if (shift != null) {
|
||||
//meaning shift expired already
|
||||
if (shift.endTime != null && shift.endTime!.isBefore(TimeOfDay.now())) {
|
||||
LocalStorageManager.removeOngoingShift();
|
||||
} else {
|
||||
ongoingShift.value = shift;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
getProfileDetail() async {
|
||||
final resp = await ClientService().getUserDetails();
|
||||
|
||||
if (resp is ProfileDataModel) {
|
||||
myProfileData.value = resp.data?.staffMembers?.firstOrNull;
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> getMyShifts() async {
|
||||
var response = await RotaService().getMyShifts(
|
||||
startDateMills: DateTime.now().subtract(30.days).millisecondsSinceEpoch,
|
||||
endDateMills: DateTime.now().add(30.days).millisecondsSinceEpoch);
|
||||
if (response is LiveRoasterResponseData) {
|
||||
response.daysArray = (response.daysArray.isNullOrEmpty())
|
||||
? []
|
||||
: (response.daysArray!
|
||||
..sort((a, b) => a.shiftDate!.compareTo(b.shiftDate!)));
|
||||
|
||||
List<DaysArrayData> todayAndFutureShifts = [];
|
||||
|
||||
//Extracting today's and future shifts
|
||||
for (final shift in response.daysArray!) {
|
||||
if (shift.shiftDateTime == null ||
|
||||
shift.startTime == null ||
|
||||
shift.endTime == null) {
|
||||
debugPrint(
|
||||
"shiftId: ${shift.id} has missing shiftDateTime or startTime or endTime. Please check");
|
||||
return;
|
||||
}
|
||||
|
||||
//Note: matching only date, month, year
|
||||
final isTodayShift =
|
||||
DateFormatter.dateFormatter.format(shift.shiftDateTime!) ==
|
||||
DateFormatter.dateFormatter.format(DateTime.now());
|
||||
|
||||
final isFutureShift = shift.shiftDateTime!.isAfter(DateTime.now());
|
||||
|
||||
if (isTodayShift) {
|
||||
//checking and adding today's not expired shift
|
||||
|
||||
// shift not expired yet
|
||||
if (shift.endTime!.isAfter(TimeOfDay.now())) {
|
||||
todayAndFutureShifts.add(shift);
|
||||
|
||||
if (ongoingShift() == null) {
|
||||
LocalStorageManager.saveShiftData(data: shift);
|
||||
ongoingShift.value = shift;
|
||||
}
|
||||
}
|
||||
} else if (isFutureShift) {
|
||||
todayAndFutureShifts.add(shift);
|
||||
}
|
||||
}
|
||||
|
||||
myShiftsList.value = todayAndFutureShifts.take(2).toList();
|
||||
} else if (response is String && response.isNotEmpty) {
|
||||
FrequentFunctions.showToast(message: response);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
Get.delete<DashboardScreenController>();
|
||||
super.dispose();
|
||||
}
|
||||
}
|
||||
3
lib/controllers/home/export_home_controllers.dart
Normal file
3
lib/controllers/home/export_home_controllers.dart
Normal file
@@ -0,0 +1,3 @@
|
||||
export 'dashboard_screen_controller.dart';
|
||||
export '../../view/screens/chat/controller/chat_screen_controller.dart';
|
||||
export 'inbox_screen_controller.dart';
|
||||
156
lib/controllers/home/inbox_screen_controller.dart
Normal file
156
lib/controllers/home/inbox_screen_controller.dart
Normal file
@@ -0,0 +1,156 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:ftc_mobile_app/models/chat/combined_last_messages_model_class.dart';
|
||||
import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart';
|
||||
import 'package:ftc_mobile_app/view/screens/chat/arguments/group_data_args.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart';
|
||||
import '../../ftc_mobile_app.dart';
|
||||
import '../../web_services/chat_services.dart';
|
||||
|
||||
class InboxScreenController extends GetxController {
|
||||
final GlobalKey<ScaffoldState> screenKey = GlobalKey<ScaffoldState>();
|
||||
|
||||
// CombinedMessageModel combinedMessageModel = CombinedMessageModel.empty();
|
||||
final String privacyPolicy =
|
||||
"A quick preview of the text will be shown here. A quick preview of the text will be shown here. shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here.\n shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here.\n shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here. A quick preview of the text will be shown here.";
|
||||
|
||||
final checkBoxValue = false.obs;
|
||||
final chatsAndGroups = RxList<MessagesListModel>();
|
||||
|
||||
// final sortedChatsAndGroups = RxList<MessagesListModel>();
|
||||
|
||||
final canLoadMore = RxBool(false);
|
||||
final onFirstMessageSend = false.obs;
|
||||
|
||||
// late IO.Socket socket;
|
||||
// final int _limit = 20;
|
||||
// int _skip = 0;
|
||||
bool loadingMore = false;
|
||||
|
||||
final _listRC = RefreshController(initialRefresh: false);
|
||||
|
||||
RefreshController get listRC => _listRC;
|
||||
|
||||
final _listSC = ScrollController();
|
||||
|
||||
ScrollController get listSC => _listSC;
|
||||
String myId = "";
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
//Getting my ID
|
||||
// String userJson = LocalStorageManager.getSessionToken(
|
||||
// tokenKey: LocalStorageKeys.kUserModelKey,
|
||||
// );
|
||||
// UserModel userModel = UserModel.fromJson(json.decode(userJson));
|
||||
myId = LocalStorageManager.userId;
|
||||
|
||||
onFirstMessageSend.listen((isTrue) {
|
||||
if (isTrue) {
|
||||
onFirstMessageSend(false);
|
||||
getChatsAndGroupsList();
|
||||
}
|
||||
});
|
||||
super.onInit();
|
||||
}
|
||||
|
||||
@override
|
||||
void onReady() {
|
||||
// connect();
|
||||
getChatsAndGroupsList();
|
||||
super.onReady();
|
||||
}
|
||||
|
||||
void onBackButtonPressed() {
|
||||
Get.delete<InboxScreenController>();
|
||||
Navigator.pop(screenKey.currentState!.context);
|
||||
}
|
||||
|
||||
// void showPrivacyDialog() {
|
||||
// showDialog(
|
||||
// context: screenKey.currentState!.context,
|
||||
// builder: (BuildContext context) {
|
||||
// return PrivacyPolicyDialog(
|
||||
// privacyPolicy: privacyPolicy,
|
||||
// checkBoxOnChange: (value) {
|
||||
// checkBoxValue.value = value;
|
||||
// },
|
||||
// );
|
||||
// },
|
||||
// );
|
||||
// }
|
||||
|
||||
void onRefresh() async {
|
||||
await getChatsAndGroupsList();
|
||||
_listRC.refreshCompleted();
|
||||
}
|
||||
|
||||
void onLoading() async {
|
||||
// if (!loadingMore) {
|
||||
// await _loadMore();
|
||||
// }
|
||||
|
||||
_listRC.loadComplete();
|
||||
}
|
||||
|
||||
void removeFocus() {
|
||||
FocusScope.of(screenKey.currentContext!).unfocus();
|
||||
}
|
||||
|
||||
Future getChatsAndGroupsList() async {
|
||||
final resp =
|
||||
await ChatService().combinedLastMessage(userId: myId).showLoader();
|
||||
|
||||
if (resp is CombinedMessageModel) {
|
||||
List<MessagesListModel> messages = [];
|
||||
//Private Messages transform
|
||||
for (final e in resp.personalMessage) {
|
||||
messages.add(
|
||||
MessagesListModel(
|
||||
otherUserId: (e.senderId == myId) ? e.recieverId : e.senderId,
|
||||
image: e.image,
|
||||
title: e.name,
|
||||
previewOfLastMessage: e.message,
|
||||
messageType: e.messageType,
|
||||
date: DateTime.tryParse(e.date)?.millisecondsSinceEpoch ??
|
||||
DateTime.now().millisecondsSinceEpoch,
|
||||
// messageDateTime: FrequentFunctions.toTimesAgo(e.date),
|
||||
// personalMessageIndex: index,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
//Group Messages transform
|
||||
for (final e in resp.sortedArrayGroup) {
|
||||
messages.add(
|
||||
MessagesListModel(
|
||||
image: e.groupImage,
|
||||
title: e.groupName,
|
||||
previewOfLastMessage: e.lastMessages.message,
|
||||
messageType: MessageType.message.name,
|
||||
// messageType: e.lastMessages.messageType ?? MessageType.message.name,
|
||||
date: DateTime.tryParse(e.date)?.millisecondsSinceEpoch ??
|
||||
DateTime.now().millisecondsSinceEpoch,
|
||||
// messageDateTime: FrequentFunctions.toTimesAgo(e.date),
|
||||
isGroup: true,
|
||||
groupData: GroupDataArgs(
|
||||
groupId: e.id,
|
||||
groupMembersIds: e.groupMembers,
|
||||
scheduleTime: e.groupWorkingScheduleTime,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
chatsAndGroups.value = messages;
|
||||
} else {
|
||||
FrequentFunctions.showToast(message: resp["message"]);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
Get.delete<InboxScreenController>();
|
||||
super.dispose();
|
||||
}
|
||||
}
|
||||
146
lib/controllers/home/select_user_for_chat_screen_controller.dart
Normal file
146
lib/controllers/home/select_user_for_chat_screen_controller.dart
Normal file
@@ -0,0 +1,146 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:ftc_mobile_app/models/profileData/user_data.dart';
|
||||
import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart';
|
||||
import 'package:ftc_mobile_app/utilities/local_storage_manager/local_storage_manager.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart';
|
||||
import '../../utilities/frequent_functions.dart';
|
||||
import '../../web_services/client_services.dart';
|
||||
|
||||
class SelectUserForChatScreenController extends GetxController {
|
||||
final GlobalKey<ScaffoldState> screenKey = GlobalKey<ScaffoldState>();
|
||||
final searchController = TextEditingController();
|
||||
|
||||
List<UserData> oStaffUsersList = [];
|
||||
|
||||
final staffUsersList = RxList<UserData>();
|
||||
final canLoadMore = RxBool(false);
|
||||
final searchText = "".obs;
|
||||
|
||||
final int _limit = 20;
|
||||
int _skip = 0;
|
||||
bool loadingMore = false;
|
||||
|
||||
final _listRC = RefreshController(initialRefresh: false);
|
||||
|
||||
RefreshController get listRC => _listRC;
|
||||
|
||||
final _listSC = ScrollController();
|
||||
|
||||
ScrollController get listSC => _listSC;
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
// debounce(searchText, onSearch, time: 800.milliseconds);
|
||||
super.onInit();
|
||||
}
|
||||
|
||||
@override
|
||||
void onReady() {
|
||||
getStaffMembers();
|
||||
super.onReady();
|
||||
}
|
||||
|
||||
void onRefresh() async {
|
||||
await getStaffMembers();
|
||||
_listRC.refreshCompleted();
|
||||
}
|
||||
|
||||
void onLoading() async {
|
||||
if (!loadingMore) {
|
||||
await _loadMore();
|
||||
}
|
||||
|
||||
_listRC.loadComplete();
|
||||
}
|
||||
|
||||
onSearch(String text) {
|
||||
// getStaffMembers();
|
||||
|
||||
if (text.isEmpty) {
|
||||
staffUsersList.value = List.from(oStaffUsersList);
|
||||
} else {
|
||||
staffUsersList.value = oStaffUsersList
|
||||
.where(
|
||||
(e) => e.displayName.toLowerCase().contains(text.toLowerCase()))
|
||||
.toList();
|
||||
|
||||
// Future.forEach(oStaffUsersList, (e) => null);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> getStaffMembers() async {
|
||||
staffUsersList.clear();
|
||||
_skip = 0;
|
||||
var response = await (ClientService()
|
||||
.getAllUsersList(
|
||||
searchText: searchText(),
|
||||
limit: _limit,
|
||||
offset: _skip,
|
||||
)
|
||||
.showLoader());
|
||||
|
||||
if (response.success == true) {
|
||||
if (response.data?.users?.isNotEmpty == true) {
|
||||
_skip += _limit;
|
||||
|
||||
final list = response.data!.users!
|
||||
..removeWhere((e) => e.id == LocalStorageManager.userId);
|
||||
|
||||
oStaffUsersList = List.from(list);
|
||||
staffUsersList.value = list;
|
||||
// canLoadMore.value = false;
|
||||
} else {
|
||||
// canLoadMore.value = searchText.isEmpty;
|
||||
}
|
||||
} else {
|
||||
if (response.message.isNullOrEmptyNot()) {
|
||||
FrequentFunctions.showToast(message: response.message!);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _loadMore() async {
|
||||
if (canLoadMore.isTrue) {
|
||||
loadingMore = true;
|
||||
|
||||
var response = await ClientService().getServiceUsersList(
|
||||
searchText: searchText(),
|
||||
limit: _limit,
|
||||
offset: _skip,
|
||||
);
|
||||
loadingMore = false;
|
||||
|
||||
if (response.success == true) {
|
||||
if (response.data?.users?.isNotEmpty == true) {
|
||||
_skip += _limit;
|
||||
staffUsersList.addAll(response.data?.users ?? []);
|
||||
canLoadMore.value = true;
|
||||
} else {
|
||||
canLoadMore.value = false;
|
||||
}
|
||||
} else {
|
||||
if (response.message.isNullOrEmptyNot()) {
|
||||
FrequentFunctions.showToast(message: response.message!);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void removeFocus() {
|
||||
FocusScope.of(screenKey.currentContext!).unfocus();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
searchController.dispose();
|
||||
_listSC.dispose();
|
||||
Get.delete<SelectUserForChatScreenController>();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
void backButtonPressed(BuildContext context) {
|
||||
Get.delete<SelectUserForChatScreenController>();
|
||||
Navigator.of(context).pop();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user