Add share

This commit is contained in:
Халимов Рустам
2025-12-27 19:04:48 +03:00
parent 50cdd3a945
commit 8010c172c7
3 changed files with 214 additions and 169 deletions

View File

@@ -1,14 +1,16 @@
import React, { useState, useMemo } from 'react';
import React, { useState, useMemo, useEffect } from 'react';
import { AppConfig, LayoutSplits, GeneratedPart } from './types';
// Убедись, что этот файл существует по этому пути
// Импорт должен быть правильным, проверь путь
import { calculateParts } from './services/geometryGenerator';
import { ConfigStep } from './components/ConfigStep';
import { LayoutStep } from './components/LayoutStep';
import { PreviewStep } from './components/PreviewStep';
import { parseShareUrl } from './utils/share'; // <--- Новый импорт
import { ChevronRight, ChevronLeft, Box } from 'lucide-react';
const App = () => {
const [step, setStep] = useState(1);
const [isLoadedFromUrl, setIsLoadedFromUrl] = useState(false);
// State
const [config, setConfig] = useState<AppConfig>({
@@ -22,7 +24,22 @@ const App = () => {
y: []
});
// Derived State: Parts (Мгновенный пересчет без API)
// --- ЛОГИКА ВОССТАНОВЛЕНИЯ ИЗ ССЫЛКИ ---
useEffect(() => {
const sharedData = parseShareUrl();
if (sharedData) {
setConfig(sharedData.config);
setSplits(sharedData.splits);
setStep(3); // Сразу прыгаем на превью
setIsLoadedFromUrl(true);
// Очищаем URL, чтобы он не мозолил глаза (опционально)
window.history.replaceState({}, '', window.location.pathname);
}
}, []);
// ---------------------------------------
// Derived State: Parts
const parts: GeneratedPart[] = useMemo(() => {
return calculateParts(config, splits);
}, [config, splits]);
@@ -38,7 +55,7 @@ const App = () => {
</div>
<div>
<h1 className="text-xl font-bold tracking-tight">PrintFit</h1>
<p className="text-xs text-gray-400">Генератор без ИИ</p>
<p className="text-xs text-gray-400">Генератор органайзеров</p>
</div>
</div>
@@ -77,7 +94,8 @@ const App = () => {
{step === 3 && (
<div className="h-[calc(100vh-200px)] min-h-[600px] animate-fade-in">
<PreviewStep parts={parts} config={config} />
{/* Передаем splits, чтобы кнопка Share могла их использовать */}
<PreviewStep parts={parts} config={config} splits={splits} />
</div>
)}
</main>
@@ -109,6 +127,8 @@ const App = () => {
onClick={() => {
setStep(1);
setSplits({x: [], y: []});
// Сбрасываем URL если он был
window.history.replaceState({}, '', window.location.pathname);
}}
className="flex items-center gap-2 px-6 py-3 rounded-lg font-semibold text-gray-400 hover:text-white transition-colors border border-transparent hover:border-slate-700"
>