useParseParams.ts 1.61 KB
import type { PlatformEnum } from '@/enums/modeEnum'
import { PageModeEnum } from '@/enums/modeEnum'

type FromType = 'edge'

interface HashParams {
  configurationId: string
  organizationId: string
  mode: PageModeEnum
  platform?: PlatformEnum
  publicId?: string
  userId?: string
  parentPageIsPublic?: boolean
  locale?: string
  from?: FromType
}

export function useParseParams(): HashParams {
  try {
    const { hash } = window.location
    let string = atob(hash.substring(1))
    string = atob(string.substring(0, 6) + string.substring(16))
    return JSON.parse(string)
  }
  catch (error) {
    throw new Error('错误')
  }
}

const getRandomString = () => Number(Math.random().toString().substring(2)).toString(36)

export const useEncodeParams = (record: Recordable) => {
  let hash = JSON.stringify(record)
  const mixinString = getRandomString()
    .slice(0, 10)
    .padEnd(10, getRandomString())
    .split('')
    .map(item => (Math.random() > 0.5 ? item.toUpperCase() : item))
    .join('')

  hash = window.btoa(hash)
  hash = hash.substring(0, 6) + mixinString + hash.substring(6)
  hash = window.btoa(hash)

  return hash
}

export const switchLightboxMode = () => {
  const params = useParseParams?.()
  params.mode = PageModeEnum.LIGHTBOX
  const { origin, pathname } = location
  const url = new URL(origin)
  url.pathname = pathname
  url.hash = useEncodeParams?.(params)
  window.open(url.href)
}

export function isFromEdge() {
  const { from } = useParseParams()
  return from === 'edge'
}

window.useEncodeParams = useEncodeParams
window.useParseParams = useParseParams
window.switchLightboxMode = switchLightboxMode