86 lines
2.6 KiB
TypeScript
86 lines
2.6 KiB
TypeScript
|
|
'use client';
|
||
|
|
|
||
|
|
import type { ErrorCorrectionLevel } from '@/types/qrcode';
|
||
|
|
|
||
|
|
export interface QRShareableState {
|
||
|
|
text?: string;
|
||
|
|
errorCorrection?: ErrorCorrectionLevel;
|
||
|
|
foregroundColor?: string;
|
||
|
|
backgroundColor?: string;
|
||
|
|
margin?: number;
|
||
|
|
}
|
||
|
|
|
||
|
|
const DEFAULTS = {
|
||
|
|
errorCorrection: 'M' as ErrorCorrectionLevel,
|
||
|
|
foregroundColor: '#000000',
|
||
|
|
backgroundColor: '#ffffff',
|
||
|
|
margin: 4,
|
||
|
|
};
|
||
|
|
|
||
|
|
export function decodeQRFromUrl(): QRShareableState | null {
|
||
|
|
if (typeof window === 'undefined') return null;
|
||
|
|
|
||
|
|
const params = new URLSearchParams(window.location.search);
|
||
|
|
const text = params.get('text');
|
||
|
|
const ec = params.get('ec') as ErrorCorrectionLevel | null;
|
||
|
|
const fg = params.get('fg');
|
||
|
|
const bg = params.get('bg');
|
||
|
|
const margin = params.get('margin');
|
||
|
|
|
||
|
|
if (!text && !ec && !fg && !bg && !margin) return null;
|
||
|
|
|
||
|
|
return {
|
||
|
|
text: text || undefined,
|
||
|
|
errorCorrection: ec || undefined,
|
||
|
|
foregroundColor: fg ? `#${fg}` : undefined,
|
||
|
|
backgroundColor: bg ? `#${bg}` : undefined,
|
||
|
|
margin: margin ? parseInt(margin, 10) : undefined,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
export function updateQRUrl(
|
||
|
|
text: string,
|
||
|
|
errorCorrection: ErrorCorrectionLevel,
|
||
|
|
foregroundColor: string,
|
||
|
|
backgroundColor: string,
|
||
|
|
margin: number,
|
||
|
|
): void {
|
||
|
|
if (typeof window === 'undefined') return;
|
||
|
|
|
||
|
|
const params = new URLSearchParams();
|
||
|
|
|
||
|
|
if (text) params.set('text', text);
|
||
|
|
if (errorCorrection !== DEFAULTS.errorCorrection) params.set('ec', errorCorrection);
|
||
|
|
if (foregroundColor !== DEFAULTS.foregroundColor) params.set('fg', foregroundColor.replace('#', ''));
|
||
|
|
if (backgroundColor !== DEFAULTS.backgroundColor) params.set('bg', backgroundColor.replace('#', ''));
|
||
|
|
if (margin !== DEFAULTS.margin) params.set('margin', String(margin));
|
||
|
|
|
||
|
|
const query = params.toString();
|
||
|
|
const newUrl = query
|
||
|
|
? `${window.location.pathname}?${query}`
|
||
|
|
: window.location.pathname;
|
||
|
|
|
||
|
|
window.history.replaceState({}, '', newUrl);
|
||
|
|
}
|
||
|
|
|
||
|
|
export function getQRShareableUrl(
|
||
|
|
text: string,
|
||
|
|
errorCorrection: ErrorCorrectionLevel,
|
||
|
|
foregroundColor: string,
|
||
|
|
backgroundColor: string,
|
||
|
|
margin: number,
|
||
|
|
): string {
|
||
|
|
if (typeof window === 'undefined') return '';
|
||
|
|
|
||
|
|
const params = new URLSearchParams();
|
||
|
|
|
||
|
|
if (text) params.set('text', text);
|
||
|
|
if (errorCorrection !== DEFAULTS.errorCorrection) params.set('ec', errorCorrection);
|
||
|
|
if (foregroundColor !== DEFAULTS.foregroundColor) params.set('fg', foregroundColor.replace('#', ''));
|
||
|
|
if (backgroundColor !== DEFAULTS.backgroundColor) params.set('bg', backgroundColor.replace('#', ''));
|
||
|
|
if (margin !== DEFAULTS.margin) params.set('margin', String(margin));
|
||
|
|
|
||
|
|
const query = params.toString();
|
||
|
|
return `${window.location.origin}${window.location.pathname}${query ? `?${query}` : ''}`;
|
||
|
|
}
|