import type { Router } from 'vue-router' import { getPhoneApp } from '@/config/apps' import type { EasyShareDestinationApp, EasyShareKind, EasySharePayload, } from '@/types/easyshare' const chatDestinations: EasyShareDestinationApp[] = [ 'messages', 'darkchat', 'flare', ] const noteCompatibleKinds = new Set([ 'document', 'link', 'location', 'note', 'text', ]) const schemeRoutes: Record = { location: '/apps/map', media: '/apps/photos', phone: '/apps/phone', } export function easyShareDestinationAppIds( payload: EasySharePayload, ): EasyShareDestinationApp[] { const destinations = [...chatDestinations] if (payload.appId !== 'notes' && noteCompatibleKinds.has(payload.kind)) { destinations.push('notes') } return destinations } export function easyShareRoute(payload: EasySharePayload): { path: string query: Record } { const match = payload.link?.match(/^skyphone:\/\/([^/]+)(?:\/([^/]+))?(?:\/(.+))?$/) const schemeApp = match?.[1] const app = schemeApp ? getPhoneApp(schemeApp) : getPhoneApp(payload.appId) const path = (schemeApp && schemeRoutes[schemeApp]) || app?.route || '/' const query: Record = { easyShareId: String(payload.id ?? match?.[3] ?? match?.[2] ?? ''), easyShareKind: payload.kind, easyShareLink: payload.link ?? '', } if (schemeApp === 'citymarkt' && match?.[2] === 'listing' && match[3]) { query.listingId = decodeURIComponent(match[3]) } return { path, query, } } export function easyShareCrewLinkInviteCode( kind: unknown, link: unknown, id: unknown, ): string | null { if (kind !== 'link') return null if (typeof link === 'string') { const match = link.match(/^skyphone:\/\/crewlink\/invite\/([a-z0-9]{8})$/i) if (match) return match[1].toUpperCase() } if (typeof id === 'string' && /^[a-z0-9]{8}$/i.test(id)) { return id.toUpperCase() } return null } export type EasyShareMusicTarget = | { id: string; kind: 'playlist' } | { id: string; kind: 'track'; source: 'server' | 'youtube' } export function easyShareMusicTarget( kind: unknown, link: unknown, ): EasyShareMusicTarget | null { if (typeof link !== 'string') return null if (kind === 'track') { const match = link.match( /^skyphone:\/\/music\/(server|youtube)\/([^/?#]+)$/, ) if (match) { return { id: match[2], kind: 'track', source: match[1] as 'server' | 'youtube', } } } if (kind === 'playlist') { const match = link.match(/^skyphone:\/\/music\/playlist\/([^/?#]+)$/) if (match) return { id: match[1], kind: 'playlist' } } return null } export async function openEasySharePayload( router: Router, payload: EasySharePayload, ): Promise { await router.push(easyShareRoute(payload)) }