@star-insure/sdk 2.0.6 → 2.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"sdk.cjs.production.min.js","sources":["../src/lib/dates.ts","../src/lib/money.ts","../src/lib/vehicles.ts","../src/lib/toast.tsx","../src/lib/quoteRequestForm.tsx","../src/lib/quoteRequestOptions.tsx","../src/lib/addressFinder.tsx","../src/lib/calculateAge.ts","../src/lib/calculatePricing.tsx","../src/components/common/Button.tsx","../src/components/common/Card.tsx","../src/components/common/ToastItem.tsx","../src/components/forms/RegistrationSearchField.tsx","../src/components/forms/DateOfBirthField.tsx","../src/components/forms/ErrorList.tsx","../src/components/forms/FormTester.tsx","../src/components/common/Modal.tsx","../src/components/forms/MoneyField.tsx","../src/components/common/Pagination.tsx","../src/components/common/SimplePagination.tsx","../src/components/tables/Table.tsx","../src/components/tables/TableActions.tsx","../src/components/tables/TableBody.tsx","../src/components/tables/TableCell.tsx","../src/components/tables/TableHead.tsx","../src/components/tables/TableHeader.tsx","../src/components/tables/TableRow.tsx","../src/components/common/Toasts.tsx","../src/lib/auth.tsx","../src/lib/clickOutside.tsx","../src/lib/inertiaOptions.tsx","../src/lib/localStorage.tsx"],"sourcesContent":["import { format, parse } from \"date-fns\";\n\nexport function parseDate(dateString: string): Date {\n // Make sure we've only got 10 characters\n return parse(dateString.substring(0, 10), 'yyyy-MM-dd', new Date());\n}\n\nexport function parseDateTime(dateTimeString: string): Date {\n return parse(dateTimeString, 'yyyy-MM-dd HH:mm:ss', new Date());\n}\n\n/**\n * Formats a date like \"Jan 1, 2022 at 9:50am\"\n */\nexport function formatDateNice(date: string, includeTime: boolean = true) {\n const formatString = includeTime ? \"MMM d, yyyy 'at' h:mma\" : 'MMM d, yyyy';\n const parsed = includeTime ? parseDateTime(date) : parseDate(date);\n\n return format(parsed, formatString);\n}\n\n/**\n * Formats a date like \"01/01/2022 9:50AM\"\n */\nexport function formatDateForTable(date: string, includeTime: boolean = true) {\n const formatString = includeTime ? 'dd/MM/yyyy h:mma' : 'dd/MM/yyyy';\n const parsed = includeTime ? parseDateTime(date) : parseDate(date);\n\n return format(parsed, formatString);\n}\n","/**\n * Safely rounds a number\n */\nexport function round(value: number): number {\n return Number(Math.round(parseFloat(value + 'e' + 2)) + 'e-' + 2)\n}\n\n/**\n * Gets the GST value from a number\n */\nexport function getGst(value: number): number {\n return round(value * 3 / 23);\n}\n\n/**\n * Adds GST to a number\n */\nexport function addGst(value: number): number {\n return round(value * 1.15);\n}\n\n/**\n * Subtracts GST from a number\n */\nexport function subtractGst(value: number): number {\n return round(value - getGst(value));\n}\n\n/**\n * Calculates the various GST values on a figure\n */\nexport function gstCalc(input: number|string): {\n gst: number,\n amountInclusive: number,\n amountExclusive: number\n} {\n let value = input;\n\n if (typeof value === 'string') {\n value = parseFloat(value.replace(/[^0-9.]/g, ''));\n }\n\n value = round(value);\n\n return {\n gst: getGst(value),\n amountInclusive: addGst(value),\n amountExclusive: subtractGst(value)\n }\n}\n\n/**\n * Formats a value nicely\n */\n export function formatMoney(value: string|number, decimals: number = 2): string {\n let toFormat = value;\n if (typeof value === 'string') {\n toFormat = value.replace(/[^\\d.-]/g, '')\n }\n\n return Number(toFormat).toLocaleString('en', {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n });\n}\n\n/**\n * Turns a formatted value in to a float\n */\nexport function formatNumber(value: string): number {\n return parseFloat(value.replace(/[^0-9.]/g, ''));\n}\n","import { VehicleType } from \"../types\";\n\nexport function sanitiseVehicleType(inputType: string): VehicleType {\n let type: VehicleType;\n\n switch (inputType) {\n case 'Camper':\n case 'Goods Van/Truck/Utility':\n case 'Bus':\n case 'Motor Caravan':\n case 'Trailer/Caravan':\n case 'TRAILER_CARAVAN':\n case 'TRAILER_NOT_DESIGNED_FOR_HIGHWAY_USE':\n case 'MOBILE_MACHINE':\n case 'GOODS_VAN_TRUCK_UTILITY':\n case 'BUS':\n case 'MOTOR_CARAVAN': {\n type = 'motorhome';\n break;\n }\n\n case 'Motorcycle':\n case 'Moped':\n case 'ATV':\n case 'Agricultural Machine':\n case 'MOTORCYCLE':\n case 'MOPED':\n case 'TRACTOR':\n case 'AGRICULTURAL_MACHINE':\n case 'HIGH_SPEED_AGRICULTURAL_VEHICLE': {\n type = 'motorcycle';\n break;\n }\n\n case 'Passenger Car/Van':\n case 'PASSENGER_CAR_VAN':\n case 'SPECIAL_PURPOSE_VEHICLE':\n case 'UNKNOWN':\n default:\n type = 'car';\n }\n\n return type;\n}\n","import * as React from 'react';\nimport type { Toast } from \"../types\";\nimport { v4 as uuid } from 'uuid';\n\ninterface ToastContextInterface {\n toasts: Toast[];\n addToast: (toast: Toast) => void;\n removeToast: (id: Toast['_id']) => void;\n}\n\nconst ToastContext = React.createContext<ToastContextInterface>({\n toasts: [],\n addToast: (t: Toast) => {t},\n removeToast: (t: Toast['_id']) => {t},\n});\n\nexport function ToastProvider({ children }: any) {\n const [toasts, setToasts] = React.useState<Toast[]>([]);\n\n /**\n * Add a new toast popup message\n */\n function addToast({ message, status, timeout = 4000 }: Toast) {\n const newToast: Toast = { message, status, timeout };\n\n newToast._id = uuid();\n\n setToasts(curr => [...curr, newToast]);\n\n setTimeout(() => {\n removeToast(newToast._id);\n }, timeout);\n }\n\n /**\n * Remove a toast message\n */\n function removeToast(id: Toast['_id']) {\n setToasts(curr => curr.filter(toast => toast._id !== id));\n }\n\n const context: ToastContextInterface = {\n toasts,\n addToast,\n removeToast,\n }\n\n return (\n <ToastContext.Provider value={context}>\n {children}\n </ToastContext.Provider>\n );\n}\n\nexport const useToast = () => React.useContext(ToastContext);\n","import React from 'react';\nimport { useForm } from \"@inertiajs/react\";\nimport { InertiaFormProps } from \"@inertiajs/react/types/useForm\";\nimport type { QuoteRequest } from '../types';\n\ntype QuoteRequestForm = QuoteRequest & Record<string, any>;\n\ninterface QuoteRequestFormContextInterface {\n form?: InertiaFormProps<QuoteRequestForm>;\n handleChange?: (e: React.ChangeEvent<HTMLInputElement|HTMLTextAreaElement|HTMLSelectElement>) => void;\n}\n\nexport const initialData: QuoteRequestForm = {\n id: undefined,\n status: 'new',\n source: 'phone',\n reference: '',\n client_number: '',\n first_name: '',\n last_name: '',\n phone: '',\n mobile: '',\n email: '',\n licence: '',\n licence_other: '',\n promo_code: '',\n club_membership_number: '',\n length_of_insurance: '',\n dob: '',\n club_id: undefined,\n street_address: {\n address: '',\n unit: '',\n suburb: '',\n city: '',\n post_code: '',\n },\n declaration: {\n had_incident: undefined,\n incidents: [],\n has_demerit_points: undefined,\n demerit_points: '',\n has_lost_licence: undefined,\n lost_licence_details: '',\n was_refused_insurance: undefined,\n refused_insurance_details: '',\n has_criminal_conviction: undefined,\n criminal_conviction_details: '',\n has_vehicle_modifications: undefined,\n vehicle_modifications_details: '',\n has_previous_insurer: undefined,\n previous_insurer_details: '',\n previous_insurer_expires_at: '',\n additional_details: '',\n },\n vehicles: [],\n // Portal specific fields:\n purchase_options: [],\n theme: '',\n broker_fee: undefined,\n broker_id: undefined,\n broker_firm_id: undefined,\n agent_id: undefined,\n agent_firm_id: undefined,\n staff_member_id: undefined,\n sent_at: undefined,\n sold_at: undefined,\n referrer_id: undefined,\n referrer_category_id: undefined,\n pricing_expires_at: undefined,\n follow_up_at: undefined,\n is_follow_up_required: true,\n}\n\nexport const QuoteRequestFormContext = React.createContext<QuoteRequestFormContextInterface>({});\n\nexport function QuoteRequestFormProvider({ children }: { children: React.ReactNode }) {\n const form = useForm(initialData);\n\n /**\n * Handle the change event for all form inputs\n */\n function handleChange(e: React.SyntheticEvent<HTMLInputElement|HTMLTextAreaElement|HTMLSelectElement>) {\n const { name } = e.currentTarget;\n let value: string|boolean|undefined = e.currentTarget.value;\n\n if (e.currentTarget.type === 'checkbox' || e.currentTarget.type === 'radio') {\n const target = e.currentTarget as HTMLInputElement;\n value = target.value === '1' ? true : false;\n }\n\n if (name.includes('.')) {\n const parts = name.split('.');\n\n if (parts.length === 2) {\n return form.setData(prevData => ({\n ...prevData,\n [parts[0]]: {\n // @ts-ignore TODO: Maybe fix these TS errors\n ...prevData[parts[0]],\n [parts[1]]: value,\n },\n }));\n } else {\n // We don't want to handle anything double-nested. These should be handled by their own local state.\n return;\n }\n }\n\n return form.setData(prevData => ({\n ...prevData,\n [name]: value,\n }));\n }\n\n return (\n <QuoteRequestFormContext.Provider value={{ form, handleChange }}>\n {children}\n </QuoteRequestFormContext.Provider>\n );\n}\n\n/**\n * Takes in a quote request and returns data suitable to populate a form\n * by recursively calling this function, converting null to undefined.\n */\n export function sanitiseQuoteRequestFormData(value: any): any {\n if (Array.isArray(value)) {\n return value.map(item => sanitiseQuoteRequestFormData(item));\n }\n\n if (value === null) {\n return \"\";\n }\n\n if (typeof value === 'object') {\n // Map over each property and convert null to undefined\n return Object.keys(value).reduce((acc, key) => {\n // @ts-ignore\n acc[key] = sanitiseQuoteRequestFormData(value[key]);\n return acc;\n }, {});\n }\n\n return value;\n}\n\nexport const useQuoteRequestForm = () => React.useContext(QuoteRequestFormContext);\n","import React from 'react';\nimport { QuoteRequestOptions } from '../types';\n\ninterface QuoteRequestFormContextInterface {\n options?: QuoteRequestOptions;\n setOptions: (options: QuoteRequestOptions) => void;\n}\n\nconst QuoteRequestOptionsContext = React.createContext<QuoteRequestFormContextInterface>({ setOptions: () => {} });\n\nexport function QuoteRequestOptionsProvider({ children }: { children: React.ReactNode }) {\n const [options, setOptions] = React.useState<QuoteRequestOptions>();\n\n return (\n <QuoteRequestOptionsContext.Provider value={{ options, setOptions }}>\n {children}\n </QuoteRequestOptionsContext.Provider>\n )\n}\n\nexport const useQuoteRequestOptions = () => React.useContext(QuoteRequestOptionsContext);\n","const prodConfig = {\n key: 'XVAKN4Q9PREJD8CUTFBW',\n baseUrl: 'https://api.addressfinder.io/api/nz/address',\n}\n\nconst config = prodConfig;\n\ninterface AutocompleteResponse {\n completions: AddressCompletion[];\n paid: boolean;\n demo: boolean;\n success: boolean;\n}\n\nexport interface AddressCompletion {\n a: string;\n pxid: string;\n v: number;\n}\n\nexport interface AddressData {\n pxid: string;\n a: string;\n aims_address_id: string;\n sufi: number;\n ta_id: string;\n ta: string;\n tasub_id: string;\n tasub: string;\n number: string;\n x: string;\n y: string;\n postcode: string;\n street: string;\n street_name: string;\n street_type: string;\n city: string;\n suburb: string;\n region_id: string;\n region: string;\n postal_line_1: string;\n postal_line_2: string;\n aims_road_section_id: string;\n rural: string;\n address_line_1: string;\n address_line_2?: string;\n primary_parcel_id: string;\n meshblock: string;\n sa1_id: string;\n sa2_id: string;\n sa2: string;\n cb_id: string;\n cb: string;\n ward_id: string;\n ward: string;\n con_id: string;\n con: string;\n maoricon_id: string;\n maoricon: string;\n iur_id: string;\n iur: string;\n ur_id: string;\n ur: string;\n landwater_id: string;\n landwater: string;\n success: boolean;\n}\n\nexport async function autocomplete(search: string): Promise<AddressCompletion[]> {\n const { key, baseUrl } = config;\n const q = encodeURIComponent(search);\n\n const res = await fetch(`${baseUrl}/autocomplete/?key=${key}&q=${q}&format=json&strict=2`);\n\n if (!res.ok) {\n return [];\n }\n\n const data: AutocompleteResponse = await res.json();\n\n if (data.completions) {\n return data.completions;\n }\n\n return [];\n}\n\nexport async function getAddressData(completion: AddressCompletion): Promise<AddressData|null> {\n const { key, baseUrl } = config;\n\n const res = await fetch(`${baseUrl}/metadata/?key=${key}&pxid=${completion.pxid}&format=json`);\n\n if (!res.ok) {\n return null;\n }\n\n const data: AddressData = await res.json();\n\n return data;\n}\n","/**\n * Calculate someone's age from a date of birth.\n * @param date YYYY-MM-DD\n */\n export function calculateAge(date: string): number {\n const today = new Date();\n\n const birthDate = new Date(date);\n\n const age = today.getFullYear() - birthDate.getFullYear();\n\n const m = today.getMonth() - birthDate.getMonth();\n\n if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {\n return age - 1;\n }\n\n return age;\n}\n","import { addGst } from \"./money\";\nimport type { PolicyEnhancement, QuoteRequestPurchaseOption } from \"../types\";\n\ninterface CalculationArguments {\n option: QuoteRequestPurchaseOption;\n selectedEnhancements: PolicyEnhancement['id'][];\n brokerFee?: number;\n}\n\nfunction calculateMonthly({ option, selectedEnhancements }: CalculationArguments) {\n const premium = option.monthly_premium || 0;\n\n const enhancementsCost = selectedEnhancements.reduce((acc, id) => {\n const enhancement = option.enhancements?.find(e => e.id === id);\n if (!enhancement) return acc;\n const enhancementPremium = calcMonthlyEnhancementPrice(enhancement);\n\n if (!acc) {\n return enhancementPremium;\n }\n\n return acc + enhancementPremium;\n }, 0) || 0;\n\n return premium + enhancementsCost;\n}\n\nfunction calculateAnnually({ option, selectedEnhancements, brokerFee = 0 }: CalculationArguments) {\n const premium = option.premium || 0;\n const fsl = option.fsl || 0;\n const enhancementsCost = selectedEnhancements.reduce((acc, id) => {\n const enhancement = option.enhancements?.find(e => e.id === id);\n if (!enhancement) return acc;\n return (acc || 0) + (enhancement.premium || 0);\n }, 0) || 0;\n\n return premium + fsl + enhancementsCost + brokerFee;\n}\n\nexport function calcMonthlyEnhancementPrice(enhancement: PolicyEnhancement): number {\n if (!enhancement.premium) return 0;\n\n const monthlyPremium = (enhancement.premium / 100) / 12;\n\n if (enhancement.disable_rounding) {\n return Math.round(monthlyPremium * 100);\n }\n\n return Math.round(Math.ceil(monthlyPremium) * 100);\n}\n\n/**\n * Fix rounding errors we get from subtracting, and then adding GST back on\n * (Issues with 2 decimal place rounding)\n */\n export function fixRoundingError(premium: number) {\n // If the premium ends in \"01\" then we need to round it down\n if (premium % 100 === 1) {\n return premium - 1;\n }\n\n // If the premium ends in \"99\" then we need to round it up\n if (premium % 100 === 99) {\n return premium + 1;\n }\n\n return premium;\n}\n\nexport function calcPurchaseOptionPricing({ option, selectedEnhancements, brokerFee = 0 }: CalculationArguments) {\n const monthly = calculateMonthly({ option, selectedEnhancements });\n const annually = calculateAnnually({ option, selectedEnhancements, brokerFee });\n\n const monthlyWithGst = fixRoundingError(Math.round(addGst(monthly)));\n const annuallyWithGst = fixRoundingError(Math.round(addGst(annually)));\n\n return {\n monthly,\n annually,\n monthlyWithGst,\n annuallyWithGst,\n };\n}\n","import React from 'react';\nimport { Link } from '@inertiajs/react';\n\ninterface Props {\n className?: string;\n href?: string;\n target?: '_blank' | '_self';\n onClick?: Function;\n type?: 'button' | 'submit';\n status?: 'primary' | 'danger' | 'warning' | 'info' | 'default';\n children: React.ReactNode;\n disabled?: boolean;\n as?: 'link' | 'button' | 'a';\n}\n\nexport default function Button({\n className,\n href,\n target,\n onClick,\n type,\n children,\n status = 'default',\n disabled = false,\n as,\n}: Props) {\n const baseClasses =\n 'font-black inline-flex items-center gap-3 justify-center text-white text-center px-5 py-2 rounded-md min-w-[120px] transition-all hover:opacity-75';\n\n const statusClass =\n (status === 'primary' && 'bg-teal') ||\n (status === 'danger' && 'bg-red-500') ||\n (status === 'warning' && 'bg-yellow-400') ||\n (status === 'info' && 'bg-blue-400') ||\n 'bg-gray-600';\n\n const classes = `${className ?? ''} ${baseClasses} ${statusClass}`;\n\n if (onClick) {\n return (\n <button\n className={classes}\n type={type ?? 'button'}\n onClick={(e: React.MouseEvent) => onClick(e)}\n disabled={disabled}\n >\n {children}\n </button>\n );\n }\n\n if (type) {\n return (\n <button className={classes} type={type ?? 'button'} disabled={disabled}>\n {children}\n </button>\n );\n }\n\n if (href) {\n if (href.includes('http') || target === '_blank' || as === 'a') {\n return (\n <a href={href} target={target ?? '_self'} className={classes}>\n {children}\n </a>\n );\n }\n\n return (\n <Link href={href} className={classes}>\n {children}\n </Link>\n );\n }\n\n return <p className=\"text-red-500 text-sm\">[Invalid button]</p>;\n}\n","import React from 'react';\n\ninterface Props {\n className?: string;\n children: React.ReactNode;\n}\n\nexport default function Card({ className, children }: Props) {\n return (\n <div className={`${className ?? ''} flex flex-col items-start bg-white rounded-md shadow border border-gray-200 p-4 md:p-6`}>\n {children}\n </div>\n );\n}\n","import React from 'react';\nimport { Transition } from '@headlessui/react';\nimport type { Toast } from '../../types';\nimport { useToast } from '../../lib/toast';\n\nexport default function ToastItem({ _id = '', message, status = 'default' }: Toast) {\n const { removeToast } = useToast();\n\n const defaultClasses = 'w-full min-w-[250px] p-4 shadow flex justify-between items-center font-black rounded-md not:';\n\n const statusClasses = status === 'success' && 'bg-teal text-white'\n || status === 'error' && 'bg-red-500 text-white'\n || status === 'warning' && 'bg-yellow-400 text-white'\n || 'bg-white text-asphalt';\n\n const classes = `${defaultClasses} ${statusClasses}`;\n\n function handleClick() {\n removeToast(_id);\n }\n\n return (\n <Transition\n show={true}\n appear={true}\n enter=\"transition-all duration-300\"\n enterFrom=\"opacity-0 translate-y-4\"\n enterTo=\"opacity-100 translate-y-0\"\n leave=\"transition-all duration-300\"\n leaveFrom=\"opacity-100 translate-y-0\"\n leaveTo=\"opacity-0 translate-y-2\"\n >\n <div className={classes}>\n <p>{message}</p>\n <button className=\"\" onClick={handleClick} title=\"Close message\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n className=\"h-6 w-6\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n </Transition>\n )\n}\n","import React from 'react';\nimport { sanitiseVehicleType } from '../../lib';\nimport {\n ApiResponse,\n FormStatus,\n MotorwebVehicleResponse,\n VehicleType,\n} from '../../types';\nimport { useToast } from '../../lib/toast';\nimport cn from 'classnames';\n\nexport interface VehicleData extends MotorwebVehicleResponse {\n make: string;\n model: string;\n year: string;\n vehicle_type: VehicleType;\n is_heavy: boolean;\n}\n\nexport interface RegistrationSearchOnChange {\n registration: string;\n}\n\ninterface Props {\n name?: string;\n onChange?: (values: RegistrationSearchOnChange) => void;\n onVehicleDataFound: (vehicleData: VehicleData) => void;\n apiUrl?: string;\n showOdometerReadingField?: boolean;\n showConditionField?: boolean;\n initialRegistrationValue?: string;\n outerClassName?: string;\n odoInputClassName?: string;\n conditionSelectClassName?: string;\n regoInputClassName?: string;\n searchBtnClassName?: string;\n}\n\nexport const conditionOptions = [\n 'POOR',\n 'FAIR',\n 'AVERAGE',\n 'GOOD',\n 'VERY_GOOD',\n 'AS_NEW',\n 'NEW',\n];\n\nexport default function RegistrationSearchField({\n name = 'registration_search',\n initialRegistrationValue = '',\n onVehicleDataFound,\n apiUrl = '/api/rego-search',\n showOdometerReadingField = false,\n showConditionField = false,\n onChange,\n outerClassName,\n odoInputClassName,\n conditionSelectClassName,\n regoInputClassName,\n searchBtnClassName,\n}: Props) {\n const [rego, setRego] = React.useState<string>(initialRegistrationValue);\n const [odo, setOdo] = React.useState<string>('');\n const [condition, setCondition] = React.useState<string>('GOOD');\n\n const [status, setStatus] = React.useState<FormStatus>('idle');\n const { addToast } = useToast();\n\n function handleChange(\n e: React.SyntheticEvent<HTMLInputElement | HTMLSelectElement>\n ) {\n if (e.currentTarget.name === name) {\n setRego(e.currentTarget.value?.toUpperCase() || '');\n }\n\n if (e.currentTarget.name === 'odo_search') {\n setOdo(e.currentTarget.value);\n }\n\n if (e.currentTarget.name === 'condition_search') {\n setCondition(e.currentTarget.value);\n }\n\n if (onChange) {\n onChange({ registration: e.currentTarget.value.toUpperCase() });\n }\n }\n\n function handleKeydown(e: React.KeyboardEvent) {\n if (e.key === 'Enter') {\n handleSearch();\n }\n }\n\n async function handleSearch() {\n setStatus('processing');\n\n const payload = {\n registration: rego,\n odometerReading: odo,\n condition,\n };\n\n // Turn the payload in to a query string\n // @ts-ignore\n const query = new URLSearchParams(payload).toString();\n\n const res = await fetch(`${apiUrl}?${query}`, {\n headers: { 'Content-Type': 'application/json' },\n });\n\n if (!res.ok) {\n addToast({\n message: `There was an error with the provided registration.`,\n status: 'error',\n timeout: 3000,\n });\n setStatus('error');\n return;\n }\n\n const { data, ok }: ApiResponse<MotorwebVehicleResponse> = await res.json();\n\n if (!ok || !data) {\n addToast({\n message: `Failed to find vehicle, please complete manually.`,\n status: 'error',\n timeout: 3000,\n });\n setStatus('error');\n return;\n }\n\n const vehicleData = data.data.vehicle;\n\n const make = vehicleData.make;\n const model = vehicleData.model;\n const year = vehicleData['year-of-manufacture'];\n const weight = vehicleData['gross-vehicle-mass']\n ? parseInt(vehicleData['gross-vehicle-mass'].replaceAll(',', ''))\n : 0;\n const vehicleType = vehicleData['vehicle-type'];\n\n if (!make || !model || !year || !vehicleType) {\n addToast({\n message: `We couldn't find all of your data, please complete manually.`,\n status: 'error',\n timeout: 3000,\n });\n setStatus('error');\n }\n\n onVehicleDataFound({\n ...data,\n make: make || '',\n model: model || '',\n year: year || '',\n vehicle_type: vehicleType ? sanitiseVehicleType(vehicleType) : 'car',\n is_heavy: (weight && weight > 3500) || false,\n });\n\n setStatus('success');\n }\n\n return (\n <div className=\"w-full flex flex-col\">\n <div className={cn(outerClassName, \"w-full flex flex-wrap gap-3 bg-gray-100 rounded-md p-3\")}>\n {showOdometerReadingField ||\n (showConditionField && (\n <div className=\"w-full grid grid-cols-2 gap-3\">\n {showOdometerReadingField && (\n <label>\n Approx. km travelled\n <input\n onKeyDown={handleKeydown}\n type=\"number\"\n name=\"odo_search\"\n id=\"odo_search\"\n value={odo}\n onChange={handleChange}\n className={cn(odoInputClassName, \"transition-all\", {\n 'pointer-events-none opacity-50': status === 'processing',\n })}\n disabled={status === 'processing'}\n />\n </label>\n )}\n\n {showConditionField && (\n <label>\n Vehicle condition\n <select\n name=\"condition_search\"\n id=\"condition_search\"\n value={condition}\n onChange={handleChange}\n className={cn(conditionSelectClassName, \"transition-all\", {\n 'pointer-events-none opacity-50': status === 'processing',\n })}\n disabled={status === 'processing'}\n >\n {conditionOptions.map(conditionOption => (\n <option key={conditionOption}>{conditionOption}</option>\n ))}\n </select>\n </label>\n )}\n </div>\n ))}\n\n <input\n onKeyDown={handleKeydown}\n placeholder=\"Search for your rego\"\n type=\"text\"\n name={name}\n id={name}\n value={rego}\n onChange={handleChange}\n className={cn(regoInputClassName, \"flex-grow transition-all\", {\n 'pointer-events-none opacity-50': status === 'processing',\n })}\n disabled={status === 'processing'}\n />\n\n <button\n title=\"Search\"\n type=\"button\"\n onClick={handleSearch}\n disabled={status === 'processing'}\n className={cn(searchBtnClassName, \"bg-teal px-4 py-3 rounded-md transition-all\")}\n >\n <span className=\"sr-only\">Search</span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-5 w-5 text-white\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n </button>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { calculateAge } from '../../lib';\nimport { padStart } from 'lodash';\n\ninterface Props {\n name?: string;\n id?: string;\n onChange: (dateString: string) => void;\n value?: string;\n maxYear?: number;\n showAge?: boolean;\n}\n\nexport default function DateOfBirthField({\n name = 'dob',\n id = 'dob',\n onChange,\n value,\n maxYear = 0,\n showAge = false,\n}: Props) {\n const dayOptions = [...Array.from(Array(31).keys())].map(value => {\n return padStart(`${value + 1}`, 2, '0');\n });\n\n const months = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ];\n const monthOptions = [...Array.from(Array(12).keys())].map(value => {\n return {\n title: months[value],\n value: padStart(`${value + 1}`, 2, '0'),\n };\n });\n\n // Create 100 years of options, subtracting the maximum year if provided\n const yearOptions = [...Array.from(Array(100).keys())].map(value => {\n return maxYear ? maxYear - value : new Date().getFullYear() - value;\n });\n\n function handleChange(\n e: React.ChangeEvent<\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n >\n ) {\n const { name, value } = e.currentTarget;\n\n let y = name.includes('year') ? value : year;\n let m = name.includes('month') ? value : month;\n let d = name.includes('day') ? value : day;\n\n onChange(`${y}-${m}-${d}`);\n }\n\n const [year, month, day] = value ? value.split('-') : ['', '', ''];\n const isValidDate =\n year && month && day && !isNaN(Date.parse(`${year}-${month}-${day}`));\n\n return (\n <span className=\"flex flex-col gap-2\">\n <span className=\"flex space-x-4 border border-gray-300 rounded-lg bg-white\">\n <select\n name={`${name}_day`}\n id={`${id}_day`}\n value={day}\n className=\"flex-grow focus:outline-none border-0\"\n onChange={handleChange}\n required\n >\n <option value=\"\">Day</option>\n {dayOptions.map(option => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </select>\n <select\n name={`${name}_month`}\n id={`${id}_month`}\n value={month}\n className=\"flex-grow focus:outline-none border-0\"\n onChange={handleChange}\n required\n >\n <option value=\"\">Month</option>\n {monthOptions.map(option => (\n <option key={option.value} value={option.value}>\n {option.title}\n </option>\n ))}\n </select>\n <select\n name={`${name}_year`}\n id={`${id}_year`}\n value={year}\n className=\"flex-grow focus:outline-none border-0\"\n onChange={handleChange}\n required\n >\n <option value=\"\">Year</option>\n {yearOptions.map(option => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </select>\n </span>\n {showAge && value && isValidDate && (\n <span className=\"font-bold\">Age: {calculateAge(value)} years</span>\n )}\n </span>\n );\n}\n","import React from 'react';\nimport { ErrorBag, Errors } from '@inertiajs/core';\nimport { Card } from '../common';\n\ninterface Props {\n heading?: string;\n errors?: Errors & ErrorBag;\n renderKeys?: boolean;\n className?: string;\n}\n\nexport default function ErrorList({\n heading = 'There was an error with your submission.',\n errors = {},\n renderKeys = false,\n className = '',\n}: Props) {\n if (Object.values(errors).length === 0) {\n return <></>;\n }\n\n return (\n <aside className={`${className} col-span-full`}>\n <Card className=\"border border-red-500 !bg-red-50\">\n <h2 className=\"font-black text-red-500 mb-2\">{heading}</h2>\n <ul className=\"space-y-2 list-disc ml-4\">\n {Object.entries(errors).map(([field, message]) => (\n <li className=\"font-bold text-red-500\" key={field}>\n {renderKeys && <strong>{field}: </strong>}\n {message}\n </li>\n ))}\n </ul>\n </Card>\n </aside>\n );\n}\n","import React from 'react';\nimport { Button } from '../common';\nimport { useQuoteRequestForm } from '../../lib';\n\ninterface Props {\n populatePurchaseOptions: boolean;\n}\n\nexport default function FormTester({ populatePurchaseOptions = false }: Props) {\n const { form } = useQuoteRequestForm();\n const [keys, setKeys] = React.useState<string[]>([]);\n const [isDev, setDev] = React.useState<boolean>(false);\n\n function handlePopulate() {\n form?.setData(prevData => ({\n ...prevData,\n first_name: 'TEST',\n last_name: 'TEST',\n email: 'dev@sual.co.nz',\n phone: '021 234 5678',\n mobile: '021 234 5678',\n dob: '1990-01-01',\n licence: 'Other',\n licence_other: 'Test',\n club_id: 50,\n club_membership_number: '12345',\n street_address: {\n address: '123 Street Name',\n unit: 'Level 1',\n suburb: 'Suburb',\n city: 'Auckland',\n post_code: '1234',\n },\n promo_code: 'TEST',\n declaration: {\n had_incident: true,\n incidents: [{\n description: 'Lorem ipsum dolor sit amet.',\n month: 'January',\n year: '2020',\n }],\n has_demerit_points: true,\n demerit_points: '1-24',\n has_lost_licence: true,\n lost_licence_details: 'Lorem ipsum dolor sit amet.',\n was_refused_insurance: true,\n refused_insurance_details: 'Lorem ipsum dolor sit amet.',\n has_criminal_conviction: true,\n criminal_conviction_details: 'Lorem ipsum dolor sit amet.',\n has_vehicle_modifications: true,\n vehicle_modifications_details: 'Lorem ipsum dolor sit amet.',\n has_previous_insurer: true,\n previous_insurer_details: 'AA',\n previous_insurer_expires_at: '2020-01-01',\n additional_details: 'I am a robot, beep boop. Please ignore this submission.',\n },\n vehicles: [\n {\n make: 'Tesla',\n model: 'Cybertruck',\n year: '2023',\n registration: 'ELMUSK',\n vehicle_type: 'car',\n product: 'star-enthusiast-prestige-everyday-plus',\n value: 100000,\n is_heavy: false,\n usage: 'Childrens car',\n storage_location: 'Carport',\n has_financially_interested_party: true,\n financially_interested_party_detail: 'MTA',\n owned_duration: 'Less than 12 months',\n drivers: [\n {\n first_name: 'X Æ',\n last_name: 'A-12',\n dob: '2000-05-04',\n licence: 'Other',\n licence_other: 'None',\n relationship: 'Child',\n key: 'driver-test-key',\n }\n ],\n key: 'vehicle-test-key',\n },\n ],\n purchase_options: populatePurchaseOptions ? [\n {\n premium_type: 'annual',\n level_of_insurance_id: 12,\n authorised_drivers: 'TEST',\n excess_details: 'TEST',\n terms: 'TEST',\n description: 'This is a test purchase option',\n premium: 100000,\n monthly_premium: 8500,\n show_monthly: true,\n fsl: 100,\n sort_order: 1,\n enhancements: [\n { name: 'Test enhancement', premium: 2500, disable_rounding: false, description: 'Test enhancement', auto_select: true, key: 'enhancement-test-key-1' },\n { name: 'Test enhancement', premium: 5000, disable_rounding: false, description: 'Test enhancement', auto_select: false, key: 'enhancement-test-key-2' }\n ],\n key: 'purchase-option-test-key-annual'\n },\n {\n premium_type: 'total-due',\n level_of_insurance_id: 13,\n authorised_drivers: 'TEST',\n excess_details: 'TEST',\n terms: 'TEST',\n description: 'This is a test purchase option',\n premium: 100000,\n show_monthly: false,\n fsl: 100,\n sort_order: 2,\n enhancements: [\n { name: 'Test enhancement', premium: 2500, disable_rounding: false, description: 'Test enhancement', auto_select: true, key: 'enhancement-test-key-3' },\n { name: 'Test enhancement', premium: 5000, disable_rounding: false, description: 'Test enhancement', auto_select: false, key: 'enhancement-test-key-4' }\n ],\n key: 'purchase-option-test-key-total-due'\n }\n ] : [],\n }))\n }\n\n function handleKeydown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n return setKeys([]);\n }\n\n setKeys(prevKeys => [...prevKeys, e.key]);\n }\n\n React.useEffect(() => {\n // Detect when the user has typed the word \"debug\"\n if (keys.join('') === 'debug') {\n handlePopulate();\n }\n }, [keys]);\n\n React.useEffect(() => {\n if (typeof window !== 'undefined') {\n if (window.location.href.includes('dev')\n || window.location.href.includes('localhost')\n || window.location.href.includes('test')\n || window.location.href.includes('local')\n ) {\n setDev(true);\n }\n\n window.addEventListener('keydown', (e: KeyboardEvent) => handleKeydown(e));\n\n return () => {\n window.removeEventListener('keydown', (e: KeyboardEvent) => handleKeydown(e));\n }\n }\n\n return;\n }, []);\n\n if (isDev) {\n return (\n <Button onClick={handlePopulate} type=\"button\" status=\"primary\" className=\"fixed bottom-4 right-4\">\n Populate data\n </Button>\n )\n }\n\n return <></>;\n}\n","import React from 'react';\nimport { Fragment } from 'react'\nimport { Dialog, Transition } from '@headlessui/react'\n\ninterface Props {\n children: React.ReactNode;\n isActive?: boolean;\n onClose: () => void;\n title?: string;\n}\n\nexport default function Modal({ children, isActive = false, onClose, title }: Props) {\n return (\n <Transition.Root show={isActive} as={Fragment}>\n <Dialog as=\"div\" className=\"fixed z-[110] inset-0 overflow-y-auto\" onClose={onClose}>\n <div className=\"flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0\">\n <Transition.Child\n as={Fragment}\n enter=\"ease-out duration-300\"\n enterFrom=\"opacity-0\"\n enterTo=\"opacity-100\"\n leave=\"ease-in duration-200\"\n leaveFrom=\"opacity-100\"\n leaveTo=\"opacity-0\"\n >\n <Dialog.Overlay className=\"fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity\" />\n </Transition.Child>\n\n <Transition.Child\n as={Fragment}\n enter=\"ease-out duration-300\"\n enterFrom=\"opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95\"\n enterTo=\"opacity-100 translate-y-0 sm:scale-100\"\n leave=\"ease-in duration-200\"\n leaveFrom=\"opacity-100 translate-y-0 sm:scale-100\"\n leaveTo=\"opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95\"\n >\n <div className=\"w-full align-start inline-block bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-3xl sm:p-6\">\n <div className={`flex gap-4 mb-4 text-asphalt ${title ? 'border-b-2 border-asphalt pb-4' : ''}`}>\n {title && <h3 className=\"font-black text-lg\">{title}</h3>}\n <button type=\"button\" onClick={onClose} className=\"ml-auto transition-all hover:opacity-50\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n <div>{children}</div>\n </div>\n </Transition.Child>\n </div>\n </Dialog>\n </Transition.Root>\n );\n}\n","import React from 'react';\nimport { formatMoney, formatNumber } from \"../../lib\";\n\ninterface Props {\n value?: number;\n onChange: (value: number) => void;\n id?: string;\n name?: string;\n className?: string;\n required?: boolean;\n}\n\nexport default function MoneyField({ value = 0, onChange, name = 'value', id = 'value', className = '', required = false }: Props) {\n function handleChange(e: React.SyntheticEvent<HTMLInputElement>) {\n let newValue: number = 0;\n\n if (e.currentTarget.value) {\n newValue = formatNumber(e.currentTarget.value);\n\n if (isNaN(newValue)) {\n newValue = 0;\n }\n }\n\n onChange(newValue);\n }\n\n const displayValue = formatMoney(value, 0);\n\n return (\n <div className={`${className} flex items-center gap-2 pl-4 rounded-md border border-gray-300 transition-all focus-within:border-teal focus-within:outline-none focus-within:ring focus-within:ring-teal focus-within:ring-opacity-50`}>\n <span className=\"font-bold pr-2\">$</span>\n <input\n type=\"text\"\n name={name}\n id={id}\n value={displayValue}\n onChange={handleChange}\n className=\"w-full !focus:outline-none !focus:ring-0 !focus:ring-transparent !focus:ring-opacity-0 !ring-0 !border-0 !transition-none !rounded-l-none\"\n required={required}\n />\n </div>\n );\n\n}\n","import React from \"react\";\nimport { Link } from \"@inertiajs/react\";\nimport type { Meta } from \"../../types\";\n\ninterface Props {\n className?: string;\n meta: Meta;\n showPerPageSelector?: boolean;\n}\n\nexport default function Pagination({ meta, className, showPerPageSelector = false }: Props) {\n const { current_page, total, per_page } = meta;\n const page_count = Math.ceil(total / per_page);\n\n function getNextPageLink() {\n if (typeof window !== 'undefined') {\n const search = new URLSearchParams(window.location.search);\n search.set('page', String(current_page + 1));\n\n return `?${search.toString()}`;\n }\n\n return '';\n }\n\n function getPrevPageLink() {\n if (typeof window !== 'undefined') {\n const search = new URLSearchParams(window.location.search);\n search.set('page', String(current_page - 1));\n\n return `?${search.toString()}`;\n }\n\n return '';\n }\n\n const nextPageLink = getNextPageLink();\n const prevPageLink = getPrevPageLink();\n\n function handlePerPageChange(e: React.SyntheticEvent<HTMLSelectElement>) {\n const search = new URLSearchParams(window?.location.search);\n search.set('limit', e.currentTarget.value);\n search.set('page', '1');\n\n window.location.href = `?${search.toString()}`;\n }\n\n return (\n <div className={`${className ?? ''}`}>\n <nav className=\"font-bold flex justify-between items-center gap-6\">\n <Link href={prevPageLink} className=\"flex items-center gap-2\" disabled={current_page === 1}>\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10 19l-7-7m0 0l7-7m-7 7h18\" />\n </svg>\n Prev\n </Link>\n <div className=\"flex gap-6 items-center\">\n <p>Page {current_page} of {page_count}</p>\n {showPerPageSelector ? (\n <select value={per_page} onChange={handlePerPageChange}>\n <option value=\"10\">10 per page</option>\n <option value=\"25\">25 per page</option>\n <option value=\"50\">50 per page</option>\n <option value=\"100\">100 per page</option>\n </select>\n ) : ''}\n </div>\n <Link href={nextPageLink} className=\"flex items-center gap-2\" disabled={current_page === page_count}>\n Next\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14 5l7 7m0 0l-7 7m7-7H3\" />\n </svg>\n </Link>\n </nav>\n </div>\n )\n}\n","import React from \"react\";\nimport { Link } from \"@inertiajs/react\";\nimport { Meta } from \"../../types\";\n\ninterface Props {\n className?: string;\n meta: Meta;\n showPerPageSelector?: boolean;\n}\n\nexport default function SimplePagination({ meta, className, showPerPageSelector = false }: Props) {\n const { current_page, per_page, to, from } = meta;\n const results_on_page = to - from + 1;\n const has_more_pages = results_on_page === per_page;\n\n function getNextPageLink() {\n if (typeof window !== 'undefined') {\n const search = new URLSearchParams(window.location.search);\n search.set('page', String(current_page + 1));\n\n return `?${search.toString()}`;\n }\n\n return '';\n }\n\n function getPrevPageLink() {\n if (typeof window !== 'undefined') {\n const search = new URLSearchParams(window.location.search);\n search.set('page', String(current_page - 1));\n\n return `?${search.toString()}`;\n }\n\n return '';\n }\n\n const nextPageLink = getNextPageLink();\n const prevPageLink = getPrevPageLink();\n\n function handlePerPageChange(e: React.SyntheticEvent<HTMLSelectElement>) {\n const search = new URLSearchParams(window?.location.search);\n search.set('limit', e.currentTarget.value);\n search.set('page', '1');\n\n window.location.href = `?${search.toString()}`;\n }\n\n return (\n <div className={`${className ?? ''}`}>\n <nav className=\"font-bold flex justify-between items-center gap-6\">\n <Link href={prevPageLink} className=\"flex items-center gap-2\" disabled={current_page === 1}>\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10 19l-7-7m0 0l7-7m-7 7h18\" />\n </svg>\n Prev\n </Link>\n <div className=\"flex gap-6 items-center\">\n <p>Page {current_page}</p>\n {showPerPageSelector ? (\n <select value={per_page} onChange={handlePerPageChange}>\n <option value=\"10\">10 per page</option>\n <option value=\"25\">25 per page</option>\n <option value=\"50\">50 per page</option>\n <option value=\"100\">100 per page</option>\n </select>\n ) : ''}\n </div>\n <Link href={nextPageLink} className=\"flex items-center gap-2\" disabled={!has_more_pages}>\n Next\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14 5l7 7m0 0l-7 7m7-7H3\" />\n </svg>\n </Link>\n </nav>\n </div>\n )\n}\n","import React from 'react';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nexport default function Table({ children }: Props) {\n return (\n <div className=\"-my-2 -mx-4 overflow-x-auto sm:-mx-6 lg:-mx-8 text-sm\">\n <div className=\"inline-block min-w-full py-2 align-middle md:px-6 lg:px-8\">\n <div className=\"overflow-hidden shadow ring-1 ring-black ring-opacity-5 md:rounded-lg\">\n <table className=\"min-w-full divide-y divide-gray-300\">\n {children}\n </table>\n </div>\n </div>\n </div>\n )\n}\n","import React from 'react';\n\ninterface Props {\n children: React.ReactNode;\n className?: string;\n}\n\nexport default function TableActions({ children, className = '' }: Props) {\n return (\n <div className={`${className} flex gap-4 justify-end items-center`}>\n {children}\n </div>\n )\n}\n","import React from 'react';\n\ninterface Props {\n children: React.ReactNode;\n className?: string;\n}\n\nexport default function TableBody({ children, className = '' }: Props) {\n return (\n <tbody className={`${className ?? ''} divide-y divide-gray-200 bg-white`}>\n {children}\n </tbody>\n )\n}\n","import React from 'react';\nimport cn from 'classnames';\n\ninterface Props {\n children: React.ReactNode;\n className?: string;\n condensed?: true;\n}\n\nexport default function TableCell({ children, className, condensed }: Props) {\n return (\n <td className={cn(className, 'px-3 py-3 text-sm text-gray-500', {\n 'w-0 whitespace-nowrap': condensed,\n })}>\n {children}\n </td>\n )\n}\n","import React from 'react';\n\ninterface Props {\n children: React.ReactNode;\n className?: string;\n}\n\nexport default function TableHead({ children, className = '' }: Props) {\n return (\n <thead className={`${className} px-3 py-4 text-sm text-white bg-gray-600`}>\n {children}\n </thead>\n )\n}\n","import React from 'react';\nimport { Link } from '@inertiajs/react';\nimport cn from 'classnames';\n\ninterface Props {\n children: React.ReactNode;\n className?: string;\n textAlign?: 'left' | 'right' | 'center';\n sort?: string;\n condensed?: true;\n}\n\nexport default function TableHeader({\n children,\n className = '',\n sort,\n textAlign = 'left',\n condensed,\n}: Props) {\n const [sortLink, setSortLink] = React.useState<string>('');\n\n React.useEffect(() => {\n if (typeof window !== 'undefined' && sort) {\n const query = new URLSearchParams(window.location.search);\n\n let direction: 'asc' | 'desc' = 'asc';\n\n if (query.get('sort')) {\n // Choose the opposite direction for sorting\n direction = query.get('sort')?.includes('asc') ? 'desc' : 'asc';\n }\n\n query.set('sort', `${sort} ${direction}`);\n\n setSortLink(`?${query.toString()}`);\n }\n }, []);\n\n const textAlignClass =\n (textAlign === 'center' && 'text-center justify-center') ||\n (textAlign === 'right' && 'text-right justify-end') ||\n 'text-left justify-between';\n\n return (\n <th className={cn(className, 'py-3.5 px-3 text-sm font-semibold text-left', {\n 'w-0 whitespace-nowrap': condensed,\n })}>\n <div className={`flex items-center gap-3 ${textAlignClass}`}>\n {children}\n {sort && (\n <Link href={sortLink}>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M8 9l4-4 4 4m0 6l-4 4-4-4\"\n />\n </svg>\n </Link>\n )}\n </div>\n </th>\n );\n}\n","import React from 'react';\n\ninterface Props {\n children: React.ReactNode;\n className?: string;\n onClick?: () => void;\n}\n\nexport default function TableRow({ children, className = '', onClick = () => {} }: Props) {\n const bgClass = className.includes('bg') ? '' : 'bg-white even:bg-gray-50'\n\n return (\n <tr className={`${className} ${bgClass} hover:bg-gray-100`} onClick={onClick}>\n {children}\n </tr>\n )\n}\n","import React from 'react';\nimport type { Toast } from \"../../types\";\nimport { useToast } from \"../../lib/toast\";\nimport ToastItem from \"./ToastItem\";\n\nexport default function Toasts() {\n const { toasts } = useToast();\n\n return (\n <div className=\"fixed bottom-4 right-4 z-[110] flex flex-col gap-6\">\n {toasts.map((toast: Toast) => (\n <ToastItem {...toast} key={toast._id} />\n ))}\n </div>\n );\n}\n","import { usePage } from '@inertiajs/react';\nimport type { AuthContext } from '../types';\nimport type { ErrorBag, Errors, Page, PageProps } from '@inertiajs/core';\n\ninterface SharedProps {\n auth: AuthContext;\n errors: Errors & ErrorBag;\n}\n\ninterface AppPage extends Page {\n props: PageProps & SharedProps;\n}\n\nexport function useAuth(): AuthContext {\n const { props } = usePage() as AppPage;\n\n return props.auth;\n}\n","import { useEffect } from 'react';\n\nexport function useClickOutside(ref: any, handler: (e: Event) => void) {\n useEffect(\n () => {\n const listener = (event: Event) => {\n // Do nothing if clicking ref's element or descendent elements\n if (!ref.current || ref.current.contains(event.target)) {\n return;\n }\n handler(event);\n };\n\n document.addEventListener('mousedown', listener);\n document.addEventListener('touchstart', listener);\n\n return () => {\n document.removeEventListener('mousedown', listener);\n document.removeEventListener('touchstart', listener);\n };\n },\n [ref, handler]\n );\n}\n","import type { VisitOptions } from '@inertiajs/core';\nimport { useToast } from './toast';\n\ninterface Options {\n successMessage?: string;\n}\n\nexport function useInertiaOptions({ successMessage = '' }: Options = {}): VisitOptions {\n const { addToast } = useToast();\n\n return {\n onSuccess: () => {\n addToast({\n message: successMessage ?? 'Your request was successful.',\n status: 'success',\n });\n },\n onError: (errors) => {\n Object.values(errors).forEach((err) => {\n addToast({\n message: err,\n status: 'error',\n });\n });\n }\n }\n}\n","import { useState } from \"react\";\n\nexport function useLocalStorage<T>(key: string, initialValue: T) {\n // State to store our value\n // Pass initial state function to useState so logic is only executed once\n const [storedValue, setStoredValue] = useState<T>(() => {\n if (typeof window === \"undefined\") {\n return initialValue;\n }\n try {\n // Get from local storage by key\n const item = window.localStorage.getItem(key);\n // Parse stored json or if none return initialValue\n return item ? JSON.parse(item) : initialValue;\n } catch (error) {\n // If error also return initialValue\n console.log(error);\n return initialValue;\n }\n });\n // Return a wrapped version of useState's setter function that ...\n // ... persists the new value to localStorage.\n const setValue = (value: T | ((val: T) => T)) => {\n try {\n // Allow value to be a function so we have same API as useState\n const valueToStore =\n value instanceof Function ? value(storedValue) : value;\n // Save state\n setStoredValue(valueToStore);\n // Save to local storage\n if (typeof window !== \"undefined\") {\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n }\n } catch (error) {\n // A more advanced implementation would handle the error case\n console.log(error);\n }\n };\n\n return [storedValue, setValue] as const;\n}\n"],"names":["parseDate","dateString","parse","substring","Date","parseDateTime","dateTimeString","round","value","Number","Math","parseFloat","getGst","addGst","subtractGst","formatMoney","decimals","toFormat","replace","toLocaleString","minimumFractionDigits","maximumFractionDigits","formatNumber","sanitiseVehicleType","inputType","type","ToastContext","React","toasts","addToast","t","removeToast","useToast","initialData","id","undefined","status","source","reference","client_number","first_name","last_name","phone","mobile","email","licence","licence_other","promo_code","club_membership_number","length_of_insurance","dob","club_id","street_address","address","unit","suburb","city","post_code","declaration","had_incident","incidents","has_demerit_points","demerit_points","has_lost_licence","lost_licence_details","was_refused_insurance","refused_insurance_details","has_criminal_conviction","criminal_conviction_details","has_vehicle_modifications","vehicle_modifications_details","has_previous_insurer","previous_insurer_details","previous_insurer_expires_at","additional_details","vehicles","purchase_options","theme","broker_fee","broker_id","broker_firm_id","agent_id","agent_firm_id","staff_member_id","sent_at","sold_at","referrer_id","referrer_category_id","pricing_expires_at","follow_up_at","is_follow_up_required","QuoteRequestFormContext","createContext","useQuoteRequestForm","useContext","QuoteRequestOptionsContext","setOptions","search","q","encodeURIComponent","_context","fetch","baseUrl","res","ok","json","data","completions","completion","_context2","pxid","calculateAge","date","today","birthDate","age","getFullYear","m","getMonth","getDate","calcMonthlyEnhancementPrice","enhancement","premium","monthlyPremium","disable_rounding","ceil","fixRoundingError","Button","className","href","target","onClick","children","disabled","as","classes","e","includes","Link","Card","ToastItem","_id","message","Transition","show","appear","enter","enterFrom","enterTo","leave","leaveFrom","leaveTo","defaultClasses","title","xmlns","fill","viewBox","stroke","strokeLinecap","strokeLinejoin","strokeWidth","d","conditionOptions","name","onChange","maxYear","showAge","dayOptions","Array","from","keys","map","padStart","months","monthOptions","yearOptions","handleChange","currentTarget","y","year","month","day","split","isValidDate","isNaN","required","option","key","heading","errors","renderKeys","Object","values","length","entries","field","populatePurchaseOptions","form","useState","setKeys","isDev","setDev","handlePopulate","setData","prevData","description","make","model","registration","vehicle_type","product","is_heavy","usage","storage_location","has_financially_interested_party","financially_interested_party_detail","owned_duration","drivers","relationship","premium_type","level_of_insurance_id","authorised_drivers","excess_details","terms","monthly_premium","show_monthly","fsl","sort_order","enhancements","auto_select","handleKeydown","prevKeys","useEffect","join","window","location","addEventListener","removeEventListener","isActive","onClose","Root","Fragment","Dialog","Child","Overlay","displayValue","newValue","meta","showPerPageSelector","current_page","per_page","page_count","total","nextPageLink","URLSearchParams","set","String","toString","getNextPageLink","prevPageLink","getPrevPageLink","_window","useForm","Provider","parts","options","initialRegistrationValue","onVehicleDataFound","apiUrl","showOdometerReadingField","showConditionField","outerClassName","odoInputClassName","conditionSelectClassName","regoInputClassName","searchBtnClassName","rego","setRego","odo","setOdo","condition","setCondition","setStatus","toUpperCase","handleSearch","query","odometerReading","headers","Content-Type","timeout","_yield$res$json","vehicleData","vehicle","weight","parseInt","replaceAll","vehicleType","cn","onKeyDown","pointer-events-none opacity-50","conditionOption","placeholder","has_more_pages","to","w-0 whitespace-nowrap","condensed","sort","textAlign","sortLink","setSortLink","direction","get","textAlignClass","bgClass","setToasts","curr","filter","toast","newToast","uuid","setTimeout","selectedEnhancements","brokerFee","monthly","reduce","acc","_option$enhancements","find","enhancementPremium","calculateMonthly","annually","_option$enhancements2","calculateAnnually","monthlyWithGst","annuallyWithGst","includeTime","formatString","parsed","format","input","gst","amountInclusive","amountExclusive","sanitiseQuoteRequestFormData","isArray","item","usePage","props","auth","ref","handler","listener","event","current","contains","document","successMessage","onSuccess","onError","forEach","err","initialValue","localStorage","getItem","JSON","error","console","log","storedValue","setStoredValue","valueToStore","Function","setItem","stringify"],"mappings":"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"}
1
+ {"version":3,"file":"sdk.cjs.production.min.js","sources":["../src/lib/dates.ts","../src/lib/money.ts","../src/lib/vehicles.ts","../src/lib/toast.tsx","../src/lib/quoteRequestForm.tsx","../src/lib/quoteRequestOptions.tsx","../src/lib/addressFinder.tsx","../src/lib/calculateAge.ts","../src/lib/calculatePricing.tsx","../src/components/common/Button.tsx","../src/components/common/Card.tsx","../src/components/common/ToastItem.tsx","../src/components/forms/RegistrationSearchField.tsx","../src/components/forms/DateOfBirthField.tsx","../src/components/forms/ErrorList.tsx","../src/components/forms/FormTester.tsx","../src/components/common/Modal.tsx","../src/components/forms/MoneyField.tsx","../src/components/common/Pagination.tsx","../src/components/common/SimplePagination.tsx","../src/components/tables/Table.tsx","../src/components/tables/TableActions.tsx","../src/components/tables/TableBody.tsx","../src/components/tables/TableCell.tsx","../src/components/tables/TableHead.tsx","../src/components/tables/TableHeader.tsx","../src/components/tables/TableRow.tsx","../src/components/common/Toasts.tsx","../src/lib/auth.tsx","../src/lib/clickOutside.tsx","../src/lib/inertiaOptions.tsx","../src/lib/localStorage.tsx"],"sourcesContent":["import { format, parse } from \"date-fns\";\n\nexport function parseDate(dateString: string): Date {\n // Make sure we've only got 10 characters\n return parse(dateString.substring(0, 10), 'yyyy-MM-dd', new Date());\n}\n\nexport function parseDateTime(dateTimeString: string): Date {\n return parse(dateTimeString, 'yyyy-MM-dd HH:mm:ss', new Date());\n}\n\n/**\n * Formats a date like \"Jan 1, 2022 at 9:50am\"\n */\nexport function formatDateNice(date: string, includeTime: boolean = true) {\n const formatString = includeTime ? \"MMM d, yyyy 'at' h:mma\" : 'MMM d, yyyy';\n const parsed = includeTime ? parseDateTime(date) : parseDate(date);\n\n return format(parsed, formatString);\n}\n\n/**\n * Formats a date like \"01/01/2022 9:50AM\"\n */\nexport function formatDateForTable(date: string, includeTime: boolean = true) {\n const formatString = includeTime ? 'dd/MM/yyyy h:mma' : 'dd/MM/yyyy';\n const parsed = includeTime ? parseDateTime(date) : parseDate(date);\n\n return format(parsed, formatString);\n}\n","/**\n * Safely rounds a number\n */\nexport function round(value: number): number {\n return Number(Math.round(parseFloat(value + 'e' + 2)) + 'e-' + 2)\n}\n\n/**\n * Gets the GST value from a number\n */\nexport function getGst(value: number): number {\n return round(value * 3 / 23);\n}\n\n/**\n * Adds GST to a number\n */\nexport function addGst(value: number): number {\n return round(value * 1.15);\n}\n\n/**\n * Subtracts GST from a number\n */\nexport function subtractGst(value: number): number {\n return round(value - getGst(value));\n}\n\n/**\n * Calculates the various GST values on a figure\n */\nexport function gstCalc(input: number|string): {\n gst: number,\n amountInclusive: number,\n amountExclusive: number\n} {\n let value = input;\n\n if (typeof value === 'string') {\n value = parseFloat(value.replace(/[^0-9.]/g, ''));\n }\n\n value = round(value);\n\n return {\n gst: getGst(value),\n amountInclusive: addGst(value),\n amountExclusive: subtractGst(value)\n }\n}\n\n/**\n * Formats a value nicely\n */\n export function formatMoney(value: string|number, decimals: number = 2): string {\n let toFormat = value;\n if (typeof value === 'string') {\n toFormat = value.replace(/[^\\d.-]/g, '')\n }\n\n return Number(toFormat).toLocaleString('en', {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n });\n}\n\n/**\n * Turns a formatted value in to a float\n */\nexport function formatNumber(value: string): number {\n return parseFloat(value.replace(/[^0-9.]/g, ''));\n}\n","import { VehicleType } from \"../types\";\n\nexport function sanitiseVehicleType(inputType: string): VehicleType {\n let type: VehicleType;\n\n switch (inputType) {\n case 'Camper':\n case 'Goods Van/Truck/Utility':\n case 'Bus':\n case 'Motor Caravan':\n case 'Trailer/Caravan':\n case 'TRAILER_CARAVAN':\n case 'TRAILER_NOT_DESIGNED_FOR_HIGHWAY_USE':\n case 'MOBILE_MACHINE':\n case 'GOODS_VAN_TRUCK_UTILITY':\n case 'BUS':\n case 'MOTOR_CARAVAN': {\n type = 'motorhome';\n break;\n }\n\n case 'Motorcycle':\n case 'Moped':\n case 'ATV':\n case 'Agricultural Machine':\n case 'MOTORCYCLE':\n case 'MOPED':\n case 'TRACTOR':\n case 'AGRICULTURAL_MACHINE':\n case 'HIGH_SPEED_AGRICULTURAL_VEHICLE': {\n type = 'motorcycle';\n break;\n }\n\n case 'Passenger Car/Van':\n case 'PASSENGER_CAR_VAN':\n case 'SPECIAL_PURPOSE_VEHICLE':\n case 'UNKNOWN':\n default:\n type = 'car';\n }\n\n return type;\n}\n","import * as React from 'react';\nimport type { Toast } from \"../types\";\nimport { v4 as uuid } from 'uuid';\n\ninterface ToastContextInterface {\n toasts: Toast[];\n addToast: (toast: Toast) => void;\n removeToast: (id: Toast['_id']) => void;\n}\n\nconst ToastContext = React.createContext<ToastContextInterface>({\n toasts: [],\n addToast: (t: Toast) => {t},\n removeToast: (t: Toast['_id']) => {t},\n});\n\nexport function ToastProvider({ children }: any) {\n const [toasts, setToasts] = React.useState<Toast[]>([]);\n\n /**\n * Add a new toast popup message\n */\n function addToast({ message, status, timeout = 4000 }: Toast) {\n const newToast: Toast = { message, status, timeout };\n\n newToast._id = uuid();\n\n setToasts(curr => [...curr, newToast]);\n\n setTimeout(() => {\n removeToast(newToast._id);\n }, timeout);\n }\n\n /**\n * Remove a toast message\n */\n function removeToast(id: Toast['_id']) {\n setToasts(curr => curr.filter(toast => toast._id !== id));\n }\n\n const context: ToastContextInterface = {\n toasts,\n addToast,\n removeToast,\n }\n\n return (\n <ToastContext.Provider value={context}>\n {children}\n </ToastContext.Provider>\n );\n}\n\nexport const useToast = () => React.useContext(ToastContext);\n","import React from 'react';\nimport { useForm } from \"@inertiajs/react\";\nimport { InertiaFormProps } from \"@inertiajs/react/types/useForm\";\nimport type { QuoteRequest } from '../types';\n\ntype QuoteRequestForm = QuoteRequest & Record<string, any>;\n\ninterface QuoteRequestFormContextInterface {\n form?: InertiaFormProps<QuoteRequestForm>;\n handleChange?: (e: React.ChangeEvent<HTMLInputElement|HTMLTextAreaElement|HTMLSelectElement>) => void;\n}\n\nexport const initialData: QuoteRequestForm = {\n id: undefined,\n status: 'new',\n source: 'phone',\n reference: '',\n client_number: '',\n first_name: '',\n last_name: '',\n phone: '',\n mobile: '',\n email: '',\n licence: '',\n licence_other: '',\n promo_code: '',\n club_membership_number: '',\n length_of_insurance: '',\n dob: '',\n club_id: undefined,\n street_address: {\n address: '',\n unit: '',\n suburb: '',\n city: '',\n post_code: '',\n },\n declaration: {\n had_incident: undefined,\n incidents: [],\n has_demerit_points: undefined,\n demerit_points: '',\n has_lost_licence: undefined,\n lost_licence_details: '',\n was_refused_insurance: undefined,\n refused_insurance_details: '',\n has_criminal_conviction: undefined,\n criminal_conviction_details: '',\n has_vehicle_modifications: undefined,\n vehicle_modifications_details: '',\n has_previous_insurer: undefined,\n previous_insurer_details: '',\n previous_insurer_expires_at: '',\n additional_details: '',\n },\n vehicles: [],\n // Portal specific fields:\n purchase_options: [],\n theme: '',\n broker_fee: undefined,\n broker_id: undefined,\n broker_firm_id: undefined,\n agent_id: undefined,\n agent_firm_id: undefined,\n staff_member_id: undefined,\n sent_at: undefined,\n sold_at: undefined,\n referrer_id: undefined,\n referrer_category_id: undefined,\n pricing_expires_at: undefined,\n follow_up_at: undefined,\n is_follow_up_required: true,\n}\n\nexport const QuoteRequestFormContext = React.createContext<QuoteRequestFormContextInterface>({});\n\nexport function QuoteRequestFormProvider({ children }: { children: React.ReactNode }) {\n const form = useForm(initialData);\n\n /**\n * Handle the change event for all form inputs\n */\n function handleChange(e: React.SyntheticEvent<HTMLInputElement|HTMLTextAreaElement|HTMLSelectElement>) {\n const { name } = e.currentTarget;\n let value: string|boolean|undefined = e.currentTarget.value;\n\n if (e.currentTarget.type === 'checkbox' || e.currentTarget.type === 'radio') {\n const target = e.currentTarget as HTMLInputElement;\n value = target.value === '1' ? true : false;\n }\n\n if (name.includes('.')) {\n const parts = name.split('.');\n\n if (parts.length === 2) {\n return form.setData(prevData => ({\n ...prevData,\n [parts[0]]: {\n // @ts-ignore TODO: Maybe fix these TS errors\n ...prevData[parts[0]],\n [parts[1]]: value,\n },\n }));\n } else {\n // We don't want to handle anything double-nested. These should be handled by their own local state.\n return;\n }\n }\n\n return form.setData(prevData => ({\n ...prevData,\n [name]: value,\n }));\n }\n\n return (\n <QuoteRequestFormContext.Provider value={{ form, handleChange }}>\n {children}\n </QuoteRequestFormContext.Provider>\n );\n}\n\n/**\n * Takes in a quote request and returns data suitable to populate a form\n * by recursively calling this function, converting null to undefined.\n */\n export function sanitiseQuoteRequestFormData(value: any): any {\n if (Array.isArray(value)) {\n return value.map(item => sanitiseQuoteRequestFormData(item));\n }\n\n if (value === null) {\n return \"\";\n }\n\n if (typeof value === 'object') {\n // Map over each property and convert null to undefined\n return Object.keys(value).reduce((acc, key) => {\n // @ts-ignore\n acc[key] = sanitiseQuoteRequestFormData(value[key]);\n return acc;\n }, {});\n }\n\n return value;\n}\n\nexport const useQuoteRequestForm = () => React.useContext(QuoteRequestFormContext);\n","import React from 'react';\nimport { QuoteRequestOptions } from '../types';\n\ninterface QuoteRequestFormContextInterface {\n options?: QuoteRequestOptions;\n setOptions: (options: QuoteRequestOptions) => void;\n}\n\nconst QuoteRequestOptionsContext = React.createContext<QuoteRequestFormContextInterface>({ setOptions: () => {} });\n\nexport function QuoteRequestOptionsProvider({ children }: { children: React.ReactNode }) {\n const [options, setOptions] = React.useState<QuoteRequestOptions>();\n\n return (\n <QuoteRequestOptionsContext.Provider value={{ options, setOptions }}>\n {children}\n </QuoteRequestOptionsContext.Provider>\n )\n}\n\nexport const useQuoteRequestOptions = () => React.useContext(QuoteRequestOptionsContext);\n","const prodConfig = {\n key: 'XVAKN4Q9PREJD8CUTFBW',\n baseUrl: 'https://api.addressfinder.io/api/nz/address',\n}\n\nconst config = prodConfig;\n\ninterface AutocompleteResponse {\n completions: AddressCompletion[];\n paid: boolean;\n demo: boolean;\n success: boolean;\n}\n\nexport interface AddressCompletion {\n a: string;\n pxid: string;\n v: number;\n}\n\nexport interface AddressData {\n pxid: string;\n a: string;\n aims_address_id: string;\n sufi: number;\n ta_id: string;\n ta: string;\n tasub_id: string;\n tasub: string;\n number: string;\n x: string;\n y: string;\n postcode: string;\n street: string;\n street_name: string;\n street_type: string;\n city: string;\n suburb: string;\n region_id: string;\n region: string;\n postal_line_1: string;\n postal_line_2: string;\n aims_road_section_id: string;\n rural: string;\n address_line_1: string;\n address_line_2?: string;\n primary_parcel_id: string;\n meshblock: string;\n sa1_id: string;\n sa2_id: string;\n sa2: string;\n cb_id: string;\n cb: string;\n ward_id: string;\n ward: string;\n con_id: string;\n con: string;\n maoricon_id: string;\n maoricon: string;\n iur_id: string;\n iur: string;\n ur_id: string;\n ur: string;\n landwater_id: string;\n landwater: string;\n success: boolean;\n}\n\nexport async function autocomplete(search: string): Promise<AddressCompletion[]> {\n const { key, baseUrl } = config;\n const q = encodeURIComponent(search);\n\n const res = await fetch(`${baseUrl}/autocomplete/?key=${key}&q=${q}&format=json&strict=2`);\n\n if (!res.ok) {\n return [];\n }\n\n const data: AutocompleteResponse = await res.json();\n\n if (data.completions) {\n return data.completions;\n }\n\n return [];\n}\n\nexport async function getAddressData(completion: AddressCompletion): Promise<AddressData|null> {\n const { key, baseUrl } = config;\n\n const res = await fetch(`${baseUrl}/metadata/?key=${key}&pxid=${completion.pxid}&format=json`);\n\n if (!res.ok) {\n return null;\n }\n\n const data: AddressData = await res.json();\n\n return data;\n}\n","/**\n * Calculate someone's age from a date of birth.\n * @param date YYYY-MM-DD\n */\n export function calculateAge(date: string): number {\n const today = new Date();\n\n const birthDate = new Date(date);\n\n const age = today.getFullYear() - birthDate.getFullYear();\n\n const m = today.getMonth() - birthDate.getMonth();\n\n if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {\n return age - 1;\n }\n\n return age;\n}\n","import { addGst } from \"./money\";\nimport type { PolicyEnhancement, QuoteRequestPurchaseOption } from \"../types\";\n\ninterface CalculationArguments {\n option: QuoteRequestPurchaseOption;\n selectedEnhancements: PolicyEnhancement['id'][];\n brokerFee?: number;\n}\n\nfunction calculateMonthly({ option, selectedEnhancements }: CalculationArguments) {\n const premium = option.monthly_premium || 0;\n\n const enhancementsCost = selectedEnhancements.reduce((acc, id) => {\n const enhancement = option.enhancements?.find(e => e.id === id);\n if (!enhancement) return acc;\n const enhancementPremium = calcMonthlyEnhancementPrice(enhancement);\n\n if (!acc) {\n return enhancementPremium;\n }\n\n return acc + enhancementPremium;\n }, 0) || 0;\n\n return premium + enhancementsCost;\n}\n\nfunction calculateAnnually({ option, selectedEnhancements, brokerFee = 0 }: CalculationArguments) {\n const premium = option.premium || 0;\n const fsl = option.fsl || 0;\n const enhancementsCost = selectedEnhancements.reduce((acc, id) => {\n const enhancement = option.enhancements?.find(e => e.id === id);\n if (!enhancement) return acc;\n return (acc || 0) + (enhancement.premium || 0);\n }, 0) || 0;\n\n return premium + fsl + enhancementsCost + brokerFee;\n}\n\nexport function calcMonthlyEnhancementPrice(enhancement: PolicyEnhancement): number {\n if (!enhancement.premium) return 0;\n\n const monthlyPremium = (enhancement.premium / 100) / 12;\n\n if (enhancement.disable_rounding) {\n return Math.round(monthlyPremium * 100);\n }\n\n return Math.round(Math.ceil(monthlyPremium) * 100);\n}\n\n/**\n * Fix rounding errors we get from subtracting, and then adding GST back on\n * (Issues with 2 decimal place rounding)\n */\n export function fixRoundingError(premium: number) {\n // If the premium ends in \"01\" then we need to round it down\n if (premium % 100 === 1) {\n return premium - 1;\n }\n\n // If the premium ends in \"99\" then we need to round it up\n if (premium % 100 === 99) {\n return premium + 1;\n }\n\n return premium;\n}\n\nexport function calcPurchaseOptionPricing({ option, selectedEnhancements, brokerFee = 0 }: CalculationArguments) {\n const monthly = calculateMonthly({ option, selectedEnhancements });\n const annually = calculateAnnually({ option, selectedEnhancements, brokerFee });\n\n const monthlyWithGst = fixRoundingError(Math.round(addGst(monthly)));\n const annuallyWithGst = fixRoundingError(Math.round(addGst(annually)));\n\n return {\n monthly,\n annually,\n monthlyWithGst,\n annuallyWithGst,\n };\n}\n","import React from 'react';\nimport { Link } from '@inertiajs/react';\n\ninterface Props {\n className?: string;\n href?: string;\n target?: '_blank' | '_self';\n onClick?: Function;\n type?: 'button' | 'submit';\n status?: 'primary' | 'danger' | 'warning' | 'info' | 'default';\n children: React.ReactNode;\n disabled?: boolean;\n as?: 'link' | 'button' | 'a';\n}\n\nexport default function Button({\n className,\n href,\n target,\n onClick,\n type,\n children,\n status = 'default',\n disabled = false,\n as,\n}: Props) {\n const baseClasses =\n 'font-black inline-flex items-center gap-3 justify-center text-white text-center px-5 py-2 rounded-md min-w-[120px] transition-all hover:opacity-75';\n\n const statusClass =\n (status === 'primary' && 'bg-teal') ||\n (status === 'danger' && 'bg-red-500') ||\n (status === 'warning' && 'bg-yellow-400') ||\n (status === 'info' && 'bg-blue-400') ||\n 'bg-gray-600';\n\n const classes = `${className ?? ''} ${baseClasses} ${statusClass}`;\n\n if (onClick) {\n return (\n <button\n className={classes}\n type={type ?? 'button'}\n onClick={(e: React.MouseEvent) => onClick(e)}\n disabled={disabled}\n >\n {children}\n </button>\n );\n }\n\n if (type) {\n return (\n <button className={classes} type={type ?? 'button'} disabled={disabled}>\n {children}\n </button>\n );\n }\n\n if (href) {\n if (href.includes('http') || target === '_blank' || as === 'a') {\n return (\n <a href={href} target={target ?? '_self'} className={classes}>\n {children}\n </a>\n );\n }\n\n return (\n <Link href={href} className={classes}>\n {children}\n </Link>\n );\n }\n\n return <p className=\"text-red-500 text-sm\">[Invalid button]</p>;\n}\n","import React from 'react';\n\ninterface Props {\n className?: string;\n children: React.ReactNode;\n}\n\nexport default function Card({ className, children }: Props) {\n return (\n <div className={`${className ?? ''} flex flex-col items-start bg-white rounded-md shadow-sm border border-gray-300 p-4 md:p-6`}>\n {children}\n </div>\n );\n}\n","import React from 'react';\nimport { Transition } from '@headlessui/react';\nimport type { Toast } from '../../types';\nimport { useToast } from '../../lib/toast';\n\nexport default function ToastItem({ _id = '', message, status = 'default' }: Toast) {\n const { removeToast } = useToast();\n\n const defaultClasses = 'w-full min-w-[250px] p-4 shadow flex justify-between items-center font-black rounded-md not:';\n\n const statusClasses = status === 'success' && 'bg-teal text-white'\n || status === 'error' && 'bg-red-500 text-white'\n || status === 'warning' && 'bg-yellow-400 text-white'\n || 'bg-white text-asphalt';\n\n const classes = `${defaultClasses} ${statusClasses}`;\n\n function handleClick() {\n removeToast(_id);\n }\n\n return (\n <Transition\n show={true}\n appear={true}\n enter=\"transition-all duration-300\"\n enterFrom=\"opacity-0 translate-y-4\"\n enterTo=\"opacity-100 translate-y-0\"\n leave=\"transition-all duration-300\"\n leaveFrom=\"opacity-100 translate-y-0\"\n leaveTo=\"opacity-0 translate-y-2\"\n >\n <div className={classes}>\n <p>{message}</p>\n <button className=\"\" onClick={handleClick} title=\"Close message\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n className=\"h-6 w-6\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n </Transition>\n )\n}\n","import React from 'react';\nimport { sanitiseVehicleType } from '../../lib';\nimport {\n ApiResponse,\n FormStatus,\n MotorwebVehicleResponse,\n VehicleType,\n} from '../../types';\nimport { useToast } from '../../lib/toast';\nimport cn from 'classnames';\n\nexport interface VehicleData extends MotorwebVehicleResponse {\n make: string;\n model: string;\n year: string;\n vehicle_type: VehicleType;\n is_heavy: boolean;\n}\n\nexport interface RegistrationSearchOnChange {\n registration: string;\n}\n\ninterface Props {\n name?: string;\n onChange?: (values: RegistrationSearchOnChange) => void;\n onVehicleDataFound: (vehicleData: VehicleData) => void;\n apiUrl?: string;\n showOdometerReadingField?: boolean;\n showConditionField?: boolean;\n initialRegistrationValue?: string;\n outerClassName?: string;\n odoInputClassName?: string;\n conditionSelectClassName?: string;\n regoInputClassName?: string;\n searchBtnClassName?: string;\n}\n\nexport const conditionOptions = [\n 'POOR',\n 'FAIR',\n 'AVERAGE',\n 'GOOD',\n 'VERY_GOOD',\n 'AS_NEW',\n 'NEW',\n];\n\nexport default function RegistrationSearchField({\n name = 'registration_search',\n initialRegistrationValue = '',\n onVehicleDataFound,\n apiUrl = '/api/rego-search',\n showOdometerReadingField = false,\n showConditionField = false,\n onChange,\n outerClassName,\n odoInputClassName,\n conditionSelectClassName,\n regoInputClassName,\n searchBtnClassName,\n}: Props) {\n const [rego, setRego] = React.useState<string>(initialRegistrationValue);\n const [odo, setOdo] = React.useState<string>('');\n const [condition, setCondition] = React.useState<string>('GOOD');\n\n const [status, setStatus] = React.useState<FormStatus>('idle');\n const { addToast } = useToast();\n\n function handleChange(\n e: React.SyntheticEvent<HTMLInputElement | HTMLSelectElement>\n ) {\n if (e.currentTarget.name === name) {\n setRego(e.currentTarget.value?.toUpperCase() || '');\n }\n\n if (e.currentTarget.name === 'odo_search') {\n setOdo(e.currentTarget.value);\n }\n\n if (e.currentTarget.name === 'condition_search') {\n setCondition(e.currentTarget.value);\n }\n\n if (onChange) {\n onChange({ registration: e.currentTarget.value.toUpperCase() });\n }\n }\n\n function handleKeydown(e: React.KeyboardEvent) {\n if (e.key === 'Enter') {\n handleSearch();\n }\n }\n\n async function handleSearch() {\n setStatus('processing');\n\n const payload = {\n registration: rego,\n odometerReading: odo,\n condition,\n };\n\n // Turn the payload in to a query string\n // @ts-ignore\n const query = new URLSearchParams(payload).toString();\n\n const res = await fetch(`${apiUrl}?${query}`, {\n headers: { 'Content-Type': 'application/json' },\n });\n\n if (!res.ok) {\n addToast({\n message: `There was an error with the provided registration.`,\n status: 'error',\n timeout: 3000,\n });\n setStatus('error');\n return;\n }\n\n const { data, ok }: ApiResponse<MotorwebVehicleResponse> = await res.json();\n\n if (!ok || !data) {\n addToast({\n message: `Failed to find vehicle, please complete manually.`,\n status: 'error',\n timeout: 3000,\n });\n setStatus('error');\n return;\n }\n\n const vehicleData = data.data.vehicle;\n\n const make = vehicleData.make;\n const model = vehicleData.model;\n const year = vehicleData['year-of-manufacture'];\n const weight = vehicleData['gross-vehicle-mass']\n ? parseInt(vehicleData['gross-vehicle-mass'].replaceAll(',', ''))\n : 0;\n const vehicleType = vehicleData['vehicle-type'];\n\n if (!make || !model || !year || !vehicleType) {\n addToast({\n message: `We couldn't find all of your data, please complete manually.`,\n status: 'error',\n timeout: 3000,\n });\n setStatus('error');\n }\n\n onVehicleDataFound({\n ...data,\n make: make || '',\n model: model || '',\n year: year || '',\n vehicle_type: vehicleType ? sanitiseVehicleType(vehicleType) : 'car',\n is_heavy: (weight && weight > 3500) || false,\n });\n\n setStatus('success');\n }\n\n return (\n <div className=\"w-full flex flex-col\">\n <div className={cn(outerClassName, \"w-full flex flex-wrap gap-3 bg-gray-100 rounded-md p-3\")}>\n {showOdometerReadingField ||\n (showConditionField && (\n <div className=\"w-full grid grid-cols-2 gap-3\">\n {showOdometerReadingField && (\n <label>\n Approx. km travelled\n <input\n onKeyDown={handleKeydown}\n type=\"number\"\n name=\"odo_search\"\n id=\"odo_search\"\n value={odo}\n onChange={handleChange}\n className={cn(odoInputClassName, \"transition-all\", {\n 'pointer-events-none opacity-50': status === 'processing',\n })}\n disabled={status === 'processing'}\n />\n </label>\n )}\n\n {showConditionField && (\n <label>\n Vehicle condition\n <select\n name=\"condition_search\"\n id=\"condition_search\"\n value={condition}\n onChange={handleChange}\n className={cn(conditionSelectClassName, \"transition-all\", {\n 'pointer-events-none opacity-50': status === 'processing',\n })}\n disabled={status === 'processing'}\n >\n {conditionOptions.map(conditionOption => (\n <option key={conditionOption}>{conditionOption}</option>\n ))}\n </select>\n </label>\n )}\n </div>\n ))}\n\n <input\n onKeyDown={handleKeydown}\n placeholder=\"Search for your rego\"\n type=\"text\"\n name={name}\n id={name}\n value={rego}\n onChange={handleChange}\n className={cn(regoInputClassName, \"flex-grow transition-all\", {\n 'pointer-events-none opacity-50': status === 'processing',\n })}\n disabled={status === 'processing'}\n />\n\n <button\n title=\"Search\"\n type=\"button\"\n onClick={handleSearch}\n disabled={status === 'processing'}\n className={cn(searchBtnClassName, \"bg-teal px-4 py-3 rounded-md transition-all\")}\n >\n <span className=\"sr-only\">Search</span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-5 w-5 text-white\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n </button>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { calculateAge } from '../../lib';\nimport { padStart } from 'lodash';\n\ninterface Props {\n name?: string;\n id?: string;\n onChange: (dateString: string) => void;\n value?: string;\n maxYear?: number;\n showAge?: boolean;\n}\n\nexport default function DateOfBirthField({\n name = 'dob',\n id = 'dob',\n onChange,\n value,\n maxYear = 0,\n showAge = false,\n}: Props) {\n const dayOptions = [...Array.from(Array(31).keys())].map(value => {\n return padStart(`${value + 1}`, 2, '0');\n });\n\n const months = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ];\n const monthOptions = [...Array.from(Array(12).keys())].map(value => {\n return {\n title: months[value],\n value: padStart(`${value + 1}`, 2, '0'),\n };\n });\n\n // Create 100 years of options, subtracting the maximum year if provided\n const yearOptions = [...Array.from(Array(100).keys())].map(value => {\n return maxYear ? maxYear - value : new Date().getFullYear() - value;\n });\n\n function handleChange(\n e: React.ChangeEvent<\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n >\n ) {\n const { name, value } = e.currentTarget;\n\n let y = name.includes('year') ? value : year;\n let m = name.includes('month') ? value : month;\n let d = name.includes('day') ? value : day;\n\n onChange(`${y}-${m}-${d}`);\n }\n\n const [year, month, day] = value ? value.split('-') : ['', '', ''];\n const isValidDate =\n year && month && day && !isNaN(Date.parse(`${year}-${month}-${day}`));\n\n return (\n <span className=\"flex flex-col gap-2\">\n <span className=\"flex space-x-4 border border-gray-300 rounded-lg bg-white\">\n <select\n name={`${name}_day`}\n id={`${id}_day`}\n value={day}\n className=\"flex-grow focus:outline-none border-0\"\n onChange={handleChange}\n required\n >\n <option value=\"\">Day</option>\n {dayOptions.map(option => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </select>\n <select\n name={`${name}_month`}\n id={`${id}_month`}\n value={month}\n className=\"flex-grow focus:outline-none border-0\"\n onChange={handleChange}\n required\n >\n <option value=\"\">Month</option>\n {monthOptions.map(option => (\n <option key={option.value} value={option.value}>\n {option.title}\n </option>\n ))}\n </select>\n <select\n name={`${name}_year`}\n id={`${id}_year`}\n value={year}\n className=\"flex-grow focus:outline-none border-0\"\n onChange={handleChange}\n required\n >\n <option value=\"\">Year</option>\n {yearOptions.map(option => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </select>\n </span>\n {showAge && value && isValidDate && (\n <span className=\"font-bold\">Age: {calculateAge(value)} years</span>\n )}\n </span>\n );\n}\n","import React from 'react';\nimport { ErrorBag, Errors } from '@inertiajs/core';\nimport { Card } from '../common';\n\ninterface Props {\n heading?: string;\n errors?: Errors & ErrorBag;\n renderKeys?: boolean;\n className?: string;\n}\n\nexport default function ErrorList({\n heading = 'There was an error with your submission.',\n errors = {},\n renderKeys = false,\n className = '',\n}: Props) {\n if (Object.values(errors).length === 0) {\n return <></>;\n }\n\n return (\n <aside className={`${className} col-span-full`}>\n <Card className=\"border border-red-500 !bg-red-50\">\n <h2 className=\"font-black text-red-500 mb-2\">{heading}</h2>\n <ul className=\"space-y-2 list-disc ml-4\">\n {Object.entries(errors).map(([field, message]) => (\n <li className=\"font-bold text-red-500\" key={field}>\n {renderKeys && <strong>{field}: </strong>}\n {message}\n </li>\n ))}\n </ul>\n </Card>\n </aside>\n );\n}\n","import React from 'react';\nimport { Button } from '../common';\nimport { useQuoteRequestForm } from '../../lib';\n\ninterface Props {\n populatePurchaseOptions: boolean;\n}\n\nexport default function FormTester({ populatePurchaseOptions = false }: Props) {\n const { form } = useQuoteRequestForm();\n const [keys, setKeys] = React.useState<string[]>([]);\n const [isDev, setDev] = React.useState<boolean>(false);\n\n function handlePopulate() {\n form?.setData(prevData => ({\n ...prevData,\n first_name: 'TEST',\n last_name: 'TEST',\n email: 'dev@sual.co.nz',\n phone: '021 234 5678',\n mobile: '021 234 5678',\n dob: '1990-01-01',\n licence: 'Other',\n licence_other: 'Test',\n club_id: 50,\n club_membership_number: '12345',\n street_address: {\n address: '123 Street Name',\n unit: 'Level 1',\n suburb: 'Suburb',\n city: 'Auckland',\n post_code: '1234',\n },\n promo_code: 'TEST',\n declaration: {\n had_incident: true,\n incidents: [{\n description: 'Lorem ipsum dolor sit amet.',\n month: 'January',\n year: '2020',\n }],\n has_demerit_points: true,\n demerit_points: '1-24',\n has_lost_licence: true,\n lost_licence_details: 'Lorem ipsum dolor sit amet.',\n was_refused_insurance: true,\n refused_insurance_details: 'Lorem ipsum dolor sit amet.',\n has_criminal_conviction: true,\n criminal_conviction_details: 'Lorem ipsum dolor sit amet.',\n has_vehicle_modifications: true,\n vehicle_modifications_details: 'Lorem ipsum dolor sit amet.',\n has_previous_insurer: true,\n previous_insurer_details: 'AA',\n previous_insurer_expires_at: '2020-01-01',\n additional_details: 'I am a robot, beep boop. Please ignore this submission.',\n },\n vehicles: [\n {\n make: 'Tesla',\n model: 'Cybertruck',\n year: '2023',\n registration: 'ELMUSK',\n vehicle_type: 'car',\n product: 'star-enthusiast-prestige-everyday-plus',\n value: 100000,\n is_heavy: false,\n usage: 'Childrens car',\n storage_location: 'Carport',\n has_financially_interested_party: true,\n financially_interested_party_detail: 'MTA',\n owned_duration: 'Less than 12 months',\n drivers: [\n {\n first_name: 'X Æ',\n last_name: 'A-12',\n dob: '2000-05-04',\n licence: 'Other',\n licence_other: 'None',\n relationship: 'Child',\n key: 'driver-test-key',\n }\n ],\n key: 'vehicle-test-key',\n },\n ],\n purchase_options: populatePurchaseOptions ? [\n {\n premium_type: 'annual',\n level_of_insurance_id: 12,\n authorised_drivers: 'TEST',\n excess_details: 'TEST',\n terms: 'TEST',\n description: 'This is a test purchase option',\n premium: 100000,\n monthly_premium: 8500,\n show_monthly: true,\n fsl: 100,\n sort_order: 1,\n enhancements: [\n { name: 'Test enhancement', premium: 2500, disable_rounding: false, description: 'Test enhancement', auto_select: true, key: 'enhancement-test-key-1' },\n { name: 'Test enhancement', premium: 5000, disable_rounding: false, description: 'Test enhancement', auto_select: false, key: 'enhancement-test-key-2' }\n ],\n key: 'purchase-option-test-key-annual'\n },\n {\n premium_type: 'total-due',\n level_of_insurance_id: 13,\n authorised_drivers: 'TEST',\n excess_details: 'TEST',\n terms: 'TEST',\n description: 'This is a test purchase option',\n premium: 100000,\n show_monthly: false,\n fsl: 100,\n sort_order: 2,\n enhancements: [\n { name: 'Test enhancement', premium: 2500, disable_rounding: false, description: 'Test enhancement', auto_select: true, key: 'enhancement-test-key-3' },\n { name: 'Test enhancement', premium: 5000, disable_rounding: false, description: 'Test enhancement', auto_select: false, key: 'enhancement-test-key-4' }\n ],\n key: 'purchase-option-test-key-total-due'\n }\n ] : [],\n }))\n }\n\n function handleKeydown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n return setKeys([]);\n }\n\n setKeys(prevKeys => [...prevKeys, e.key]);\n }\n\n React.useEffect(() => {\n // Detect when the user has typed the word \"debug\"\n if (keys.join('') === 'debug') {\n handlePopulate();\n }\n }, [keys]);\n\n React.useEffect(() => {\n if (typeof window !== 'undefined') {\n if (window.location.href.includes('dev')\n || window.location.href.includes('localhost')\n || window.location.href.includes('test')\n || window.location.href.includes('local')\n ) {\n setDev(true);\n }\n\n window.addEventListener('keydown', (e: KeyboardEvent) => handleKeydown(e));\n\n return () => {\n window.removeEventListener('keydown', (e: KeyboardEvent) => handleKeydown(e));\n }\n }\n\n return;\n }, []);\n\n if (isDev) {\n return (\n <Button onClick={handlePopulate} type=\"button\" status=\"primary\" className=\"fixed bottom-4 right-4\">\n Populate data\n </Button>\n )\n }\n\n return <></>;\n}\n","import React from 'react';\nimport { Fragment } from 'react'\nimport { Dialog, Transition } from '@headlessui/react'\n\ninterface Props {\n children: React.ReactNode;\n isActive?: boolean;\n onClose: () => void;\n title?: string;\n}\n\nexport default function Modal({ children, isActive = false, onClose, title }: Props) {\n return (\n <Transition.Root show={isActive} as={Fragment}>\n <Dialog as=\"div\" className=\"fixed z-[110] inset-0 overflow-y-auto\" onClose={onClose}>\n <div className=\"flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0\">\n <Transition.Child\n as={Fragment}\n enter=\"ease-out duration-300\"\n enterFrom=\"opacity-0\"\n enterTo=\"opacity-100\"\n leave=\"ease-in duration-200\"\n leaveFrom=\"opacity-100\"\n leaveTo=\"opacity-0\"\n >\n <Dialog.Overlay className=\"fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity\" />\n </Transition.Child>\n\n <Transition.Child\n as={Fragment}\n enter=\"ease-out duration-300\"\n enterFrom=\"opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95\"\n enterTo=\"opacity-100 translate-y-0 sm:scale-100\"\n leave=\"ease-in duration-200\"\n leaveFrom=\"opacity-100 translate-y-0 sm:scale-100\"\n leaveTo=\"opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95\"\n >\n <div className=\"w-full align-start inline-block bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-3xl sm:p-6\">\n <div className={`flex gap-4 mb-4 text-asphalt ${title ? 'border-b-2 border-asphalt pb-4' : ''}`}>\n {title && <h3 className=\"font-black text-lg\">{title}</h3>}\n <button type=\"button\" onClick={onClose} className=\"ml-auto transition-all hover:opacity-50\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n <div>{children}</div>\n </div>\n </Transition.Child>\n </div>\n </Dialog>\n </Transition.Root>\n );\n}\n","import React from 'react';\nimport { formatMoney, formatNumber } from \"../../lib\";\n\ninterface Props {\n value?: number;\n onChange: (value: number) => void;\n id?: string;\n name?: string;\n className?: string;\n required?: boolean;\n}\n\nexport default function MoneyField({ value = 0, onChange, name = 'value', id = 'value', className = '', required = false }: Props) {\n function handleChange(e: React.SyntheticEvent<HTMLInputElement>) {\n let newValue: number = 0;\n\n if (e.currentTarget.value) {\n newValue = formatNumber(e.currentTarget.value);\n\n if (isNaN(newValue)) {\n newValue = 0;\n }\n }\n\n onChange(newValue);\n }\n\n const displayValue = formatMoney(value, 0);\n\n return (\n <div className={`${className} flex items-center gap-2 pl-4 rounded-md border border-gray-300 transition-all focus-within:border-teal focus-within:outline-none focus-within:ring focus-within:ring-teal focus-within:ring-opacity-50`}>\n <span className=\"font-bold pr-2\">$</span>\n <input\n type=\"text\"\n name={name}\n id={id}\n value={displayValue}\n onChange={handleChange}\n className=\"w-full !focus:outline-none !focus:ring-0 !focus:ring-transparent !focus:ring-opacity-0 !ring-0 !border-0 !transition-none !rounded-l-none\"\n required={required}\n />\n </div>\n );\n\n}\n","import React from \"react\";\nimport { Link } from \"@inertiajs/react\";\nimport type { Meta } from \"../../types\";\n\ninterface Props {\n className?: string;\n meta: Meta;\n showPerPageSelector?: boolean;\n}\n\nexport default function Pagination({ meta, className, showPerPageSelector = false }: Props) {\n const { current_page, total, per_page } = meta;\n const page_count = Math.ceil(total / per_page);\n\n function getNextPageLink() {\n if (typeof window !== 'undefined') {\n const search = new URLSearchParams(window.location.search);\n search.set('page', String(current_page + 1));\n\n return `?${search.toString()}`;\n }\n\n return '';\n }\n\n function getPrevPageLink() {\n if (typeof window !== 'undefined') {\n const search = new URLSearchParams(window.location.search);\n search.set('page', String(current_page - 1));\n\n return `?${search.toString()}`;\n }\n\n return '';\n }\n\n const nextPageLink = getNextPageLink();\n const prevPageLink = getPrevPageLink();\n\n function handlePerPageChange(e: React.SyntheticEvent<HTMLSelectElement>) {\n const search = new URLSearchParams(window?.location.search);\n search.set('limit', e.currentTarget.value);\n search.set('page', '1');\n\n window.location.href = `?${search.toString()}`;\n }\n\n return (\n <div className={`${className ?? ''}`}>\n <nav className=\"font-bold flex justify-between items-center gap-6\">\n <Link href={prevPageLink} className=\"flex items-center gap-2\" disabled={current_page === 1}>\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10 19l-7-7m0 0l7-7m-7 7h18\" />\n </svg>\n Prev\n </Link>\n <div className=\"flex gap-6 items-center\">\n <p>Page {current_page} of {page_count}</p>\n {showPerPageSelector ? (\n <select value={per_page} onChange={handlePerPageChange}>\n <option value=\"10\">10 per page</option>\n <option value=\"25\">25 per page</option>\n <option value=\"50\">50 per page</option>\n <option value=\"100\">100 per page</option>\n </select>\n ) : ''}\n </div>\n <Link href={nextPageLink} className=\"flex items-center gap-2\" disabled={current_page === page_count}>\n Next\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14 5l7 7m0 0l-7 7m7-7H3\" />\n </svg>\n </Link>\n </nav>\n </div>\n )\n}\n","import React from \"react\";\nimport { Link } from \"@inertiajs/react\";\nimport { Meta } from \"../../types\";\n\ninterface Props {\n className?: string;\n meta: Meta;\n showPerPageSelector?: boolean;\n}\n\nexport default function SimplePagination({ meta, className, showPerPageSelector = false }: Props) {\n const { current_page, per_page, to, from } = meta;\n const results_on_page = to - from + 1;\n const has_more_pages = results_on_page === per_page;\n\n function getNextPageLink() {\n if (typeof window !== 'undefined') {\n const search = new URLSearchParams(window.location.search);\n search.set('page', String(current_page + 1));\n\n return `?${search.toString()}`;\n }\n\n return '';\n }\n\n function getPrevPageLink() {\n if (typeof window !== 'undefined') {\n const search = new URLSearchParams(window.location.search);\n search.set('page', String(current_page - 1));\n\n return `?${search.toString()}`;\n }\n\n return '';\n }\n\n const nextPageLink = getNextPageLink();\n const prevPageLink = getPrevPageLink();\n\n function handlePerPageChange(e: React.SyntheticEvent<HTMLSelectElement>) {\n const search = new URLSearchParams(window?.location.search);\n search.set('limit', e.currentTarget.value);\n search.set('page', '1');\n\n window.location.href = `?${search.toString()}`;\n }\n\n return (\n <div className={`${className ?? ''}`}>\n <nav className=\"font-bold flex justify-between items-center gap-6\">\n <Link href={prevPageLink} className=\"flex items-center gap-2\" disabled={current_page === 1}>\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10 19l-7-7m0 0l7-7m-7 7h18\" />\n </svg>\n Prev\n </Link>\n <div className=\"flex gap-6 items-center\">\n <p>Page {current_page}</p>\n {showPerPageSelector ? (\n <select value={per_page} onChange={handlePerPageChange}>\n <option value=\"10\">10 per page</option>\n <option value=\"25\">25 per page</option>\n <option value=\"50\">50 per page</option>\n <option value=\"100\">100 per page</option>\n </select>\n ) : ''}\n </div>\n <Link href={nextPageLink} className=\"flex items-center gap-2\" disabled={!has_more_pages}>\n Next\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14 5l7 7m0 0l-7 7m7-7H3\" />\n </svg>\n </Link>\n </nav>\n </div>\n )\n}\n","import React from 'react';\n\ninterface Props extends React.DetailedHTMLProps<React.TableHTMLAttributes<HTMLTableElement>, HTMLTableElement> {\n children: React.ReactNode;\n}\n\nexport default function Table({ children, ...props }: Props) {\n return (\n <div className=\"-my-2 -mx-4 overflow-x-auto sm:-mx-6 lg:-mx-8 text-sm\">\n <div className=\"inline-block min-w-full py-2 align-middle md:px-6 lg:px-8\">\n <div className=\"overflow-hidden shadow ring-1 ring-black ring-opacity-5 md:rounded-lg\">\n <table {...props} className=\"min-w-full divide-y divide-gray-300\">\n {children}\n </table>\n </div>\n </div>\n </div>\n )\n}\n","import React from 'react';\n\ninterface Props {\n children: React.ReactNode;\n className?: string;\n}\n\nexport default function TableActions({ children, className = '' }: Props) {\n return (\n <div className={`${className} flex gap-4 justify-end items-center`}>\n {children}\n </div>\n )\n}\n","import cn from 'classnames';\nimport React from 'react';\n\ninterface Props extends React.DetailedHTMLProps<React.HTMLAttributes<HTMLTableSectionElement>, HTMLTableSectionElement> {\n children: React.ReactNode;\n className?: string;\n}\n\nexport default function TableBody({ children, className, ...props }: Props) {\n return (\n <tbody {...props} className={cn(className, 'divide-y divide-gray-200 bg-white')}>\n {children}\n </tbody>\n )\n}\n","import React from 'react';\nimport cn from 'classnames';\n\ninterface Props extends React.DetailedHTMLProps<React.TdHTMLAttributes<HTMLTableDataCellElement>, HTMLTableDataCellElement> {\n children: React.ReactNode;\n className?: string;\n condensed?: true;\n}\n\nexport default function TableCell({ children, className, condensed, ...props }: Props) {\n return (\n <td {...props} className={cn(className, 'px-3 py-3 text-sm text-gray-500', {\n 'w-0 whitespace-nowrap': condensed,\n })}>\n {children}\n </td>\n )\n}\n","import React from 'react';\nimport cn from 'classnames';\n\ninterface Props extends React.DetailedHTMLProps<React.HTMLAttributes<HTMLTableSectionElement>, HTMLTableSectionElement> {\n children: React.ReactNode;\n className?: string;\n}\n\nexport default function TableHead({ children, className, ...props }: Props) {\n return (\n <thead {...props} className={cn(className, 'px-3 py-4 text-sm text-white bg-gray-600')}>\n {children}\n </thead>\n )\n}\n","import React from 'react';\nimport { Link } from '@inertiajs/react';\nimport cn from 'classnames';\n\ninterface Props extends React.DetailedHTMLProps<React.ThHTMLAttributes<HTMLTableHeaderCellElement>, HTMLTableHeaderCellElement> {\n children: React.ReactNode;\n className?: string;\n textAlign?: 'left' | 'right' | 'center';\n sort?: string;\n condensed?: true;\n}\n\nexport default function TableHeader({\n children,\n className = '',\n sort,\n textAlign = 'left',\n condensed,\n ...props\n}: Props) {\n const [sortLink, setSortLink] = React.useState<string>('');\n\n React.useEffect(() => {\n if (typeof window !== 'undefined' && sort) {\n const query = new URLSearchParams(window.location.search);\n\n let direction: 'asc' | 'desc' = 'asc';\n\n if (query.get('sort')) {\n // Choose the opposite direction for sorting\n direction = query.get('sort')?.includes('asc') ? 'desc' : 'asc';\n }\n\n query.set('sort', `${sort} ${direction}`);\n\n setSortLink(`?${query.toString()}`);\n }\n }, []);\n\n const textAlignClass =\n (textAlign === 'center' && 'text-center justify-center') ||\n (textAlign === 'right' && 'text-right justify-end') ||\n 'text-left justify-between';\n\n return (\n <th {...props} className={cn(className, 'py-3.5 px-3 text-sm font-semibold text-left', {\n 'w-0 whitespace-nowrap': condensed,\n })}>\n <div className={`flex items-center gap-3 ${textAlignClass}`}>\n {children}\n {sort && (\n <Link href={sortLink}>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M8 9l4-4 4 4m0 6l-4 4-4-4\"\n />\n </svg>\n </Link>\n )}\n </div>\n </th>\n );\n}\n","import React from 'react';\nimport cn from 'classnames';\n\ninterface Props extends React.DetailedHTMLProps<React.HTMLAttributes<HTMLTableRowElement>, HTMLTableRowElement> {\n children: React.ReactNode;\n className?: string;\n onClick?: () => void;\n}\n\nexport default function TableRow({ children, className = '', onClick = () => {}, ...props }: Props) {\n const bgClass = className.includes('bg') ? '' : 'bg-white even:bg-gray-50'\n\n return (\n <tr {...props} className={cn(className, bgClass, 'hover:bg-gray-100')} onClick={onClick}>\n {children}\n </tr>\n )\n}\n","import React from 'react';\nimport type { Toast } from \"../../types\";\nimport { useToast } from \"../../lib/toast\";\nimport ToastItem from \"./ToastItem\";\n\nexport default function Toasts() {\n const { toasts } = useToast();\n\n return (\n <div className=\"fixed bottom-4 right-4 z-[110] flex flex-col gap-6\">\n {toasts.map((toast: Toast) => (\n <ToastItem {...toast} key={toast._id} />\n ))}\n </div>\n );\n}\n","import { usePage } from '@inertiajs/react';\nimport type { AuthContext } from '../types';\nimport type { ErrorBag, Errors, Page, PageProps } from '@inertiajs/core';\n\ninterface SharedProps {\n auth: AuthContext;\n errors: Errors & ErrorBag;\n}\n\ninterface AppPage extends Page {\n props: PageProps & SharedProps;\n}\n\nexport function useAuth(): AuthContext {\n const { props } = usePage() as AppPage;\n\n return props.auth;\n}\n","import { useEffect } from 'react';\n\nexport function useClickOutside(ref: any, handler: (e: Event) => void) {\n useEffect(\n () => {\n const listener = (event: Event) => {\n // Do nothing if clicking ref's element or descendent elements\n if (!ref.current || ref.current.contains(event.target)) {\n return;\n }\n handler(event);\n };\n\n document.addEventListener('mousedown', listener);\n document.addEventListener('touchstart', listener);\n\n return () => {\n document.removeEventListener('mousedown', listener);\n document.removeEventListener('touchstart', listener);\n };\n },\n [ref, handler]\n );\n}\n","import type { VisitOptions } from '@inertiajs/core';\nimport { useToast } from './toast';\n\ninterface Options {\n successMessage?: string;\n}\n\nexport function useInertiaOptions({ successMessage = '' }: Options = {}): VisitOptions {\n const { addToast } = useToast();\n\n return {\n onSuccess: () => {\n addToast({\n message: successMessage ?? 'Your request was successful.',\n status: 'success',\n });\n },\n onError: (errors) => {\n Object.values(errors).forEach((err) => {\n addToast({\n message: err,\n status: 'error',\n });\n });\n }\n }\n}\n","import { useState } from \"react\";\n\nexport function useLocalStorage<T>(key: string, initialValue: T) {\n // State to store our value\n // Pass initial state function to useState so logic is only executed once\n const [storedValue, setStoredValue] = useState<T>(() => {\n if (typeof window === \"undefined\") {\n return initialValue;\n }\n try {\n // Get from local storage by key\n const item = window.localStorage.getItem(key);\n // Parse stored json or if none return initialValue\n return item ? JSON.parse(item) : initialValue;\n } catch (error) {\n // If error also return initialValue\n console.log(error);\n return initialValue;\n }\n });\n // Return a wrapped version of useState's setter function that ...\n // ... persists the new value to localStorage.\n const setValue = (value: T | ((val: T) => T)) => {\n try {\n // Allow value to be a function so we have same API as useState\n const valueToStore =\n value instanceof Function ? value(storedValue) : value;\n // Save state\n setStoredValue(valueToStore);\n // Save to local storage\n if (typeof window !== \"undefined\") {\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n }\n } catch (error) {\n // A more advanced implementation would handle the error case\n console.log(error);\n }\n };\n\n return [storedValue, setValue] as const;\n}\n"],"names":["parseDate","dateString","parse","substring","Date","parseDateTime","dateTimeString","round","value","Number","Math","parseFloat","getGst","addGst","subtractGst","formatMoney","decimals","toFormat","replace","toLocaleString","minimumFractionDigits","maximumFractionDigits","formatNumber","sanitiseVehicleType","inputType","type","ToastContext","React","toasts","addToast","t","removeToast","useToast","initialData","id","undefined","status","source","reference","client_number","first_name","last_name","phone","mobile","email","licence","licence_other","promo_code","club_membership_number","length_of_insurance","dob","club_id","street_address","address","unit","suburb","city","post_code","declaration","had_incident","incidents","has_demerit_points","demerit_points","has_lost_licence","lost_licence_details","was_refused_insurance","refused_insurance_details","has_criminal_conviction","criminal_conviction_details","has_vehicle_modifications","vehicle_modifications_details","has_previous_insurer","previous_insurer_details","previous_insurer_expires_at","additional_details","vehicles","purchase_options","theme","broker_fee","broker_id","broker_firm_id","agent_id","agent_firm_id","staff_member_id","sent_at","sold_at","referrer_id","referrer_category_id","pricing_expires_at","follow_up_at","is_follow_up_required","QuoteRequestFormContext","createContext","useQuoteRequestForm","useContext","QuoteRequestOptionsContext","setOptions","search","q","encodeURIComponent","_context","fetch","baseUrl","res","ok","json","data","completions","completion","_context2","pxid","calculateAge","date","today","birthDate","age","getFullYear","m","getMonth","getDate","calcMonthlyEnhancementPrice","enhancement","premium","monthlyPremium","disable_rounding","ceil","fixRoundingError","Button","className","href","target","onClick","children","disabled","as","classes","e","includes","Link","Card","ToastItem","_id","message","Transition","show","appear","enter","enterFrom","enterTo","leave","leaveFrom","leaveTo","defaultClasses","title","xmlns","fill","viewBox","stroke","strokeLinecap","strokeLinejoin","strokeWidth","d","conditionOptions","name","onChange","maxYear","showAge","dayOptions","Array","from","keys","map","padStart","months","monthOptions","yearOptions","handleChange","currentTarget","y","year","month","day","split","isValidDate","isNaN","required","option","key","heading","errors","renderKeys","Object","values","length","entries","field","populatePurchaseOptions","form","useState","setKeys","isDev","setDev","handlePopulate","setData","prevData","description","make","model","registration","vehicle_type","product","is_heavy","usage","storage_location","has_financially_interested_party","financially_interested_party_detail","owned_duration","drivers","relationship","premium_type","level_of_insurance_id","authorised_drivers","excess_details","terms","monthly_premium","show_monthly","fsl","sort_order","enhancements","auto_select","handleKeydown","prevKeys","useEffect","join","window","location","addEventListener","removeEventListener","isActive","onClose","Root","Fragment","Dialog","Child","Overlay","displayValue","newValue","meta","showPerPageSelector","current_page","per_page","page_count","total","nextPageLink","URLSearchParams","set","String","toString","getNextPageLink","prevPageLink","getPrevPageLink","_window","useForm","Provider","parts","options","initialRegistrationValue","onVehicleDataFound","apiUrl","showOdometerReadingField","showConditionField","outerClassName","odoInputClassName","conditionSelectClassName","regoInputClassName","searchBtnClassName","rego","setRego","odo","setOdo","condition","setCondition","setStatus","toUpperCase","handleSearch","query","odometerReading","headers","Content-Type","timeout","_yield$res$json","vehicleData","vehicle","weight","parseInt","replaceAll","vehicleType","cn","onKeyDown","pointer-events-none opacity-50","conditionOption","placeholder","has_more_pages","to","props","condensed","w-0 whitespace-nowrap","sort","textAlign","sortLink","setSortLink","direction","get","textAlignClass","bgClass","setToasts","curr","filter","toast","newToast","uuid","setTimeout","selectedEnhancements","brokerFee","monthly","reduce","acc","_option$enhancements","find","enhancementPremium","calculateMonthly","annually","_option$enhancements2","calculateAnnually","monthlyWithGst","annuallyWithGst","includeTime","formatString","parsed","format","input","gst","amountInclusive","amountExclusive","sanitiseQuoteRequestFormData","isArray","item","usePage","auth","ref","handler","listener","event","current","contains","document","successMessage","onSuccess","onError","forEach","err","initialValue","localStorage","getItem","JSON","error","console","log","storedValue","setStoredValue","valueToStore","Function","setItem","stringify"],"mappings":"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"}
package/dist/sdk.esm.js CHANGED
@@ -714,6 +714,21 @@ function _extends() {
714
714
  return _extends.apply(this, arguments);
715
715
  }
716
716
 
717
+ function _objectWithoutPropertiesLoose(source, excluded) {
718
+ if (source == null) return {};
719
+ var target = {};
720
+ var sourceKeys = Object.keys(source);
721
+ var key, i;
722
+
723
+ for (i = 0; i < sourceKeys.length; i++) {
724
+ key = sourceKeys[i];
725
+ if (excluded.indexOf(key) >= 0) continue;
726
+ target[key] = source[key];
727
+ }
728
+
729
+ return target;
730
+ }
731
+
717
732
  var initialData = {
718
733
  id: undefined,
719
734
  status: 'new',
@@ -1143,7 +1158,7 @@ function Card(_ref) {
1143
1158
  var className = _ref.className,
1144
1159
  children = _ref.children;
1145
1160
  return React__default.createElement("div", {
1146
- className: (className != null ? className : '') + " flex flex-col items-start bg-white rounded-md shadow border border-gray-200 p-4 md:p-6"
1161
+ className: (className != null ? className : '') + " flex flex-col items-start bg-white rounded-md shadow-sm border border-gray-300 p-4 md:p-6"
1147
1162
  }, children);
1148
1163
  }
1149
1164
 
@@ -1450,17 +1465,20 @@ function Modal(_ref) {
1450
1465
  })))), React__default.createElement("div", null, children))))));
1451
1466
  }
1452
1467
 
1468
+ var _excluded = ["children"];
1453
1469
  function Table(_ref) {
1454
- var children = _ref.children;
1470
+ var children = _ref.children,
1471
+ props = _objectWithoutPropertiesLoose(_ref, _excluded);
1472
+
1455
1473
  return React__default.createElement("div", {
1456
1474
  className: "-my-2 -mx-4 overflow-x-auto sm:-mx-6 lg:-mx-8 text-sm"
1457
1475
  }, React__default.createElement("div", {
1458
1476
  className: "inline-block min-w-full py-2 align-middle md:px-6 lg:px-8"
1459
1477
  }, React__default.createElement("div", {
1460
1478
  className: "overflow-hidden shadow ring-1 ring-black ring-opacity-5 md:rounded-lg"
1461
- }, React__default.createElement("table", {
1479
+ }, React__default.createElement("table", Object.assign({}, props, {
1462
1480
  className: "min-w-full divide-y divide-gray-300"
1463
- }, children))));
1481
+ }), children))));
1464
1482
  }
1465
1483
 
1466
1484
  function TableActions(_ref) {
@@ -1472,35 +1490,43 @@ function TableActions(_ref) {
1472
1490
  }, children);
1473
1491
  }
1474
1492
 
1493
+ var _excluded$1 = ["children", "className"];
1475
1494
  function TableBody(_ref) {
1476
1495
  var children = _ref.children,
1477
- _ref$className = _ref.className,
1478
- className = _ref$className === void 0 ? '' : _ref$className;
1479
- return React__default.createElement("tbody", {
1480
- className: (className != null ? className : '') + " divide-y divide-gray-200 bg-white"
1481
- }, children);
1496
+ className = _ref.className,
1497
+ props = _objectWithoutPropertiesLoose(_ref, _excluded$1);
1498
+
1499
+ return React__default.createElement("tbody", Object.assign({}, props, {
1500
+ className: cn(className, 'divide-y divide-gray-200 bg-white')
1501
+ }), children);
1482
1502
  }
1483
1503
 
1504
+ var _excluded$2 = ["children", "className", "condensed"];
1484
1505
  function TableCell(_ref) {
1485
1506
  var children = _ref.children,
1486
1507
  className = _ref.className,
1487
- condensed = _ref.condensed;
1488
- return React__default.createElement("td", {
1508
+ condensed = _ref.condensed,
1509
+ props = _objectWithoutPropertiesLoose(_ref, _excluded$2);
1510
+
1511
+ return React__default.createElement("td", Object.assign({}, props, {
1489
1512
  className: cn(className, 'px-3 py-3 text-sm text-gray-500', {
1490
1513
  'w-0 whitespace-nowrap': condensed
1491
1514
  })
1492
- }, children);
1515
+ }), children);
1493
1516
  }
1494
1517
 
1518
+ var _excluded$3 = ["children", "className"];
1495
1519
  function TableHead(_ref) {
1496
1520
  var children = _ref.children,
1497
- _ref$className = _ref.className,
1498
- className = _ref$className === void 0 ? '' : _ref$className;
1499
- return React__default.createElement("thead", {
1500
- className: className + " px-3 py-4 text-sm text-white bg-gray-600"
1501
- }, children);
1521
+ className = _ref.className,
1522
+ props = _objectWithoutPropertiesLoose(_ref, _excluded$3);
1523
+
1524
+ return React__default.createElement("thead", Object.assign({}, props, {
1525
+ className: cn(className, 'px-3 py-4 text-sm text-white bg-gray-600')
1526
+ }), children);
1502
1527
  }
1503
1528
 
1529
+ var _excluded$4 = ["children", "className", "sort", "textAlign", "condensed"];
1504
1530
  function TableHeader(_ref) {
1505
1531
  var children = _ref.children,
1506
1532
  _ref$className = _ref.className,
@@ -1508,7 +1534,8 @@ function TableHeader(_ref) {
1508
1534
  sort = _ref.sort,
1509
1535
  _ref$textAlign = _ref.textAlign,
1510
1536
  textAlign = _ref$textAlign === void 0 ? 'left' : _ref$textAlign,
1511
- condensed = _ref.condensed;
1537
+ condensed = _ref.condensed,
1538
+ props = _objectWithoutPropertiesLoose(_ref, _excluded$4);
1512
1539
 
1513
1540
  var _React$useState = React__default.useState(''),
1514
1541
  sortLink = _React$useState[0],
@@ -1531,11 +1558,11 @@ function TableHeader(_ref) {
1531
1558
  }
1532
1559
  }, []);
1533
1560
  var textAlignClass = textAlign === 'center' && 'text-center justify-center' || textAlign === 'right' && 'text-right justify-end' || 'text-left justify-between';
1534
- return React__default.createElement("th", {
1561
+ return React__default.createElement("th", Object.assign({}, props, {
1535
1562
  className: cn(className, 'py-3.5 px-3 text-sm font-semibold text-left', {
1536
1563
  'w-0 whitespace-nowrap': condensed
1537
1564
  })
1538
- }, React__default.createElement("div", {
1565
+ }), React__default.createElement("div", {
1539
1566
  className: "flex items-center gap-3 " + textAlignClass
1540
1567
  }, children, sort && React__default.createElement(Link, {
1541
1568
  href: sortLink
@@ -1553,17 +1580,20 @@ function TableHeader(_ref) {
1553
1580
  })))));
1554
1581
  }
1555
1582
 
1583
+ var _excluded$5 = ["children", "className", "onClick"];
1556
1584
  function TableRow(_ref) {
1557
1585
  var children = _ref.children,
1558
1586
  _ref$className = _ref.className,
1559
1587
  className = _ref$className === void 0 ? '' : _ref$className,
1560
1588
  _ref$onClick = _ref.onClick,
1561
- onClick = _ref$onClick === void 0 ? function () {} : _ref$onClick;
1589
+ onClick = _ref$onClick === void 0 ? function () {} : _ref$onClick,
1590
+ props = _objectWithoutPropertiesLoose(_ref, _excluded$5);
1591
+
1562
1592
  var bgClass = className.includes('bg') ? '' : 'bg-white even:bg-gray-50';
1563
- return React__default.createElement("tr", {
1564
- className: className + " " + bgClass + " hover:bg-gray-100",
1593
+ return React__default.createElement("tr", Object.assign({}, props, {
1594
+ className: cn(className, bgClass, 'hover:bg-gray-100'),
1565
1595
  onClick: onClick
1566
- }, children);
1596
+ }), children);
1567
1597
  }
1568
1598
 
1569
1599
  function DateOfBirthField(_ref) {