{"version":3,"sources":["webpack:///./app/assets/javascripts/components/supportsPassive.js","webpack:///./app/assets/javascripts/reactjs/components/CustomerChat/index.jsx","webpack:///./app/assets/javascripts/reactjs/utils/callOnNearScreen.js","webpack:///./app/assets/javascripts/reactjs/utils/hydrate.js","webpack:///./app/assets/javascripts/components/webviewTrack.js","webpack:///./app/assets/javascripts/adUnifiedId.js","webpack:///./app/assets/javascripts/components/facebook.ts","webpack:///./app/assets/javascripts/components/categoriesNav.js","webpack:///./app/assets/javascripts/components/isJSDebugMode.js","webpack:///./app/assets/javascripts/components/sentry.js","webpack:///./app/assets/javascripts/reactjs/components/CustomerChat/style.module.scss","webpack:///./app/assets/javascripts/reactjs/components/utility.js"],"names":["_supportsPassive","opts","Object","defineProperty","get","window","addEventListener","removeEventListener","e","supportsPassive","CustomerChat","className","styles","customerChat","target","rel","href","isCool3c","aria-label","width","height","viewBox","x","y","stroke","strokeWidth","fill","fillRule","cx","cy","r","transform","id","d","renderCustomerChat","mountPoint","document","getElementById","ReactDOM","render","callOnNearScreen","callback","node","option","io","IntersectionObserver","isIntersecting","disconnect","rootMargin","observe","noHydrate","_props","_railsContext","_domNodeId","lazyHydrate","loader","props","domNodeId","then","module","component","hydrate","React","createElement","lazyHydrateNearScreen","webviewTrack","name","parameters","AnalyticsWebInterface","logEvent","webkit","messageHandlers","firebase","message","command","postMessage","Array","from","querySelectorAll","forEach","anchor","getAttribute","trackFunc","PROVIDER","EXPIRED_FLAGS","TTD","sendData","provider","ENDPOINT","generalVariables","tag","visitor","Cookies","seen_at","Date","now","form","FormData","append","JSON","stringify","navigator","sendBeacon","setExpiration","browser","dayjs","end","detectBrowser","add","localStorage","setItem","toISOString","JSON_URL","fetch","credentials","res","ok","json","TDID","expirationFlag","getItem","expiredDate","isAfter","isExpired","syncTDID","replaceMatchedElement","html","newElement","div","innerHTML","firstElementChild","Error","createElementFromHTML","matchedElement","parentNode","replaceChild","statusChangeCallback","response","isAutoLogin","test","cookie","status","checkIsUserLoggedIn","headers","accept","captureException","error","icook_navbar","navbar_right_mobile_popup","ensureInitialized","FB","getLoginStatus","categoriesList","querySelector","blurBefore","blurAfter","scrollLeft","scrollWidth","clientWidth","style","opacity","maxScrollLeft","isJSDebugMode","location","search","indexOf","sentryDSN","process","isClient","init","debug","dsn","environment","integrations","Dedupe","Integrations","BrowserTracing","tracesSampleRate","release","allowUrls","ignoreErrors","denyUrls","currentUser","parse","slice","length","configureScope","scope","setUser","username","is_admin","exports","storageKey","isMobile","userAgent","preventDefault","cancelable","fixBody","action","body","classList","passive","remove","scrollTo","element","options","behavior","block","scrollIntoView","hideFacebookDialog","facebookDialog","display","getAuthToken","includes","showError","show","container","Snackbar","type","children","unmountComponentAtNode","formatter","number","toString","replace","getFareDescription","product","fare","fareThreshold","getAvailableQuantity","sku","inventory","Math","min","available_inventory_count","quantity_ceiling","max","getTotal","vip","coupon","skus","orderSkus","values","map","price","quantity","productsTotal","reduce","sum","orderProduct","fareTotal","discountTotal","vip_only","discountPolicy","policy","discount","discountThreshold","discount_threshold","floor","getBuySomeGetPercentageDiscount","total","times","getProgressiveRedemptionDiscount","getShippingDiscount","getDateStatus","started_at","ended_at","nowDate","startDate","endDate","isBefore","generateFormattedTime","seconds","day","unit","hour","minute","getViewportWidth","innerWidth","documentElement","debounce","func","timeout","wait","immediate","context","this","args","arguments","later","apply","callNow","clearTimeout","setTimeout"],"mappings":"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","file":"js/components~application~products-show-1493d2bf669c0de4f947.chunk.js","sourcesContent":["let _supportsPassive = false;\ntry {\n const opts = Object.defineProperty({}, 'passive', {\n get() {\n _supportsPassive = true;\n return false;\n }\n });\n window.addEventListener('testPassive', null, opts);\n window.removeEventListener('testPassive', null, opts);\n} catch (e) {\n _supportsPassive = false;\n}\nconst supportsPassive = _supportsPassive;\nexport default supportsPassive;\n\n// import supportsPassive from path/to/supportsPassive;\n// element.addEventListener('touchstart', fn, supportsPassive ? { passive: true } : false);\n// ref: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#safely_detecting_option_support\n","import ReactDOM from 'react-dom';\nimport { isCool3c } from '../utility';\nimport styles from './style.module.scss';\n\nconst CustomerChat = () => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default CustomerChat;\n\nexport const renderCustomerChat = () => {\n const mountPoint = document.getElementById('CustomerChat');\n if (mountPoint) ReactDOM.render(, mountPoint);\n};\n","import 'intersection-observer';\n\nconst callOnNearScreen = (callback, node, option) => {\n if (!node) return;\n\n const OPTION = {\n rootMargin: '0px 0px 400px 0px'\n };\n\n const io = new window.IntersectionObserver(([entry]) => {\n if (entry.isIntersecting) {\n callback();\n io.disconnect();\n }\n }, option || OPTION);\n\n io.observe(node);\n};\n\nexport default callOnNearScreen;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport callOnNearScreen from './callOnNearScreen';\n\n// Keep this function with three params, so ReactOnRails knows it is a renderer.\n// i.e: noHydrate.length === 3\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const noHydrate = (_props, _railsContext, _domNodeId) => {};\n\nexport const lazyHydrate = (loader) => {\n return function (props, _railsContext, domNodeId) {\n loader().then((module) => {\n const component = module.default;\n const node = document.getElementById(domNodeId);\n ReactDOM.hydrate(React.createElement(component, props), node);\n });\n };\n};\n\nexport const lazyHydrateNearScreen = (loader, option) => {\n return function (props, _railsContext, domNodeId) {\n const node = document.getElementById(domNodeId);\n callOnNearScreen(\n () => {\n loader().then((module) => {\n const component = module.default;\n ReactDOM.hydrate(React.createElement(component, props), node);\n });\n },\n node,\n option\n );\n };\n};\n","function webviewTrack(name, parameters) {\n return () => {\n if (window.AnalyticsWebInterface) {\n // Call Android interface\n window.AnalyticsWebInterface.logEvent(name, parameters);\n } else if (\n window.webkit &&\n window.webkit.messageHandlers &&\n window.webkit.messageHandlers.firebase\n ) {\n // Call iOS interface\n const message = { command: 'logEvent', name, parameters };\n window.webkit.messageHandlers.firebase.postMessage(message);\n }\n };\n}\n\nconst bindTrack = () => {\n const trackedAnchors = Array.from(\n document.querySelectorAll('.webview-track')\n );\n trackedAnchors.forEach((anchor) => {\n const name = anchor.getAttribute('data-name');\n const parameters = anchor.getAttribute('data-parameters');\n\n if (name && parameters) {\n const trackFunc = webviewTrack(name, parameters);\n anchor.addEventListener('click', trackFunc);\n }\n });\n};\n\nif (typeof window !== 'undefined') {\n bindTrack();\n}\n\nexport { webviewTrack };\n","/* eslint-disable no-console */\n\nimport 'navigator.sendbeacon';\nimport Cookies from 'js-cookie';\nimport localStorage from 'local-storage-fallback';\nimport { detect as detectBrowser } from 'detect-browser';\nimport dayjs from 'dayjs';\n\nconst PROVIDER = {\n TTD: 'unified_id'\n};\nconst EXPIRED_FLAGS = {\n TTD: `${PROVIDER.TTD}_exp`\n};\n\nconst isSafari = () => {\n const browser = detectBrowser();\n return (\n browser &&\n (browser.name === 'safari' ||\n browser.name === 'ios' ||\n browser.name === 'ios-webview')\n );\n};\n\n/**\n * Send ad unified ID data to `fluentd.polydice.com`\n *\n * @param {{id: string, provider: string} data\n */\nfunction sendData({ id, provider }) {\n const ENDPOINT = 'https://fluentd.polydice.com/event';\n const generalVariables = {\n tag: 'event.unique_id',\n visitor: Cookies.get('visitor') || '',\n seen_at: Date.now() / 1000,\n id,\n provider\n };\n\n const form = new FormData();\n form.append('json', JSON.stringify(generalVariables));\n const isSuccess = navigator.sendBeacon(ENDPOINT, form);\n if (!isSuccess) {\n navigator.sendBeacon(ENDPOINT, form);\n }\n}\n\nconst isExpired = (provider) => {\n const expirationFlag = localStorage.getItem(EXPIRED_FLAGS[provider]);\n\n if (!expirationFlag) {\n return true;\n }\n\n const now = dayjs();\n const expiredDate = dayjs(expirationFlag);\n return now.isAfter(expiredDate);\n};\n\n/**\n * Set id expiration date on localStorage\n * @param {'TTD'} provider\n */\nfunction setExpiration(provider) {\n const now = dayjs();\n const end = isSafari() ? now : now.add(1, 'year');\n localStorage.setItem(EXPIRED_FLAGS[provider], end.toISOString());\n}\n\nasync function syncTDID() {\n const PARTNER_ID = 'nkd9bh0';\n const JSON_URL = `https://match.adsrvr.org/track/rid?ttd_pid=${PARTNER_ID}&fmt=json`;\n\n const res = await fetch(JSON_URL, { credentials: 'include' });\n if (res.ok) {\n const json = await res.json();\n const { TDID } = json;\n\n localStorage.setItem(PROVIDER.TTD, TDID);\n sendData({ id: TDID, provider: PROVIDER.TTD });\n setExpiration('TTD');\n }\n}\n\nfunction sync() {\n if (isExpired('TTD')) {\n syncTDID();\n }\n}\n\nsync();\n","import { ensureInitialized } from '@polydice/icook-facebook-init-js/dist/sdk';\nimport { checkIsUserLoggedIn } from '@polydice/icook-devise-unify';\nimport { captureException } from '@sentry/browser';\n\nconst createElementFromHTML = (html: string) => {\n const div = document.createElement('div');\n div.innerHTML = html;\n if (!div.firstElementChild) throw new Error('Unexpected response');\n return div.firstElementChild;\n};\n\nconst replaceMatchedElement = (html: string) => {\n const newElement = createElementFromHTML(html);\n const matchedElement = document.getElementById(newElement.id);\n\n if (!matchedElement) return;\n\n matchedElement.parentNode?.replaceChild(newElement, matchedElement);\n};\n\ninterface Data {\n icook_navbar: string;\n navbar_right_mobile_popup: string;\n}\n\ninterface ErrorData {\n error: string;\n}\n\nconst statusChangeCallback = async (response: fb.StatusResponse) => {\n const isAutoLogin = !/prevent_auto_login=/.test(document.cookie);\n\n if (\n response.status === 'connected' &&\n !checkIsUserLoggedIn() &&\n isAutoLogin\n ) {\n const res = await fetch('https://icook.tw/users/auth/facebook/callback', {\n headers: { accept: 'application/json' },\n credentials: 'include'\n });\n\n /* Bypass the Errors that are handled by server. */\n if (res.status === 501 || res.status === 403) {\n captureException(((await res.json()) as ErrorData).error);\n return;\n }\n try {\n if (!res.ok) throw new Error(`res.status: ${res.status}`);\n\n const { icook_navbar, navbar_right_mobile_popup } =\n (await res.json()) as Data;\n\n [icook_navbar, navbar_right_mobile_popup].forEach(replaceMatchedElement);\n } catch (e) {\n if (e instanceof Error) {\n // Errors may happen if server doesnt response as expected.\n captureException(`Facebook auto login failed: ${e.message}`);\n }\n }\n }\n};\n\nensureInitialized(() => FB.getLoginStatus(statusChangeCallback));\n","// for overflow blur effect\nconst categoriesList = document.querySelector('.categories-list');\n\nif (categoriesList) {\n const blurBefore = document.querySelector('.categories-list__blur--before');\n const blurAfter = document.querySelector('.categories-list__blur--after');\n\n if (\n categoriesList.scrollLeft !==\n categoriesList.scrollWidth - categoriesList.clientWidth\n ) {\n blurAfter.style.opacity = '1';\n } else {\n blurAfter.style.opacity = '0';\n }\n\n categoriesList.addEventListener('scroll', (e) => {\n const { scrollLeft, scrollWidth, clientWidth } = e.target;\n const maxScrollLeft = scrollWidth - clientWidth;\n\n blurBefore.style.opacity = scrollLeft > 1 ? '1' : '0';\n blurAfter.style.opacity = scrollLeft !== maxScrollLeft ? '1' : '0';\n });\n}\n","const isJSDebugMode =\n typeof window !== 'undefined' &&\n window.location.search.indexOf('icook_js_debug=true') !== -1;\n\nexport default isJSDebugMode;\n","import { configureScope, init } from '@sentry/browser';\nimport { Dedupe } from '@sentry/integrations';\nimport { Integrations } from '@sentry/tracing';\nimport { isClient } from '../reactjs/components/utility';\nimport isJSDebugMode from './isJSDebugMode';\n\nconst sentryDSN = process.env.SENTRY_DSN_F2E;\nconst commit = process.env.GIT_COMMIT;\n\nif (sentryDSN && isClient()) {\n init({\n debug: isJSDebugMode,\n dsn: sentryDSN,\n environment: process.env.NODE_ENV,\n // Disable Breadcrumbs if in Development\n integrations:\n process.env.NODE_ENV === 'development'\n ? (integrations) => {\n return integrations.filter(\n (integration) => integration.name !== 'Breadcrumbs'\n );\n }\n : [new Dedupe(), new Integrations.BrowserTracing()],\n tracesSampleRate: 0.1,\n release: commit,\n allowUrls: [/https?:\\/\\/[^/]+icook\\.(hk|tw|network)\\//],\n // Mostly copied from https://gist.github.com/impressiver/5092952\n ignoreErrors: [\n // Webpack loading issues\n 'ChunkLoadError',\n // Random plugins/extensions\n 'top.GLOBALS',\n // See: http://blog.errorception.com/2012/03/tale-of-unfindable-js-error.html\n 'originalCreateNotification',\n 'canvas.contentDocument',\n 'MyApp_RemoveAllHighlights',\n 'http://tt.epicplay.com',\n \"Can't find variable: ZiteReader\",\n \"Can't find variable: _AutofillCallbackHandler\",\n \"Can't find variable: _pcmBridgeCallbackHandler\",\n 'jigsaw is not defined',\n 'ComboSearch is not defined',\n 'http://loading.retry.widdit.com/',\n 'atomicFindClose',\n // Facebook borked\n 'fb_xd_fragment',\n // ISP \"optimizing\" proxy - `Cache-Control: no-transform` seems to reduce this. (thanks @acdha)\n // See http://stackoverflow.com/questions/4113268/how-to-stop-javascript-injection-from-vodafone-proxy\n 'bmi_SafeAddOnload',\n 'EBCallBackMessageReceived',\n // See http://toolbar.conduit.com/Developer/HtmlAndGadget/Methods/JSInjection.aspx\n 'conduitPage',\n // Generic error code from errors outside the security sandbox\n // You can delete this if using raven.js > 1.0, which ignores these automatically.\n 'Script error.',\n // This can be removed once Chrome 89 is widely used\n '-webkit-details-marker',\n \"null is not an object (evaluating 'e.contentWindow.postMessage')\"\n ],\n denyUrls: [\n // Facebook flakiness\n /graph\\.facebook\\.com/i,\n // Facebook blocked\n /connect\\.facebook\\.net\\/en_US\\/all\\.js/i,\n // Woopra flakiness\n /eatdifferent\\.com\\.woopra-ns\\.com/i,\n /static\\.woopra\\.com\\/js\\/woopra\\.js/i,\n // Chrome extensions\n /extensions\\//i,\n /^chrome:\\/\\//i,\n // Other plugins\n /127\\.0\\.0\\.1:4001\\/isrunning/i, // Cacaoweb\n /webappstoolbarba\\.texthelp\\.com\\//i,\n /metrics\\.itunes\\.apple\\.com\\.edgesuite\\.net\\//i\n ]\n });\n\n const node = document.querySelector('[data-key=\"icook-current-user\"]');\n if (node) {\n const LEFT = '';\n let currentUser = node.innerHTML;\n currentUser = JSON.parse(\n currentUser.slice(LEFT.length, currentUser.length - RIGHT.length)\n );\n configureScope((scope) => {\n scope.setUser({\n username: currentUser.username,\n is_admin: currentUser.is_admin\n });\n });\n }\n}\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"customerChat\":\"style-module__customerChat___14BhZ\"};","import { createElement } from 'react';\nimport { render, unmountComponentAtNode } from 'react-dom';\nimport Snackbar from '@polydice/ui/dist/Snackbar';\nimport supportsPassive from '../../components/supportsPassive';\nimport dayjs from 'dayjs';\n\nexport const storageKey = 'iCookShoppingCart';\n\nexport const isMobile = () => /Mobi/.test(navigator.userAgent);\n\nexport const isClient = () => typeof window !== 'undefined' && window.document;\n\nexport const preventDefault = (e) => {\n if (e.cancelable) {\n e.preventDefault();\n }\n};\n\nexport const fixBody = (action) => {\n if (action) {\n document.body.classList.add('modal-open');\n document.body.addEventListener(\n 'touchmove',\n preventDefault,\n supportsPassive\n ? {\n passive: true\n }\n : false\n );\n } else {\n document.body.classList.remove('modal-open');\n document.body.removeEventListener('touchmove', preventDefault);\n }\n};\n\nexport const scrollTo = (\n element,\n options = {\n behavior: 'smooth',\n block: 'start'\n }\n) => {\n if (!element) return;\n try {\n element.scrollIntoView(options);\n } catch {\n element.scrollIntoView(true);\n }\n};\n\nexport const hideFacebookDialog = (action) => {\n const facebookDialog = document.getElementById('CustomerChat');\n if (facebookDialog) {\n facebookDialog.style.display = action ? 'none' : 'block';\n return true;\n }\n return false;\n};\n\nexport const getAuthToken = () =>\n document.querySelector('[name=\"csrf-token\"]').getAttribute('content');\n\nexport const isCool3c = () => {\n return window.location.href?.includes('market.cool3c');\n};\n\nexport const showError = (show) => {\n const container = document.getElementById('error-container');\n if (container) {\n if (show) {\n render(\n // eslint-disable-next-line react/no-children-prop\n createElement(Snackbar, {\n type: 'error',\n children: '網路似乎不穩定,請稍後嘗試'\n }),\n container\n );\n } else {\n unmountComponentAtNode(container);\n }\n }\n};\n\nexport const formatter = (number) =>\n number.toString().replace(/\\d(?=(\\d{3})+$)/g, '$&,');\n\nexport const getFareDescription = (product) => {\n const { fare, fareThreshold } = product;\n let fareDescription = '';\n if (!fare) {\n fareDescription = '本館免運費';\n } else if (fareThreshold) {\n fareDescription = `消費滿 ${fareThreshold} 元免運費`;\n } else {\n fareDescription = '本館無免運費優惠';\n }\n return fareDescription;\n};\n\nexport const getAvailableQuantity = (sku) => {\n const inventory = Math.min(\n sku.available_inventory_count,\n sku.quantity_ceiling\n );\n return Math.max(inventory, 0);\n};\n\nconst getProgressiveRedemptionDiscount = ({\n discountThreshold,\n discount,\n productsTotal\n}) => {\n let total = productsTotal;\n let times = 0;\n while (total >= discountThreshold) {\n total -= discountThreshold;\n times += 1;\n }\n return times * discount;\n};\n\nconst getShippingDiscount = ({ fareTotal, discount }) =>\n fareTotal > 0 ? Math.min(fareTotal, discount) : 0;\n\nconst getBuySomeGetPercentageDiscount = ({ productsTotal, discount }) =>\n Math.floor(productsTotal * (discount / 100));\n\nexport const getTotal = (vip, coupon, fare, fareThreshold, skus) => {\n const orderSkus = Object.values(skus).map(({ price, quantity }) => ({\n price,\n quantity\n }));\n\n // productsTotal\n const productsTotal = orderSkus.reduce((sum, orderProduct) => {\n return sum + orderProduct.price * orderProduct.quantity;\n }, 0);\n\n // fareTotal\n const fareTotal = fareThreshold && productsTotal >= fareThreshold ? 0 : fare;\n // discountTotal\n let discountTotal = 0;\n if (!coupon || (coupon.vip_only && !vip)) {\n discountTotal = 0;\n } else {\n const {\n policy: discountPolicy,\n discount,\n discount_threshold: discountThreshold\n } = coupon;\n\n if (discountPolicy === 'buy_some_get_percentage_off') {\n const orderProductsTotalQuantity = orderSkus.reduce(\n (sum, { quantity }) => sum + quantity,\n 0\n );\n if (orderProductsTotalQuantity >= discountThreshold) {\n discountTotal = getBuySomeGetPercentageDiscount({\n productsTotal,\n discount\n });\n }\n } else {\n if (productsTotal >= discountThreshold) {\n switch (discountPolicy) {\n case 'redemption':\n discountTotal = discount;\n break;\n case 'progressive_redemption':\n discountTotal = getProgressiveRedemptionDiscount({\n discount: coupon.discount,\n productsTotal,\n discountThreshold\n });\n break;\n case 'shipping':\n discountTotal = getShippingDiscount({\n fareTotal,\n discount\n });\n break;\n default:\n discountTotal = 0;\n break;\n }\n } else {\n discountTotal = 0;\n }\n }\n }\n\n const total = productsTotal + fareTotal - discountTotal;\n\n return { total, productsTotal, fareTotal, discountTotal };\n};\n\nexport const getDateStatus = (started_at, ended_at) => {\n const nowDate = dayjs(new Date());\n const startDate = dayjs(started_at);\n const endDate = dayjs(ended_at);\n\n if (nowDate.isBefore(startDate)) return 'future';\n if (nowDate.isAfter(endDate)) return 'expired';\n return 'active';\n};\n\nexport const generateFormattedTime = (seconds) => {\n const day = Math.floor(seconds / 3600 / 24);\n if (day >= 2) {\n return { number: day, unit: '天' };\n }\n const hour = Math.floor(seconds / 3600);\n if (hour >= 1) {\n return { number: hour, unit: '小時' };\n }\n const minute = Math.floor(seconds / 60);\n if (minute >= 1) {\n return { number: minute, unit: '分鐘' };\n }\n const second = Math.floor(seconds % 60);\n return { number: second, unit: '秒' };\n};\n\nexport const getViewportWidth = () => {\n return (\n window.innerWidth ||\n document.documentElement.clientWidth ||\n document.body.clientWidth\n );\n};\n\nexport const debounce = (func, wait = 300, immediate = false) => {\n let timeout;\n\n return function executedFunction() {\n const context = this;\n const args = arguments;\n\n const later = function () {\n timeout = null;\n if (!immediate) func.apply(context, args);\n };\n\n const callNow = immediate && !timeout;\n\n clearTimeout(timeout);\n\n timeout = setTimeout(later, wait);\n\n if (callNow) func.apply(context, args);\n };\n};\n"],"sourceRoot":""}