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)
}
}