TelegramPWA/src/util/permanentWebVersion.ts
2025-06-04 20:36:48 +02:00

64 lines
1.8 KiB
TypeScript

import { getActions } from '../global';
import { PRODUCTION_HOSTNAME, WEB_VERSION_BASE } from '../config';
import { clearWebsync } from './websync';
type AvailableVersions = 'Z' | 'K';
const SEARCH_ENGINE_REGEX = /(^|\.)(google|bing|duckduckgo|ya|yandex)\./i;
// Handled by the legacy version. Cannot be updated
const PERMANENT_VERSION_KEY = 'kz_version';
const CLIENT_VERSION: AvailableVersions = 'Z';
function setPermanentWebVersion(version: AvailableVersions) {
localStorage.setItem(PERMANENT_VERSION_KEY, JSON.stringify(version));
}
export function getPermanentWebVersion(): AvailableVersions | undefined {
const version = localStorage.getItem(PERMANENT_VERSION_KEY);
if (version) {
return JSON.parse(version);
}
return undefined;
}
export function switchPermanentWebVersion(version: AvailableVersions) {
setPermanentWebVersion(version);
clearWebsync();
getActions().skipLockOnUnload();
window.location.assign(`${WEB_VERSION_BASE}${version.toLowerCase()}`);
}
export function checkAndAssignPermanentWebVersion() {
if (window.location.hostname !== PRODUCTION_HOSTNAME) return;
const referrer = document.referrer.toLowerCase();
if (!referrer) return;
try {
const isSearchEngine = new URL(referrer).host.match(SEARCH_ENGINE_REGEX);
if (!isSearchEngine) return;
const currentVersion = getPermanentWebVersion();
if (currentVersion) {
if (currentVersion !== CLIENT_VERSION) {
switchPermanentWebVersion(currentVersion);
}
return;
}
const urlParams = new URLSearchParams(window.location.search);
const hasTest = (urlParams.get('test') ?? undefined) !== undefined;
const shouldRedirect = Math.random() < 0.5;
if (hasTest || !shouldRedirect) {
setPermanentWebVersion('Z');
return;
}
switchPermanentWebVersion('K');
} catch (e) {
// Ignore
}
}