From efb8793f2846f442874dfa4f10fa98f56e8cec1c Mon Sep 17 00:00:00 2001 From: Samuel Schepp Date: Tue, 15 Sep 2026 13:52:35 +0200 Subject: [PATCH 1/2] feat(nakar-client-web): adds share link to scenario card --- .../run-scenario-modal/RunScenarioModal.tsx | 42 ++++--------------- .../src/room/scenarios-panel/ScenarioCard.tsx | 28 +++++++++++++ .../scenarios-panel/createScenarioShareUrl.ts | 36 ++++++++++++++++ 3 files changed, 71 insertions(+), 35 deletions(-) create mode 100644 nakar-client-web/src/room/scenarios-panel/createScenarioShareUrl.ts diff --git a/nakar-client-web/src/room/run-scenario-modal/RunScenarioModal.tsx b/nakar-client-web/src/room/run-scenario-modal/RunScenarioModal.tsx index cca6acb4..7e588406 100644 --- a/nakar-client-web/src/room/run-scenario-modal/RunScenarioModal.tsx +++ b/nakar-client-web/src/room/run-scenario-modal/RunScenarioModal.tsx @@ -6,13 +6,10 @@ import { Panel } from "../../shared/elements/Panel.tsx"; import { NavbarButton } from "../../shared/elements/NavbarButton.tsx"; import { ScenarioIcon } from "../scenarios-panel/ScenarioIcon.tsx"; import { ArgumentDisplay } from "./ArgumentDisplay.tsx"; -import { actionControllerLoadScenario, ScenarioArgumentDto } from "api-client"; -import { Router } from "../../routing/Router.ts"; -import { CanvasSearchData } from "../canvas/CanvasSearchData.ts"; -import qs from "qs"; +import { actionControllerLoadScenario } from "api-client"; import { ClipboardButton } from "../../shared/elements/ClipboardButton.tsx"; -import { Link } from "react-router"; import { Collapsable } from "../../shared/elements/Collapsable.tsx"; +import { createScenarioShareUrl } from "../scenarios-panel/createScenarioShareUrl.ts"; export function RunScenarioModal() { const roomContext = useCanvasContext(); @@ -41,34 +38,7 @@ export function RunScenarioModal() { if (scenario == null) { return null; } - try { - const canvasSearchData: CanvasSearchData = { - scenario: { - id: scenario.id, - args: scenarioArguments.reduce( - ( - akku: Record, - next: ScenarioArgumentDto, - ): Record => ({ - ...akku, - [next.identifier]: next.value, - }), - {}, - ), - }, - }; - const url: URL = new URL( - window.location.origin + - Router.getCanvasPath( - roomContext.initialRoomData.id, - roomContext.initialCanvasData.id, - ), - ); - url.search = qs.stringify(canvasSearchData); - return url; - } catch { - return null; - } + return createScenarioShareUrl(scenario, roomContext, scenarioArguments); })(); const handleRun = async () => { @@ -137,8 +107,10 @@ export function RunScenarioModal() { > - - {shareUrl.toString()} + + + {shareUrl.toString()} + { + if (props.scenario.parameters.length > 0) { + return null; + } else { + return createScenarioShareUrl(props.scenario, canvasContext, []); + } + })(); + return ( None )} + + {shareUrl && ( + + + + Share this URL to run this scenario on start. + + + + + + {shareUrl.toString()} + + + + + + )} ); diff --git a/nakar-client-web/src/room/scenarios-panel/createScenarioShareUrl.ts b/nakar-client-web/src/room/scenarios-panel/createScenarioShareUrl.ts new file mode 100644 index 00000000..991e5574 --- /dev/null +++ b/nakar-client-web/src/room/scenarios-panel/createScenarioShareUrl.ts @@ -0,0 +1,36 @@ +import { CanvasSearchData } from "../canvas/CanvasSearchData.ts"; +import { ScenarioArgumentDto, ScenarioDto } from "api-client"; +import { Router } from "../../routing/Router.ts"; +import qs from "qs"; +import { CanvasContextData } from "../../pages/Canvas.tsx"; + +export function createScenarioShareUrl( + scenario: ScenarioDto, + roomContext: CanvasContextData, + scenarioArguments: ScenarioArgumentDto[], +): URL { + const canvasSearchData: CanvasSearchData = { + scenario: { + id: scenario.id, + args: scenarioArguments.reduce( + ( + akku: Record, + next: ScenarioArgumentDto, + ): Record => ({ + ...akku, + [next.identifier]: next.value, + }), + {}, + ), + }, + }; + const url: URL = new URL( + window.location.origin + + Router.getCanvasPath( + roomContext.initialRoomData.id, + roomContext.initialCanvasData.id, + ), + ); + url.search = qs.stringify(canvasSearchData); + return url; +} From 1cf03505099bb605b7179e9ee4d0009647a35efc Mon Sep 17 00:00:00 2001 From: Samuel Schepp Date: Tue, 15 Sep 2026 13:54:09 +0200 Subject: [PATCH 2/2] fix(nakar-client-web): fixes linting --- nakar-client-web/src/room/data-table/DataTable.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/nakar-client-web/src/room/data-table/DataTable.tsx b/nakar-client-web/src/room/data-table/DataTable.tsx index b6d1f83e..693802fe 100644 --- a/nakar-client-web/src/room/data-table/DataTable.tsx +++ b/nakar-client-web/src/room/data-table/DataTable.tsx @@ -3,7 +3,6 @@ import { useBearStore } from "../../state/useBearStore.ts"; export function DataTable() { const tableData = useBearStore((s) => s.room.scenario.graph.table.data); - const selectGraph = useBearStore((s) => s.room.canvas.tabs.selectGraph); return (