Files
Genarrative/src/components/rpg-entry/useRpgEntryNavigation.ts
2026-04-21 18:27:46 +08:00

56 lines
1.6 KiB
TypeScript

import { useCallback } from 'react';
import type { CustomWorldLibraryEntry } from '../../../packages/shared/src/contracts/runtime';
import type { CustomWorldProfile } from '../../types';
import type { SelectionStage } from './rpgEntryTypes';
type UseRpgEntryNavigationParams = {
setSelectionStage: (stage: SelectionStage) => void;
setSelectedDetailEntry: (
entry: CustomWorldLibraryEntry<CustomWorldProfile> | null,
) => void;
};
/**
* 收口 RPG 入口壳层的阶段跳转,避免页面内散落大量匿名 setState 回调。
*/
export function useRpgEntryNavigation(
params: UseRpgEntryNavigationParams,
) {
const { setSelectionStage, setSelectedDetailEntry } = params;
const backToPlatformHome = useCallback(() => {
setSelectionStage('platform');
}, [setSelectionStage]);
const backToPlatformWithClearedDetail = useCallback(() => {
setSelectedDetailEntry(null);
setSelectionStage('platform');
}, [setSelectedDetailEntry, setSelectionStage]);
const openDetailStage = useCallback(() => {
setSelectionStage('detail');
}, [setSelectionStage]);
const openAgentWorkspaceStage = useCallback(() => {
setSelectionStage('agent-workspace');
}, [setSelectionStage]);
const openCustomWorldGenerationStage = useCallback(() => {
setSelectionStage('custom-world-generating');
}, [setSelectionStage]);
const openCustomWorldResultStage = useCallback(() => {
setSelectionStage('custom-world-result');
}, [setSelectionStage]);
return {
backToPlatformHome,
backToPlatformWithClearedDetail,
openDetailStage,
openAgentWorkspaceStage,
openCustomWorldGenerationStage,
openCustomWorldResultStage,
};
}