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

54
src/utils/share.ts Normal file
View File

@@ -0,0 +1,54 @@
import { AppConfig, LayoutSplits } from '../types';
interface ShareData {
c: AppConfig; // config
s: LayoutSplits; // splits
}
/**
* Генерирует ссылку на текущее состояние
*/
export const generateShareUrl = (config: AppConfig, splits: LayoutSplits): string => {
try {
// 1. Собираем объект данных
const data: ShareData = { c: config, s: splits };
// 2. Превращаем в JSON строку
const jsonString = JSON.stringify(data);
// 3. Кодируем в Base64 (чтобы URL был чище)
// btoa работает только с ASCII, поэтому для надежности кодируем через URI
const base64 = btoa(encodeURIComponent(jsonString));
// 4. Формируем полный URL
return `${window.location.origin}?share=${base64}`;
} catch (e) {
console.error('Ошибка генерации ссылки:', e);
return '';
}
};
/**
* Пытается восстановить состояние из URL
*/
export const parseShareUrl = (): { config: AppConfig, splits: LayoutSplits } | null => {
try {
const params = new URLSearchParams(window.location.search);
const shareParam = params.get('share');
if (!shareParam) return null;
// Декодируем обратно
const jsonString = decodeURIComponent(atob(shareParam));
const data: ShareData = JSON.parse(jsonString);
// Простая валидация, что данные похожи на правду
if (data.c && data.s && Array.isArray(data.s.x)) {
return { config: data.c, splits: data.s };
}
return null;
} catch (e) {
console.error('Ошибка чтения ссылки:', e);
return null;
}
};