feat: add Inter font, extract useStoryGeneration hook, fix mobile menu
This commit is contained in:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user