function encodeRoutePart(value = '') { return encodeURIComponent(String(value || '').trim()); } function decodeRoutePart(value = '') { try { return decodeURIComponent(String(value || '')); } catch { return String(value || ''); } } const SHINE_ROUTE_PREFIX = 'SHiNE.'; export function normalizeLogin(value = '') { return String(value || '').trim().replace(/^@+/, ''); } export function extractLoginFromBlockchainName(value = '') { const raw = String(value || '').trim(); const match = raw.match(/^(.+)-\d+$/); if (!match) return normalizeLogin(raw); return normalizeLogin(String(match[1] || '')); } export function makeProfileRoute(login = '') { const clean = normalizeLogin(login); return clean ? `${SHINE_ROUTE_PREFIX}${encodeRoutePart(clean)}` : 'profile'; } export function makeProfileLinksRoute(login = '') { const clean = normalizeLogin(login); return clean ? `${SHINE_ROUTE_PREFIX}${encodeRoutePart(clean)}/links` : 'network/keep-history'; } export function makeProfileChannelsRoute(login = '', scope = 'all') { const clean = normalizeLogin(login); if (!clean) return 'channels/feed'; const normalizedScope = String(scope || '').trim().toLowerCase(); if (normalizedScope === 'owned') return `${SHINE_ROUTE_PREFIX}${encodeRoutePart(clean)}/channels/owned`; if (normalizedScope === 'following') return `${SHINE_ROUTE_PREFIX}${encodeRoutePart(clean)}/channels/following`; return `${SHINE_ROUTE_PREFIX}${encodeRoutePart(clean)}/channels`; } export function makeShineChannelRoute({ ownerLogin = '', ownerBlockchainName = '', channelName = '', messageBlockNumber = '' }) { const ownerBch = String(ownerBlockchainName || '').trim(); const chName = String(channelName || '').trim(); const msgNo = String(messageBlockNumber || '').trim(); if (!ownerBch || !chName) return ''; if (msgNo) return `${SHINE_ROUTE_PREFIX}${encodeRoutePart(ownerBch)}/${encodeRoutePart(chName)}/${encodeRoutePart(msgNo)}`; return `${SHINE_ROUTE_PREFIX}${encodeRoutePart(ownerBch)}/${encodeRoutePart(chName)}`; } export function makeShineMessageRoute({ ownerLogin = '', messageBlockchainName = '', messageBlockNumber = '' }) { const msgBch = String(messageBlockchainName || '').trim(); const msgNo = String(messageBlockNumber || '').trim(); if (!msgBch || !msgNo) return ''; return `${SHINE_ROUTE_PREFIX}${encodeRoutePart(msgBch)}/${encodeRoutePart(msgNo)}`; } export function parseShineRootSegment(segment = '') { const raw = String(segment || '').trim(); if (!raw.toLowerCase().startsWith(SHINE_ROUTE_PREFIX.toLowerCase())) return ''; return normalizeLogin(decodeRoutePart(raw.slice(SHINE_ROUTE_PREFIX.length))); }