Navi/request.js

import web2app from '../lib/web2app'
import { buildQueryString } from '../util'
import { getAppKey, KAKAO_AGENT, logDebug, processRules, URL } from '../common'

import rules from './rules'

/**
 * @alias ViaPoint
 * @typedef ViaPoint
 * @property {String} name
 * @property {Number} x
 * @property {Nubmer} y
 * @memberof Kakao.Navi
 */
/**
 * 카카오내비 안내를 시작합니다. 모바일 기기에서만 동작합니다.
 * @function start
 * @param {Object} settings 카카오내비 앱을 실행할 때의 옵션
 * @param {String} settings.name 목적지 이름
 * @param {Number} settings.x 목적지의 x 좌표 (경도). wgs84 또는 katec 좌표계 값
 * @param {Number} settings.y 목적지의 y 좌표 (위도). wgs84 또는 katec 좌표계 값
 * @param {String} [settings.coordType="katec"] 좌표 타입, "wgs84"|"katec"
 * @param {Number} [settings.vehicleType=1] 차종 (1: 1종 (승용차/소형승합차/소형화물화), 2: 2종 (중형승합차/중형화물차), 3: 3종 (대형승합차/2축 대형화물차), 4: 4종 (3축 대형화물차), 5: 5종 (4축이상 특수화물차), 6: 6종 (경차), 7: 이륜차)
 * @param {Number} [settings.rpOption=100] 경로 옵션 (1: 가장 빠른 경로, 2: 무료 도로, 3: 가장 짧은 경로, 4: 자동차 전용 도로 제외, 5: 큰길 우선, 6: 고속도로 우선, 8: 일반 도로 우선, 100: 추천 경로)
 * @param {Boolean} [settings.routeInfo=false] 전체 경로 보기 여부
 * @param {Number} [settings.sX] 시작 좌표 x
 * @param {Number} [settings.sY] 시작 좌표 y
 * @param {Number} [settings.sAngle] 시작 앵글 (0~359)
 * @param {String} [settings.returnUri] 길 안내 종료(전체 경로 보기) 후 호출할 URI
 * @param {ViaPoint[]} [settings.viaPoints] 경유지 정보 (최대 3개)
 * @see {@link https://developers.kakao.com/tool/demo/navi/start|데모 보러가기}
 * @memberof Kakao.Navi
 */
export function start(settings) {
  settings = processRules(settings, rules.start, 'Navi.start')

  const naviStartParams = buildQueryString(makeNaviStartParams(settings))
  const naviScheme = `${URL.naviStartScheme}?${naviStartParams}`
  const fallbackUrl = `${URL.naviWeb}?${naviStartParams}`

  callWeb2app(naviScheme, fallbackUrl)
}

function makeNaviStartParams(settings) {
  const destination = {
    name: settings.name,
    x: settings.x,
    y: settings.y,
    rpflag: settings.rpflag,
    cid: settings.cid,
    guide_id: settings.guideId,
  }
  const option = {
    coord_type: settings.coordType,
    vehicle_type: settings.vehicleType,
    rpoption: settings.rpOption,
    route_info: settings.routeInfo,
    s_x: settings.sX,
    s_y: settings.sY,
    s_angle: settings.sAngle,
    return_uri: settings.returnUri,
  }

  const params = makeNaviParams()
  params.param = {
    destination,
    option,
    via_list: settings.viaPoints,
  }

  return params
}

/**
 * 카카오내비로 목적지를 공유합니다. 모바일 기기에서만 동작합니다.
 * @function share
 * @param {Object} settings 카카오내비 앱을 실행할 때의 옵션
 * @param {String} settings.name 목적지 이름
 * @param {Number} settings.x 목적지의 x 좌표 (경도). wgs84 또는 katec 좌표계의 값
 * @param {Nubmer} settings.y 목적지의 y 좌표 (위도). wgs84 또는 katec 좌표계의 값
 * @param {String} [settings.coordType="katec"] 좌표 타입, "wgs84"|"katec"
 * @see {@link https://developers.kakao.com/tool/demo/navi/share|데모 보러가기}
 * @memberof Kakao.Navi
 */
export function share(settings) {
  settings = processRules(settings, rules.share, 'Navi.share')

  const naviShareParams = buildQueryString(makeNaviShareParams(settings))
  const naviScheme = `${URL.naviShareScheme}?${naviShareParams}`
  const fallbackUrl = `${URL.naviWeb}?${naviShareParams}`

  callWeb2app(naviScheme, fallbackUrl)
}

function makeNaviShareParams(settings) {
  const destination = {
    name: settings.name,
    x: settings.x,
    y: settings.y,
    rpflag: settings.rpflag,
    cid: settings.cid,
    guide_id: settings.guideId,
  }
  const option = {
    coord_type: settings.coordType,
  }

  const params = makeNaviParams()
  params.param = {
    destination,
    option,
  }
  params.scheme_type = 'sharePoi'

  return params
}

function makeNaviParams() {
  return {
    appkey: getAppKey(),
    apiver: '1.0',
    extras: {
      KA: KAKAO_AGENT,
    },
  }
}

function callWeb2app(naviScheme, fallbackUrl) {
  const androidIntent = [
    `intent:${naviScheme}#Intent`,
    'package=com.locnall.KimGiSa',
    `S.browser_fallback_url=${encodeURIComponent(fallbackUrl)}`,
    'end;',
  ].join(';')

  const web2appOptions = {
    urlScheme: naviScheme,
    intentURI: androidIntent,
    storeURL: fallbackUrl,
    universalLink: fallbackUrl,
  }

  try {
    web2app(web2appOptions)
  } catch (error) {
    logDebug(error)
  }
}