RSNewWebUI/webui-src/app/network/network.js
defnax 209adb6564 Fixed Network active chats
- Fixed. Chat previews
- Implemented unread chat counts
2026-08-15 12:27:39 +02:00

140 lines
4.9 KiB
JavaScript

const m = require('mithril');
const rs = require('rswebui');
const Data = require('network/network_data');
const compose = require('mail/mail_compose');
const {
State,
loadOwnProfile,
loadGxsIdentities,
fetchIdDetails,
startDirectChat,
getOnlineSslId,
preloadNetworkChatHistory,
loadDirectChatMessages,
markDirectChatRead,
} = require('network/network_state');
const { OwnProfileCard, FriendsList } = require('network/network_friends_list');
const DetailsTab = require('network/network_details_tab');
const ChatTab = require('network/network_chat_tab');
const NetworkGraph = require('network/network_graph');
const NetworkLayout = () => {
return {
oninit: () => {
// Keep the active-chat list current even when no conversation is open.
loadDirectChatMessages();
Data.refreshGpgDetails().then(() => {
preloadNetworkChatHistory();
m.redraw();
});
loadOwnProfile();
loadGxsIdentities();
},
onremove: () => {
if (rs.events[15]) {
rs.events[15].notify = () => {};
}
},
view: () => {
const selectedFriend = State.selectedFriendGpgId
? Data.gpgDetails[State.selectedFriendGpgId]
: null;
const selectedGxsId = State.selectedFriendGpgId
? State.gpgToGxsIdMap[State.selectedFriendGpgId.toLowerCase()]
: null;
if (State.selectedFriendGpgId && !selectedGxsId && State.gxsIdentities) {
State.gxsIdentities.forEach((gxsId) => fetchIdDetails(gxsId));
}
return m('.network-container' + (State.mobilePane === 'detail' ? '.mobile-detail-open' : ''), [
m('.network-left-pane', [m(OwnProfileCard), m(FriendsList)]),
m('.network-right-pane', [
m('.mobile-pane-header', [
m('button.mobile-back-button', {
type: 'button',
onclick: () => { State.mobilePane = 'list'; },
}, [m('i.fas.fa-chevron-left'), ' Network']),
m('strong', State.activeTab === 'graph' ? 'Network Graph' : (selectedFriend ? selectedFriend.name : 'Friend')),
]),
m('.network-tabs', [
m(
'button.tab-btn' + (State.activeTab === 'details' ? '.active' : ''),
{
onclick: () => {
State.activeTab = 'details';
State.mobilePane = 'detail';
},
},
'Details View'
),
m(
'button.tab-btn' + (State.activeTab === 'chat' ? '.active' : ''),
{
onclick: () => {
State.activeTab = 'chat';
State.mobilePane = 'detail';
markDirectChatRead(State.selectedFriendGpgId);
const sslId = getOnlineSslId(State.selectedFriendGpgId);
if (sslId && !State.currentChatPeerId) {
startDirectChat(sslId);
}
},
},
'Chat Conversation'
),
m(
'button.tab-btn' + (State.activeTab === 'graph' ? '.active' : ''),
{ onclick: () => { State.activeTab = 'graph'; State.mobilePane = 'detail'; } },
[m('i.fas.fa-project-diagram'), ' Network Graph']
),
]),
State.activeTab === 'graph'
? m('.network-tab-content.network-graph-tab', m(NetworkGraph))
: selectedFriend
? m('.network-tab-content', [
State.activeTab === 'details' ? m(DetailsTab) : m(ChatTab),
])
: m('.network-pane-placeholder', [
m('i.fas.fa-network-wired'),
m(
'p',
'Select a friend for details or chat, or open the Network Graph tab.'
),
]),
]),
State.showMailCompose &&
State.selectedFriendGpgId &&
m(
'.composePopupOverlay#mailComposerPopup',
{ style: { display: 'block' } },
m(
'.composePopup',
m(compose, {
msgType: 'compose',
toId: selectedGxsId || State.selectedFriendGpgId,
friendName: selectedFriend ? selectedFriend.name : 'Unknown Friend',
isDirectMail: true,
setShowCompose: (val) => {
State.showMailCompose = val;
},
}),
m(
'button.red.close-btn',
{
onclick: () => {
State.showMailCompose = false;
},
},
m('i.fas.fa-times')
)
)
),
]);
},
};
};
module.exports = NetworkLayout;