diff --git a/package.json b/package.json index f8eb00e..57d642f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lms", - "version": "1.2.5", + "version": "1.2.6", "description": "Autonomy Studio LMS Electron app", "main": "./out/main/index.js", "author": { diff --git a/scripts/test-linked-ros-settings.cjs b/scripts/test-linked-ros-settings.cjs new file mode 100644 index 0000000..54028ee --- /dev/null +++ b/scripts/test-linked-ros-settings.cjs @@ -0,0 +1,37 @@ +const { test } = require('node:test') +const assert = require('node:assert/strict') +const fs = require('node:fs') +const vm = require('node:vm') +const ts = require('typescript') + +function setup() { + const data = new Map() + const exports = {} + vm.runInNewContext(ts.transpileModule(fs.readFileSync(require.resolve('../src/renderer/src/features/workspace/sourceSettings.ts'), 'utf8'), { + compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2022 }, + }).outputText, { + exports, + require: () => ({ STUDIO_SOURCE_SETTINGS_STORAGE_KEY: 'test-settings' }), + window: { localStorage: { getItem: key => data.get(key) ?? null, setItem: (key, value) => data.set(key, value) } }, + }) + return exports +} + +test('remote workspace reads local domain and linked platform by actual platform ID', () => { + const api = setup() + api.storeStudioSourceSettings('local-platform-uuid', { ...api.defaultStudioSourceSettings, rosDomainId: '75', rosLinkedPlatformId: 'yahboom-uuid' }) + const result = api.readLocalStudioSourceSettings([ + { id: 'yahboom-uuid', platformKey: 'yahboom', sourceSettings: { rosDomainId: '77' } }, + { id: 'local-platform-uuid', platformKey: 'futuredrive-local-pc' }, + ]) + assert.equal(result.rosDomainId, '75') + assert.equal(result.rosLinkedPlatformId, 'yahboom-uuid') +}) + +test('local platform defaults and unlinked selection are preserved', () => { + const api = setup() + const platforms = [{ id: 'local-platform-uuid', platformKey: 'futuredrive-local-pc', sourceSettings: { rosDomainId: '76' } }] + assert.equal(api.readLocalStudioSourceSettings(platforms).rosDomainId, '76') + api.storeStudioSourceSettings('local-platform-uuid', { ...api.defaultStudioSourceSettings, rosDomainId: '75', rosLinkedPlatformId: null }) + assert.equal(api.readLocalStudioSourceSettings(platforms).rosLinkedPlatformId, null) +}) diff --git a/src/renderer/src/App.tsx b/src/renderer/src/App.tsx index 224a7ec..ad4b68d 100644 --- a/src/renderer/src/App.tsx +++ b/src/renderer/src/App.tsx @@ -72,7 +72,7 @@ import { useWorkspaceVisualization } from './features/workspace/useWorkspaceVisu import { makeModuleParameterKey, readStoredModuleParameters, serializeModuleParameters } from './features/workspace/moduleParameters' import { parseHostFromUrl, readNestedString } from './features/workspace/remoteWorkspaceTarget' import { resolveRuntimeModules } from './features/workspace/runtimeModuleSet' -import { defaultStudioSourceSettings, makePlatformWorkspaceRoot, makeTeamWeekWorkspaceRoot, makeWeekWorkspaceRoot, normalizeStudioSourceSettings, readStudioSourceSettings, storeStudioSourceSettings } from './features/workspace/sourceSettings' +import { defaultStudioSourceSettings, makePlatformWorkspaceRoot, makeTeamWeekWorkspaceRoot, makeWeekWorkspaceRoot, normalizeStudioSourceSettings, readLocalStudioSourceSettings, readStudioSourceSettings, storeStudioSourceSettings } from './features/workspace/sourceSettings' import { makeWorkspaceUiSessionKey, readStudioRuntimeSessionState, storeStudioRuntimeSessionState } from './features/workspace/studioRuntimeSession' import type { StudioRuntimeSessionState } from './features/workspace/studioRuntimeSession' import type { ModuleRow, RosNetworkConfig, RuntimeImageArtifact } from './features/workspace/types' @@ -567,8 +567,8 @@ function LocalPcWorkspaceMockup({ const [sourceSettings, setSourceSettings] = useState(() => readStudioSourceSettings(platformId, platformSourceSettingsDefaults)) const [sourceSettingsDraft, setSourceSettingsDraft] = useState(() => readStudioSourceSettings(platformId, platformSourceSettingsDefaults)) const localWorkspaceSettings = useMemo( - () => readStudioSourceSettings('futuredrive-local-pc', defaultStudioSourceSettings), - [platformId, sourceSettings.rosLinkedPlatformId, sourceSettings.rosDomainId, sourceSettings.visualizationBridgeLocation], + () => remoteWorkspace ? readLocalStudioSourceSettings(platformOptions) : sourceSettings, + [remoteWorkspace, platformOptions, sourceSettings], ) const linkedPlatformId = remoteWorkspace ? localWorkspaceSettings.rosLinkedPlatformId diff --git a/src/renderer/src/features/workspace/sourceSettings.ts b/src/renderer/src/features/workspace/sourceSettings.ts index aad6b71..cd062e8 100644 --- a/src/renderer/src/features/workspace/sourceSettings.ts +++ b/src/renderer/src/features/workspace/sourceSettings.ts @@ -95,3 +95,12 @@ export function storeStudioSourceSettings(platformId: string, settings: StudioSo // Local source settings can be re-entered if persistence is unavailable. } } + +export function readLocalStudioSourceSettings(platforms: Array<{ + id: string + platformKey: string + sourceSettings?: Partial | null +}>): StudioSourceSettings { + const local = platforms.find((platform) => platform.platformKey === 'futuredrive-local-pc') + return readStudioSourceSettings(local?.id ?? 'local-pc', normalizeStudioSourceSettings(local?.sourceSettings)) +}