Files
kit-ui/lib/qrcode/urlSharing.ts

86 lines
2.6 KiB
TypeScript
Raw Normal View History

'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}` : ''}`;
}