waveterm/frontend/util/historyutil.ts

76 lines
2.5 KiB
TypeScript
Raw Normal View History

// Copyright 2024, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0
import * as util from "@/util/util";
const MaxHistory = 20;
// this needs to be fixed for windows
function getParentDirectory(path: string): string {
if (util.isBlank(path) == null) {
// this not great, ideally we'd never be passed a null path
return "/";
}
if (path == "/") {
return "/";
}
const splitPath = path.split("/");
splitPath.pop();
if (splitPath.length == 1 && splitPath[0] == "") {
return "/";
}
const newPath = splitPath.join("/");
return newPath;
}
function goHistoryBack(curValKey: "url" | "file", curVal: string, meta: MetaType, backToParent: boolean): MetaType {
const rtnMeta: MetaType = {};
const history = (meta?.history ?? []).slice();
const historyForward = (meta?.["history:forward"] ?? []).slice();
if (history == null || history.length == 0) {
if (backToParent) {
const parentDir = getParentDirectory(curVal);
if (parentDir == curVal) {
return null;
}
historyForward.unshift(curVal);
while (historyForward.length > MaxHistory) {
historyForward.pop();
}
return { [curValKey]: parentDir, "history:forward": historyForward };
} else {
return null;
}
}
const lastVal = history.pop();
historyForward.unshift(curVal);
return { [curValKey]: lastVal, history: history, "history:forward": historyForward };
}
function goHistoryForward(curValKey: "url" | "file", curVal: string, meta: MetaType): MetaType {
const rtnMeta: MetaType = {};
let history = (meta?.history ?? []).slice();
const historyForward = (meta?.["history:forward"] ?? []).slice();
if (historyForward == null || historyForward.length == 0) {
return null;
}
const lastVal = historyForward.shift();
history.push(curVal);
if (history.length > MaxHistory) {
history.shift();
}
return { [curValKey]: lastVal, history: history, "history:forward": historyForward };
}
function goHistory(curValKey: "url" | "file", curVal: string, newVal: string, meta: MetaType): MetaType {
const rtnMeta: MetaType = {};
const history = (meta?.history ?? []).slice();
history.push(curVal);
if (history.length > MaxHistory) {
history.shift();
}
return { [curValKey]: newVal, history: history, "history:forward": [] };
}
export { getParentDirectory, goHistory, goHistoryBack, goHistoryForward };