Add share
This commit is contained in:
30
src/App.tsx
30
src/App.tsx
@@ -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"
|
||||
>
|
||||
|
||||
Reference in New Issue
Block a user