{"version":3,"file":"track-Vo4ICfa8.js","sources":["../../../app/assets/javascripts/app/tracking/baidu/event.ts","../../../node_modules/change-case/dist/index.js","../../../app/assets/javascripts/app/tracking/goals/track.ts"],"sourcesContent":["\nimport _compact from \"lodash/compact\"\nimport log from \"plugins/loglevel/index\"\n\ninterface EventParams {\n category: string\n action: string\n options?: {\n eventLabel?: string\n eventValue?: number\n }\n}\n\ndeclare global {\n interface Window {\n _hmt: undefined | {\n push: (el: any) => void,\n },\n }\n}\n\nconst track = ({category, action, options = {}}: EventParams) => {\n const {eventLabel, eventValue} = options\n const debug_message_fragments = [\n \"[App.Tracking.Baidu.Event.track]\",\n \"about to track event with:\",\n [\n `category: [${category}]`,\n `action: [${action}]`,\n `options: [${JSON.stringify(options)}]`,\n ].join(\" ,\"),\n ]\n\n log.debug(debug_message_fragments.join(\" \"))\n\n if (typeof window._hmt !== \"undefined\") {\n // The format is _hmt.push(['_trackEvent', category, action, opt_label, opt_value])\n // It seems to be limited to an array, unlike Google Analytics.\n\n const data = _compact([\"_trackEvent\", category, action, eventLabel, eventValue])\n window._hmt.push(data)\n\n }\n else {\n log.debug(\"_hmt is missing\")\n }\n}\n\nexport default {track}\n","// Regexps involved with splitting words in various case formats.\nconst SPLIT_LOWER_UPPER_RE = /([\\p{Ll}\\d])(\\p{Lu})/gu;\nconst SPLIT_UPPER_UPPER_RE = /(\\p{Lu})([\\p{Lu}][\\p{Ll}])/gu;\n// Used to iterate over the initial split result and separate numbers.\nconst SPLIT_SEPARATE_NUMBER_RE = /(\\d)\\p{Ll}|(\\p{L})\\d/u;\n// Regexp involved with stripping non-word characters from the result.\nconst DEFAULT_STRIP_REGEXP = /[^\\p{L}\\d]+/giu;\n// The replacement value for splits.\nconst SPLIT_REPLACE_VALUE = \"$1\\0$2\";\n// The default characters to keep after transforming case.\nconst DEFAULT_PREFIX_SUFFIX_CHARACTERS = \"\";\n/**\n * Split any cased input strings into an array of words.\n */\nexport function split(value) {\n let result = value.trim();\n result = result\n .replace(SPLIT_LOWER_UPPER_RE, SPLIT_REPLACE_VALUE)\n .replace(SPLIT_UPPER_UPPER_RE, SPLIT_REPLACE_VALUE);\n result = result.replace(DEFAULT_STRIP_REGEXP, \"\\0\");\n let start = 0;\n let end = result.length;\n // Trim the delimiter from around the output string.\n while (result.charAt(start) === \"\\0\")\n start++;\n if (start === end)\n return [];\n while (result.charAt(end - 1) === \"\\0\")\n end--;\n return result.slice(start, end).split(/\\0/g);\n}\n/**\n * Split the input string into an array of words, separating numbers.\n */\nexport function splitSeparateNumbers(value) {\n const words = split(value);\n for (let i = 0; i < words.length; i++) {\n const word = words[i];\n const match = SPLIT_SEPARATE_NUMBER_RE.exec(word);\n if (match) {\n const offset = match.index + (match[1] ?? match[2]).length;\n words.splice(i, 1, word.slice(0, offset), word.slice(offset));\n }\n }\n return words;\n}\n/**\n * Convert a string to space separated lower case (`foo bar`).\n */\nexport function noCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n return (prefix +\n words.map(lowerFactory(options?.locale)).join(options?.delimiter ?? \" \") +\n suffix);\n}\n/**\n * Convert a string to camel case (`fooBar`).\n */\nexport function camelCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n const transform = options?.mergeAmbiguousCharacters\n ? capitalCaseTransformFactory(lower, upper)\n : pascalCaseTransformFactory(lower, upper);\n return (prefix +\n words\n .map((word, index) => {\n if (index === 0)\n return lower(word);\n return transform(word, index);\n })\n .join(options?.delimiter ?? \"\") +\n suffix);\n}\n/**\n * Convert a string to pascal case (`FooBar`).\n */\nexport function pascalCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n const transform = options?.mergeAmbiguousCharacters\n ? capitalCaseTransformFactory(lower, upper)\n : pascalCaseTransformFactory(lower, upper);\n return prefix + words.map(transform).join(options?.delimiter ?? \"\") + suffix;\n}\n/**\n * Convert a string to pascal snake case (`Foo_Bar`).\n */\nexport function pascalSnakeCase(input, options) {\n return capitalCase(input, { delimiter: \"_\", ...options });\n}\n/**\n * Convert a string to capital case (`Foo Bar`).\n */\nexport function capitalCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n return (prefix +\n words\n .map(capitalCaseTransformFactory(lower, upper))\n .join(options?.delimiter ?? \" \") +\n suffix);\n}\n/**\n * Convert a string to constant case (`FOO_BAR`).\n */\nexport function constantCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n return (prefix +\n words.map(upperFactory(options?.locale)).join(options?.delimiter ?? \"_\") +\n suffix);\n}\n/**\n * Convert a string to dot case (`foo.bar`).\n */\nexport function dotCase(input, options) {\n return noCase(input, { delimiter: \".\", ...options });\n}\n/**\n * Convert a string to kebab case (`foo-bar`).\n */\nexport function kebabCase(input, options) {\n return noCase(input, { delimiter: \"-\", ...options });\n}\n/**\n * Convert a string to path case (`foo/bar`).\n */\nexport function pathCase(input, options) {\n return noCase(input, { delimiter: \"/\", ...options });\n}\n/**\n * Convert a string to path case (`Foo bar`).\n */\nexport function sentenceCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n const transform = capitalCaseTransformFactory(lower, upper);\n return (prefix +\n words\n .map((word, index) => {\n if (index === 0)\n return transform(word);\n return lower(word);\n })\n .join(options?.delimiter ?? \" \") +\n suffix);\n}\n/**\n * Convert a string to snake case (`foo_bar`).\n */\nexport function snakeCase(input, options) {\n return noCase(input, { delimiter: \"_\", ...options });\n}\n/**\n * Convert a string to header case (`Foo-Bar`).\n */\nexport function trainCase(input, options) {\n return capitalCase(input, { delimiter: \"-\", ...options });\n}\nfunction lowerFactory(locale) {\n return locale === false\n ? (input) => input.toLowerCase()\n : (input) => input.toLocaleLowerCase(locale);\n}\nfunction upperFactory(locale) {\n return locale === false\n ? (input) => input.toUpperCase()\n : (input) => input.toLocaleUpperCase(locale);\n}\nfunction capitalCaseTransformFactory(lower, upper) {\n return (word) => `${upper(word[0])}${lower(word.slice(1))}`;\n}\nfunction pascalCaseTransformFactory(lower, upper) {\n return (word, index) => {\n const char0 = word[0];\n const initial = index > 0 && char0 >= \"0\" && char0 <= \"9\" ? \"_\" + char0 : upper(char0);\n return initial + lower(word.slice(1));\n };\n}\nfunction splitPrefixSuffix(input, options = {}) {\n const splitFn = options.split ?? (options.separateNumbers ? splitSeparateNumbers : split);\n const prefixCharacters = options.prefixCharacters ?? DEFAULT_PREFIX_SUFFIX_CHARACTERS;\n const suffixCharacters = options.suffixCharacters ?? DEFAULT_PREFIX_SUFFIX_CHARACTERS;\n let prefixIndex = 0;\n let suffixIndex = input.length;\n while (prefixIndex < input.length) {\n const char = input.charAt(prefixIndex);\n if (!prefixCharacters.includes(char))\n break;\n prefixIndex++;\n }\n while (suffixIndex > prefixIndex) {\n const index = suffixIndex - 1;\n const char = input.charAt(index);\n if (!suffixCharacters.includes(char))\n break;\n suffixIndex = index;\n }\n return [\n input.slice(0, prefixIndex),\n splitFn(input.slice(prefixIndex, suffixIndex)),\n input.slice(suffixIndex),\n ];\n}\n//# sourceMappingURL=index.js.map","\nimport Google_event from \"app/tracking/google/event\"\nimport Baidu_event from \"app/tracking/baidu/event\"\nimport Facebook_event from \"app/tracking/facebook-pixel/event\"\nimport PageInstance from \"app/page_instance/index\"\nimport GA4_Event from \"app/tracking/google/google_analytics_4/event\"\nimport {snakeCase} from \"change-case\"\n\nconst listing_type_label = (type: string) => {\n switch (type){\n case \"residential_rent\":\n return \"Residential Rent\"\n case \"residential_sale\":\n return \"Residential Sale\"\n case \"commercial_rent\":\n return \"Commercial Rent\"\n case \"commercial_sale\":\n return \"Commercial Sale\"\n case \"serviced_apartment\":\n return \"Serviced Apartment\"\n case \"overseas\":\n return \"Overseas Property\"\n default:\n return \"Unknown\"\n }\n}\n\n\n// region PropertyTypeLabels\n// Define enum for flow properly\n// https://github.com/facebook/flow/issues/5465#issuecomment-350422478\n/* eslint-disable no-unused-vars */\nenum PropertyTypeLabels {\n RESIDENTIAL_RENTAL = \"Residential Rental\",\n RESIDENTIAL_SALE = \"Residential Sale\",\n COMMERCIAL_RENTAL = \"Commercial Rental\",\n COMMERCIAL_SALE = \"Commercial Sale\",\n SERVICED_APARTMENT = \"Serviced Apartment\",\n OVERSEAS = \"Overseas\",\n\n //region Business Center\n\n BUSINESS_CENTER = \"Business Center\",\n SERVICED_OFFICE = \"Serviced Office\",\n COWORKING_SPACE = \"Coworking Space\",\n\n //endregion\n\n COLIVING_SPACE = \"Coliving Space\",\n}\n/* eslint-enable no-unused-vars */\n// endregion PropertyTypeLabels\n\n\n\n\nconst ListingContactByPhone = {\n track: () => {\n Facebook_event.trackPhone()\n },\n}\n\nconst ListingContactSuccessByPhone = {\n PropertyTypeLabels: PropertyTypeLabels,\n\n track(property_type_label: PropertyTypeLabels){\n // New tracking event for sent phone enquiries\n Google_event.track({\n category: PageInstance.currentPageNameForTracking(),\n action: \"Enquiry\",\n options: {\n eventLabel: `${property_type_label} Phone Enquiry - Submitted`,\n },\n })\n\n GA4_Event.track({\n event_name: \"phone_enquiry_submitted\",\n options: {\n page: PageInstance.currentPageNameForTracking(),\n label: snakeCase(property_type_label),\n },\n })\n\n Baidu_event.track({\n category: PageInstance.currentPageNameForTracking(),\n action: \"Enquiry\",\n options: {\n eventLabel: `${property_type_label} Phone Enquiry - Submitted`,\n },\n })\n },\n}\n\n\n// region ListingContactByEmail\nconst ListingContactByEmail = {\n PropertyTypeLabels: PropertyTypeLabels,\n\n track(property_type_label: PropertyTypeLabels){\n Facebook_event.trackEmail()\n\n // New tracking event for sent phone enquiries\n Google_event.track({\n category: PageInstance.currentPageNameForTracking(),\n action: \"Enquiry\",\n options: {\n eventLabel: `${property_type_label} Email Enquiry - Submitted`,\n },\n })\n\n GA4_Event.track({\n event_name: \"email_enquiry_submitted\",\n options: {\n page: PageInstance.currentPageNameForTracking(),\n label: snakeCase(property_type_label),\n },\n })\n\n Baidu_event.track({\n category: PageInstance.currentPageNameForTracking(),\n action: \"Enquiry\",\n options: {\n eventLabel: `${property_type_label} Email Enquiry - Submitted`,\n },\n })\n },\n}\n// endregion ListingContactByEmail\n\n\nconst MobileAppDownloadLead = {\n track(eventLabel: string){\n const category = \"Mobile App Download Lead\"\n const action = \"App Store Link Opened\"\n const options = {\n eventLabel,\n eventValue: 1,\n }\n Google_event.track({category, action, options})\n Baidu_event.track({category, action, options})\n },\n}\n\n\nexport default {\n ListingContactByPhone,\n ListingContactSuccessByPhone,\n ListingContactByEmail,\n MobileAppDownloadLead,\n}\n"],"names":["track","category","action","options","eventLabel","eventValue","debug_message_fragments","log","data","_compact","Baidu_event","SPLIT_LOWER_UPPER_RE","SPLIT_UPPER_UPPER_RE","SPLIT_SEPARATE_NUMBER_RE","DEFAULT_STRIP_REGEXP","SPLIT_REPLACE_VALUE","DEFAULT_PREFIX_SUFFIX_CHARACTERS","split","value","result","start","end","splitSeparateNumbers","words","i","word","match","offset","_a","noCase","input","prefix","suffix","splitPrefixSuffix","lowerFactory","snakeCase","locale","splitFn","prefixCharacters","_b","suffixCharacters","_c","prefixIndex","suffixIndex","char","index","PropertyTypeLabels","ListingContactByPhone","Facebook_event","ListingContactSuccessByPhone","property_type_label","Google_event","PageInstance","GA4_Event","ListingContactByEmail","MobileAppDownloadLead","Goals"],"mappings":"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","x_google_ignoreList":[1]}