{"version":3,"file":"8042.js","sources":["webpack://frontend/./src/constant/index.ts","webpack://frontend/./src/utils/Icon.tsx","webpack://frontend/./src/utils/analytics_tools/index.tsx","webpack://frontend/./src/utils/credit_card_tools/index.ts","webpack://frontend/./src/utils/array_tools/index.ts","webpack://frontend/./src/utils/async_tools/index.ts","webpack://frontend/./src/utils/chart_tools/index.ts","webpack://frontend/./src/utils/validation_tools/index.ts","webpack://frontend/./src/utils/date_time_tools/index.ts","webpack://frontend/./src/utils/dom_tools/index.ts","webpack://frontend/./src/utils/number_tools/index.ts","webpack://frontend/./src/utils/other_tools/index.ts","webpack://frontend/./src/utils/storage_tools/index.ts","webpack://frontend/./src/utils/string_tools/index.ts","webpack://frontend/./src/utils/style_tools/index.ts","webpack://frontend/./src/utils/uuid_tools/index.tsx"],"sourcesContent":["export const OPACITY_VARIANTS = {\r\n initial: {\r\n opacity: 0\r\n },\r\n in: {\r\n opacity: 1\r\n },\r\n out: {\r\n opacity: 0\r\n }\r\n}\r\nexport const ONE_DAY = 1000 * 60 * 60 * 24\r\nexport const TWENTY_EIGHT_DAYS = ONE_DAY * 28\r\nexport const LONG_MONTHS =\r\n '{\"1\":\"January\",\"2\":\"February\",\"3\":\"March\",\"4\":\"April\",\"5\":\"May\",\"6\":\"June\",\"7\":\"July\",\"8\":\"August\",\"9\":\"September\",\"10\":\"October\",\"11\":\"November\",\"12\":\"December\"}'\r\n\r\nexport const WATER_MONTHS =\r\n '{\"1\":\"May\",\"2\":\"June\",\"3\":\"July\",\"4\":\"August\",\"5\":\"September\",\"6\":\"October\",\"7\":\"November\",\"8\":\"December\",\"9\":\"January\",\"10\":\"February\",\"11\":\"March\",\"12\":\"April\"}'\r\n\r\nexport const SEASONS: Record = {\r\n '1': 'Summer',\r\n '2': 'Autumn',\r\n '3': 'Winter',\r\n '4': 'Spring'\r\n}\r\n\r\nexport const RADIO_KEYCODE = {\r\n DOWN: 40,\r\n LEFT: 37,\r\n RIGHT: 39,\r\n SPACE: 32,\r\n UP: 38,\r\n TAB: 9,\r\n ESCAPE: 27,\r\n ENTER: 13\r\n}\r\nexport const RADIO_KEY = {\r\n DOWN: 'ArrowDown',\r\n LEFT: 'ArrowLeft',\r\n RIGHT: 'ArrowRight',\r\n SPACE: 'Space',\r\n UP: 'ArrowUp',\r\n TAB: 'Tab',\r\n ESCAPE: 'Escape',\r\n ENTER: 'Enter'\r\n}\r\n\r\nexport const WATER_TARGETS_TIMEFRAME = ['Daily', 'Weekly', 'Monthly']\r\n\r\n/**\r\n * Trade waste form\r\n */\r\nexport const TRADE_WASTE_FORM = 'tradeWaste'\r\nexport const SELECT_OPTIONS = ['0', '1', '2', '3', '4', '5']\r\nexport const SELECT_OPTIONS_SHOWER_TIMER = ['1', '2']\r\nexport const DAYS = [\r\n 'Monday',\r\n 'Tuesday',\r\n 'Wednesday',\r\n 'Thursday',\r\n 'Friday',\r\n 'Saturday',\r\n 'Sunday'\r\n]\r\nexport const TIMES = [\r\n '12:00 AM',\r\n '12:30 AM',\r\n '1:00 AM',\r\n '1:30 AM',\r\n '2:00 AM',\r\n '2:30 AM',\r\n '3:00 AM',\r\n '3:30 AM',\r\n '4:00 AM',\r\n '4:30 AM',\r\n '5:00 AM',\r\n '5:30 AM',\r\n '6:00 AM',\r\n '6:30 AM',\r\n '7:00 AM',\r\n '7:30 AM',\r\n '8:00 AM',\r\n '8:30 AM',\r\n '9:00 AM',\r\n '9:30 AM',\r\n '10:00 AM',\r\n '10:30 AM',\r\n '11:00 AM',\r\n '11:30 AM',\r\n '12:00 PM',\r\n '12:30 PM',\r\n '1:00 PM',\r\n '1:30 PM',\r\n '2:00 PM',\r\n '2:30 PM',\r\n '3:00 PM',\r\n '3:30 PM',\r\n '4:00 PM',\r\n '4:30 PM',\r\n '5:00 PM',\r\n '5:30 PM',\r\n '6:00 PM',\r\n '6:30 PM',\r\n '7:00 PM',\r\n '7:30 PM',\r\n '8:00 PM',\r\n '8:30 PM',\r\n '9:00 PM',\r\n '9:30 PM',\r\n '10:00 PM',\r\n '10:30 PM',\r\n '11:00 PM',\r\n '11:30 PM'\r\n]\r\n\r\n// ACTIONS\r\nexport const UPLOAD = 'UPLOAD'\r\nexport const SHOW_FIELD_VALIDATION = 'SHOW_FIELD_VALIDATION'\r\nexport const UPDATE_VALUE = 'UPDATE_VALUE'\r\nexport const SET_FIELDS = 'SET_FIELDS'\r\nexport const ERROR = 'ERROR'\r\nexport const DELETE = 'DELETE'\r\nexport const DELETE_ALL = 'DELETE_ALL'\r\nexport const COMPLETE = 'COMPLETE'\r\nexport const IS_COMPLETE = 'IS_COMPLETE'\r\nexport const SILENT_CHECK = 'SILENT_CHECK'\r\nexport const SET_PAGE = 'SET_PAGE'\r\nexport const SET_TRACK = 'SET_TRACK'\r\nexport const NEXT = 'NEXT'\r\nexport const BACK = 'BACK'\r\nexport const SUBMIT = 'SUBMIT'\r\nexport const SUBMITTED_SUCCESS = 'SUBMITTED_SUCCESS'\r\nexport const SUBMITTED_ERROR = 'SUBMITTED_ERROR'\r\nexport const SHOW_ERROR = 'SHOW_ERROR'\r\nexport const HIDE_ERROR = 'HIDE_ERROR'\r\nexport const RESET = 'RESET'\r\nexport const ADD = 'ADD'\r\n// GENERIC\r\nexport const NAME = 'name'\r\nexport const NUMBER = 'number'\r\nexport const EMAIL = 'email'\r\nexport const BUSINESS_TRADING_NAME = 'business_trading_name'\r\nexport const DATE_OF_CHANGE = 'date_of_change'\r\nexport const DESCRIPTION = 'description'\r\n\r\nexport const APPLICATION_TYPE = 'application_type'\r\nexport const PERMIT_NUMBER = 'permit_number'\r\nexport const NEW_PERMIT_OTHER = 'new_permit_other'\r\nexport const WHICH_BUSINESS = 'which_business'\r\nexport const TRADE_WASTE_APPLICATION_TYPE = 'trade_waste_application_type'\r\nexport const TRADE_WASTE_CHANGE = 'trade_waste_change'\r\nexport const APPLY_NEW_TRADE_WASTE_UNSUPPORTED =\r\n 'APPLY_NEW_TRADE_WASTE_UNSUPPORTED'\r\nexport const APPLY_NEW_TRADE_WASTE_PERMIT = 'Apply for a trade waste permit'\r\nexport const CHANGE_DETAILS_EXISTING_WASTE_PERMIT =\r\n 'Change details of existing trade waste permit'\r\nexport const APPLY_SHARED_GREASE_ARRESTOR =\r\n 'Shared grease arrestor application form'\r\nexport const APPLY_SHORT_TERM_WASTE_DISPOSAL =\r\n 'Apply for a one-off or short-term waste disposal permit'\r\n\r\nexport const SET_STATUS = 'SET_STATUS'\r\n\r\n// BUSINESS DETAILS\r\nexport const BUSINESS_DETAILS = 'business_details'\r\nexport const SHOP_NUMBER = 'unit_shop_number'\r\nexport const STREET_NUMBER = 'street_number'\r\nexport const STREET_NAME = 'street_name'\r\nexport const NEAREST_INTERSECTION = 'nearest_intersection'\r\nexport const SUBURB = 'suburb'\r\nexport const POSTCODE = 'postcode'\r\nexport const BUILDING_SHOPPING_CENTRE_NAME = 'building_shopping_centre_name'\r\n\r\nexport const Abn = 'abn'\r\nexport const COMPANY_NAME = 'company_name'\r\nexport const DATE_OF_DISCHARGE = 'date_of_discharge'\r\nexport const MAILING_SAME = 'mailing_same'\r\nexport const MAILING_ADDRESS = 'mailing_address'\r\nexport const MAILING_SUBURB = 'mailing_suburb'\r\nexport const MAILING_POSTCODE = 'mailing_postcode'\r\n\r\nexport const OPERATOR_DETAILS = 'operator_details'\r\nexport const OPERATOR_NAME = 'operator_name'\r\nexport const OPERATOR_POSITION = 'operator_position'\r\nexport const OPERATOR_NUMBER = 'operator_number'\r\nexport const OPERATOR_EMAIL = 'operator_email'\r\n\r\nexport const BUSINESS_HOURS = 'business_hours'\r\nexport const REMOVE_BUSINESS_HOURS = 'remove_business_hours'\r\nexport const DAY = 'day'\r\nexport const FROM = 'from'\r\nexport const TO = 'to'\r\n\r\n// PROCESS DETAILS\r\nexport const PROCESS_DETAILS = 'PROCESS_DETAILS'\r\nexport const SEATING_CAPACITY = 'seating_capacity'\r\nexport const COOKING_ON_PREMISES = 'cooking_on_premises'\r\n\r\nexport const KITCHEN = 'KITCHEN'\r\nexport const KITCHEN_SINK = 'kitchen_sink'\r\nexport const DOUBLE_KITCHEN_SINK = 'double_kitchen_sink'\r\nexport const POT_SINK = 'pot_sink'\r\nexport const DOUBLE_POT_SINK = 'double_pot_sink'\r\nexport const HAND_BASIN = 'hand_basin'\r\nexport const WOK_BURNERS = 'wok_burners'\r\nexport const COMBI_OVENS = 'combi_ovens'\r\nexport const CONNECTING_EXISTING_GREASE_ARRESTOR =\r\n 'connecting_existing_grease_arrestor'\r\nexport const CONNECTING_NEW_GREASE_ARRESTOR = 'connecting_new_grease_arrestor'\r\nexport const ADDITIONAL_FITOUT_OR_PLUMBING_WORK = 'fitouts_additional_plumbing'\r\n\r\nexport const MENU = 'proposed_menu'\r\nexport const PLUMBING_PLAN = 'plumbing_plan'\r\n\r\nexport const CONTACT = 'contacts'\r\nexport const REMOVE_CONTACT = 'remove_contact'\r\nexport const CONTACT_NUMBER = 'contact_number'\r\nexport const CONTACT_RELATIONSHIP = 'contact_relationship'\r\nexport const CONTACT_NAME = 'contact_name'\r\nexport const CONTACT_RELATIONSHIPS = [\r\n 'Property owner',\r\n 'Managing agent',\r\n 'Centre management',\r\n 'Other business'\r\n]\r\n// existing arrestor\r\nexport const EXISTING_ARRESTOR = 'EXISTING_ARRESTOR'\r\nexport const EXISTING_ARRESTOR_BARCODE = 'existing_arrestor_barcode'\r\nexport const EXISTING_ARRESTOR_LOCATION = 'existing_arrestor_location'\r\nexport const EXISTING_ARRESTOR_SIZE = 'existing_arrestor_size'\r\nexport const EXISTING_ARRESTOR_SHARED = 'existing_arrestor_shared'\r\nexport const SHARED_GREASE_ARRESTOR_SERVICING =\r\n 'shared_grease_arrestor_servicing'\r\nexport const PERSONS_RESPONSIBLE_SERVICING_GREASE_ARRESTOR =\r\n 'persons_responsible_servicing_grease_arrestor'\r\n// new arrestor\r\nexport const NEW_ARRESTOR = 'NEW_ARRESTOR'\r\nexport const NEW_ARRESTOR_SIZE = 'new_arrestor_size'\r\nexport const NEW_ARRESTOR_MAKE_MODEL = 'new_arrestor_make_model'\r\nexport const NEW_ARRESTOR_INSTALL_DATE = 'new_arrestor_install_date'\r\nexport const NEW_ARRESTOR_LICENSED_PLUMBER_NAME =\r\n 'new_arrestor_licensed_plumber_name'\r\nexport const NEW_ARRESTOR_LICENSED_PLUMBER_CONTACT =\r\n 'new_arrestor_licensed_plumber_contact'\r\n\r\n// declaration\r\nexport const DECLARATION_NAME = 'declaration_name'\r\nexport const DECLARATION_POSITION = 'declaration_position'\r\nexport const DECLARATION_COMPANY_NAME = 'declaration_company_name'\r\nexport const DECLARATION_PHONE = 'declaration_phone'\r\nexport const DECLARATION_EMAIL = 'declaration_email'\r\nexport const DECLARATION_CONFIRM = 'declaration_confirm'\r\n\r\n// change grease connector\r\nexport const CHANGE_DETAILS = 'change_details'\r\nexport const CHANGE_REQUEST = 'change_request'\r\n\r\n// ROUTES\r\nexport const HOME = '/'\r\nexport const NEW_ARRESTOR_APPLICATION = '/new'\r\nexport const NEW_ARRESTOR_APPLICATION_PROCESS = '/new/process'\r\nexport const CHANGE_EXISTING_ARRESTOR_APPLICATION = '/change'\r\nexport const CHANGE_EXISTING_ARRESTOR_APPLICATION_DETAIL = '/change/detail'\r\nexport const DECLARATION = '/declaration'\r\nexport const CONFIRMATION = '/confirmation'\r\nexport const RECEIPT = '/receipt'\r\n\r\n/**\r\n * Trade waste form end\r\n */\r\n\r\n// errors\r\nexport const DEFAULT_ERROR_MESSAGE = 'Something went wrong. Please, try reloading the page or contact us on 13 13 75.'\r\n// regex\r\nexport const AustralianPhoneRegex =\r\n /^(?:\\+?(61))? ?(?:\\((?=.*\\)))?(0?[2-57-8])\\)? ?(\\d\\d(?:[- ](?=\\d{3})|(?!\\d\\d[- ]?\\d[- ]))\\d\\d[- ]?\\d[- ]?\\d{3})$/\r\n\r\nexport const AnyPhoneRegex = /^[\\d(-?|\\s?)]+$/\r\n\r\nexport const EmailRegex =\r\n /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/\r\n\r\nexport const AbnRegex = /^(\\d *?){11}\\s*$/\r\n\r\nexport const BuildingNumberRegex = /\\d{0,10}/\r\n\r\nexport const PostcodeRegex = /^6[0-9][0-9][0-9]$/\r\n\r\nexport const MONEYREGEX = /^\\$?\\d+(?:\\.\\d{1,2})?$/\r\n\r\n// PASSWORDS\r\nexport const WORDREGEX = /(?=.*[a-z])(?=.*[A-Z])/gm\r\nexport const NUMBERREGEX = /(?=.*[0-9])/gm\r\nexport const SYMBOLREGEX = /(?=.*\\W)/gm\r\nexport const PWORDREGEX = /(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])/gm\r\n\r\n// BSB\r\nexport const BsbRegex = /^\\d{3}(-?|\\s?)\\d{3}$/\r\n\r\n// WC account number\r\nexport const AccountNumberRegex = /^9\\d{9,10}$/\r\n","import { renderToStaticMarkup } from 'react-dom/server'\r\nimport type { SVGProps } from 'react'\r\n\r\nconst sprite = require('../images/icons.svg') as string\r\n\r\ninterface IconInterface extends SVGProps {\r\n id: string\r\n}\r\n\r\nexport const Icon = ({ id, ...props }: IconInterface) => (\r\n \r\n \r\n \r\n)\r\n\r\nexport const makeIconsString = (Element: React.FC) =>\r\n renderToStaticMarkup()\r\n\r\nexport const makeDataUrl = (Element: React.FC) =>\r\n `url(\"data:image/svg+xml,${encodeURIComponent(makeIconsString(Element))}\")`\r\n\r\n\r\nexport default Icon;","import { totalRecordsGTM } from 'pages/PageLoader';\r\n\r\ninterface FormTrackingStoreInterface {\r\n savedStep: string;\r\n expiry: number;\r\n formName: string;\r\n}\r\n\r\ntype DataLayerOptions = {\r\n type: string;\r\n event: 'formStart' | 'formStep' | 'formError' | 'formPartial' | 'formComplete';\r\n name: string;\r\n step: string;\r\n desc?: string;\r\n error: string | null;\r\n value?: number;\r\n records?: string;\r\n}\r\n\r\ntype UpdateDataLayer = Omit & {partialCount?: number; description?: string; errors?: string};\r\n\r\nconst FORM_TRACKING_KEY = \"wc_form_tracking\";\r\n\r\nexport function removeTracking() {\r\n sessionStorage.removeItem(FORM_TRACKING_KEY);\r\n}\r\nexport function getTracking() {\r\n let dataString = sessionStorage.getItem(FORM_TRACKING_KEY);\r\n if (dataString) {\r\n let data = JSON.parse(dataString)\r\n return data\r\n }\r\n}\r\n\r\nexport function dataLayerPush(options: DataLayerOptions) {\r\n const { event, ...rest } = options;\r\n window.dataLayer.push({\r\n event: options.event,\r\n action: {\r\n time: new Date().toISOString(),\r\n ...rest,\r\n },\r\n });\r\n}\r\n\r\nfunction getFormTracking(formName: string): FormTrackingStoreInterface {\r\n let data = getTracking()\r\n if (data?.formName === formName) {\r\n return data\r\n } else {\r\n removeTracking();\r\n }\r\n return { savedStep: \"\", expiry: 0, formName: \"\" }\r\n}\r\n\r\nconst maxTimeGTM = 1200000;\r\n\r\nfunction getStepName(isError: boolean, isPartial: boolean, step: string) {\r\n let extraText = isError ? \" - error\" : (isPartial ? \" - partial\" : \"\")\r\n return `${step}${extraText}`\r\n}\r\nexport function setFormTracking(formName: string, formStep: string) {\r\n let now = new Date()\r\n sessionStorage.setItem(FORM_TRACKING_KEY, JSON.stringify({\r\n formName,\r\n savedStep: formStep,\r\n expiry: now.getTime() + maxTimeGTM,\r\n }));\r\n}\r\n\r\nconst isFresh = (name: string) => {\r\n const { expiry, formName } = getFormTracking(name)\r\n let now = new Date()\r\n let hasExpired = now.getTime() > expiry;\r\n let isNewForm = formName !== name;\r\n return isNewForm || hasExpired;\r\n}\r\n\r\nexport function handleApiError(error: any, fallbackMessage?: string){\r\n let data = getTracking();\r\n dataLayerPush({\r\n event: 'formError',\r\n name: data.formName,\r\n step: data.formStep,\r\n desc: data.description ?? \"\",\r\n value: data.value,\r\n error: `ApiError: ${error?.message ?? fallbackMessage}`,\r\n type: 'form'\r\n })\r\n}\r\n\r\nexport function setFormNameGTM({ name, step, records, type = 'form' }: { name: string; step: string; records?: number; type?: string }) {\r\n if (records) {\r\n totalRecordsGTM.value = records\r\n }\r\n return {\r\n isFormFresh: () => isFresh(name),\r\n setRecords: (total: number) => { totalRecordsGTM.value = total },\r\n updateDataLayer: ({ event, description, errors, partialCount, value = 0.0 }: UpdateDataLayer) => {\r\n const { savedStep } = getFormTracking(name)\r\n let isSameStep = step === savedStep;\r\n let stepError = event === 'formError' && step !== 'complete'\r\n if (isSameStep && !stepError) {\r\n return;\r\n }\r\n const fresh = isFresh(name)\r\n if (fresh) { \r\n dataLayerPush({ event: \"formStart\", name, step: 'start', desc: \"\", value, error: null, type })\r\n }\r\n setFormTracking(name, step)\r\n dataLayerPush({\r\n event,\r\n name,\r\n step: getStepName(event === 'formError', event === 'formPartial', step),\r\n desc: description ?? \"\",\r\n value,\r\n error: errors ?? null,\r\n records: `${event === 'formError' ? 0 : totalRecordsGTM.value - (partialCount ?? 0)}/${totalRecordsGTM.value}`,\r\n type\r\n })\r\n if (event === 'formComplete' || event === 'formPartial' || step === 'complete') {\r\n totalRecordsGTM.value = 1\r\n removeTracking()\r\n }\r\n }\r\n } as const\r\n}","import type {\r\n AcceptedCardCodeUnion,\r\n CardInfoType,\r\n CardDetailsDirectDebitStateInterface\r\n} from 'interfaces'\r\n\r\n/**\r\n *\r\n * @param code - card code from accepted card list\r\n * @returns - card type nice string\r\n */\r\nexport function cardTypeFromCode(code: AcceptedCardCodeUnion) {\r\n if (code === 'AX') {\r\n return 'American express'\r\n }\r\n if (code === 'MC') {\r\n return 'Mastercard'\r\n }\r\n if (code === 'VC') {\r\n return 'Visa'\r\n }\r\n return 'Card unknown'\r\n}\r\n\r\n/**\r\n *\r\n * @param state - state of card details\r\n * @param action - action to take\r\n * @returns - new state of card details\r\n */\r\nexport function creditCardReducer(\r\n state: any,\r\n action: { value: any; id: string }\r\n) {\r\n return { ...state, [action.id]: action.value }\r\n}\r\n// default state for creditCardReducer\r\nexport const creditCardDefaultState: CardDetailsDirectDebitStateInterface = {\r\n validation: {\r\n cardName: { isEmpty: false, isNotValid: false },\r\n cardNumber: { isEmpty: false, isNotValid: false },\r\n cardMonth: { isEmpty: false, isNotValid: false },\r\n cardYear: { isEmpty: false, isNotValid: false },\r\n cardSecurity: { isEmpty: false, isNotValid: false }\r\n },\r\n cardName: '',\r\n cardNumber: '',\r\n cardMonth: '',\r\n cardYear: '',\r\n cardSecurity: '',\r\n disabled: false,\r\n isCardFlipped: false,\r\n prettyNumber: [\r\n '#',\r\n '#',\r\n '#',\r\n '#',\r\n ' ',\r\n '#',\r\n '#',\r\n '#',\r\n ' ',\r\n '#',\r\n '#',\r\n '#',\r\n ' ',\r\n '#',\r\n '#',\r\n '#',\r\n '#',\r\n '#',\r\n '#'\r\n ],\r\n cardInfo: {\r\n niceType: '',\r\n type: '',\r\n patterns: [41111, [44, 47]],\r\n gaps: [4, 8, 12],\r\n lengths: [16],\r\n code: {\r\n name: 'CVV',\r\n size: 3\r\n }\r\n }\r\n}\r\n// list of accepted cards\r\nconst acceptedCards = ['visa', 'mastercard', 'american-express']\r\n/**\r\n *\r\n * @param cardType - type of card\r\n * @returns - true if card is accepted, false if not\r\n */\r\nconst isCardAccepted = (cardType: string) =>\r\n acceptedCards.some((ccType) => ccType === cardType)\r\n/**\r\n *\r\n * @param lengthOfCardNumber - length of card number\r\n * @param lengths - array of lengths to check against\r\n * @returns - true if card number is correct length, false if not\r\n */\r\nconst isCardNumberCorrectLength = (\r\n lengthOfCardNumber: number,\r\n lengths: number[]\r\n) => lengths.some((len) => len === lengthOfCardNumber)\r\n\r\n/**\r\n *\r\n * @param lengthOfCardNumber - length of card number\r\n * @param param1 - type of card, accepted card lengths, gaps\r\n * @returns - true if card number is valid, false if not\r\n */\r\nconst isCardNumberValid = (\r\n lengthOfCardNumber: number,\r\n { type, lengths, gaps }: CardInfoType\r\n) =>\r\n isCardAccepted(type) &&\r\n isCardNumberCorrectLength(lengthOfCardNumber - gaps.length, lengths)\r\nconst isCardYearValid = (year: string) => {\r\n let date = new Date()\r\n let y = date.getFullYear() - 2000\r\n let n = Number(year)\r\n return n >= y\r\n}\r\n\r\n/**\r\n *\r\n * @param month - month of card expiry\r\n * @param year - year of card expiry\r\n * @returns - true if card expiry is valid, false if not\r\n */\r\nconst isCardMonthValid = (month: string, year: string) => {\r\n let date = new Date()\r\n let y = date.getFullYear() - 2000\r\n let n = Number(month)\r\n // if current year, is month equal or greater than current month\r\n if (String(y) === year) {\r\n // date is indexed from 0, so March is 2\r\n let m = date.getMonth()\r\n return n > m\r\n }\r\n return n > 0 && n <= 12\r\n}\r\n// not currently used, but could be used to check if card is expired\r\n// if we decide to upgrade to a signle field card input\r\nconst isCardExpiryValid = (date: string) => {\r\n let my = date?.split('/') ?? []\r\n if (my.length !== 2) {\r\n return false\r\n }\r\n return isCardYearValid(my[1]) && isCardMonthValid(my[0], my[1])\r\n}\r\n\r\ninterface ValidateCardInterface {\r\n cardName: string\r\n cardNumber: string\r\n cardMonth: string\r\n cardYear: string\r\n cardSecurity: string\r\n cardExp: string\r\n cardInfo: CardInfoType\r\n}\r\ninterface ValidationErrorType {\r\n isEmpty: boolean\r\n isNotValid: boolean\r\n}\r\ninterface ValidationCardErrorInterface {\r\n cardName: ValidationErrorType\r\n cardNumber: ValidationErrorType\r\n cardMonth: ValidationErrorType\r\n cardYear: ValidationErrorType\r\n cardSecurity: ValidationErrorType\r\n // cardExp: ValidationErrorType\r\n [key: string]: ValidationErrorType\r\n}\r\ntype ValidateCardType = (\r\n card: ValidateCardInterface\r\n) => void | ValidationCardErrorInterface\r\n/**\r\n *\r\n * @param param0 - card details\r\n * @returns - true if card details are valid, false if not\r\n */\r\nexport const validateCard: ValidateCardType = ({\r\n cardName,\r\n cardNumber,\r\n cardMonth,\r\n cardYear,\r\n cardSecurity,\r\n // cardExp,\r\n cardInfo\r\n}) => {\r\n let validationErrors: ValidationCardErrorInterface = {\r\n cardName: {\r\n isEmpty: cardName?.length <= 0,\r\n isNotValid: cardName?.length <= 0\r\n },\r\n cardNumber: {\r\n isEmpty: cardNumber?.length <= 0,\r\n isNotValid: !isCardNumberValid(cardNumber?.length, cardInfo)\r\n },\r\n cardMonth: {\r\n isEmpty: cardMonth?.length <= 0,\r\n isNotValid: !isCardMonthValid(cardMonth, cardYear)\r\n },\r\n cardYear: {\r\n isEmpty: cardYear?.length <= 0,\r\n isNotValid: !isCardYearValid(cardYear)\r\n },\r\n cardSecurity: {\r\n isEmpty: cardSecurity?.length <= 0,\r\n isNotValid: cardInfo.code.size !== cardSecurity?.length\r\n }\r\n // cardExp: {\r\n // isEmpty: cardExp?.length <= 0,\r\n // isNotValid: !isCardExpiryValid(cardExp)\r\n // }\r\n }\r\n let keys = Object.keys(validationErrors)\r\n let isValid = keys.reduce(\r\n (isValid, key) =>\r\n isValid &&\r\n !validationErrors[key].isEmpty &&\r\n !validationErrors[key].isNotValid,\r\n true\r\n )\r\n if (!isValid) {\r\n return validationErrors\r\n }\r\n}\r\n","/**\r\n *\r\n * @param number - number of data entries to create for victory charts\r\n * @returns\r\n */\r\nexport const createDataEntries = (\r\n number: number\r\n): { x: number; y: number; uom: string }[] =>\r\n Array.apply(null, Array(number))\r\n .fill(0)\r\n .map((_, i) => ({ x: i, y: 0, uom: 'L' }))\r\n\r\n/**\r\n *\r\n * @param buffer - buffer to create data entries from\r\n * @returns - data entries created from buffer\r\n */\r\nexport function arrayBufferToBase64(buffer: ArrayBuffer) {\r\n let binary = ''\r\n let bytes = new Uint8Array(buffer)\r\n let len = bytes.byteLength\r\n for (let i = 0; i < len; i++) {\r\n binary += String.fromCharCode(bytes[i])\r\n }\r\n return window.btoa(binary)\r\n}\r\n/**\r\n *\r\n * @param a - array to compare data entries from\r\n * @param b - array to compare data entries from\r\n * @returns - boolean indicating if arrays are equal\r\n */\r\nexport const compareArrays = (a: unknown[], b: unknown[]): boolean => {\r\n return a.length === b.length && a.every((element) => b.includes(element))\r\n}\r\n\r\n/**\r\n *\r\n * @param coll - array to search for element in\r\n * @param el - element to search for in array\r\n * @returns - boolean indicating if element is in array\r\n * 1. coll is a readonly array of type T\r\n * 2. el is a type U\r\n * 3. T is a subtype of U\r\n * 4. coll.includes(el as T) is a type of boolean\r\n *\r\n */\r\nexport function includes(\r\n coll: ReadonlyArray,\r\n el: U\r\n): el is T {\r\n return coll.includes(el as T)\r\n}\r\n\r\n/**\r\n *\r\n * @param uniqueKey - key to use to find unique elements in array\r\n * @param objects - array of objects to find unique elements in\r\n * @returns - array of unique elements\r\n */\r\nexport const uniqueBy = (uniqueKey: string, objects: T[]): T[] => {\r\n const ids = objects.map((object) => object[uniqueKey])\r\n return objects.filter(\r\n (object, index) => !ids.includes(object[uniqueKey], index + 1)\r\n )\r\n}\r\n","export interface WebWorkerFetchInterface {\r\n url: string\r\n options?: Record\r\n type?: 'json' | 'blob'\r\n}\r\n\r\n/**\r\n *\r\n * @param param0 - object containing url and options for fetch\r\n * @returns - promise containing response from fetch in WebWorkerFetchInterface format\r\n */\r\nexport async function asyncFetch({\r\n url,\r\n options,\r\n type\r\n}: WebWorkerFetchInterface) {\r\n try {\r\n const response = await fetch(url, options)\r\n if (response.ok && response.status !== 404) {\r\n const data =\r\n type === 'blob' ? await response.blob() : await response.json()\r\n if (!data) {\r\n return {\r\n statusCode: response.status,\r\n error: 'no data returned from server',\r\n loading: false,\r\n data: {}\r\n }\r\n }\r\n return {\r\n statusCode: response.status,\r\n error: void 0,\r\n loading: false,\r\n data\r\n }\r\n } else {\r\n return {\r\n statusCode: response.status,\r\n error: 'not found',\r\n loading: false,\r\n data: {}\r\n }\r\n }\r\n } catch (error: any) {\r\n return {\r\n statusCode: 500,\r\n error: error?.message || 'no response from server',\r\n loading: false,\r\n data: {}\r\n }\r\n }\r\n}\r\n\r\nexport async function asyncDelete({ url, options }: WebWorkerFetchInterface) {\r\n const response = await fetch(url, options)\r\n if (response.ok) {\r\n return response.ok\r\n } else {\r\n throw new Error(response.statusText)\r\n }\r\n}\r\nconst STATUS_CODE = {\r\n 'not authorized': 403,\r\n 'no data returned from server': 500,\r\n 'not found': 404\r\n}\r\nexport async function asyncFetchAll(urls: string[]) {\r\n let allData = Promise.all(urls.map((url) => fetch(url)))\r\n .then((responses) =>\r\n Promise.all(\r\n responses.map(async (res) => {\r\n if (res.status === 403) {\r\n throw new Error('not authorized')\r\n }\r\n if (res.ok && res.status !== 404) {\r\n const data = await res.json()\r\n if (data) {\r\n return data\r\n } else {\r\n throw new Error('no data returned from server')\r\n }\r\n }\r\n throw new Error('not found')\r\n })\r\n )\r\n )\r\n .then((data) => data)\r\n .catch((error) => [\r\n {\r\n data: void 0,\r\n error: error?.message,\r\n loading: false,\r\n statusCode: STATUS_CODE[error.message] || 500\r\n }\r\n ])\r\n return allData\r\n}\r\n\r\nexport function suspensify(promise: Promise) {\r\n let status = 'pending'\r\n\r\n // 1. Keep track of the Promise's state?. The `status`\r\n // variable will update as the Promise moves from\r\n // pending to success or error.\r\n let result\r\n let suspender = promise.then(\r\n (res) => {\r\n // On success, update the status to \"success\"\r\n status = 'success'\r\n result = res\r\n },\r\n (error) => {\r\n // On error, update the status to \"error\"\r\n status = 'error'\r\n result = error\r\n }\r\n )\r\n\r\n // 2. Return an object with a `read()` method that does one\r\n // of the following:\r\n //\r\n // a) Returns the Promise's resolved value if it's resolved.\r\n // b) Sends a signal to a Suspense Boundary if the Promise is pending.\r\n // c) Sends a signal to an Error Boundary if the Promise failed.\r\n return {\r\n read() {\r\n if (status === 'pending') {\r\n // Pending promises are thrown and caught by .\r\n // FYI: Anything can be thrown in JavaScript, not just Errors.\r\n throw suspender\r\n } else if (status === 'error') {\r\n // Errors are thrown too, but are caught by an Error Boundary.\r\n throw result\r\n } else if (status === 'success') {\r\n // Finally, the Promise result is returned once it's resolved.\r\n return result\r\n }\r\n }\r\n }\r\n}\r\n\r\ntype CreatePostFn = (url: string, body: Record) => \r\n () => Promise;\r\n\r\nexport const createPostFn: CreatePostFn = (url, body) => async () => {\r\n try {\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json;charset=utf-8'\r\n },\r\n mode: 'same-origin',\r\n credentials: 'same-origin',\r\n body: JSON.stringify(body)\r\n });\r\n \r\n if (!response.ok) {\r\n throw new Error(`Response status: ${response.status}`);\r\n }\r\n \r\n const data = await response.json();\r\n return data as T;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\ntype CreateGetFn = (url: string) => \r\n () => Promise;\r\n\r\nexport const createGetFn: CreateGetFn = (url) => async () => {\r\n try {\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: {\r\n 'Content-Type': 'application/json;charset=utf-8'\r\n },\r\n mode: 'same-origin',\r\n credentials: 'same-origin',\r\n });\r\n \r\n if (!response.ok) {\r\n throw new Error(`Response status: ${response.status}`);\r\n }\r\n \r\n const data = await response.json();\r\n return data as T;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};","import type { PointsType } from 'interfaces'\r\n\r\n/**\r\n *\r\n * @param index - index of point to get\r\n * @returns - symbol for point at index\r\n */\r\nexport const getSymbol = (index: number) => {\r\n if (index === 1) {\r\n return 'diamond'\r\n }\r\n if (index === 2) {\r\n return 'plus'\r\n }\r\n if (index === 3) {\r\n return 'triangleDown'\r\n }\r\n if (index === 4) {\r\n return 'star'\r\n }\r\n if (index === 5) {\r\n return 'square'\r\n }\r\n if (index === 6) {\r\n return 'triangleUp'\r\n }\r\n if (index === 7) {\r\n return 'minus'\r\n }\r\n\r\n return 'circle'\r\n}\r\n\r\n// return amount of bars for the graph depending on size\r\nexport const getBars = (width: number): number => {\r\n if (width < 360) {\r\n return 1\r\n }\r\n if (width < 500) {\r\n return 2\r\n }\r\n if (width < 650) {\r\n return 3\r\n }\r\n return 4\r\n}\r\n// an array of colors to use for the graph\r\nexport const colorArray: string[] = [\r\n '#00A698',\r\n '#EE0297',\r\n '#A20017',\r\n '#407629',\r\n '#006BA6',\r\n '#DC7C3D',\r\n '#333333',\r\n '#752F8A'\r\n]\r\n\r\n/**\r\n *\r\n * @param unit - unit to convert to\r\n * @returns - conversion factor for unit\r\n */\r\nexport const yTickFormatter =\r\n (unit: string) =>\r\n (x: number): string => {\r\n if (String(x).indexOf('e') !== -1) {\r\n return ''\r\n }\r\n let num = Math.round(x * 100) / 100\r\n return `${num} ${unit}`\r\n }\r\n\r\n/**\r\n *\r\n * @param x - x value to convert to\r\n * @returns - conversion factor for x value\r\n */\r\n\r\nexport const reducePoints = (x: PointsType): PointsType => {\r\n const MAX_POINTS = 120\r\n let len = x.length\r\n if (len > MAX_POINTS) {\r\n const k = Math.ceil(x.length / MAX_POINTS)\r\n return x.filter((_, i) => i % k === 0 || i === len - 1)\r\n }\r\n return x\r\n}\r\n","export function emailChecker(input: string) {\r\n const emailRegex = new RegExp(/^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,3}$/);\r\n return emailRegex.test(input);\r\n}\r\n\r\nexport function couldbeMobileAttempt(num: string) {\r\n const mobileRegex = new RegExp(/^(\\+?61|0061)?(0?4\\d+)$/);\r\n const number = removePhoneNumberExtras(num)\r\n return mobileRegex.test(number)\r\n}\r\n\r\nexport function ausMobileChecker(num: string) {\r\n const mobileRegex = new RegExp(/^(\\+?61|0061)?(0?4\\d{8})$/);\r\n const replace = new RegExp(/\\s|\\-|\\(|\\)/gm)\r\n return mobileRegex.test(num.replaceAll(replace, \"\"));\r\n}\r\n\r\nexport function removePhoneNumberExtras(num: string) {\r\n const replace = new RegExp(/[^\\d+]/gm)\r\n return num.replaceAll(replace, \"\")\r\n}\r\n\r\nexport function perfectMobile(num: string) {\r\n let almostPerfect = removePhoneNumberExtras(num)\r\n return \"+61\" + almostPerfect.slice(almostPerfect.indexOf(\"4\"))\r\n}\r\n\r\n\r\nexport function allCases(str: string) {\r\n const\r\n upper = /[A-Z]/.test(str),\r\n lower = /[a-z]/.test(str);\r\n\r\n return upper && lower;\r\n}\r\nexport function hasNumber(myString: string) {\r\n return /\\d/.test(myString);\r\n}","import {\r\n TWENTY_EIGHT_DAYS,\r\n ONE_DAY,\r\n LONG_MONTHS,\r\n SEASONS,\r\n WATER_MONTHS\r\n} from '../../constant'\r\n\r\nexport type dateOrString = Date | string\r\nexport type DateRangeType = {\r\n from: dateOrString\r\n to: dateOrString\r\n}\r\n\r\n/**\r\n *\r\n * @param num - number of x value\r\n * @returns string respresentation of season\r\n */\r\nexport const getSeasonForX = (num: number): string => {\r\n switch (num) {\r\n case 2:\r\n return 'Summer'\r\n case 5:\r\n return 'Autumn'\r\n case 8:\r\n return 'Winter'\r\n case 11:\r\n return 'Spring'\r\n default:\r\n return ''\r\n }\r\n}\r\n/**\r\n *\r\n * @param someDate - date to check\r\n * @returns - checks if the date is today\r\n */\r\nexport const isToday = (someDate: dateOrString): boolean => {\r\n const today = new Date()\r\n const compare = new Date(someDate)\r\n return (\r\n compare.getDate() === today.getDate() &&\r\n compare.getMonth() === today.getMonth() &&\r\n compare.getFullYear() === today.getFullYear()\r\n )\r\n}\r\n\r\n/**\r\n *\r\n * @param day - day of the week as a number\r\n * @returns the long string version of the day\r\n */\r\nexport const getDayString = (day: number): string => {\r\n return [\r\n 'Monday',\r\n 'Tuesday',\r\n 'Wednesday',\r\n 'Thursday',\r\n 'Friday',\r\n 'Saturday',\r\n 'Sunday'\r\n ][day]\r\n}\r\n\r\n/**\r\n *\r\n * @param date - date to check in date string format\r\n * @returns the weekday in the long format\r\n */\r\nexport const getDayStringFromDate = (date: dateOrString): string => {\r\n let day = new Date(date).toLocaleDateString('en-AU', { weekday: 'long' })\r\n return day\r\n}\r\n\r\n/**\r\n *\r\n * @param date - date to check in date string format\r\n * @returns the first day of the month as a number\r\n */\r\nexport const getFirstDay = (date: dateOrString): number => {\r\n let d = new Date(date)\r\n let day = d.getDay()\r\n return d.getDate() - day + (day === 0 ? -6 : 1)\r\n}\r\n\r\n/**\r\n *\r\n * @param date - date to check in date string format\r\n * @returns the last day of the month as a number\r\n */\r\nexport const getLastDay = (date: dateOrString): number => getFirstDay(date) + 6\r\n\r\n// sets the time to midnight\r\nexport const getStartOfDay = (date: dateOrString): Date =>\r\n new Date(new Date(date).setHours(0, 0, 0, 0))\r\n// sets the time to 11:59:59\r\nexport const getEndOfDay = (date: dateOrString): Date =>\r\n new Date(new Date(date).setHours(23, 59, 59, 999))\r\n// returns the previous day\r\nexport const getPreviousDay = (date: dateOrString): Date =>\r\n getStartOfDay(new Date(getStartOfDay(date).getTime() - 1))\r\n// returns the enxt day\r\nexport const getNextDay = (date: dateOrString): Date =>\r\n new Date(getEndOfDay(date).getTime() + 1)\r\n// returns the date of the Monday of the week of the date, with the time set to midnight\r\nexport function getMondayStartOfWeek(date: dateOrString): Date {\r\n let monday = new Date(new Date(date).setDate(getFirstDay(date)))\r\n return getStartOfDay(monday)\r\n}\r\n// returns the date of the Sunday of the week of the date, with the time set to 11:59:59\r\nexport function getSundayEndOfWeek(date: dateOrString): Date {\r\n let sunday = new Date(new Date(date).setDate(getLastDay(date)))\r\n return getEndOfDay(sunday)\r\n}\r\n\r\n/**\r\n *\r\n * @param d - date to check in date string format\r\n * @returns - date in the format of yyyy-month-days hh:mm (e.g. 2022-08-30 02:19)\r\n */\r\nexport const getSimpleDateTimeString = (d: string | Date): string => {\r\n let date = new Date(d)\r\n let year = date.getFullYear()\r\n let month = date.getMonth() + 1\r\n let day = date.getDate()\r\n let hour = date.getHours()\r\n let minutes = date.getMinutes()\r\n return `${year}-${month < 10 ? `0${month}` : month}-${day < 10 ? `0${day}` : day\r\n } ${hour < 10 ? `0${hour}` : hour}:${minutes < 10 ? `0${minutes}` : minutes}`\r\n}\r\n\r\n// returns 1 week previous\r\nexport const getLastWeek = (d: dateOrString): Date =>\r\n new Date(new Date(d).getTime() - 604800000)\r\n// returns 1 week in the future\r\nexport const getNextWeek = (d: dateOrString): Date =>\r\n new Date(new Date(d).getTime() + 604800000)\r\n// checks if 2 dates are on the same day\r\nexport const datesAreOnSameDay = (first: Date, second: Date): boolean =>\r\n first.getFullYear() === second.getFullYear() &&\r\n first.getMonth() === second.getMonth() &&\r\n first.getDate() === second.getDate()\r\n// returns an object containing the start and end of the day for the provided date or date string\r\nexport const getDayRange = (date: dateOrString): DateRangeType => {\r\n return {\r\n from: getStartOfDay(date),\r\n to: getEndOfDay(date)\r\n }\r\n}\r\n// returns an object containing the start and end of the week for the provided date or date string\r\nexport const getWeekRange = (date: dateOrString): DateRangeType => ({\r\n from: getMondayStartOfWeek(date),\r\n to: getSundayEndOfWeek(date)\r\n})\r\n// returns the season range for the provided date or date string\r\nexport const getSeasonalRange = (date: dateOrString): DateRangeType => {\r\n let d = new Date(date)\r\n const month = d.getMonth()\r\n const startSummer = new Date(\r\n `12/01/${month === 11 ? d.getUTCFullYear() : d.getUTCFullYear() - 1}`\r\n )\r\n const endSpring = new Date(\r\n new Date(\r\n `12/01/${month === 11 ? d.getUTCFullYear() + 1 : d.getUTCFullYear()}`\r\n ).getTime() - 1\r\n )\r\n return {\r\n from: startSummer,\r\n to: endSpring\r\n }\r\n}\r\n\r\nexport const getWeekHighlightDates = (date: dateOrString): Array => {\r\n const startOfWeek = getMondayStartOfWeek(new Date(date))\r\n let dates: Array = []\r\n for (let i = 0; i < 7; i++) {\r\n let newDate = new Date(startOfWeek)\r\n newDate.setDate(startOfWeek.getDate() + i)\r\n newDate && dates.push(newDate)\r\n }\r\n return dates\r\n}\r\n// chart specific switch to get ranges for x axis values\r\nexport const getDateRange = (type: string, d: dateOrString): DateRangeType => {\r\n switch (type) {\r\n case 'hourly':\r\n return getDayRange(d)\r\n case 'weekly':\r\n return getWeekRange(d)\r\n case 'seasonal':\r\n return getSeasonalRange(d)\r\n default:\r\n return getDayRange(d)\r\n }\r\n}\r\n\r\n// check postcode included in ban via API\r\nexport type DaysType = {\r\n Mon: boolean\r\n Tue: boolean\r\n Wed: boolean\r\n Thu: boolean\r\n Fri: boolean\r\n Sat: boolean\r\n Sun: boolean\r\n}\r\n\r\n// milliseconds to object containing hours and days\r\nexport const msToTime = (duration: number): { hours: number; days: number } => {\r\n let hours = Math.floor((duration / (1000 * 60 * 60)) % 24)\r\n let days = Math.floor(duration / (1000 * 60 * 60 * 24))\r\n return { hours, days }\r\n}\r\n\r\n// gets the long or short version of the month from the provided month number\r\nexport const getMonth = (\r\n monthNumber: number,\r\n long: boolean = false\r\n): string => {\r\n if (typeof monthNumber === 'number' && monthNumber > 0 && monthNumber < 13) {\r\n let lm = JSON.parse(LONG_MONTHS)\r\n let m = lm[monthNumber]\r\n return long ? m : m.slice(0, 3)\r\n }\r\n return \"\"\r\n}\r\n// gets the long or short version of the water month from the provided month number\r\nexport const getWaterMonth = (\r\n monthNumber: number,\r\n long: boolean = false\r\n): string => {\r\n if (typeof monthNumber === 'number' && monthNumber > 0 && monthNumber < 13) {\r\n let wm = JSON.parse(WATER_MONTHS)\r\n return long ? wm[monthNumber] : wm[monthNumber].slice(0, 3)\r\n }\r\n return \"\"\r\n}\r\n// returns the season in string format\r\nexport const getSeason = (n: number): string => SEASONS[String(n)]\r\n\r\n// converts 24hr time to 12hr time\r\nexport const time24To12 = (str: string): string => {\r\n if (str) {\r\n if (str.length === 3) {\r\n str = `0${str}`\r\n }\r\n let hrs = Number(str.slice(0, 2))\r\n let mins = str.slice(2, 4)\r\n\r\n if (!hrs) {\r\n return `12:${mins}am`\r\n }\r\n if (hrs === 12) {\r\n return `12:${mins}pm`\r\n }\r\n if (hrs < 12) {\r\n return `${hrs}:${mins}am`\r\n } else {\r\n return `${hrs - 12}:${mins}pm`\r\n }\r\n }\r\n\r\n return str\r\n}\r\n// checks if the time is a valid 24hr time value\r\nexport const isValid24hrTime = (time: string) => {\r\n if (time.length !== 4) {\r\n return false\r\n }\r\n let hrs = Number(time.slice(0, 2))\r\n let mins = Number(time.slice(2, 4))\r\n if (hrs > 23 || hrs < 0 || mins > 59 || mins < 0) {\r\n return false\r\n }\r\n return true\r\n}\r\n// returns the epoch for a provided date or date string\r\nexport const getEpoch = (date: dateOrString): number => new Date(date).getTime()\r\n\r\n// returns a boolean indicating if the provided time is safe to increment by 1hr\r\nexport const iSafeHourIncrement = (time: string) =>\r\n Number(time) < 13 && Number(time) >= 0\r\n// returns a boolean indicating if the provided time is safe to increment by 1min\r\nexport const iSafeMinuteIncrement = (time: string) =>\r\n Number(time) < 60 && Number(time) >= 0\r\n\r\n// takes a date or date string or epoch number and returns a string of the date in the format dd/mm/yyyy\r\nexport const simpleDateRenderer = (value: string | number) => {\r\n let formattedDate = value\r\n ? new Date(value).toLocaleDateString('en-AU', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: '2-digit'\r\n })\r\n : ''\r\n return formattedDate\r\n}\r\n// returns the {min, max} range for the due dates of the provided date\r\nexport const getDueDateRange = (date: Date) => {\r\n const wrappedDate = new Date(date)\r\n const TODAY_MS = new Date().getTime()\r\n let tomorrow = new Date(TODAY_MS + ONE_DAY)\r\n let currentTime = wrappedDate.getTime()\r\n let min =\r\n currentTime > TODAY_MS\r\n ? new Date(wrappedDate.getTime() + ONE_DAY)\r\n : tomorrow\r\n let perferredMax = new Date(currentTime + TWENTY_EIGHT_DAYS)\r\n let max =\r\n perferredMax.getTime() > tomorrow.getTime() ? perferredMax : tomorrow\r\n return { min, max }\r\n}\r\n// returns the count of days in a given month in a given year\r\nexport const howManyDaysInMonth = (year: number, month: number) =>\r\n new Date(year, month, 0).getDate()\r\n","import dompurify from 'dompurify'\r\nimport type { ChangeEvent, RefObject } from 'react'\r\n/**\r\n *\r\n * @param x - x value of the point\r\n * @param y - y value of the point\r\n * scrolls to the point on the page\r\n * if no params are provided it scrolls to the top of the page\r\n */\r\nexport function scrollToTop(x: number = 0, y: number = 0) {\r\n window.scrollTo(x, y)\r\n}\r\n\r\n/**\r\n *\r\n * @param ref - ref to the element to scroll to\r\n * scrolls to the element on the page\r\n */\r\nexport const scrollToRef = (\r\n ref: RefObject\r\n) => ref.current?.scrollIntoView({ behavior: 'smooth' })\r\n\r\n// debouces a function for an input element\r\nexport const debounce = ) => any>(\r\n func: F,\r\n waitFor: number\r\n) => {\r\n let timeout: number = 0\r\n const debounced = (e: ChangeEvent) => {\r\n e.persist()\r\n clearTimeout(timeout)\r\n setTimeout(() => func(e), waitFor)\r\n }\r\n return debounced\r\n}\r\n\r\n/**\r\n *\r\n * @param htmlString - html string to sanitize\r\n * @returns - sanitized html string ready to be rendered with dangerouslySetInnerHTML\r\n */\r\nexport const sanitizeHtmlString = (htmlString: string) => {\r\n let sane = dompurify.sanitize(htmlString, {\r\n USE_PROFILES: { html: true, svg: true }\r\n })\r\n return { __html: sane }\r\n}\r\n\r\n// these helpers are currently unused\r\ntype DispatchType = (obj: Record) => void\r\nexport let createChangeHandler =\r\n (dispatch: DispatchType) =>\r\n (e: React.FormEvent): void => {\r\n let value = e.currentTarget.value\r\n let id = e.currentTarget.id\r\n let name = e.currentTarget.name\r\n dispatch({ type: name, payload: { id, value } })\r\n dispatch({ type: 'COMPLETE' })\r\n }\r\n\r\nexport let createSelectHandler =\r\n (dispatch: DispatchType) => (event: React.ChangeEvent) => {\r\n let type = event.currentTarget.name\r\n let value = event.currentTarget.value\r\n dispatch({ type, payload: { value } })\r\n dispatch({ type: 'COMPLETE' })\r\n }\r\n\r\n\r\n export function submitParentForm(event) {\r\n const form = event.target.closest('form');\r\n if (form) {\r\n form.submit()\r\n } else {\r\n console.log('No parent form found');\r\n }\r\n }","// checks if a number is an integer/ whole number\r\nexport function isInteger(n: number): boolean {\r\n return n % 1 === 0\r\n}\r\n\r\n/**\r\n *\r\n * @param num - number to covert to a string\r\n * @returns - number as a string with commas, decimal places and a dollar sign. Also includes minus if negative\r\n */\r\nexport const convertToMoney = (num: number): string => {\r\n let round = Math.round(num * 100) / 100\r\n let minus = num < 0\r\n let moneyArray = round.toString().split('.')\r\n let d = minus ? moneyArray[0].slice(1) : moneyArray[0]\r\n let dollars = d\r\n .split('')\r\n .reverse()\r\n .map((str, i) => (i !== 0 && i % 3 === 0 ? `${str},` : str))\r\n .reverse()\r\n .join('')\r\n return `${minus ? '-' : ''}$${dollars}.${\r\n moneyArray[1]\r\n ? moneyArray[1].length === 2\r\n ? moneyArray[1]\r\n : `${String(moneyArray[1])}0`\r\n : '00'\r\n }`\r\n}\r\n\r\n// checks if the value is undefined\r\nexport const isUndefined = (value: string | number): boolean =>\r\n value === undefined || value === null || value === void 0\r\n\r\n// removes the NaN value from a number string\r\nexport function removeNaN(numberString: string): number {\r\n return Number(numberString.replaceAll(/\\D/g, ''))\r\n}\r\n// number comparitor function\r\nexport function compareNumberString(first: string, second: string): number {\r\n let a = removeNaN(first)\r\n let b = removeNaN(second)\r\n if (a > b) {\r\n return -1\r\n }\r\n if (a < b) {\r\n return 1\r\n }\r\n return 0\r\n}\r\n\r\n// returns 1st 2nd 3rd\r\nexport const nth = function (d: number): string {\r\n if (d > 3 && d < 21) return `${d}th`\r\n switch (d % 10) {\r\n case 1:\r\n return `${d}st`\r\n case 2:\r\n return `${d}nd`\r\n case 3:\r\n return `${d}rd`\r\n default:\r\n return `${d}th`\r\n }\r\n}\r\n","// for use with water use table, returns the number of bars to display for a given width\r\nexport const getWaterUseBars = (width: number) => {\r\n if (width) {\r\n let barWidth = 34\r\n let gap = 50\r\n let dp = 50\r\n let lp = 70\r\n let rp = 10\r\n let available_space = width - (lp + rp + dp + dp)\r\n let bars = Math.floor((available_space + gap) / (barWidth + gap))\r\n return bars\r\n } else {\r\n return 12\r\n }\r\n}\r\n// for use with water use table, returns the number of bars to display for a given width\r\nexport const getWaterUseMonthlyBars = (width: number) => {\r\n if (width > 720) {\r\n return 5\r\n }\r\n if (width > 640) {\r\n return 4\r\n }\r\n if (width > 500) {\r\n return 3\r\n }\r\n return 2\r\n}\r\n\r\n/**\r\n *\r\n * @param abn - abn to check\r\n * @returns - true if valid abn\r\n */\r\nexport function isABNValid(abn: string | number): boolean {\r\n if (!abn) {\r\n return false\r\n }\r\n let stringValue = String(abn).replaceAll(' ', '')\r\n let weights: number[] = [10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19]\r\n stringValue.replace(' ', '')\r\n if (stringValue.length !== 11) {\r\n return false\r\n }\r\n let sum: number = 0\r\n for (let i = 0; i < weights.length; i++) {\r\n let digit: number = parseInt(stringValue[i]) - (i === 0 ? 1 : 0)\r\n sum += digit * weights[i]\r\n }\r\n return sum % 89 === 0\r\n}\r\n\r\n/**\r\n *\r\n * @param acn - acn to check\r\n * @returns - true if valid acn\r\n */\r\nexport const isACNValid = (acn: string | number): boolean => {\r\n let textAcn = String(acn).replaceAll(' ', '')\r\n let cypherText = textAcn.slice(0, -1)\r\n let check = Number(textAcn.slice(-1))\r\n let summed = cypherText\r\n .split('')\r\n .reduce((sum, n, i) => sum + Number(n) * (8 - i), 0)\r\n let remainder = summed % 10\r\n let complement = 10 - remainder === 10 ? 0 : 10 - remainder\r\n return complement === check\r\n}\r\n\r\n/**\r\n *\r\n * @param value - value to check whether it is a valid abn or acn\r\n * @returns \"Abn\" if valid abn or \"Acn\" if valid acn\r\n */\r\nexport const isValidAbnOrAcn = (\r\n value: string | number\r\n): 'Abn' | 'Acn' | void => {\r\n let isAbn = isABNValid(value)\r\n let isAcn = isACNValid(value)\r\n if (isAbn) {\r\n return 'Abn'\r\n }\r\n if (isAcn) {\r\n return 'Acn'\r\n }\r\n}\r\n\r\n// converts a string to kebab case\r\nexport const kebabCase = (str) =>\r\n str\r\n .match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g)\r\n .join('-')\r\n .toLowerCase()\r\n","export type dateOrString = Date | string\r\n// set sessionstorage\r\nexport const Set = (key: string, value: any, expiry?: dateOrString): void => {\r\n if (typeof sessionStorage !== 'undefined') {\r\n if (!expiry) {\r\n expiry = new Date()\r\n expiry.setTime(expiry.getTime() + 4 * 60 * 60 * 1000) // in 4 hours\r\n }\r\n\r\n sessionStorage.setItem(`${key}_Expiry`, expiry.toString())\r\n sessionStorage.setItem(key, value)\r\n }\r\n}\r\n// get sessionstorage\r\nexport const Get = (key: string): any => {\r\n if (typeof sessionStorage !== 'undefined') {\r\n let cacheItem = sessionStorage.getItem(key)\r\n if (!cacheItem) {\r\n return null\r\n }\r\n let x = sessionStorage.getItem(`${key}_Expiry`)\r\n let expiry = x ? new Date(x) : new Date()\r\n let now = new Date()\r\n\r\n if (expiry.getTime() < now.getTime()) {\r\n sessionStorage.removeItem(`${key}_Expiry`)\r\n sessionStorage.removeItem(key)\r\n return null\r\n }\r\n\r\n return cacheItem\r\n }\r\n return null\r\n}\r\n\r\n// work with cookies\r\nexport function get_cookie(name: string) {\r\n let cookies = document.cookie.split(';')\r\n for (let i = 0; i < cookies.length; ++i) {\r\n let pair = cookies[i].trim().split('=')\r\n if (pair[0] === name) {\r\n return decodeURI(pair[1])\r\n }\r\n }\r\n return null\r\n}\r\nexport function set_cookie(\r\n name: string,\r\n value: string,\r\n options = 'SameSite=Lax'\r\n) {\r\n document.cookie = `${name}=${value};${options}`\r\n}\r\nexport function delete_cookie(name: string, options = 'SameSite=Lax') {\r\n document.cookie = `${name}=;${options};Expires=Thu, 01 Jan 1970 00:00:01 GMT;`\r\n}\r\n","// returns string of numbers from a string\r\nexport const removeNoneNumbers = (value: string): string =>\r\n value.replace(/[^0-9 ]/g, '')\r\n\r\n// returns string with whitespace removed\r\nexport const removeWhitespace = (value: string): string =>\r\n value.replace(/\\s/g, '')\r\n// returns a string with the insertStr inserted at the index of pos in str\r\nexport const insertAt = (str: string, insertStr: string, pos: number): string =>\r\n `${str.slice(0, pos)}${insertStr}${str.slice(pos)}`\r\n// returns a string with newStr replacing the char at pos in str\r\nexport const replaceAt = (str: string, newStr: string, pos: number): string =>\r\n str.replace(/./g, (c, i) => (i === pos ? newStr : c))\r\n","import { type ClassValue, clsx } from \"clsx\"\r\nimport { twMerge } from \"tailwind-merge\"\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs))\r\n}\r\n\r\nexport type cardClassType =\r\n | 'wc-card--green'\r\n | 'wc-card--red'\r\n | 'wc-card--darkblue'\r\n// returns class mapping for card type\r\nexport function getCardClassname(cardClass: cardClassType): string {\r\n switch (cardClass) {\r\n case 'wc-card--red':\r\n return 'h5 text-validation-red'\r\n case 'wc-card--green':\r\n return 'h5 text-validation-green'\r\n default:\r\n return 'h5 text-corporate-blue-6'\r\n }\r\n}\r\n// returns string of classnames\r\nexport function classNames(...classes: unknown[]): string {\r\n return classes.filter(Boolean).join(' ')\r\n}\r\n","import { useState } from \"react\";\r\n\r\n// Constants for UUID generation\r\nconst UUID_LENGTH = 36;\r\nconst DASH_POSITIONS = [8, 13, 18, 23];\r\nconst CHARS = {\r\n numeric: '0123456789',\r\n lowercase: 'abcdef'\r\n};\r\n\r\n/**\r\n * Generates a UUID v4-like string\r\n * @returns {string} A UUID string in the format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\r\n */\r\nfunction generateUUID() {\r\n // Pre-compute the combined character set for better performance\r\n const allChars = CHARS.numeric + CHARS.lowercase;\r\n const charLength = allChars.length;\r\n \r\n // Use typed array for better performance\r\n const uuid = new Array(UUID_LENGTH);\r\n \r\n // Use crypto API for better randomness if available\r\n const getRandomIndex = () => {\r\n if (window.crypto && window.crypto.getRandomValues) {\r\n const rand = new Uint8Array(1);\r\n window.crypto.getRandomValues(rand);\r\n return rand[0] % charLength;\r\n }\r\n return Math.floor(Math.random() * charLength);\r\n };\r\n\r\n // Generate UUID\r\n for (let i = 0; i < UUID_LENGTH; i++) {\r\n if (DASH_POSITIONS.includes(i)) {\r\n uuid[i] = '-';\r\n } else {\r\n uuid[i] = allChars[getRandomIndex()];\r\n }\r\n }\r\n\r\n // Version 4 UUID modifications\r\n uuid[14] = '4'; // Version 4\r\n uuid[19] = allChars[(parseInt(allChars[getRandomIndex()], 16) & 0x3) | 0x8]; // Variant bits\r\n\r\n return uuid.join('');\r\n}\r\n\r\n/**\r\n * Validates a UUID string\r\n * @param {string} uuid - The UUID string to validate\r\n * @returns {boolean} True if the UUID is valid\r\n */\r\nfunction isValidUUID(uuid: string) {\r\n const regex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\r\n return regex.test(uuid);\r\n}\r\n\r\n// React hook for UUID generation\r\nfunction useUUID() {\r\n const [uuid] = useState(() => generateUUID());\r\n return uuid;\r\n}\r\n\r\nexport { generateUUID, isValidUUID, useUUID };"],"names":["OPACITY_VARIANTS","ONE_DAY","TWENTY_EIGHT_DAYS","LONG_MONTHS","WATER_MONTHS","SEASONS","RADIO_KEYCODE","RADIO_KEY","WATER_TARGETS_TIMEFRAME","DAYS","TIMES","BACK","SUBMIT","DEFAULT_ERROR_MESSAGE","AnyPhoneRegex","EmailRegex","AbnRegex","BuildingNumberRegex","PostcodeRegex","MONEYREGEX","WORDREGEX","NUMBERREGEX","PWORDREGEX","AccountNumberRegex","sprite","require","Icon","id","props","makeIconsString","Element","renderToStaticMarkup","FORM_TRACKING_KEY","removeTracking","sessionStorage","getTracking","dataString","JSON","dataLayerPush","options","event","rest","window","Date","getFormTracking","formName","data","isFresh","name","expiry","hasExpired","now","isNewForm","handleApiError","error","fallbackMessage","setFormNameGTM","param","step","records","type","totalRecordsGTM","total","isError","isPartial","description","errors","partialCount","value","savedStep","stepError","isSameStep","cardTypeFromCode","code","creditCardReducer","state","action","creditCardDefaultState","acceptedCards","isCardAccepted","cardType","ccType","isCardNumberCorrectLength","lengthOfCardNumber","lengths","len","isCardNumberValid","gaps","isCardYearValid","year","y","date","n","Number","isCardMonthValid","month","String","validateCard","cardName","cardNumber","cardMonth","cardYear","cardSecurity","cardInfo","validationErrors","keys","Object","isValid","key","createDataEntries","number","Array","_","i","arrayBufferToBase64","buffer","binary","bytes","Uint8Array","uniqueBy","uniqueKey","objects","ids","object","index","createPostFn","url","body","response","fetch","Error","Promise","createGetFn","getSymbol","colorArray","yTickFormatter","unit","x","num","Math","reducePoints","k","emailChecker","input","emailRegex","RegExp","couldbeMobileAttempt","mobileRegex","removePhoneNumberExtras","ausMobileChecker","replace","perfectMobile","almostPerfect","allCases","str","upper","lower","hasNumber","myString","getSeasonForX","getDayString","day","getFirstDay","d","getLastDay","getStartOfDay","getEndOfDay","getPreviousDay","getMondayStartOfWeek","getSimpleDateTimeString","hour","minutes","getDayRange","getWeekRange","getSeasonalRange","getWeekHighlightDates","startOfWeek","dates","newDate","getDateRange","getMonth","monthNumber","long","m","lm","getWaterMonth","wm","getSeason","time24To12","hrs","mins","isValid24hrTime","time","iSafeHourIncrement","iSafeMinuteIncrement","getDueDateRange","wrappedDate","TODAY_MS","tomorrow","currentTime","min","perferredMax","max","scrollToTop","scrollToRef","ref","_ref_current","sanitizeHtmlString","htmlString","dompurify","submitParentForm","form","isInteger","convertToMoney","round","minus","moneyArray","dollars","removeNaN","numberString","compareNumberString","first","second","a","b","nth","getWaterUseBars","width","available_space","lp","barWidth","getWaterUseMonthlyBars","isABNValid","abn","stringValue","weights","sum","digit","parseInt","isACNValid","acn","textAcn","cypherText","check","remainder","summed","complement","isValidAbnOrAcn","isAbn","isAcn","kebabCase","get_cookie","cookies","document","pair","decodeURI","set_cookie","delete_cookie","removeNoneNumbers","removeWhitespace","insertAt","insertStr","pos","cn","_key","inputs","twMerge","clsx","getCardClassname","cardClass","DASH_POSITIONS","generateUUID","allChars","CHARS","charLength","uuid","getRandomIndex","rand"],"mappings":"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"}