feat: add Inter font, extract useStoryGeneration hook, fix mobile menu

This commit is contained in:
Alexej Wolff
2026-05-06 00:11:33 +02:00
parent c9a7144960
commit c379074781
8 changed files with 476 additions and 6 deletions
+40 -1
View File
@@ -9,6 +9,7 @@ import {
getNPCCharacters,
} from "../services/api";
import { generateAvatarUrl } from "../services/imageGen";
import { useStoryGeneration } from "../hooks/useStoryGeneration";
import type {
Character,
CharacterAge,
@@ -93,6 +94,9 @@ export default function CreateStoryPage() {
const [savedNPCs, setSavedNPCs] = useState<NPCCharacter[]>([]);
const [showNPCSelector, setShowNPCSelector] = useState(false);
// Story generation hook
const { isGenerating: generatingPlot, generatePlot } = useStoryGeneration();
const [form, setForm] = useState({
title: "",
description: "",
@@ -344,6 +348,31 @@ export default function CreateStoryPage() {
}
};
// Генерация сюжета от ИИ
const handleGeneratePlot = async () => {
const result = await generatePlot({
title: form.title,
summary: form.summary,
genres: form.genres,
settings: form.settings,
worldName: form.worldName,
worldDescription: form.worldDescription,
isNsfw: form.isNsfw,
characters: form.characters,
});
if (result === null && !form.title && !form.summary && form.genres.length === 0 && form.settings.length === 0) {
alert("Заполните хотя бы название, краткое содержание, жанры или сеттинг для генерации сюжета");
return;
}
if (result) {
setForm(prev => ({ ...prev, plot: result }));
} else {
alert("Ошибка при генерации сюжета");
}
};
// Правила мира
const handleRuleChange = (index: number, value: string) => {
const newRules = [...form.worldRules];
@@ -697,7 +726,17 @@ export default function CreateStoryPage() {
</h2>
<div className="form-group">
<label htmlFor="plot">Полный сюжет *</label>
<div className="plot-header">
<label htmlFor="plot">Полный сюжет *</label>
<button
type="button"
onClick={handleGeneratePlot}
className="btn-generate-plot"
disabled={generatingPlot}
>
{generatingPlot ? "⏳ Генерация..." : "✨ Сгенерировать сюжет"}
</button>
</div>
<p className="field-hint">
Основа для ИИ подробное описание сюжета и ключевых событий.
Поддерживается Markdown.