Renames
This commit is contained in:
@@ -5,7 +5,7 @@ import * as THREE from 'three';
|
|||||||
import JSZip from 'jszip';
|
import JSZip from 'jszip';
|
||||||
import { AppConfig, GeneratedPart, LayoutSplits } from '../types';
|
import { AppConfig, GeneratedPart, LayoutSplits } from '../types';
|
||||||
import { createBinGeometry, generateSTL, exportSTL } from '../services/geometryGenerator';
|
import { createBinGeometry, generateSTL, exportSTL } from '../services/geometryGenerator';
|
||||||
import { Download, Package, Info, Loader2, Share2, Check, Ruler, Copy } from 'lucide-react';
|
import { Download, Package, Info, Loader2, Share2, Check, Ruler } from 'lucide-react';
|
||||||
import { generateShareUrl } from '../utils/share';
|
import { generateShareUrl } from '../utils/share';
|
||||||
|
|
||||||
// --- DrawerFrame (Каркас) ---
|
// --- DrawerFrame (Каркас) ---
|
||||||
@@ -106,7 +106,7 @@ export const PreviewStep: React.FC<Props> = ({ parts, config, splits }) => {
|
|||||||
let success = false;
|
let success = false;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// 1. Пробуем современный API (работает только на HTTPS или localhost)
|
// 1. Пробуем современный API
|
||||||
if (navigator.clipboard && navigator.clipboard.writeText) {
|
if (navigator.clipboard && navigator.clipboard.writeText) {
|
||||||
await navigator.clipboard.writeText(url);
|
await navigator.clipboard.writeText(url);
|
||||||
success = true;
|
success = true;
|
||||||
@@ -114,23 +114,18 @@ export const PreviewStep: React.FC<Props> = ({ parts, config, splits }) => {
|
|||||||
throw new Error('Clipboard API unavailable');
|
throw new Error('Clipboard API unavailable');
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
// 2. Если не вышло (например, HTTP), используем Fallback метод
|
// 2. Fallback для HTTP
|
||||||
try {
|
try {
|
||||||
const textArea = document.createElement("textarea");
|
const textArea = document.createElement("textarea");
|
||||||
textArea.value = url;
|
textArea.value = url;
|
||||||
|
|
||||||
// Делаем элемент невидимым, но частью DOM
|
|
||||||
textArea.style.position = "fixed";
|
textArea.style.position = "fixed";
|
||||||
textArea.style.left = "-9999px";
|
textArea.style.left = "-9999px";
|
||||||
textArea.style.top = "0";
|
textArea.style.top = "0";
|
||||||
document.body.appendChild(textArea);
|
document.body.appendChild(textArea);
|
||||||
|
|
||||||
textArea.focus();
|
textArea.focus();
|
||||||
textArea.select();
|
textArea.select();
|
||||||
|
|
||||||
const result = document.execCommand('copy');
|
const result = document.execCommand('copy');
|
||||||
document.body.removeChild(textArea);
|
document.body.removeChild(textArea);
|
||||||
|
|
||||||
if (result) success = true;
|
if (result) success = true;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("Copy failed", e);
|
console.error("Copy failed", e);
|
||||||
@@ -141,8 +136,7 @@ export const PreviewStep: React.FC<Props> = ({ parts, config, splits }) => {
|
|||||||
setShareUrlCopied(true);
|
setShareUrlCopied(true);
|
||||||
setTimeout(() => setShareUrlCopied(false), 3000);
|
setTimeout(() => setShareUrlCopied(false), 3000);
|
||||||
} else {
|
} else {
|
||||||
// 3. Если совсем ничего не помогло, показываем промпт
|
prompt("Скопируйте ссылку вручную:", url);
|
||||||
prompt("Не удалось скопировать автоматически. Скопируйте ссылку вручную:", url);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -156,15 +150,17 @@ export const PreviewStep: React.FC<Props> = ({ parts, config, splits }) => {
|
|||||||
<Ruler className="text-primary" size={20} />
|
<Ruler className="text-primary" size={20} />
|
||||||
<span className="font-medium text-sm uppercase tracking-wide opacity-70">Размеры ящика:</span>
|
<span className="font-medium text-sm uppercase tracking-wide opacity-70">Размеры ящика:</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* ЗДЕСЬ ИЗМЕНЕНИЯ: Ш, Г, В */}
|
||||||
<div className="flex gap-4 font-mono text-lg font-bold text-white">
|
<div className="flex gap-4 font-mono text-lg font-bold text-white">
|
||||||
<div className="flex items-center gap-1">
|
<div className="flex items-center gap-1">
|
||||||
<span className="text-slate-500 text-xs">W:</span> {config.drawer.width}
|
<span className="text-slate-500 text-xs">Ш:</span> {config.drawer.width}
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-1">
|
<div className="flex items-center gap-1">
|
||||||
<span className="text-slate-500 text-xs">D:</span> {config.drawer.depth}
|
<span className="text-slate-500 text-xs">Г:</span> {config.drawer.depth}
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-1">
|
<div className="flex items-center gap-1">
|
||||||
<span className="text-slate-500 text-xs">H:</span> {config.drawer.height}
|
<span className="text-slate-500 text-xs">В:</span> {config.drawer.height}
|
||||||
</div>
|
</div>
|
||||||
<span className="text-xs text-slate-500 self-end mb-1">мм</span>
|
<span className="text-xs text-slate-500 self-end mb-1">мм</span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user