-
-
{shortcut.name}
-
- {shortcut.link}
-
+
+ {shortcut.name}
+ {shortcut.description}
+
+
+
{
+ handleCopyButtonClick(shortcut);
+ }}
+ >
+
+
+
+
+
+
+ showCreateShortcutDialog(workspaceId, shortcut.id)}
+ >
+ Edit
+
+ {
+ handleDeleteShortcutButtonClick(shortcut);
+ }}
+ >
+ Delete
+
+ >
+ }
+ actionsClassName="!w-24"
+ >
-
- showCreateShortcutDialog(workspaceId, shortcut.id)}
- >
- Edit
-
- {
- handleDeleteShortcutButtonClick(shortcut);
- }}
- >
- Delete
-
- >
- }
- actionsClassName="!w-24"
- >
);
})}
diff --git a/web/src/helpers/api.ts b/web/src/helpers/api.ts
index b58c35b..1ad9484 100644
--- a/web/src/helpers/api.ts
+++ b/web/src/helpers/api.ts
@@ -87,6 +87,10 @@ export function getShortcutList(shortcutFind?: ShortcutFind) {
return axios.get
>(`/api/shortcut?${queryList.join("&")}`);
}
+export function getShortcutWithNameAndWorkspaceName(workspaceName: string, shortcutName: string) {
+ return axios.get>(`/api/workspace/${workspaceName}/shortcut/${shortcutName}`);
+}
+
export function createShortcut(shortcutCreate: ShortcutCreate) {
return axios.post>("/api/shortcut", shortcutCreate);
}
diff --git a/web/src/helpers/utils.ts b/web/src/helpers/utils.ts
index 25a4920..2752928 100644
--- a/web/src/helpers/utils.ts
+++ b/web/src/helpers/utils.ts
@@ -44,15 +44,3 @@ export function throttle(fn: FunctionType, delay: number) {
}, delay);
};
}
-
-export async function copyTextToClipboard(text: string) {
- if (navigator.clipboard && navigator.clipboard.writeText) {
- try {
- await navigator.clipboard.writeText(text);
- } catch (error: unknown) {
- console.warn("Copy to clipboard failed.", error);
- }
- } else {
- console.warn("Copy to clipboard failed, methods not supports.");
- }
-}
diff --git a/web/src/pages/ShortcutRedirector.tsx b/web/src/pages/ShortcutRedirector.tsx
new file mode 100644
index 0000000..c068781
--- /dev/null
+++ b/web/src/pages/ShortcutRedirector.tsx
@@ -0,0 +1,43 @@
+import { useEffect, useState } from "react";
+import { useParams } from "react-router-dom";
+import Header from "../components/Header";
+import { getShortcutWithNameAndWorkspaceName } from "../helpers/api";
+import useLoading from "../hooks/useLoading";
+
+interface State {
+ errMessage?: string;
+}
+
+const ShortcutRedirector: React.FC = () => {
+ const params = useParams();
+ const [state, setState] = useState();
+ const loadingState = useLoading();
+
+ useEffect(() => {
+ const workspaceName = params.workspaceName || "";
+ const shortcutName = params.shortcutName || "";
+ getShortcutWithNameAndWorkspaceName(workspaceName, shortcutName)
+ .then(({ data: { data: shortcut } }) => {
+ if (shortcut) {
+ window.location.href = shortcut.link;
+ }
+ })
+ .catch((err) => {
+ setState({
+ errMessage: err?.message || "Not found",
+ });
+ loadingState.setFinish();
+ });
+ }, []);
+
+ return loadingState.isLoading ? null : (
+
+ );
+};
+
+export default ShortcutRedirector;
diff --git a/web/yarn.lock b/web/yarn.lock
index 631ecc4..07ded7d 100644
--- a/web/yarn.lock
+++ b/web/yarn.lock
@@ -809,6 +809,13 @@ copy-anything@^2.0.1:
dependencies:
is-what "^3.14.1"
+copy-to-clipboard@^3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.2.tgz#5b263ec2366224b100181dded7ce0579b340c107"
+ integrity sha512-Vme1Z6RUDzrb6xAI7EZlVZ5uvOk2F//GaxKUxajDqm9LhOVM1inxNAD2vy+UZDYsd0uyA9s7b3/FVZPSxqrCfg==
+ dependencies:
+ toggle-selection "^1.0.6"
+
cross-spawn@^7.0.2:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
@@ -2474,6 +2481,11 @@ to-regex-range@^5.0.1:
dependencies:
is-number "^7.0.0"
+toggle-selection@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32"
+ integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==
+
tslib@^1.8.1:
version "1.14.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"