RSNewWebUI/webui-src/app/main.js

104 lines
2.4 KiB
JavaScript

const m = require('mithril');
const login = require('login');
const home = require('home');
const network = require('network/network');
const people = require('people/people');
const chat = require('chat/chat');
const mail = require('mail/mail_resolver');
const files = require('files/files_resolver');
const channels = require('channels/channels');
const config = require('config/config_resolver');
const rs = require('rswebui');
const navIcon = {
home: m('i.fas.fa-home'),
network: m('i.fas.fa-share-alt'),
people: m('i.fas.fa-users'),
chat: m('i.fas.fa-comments'),
mail: m('i.fas.fa-envelope'),
files: m('i.fas.fa-folder-open'),
channels: m('i.fas.fa-tv'),
config: m('i.fas.fa-cogs')
};
const navbar = () => {
return {
view: vnode =>
m(
'nav.tab-menu',
Object.keys(vnode.attrs.links).map((linkName, i) => {
let active = m.route.get().split('/')[1] === linkName
return m(
m.route.Link,
{
href: vnode.attrs.links[linkName],
class: (active ? 'selected-tab-item' : '') + ' tab-menu-item',
},
[navIcon[linkName], linkName]
);
})
),
}
};
const Layout = () => {
return {
view: vnode =>
m('.content', [
m(navbar, {
links: {
home: '/home',
network: '/network',
people: '/people',
chat: '/chat',
mail: '/mail/inbox',
files: '/files/files',
channels: '/channels',
config: '/config/network'
}
}),
m('#tab-content', vnode.children)
])
};
};
m.route(document.getElementById('main'), '/', {
'/': {
render: () => m(login)
},
'/home': {
render: () => m(Layout, m(home))
},
'/network': {
render: () => m(Layout, m(network))
},
'/people': {
render: () => m(Layout, m(people))
},
'/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))
},
'/channels': {
render: () => m(Layout, m(channels))
},
'/config/:tab': {
render: v => m(Layout, m(config, v.attrs))
}
});