fix rpg agent refresh restore route
This commit is contained in:
@@ -3,6 +3,7 @@ import { expect, test } from 'vitest';
|
||||
import {
|
||||
clearCustomWorldAgentUiState,
|
||||
readCustomWorldAgentUiState,
|
||||
shouldRestoreCustomWorldAgentUiState,
|
||||
writeCustomWorldAgentUiState,
|
||||
} from './customWorldAgentUiState';
|
||||
|
||||
@@ -73,3 +74,49 @@ test('custom world agent ui state reads from query first and persists to session
|
||||
clearCustomWorldAgentUiState(env);
|
||||
expect(readCustomWorldAgentUiState(env)).toEqual({});
|
||||
});
|
||||
|
||||
test('custom world agent ui state only auto restores stored pointers on RPG creation paths', () => {
|
||||
const sessionStorage = createMemoryStorage();
|
||||
sessionStorage.setItem(
|
||||
'genarrative.custom-world-agent-ui.v1',
|
||||
JSON.stringify({
|
||||
activeSessionId: 'session-1',
|
||||
ownerUserId: 'user-1',
|
||||
}),
|
||||
);
|
||||
|
||||
expect(
|
||||
shouldRestoreCustomWorldAgentUiState({
|
||||
location: {
|
||||
pathname: '/',
|
||||
search: '',
|
||||
},
|
||||
history: null,
|
||||
sessionStorage,
|
||||
}),
|
||||
).toBe(false);
|
||||
|
||||
expect(
|
||||
shouldRestoreCustomWorldAgentUiState({
|
||||
location: {
|
||||
pathname: '/creation/rpg/agent',
|
||||
search: '',
|
||||
},
|
||||
history: null,
|
||||
sessionStorage,
|
||||
}),
|
||||
).toBe(true);
|
||||
});
|
||||
|
||||
test('custom world agent ui state restores explicit query pointers on any main path', () => {
|
||||
expect(
|
||||
shouldRestoreCustomWorldAgentUiState({
|
||||
location: {
|
||||
pathname: '/',
|
||||
search: '?customWorldSessionId=session-1',
|
||||
},
|
||||
history: null,
|
||||
sessionStorage: createMemoryStorage(),
|
||||
}),
|
||||
).toBe(true);
|
||||
});
|
||||
|
||||
@@ -56,6 +56,49 @@ function normalizeGenerationSource(value: unknown) {
|
||||
return value === 'agent-draft-foundation' ? value : null;
|
||||
}
|
||||
|
||||
function hasExplicitAgentUiStateQuery(
|
||||
params: URLSearchParams,
|
||||
) {
|
||||
return (
|
||||
params.has(CUSTOM_WORLD_AGENT_SESSION_QUERY_KEY) ||
|
||||
params.has(CUSTOM_WORLD_AGENT_OPERATION_QUERY_KEY) ||
|
||||
params.has(CUSTOM_WORLD_GENERATION_SOURCE_QUERY_KEY)
|
||||
);
|
||||
}
|
||||
|
||||
function normalizePathname(value: string | undefined) {
|
||||
const pathname = value?.trim().toLowerCase() ?? '';
|
||||
if (!pathname || pathname === '/') {
|
||||
return '/';
|
||||
}
|
||||
|
||||
return pathname.replace(/\/+$/u, '');
|
||||
}
|
||||
|
||||
function isRpgCreationRestorePath(pathname: string | undefined) {
|
||||
const normalizedPathname = normalizePathname(pathname);
|
||||
return (
|
||||
normalizedPathname === '/creation/rpg' ||
|
||||
normalizedPathname.startsWith('/creation/rpg/')
|
||||
);
|
||||
}
|
||||
|
||||
export function shouldRestoreCustomWorldAgentUiState(
|
||||
env?: CustomWorldAgentUiEnvironment,
|
||||
) {
|
||||
const resolved = resolveEnvironment(env);
|
||||
const params = new URLSearchParams(resolved.location?.search ?? '');
|
||||
|
||||
// URL 显式恢复参数优先于当前路径,用于支持外部分享或登录回跳后的深链恢复。
|
||||
if (hasExplicitAgentUiStateQuery(params)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// sessionStorage 里的残留指针只能在 RPG 创作页面生效,
|
||||
// 避免刷新平台首页时被旧工作区状态强制带到 Agent 页面。
|
||||
return isRpgCreationRestorePath(resolved.location?.pathname);
|
||||
}
|
||||
|
||||
export function readCustomWorldAgentUiState(
|
||||
env?: CustomWorldAgentUiEnvironment,
|
||||
): CustomWorldAgentUiState {
|
||||
|
||||
Reference in New Issue
Block a user