Files
outline/app/utils/routeHelpers.ts
T
2025-12-28 08:56:32 -05:00

170 lines
3.9 KiB
TypeScript

import queryString from "query-string";
import type Collection from "~/models/Collection";
import type Comment from "~/models/Comment";
import type Document from "~/models/Document";
import env from "~/env";
export function homePath(): string {
return env.ROOT_SHARE_ID ? "/" : "/home";
}
export function logoutPath() {
return {
pathname: "/",
search: "logout=true",
};
}
export function draftsPath(): string {
return "/drafts";
}
export function archivePath(): string {
return "/archive";
}
export function trashPath(): string {
return "/trash";
}
export function debugPath(): string {
return "/debug";
}
export function debugChangesetsPath(): string {
return "/debug/changesets";
}
export function settingsPath(...args: string[]): string {
return "/settings" + (args.length > 0 ? `/${args.join("/")}` : "");
}
export function commentPath(document: Document, comment: Comment): string {
return `${documentPath(document)}?commentId=${comment.id}${
comment.isResolved ? "&resolved=1" : ""
}`;
}
export function collectionPath(
collection: Collection,
section?: string
): string {
if (section) {
return `${collection.path}/${section}`;
}
return collection.path;
}
export function collectionEditPath(collection: Collection): string {
return collectionPath(collection, "overview/edit");
}
export function updateCollectionPath(
oldUrl: string,
collection: Collection
): string {
// Update url to match the current one
return oldUrl.replace(
new RegExp("/collection/[0-9a-zA-Z-_~]*"),
collection.path
);
}
export function documentPath(doc: Document): string {
return doc.path;
}
export function documentEditPath(doc: Document): string {
return `${documentPath(doc)}/edit`;
}
export function documentHistoryPath(
doc: Document,
revisionId?: string
): string {
let base = `${documentPath(doc)}/history`;
if (revisionId) {
base += `/${revisionId}`;
}
return base;
}
/**
* Replace full url's document part with the new one in case
* the document slug has been updated
*/
export function updateDocumentPath(oldUrl: string, document: Document): string {
// Update url to match the current one
return oldUrl.replace(
new RegExp("/doc/([0-9a-zA-Z-_~]*-[a-zA-z0-9]{10,15})"),
document.url
);
}
export function newTemplatePath(collectionId?: string) {
return collectionId
? settingsPath("templates") + `/new?collectionId=${collectionId}`
: `${settingsPath("templates")}/new`;
}
export function newDocumentPath(
collectionId?: string | null,
params: {
templateId?: string;
} = {}
): string {
return collectionId
? `/collection/${collectionId}/new?${queryString.stringify(params)}`
: `/doc/new?${queryString.stringify(params)}`;
}
export function newNestedDocumentPath(parentDocumentId?: string): string {
return `/doc/new?${queryString.stringify({ parentDocumentId })}`;
}
export function searchPath({
query,
collectionId,
documentId,
ref,
}: {
query?: string;
collectionId?: string;
documentId?: string;
ref?: string;
} = {}): string {
let search = queryString.stringify({
q: query,
collectionId,
documentId,
ref,
});
search = search ? `?${search}` : "";
return `/search${search}`;
}
export function sharedModelPath(shareId: string, modelPath?: string) {
if (shareId === env.ROOT_SHARE_ID) {
return modelPath ? modelPath : "/";
}
return modelPath ? `/s/${shareId}${modelPath}` : `/s/${shareId}`;
}
export function urlify(path: string): string {
return `${window.location.origin}${path}`;
}
export const matchCollectionSlug =
":collectionSlug([0-9a-zA-Z-_~]*-[a-zA-z0-9]{10,15})";
export const matchCollectionEdit = `/collection/${matchCollectionSlug}/overview/edit`;
export const matchDocumentSlug =
":documentSlug([0-9a-zA-Z-_~]*-[a-zA-z0-9]{10,15})";
export const matchDocumentEdit = `/doc/${matchDocumentSlug}/edit`;
export const matchDocumentHistory = `/doc/${matchDocumentSlug}/history/:revisionId?`;