Files
flagnote-web/src/router/index.js
Jesse-Ma ba6cfe1fbf path
2023-02-27 14:21:18 +08:00

150 lines
2.9 KiB
JavaScript

import Vue from "vue";
import VueRouter from "vue-router";
import EditNote from "@/views/EditNote.vue";
import ViewNote from "@/views/ViewNote.vue";
import ErrorRoute from "@/views/ErrorRoute.vue";
import ErrorNote from "@/views/ErrorNote.vue";
import { getKeyMeta, getNoteMeta } from "@/api/note";
import { getStoreKey } from "@/api/lock";
import storage from "@/libs/storage";
Vue.use(VueRouter);
var keyMeta = null;
var noteMeta = null;
var errorMeta = null;
function getKeyMetaParam() {
return keyMeta;
}
function getNoteMetaParam() {
return noteMeta;
}
function getErrorMetaParam() {
return errorMeta;
}
function getNoteView() {
if (errorMeta) {
return;
}
let path = location.pathname;
let key = path.substring(1, path.length);
if (keyMeta && keyMeta.key) {
key = keyMeta.key;
}
let regKey = /^[abcdefhikmnopqstuvwxyz23456789]{16}$/;
if (!regKey.test(key)) {
errorMeta = 100002;
return ErrorNote;
}
if (keyMeta && keyMeta.key) {
//firstEdit
return EditNote;
}
//set noteMeta
noteMeta = getNoteMeta(key);
//server error
if (!noteMeta) {
errorMeta = 100006;
return ErrorNote;
}
//invalidated key
if (!noteMeta.key) {
errorMeta = 100002;
return ErrorNote;
}
//validated state
if (1 == noteMeta.state) {
return ViewNote;
}
//deleted
if (0 == noteMeta.state) {
let storeKey = getStoreKey(key);
storage.local.delete(storeKey);
// user deleted
if (noteMeta.ttl > 0) {
errorMeta = 100003;
return ErrorNote;
} else {// timeout
errorMeta = 100004;
return ErrorNote;
}
}
if (null == noteMeta.state) {
let storeKey = getStoreKey(key);
//if has storage , then edit
if (storage.local.getText(storeKey)) {
return EditNote;
} else {
//storage is empty
let df = storage.session.getText(storeKey + "_delete")
if (df) {//unsubmitted,user deleted.
errorMeta = 100003;
return ErrorNote;
} else {//unsubmitted
errorMeta = 100005;
return ErrorNote;
}
}
}
// other exception
errorMeta = 100001;
return ErrorNote;
}
function getHomeRedirect() {
let path = location.pathname;
if (path != "/") {
return;
}
//setKeyMeta
keyMeta = getKeyMeta();
// server error
if (!keyMeta) {
errorMeta = 100006;
return "/error_"+errorMeta;
}
return "/" + keyMeta.key;
}
const routes = [
{
path: "/",
name: "home",
redirect: getHomeRedirect(),
},
{ path: "/error_:code([0-9]{6})", component: ErrorNote },
{
path: "/:name([a-z0-9]{10,20})",
name: "note",
component: getNoteView(),
meta: { keyMeta: getKeyMetaParam(), noteMeta: getNoteMetaParam(), errorMeta: getErrorMetaParam() },
},
{ path: "/:path(.*)", component: ErrorRoute }
];
const router = new VueRouter({
routes,
mode: "history",
});
export default router;