76 lines
2.8 KiB
TypeScript
76 lines
2.8 KiB
TypeScript
const route = {
|
|
methods: {
|
|
route(
|
|
routeName: string,
|
|
parameters: Record<string, number | string> = {}
|
|
): string | null {
|
|
const routes = route.flattenProperties(window.__SYSTEM._routes);
|
|
const routeUrl =
|
|
Object.keys(routes).indexOf(routeName) !== -1
|
|
? routes[routeName]
|
|
: null;
|
|
if (!routeUrl) {
|
|
return routeUrl;
|
|
}
|
|
// copy parameters
|
|
const iParameters = Object.assign({}, parameters),
|
|
origin = window.location.origin,
|
|
hash = window.location.hash;
|
|
let pathname = routeUrl.replace(origin, ""),
|
|
search = window.location.search;
|
|
|
|
// Replace in path name.
|
|
for (const paramName in iParameters) {
|
|
const paramValue = parameters[paramName];
|
|
if (pathname.indexOf(paramName) !== -1) {
|
|
pathname = pathname.replace(
|
|
paramName,
|
|
paramValue as string
|
|
);
|
|
}
|
|
delete parameters[paramName];
|
|
}
|
|
|
|
for (let paramName in parameters) {
|
|
let paramValue = parameters[paramName];
|
|
if (search.indexOf(paramName + "=") >= 0) {
|
|
const prefix = search.substring(
|
|
0,
|
|
search.indexOf(paramName + "=")
|
|
);
|
|
let suffix = search.substring(
|
|
search.indexOf(paramName + "=")
|
|
);
|
|
suffix = suffix.substring(suffix.indexOf("=") + 1);
|
|
suffix =
|
|
suffix.indexOf("&") >= 0
|
|
? suffix.substring(suffix.indexOf("&"))
|
|
: "";
|
|
search = `${prefix}${paramName}=${paramValue}${suffix}`;
|
|
} else if (search.indexOf("?") < 0) {
|
|
search += `?${paramName}=${paramValue}`;
|
|
} else {
|
|
search += `&${paramName}=${paramValue}`;
|
|
}
|
|
}
|
|
return `${origin}${pathname}${search}${hash}`;
|
|
},
|
|
},
|
|
flattenProperties(
|
|
obj: Record<PropertyKey, any>,
|
|
parent: string | null = null,
|
|
res: Record<PropertyKey, any> = {}
|
|
): Record<PropertyKey, any> {
|
|
for (const key of Object.keys(obj)) {
|
|
const propName = parent ? parent + "." + key : key;
|
|
if (typeof obj[key] === "object") {
|
|
route.flattenProperties(obj[key], propName, res);
|
|
} else {
|
|
res[propName] = obj[key];
|
|
}
|
|
}
|
|
return res;
|
|
},
|
|
};
|
|
|
|
export default route;
|