feat: migrate runtime backend to node server
This commit is contained in:
@@ -4,20 +4,20 @@ import { useEffect, useMemo, useRef, useState } from 'react';
|
||||
import {
|
||||
buildCustomWorldPlayableCharacters,
|
||||
} from '../../data/characterPresets';
|
||||
import {
|
||||
readSavedCustomWorldProfiles,
|
||||
upsertSavedCustomWorldProfile,
|
||||
} from '../../data/customWorldLibrary';
|
||||
import { getScenePreset } from '../../data/scenePresets';
|
||||
import {
|
||||
type CustomWorldGenerationProgress,
|
||||
generateCustomWorldProfile,
|
||||
} from '../../services/ai';
|
||||
} from '../../services/aiService';
|
||||
import {
|
||||
buildCustomWorldCreatorIntentDisplayText,
|
||||
buildCustomWorldCreatorIntentGenerationText,
|
||||
createEmptyCustomWorldCreatorIntent,
|
||||
} from '../../services/customWorldCreatorIntent';
|
||||
import {
|
||||
listCustomWorldLibrary,
|
||||
upsertCustomWorldProfile,
|
||||
} from '../../services/storageService';
|
||||
import {
|
||||
type CustomWorldCreatorIntent,
|
||||
type CustomWorldGenerationMode,
|
||||
@@ -172,7 +172,7 @@ export function PreGameSelectionFlow({
|
||||
useState<GameState['customWorldProfile']>(null);
|
||||
const [savedCustomWorldProfiles, setSavedCustomWorldProfiles] = useState<
|
||||
CustomWorldProfile[]
|
||||
>(() => readSavedCustomWorldProfiles());
|
||||
>([]);
|
||||
const [showDeveloperTeamModal, setShowDeveloperTeamModal] = useState(false);
|
||||
const [worldOnlineCounts, setWorldOnlineCounts] = useState<WorldOnlineCounts>(
|
||||
() => generateWorldOnlineCounts(),
|
||||
@@ -280,6 +280,25 @@ export function PreGameSelectionFlow({
|
||||
},
|
||||
[],
|
||||
);
|
||||
useEffect(() => {
|
||||
let isActive = true;
|
||||
|
||||
void listCustomWorldLibrary()
|
||||
.then((profiles) => {
|
||||
if (!isActive) return;
|
||||
setSavedCustomWorldProfiles(profiles);
|
||||
})
|
||||
.catch((error) => {
|
||||
console.warn(
|
||||
'[PreGameSelectionFlow] failed to load custom world library',
|
||||
error,
|
||||
);
|
||||
});
|
||||
|
||||
return () => {
|
||||
isActive = false;
|
||||
};
|
||||
}, []);
|
||||
|
||||
const leaveCustomWorldResult = () => {
|
||||
setGeneratedCustomWorldProfile(null);
|
||||
@@ -331,18 +350,18 @@ export function PreGameSelectionFlow({
|
||||
setShowCustomWorldModal(true);
|
||||
};
|
||||
|
||||
const saveGeneratedCustomWorld = () => {
|
||||
const saveGeneratedCustomWorld = async () => {
|
||||
if (!generatedCustomWorldProfile) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
setSavedCustomWorldProfiles(
|
||||
upsertSavedCustomWorldProfile(generatedCustomWorldProfile),
|
||||
await upsertCustomWorldProfile(generatedCustomWorldProfile),
|
||||
);
|
||||
} catch (error) {
|
||||
setCustomWorldError(
|
||||
error instanceof Error ? error.message : '本地保存自定义世界失败。',
|
||||
error instanceof Error ? error.message : '保存自定义世界失败。',
|
||||
);
|
||||
return;
|
||||
}
|
||||
@@ -650,7 +669,7 @@ export function PreGameSelectionFlow({
|
||||
id: generatedCustomWorldProfile.id,
|
||||
}
|
||||
: profile;
|
||||
const savedProfiles = upsertSavedCustomWorldProfile(persistedProfile);
|
||||
const savedProfiles = await upsertCustomWorldProfile(persistedProfile);
|
||||
setSavedCustomWorldProfiles(savedProfiles);
|
||||
setGeneratedCustomWorldProfile(null);
|
||||
setCustomWorldError(null);
|
||||
@@ -1034,7 +1053,9 @@ export function PreGameSelectionFlow({
|
||||
onRegenerateLandmarkNetwork={() => {
|
||||
void regenerateLandmarkNetwork();
|
||||
}}
|
||||
onSave={saveGeneratedCustomWorld}
|
||||
onSave={() => {
|
||||
void saveGeneratedCustomWorld();
|
||||
}}
|
||||
/>
|
||||
</motion.div>
|
||||
)}
|
||||
|
||||
Reference in New Issue
Block a user