export const parseUserId = (value: unknown): number | null => { if (typeof value === 'number' && Number.isFinite(value)) { return value } if (typeof value === 'string' && value.trim() !== '') { const parsed = Number(value) return Number.isFinite(parsed) ? parsed : null } return null } export const getUserIdFromToken = (token?: string | null): number | null => { if (!token) { return null } const parts = token.split('.') if (parts.length < 2) { return null } try { const payload = JSON.parse(decodeBase64Url(parts[1])) return parseUserId(payload?.userId) } catch { return null } return null } const decodeBase64Url = (input: string): string => { const normalized = input.replace(/-/g, '+').replace(/_/g, '/') const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '=') const binary = atob(padded) let result = '' for (let i = 0; i < binary.length; i += 1) { result += String.fromCharCode(binary.charCodeAt(i)) } return decodeURIComponent(escape(result)) }