Add share
This commit is contained in:
54
src/utils/share.ts
Normal file
54
src/utils/share.ts
Normal 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;
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user