generated from nhcarrigan/template
5d2d71983a
Introduces a schema version field to GameState. Saves without the current schema version are flagged on load (showing a modal prompting reset or proceed), and cloud saves from outdated clients are rejected server-side. Removes all backfill code now that outdated saves are handled via the reset flow instead. New POST /game/reset endpoint creates a fresh save for players who choose to reset. Save version and current schema version are displayed in the sidebar below the app version.
50 lines
1.5 KiB
TypeScript
50 lines
1.5 KiB
TypeScript
import { useState } from "react";
|
||
import { useGame } from "../../context/GameContext.js";
|
||
|
||
interface OutdatedSchemaModalProps {
|
||
onDismiss: () => void;
|
||
}
|
||
|
||
export const OutdatedSchemaModal = ({ onDismiss }: OutdatedSchemaModalProps): React.JSX.Element => {
|
||
const { resetProgress } = useGame();
|
||
const [isResetting, setIsResetting] = useState(false);
|
||
|
||
const handleReset = async (): Promise<void> => {
|
||
setIsResetting(true);
|
||
await resetProgress();
|
||
setIsResetting(false);
|
||
};
|
||
|
||
return (
|
||
<div className="modal-overlay">
|
||
<div className="modal offline-modal">
|
||
<h2>⚠️ Outdated Save Data</h2>
|
||
<p>
|
||
Your save data is from an older version of Elysium and may cause bugs or unexpected
|
||
behaviour. Cloud saves are <strong>disabled</strong> until you reset your progress.
|
||
</p>
|
||
<p>
|
||
Resetting will start you fresh — all progress will be lost.
|
||
</p>
|
||
<div className="outdated-modal-actions">
|
||
<button
|
||
className="outdated-modal-reset-button"
|
||
onClick={() => { void handleReset(); }}
|
||
disabled={isResetting}
|
||
type="button"
|
||
>
|
||
{isResetting ? "Resetting…" : "Reset Progress"}
|
||
</button>
|
||
<button
|
||
className="modal-close-button"
|
||
onClick={onDismiss}
|
||
type="button"
|
||
>
|
||
Proceed with Bugs
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
);
|
||
};
|