|
|
|
|
@@ -395,10 +395,20 @@ export default function Chat() {
|
|
|
|
|
|
|
|
|
|
const isToolManager = user?.role === 'admin' || (features.teamToolManagers || []).some(gid => (features.userGroupMemberships || []).includes(gid));
|
|
|
|
|
|
|
|
|
|
// Unread indicators for burger icon and nav drawer
|
|
|
|
|
const allGroupsFlat = [...(groups.publicGroups || []), ...(groups.privateGroups || [])];
|
|
|
|
|
const hasUnreadChat = allGroupsFlat.some(g =>
|
|
|
|
|
(g.type === 'public' || !g.is_managed) && (unreadGroups.get(g.id) || 0) > 0
|
|
|
|
|
);
|
|
|
|
|
const hasUnreadGroupMessages = (groups.privateGroups || []).some(g =>
|
|
|
|
|
g.is_managed && (unreadGroups.get(g.id) || 0) > 0
|
|
|
|
|
);
|
|
|
|
|
const hasAnyUnread = hasUnreadChat || hasUnreadGroupMessages;
|
|
|
|
|
|
|
|
|
|
if (page === 'users') {
|
|
|
|
|
return (
|
|
|
|
|
<div className="chat-layout">
|
|
|
|
|
<GlobalBar isMobile={isMobile} showSidebar={true} onBurger={() => setDrawerOpen(true)} />
|
|
|
|
|
<GlobalBar isMobile={isMobile} showSidebar={true} onBurger={() => setDrawerOpen(true)} hasUnread={hasAnyUnread} />
|
|
|
|
|
<div className="chat-body" style={{ overflow: 'hidden' }}>
|
|
|
|
|
<UserManagerPage isMobile={isMobile} onProfile={() => setModal('profile')} onHelp={() => setModal('help')} onAbout={() => setModal('about')} />
|
|
|
|
|
</div>
|
|
|
|
|
@@ -412,7 +422,8 @@ export default function Chat() {
|
|
|
|
|
onSettings={() => { setDrawerOpen(false); setModal('settings'); }}
|
|
|
|
|
onUsers={() => { setDrawerOpen(false); setActiveGroupId(null); setChatHasText(false); setPage('users'); }}
|
|
|
|
|
onHostPanel={() => { setDrawerOpen(false); setActiveGroupId(null); setChatHasText(false); setPage('hostpanel'); }}
|
|
|
|
|
features={features} currentPage={page} isMobile={isMobile} />
|
|
|
|
|
features={features} currentPage={page} isMobile={isMobile}
|
|
|
|
|
unreadMessages={hasUnreadChat} unreadGroupMessages={hasUnreadGroupMessages} />
|
|
|
|
|
{modal === 'profile' && <ProfileModal onClose={() => setModal(null)} />}
|
|
|
|
|
{modal === 'settings' && <SettingsModal onClose={() => setModal(null)} onFeaturesChanged={setFeatures} />}
|
|
|
|
|
{modal === 'branding' && <BrandingModal onClose={() => setModal(null)} />}
|
|
|
|
|
@@ -425,20 +436,10 @@ export default function Chat() {
|
|
|
|
|
if (page === 'groups') {
|
|
|
|
|
return (
|
|
|
|
|
<div className="chat-layout">
|
|
|
|
|
<GlobalBar isMobile={isMobile} showSidebar={true} onBurger={() => setDrawerOpen(true)} />
|
|
|
|
|
<GlobalBar isMobile={isMobile} showSidebar={true} onBurger={() => setDrawerOpen(true)} hasUnread={hasAnyUnread} />
|
|
|
|
|
<div className="chat-body" style={{ overflow: 'hidden' }}>
|
|
|
|
|
<GroupManagerPage isMobile={isMobile} onProfile={() => setModal('profile')} onHelp={() => setModal('help')} onAbout={() => setModal('about')} />
|
|
|
|
|
</div>
|
|
|
|
|
<NavDrawer
|
|
|
|
|
open={drawerOpen} onClose={() => setDrawerOpen(false)}
|
|
|
|
|
onMessages={() => { setDrawerOpen(false); setActiveGroupId(null); setChatHasText(false); setPage('chat'); }}
|
|
|
|
|
onSchedule={() => { setDrawerOpen(false); setActiveGroupId(null); setChatHasText(false); setPage('schedule'); }}
|
|
|
|
|
onGroupManager={() => { setDrawerOpen(false); setActiveGroupId(null); setChatHasText(false); setPage('groups'); }}
|
|
|
|
|
onBranding={() => { setDrawerOpen(false); setModal('branding'); }}
|
|
|
|
|
onSettings={() => { setDrawerOpen(false); setModal('settings'); }}
|
|
|
|
|
onUsers={() => { setDrawerOpen(false); setActiveGroupId(null); setChatHasText(false); setPage('users'); }}
|
|
|
|
|
onHostPanel={() => { setDrawerOpen(false); setActiveGroupId(null); setChatHasText(false); setPage('hostpanel'); }}
|
|
|
|
|
features={features} currentPage={page} isMobile={isMobile} />
|
|
|
|
|
<NavDrawer
|
|
|
|
|
open={drawerOpen} onClose={() => setDrawerOpen(false)}
|
|
|
|
|
onMessages={() => { setDrawerOpen(false); setActiveGroupId(null); setChatHasText(false); setPage('chat'); }}
|
|
|
|
|
@@ -449,7 +450,8 @@ export default function Chat() {
|
|
|
|
|
onSettings={() => { setDrawerOpen(false); setModal('settings'); }}
|
|
|
|
|
onUsers={() => { setDrawerOpen(false); setActiveGroupId(null); setChatHasText(false); setPage('users'); }}
|
|
|
|
|
onHostPanel={() => { setDrawerOpen(false); setActiveGroupId(null); setChatHasText(false); setPage('hostpanel'); }}
|
|
|
|
|
features={features} currentPage={page} isMobile={isMobile} />
|
|
|
|
|
features={features} currentPage={page} isMobile={isMobile}
|
|
|
|
|
unreadMessages={hasUnreadChat} unreadGroupMessages={hasUnreadGroupMessages} />
|
|
|
|
|
{modal === 'profile' && <ProfileModal onClose={() => setModal(null)} />}
|
|
|
|
|
{modal === 'settings' && <SettingsModal onClose={() => setModal(null)} onFeaturesChanged={setFeatures} />}
|
|
|
|
|
{modal === 'branding' && <BrandingModal onClose={() => setModal(null)} />}
|
|
|
|
|
@@ -462,7 +464,7 @@ export default function Chat() {
|
|
|
|
|
if (page === 'groupmessages') {
|
|
|
|
|
return (
|
|
|
|
|
<div className="chat-layout">
|
|
|
|
|
<GlobalBar isMobile={isMobile} showSidebar={showSidebar} onBurger={() => setDrawerOpen(true)} />
|
|
|
|
|
<GlobalBar isMobile={isMobile} showSidebar={showSidebar} onBurger={() => setDrawerOpen(true)} hasUnread={hasAnyUnread} />
|
|
|
|
|
<div className="chat-body">
|
|
|
|
|
{(!isMobile || showSidebar) && (
|
|
|
|
|
<Sidebar
|
|
|
|
|
@@ -506,7 +508,8 @@ export default function Chat() {
|
|
|
|
|
onSettings={() => { setDrawerOpen(false); setModal('settings'); }}
|
|
|
|
|
onUsers={() => { setDrawerOpen(false); setActiveGroupId(null); setChatHasText(false); setPage('users'); }}
|
|
|
|
|
onHostPanel={() => { setDrawerOpen(false); setActiveGroupId(null); setChatHasText(false); setPage('hostpanel'); }}
|
|
|
|
|
features={features} currentPage={page} isMobile={isMobile} />
|
|
|
|
|
features={features} currentPage={page} isMobile={isMobile}
|
|
|
|
|
unreadMessages={hasUnreadChat} unreadGroupMessages={hasUnreadGroupMessages} />
|
|
|
|
|
{modal === 'profile' && <ProfileModal onClose={() => setModal(null)} />}
|
|
|
|
|
{modal === 'settings' && <SettingsModal onClose={() => setModal(null)} onFeaturesChanged={setFeatures} />}
|
|
|
|
|
{modal === 'branding' && <BrandingModal onClose={() => setModal(null)} />}
|
|
|
|
|
@@ -520,7 +523,7 @@ export default function Chat() {
|
|
|
|
|
if (page === 'hostpanel') {
|
|
|
|
|
return (
|
|
|
|
|
<div className="chat-layout">
|
|
|
|
|
<GlobalBar isMobile={isMobile} showSidebar={true} onBurger={() => setDrawerOpen(true)} />
|
|
|
|
|
<GlobalBar isMobile={isMobile} showSidebar={true} onBurger={() => setDrawerOpen(true)} hasUnread={hasAnyUnread} />
|
|
|
|
|
<div className="chat-body" style={{ overflow: 'hidden' }}>
|
|
|
|
|
<HostPanel onProfile={() => setModal('profile')} onHelp={() => setModal('help')} onAbout={() => setModal('about')} />
|
|
|
|
|
</div>
|
|
|
|
|
@@ -538,7 +541,8 @@ export default function Chat() {
|
|
|
|
|
onHostPanel={() => { setDrawerOpen(false); setActiveGroupId(null); setChatHasText(false); setPage('hostpanel'); }}
|
|
|
|
|
features={features}
|
|
|
|
|
currentPage={page}
|
|
|
|
|
isMobile={isMobile} />
|
|
|
|
|
isMobile={isMobile}
|
|
|
|
|
unreadMessages={hasUnreadChat} unreadGroupMessages={hasUnreadGroupMessages} />
|
|
|
|
|
{modal === 'profile' && <ProfileModal onClose={() => setModal(null)} />}
|
|
|
|
|
{modal === 'settings' && <SettingsModal onClose={() => setModal(null)} onFeaturesChanged={setFeatures} />}
|
|
|
|
|
{modal === 'branding' && <BrandingModal onClose={() => setModal(null)} />}
|
|
|
|
|
@@ -551,7 +555,7 @@ export default function Chat() {
|
|
|
|
|
if (page === 'schedule') {
|
|
|
|
|
return (
|
|
|
|
|
<div className="chat-layout">
|
|
|
|
|
<GlobalBar isMobile={isMobile} showSidebar={true} onBurger={() => setDrawerOpen(true)} />
|
|
|
|
|
<GlobalBar isMobile={isMobile} showSidebar={true} onBurger={() => setDrawerOpen(true)} hasUnread={hasAnyUnread} />
|
|
|
|
|
<div className="chat-body" style={{ overflow: 'hidden' }}>
|
|
|
|
|
<SchedulePage
|
|
|
|
|
isToolManager={isToolManager}
|
|
|
|
|
@@ -575,7 +579,8 @@ export default function Chat() {
|
|
|
|
|
onHostPanel={() => { setDrawerOpen(false); setActiveGroupId(null); setChatHasText(false); setPage('hostpanel'); }}
|
|
|
|
|
features={features}
|
|
|
|
|
currentPage={page}
|
|
|
|
|
isMobile={isMobile} />
|
|
|
|
|
isMobile={isMobile}
|
|
|
|
|
unreadMessages={hasUnreadChat} unreadGroupMessages={hasUnreadGroupMessages} />
|
|
|
|
|
{modal === 'profile' && <ProfileModal onClose={() => setModal(null)} />}
|
|
|
|
|
{modal === 'settings' && <SettingsModal onClose={() => setModal(null)} onFeaturesChanged={setFeatures} />}
|
|
|
|
|
{modal === 'branding' && <BrandingModal onClose={() => setModal(null)} />}
|
|
|
|
|
@@ -594,7 +599,7 @@ export default function Chat() {
|
|
|
|
|
return (
|
|
|
|
|
<div className="chat-layout">
|
|
|
|
|
{/* Global top bar — spans full width on desktop, visible on mobile sidebar view */}
|
|
|
|
|
<GlobalBar isMobile={isMobile} showSidebar={showSidebar} onBurger={() => setDrawerOpen(true)} />
|
|
|
|
|
<GlobalBar isMobile={isMobile} showSidebar={showSidebar} onBurger={() => setDrawerOpen(true)} hasUnread={hasAnyUnread} />
|
|
|
|
|
|
|
|
|
|
<div className="chat-body">
|
|
|
|
|
{(!isMobile || showSidebar) && (
|
|
|
|
|
@@ -645,7 +650,8 @@ export default function Chat() {
|
|
|
|
|
onHostPanel={() => { setDrawerOpen(false); setActiveGroupId(null); setChatHasText(false); setPage('hostpanel'); }}
|
|
|
|
|
features={features}
|
|
|
|
|
currentPage={page}
|
|
|
|
|
isMobile={isMobile} />
|
|
|
|
|
isMobile={isMobile}
|
|
|
|
|
unreadMessages={hasUnreadChat} unreadGroupMessages={hasUnreadGroupMessages} />
|
|
|
|
|
{modal === 'profile' && <ProfileModal onClose={() => setModal(null)} />}
|
|
|
|
|
{modal === 'settings' && <SettingsModal onClose={() => setModal(null)} onFeaturesChanged={setFeatures} />}
|
|
|
|
|
{modal === 'branding' && <BrandingModal onClose={() => setModal(null)} />}
|
|
|
|
|
|