build method
Implementation
@override
Widget build(BuildContext context) {
// Mirrorfly.setEventListener(this);
return FocusDetector(
onFocusGained: () {
debugPrint('onFocusGained');
// controller.initListeners();
controller.checkArchiveSetting();
// controller.getRecentChatList();
},
child: Obx(
() => PopScope(
canPop:
!(controller.selected.value || controller.isSearching.value),
onPopInvokedWithResult: (didPop, result) {
if (didPop) {
return;
}
if (controller.selected.value) {
controller.clearAllChatSelection();
return;
} else if (controller.isSearching.value) {
controller.getBackFromSearch();
return;
}
},
child: Theme(
data: Theme.of(context).copyWith(
tabBarTheme: AppStyleConfig.dashBoardPageStyle.tabBarTheme,
appBarTheme: AppStyleConfig.dashBoardPageStyle.appBarTheme,
floatingActionButtonTheme: AppStyleConfig
.dashBoardPageStyle.floatingActionButtonThemeData),
child: CustomSafeArea(
child: DefaultTabController(
length: 2,
child: Builder(builder: (ctx) {
return Scaffold(
floatingActionButton: controller.isSearching.value
? null
: Obx(() {
return createFab(
controller.currentTab.value, ctx);
}),
body: NestedScrollView(
headerSliverBuilder: (BuildContext context,
bool innerBoxIsScrolled) {
return [
Obx(() {
return SliverAppBar(
snap: false,
pinned: true,
floating: !controller.selected.value ||
!controller.isSearching.value,
automaticallyImplyLeading: false,
leading: controller.selected.value
? IconButton(
icon: const Icon(Icons.clear),
onPressed: () {
controller
.clearAllChatSelection();
},
)
: controller.isSearching.value
? IconButton(
icon: const Icon(
Icons.arrow_back),
onPressed: () {
controller
.getBackFromSearch();
},
)
: null,
title: controller.selected.value
? controller.currentTab.value == 0
? Text(
(controller
.selectedChats.length)
.toString(),
style: AppStyleConfig
.dashBoardPageStyle
.appBarTheme
.titleTextStyle,
)
: Text(
(controller.selectedCallLogs
.length)
.toString(),
style: AppStyleConfig
.dashBoardPageStyle
.appBarTheme
.titleTextStyle)
: controller.isSearching.value
? TextField(
focusNode:
controller.searchFocusNode,
onChanged: (text) =>
controller.onChange(
text,
controller
.currentTab.value),
controller: controller.search,
autofocus: true,
decoration: InputDecoration(
hintText: getTranslated(
"searchPlaceholder"),
border: InputBorder.none,
hintStyle: AppStyleConfig
.dashBoardPageStyle
.searchTextFieldStyle
.editTextHintStyle),
style: AppStyleConfig
.dashBoardPageStyle
.searchTextFieldStyle
.editTextStyle,
)
: null,
bottom: controller.isSearching.value
? null
: TabBar(
controller:
controller.tabController,
tabs: [
Obx(() {
return tabItem(
title:
getTranslated("chats")
.toUpperCase(),
count: controller
.unreadCountString,
tabItemStyle:
AppStyleConfig
.dashBoardPageStyle
.tabItemStyle);
}),
tabItem(
title:
getTranslated("calls")
.toUpperCase(),
count: controller
.unreadCallCountString,
tabItemStyle: AppStyleConfig
.dashBoardPageStyle
.tabItemStyle)
]),
actions: [
CustomActionBarIcons(
popupMenuThemeData: AppStyleConfig
.dashBoardPageStyle
.popupMenuThemeData,
availableWidth:
NavUtils.size.width * 0.80,
// 80 percent of the screen width
actionWidth: 48,
// default for IconButtons
actions: [
CustomAction(
visibleWidget: IconButton(
onPressed: () {
controller.chatInfo();
},
icon: AppUtils.svgIcon(
icon: infoIcon,
colorFilter: ColorFilter.mode(
Theme.of(context)
.appBarTheme
.actionsIconTheme
?.color ??
Colors.black,
BlendMode.srcIn)),
tooltip: 'Info',
),
overflowWidget: Text(
getTranslated("info"),
style: AppStyleConfig
.dashBoardPageStyle
.popupMenuThemeData
.textStyle),
showAsAction:
controller.info.value
? ShowAsAction.always
: ShowAsAction.gone,
keyValue: 'Info',
onItemClick: () {
controller.chatInfo();
},
),
CustomAction(
visibleWidget: IconButton(
onPressed: () {
controller.currentTab.value ==
0
? controller.deleteChats()
: controller
.deleteCallLog();
},
icon: AppUtils.svgIcon(
icon: delete,
colorFilter: ColorFilter.mode(
Theme.of(context)
.appBarTheme
.actionsIconTheme
?.color ??
Colors.black,
BlendMode.srcIn)),
tooltip: 'Delete',
),
overflowWidget: Text(
getTranslated("delete"),
style: AppStyleConfig
.dashBoardPageStyle
.popupMenuThemeData
.textStyle),
showAsAction: controller
.availableFeatures
.value
.isDeleteChatAvailable
.checkNull()
? controller.delete.value
? ShowAsAction.always
: ShowAsAction.gone
: ShowAsAction.gone,
keyValue: 'Delete',
onItemClick: () {
controller.deleteChats();
},
),
CustomAction(
visibleWidget: IconButton(
onPressed: () {
controller.pinChats();
},
icon: AppUtils.svgIcon(
icon: pin,
colorFilter: ColorFilter.mode(
Theme.of(context)
.appBarTheme
.actionsIconTheme
?.color ??
Colors.black,
BlendMode.srcIn)),
tooltip: 'Pin',
),
overflowWidget: Text(
getTranslated("pin"),
style: AppStyleConfig
.dashBoardPageStyle
.popupMenuThemeData
.textStyle),
showAsAction: controller.pin.value
? ShowAsAction.always
: ShowAsAction.gone,
keyValue: 'Pin',
onItemClick: () {
controller.pinChats();
},
),
CustomAction(
visibleWidget: IconButton(
onPressed: () {
controller.unPinChats();
},
icon: AppUtils.svgIcon(
icon: unpin,
colorFilter: ColorFilter.mode(
Theme.of(context)
.appBarTheme
.actionsIconTheme
?.color ??
Colors.black,
BlendMode.srcIn)),
tooltip: 'UnPin',
),
overflowWidget: Text(
getTranslated("unPin"),
style: AppStyleConfig
.dashBoardPageStyle
.popupMenuThemeData
.textStyle),
showAsAction:
controller.unpin.value
? ShowAsAction.always
: ShowAsAction.gone,
keyValue: 'UnPin',
onItemClick: () {
controller.unPinChats();
},
),
CustomAction(
visibleWidget: IconButton(
onPressed: () {
controller.muteChats();
},
icon: AppUtils.svgIcon(
icon: mute,
colorFilter: ColorFilter.mode(
Theme.of(context)
.appBarTheme
.actionsIconTheme
?.color ??
Colors.black,
BlendMode.srcIn)),
tooltip: 'Mute',
),
overflowWidget: Text(
getTranslated("mute"),
style: AppStyleConfig
.dashBoardPageStyle
.popupMenuThemeData
.textStyle),
showAsAction:
controller.mute.value
? ShowAsAction.always
: ShowAsAction.gone,
keyValue: 'Mute',
onItemClick: () {
controller.muteChats();
},
),
CustomAction(
visibleWidget: IconButton(
onPressed: () {
controller.unMuteChats();
},
icon: AppUtils.svgIcon(
icon: unMute,
colorFilter: ColorFilter.mode(
Theme.of(context)
.appBarTheme
.actionsIconTheme
?.color ??
Colors.black,
BlendMode.srcIn)),
tooltip: 'UnMute',
),
overflowWidget: Text(
getTranslated("unMute"),
style: AppStyleConfig
.dashBoardPageStyle
.popupMenuThemeData
.textStyle),
showAsAction:
controller.unmute.value
? ShowAsAction.always
: ShowAsAction.gone,
keyValue: 'UnMute',
onItemClick: () {
controller.unMuteChats();
},
),
CustomAction(
visibleWidget: IconButton(
onPressed: () {
controller.archiveChats();
},
icon: AppUtils.svgIcon(
icon: archive,
colorFilter: ColorFilter.mode(
Theme.of(context)
.appBarTheme
.actionsIconTheme
?.color ??
Colors.black,
BlendMode.srcIn)),
tooltip: 'Archive',
),
overflowWidget: Text(
getTranslated("archived"),
style: AppStyleConfig
.dashBoardPageStyle
.popupMenuThemeData
.textStyle),
showAsAction:
controller.archive.value
? ShowAsAction.always
: ShowAsAction.gone,
keyValue: 'Archived',
onItemClick: () {
controller.archiveChats();
},
),
CustomAction(
visibleWidget: const Icon(
Icons.mark_chat_read),
overflowWidget: Text(
getTranslated("markAsRead"),
style: AppStyleConfig
.dashBoardPageStyle
.popupMenuThemeData
.textStyle),
showAsAction:
controller.read.value
? ShowAsAction.never
: ShowAsAction.gone,
keyValue: 'Mark as Read',
onItemClick: () {
controller.itemsRead();
},
),
CustomAction(
visibleWidget: const Icon(
Icons.mark_chat_unread),
overflowWidget: Text(
getTranslated("markAsUnread"),
style: AppStyleConfig
.dashBoardPageStyle
.popupMenuThemeData
.textStyle),
showAsAction:
controller.unread.value
? ShowAsAction.never
: ShowAsAction.gone,
keyValue: 'Mark as unread',
onItemClick: () {
controller.itemsUnRead();
},
),
CustomAction(
visibleWidget: IconButton(
onPressed: () {
controller.gotoSearch();
},
icon: AppUtils.svgIcon(
icon: searchIcon,
width: 18,
height: 18,
fit: BoxFit.contain,
colorFilter: ColorFilter.mode(
Theme.of(context)
.appBarTheme
.actionsIconTheme
?.color ??
Colors.black,
BlendMode.srcIn)),
tooltip: 'Search',
),
overflowWidget: Text(
getTranslated("search"),
style: AppStyleConfig
.dashBoardPageStyle
.popupMenuThemeData
.textStyle),
showAsAction: controller
.availableFeatures
.value
.isRecentChatSearchAvailable
.checkNull()
? controller.selected.value ||
controller
.isSearching.value
? ShowAsAction.gone
: ShowAsAction.always
: ShowAsAction.gone,
keyValue: 'Search',
onItemClick: () {
controller.gotoSearch();
},
),
CustomAction(
visibleWidget: IconButton(
onPressed: () => controller
.onClearPressed(),
icon:
const Icon(Icons.close)),
overflowWidget: Text(
getTranslated("clear"),
style: AppStyleConfig
.dashBoardPageStyle
.popupMenuThemeData
.textStyle),
showAsAction:
controller.clearVisible.value
? ShowAsAction.always
: ShowAsAction.gone,
keyValue: 'Clear',
onItemClick: () {
controller.onClearPressed();
},
),
CustomAction(
visibleWidget:
const Icon(Icons.group_add),
overflowWidget: Text(
getTranslated("newGroup"),
style: AppStyleConfig
.dashBoardPageStyle
.popupMenuThemeData
.textStyle),
showAsAction: controller
.availableFeatures
.value
.isGroupChatAvailable
.checkNull()
? controller.selected.value ||
controller
.isSearching.value
? ShowAsAction.gone
: ShowAsAction.never
: ShowAsAction.gone,
keyValue: 'New Group',
onItemClick: () {
controller.gotoCreateGroup();
},
),
CustomAction(
visibleWidget:
const Icon(Icons.web),
overflowWidget: Text(
getTranslated("clearCallLog"),
style: AppStyleConfig
.dashBoardPageStyle
.popupMenuThemeData
.textStyle),
showAsAction:
controller.selected.value ||
controller.isSearching
.value ||
controller.currentTab
.value ==
0 ||
controller.callLogList
.isEmpty
? ShowAsAction.gone
: ShowAsAction.never,
keyValue: 'Clear call log',
onItemClick: () => controller
.callLogList.isNotEmpty
? controller.clearCallLog()
: toToast(getTranslated(
"noCallLog")),
),
CustomAction(
visibleWidget:
const Icon(Icons.settings),
overflowWidget: Text(
getTranslated("settings"),
style: AppStyleConfig
.dashBoardPageStyle
.popupMenuThemeData
.textStyle),
showAsAction:
controller.selected.value ||
controller
.isSearching.value
? ShowAsAction.gone
: ShowAsAction.never,
keyValue: 'Settings',
onItemClick: () {
controller.gotoSettings();
},
),
/*CustomAction(
visibleWidget: const Icon(Icons.web),
overflowWidget: Text(getTranslated("web"),style:AppStyleConfig.dashBoardPageStyle.popupMenuThemeData.textStyle),
showAsAction:
controller.selected.value || controller.isSearching.value ? ShowAsAction.gone : ShowAsAction.never,
keyValue: 'Web',
onItemClick: () => controller.webLogin(),
),*/
]),
],
);
}),
];
},
body: TabBarView(
controller: controller.tabController,
children: [
RecentChatView(
controller: controller,
archivedTileStyle: AppStyleConfig
.dashBoardPageStyle.archivedTileStyle,
recentChatItemStyle: AppStyleConfig
.dashBoardPageStyle.recentChatItemStyle,
noDataTextStyle: AppStyleConfig
.dashBoardPageStyle.noDataTextStyle,
contactItemStyle: AppStyleConfig
.dashBoardPageStyle.contactItemStyle,
),
CallHistoryView(
controller: controller,
callHistoryItemStyle: AppStyleConfig
.dashBoardPageStyle
.callHistoryItemStyle,
noDataTextStyle: AppStyleConfig
.dashBoardPageStyle.noDataTextStyle,
createMeetLinkStyle: AppStyleConfig
.dashBoardPageStyle.createMeetLinkStyle,
recentCallsTitleStyle: AppStyleConfig
.dashBoardPageStyle.titlesTextStyle,
meetBottomSheetStyle: AppStyleConfig
.dashBoardPageStyle
.meetBottomSheetStyle,
)
])));
}),
),
),
),
),
));
}