56 lines
1.6 KiB
TypeScript
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,
|
|
};
|
|
}
|