RSNewWebUI/webui-src/app/main.js

197 lines
5.5 KiB
JavaScript

const m = require('mithril');
const login = require('login');
const rs = require('rswebui');
const home = require('home');
const network = require('network/network');
const people = require('people/people_resolver');
const chat = require('chat/chat');
const mail = require('mail/mail_resolver');
const files = require('files/files_resolver');
const channels = require('channels/channels');
const forums = require('forums/forums');
const boards = require('boards/boards');
const config = require('config/config_resolver');
const navIcon = {
home: m('i.fas.fa-home.sidenav-icon'),
network: m('i.fas.fa-share-alt.sidenav-icon'),
people: m('i.fas.fa-users.sidenav-icon'),
chat: m('i.fas.fa-comments.sidenav-icon'),
mail: m('i.fas.fa-envelope.sidenav-icon'),
files: m('i.fas.fa-folder-open.sidenav-icon'),
channels: m('i.fas.fa-tv.sidenav-icon'),
forums: m('i.fas.fa-bullhorn.sidenav-icon'),
boards: m('i.fas.fa-globe.sidenav-icon'),
config: m('i.fas.fa-cogs.sidenav-icon'),
};
const navbar = () => {
let isCollapsed = true;
return {
view: (vnode) =>
m(
'nav.nav-menu',
{
class: isCollapsed ? 'collapsed' : '',
},
[
m('.nav-menu__logo', [
m('img', {
src: 'images/retroshare.svg',
alt: 'retroshare_icon',
}),
m('.nav-menu__logo-text', [
m('h5', 'RetroShare'),
m('.webui-version-box', [
m('span.webui-version', 'v61'),
m('i.fas.fa-sync-alt.refresh-icon', {
onclick: () => window.location.reload(true),
title: 'Force reload application',
}),
]),
]),
]),
m('.nav-menu__box', [
Object.keys(vnode.attrs.links).map((linkName) => {
const active = m.route.get().split('/')[1] === linkName;
return m(
m.route.Link,
{
href: vnode.attrs.links[linkName],
class: (active ? 'active-link' : '') + ' item',
},
[
navIcon[linkName],
m('span', linkName.charAt(0).toUpperCase() + linkName.slice(1)),
]
);
}),
m(
'a.logout-link.item',
{
onclick: () => rs.logout(),
style: { marginTop: 'auto', cursor: 'pointer' },
},
[m('i.fas.fa-sign-out-alt'), m('span', 'Logout')]
),
m(
'button.toggle-nav',
{
onclick: () => (isCollapsed = !isCollapsed),
},
m('i.fas.fa-angle-double-left')
),
]),
]
),
};
};
const Layout = () => {
return {
view: (vnode) =>
m('.content', [
m(navbar, {
links: {
home: '/home',
network: '/network',
people: '/people/OwnIdentity',
chat: '/chat',
mail: '/mail/inbox',
files: '/files/files',
channels: '/channels/MyChannels',
forums: '/forums/MyForums',
boards: '/boards/MyBoards',
config: '/config/network',
},
}),
m('.tab-content', vnode.children),
]),
};
};
m.route(document.getElementById('main'), '/', {
'/': {
render: () => {
console.info('[RS-DEBUG] Routing to / (Login)');
return m(login);
},
},
'/home': {
render: () => m(Layout, m(home)),
},
'/network': {
render: () => m(Layout, m(network)),
},
'/people/:tab': {
render: (v) => m(Layout, m(people, v.attrs)),
},
'/chat/:lobby/:subaction': {
render: (v) => m(Layout, m(chat, v.attrs)),
},
'/chat/:lobby': {
render: (v) => m(Layout, m(chat, v.attrs)),
},
'/chat': {
render: () => m(Layout, m(chat)),
},
'/mail/:tab': {
render: (v) => m(Layout, m(mail, v.attrs)),
},
'/mail/:tab/:msgId': {
render: (v) => m(Layout, m(mail, v.attrs)),
},
'/files/:tab': {
render: (v) => m(Layout, m(files, v.attrs)),
},
'/files/:tab/:resultId': {
render: (v) => m(Layout, m(files, v.attrs)),
},
'/channels/:tab': {
render: (v) => m(Layout, m(channels, v.attrs)),
},
'/channels/:tab/:mGroupId': {
render: (v) => m(Layout, m(channels, v.attrs)),
},
'/channels/:tab/:mGroupId/:mMsgId': {
render: (v) => m(Layout, m(channels, v.attrs)),
},
'/forums/:tab': {
render: (v) => m(Layout, m(forums, v.attrs)),
},
'/forums/:tab/:mGroupId': {
render: (v) => m(Layout, m(forums, v.attrs)),
},
'/forums/:tab/:mGroupId/:mMsgId': {
render: (v) => m(Layout, m(forums, v.attrs)),
},
'/boards/:tab': {
render: (v) => m(Layout, m(boards, v.attrs)),
},
'/boards/:tab/:mGroupId': {
render: (v) => m(Layout, m(boards, v.attrs)),
},
'/boards/:tab/:mGroupId/:mMsgId': {
render: (v) => m(Layout, m(boards, v.attrs)),
},
'/config/:tab': {
render: (v) => m(Layout, m(config, v.attrs)),
},
});
// v51 architectural fix: ensure event queue starts on direct route refresh
if (rs.loginKey.isVerified && rs.loginKey.username && rs.loginKey.passwd) {
console.info('[RS-DEBUG] main.js: Initiating global event queue for verified session...');
rs.logon(
{ Authorization: `Basic ${btoa(`${rs.loginKey.username}:${rs.loginKey.passwd}`)}` },
() => { }, // displayAuthError
() => { }, // displayErrorMessage
() => {
console.info('[RS-DEBUG] Global event queue successfully started.');
}
);
}