{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./app/javascript/src/wechat/webPay.ts","webpack:///./app/javascript/src/utils/poll.ts","webpack:///./app/javascript/src/wechat/initWebPay.ts","webpack:///./app/javascript/src/wechat/wechatWeb.ts","webpack:///./app/javascript/src/wechat/initWechatWeb.ts","webpack:///./app/javascript/src/utils/envHelper.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","wxJsBridge","Promise","f","WeixinJSBridge","document","addEventListener","requestPayment","paymentArgs","race","_","setTimeout","Error","bridge","invoke","poll","getState","resolveCond","rejectCond","interval","disposed","timeoutId","promise","checkCond","resolve","reject","__awaiter","state","disposer","clearTimeout","submitButton","querySelector","payload","window","gon","unsafePayload","observed","startObservation","fetch","orderNumber","response","status","then","completed","location","reload","style","display","e","preventDefault","stopPropagation","reqParam","appId","signType","timeStamp","nonceStr","package","paySign","isIos","isProduction","test","navigator","userAgent","readMetaTag","elem","sign","reduce","attr","getAttribute","href","url","configApi","meta1","meta2","head","wx","config","appid","timestamp","noncestr","signature","jsApiList","ready","error","extractFaviconAbs","origin","extractTrackPageMeta","action","controller","reportPerf","perf","keys","isNaN","gtag","Math","ceil","event_category","event_label","pagemeta","getPerfMetrics","timing","performance","navigationStart","redirectEnd","NaN","dnsLookupEnd","domainLookupEnd","connectStart","tlsConnectStart","secureConnectionStart","requestStart","responseStart","responseEnd","domInteractive","domContentLoadedEvent","domContentLoadedEventStart","loadEvent","loadEventStart","history","__wxjs_is_wkwebview","replaceState","wxjs","onMenuShareAppMessage","chatShare","onMenuShareTimeline","timelineShare","initShare","title","desc","imgUrl","_a","__rest","reportedAfterParse","reportedAfterLoad","origEv","ev","data","requestEnd","turbolinksFetch","initPerfReport","Turbolinks","supported","visit","process"],"mappings":"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","file":"js/bundle_wechat-a8781d130ce7b05799e5.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/packs/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1017);\n","/**\n * WeChat Web (オフィシャルアカウント) / Pay\n * https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6\n */\n\ninterface WeixinJSBridgeType {\n invoke(name: string, ...args: any[]);\n invoke(api: 'getBrandWCPayRequest', param: PaymentParam, callback: () => void);\n}\n\ninterface PaymentParam {\n appId: string;\n signType: string;\n timeStamp: string;\n nonceStr: string;\n package: string;\n paySign: string;\n}\n\ninterface PaymentResult {\n // get_brand_wcpay_request:fail\n // get_brand_wcpay_request:cancel\n // get_brand_wcpay_request:ok\n err_msg: string;\n}\n\ndeclare const WeixinJSBridge: any;\nconst wxJsBridge = new Promise((f, r) => {\n if (typeof WeixinJSBridge !== 'undefined') {\n f(WeixinJSBridge);\n } else {\n document.addEventListener('WeixinJSBridgeReady', () => f(WeixinJSBridge), false);\n }\n});\n\nexport async function requestPayment(paymentArgs: PaymentParam) {\n const bridge = await Promise.race([\n wxJsBridge,\n new Promise((_, r) =>\n setTimeout(() => r(new Error('timeout:wxJsBridge')), 5000)),\n ]);\n\n return new Promise((f) => {\n bridge.invoke('getBrandWCPayRequest', paymentArgs, f);\n });\n}\n","export function poll(\n getState: () => Promise,\n resolveCond: (state: T) => boolean,\n rejectCond: (state: T) => boolean,\n interval: number,\n): { disposer: () => void, promise: Promise } {\n let disposed = false;\n let timeoutId = null;\n const checkCond = async (resolve, reject) => {\n const state = await getState();\n if (disposed) {\n return;\n }\n if (resolveCond(state)) {\n resolve(state);\n } else if (rejectCond(state)) {\n reject(state);\n } else {\n timeoutId = setTimeout(checkCond, interval, resolve, reject);\n }\n };\n const disposer = () => {\n disposed = true;\n if (timeoutId != null) {\n clearTimeout(timeoutId);\n }\n };\n const promise: Promise = new Promise(checkCond);\n return { disposer, promise };\n}\n","import { requestPayment } from './webPay';\nimport { poll } from '../utils/poll';\n\ndocument.addEventListener('turbolinks:load', () => {\n const submitButton = document.querySelector('.js-btn-inject-wechatpay');\n const payload = (window as any).gon.unsafePayload;\n if (submitButton == null || payload == null) { return; }\n\n let observed = false;\n const observeOrderCompleted: () => Promise = async () => {\n if (observed) {\n return false;\n }\n const { disposer, promise } = poll(\n async () => {\n return await fetch(`/snow/api/v1/wechatpay_orders/${payload.orderNumber}`);\n },\n response => response.status === 200,\n response => response.status === 400,\n 2000\n );\n observed = true;\n const completed = await promise.then(_ => true).catch(_ => false);\n observed = false;\n return completed;\n }\n\n const startObservation: () => Promise = async () => {\n const completed = await observeOrderCompleted();\n if (completed) {\n (window as any).location.reload(true);\n }\n }\n\n const hideConfirmingLabel: () => void = () => {\n (document.querySelector('.js-confirming-label')).style.display = 'none';\n }\n\n const showConfirmingLabel: () => void = () => {\n (document.querySelector('.js-confirming-label')).style.display = 'inline';\n }\n\n startObservation();\n hideConfirmingLabel();\n submitButton.addEventListener('click', async (e) => {\n e.preventDefault();\n e.stopPropagation();\n startObservation();\n const reqParam = {\n appId: payload.appId,\n signType: payload.signType,\n timeStamp: payload.timeStamp,\n nonceStr: payload.nonceStr,\n package: payload.package,\n paySign: payload.paySign,\n };\n await requestPayment(reqParam);\n startObservation();\n showConfirmingLabel();\n });\n});\n","import { isProduction } from '../utils/envHelper';\n/**\n * WeChat Web (オフィシャルアカウント) / rest\n */\nconst DEBUG = !isProduction();\n\ntype TimelineShareData = Partial<{\n title: string;\n link: string;\n imgUrl: string;\n // NOTE: not getting called in iOS?\n success?(): void;\n}>;\n\ntype ChatShareData = Partial<{\n title: string;\n desc: string;\n link: string;\n imgUrl: string;\n // NOTE: success callback **gets** called\n success?(): void;\n}>;\n\ninterface WXJS {\n config(conf: {\n debug?: boolean;\n appId: string;\n timestamp: string;\n nonceStr: string;\n signature: string;\n jsApiList: string[];\n }): void;\n ready(f: Function): void;\n error(f: Function): void;\n\n closeWindow(): void;\n onMenuShareTimeline(arg: TimelineShareData): void;\n onMenuShareAppMessage(arg: ChatShareData): void;\n showMenuItems(arg: { menuList: string[] }): void;\n}\n// https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115\ndeclare const wx: WXJS;\ndeclare const __wxjs_is_wkwebview: object;\n\nconst isIos = /iphone|ipad/i.test(navigator.userAgent);\nlet apiSignCount = 0;\n\ninterface WechatJsapiSign {\n appid: string;\n noncestr: string;\n url: string;\n timestamp: string;\n signature: string;\n}\n\ninterface ShareCardProvider {\n chatShare(): ChatShareData;\n timelineShare(): TimelineShareData;\n}\n\n// MUST be called before first turbolinks:load event\nexport function initShare(p: ShareCardProvider) {\n const isWechat = /micromessenger/i.test(navigator.userAgent);\n if (!isWechat) return;\n\n document.addEventListener('turbolinks:load', async () => {\n try {\n\n if (isIos && typeof history !== 'undefined' && typeof __wxjs_is_wkwebview !== 'undefined') {\n // this supposedly help wechat to detect URL change\n history.replaceState(null, null, location.href);\n }\n\n // if (DEBUG) alert(\"before config\");\n const wxjs = await configApi();\n wxjs.onMenuShareAppMessage(p.chatShare());\n wxjs.onMenuShareTimeline(p.timelineShare());\n } catch (e) {\n // if (DEBUG) alert(\"error configuring share\" + e);\n }\n });\n}\n\nfunction readMetaTag(elem: HTMLMetaElement): WechatJsapiSign | null {\n if (!elem) return null;\n\n const sign: WechatJsapiSign = ['appid', 'noncestr', 'url', 'timestamp', 'signature'].reduce(\n (s: WechatJsapiSign, attr: keyof WechatJsapiSign) => {\n s[attr] = elem.getAttribute(`data-${attr}`);\n return s;\n },\n {} as WechatJsapiSign);\n\n if (location.href === sign.url) return sign;\n\n return null;\n}\n\nfunction readJsapiSign(): WechatJsapiSign | null {\n const meta1 = document.head.querySelector('meta[name=wechat-jsapi-sign1]') as HTMLMetaElement;\n const meta2 = document.head.querySelector('meta[name=wechat-jsapi-sign2]') as HTMLMetaElement;\n\n return readMetaTag(meta1) || readMetaTag(meta2) || null;\n}\n\nasync function configApi(sign = readJsapiSign()) {\n const isIos = /iphone|ipad/i.test(navigator.userAgent);\n\n if (typeof wx !== 'object') {\n throw new Error('wechatWeb: expected wx jsapi');\n } else if (!sign) {\n throw new Error('wechatWeb: expected sign');\n }\n\n // if (DEBUG) {\n // alert(`configure api for url: ${sign.url}`);\n // alert(JSON.stringify({\n // href: location.href,\n // signUrl: sign.url,\n // eq: location.href === sign.url,\n // ...sign,\n // }));\n // }\n\n wx.config({\n // trueにすると一部のAPI戻り値がalert() される\n // debug: DEBUG,\n appId: sign.appid,\n timestamp: sign.timestamp,\n nonceStr: sign.noncestr,\n signature: sign.signature,\n jsApiList: [\n 'closeWindow',\n // 分享到朋友圈\n 'onMenuShareTimeline',\n // 分享到对话\n 'onMenuShareAppMessage',\n // WARNING: not (working || useful)\n 'showMenuItems',\n ],\n });\n\n await new Promise((f, r) => {\n wx.ready(f);\n wx.error(r);\n });\n\n apiSignCount++;\n\n return wx;\n}\n\nexport function extractFaviconAbs() {\n try {\n const iconLink = document.head.querySelector('link[rel=apple-touch-icon]') as HTMLLinkElement;\n const href = iconLink.getAttribute('href');\n const absUrl = /^\\//.test(href) ? (location.origin + href) : href;\n return absUrl;\n } catch (e) {\n return null;\n }\n}\n\nfunction extractTrackPageMeta() {\n try {\n const elem = document.querySelector(\"meta[name=china-track-metadata]\") as HTMLMetaElement;\n if (elem) {\n return {\n action: elem.getAttribute(\"data-action\"),\n controller: elem.getAttribute(\"data-controller\"),\n };\n }\n } catch (e) {\n }\n return null;\n}\n\ndeclare function gtag(name: \"event\", value: \"timing_complete\",\n params: { name: string, value: number, event_category?: string, event_label?: string });\n\nfunction reportPerf(perf: Object) {\n // console.log(\"perf:\", perf);\n for (const name of Object.keys(perf)) {\n const value = perf[name];\n if (typeof value === 'number' && !isNaN(value) && typeof gtag !== 'undefined') {\n gtag(\"event\", \"timing_complete\", {\n name,\n value: Math.ceil(value),\n event_category: 'Snow Page Performance',\n event_label: 'CN',\n });\n\n if (name === 'loadEvent' || name === \"domContentLoadedEvent\" || name === \"turbolinksFetch\") {\n const pagemeta = extractTrackPageMeta();\n if (pagemeta) {\n // controller#action 形の時間を報告する (URL単位の報告はGA consoleが内蔵するため、何もしなくていい)\n gtag(\"event\", \"timing_complete\", {\n name: `${name} - ${pagemeta.controller}#${pagemeta.action}`,\n value: Math.ceil(value),\n event_category: 'Snow Page Performance - Action-wise',\n event_label: 'CN',\n });\n }\n }\n }\n }\n}\n\n/**\n * (スクリプトロード / DOMContentLoaded / load) の3回に分けてGAにスピードイベントを送る\n * (gtag初期化以降 && DOMContentLoaded以前) に呼び出すことが必要\n */\nexport function initPerfReport() {\n\n {\n // see: https://html.spec.whatwg.org/multipage/scripting.html#list-of-scripts-that-will-execute-when-the-document-has-finished-parsing\n const { loadEvent, domContentLoadedEvent, ...rest } = getPerfMetrics();\n reportPerf(rest);\n }\n\n let reportedAfterParse = false, reportedAfterLoad = false;\n\n document.addEventListener(\"DOMContentLoaded\", () => {\n if (reportedAfterParse) return;\n const { domContentLoadedEvent } = getPerfMetrics();\n reportPerf({ domContentLoadedEvent });\n reportedAfterParse = true;\n });\n\n (window as any).addEventListener('load', () => {\n if (reportedAfterLoad) return;\n const { loadEvent } = getPerfMetrics();\n reportPerf({ loadEvent });\n reportedAfterLoad = true;\n });\n\n /**\n * turbolinks (AJAXリクエストのため、より細かい粒度で取れない)\n */\n document.addEventListener(\"turbolinks:load\", (origEv: any) => {\n const ev = origEv as {\n data: { timing: { requestStart?: number; requestEnd?: number; visitStart?: number; visitEnd?: number; } }\n };\n const timing: Partial = ev && ev.data && ev.data.timing || {};\n if (timing && timing.requestStart && timing.requestEnd) {\n const turbolinksFetch = Math.ceil(timing.requestEnd - timing.requestStart);\n reportPerf({ turbolinksFetch });\n }\n });\n}\n\n/**\n * navigationStart ~ DOMContentLoaded のパフォーマンス\n * - (wechat ios対応のためobsolete Performance APIを使う)\n */\nfunction getPerfMetrics() {\n // performance.timing: see https://w3c.github.io/navigation-timing/#obsolete\n // NOTE: performance.navigation, performance.timeOrigin are N/A in wechat ios\n const timing: Partial =\n typeof performance === 'object' && performance && performance.timing || {};\n\n const navigationStart = timing.navigationStart;\n\n // connect\n const redirectEnd = timing.redirectEnd ? (timing.redirectEnd - navigationStart) : NaN;\n const dnsLookupEnd = timing.domainLookupEnd - navigationStart;\n const connectStart = timing.connectStart - navigationStart;\n const tlsConnectStart = timing.secureConnectionStart ? (timing.secureConnectionStart - navigationStart) : NaN;\n\n // transfer\n const requestStart = timing.requestStart - navigationStart;\n const responseStart = timing.responseStart - navigationStart;\n const responseEnd = timing.responseEnd - navigationStart;\n const domInteractive = timing.domInteractive - timing.navigationStart;\n\n const domContentLoadedEvent = timing.domContentLoadedEventStart ?\n (timing.domContentLoadedEventStart - timing.navigationStart) : NaN;\n\n // loadEvent: ページロード開始 ~ 全部subresource終了 (厳密な定義ではないため参考として)\n const loadEvent = timing.loadEventStart ?\n (timing.loadEventStart - timing.navigationStart) : NaN;\n\n const res = {\n redirectEnd,\n dnsLookupEnd,\n connectStart,\n tlsConnectStart,\n requestStart,\n responseStart,\n responseEnd,\n domInteractive,\n domContentLoadedEvent,\n loadEvent,\n };\n\n return res;\n}\n\ndeclare const Turbolinks: {\n supported: boolean;\n visit(urlLike: string, param?: any): void;\n};\n\ndeclare const VConsole: {\n new(): void;\n}\n\nexport function workaroundIosBack() {\n if (!isIos) return;\n (window as any).addEventListener('popstate', (ev: any) => {\n if (Turbolinks.supported) {\n Turbolinks.visit(location.href, { action: 'replace' });\n } else {\n location.reload();\n }\n });\n}\n\n// run this to observe quirky browser-specific events\nexport function logEvents() {\n // init VConsole if available. https://github.com/Tencent/vConsole/blob/dev/doc/tutorial.md\n if (typeof VConsole !== 'undefined') { new VConsole(); }\n for (const evName of ['turbolinks:request-start', 'turbolinks:before-visit', 'turbolinks:load',]) {\n document.addEventListener(evName, (ev: any) => {\n console.log(evName, ev);\n });\n }\n\n for (const evName of ['pageshow', 'pagehide', 'popstate',]) {\n (window as any).addEventListener(evName, (ev: any) => {\n console.log(evName, ev);\n });\n }\n}\n","import { initShare, extractFaviconAbs, initPerfReport, workaroundIosBack, } from './wechatWeb';\n\ninitShare({\n chatShare() {\n return {\n title: document.title,\n desc: '',\n imgUrl: extractFaviconAbs(),\n };\n },\n timelineShare() {\n return {\n title: document.title,\n imgUrl: extractFaviconAbs(),\n };\n },\n});\n\ninitPerfReport();\nworkaroundIosBack();\n","\n// Use RAILS_ENV instead of NODE_ENV\n// NODE_ENV is always production on heroku.\n\nexport function isProduction() {\n return process.env.RAILS_ENV === 'production';\n}\n"],"sourceRoot":""}