thelounge/client/js/router.js

138 lines
2.9 KiB
JavaScript
Raw Normal View History

2019-10-17 16:56:44 +00:00
"use strict";
2019-11-16 17:24:03 +00:00
import Vue from "vue";
import VueRouter from "vue-router";
2019-10-17 16:56:44 +00:00
2019-11-16 17:24:03 +00:00
Vue.use(VueRouter);
2019-11-16 17:24:03 +00:00
import SignIn from "../components/Windows/SignIn.vue";
import Connect from "../components/Windows/Connect.vue";
import Settings from "../components/Windows/Settings.vue";
import Help from "../components/Windows/Help.vue";
import Changelog from "../components/Windows/Changelog.vue";
import NetworkEdit from "../components/Windows/NetworkEdit.vue";
import RoutedChat from "../components/RoutedChat.vue";
import constants from "./constants";
import store from "./store";
2019-10-17 16:56:44 +00:00
const router = new VueRouter({
routes: [
2019-10-20 16:17:21 +00:00
{
2019-11-03 17:09:10 +00:00
name: "SignIn",
2019-10-20 16:17:21 +00:00
path: "/sign-in",
component: SignIn,
2019-11-07 16:48:45 +00:00
beforeEnter(to, from, next) {
// Prevent navigating to sign-in when already signed in
if (store.state.appLoaded) {
next(false);
return;
}
next();
},
2019-10-20 16:17:21 +00:00
},
2019-11-03 15:56:41 +00:00
],
});
2019-11-07 16:48:45 +00:00
router.beforeEach((to, from, next) => {
// Disallow navigating to non-existing routes
2019-11-08 18:50:28 +00:00
if (store.state.appLoaded && !to.matched.length) {
next(false);
return;
}
// Disallow navigating to invalid channels
2019-11-11 19:18:55 +00:00
if (to.name === "RoutedChat" && !store.getters.findChannel(Number(to.params.id))) {
next(false);
return;
}
2019-11-07 16:48:45 +00:00
// Handle closing image viewer with the browser back button
if (!router.app.$refs.app) {
next();
return;
}
const imageViewer = router.app.$root.$refs.app.$refs.imageViewer;
if (imageViewer && imageViewer.link) {
imageViewer.closeViewer();
next(false);
return;
}
next();
});
router.afterEach((to) => {
2019-11-05 19:29:51 +00:00
if (store.state.appLoaded) {
if (window.innerWidth <= constants.mobileViewportPixels) {
store.commit("sidebarOpen", false);
}
2019-11-03 15:56:41 +00:00
}
2019-11-11 19:18:55 +00:00
if (store.state.activeChannel) {
const channel = store.state.activeChannel.channel;
if (to.name !== "RoutedChat") {
store.commit("activeChannel", null);
}
2019-11-03 15:56:41 +00:00
2019-11-11 19:18:55 +00:00
// When switching out of a channel, mark everything as read
if (channel.messages.length > 0) {
channel.firstUnread = channel.messages[channel.messages.length - 1].id;
2019-11-03 15:56:41 +00:00
}
2019-11-11 19:18:55 +00:00
if (channel.messages.length > 100) {
channel.messages.splice(0, channel.messages.length - 100);
channel.moreHistoryAvailable = true;
}
2019-11-03 15:56:41 +00:00
}
});
function initialize() {
router.addRoutes([
{
2019-11-03 17:09:10 +00:00
name: "Connect",
path: "/connect",
2019-10-20 16:17:21 +00:00
component: Connect,
2019-11-08 18:50:28 +00:00
props: (route) => ({queryParams: route.query}),
2019-10-20 16:17:21 +00:00
},
{
2019-11-03 17:09:10 +00:00
name: "Settings",
2019-10-20 16:17:21 +00:00
path: "/settings",
component: Settings,
},
{
2019-11-03 17:09:10 +00:00
name: "Help",
2019-10-20 16:17:21 +00:00
path: "/help",
component: Help,
},
{
2019-11-03 17:09:10 +00:00
name: "Changelog",
2019-10-20 16:17:21 +00:00
path: "/changelog",
component: Changelog,
},
{
2019-11-03 17:09:10 +00:00
name: "NetworkEdit",
path: "/edit-network/:uuid",
component: NetworkEdit,
},
2019-10-20 16:17:21 +00:00
{
2019-11-03 17:09:10 +00:00
name: "RoutedChat",
2019-11-11 19:18:55 +00:00
path: "/chan-:id",
2019-10-20 16:17:21 +00:00
component: RoutedChat,
},
2019-11-03 15:56:41 +00:00
]);
}
2019-10-20 16:17:21 +00:00
2019-11-11 19:18:55 +00:00
function navigate(routeName, params = {}) {
router.push({name: routeName, params}).catch(() => {});
}
2019-11-16 17:24:03 +00:00
function switchToChannel(channel) {
return navigate("RoutedChat", {id: channel.id});
}
export {initialize, router, navigate, switchToChannel};