{"version":3,"file":"patient-CatCrMQM.js","sources":["../../node_modules/@tanstack/react-query/build/modern/utils.js","../../node_modules/@tanstack/react-query/build/modern/useMutation.js","../../node_modules/date-fns/addDays.js","../../node_modules/date-fns/addMonths.js","../../node_modules/date-fns/add.js","../../node_modules/date-fns/compareAsc.js","../../node_modules/date-fns/constructNow.js","../../node_modules/date-fns/isSameDay.js","../../node_modules/date-fns/differenceInCalendarMonths.js","../../node_modules/date-fns/differenceInCalendarYears.js","../../node_modules/date-fns/differenceInDays.js","../../node_modules/date-fns/_lib/getRoundingMethod.js","../../node_modules/date-fns/differenceInHours.js","../../node_modules/date-fns/differenceInMilliseconds.js","../../node_modules/date-fns/differenceInMinutes.js","../../node_modules/date-fns/endOfDay.js","../../node_modules/date-fns/endOfMonth.js","../../node_modules/date-fns/isLastDayOfMonth.js","../../node_modules/date-fns/differenceInMonths.js","../../node_modules/date-fns/differenceInSeconds.js","../../node_modules/date-fns/differenceInYears.js","../../node_modules/date-fns/_lib/normalizeInterval.js","../../node_modules/date-fns/intervalToDuration.js","../../node_modules/date-fns/isToday.js","../../node_modules/date-fns/startOfToday.js","../../Client/knockout/KnockoutExtenders.ts","../../Client/shared/validators.ts","../../Client/knockout/KnockoutValidationExtenders.ts","../../Client/knockout/viewModels/consultations/ReceiveVideoCallFromDoctor.ts","../../Client/knockout/viewModels/PartnerModalViewModel.ts","../../Client/knockout/viewModels/PetModalViewModel.ts","../../Client/knockout/viewModels/ProfileViewModel.ts","../../Client/knockout/viewModels/consultations/ConsultationResources.da.resx.ts","../../Client/knockout/viewModels/consultations/ConsultationResources.en.resx.ts","../../Client/knockout/viewModels/consultations/ConsultationResources.resx.ts","../../Client/knockout/viewModels/consultations/StopWordChecker.ts","../../Client/knockout/viewModels/consultations/BookEmailConsultationViewModel.ts","../../Client/knockout/viewModels/consultations/BookVideoConsultationViewModel.ts","../../Client/knockout/viewModels/StepProgress.ts","../../Client/knockout/viewModels/consultations/RateConsultationViewModel.ts","../../Client/knockout/viewModels/ProfileInsuranceViewModel.ts","../../Client/knockout/viewModels/consultations/ConsultationDetailsViewModel.ts","../../Client/knockout/viewModels/doctor/CallQualityFeedbackViewModel.ts","../../Client/knockout/viewModels/ChildModalViewModel.ts","../../Client/knockout/viewModels/consultations/SelectPatientViewModel.ts","../../Client/knockout/viewModels/PfaResultPageViewModel.ts","../../Client/features/profile/ProfileResources.da.resx.ts","../../Client/features/profile/ProfileResources.en.resx.ts","../../Client/features/profile/ProfileResources.resx.ts","../../node_modules/react-hook-form/dist/index.esm.mjs","../../Client/shared/fetchIStatus.ts","../../Client/api/profile/updateSelf.ts","../../Client/features/profile/myInfo/MyInfoModal.tsx","../../Client/features/profile/myInfo/myInfoAtoms.ts","../images/icons/edit.svg","../../Client/features/profile/myInfo/MyInfoApp.tsx","../../Client/features/profile/MinorChildren/store.ts","../images/icons/trash.svg","../../Client/components/InlineAlert.tsx","../images/icons/info.svg","../../Client/features/profile/MinorChildren/ChildModal/ModulusWarning/ModulusWarning.tsx","../../Client/api/profile/createChild.ts","../../Client/features/profile/MinorChildren/state/addChildMutationAtom.ts","../../Client/features/profile/MinorChildren/hooks/useAddChild.ts","../../Client/api/profile/editChild.ts","../../Client/features/profile/MinorChildren/state/editChildMutationAtom.ts","../../Client/features/profile/MinorChildren/hooks/useEditChild.ts","../../Client/features/profile/MinorChildren/ChildModal/useAddOrEditChild.ts","../../Client/features/profile/MinorChildren/ChildModal/useChildForm.ts","../../Client/features/profile/MinorChildren/ChildModal/ChildModal.tsx","../../Client/api/profile/fetchProfile.ts","../../Client/features/profile/MinorChildren/state/fetchProfileQueryAtom.ts","../../Client/features/profile/MinorChildren/hooks/useProfile.ts","../../Client/components/InlineConfirmation.tsx","../../Client/api/profile/deleteChild.ts","../../Client/features/profile/MinorChildren/state/deleteChildMutationAtom.ts","../../Client/features/profile/MinorChildren/hooks/useDeleteChild.ts","../../Client/features/profile/MinorChildren/ConfirmDeletionModal/ConfirmDeletionModal.tsx","../../Client/features/profile/MinorChildren/MinorChildrenApp.tsx","../../Client/features/profile/pets/PetModal.tsx","../../Client/features/profile/pets/PetsApp.tsx","../../Client/patient.ts"],"sourcesContent":["// src/utils.ts\nfunction shouldThrowError(throwError, params) {\n if (typeof throwError === \"function\") {\n return throwError(...params);\n }\n return !!throwError;\n}\nfunction noop() {\n}\nexport {\n noop,\n shouldThrowError\n};\n//# sourceMappingURL=utils.js.map","\"use client\";\n\n// src/useMutation.ts\nimport * as React from \"react\";\nimport { MutationObserver, notifyManager } from \"@tanstack/query-core\";\nimport { useQueryClient } from \"./QueryClientProvider.js\";\nimport { noop, shouldThrowError } from \"./utils.js\";\nfunction useMutation(options, queryClient) {\n const client = useQueryClient(queryClient);\n const [observer] = React.useState(\n () => new MutationObserver(\n client,\n options\n )\n );\n React.useEffect(() => {\n observer.setOptions(options);\n }, [observer, options]);\n const result = React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) => observer.subscribe(notifyManager.batchCalls(onStoreChange)),\n [observer]\n ),\n () => observer.getCurrentResult(),\n () => observer.getCurrentResult()\n );\n const mutate = React.useCallback(\n (variables, mutateOptions) => {\n observer.mutate(variables, mutateOptions).catch(noop);\n },\n [observer]\n );\n if (result.error && shouldThrowError(observer.options.throwOnError, [result.error])) {\n throw result.error;\n }\n return { ...result, mutate, mutateAsync: result.mutate };\n}\nexport {\n useMutation\n};\n//# sourceMappingURL=useMutation.js.map","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link addDays} function options.\n */\n\n/**\n * @name addDays\n * @category Day Helpers\n * @summary Add the specified number of days to the given date.\n *\n * @description\n * Add the specified number of days to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of days to be added.\n * @param options - An object with options\n *\n * @returns The new date with the days added\n *\n * @example\n * // Add 10 days to 1 September 2014:\n * const result = addDays(new Date(2014, 8, 1), 10)\n * //=> Thu Sep 11 2014 00:00:00\n */\nexport function addDays(date, amount, options) {\n const _date = toDate(date, options?.in);\n if (isNaN(amount)) return constructFrom(options?.in || date, NaN);\n\n // If 0 days, no-op to avoid changing times in the hour before end of DST\n if (!amount) return _date;\n\n _date.setDate(_date.getDate() + amount);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default addDays;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link addMonths} function options.\n */\n\n/**\n * @name addMonths\n * @category Month Helpers\n * @summary Add the specified number of months to the given date.\n *\n * @description\n * Add the specified number of months to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of months to be added.\n * @param options - The options object\n *\n * @returns The new date with the months added\n *\n * @example\n * // Add 5 months to 1 September 2014:\n * const result = addMonths(new Date(2014, 8, 1), 5)\n * //=> Sun Feb 01 2015 00:00:00\n *\n * // Add one month to 30 January 2023:\n * const result = addMonths(new Date(2023, 0, 30), 1)\n * //=> Tue Feb 28 2023 00:00:00\n */\nexport function addMonths(date, amount, options) {\n const _date = toDate(date, options?.in);\n if (isNaN(amount)) return constructFrom(options?.in || date, NaN);\n if (!amount) {\n // If 0 months, no-op to avoid changing times in the hour before end of DST\n return _date;\n }\n const dayOfMonth = _date.getDate();\n\n // The JS Date object supports date math by accepting out-of-bounds values for\n // month, day, etc. For example, new Date(2020, 0, 0) returns 31 Dec 2019 and\n // new Date(2020, 13, 1) returns 1 Feb 2021. This is *almost* the behavior we\n // want except that dates will wrap around the end of a month, meaning that\n // new Date(2020, 13, 31) will return 3 Mar 2021 not 28 Feb 2021 as desired. So\n // we'll default to the end of the desired month by adding 1 to the desired\n // month and using a date of 0 to back up one day to the end of the desired\n // month.\n const endOfDesiredMonth = constructFrom(options?.in || date, _date.getTime());\n endOfDesiredMonth.setMonth(_date.getMonth() + amount + 1, 0);\n const daysInMonth = endOfDesiredMonth.getDate();\n if (dayOfMonth >= daysInMonth) {\n // If we're already at the end of the month, then this is the correct date\n // and we're done.\n return endOfDesiredMonth;\n } else {\n // Otherwise, we now know that setting the original day-of-month value won't\n // cause an overflow, so set the desired day-of-month. Note that we can't\n // just set the date of `endOfDesiredMonth` because that object may have had\n // its time changed in the unusual case where where a DST transition was on\n // the last day of the month and its local time was in the hour skipped or\n // repeated next to a DST transition. So we use `date` instead which is\n // guaranteed to still have the original time.\n _date.setFullYear(\n endOfDesiredMonth.getFullYear(),\n endOfDesiredMonth.getMonth(),\n dayOfMonth,\n );\n return _date;\n }\n}\n\n// Fallback for modularized imports:\nexport default addMonths;\n","import { addDays } from \"./addDays.js\";\nimport { addMonths } from \"./addMonths.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link add} function options.\n */\n\n/**\n * @name add\n * @category Common Helpers\n * @summary Add the specified years, months, weeks, days, hours, minutes, and seconds to the given date.\n *\n * @description\n * Add the specified years, months, weeks, days, hours, minutes, and seconds to the given date.\n *\n * @typeParam DateType - The `Date` type the function operates on. Gets inferred from passed arguments. Allows using extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param duration - The object with years, months, weeks, days, hours, minutes, and seconds to be added.\n * @param options - An object with options\n *\n * @returns The new date with the seconds added\n *\n * @example\n * // Add the following duration to 1 September 2014, 10:19:50\n * const result = add(new Date(2014, 8, 1, 10, 19, 50), {\n * years: 2,\n * months: 9,\n * weeks: 1,\n * days: 7,\n * hours: 5,\n * minutes: 9,\n * seconds: 30,\n * })\n * //=> Thu Jun 15 2017 15:29:20\n */\nexport function add(date, duration, options) {\n const {\n years = 0,\n months = 0,\n weeks = 0,\n days = 0,\n hours = 0,\n minutes = 0,\n seconds = 0,\n } = duration;\n\n // Add years and months\n const _date = toDate(date, options?.in);\n const dateWithMonths =\n months || years ? addMonths(_date, months + years * 12) : _date;\n\n // Add weeks and days\n const dateWithDays =\n days || weeks ? addDays(dateWithMonths, days + weeks * 7) : dateWithMonths;\n\n // Add days, hours, minutes, and seconds\n const minutesToAdd = minutes + hours * 60;\n const secondsToAdd = seconds + minutesToAdd * 60;\n const msToAdd = secondsToAdd * 1000;\n\n return constructFrom(options?.in || date, +dateWithDays + msToAdd);\n}\n\n// Fallback for modularized imports:\nexport default add;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * @name compareAsc\n * @category Common Helpers\n * @summary Compare the two dates and return -1, 0 or 1.\n *\n * @description\n * Compare the two dates and return 1 if the first date is after the second,\n * -1 if the first date is before the second or 0 if dates are equal.\n *\n * @param dateLeft - The first date to compare\n * @param dateRight - The second date to compare\n *\n * @returns The result of the comparison\n *\n * @example\n * // Compare 11 February 1987 and 10 July 1989:\n * const result = compareAsc(new Date(1987, 1, 11), new Date(1989, 6, 10))\n * //=> -1\n *\n * @example\n * // Sort the array of dates:\n * const result = [\n * new Date(1995, 6, 2),\n * new Date(1987, 1, 11),\n * new Date(1989, 6, 10)\n * ].sort(compareAsc)\n * //=> [\n * // Wed Feb 11 1987 00:00:00,\n * // Mon Jul 10 1989 00:00:00,\n * // Sun Jul 02 1995 00:00:00\n * // ]\n */\nexport function compareAsc(dateLeft, dateRight) {\n const diff = +toDate(dateLeft) - +toDate(dateRight);\n\n if (diff < 0) return -1;\n else if (diff > 0) return 1;\n\n // Return 0 if diff is 0; return NaN if diff is NaN\n return diff;\n}\n\n// Fallback for modularized imports:\nexport default compareAsc;\n","import { constructFrom } from \"./constructFrom.js\";\n\n/**\n * @name constructNow\n * @category Generic Helpers\n * @summary Constructs a new current date using the passed value constructor.\n * @pure false\n *\n * @description\n * The function constructs a new current date using the constructor from\n * the reference date. It helps to build generic functions that accept date\n * extensions and use the current date.\n *\n * It defaults to `Date` if the passed reference date is a number or a string.\n *\n * @param date - The reference date to take constructor from\n *\n * @returns Current date initialized using the given date constructor\n *\n * @example\n * import { constructNow, isSameDay } from 'date-fns'\n *\n * function isToday(\n * date: DateArg,\n * ): boolean {\n * // If we were to use `new Date()` directly, the function would behave\n * // differently in different timezones and return false for the same date.\n * return isSameDay(date, constructNow(date));\n * }\n */\nexport function constructNow(date) {\n return constructFrom(date, Date.now());\n}\n\n// Fallback for modularized imports:\nexport default constructNow;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { startOfDay } from \"./startOfDay.js\";\n\n/**\n * The {@link isSameDay} function options.\n */\n\n/**\n * @name isSameDay\n * @category Day Helpers\n * @summary Are the given dates in the same day (and year and month)?\n *\n * @description\n * Are the given dates in the same day (and year and month)?\n *\n * @param laterDate - The first date to check\n * @param earlierDate - The second date to check\n * @param options - An object with options\n *\n * @returns The dates are in the same day (and year and month)\n *\n * @example\n * // Are 4 September 06:00:00 and 4 September 18:00:00 in the same day?\n * const result = isSameDay(new Date(2014, 8, 4, 6, 0), new Date(2014, 8, 4, 18, 0))\n * //=> true\n *\n * @example\n * // Are 4 September and 4 October in the same day?\n * const result = isSameDay(new Date(2014, 8, 4), new Date(2014, 9, 4))\n * //=> false\n *\n * @example\n * // Are 4 September, 2014 and 4 September, 2015 in the same day?\n * const result = isSameDay(new Date(2014, 8, 4), new Date(2015, 8, 4))\n * //=> false\n */\nexport function isSameDay(laterDate, earlierDate, options) {\n const [dateLeft_, dateRight_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n return +startOfDay(dateLeft_) === +startOfDay(dateRight_);\n}\n\n// Fallback for modularized imports:\nexport default isSameDay;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\n\n/**\n * The {@link differenceInCalendarMonths} function options.\n */\n\n/**\n * @name differenceInCalendarMonths\n * @category Month Helpers\n * @summary Get the number of calendar months between the given dates.\n *\n * @description\n * Get the number of calendar months between the given dates.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - An object with options\n *\n * @returns The number of calendar months\n *\n * @example\n * // How many calendar months are between 31 January 2014 and 1 September 2014?\n * const result = differenceInCalendarMonths(\n * new Date(2014, 8, 1),\n * new Date(2014, 0, 31)\n * )\n * //=> 8\n */\nexport function differenceInCalendarMonths(laterDate, earlierDate, options) {\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n\n const yearsDiff = laterDate_.getFullYear() - earlierDate_.getFullYear();\n const monthsDiff = laterDate_.getMonth() - earlierDate_.getMonth();\n\n return yearsDiff * 12 + monthsDiff;\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarMonths;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\n\n/**\n * The {@link differenceInCalendarYears} function options.\n */\n\n/**\n * @name differenceInCalendarYears\n * @category Year Helpers\n * @summary Get the number of calendar years between the given dates.\n *\n * @description\n * Get the number of calendar years between the given dates.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - An object with options\n\n * @returns The number of calendar years\n *\n * @example\n * // How many calendar years are between 31 December 2013 and 11 February 2015?\n * const result = differenceInCalendarYears(\n * new Date(2015, 1, 11),\n * new Date(2013, 11, 31)\n * );\n * //=> 2\n */\nexport function differenceInCalendarYears(laterDate, earlierDate, options) {\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n return laterDate_.getFullYear() - earlierDate_.getFullYear();\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarYears;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { differenceInCalendarDays } from \"./differenceInCalendarDays.js\";\n\n/**\n * The {@link differenceInDays} function options.\n */\n\n/**\n * @name differenceInDays\n * @category Day Helpers\n * @summary Get the number of full days between the given dates.\n *\n * @description\n * Get the number of full day periods between two dates. Fractional days are\n * truncated towards zero.\n *\n * One \"full day\" is the distance between a local time in one day to the same\n * local time on the next or previous day. A full day can sometimes be less than\n * or more than 24 hours if a daylight savings change happens between two dates.\n *\n * To ignore DST and only measure exact 24-hour periods, use this instead:\n * `Math.trunc(differenceInHours(dateLeft, dateRight)/24)|0`.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - An object with options\n *\n * @returns The number of full days according to the local timezone\n *\n * @example\n * // How many full days are between\n * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00?\n * const result = differenceInDays(\n * new Date(2012, 6, 2, 0, 0),\n * new Date(2011, 6, 2, 23, 0)\n * )\n * //=> 365\n *\n * @example\n * // How many full days are between\n * // 2 July 2011 23:59:00 and 3 July 2011 00:01:00?\n * const result = differenceInDays(\n * new Date(2011, 6, 3, 0, 1),\n * new Date(2011, 6, 2, 23, 59)\n * )\n * //=> 0\n *\n * @example\n * // How many full days are between\n * // 1 March 2020 0:00 and 1 June 2020 0:00 ?\n * // Note: because local time is used, the\n * // result will always be 92 days, even in\n * // time zones where DST starts and the\n * // period has only 92*24-1 hours.\n * const result = differenceInDays(\n * new Date(2020, 5, 1),\n * new Date(2020, 2, 1)\n * )\n * //=> 92\n */\nexport function differenceInDays(laterDate, earlierDate, options) {\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n\n const sign = compareLocalAsc(laterDate_, earlierDate_);\n const difference = Math.abs(\n differenceInCalendarDays(laterDate_, earlierDate_),\n );\n\n laterDate_.setDate(laterDate_.getDate() - sign * difference);\n\n // Math.abs(diff in full days - diff in calendar days) === 1 if last calendar day is not full\n // If so, result must be decreased by 1 in absolute value\n const isLastDayNotFull = Number(\n compareLocalAsc(laterDate_, earlierDate_) === -sign,\n );\n\n const result = sign * (difference - isLastDayNotFull);\n // Prevent negative zero\n return result === 0 ? 0 : result;\n}\n\n// Like `compareAsc` but uses local time not UTC, which is needed\n// for accurate equality comparisons of UTC timestamps that end up\n// having the same representation in local time, e.g. one hour before\n// DST ends vs. the instant that DST ends.\nfunction compareLocalAsc(laterDate, earlierDate) {\n const diff =\n laterDate.getFullYear() - earlierDate.getFullYear() ||\n laterDate.getMonth() - earlierDate.getMonth() ||\n laterDate.getDate() - earlierDate.getDate() ||\n laterDate.getHours() - earlierDate.getHours() ||\n laterDate.getMinutes() - earlierDate.getMinutes() ||\n laterDate.getSeconds() - earlierDate.getSeconds() ||\n laterDate.getMilliseconds() - earlierDate.getMilliseconds();\n\n if (diff < 0) return -1;\n if (diff > 0) return 1;\n\n // Return 0 if diff is 0; return NaN if diff is NaN\n return diff;\n}\n\n// Fallback for modularized imports:\nexport default differenceInDays;\n","export function getRoundingMethod(method) {\n return (number) => {\n const round = method ? Math[method] : Math.trunc;\n const result = round(number);\n // Prevent negative zero\n return result === 0 ? 0 : result;\n };\n}\n","import { getRoundingMethod } from \"./_lib/getRoundingMethod.js\";\nimport { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { millisecondsInHour } from \"./constants.js\";\n\n/**\n * The {@link differenceInHours} function options.\n */\n\n/**\n * @name differenceInHours\n * @category Hour Helpers\n * @summary Get the number of hours between the given dates.\n *\n * @description\n * Get the number of hours between the given dates.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - An object with options.\n *\n * @returns The number of hours\n *\n * @example\n * // How many hours are between 2 July 2014 06:50:00 and 2 July 2014 19:00:00?\n * const result = differenceInHours(\n * new Date(2014, 6, 2, 19, 0),\n * new Date(2014, 6, 2, 6, 50)\n * )\n * //=> 12\n */\nexport function differenceInHours(laterDate, earlierDate, options) {\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n const diff = (+laterDate_ - +earlierDate_) / millisecondsInHour;\n return getRoundingMethod(options?.roundingMethod)(diff);\n}\n\n// Fallback for modularized imports:\nexport default differenceInHours;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * @name differenceInMilliseconds\n * @category Millisecond Helpers\n * @summary Get the number of milliseconds between the given dates.\n *\n * @description\n * Get the number of milliseconds between the given dates.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n *\n * @returns The number of milliseconds\n *\n * @example\n * // How many milliseconds are between\n * // 2 July 2014 12:30:20.600 and 2 July 2014 12:30:21.700?\n * const result = differenceInMilliseconds(\n * new Date(2014, 6, 2, 12, 30, 21, 700),\n * new Date(2014, 6, 2, 12, 30, 20, 600)\n * )\n * //=> 1100\n */\nexport function differenceInMilliseconds(laterDate, earlierDate) {\n return +toDate(laterDate) - +toDate(earlierDate);\n}\n\n// Fallback for modularized imports:\nexport default differenceInMilliseconds;\n","import { getRoundingMethod } from \"./_lib/getRoundingMethod.js\";\nimport { millisecondsInMinute } from \"./constants.js\";\nimport { differenceInMilliseconds } from \"./differenceInMilliseconds.js\";\n\n/**\n * The {@link differenceInMinutes} function options.\n */\n\n/**\n * @name differenceInMinutes\n * @category Minute Helpers\n * @summary Get the number of minutes between the given dates.\n *\n * @description\n * Get the signed number of full (rounded towards 0) minutes between the given dates.\n *\n * @param dateLeft - The later date\n * @param dateRight - The earlier date\n * @param options - An object with options.\n *\n * @returns The number of minutes\n *\n * @example\n * // How many minutes are between 2 July 2014 12:07:59 and 2 July 2014 12:20:00?\n * const result = differenceInMinutes(\n * new Date(2014, 6, 2, 12, 20, 0),\n * new Date(2014, 6, 2, 12, 7, 59)\n * )\n * //=> 12\n *\n * @example\n * // How many minutes are between 10:01:59 and 10:00:00\n * const result = differenceInMinutes(\n * new Date(2000, 0, 1, 10, 0, 0),\n * new Date(2000, 0, 1, 10, 1, 59)\n * )\n * //=> -1\n */\nexport function differenceInMinutes(dateLeft, dateRight, options) {\n const diff =\n differenceInMilliseconds(dateLeft, dateRight) / millisecondsInMinute;\n return getRoundingMethod(options?.roundingMethod)(diff);\n}\n\n// Fallback for modularized imports:\nexport default differenceInMinutes;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link endOfDay} function options.\n */\n\n/**\n * @name endOfDay\n * @category Day Helpers\n * @summary Return the end of a day for the given date.\n *\n * @description\n * Return the end of a day for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The end of a day\n *\n * @example\n * // The end of a day for 2 September 2014 11:55:00:\n * const result = endOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 23:59:59.999\n */\nexport function endOfDay(date, options) {\n const _date = toDate(date, options?.in);\n _date.setHours(23, 59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfDay;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link endOfMonth} function options.\n */\n\n/**\n * @name endOfMonth\n * @category Month Helpers\n * @summary Return the end of a month for the given date.\n *\n * @description\n * Return the end of a month for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The end of a month\n *\n * @example\n * // The end of a month for 2 September 2014 11:55:00:\n * const result = endOfMonth(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 30 2014 23:59:59.999\n */\nexport function endOfMonth(date, options) {\n const _date = toDate(date, options?.in);\n const month = _date.getMonth();\n _date.setFullYear(_date.getFullYear(), month + 1, 0);\n _date.setHours(23, 59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfMonth;\n","import { endOfDay } from \"./endOfDay.js\";\nimport { endOfMonth } from \"./endOfMonth.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * @name isLastDayOfMonth\n * @category Month Helpers\n * @summary Is the given date the last day of a month?\n *\n * @description\n * Is the given date the last day of a month?\n *\n * @param date - The date to check\n * @param options - An object with options\n *\n * @returns The date is the last day of a month\n *\n * @example\n * // Is 28 February 2014 the last day of a month?\n * const result = isLastDayOfMonth(new Date(2014, 1, 28))\n * //=> true\n */\nexport function isLastDayOfMonth(date, options) {\n const _date = toDate(date, options?.in);\n return +endOfDay(_date, options) === +endOfMonth(_date, options);\n}\n\n// Fallback for modularized imports:\nexport default isLastDayOfMonth;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { compareAsc } from \"./compareAsc.js\";\nimport { differenceInCalendarMonths } from \"./differenceInCalendarMonths.js\";\nimport { isLastDayOfMonth } from \"./isLastDayOfMonth.js\";\n\n/**\n * The {@link differenceInMonths} function options.\n */\n\n/**\n * @name differenceInMonths\n * @category Month Helpers\n * @summary Get the number of full months between the given dates.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - An object with options\n *\n * @returns The number of full months\n *\n * @example\n * // How many full months are between 31 January 2014 and 1 September 2014?\n * const result = differenceInMonths(new Date(2014, 8, 1), new Date(2014, 0, 31))\n * //=> 7\n */\nexport function differenceInMonths(laterDate, earlierDate, options) {\n const [laterDate_, workingLaterDate, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n laterDate,\n earlierDate,\n );\n\n const sign = compareAsc(workingLaterDate, earlierDate_);\n const difference = Math.abs(\n differenceInCalendarMonths(workingLaterDate, earlierDate_),\n );\n\n if (difference < 1) return 0;\n\n if (workingLaterDate.getMonth() === 1 && workingLaterDate.getDate() > 27)\n workingLaterDate.setDate(30);\n\n workingLaterDate.setMonth(workingLaterDate.getMonth() - sign * difference);\n\n let isLastMonthNotFull = compareAsc(workingLaterDate, earlierDate_) === -sign;\n\n if (\n isLastDayOfMonth(laterDate_) &&\n difference === 1 &&\n compareAsc(laterDate_, earlierDate_) === 1\n ) {\n isLastMonthNotFull = false;\n }\n\n const result = sign * (difference - +isLastMonthNotFull);\n return result === 0 ? 0 : result;\n}\n\n// Fallback for modularized imports:\nexport default differenceInMonths;\n","import { getRoundingMethod } from \"./_lib/getRoundingMethod.js\";\nimport { differenceInMilliseconds } from \"./differenceInMilliseconds.js\";\n\n/**\n * The {@link differenceInSeconds} function options.\n */\n\n/**\n * @name differenceInSeconds\n * @category Second Helpers\n * @summary Get the number of seconds between the given dates.\n *\n * @description\n * Get the number of seconds between the given dates.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - An object with options.\n *\n * @returns The number of seconds\n *\n * @example\n * // How many seconds are between\n * // 2 July 2014 12:30:07.999 and 2 July 2014 12:30:20.000?\n * const result = differenceInSeconds(\n * new Date(2014, 6, 2, 12, 30, 20, 0),\n * new Date(2014, 6, 2, 12, 30, 7, 999)\n * )\n * //=> 12\n */\nexport function differenceInSeconds(laterDate, earlierDate, options) {\n const diff = differenceInMilliseconds(laterDate, earlierDate) / 1000;\n return getRoundingMethod(options?.roundingMethod)(diff);\n}\n\n// Fallback for modularized imports:\nexport default differenceInSeconds;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { compareAsc } from \"./compareAsc.js\";\nimport { differenceInCalendarYears } from \"./differenceInCalendarYears.js\";\n\n/**\n * The {@link differenceInYears} function options.\n */\n\n/**\n * @name differenceInYears\n * @category Year Helpers\n * @summary Get the number of full years between the given dates.\n *\n * @description\n * Get the number of full years between the given dates.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - An object with options\n *\n * @returns The number of full years\n *\n * @example\n * // How many full years are between 31 December 2013 and 11 February 2015?\n * const result = differenceInYears(new Date(2015, 1, 11), new Date(2013, 11, 31))\n * //=> 1\n */\nexport function differenceInYears(laterDate, earlierDate, options) {\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n\n // -1 if the left date is earlier than the right date\n // 2023-12-31 - 2024-01-01 = -1\n const sign = compareAsc(laterDate_, earlierDate_);\n\n // First calculate the difference in calendar years\n // 2024-01-01 - 2023-12-31 = 1 year\n const diff = Math.abs(differenceInCalendarYears(laterDate_, earlierDate_));\n\n // Now we need to calculate if the difference is full. To do that we set\n // both dates to the same year and check if the both date's month and day\n // form a full year.\n laterDate_.setFullYear(1584);\n earlierDate_.setFullYear(1584);\n\n // For it to be true, when the later date is indeed later than the earlier date\n // (2026-02-01 - 2023-12-10 = 3 years), the difference is full if\n // the normalized later date is also later than the normalized earlier date.\n // In our example, 1584-02-01 is earlier than 1584-12-10, so the difference\n // is partial, hence we need to subtract 1 from the difference 3 - 1 = 2.\n const partial = compareAsc(laterDate_, earlierDate_) === -sign;\n\n const result = sign * (diff - +partial);\n\n // Prevent negative zero\n return result === 0 ? 0 : result;\n}\n\n// Fallback for modularized imports:\nexport default differenceInYears;\n","import { normalizeDates } from \"./normalizeDates.js\";\n\nexport function normalizeInterval(context, interval) {\n const [start, end] = normalizeDates(context, interval.start, interval.end);\n return { start, end };\n}\n","import { normalizeInterval } from \"./_lib/normalizeInterval.js\";\nimport { add } from \"./add.js\";\nimport { differenceInDays } from \"./differenceInDays.js\";\nimport { differenceInHours } from \"./differenceInHours.js\";\nimport { differenceInMinutes } from \"./differenceInMinutes.js\";\nimport { differenceInMonths } from \"./differenceInMonths.js\";\nimport { differenceInSeconds } from \"./differenceInSeconds.js\";\nimport { differenceInYears } from \"./differenceInYears.js\";\n\n/**\n * The {@link intervalToDuration} function options.\n */\n\n/**\n * @name intervalToDuration\n * @category Common Helpers\n * @summary Convert interval to duration\n *\n * @description\n * Convert an interval object to a duration object.\n *\n * @param interval - The interval to convert to duration\n * @param options - The context options\n *\n * @returns The duration object\n *\n * @example\n * // Get the duration between January 15, 1929 and April 4, 1968.\n * intervalToDuration({\n * start: new Date(1929, 0, 15, 12, 0, 0),\n * end: new Date(1968, 3, 4, 19, 5, 0)\n * });\n * //=> { years: 39, months: 2, days: 20, hours: 7, minutes: 5, seconds: 0 }\n */\nexport function intervalToDuration(interval, options) {\n const { start, end } = normalizeInterval(options?.in, interval);\n const duration = {};\n\n const years = differenceInYears(end, start);\n if (years) duration.years = years;\n\n const remainingMonths = add(start, { years: duration.years });\n const months = differenceInMonths(end, remainingMonths);\n if (months) duration.months = months;\n\n const remainingDays = add(remainingMonths, { months: duration.months });\n const days = differenceInDays(end, remainingDays);\n if (days) duration.days = days;\n\n const remainingHours = add(remainingDays, { days: duration.days });\n const hours = differenceInHours(end, remainingHours);\n if (hours) duration.hours = hours;\n\n const remainingMinutes = add(remainingHours, { hours: duration.hours });\n const minutes = differenceInMinutes(end, remainingMinutes);\n if (minutes) duration.minutes = minutes;\n\n const remainingSeconds = add(remainingMinutes, { minutes: duration.minutes });\n const seconds = differenceInSeconds(end, remainingSeconds);\n if (seconds) duration.seconds = seconds;\n\n return duration;\n}\n\n// Fallback for modularized imports:\nexport default intervalToDuration;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { constructNow } from \"./constructNow.js\";\nimport { isSameDay } from \"./isSameDay.js\";\n\n/**\n * The {@link isToday} function options.\n */\n\n/**\n * @name isToday\n * @category Day Helpers\n * @summary Is the given date today?\n * @pure false\n *\n * @description\n * Is the given date today?\n *\n * @param date - The date to check\n * @param options - An object with options\n *\n * @returns The date is today\n *\n * @example\n * // If today is 6 October 2014, is 6 October 14:00:00 today?\n * const result = isToday(new Date(2014, 9, 6, 14, 0))\n * //=> true\n */\nexport function isToday(date, options) {\n return isSameDay(\n constructFrom(options?.in || date, date),\n constructNow(options?.in || date),\n );\n}\n\n// Fallback for modularized imports:\nexport default isToday;\n","import { startOfDay } from \"./startOfDay.js\";\n\n/**\n * The {@link startOfToday} function options.\n */\n\n/**\n * @name startOfToday\n * @category Day Helpers\n * @summary Return the start of today.\n * @pure false\n *\n * @description\n * Return the start of today.\n *\n * @typeParam ContextDate - The `Date` type of the context function.\n *\n * @param options - An object with options\n *\n * @returns The start of today\n *\n * @example\n * // If today is 6 October 2014:\n * const result = startOfToday()\n * //=> Mon Oct 6 2014 00:00:00\n */\nexport function startOfToday(options) {\n return startOfDay(Date.now(), options);\n}\n\n// Fallback for modularized imports:\nexport default startOfToday;\n","import * as ko from 'knockout';\n\ndeclare global {\n interface KnockoutExtenders {\n cprClean(target: any, options: any): KnockoutObservable;\n }\n}\n\nko.extenders.cprClean = (target: any, options: any) => {\n // create a writeable computed observable to intercept writes to our observable\n const result = ko\n .computed({\n read: target, // always return the original observables value\n write: (newValue: string) => {\n const current = target();\n const valueToWrite =\n newValue && newValue.replace(/[ \\D]/gi, '');\n\n // only write if it changed\n if (valueToWrite !== current) {\n target(valueToWrite);\n } else {\n // if the stripped value is the same, but a different value was written,\n // force a notification for the current field\n if (newValue !== current) {\n target.notifySubscribers(valueToWrite);\n }\n }\n },\n })\n .extend({ notify: 'always' });\n\n // initialize with current value to make sure it is cleaned appropriately\n result(target());\n\n // return the new computed observable\n return result;\n};\n","export function isPhoneNumber(input: string): boolean {\n if (!input) return false;\n\n return /^[+\\d]?[\\d-.\\s()]*$/.test(input);\n}\n\nexport function isFullName(input: string): boolean {\n if (!input) return false;\n\n return input.trim().indexOf(' ') > -1;\n}\n\nexport function isEmail(input: string): boolean {\n if (!input) return false;\n\n // common typos\n if (input.endsWith('@gmail.co')) return false;\n if (input.endsWith('@hotmail.co')) return false;\n if (input.endsWith('@outlook.co')) return false;\n\n // tld check\n if (!/@.+?\\..+?$/.test(input)) return false;\n\n // the same regex as used in knockout validation\n return /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i.test(\n input,\n );\n}\n\n// This checks if the input looks like a CPR number.\n// It does not use the modulus validation, since not all CPR numbers use this anymore.\nexport function isCprNumber(input: string): boolean {\n if (!input) return false;\n\n if (!/^[0-9]{10}$/.test(input)) return false;\n\n const day = parseInt(input.substring(0, 2));\n const month = parseInt(input.substring(2, 4));\n\n if (day < 1 || day > 31) return false;\n\n return 1 <= month && month <= 12;\n}\n\nexport const isUnderCertainAge = (cpr: string, validate: number): boolean => {\n if (!cpr) return true;\n\n const cleanedCPR = cpr.replace(/[-\\s]/gi, '');\n if (cleanedCPR.length < 7) return true;\n\n const birthday = cprToDateOfBirth(cleanedCPR);\n const maxAgeYearsAgo = new Date();\n maxAgeYearsAgo.setFullYear(maxAgeYearsAgo.getFullYear() - validate);\n return birthday > maxAgeYearsAgo;\n};\n\nexport const cprToDateOfBirth = (cpr: string): Date => {\n const day = parseInt(cpr.substring(0, 2));\n const month = parseInt(cpr.substring(2, 4));\n const year = parseInt(cpr.substring(4, 6));\n const seventhDigit = parseInt(cpr.substring(6, 7));\n let century = 0;\n switch (seventhDigit) {\n case 0:\n case 1:\n case 2:\n case 3:\n century = 1900;\n break;\n case 4:\n case 9:\n if (year <= 36) {\n century = 2000;\n } else {\n century = 1900;\n }\n break;\n case 5:\n case 6:\n case 7:\n case 8:\n if (year <= 57) {\n century = 2000;\n } else {\n century = 1800;\n }\n break;\n }\n // months are zero indexed\n return new Date(century + year, month - 1, day);\n};\n","import 'knockout.validation';\nimport * as ko from 'knockout';\n\nimport { R } from '@/Resources.resx';\nimport { isFullName, isPhoneNumber } from '@/shared/validators';\n\ninterface KnockoutValidationRuleDefinitions {\n overAndIncludingCertainAge: KnockoutValidationRuleDefinition;\n underCertainAge: KnockoutValidationRuleDefinition;\n cpr: KnockoutValidationRuleDefinition;\n validCprLength: KnockoutValidationRuleDefinition;\n validCprDate: KnockoutValidationRuleDefinition;\n fullname: KnockoutValidationRuleDefinition;\n phone: KnockoutValidationRuleDefinition;\n}\n\nclass CprHelper {\n public static cprToDateOfBirth(cpr: string): Date {\n const day = parseInt(cpr.substring(0, 2));\n const month = parseInt(cpr.substring(2, 4));\n const year = parseInt(cpr.substring(4, 6));\n const seventhDigit = parseInt(cpr.substring(6, 7));\n let century = 0;\n switch (seventhDigit) {\n case 0:\n case 1:\n case 2:\n case 3:\n century = 1900;\n break;\n case 4:\n case 9:\n if (year <= 36) {\n century = 2000;\n } else {\n century = 1900;\n }\n break;\n case 5:\n case 6:\n case 7:\n case 8:\n if (year <= 57) {\n century = 2000;\n } else {\n century = 1800;\n }\n break;\n }\n // months are zero indexed\n return new Date(century + year, month - 1, day);\n }\n}\n\nko.validation.rules.validCprLength = {\n validator: (cpr: string) => {\n if (!cpr) return true;\n\n const cleanedCPR = cpr.replace(/[-\\s]/gi, '');\n\n if (cleanedCPR.length < 10) {\n return false;\n }\n\n return true;\n },\n message: R.CprTooShort,\n};\n\nko.validation.rules.validCprDate = {\n validator: (cpr: string) => {\n if (!cpr) return true;\n\n const cleanedCPR = cpr.replace(/[-\\s]/gi, '');\n if (!cleanedCPR || cleanedCPR.length < 4) return true;\n\n const day = parseInt(cleanedCPR.substring(0, 2));\n const month = parseInt(cleanedCPR.substring(2, 4));\n\n if (day > 31) return false;\n return month <= 12;\n },\n message: R.InvalidCpr,\n};\n\nko.validation.rules.underCertainAge = {\n validator: (cpr: string, validate: number) => {\n if (!cpr) return true;\n\n const cleanedCPR = cpr.replace(/[-\\s]/gi, '');\n if (cleanedCPR.length < 7) return true;\n\n const birthday = CprHelper.cprToDateOfBirth(cleanedCPR);\n const maxAgeYearsAgo = new Date();\n maxAgeYearsAgo.setFullYear(maxAgeYearsAgo.getFullYear() - validate);\n return birthday > maxAgeYearsAgo;\n },\n message: R.CprTooOld,\n};\n\nko.validation.rules.overAndIncludingCertainAge = {\n validator: (cpr: string, validate: number) => {\n const birthday = CprHelper.cprToDateOfBirth(cpr);\n const minAgeYearsAgo = new Date();\n minAgeYearsAgo.setFullYear(minAgeYearsAgo.getFullYear() - validate);\n return birthday < minAgeYearsAgo;\n },\n message: R.CprTooYoung,\n};\n\nko.validation.rules.cpr = {\n validator: (cpr: string, validate: boolean) => {\n if (!validate) {\n return true;\n }\n cpr = cpr.replace(/[-\\s]/gi, '');\n if (!cpr || cpr.length !== 10) {\n return false;\n }\n let mainInt = 0;\n const factors = [4, 3, 2, 7, 6, 5, 4, 3, 2, 1];\n for (let i = 0; i < cpr.length; i++) {\n const cprDigit = parseInt(cpr.substring(i, i + 1));\n mainInt += cprDigit * factors[i];\n }\n return mainInt % 11 === 0;\n },\n message: R.InvalidCpr,\n};\n\nko.validation.rules.fullname = {\n validator: (name: string, validate: boolean) => {\n if (!validate) {\n return true;\n }\n return isFullName(name);\n },\n message: R.InvalidName,\n};\n\nko.validation.rules.phone = {\n validator: (phone: string, validate: boolean) => {\n if (!validate) {\n return true;\n }\n return isPhoneNumber(phone);\n },\n message: R.InvalidPhoneNumber,\n};\n\nko.validation.rules.petBirthdateNotInTheFuture = {\n validator: (value: Date, validate: boolean) => {\n if (!validate) {\n return true;\n }\n const currentYear = new Date().getFullYear();\n const currentMonth = new Date().getMonth();\n return new Date(currentYear, currentMonth, 25) > value;\n },\n message: R.ErrorDateInTheFuture,\n};\n\nko.validation.rules.isNumberOrEmpty = {\n validator: (value: string, validate: boolean) => {\n if (!validate) {\n return true;\n }\n if (!value) return true;\n\n const regex = /^\\d+[,.]?\\d*$/;\n return regex.test(value);\n },\n message: R.PleaseEnterANumber,\n};\n\nko.validation.registerExtenders();\n","import { ICallForPatientResponse } from '@/shared/interfaces';\nimport { Log } from '@/shared/Log';\nimport Modal from '@/shared/Modal';\nimport { ajaxCall } from '@/knockout/ajaxCall';\n\nexport class ReceiveVideoCall {\n private consultationUid: string;\n private conferenceDataInterval: number;\n private pollingInterval: number = null;\n private hasInteractedWithCall = false;\n\n private phoneSound = document.getElementById(\n 'phoneSound',\n ) as HTMLAudioElement;\n\n constructor(pollingInterval?: number) {\n const self = this;\n\n self.pollingInterval = pollingInterval || 10000;\n\n self.checkUserHasCallFromDoctor();\n\n self.conferenceDataInterval = window.setInterval(() => {\n self.checkUserHasCallFromDoctor();\n }, self.pollingInterval);\n }\n\n public acceptCall(): void {\n Log.info('ReceiveVideoCall: acceptCall');\n const self = this;\n self.hasInteractedWithCall = true;\n self.pauseSound();\n clearInterval(self.conferenceDataInterval);\n window.location.href =\n window.location.origin +\n '/consultations/' +\n self.consultationUid +\n '/videocall';\n }\n\n public rejectCall(): void {\n const self = this;\n self.hasInteractedWithCall = true;\n self.pauseSound();\n Modal.close('phone-answer-modal');\n\n ajaxCall(\n 'DELETE',\n 'api/video/signal/' + self.consultationUid + '/reject',\n () => {},\n () => {},\n );\n }\n\n public reappearRingingModal(): void {\n const self = this;\n\n if (!self.hasInteractedWithCall) {\n setTimeout(() => {\n Modal.show('phone-answer-modal');\n }, 1000);\n }\n\n self.hasInteractedWithCall = false;\n }\n\n private checkUserHasCallFromDoctor(): void {\n const self = this;\n\n const callBackAjax = (\n response: ICallForPatientResponse,\n _status: any,\n error: any,\n ): void => {\n if (response && response.ConsultationUid) {\n Log.info(\n 'checkUserHasCallFromDoctor: Showing incoming call modal',\n response,\n );\n self.consultationUid = response.ConsultationUid;\n Modal.show('phone-answer-modal');\n self.playSound();\n } else {\n Modal.close('phone-answer-modal');\n }\n };\n\n ajaxCall(\n 'GET',\n 'api/video/signal/check-for-call',\n callBackAjax,\n () => {},\n );\n }\n\n private playSound(): void {\n // typically this fails because the user didn't interact with the document first\n try {\n const self = this;\n if (self.phoneSound) {\n self.phoneSound.play().catch((reason: any) => {\n Log.info('Could not play sound. reason: ', reason);\n });\n }\n } catch (error) {\n Log.info('Could not play sound. error: ', error);\n }\n }\n\n private pauseSound(): void {\n const self = this;\n if (self.phoneSound) {\n self.phoneSound.pause();\n }\n }\n}\n","import 'knockout.validation';\nimport * as ko from 'knockout';\n\nimport {\n IAddPartnerRequest,\n IAdultHouseholdMember,\n IDeleteAdultHouseholdMemberRequest,\n IStatus,\n} from '@/shared/interfaces';\nimport { R } from '@/Resources.resx';\nimport { Utils } from '@/shared/Utils';\nimport Modal from '@/shared/Modal';\nimport { AlertViewModel } from './AlertViewModel';\nimport { fetch } from '@/shared/fetch';\n\nexport class PartnerModalViewModel {\n public partnerName: KnockoutObservable;\n public partnerCpr: KnockoutObservable;\n public partnerEmail: KnockoutObservable;\n public CPRFormatted: KnockoutObservable;\n public CPRConfirmed: KnockoutObservable;\n public showModulus11Warning: KnockoutObservable;\n public inputGroup: KnockoutValidationGroup;\n public alertModal: AlertViewModel;\n public selectedPartnerToDelete: IAdultHouseholdMember;\n\n constructor() {\n const self = this;\n self.alertModal = new AlertViewModel();\n\n self.partnerName = ko.observable('').extend({\n required: {\n param: true,\n message: R.PartnerNameRequired,\n },\n fullname: {\n param: true,\n message: R.PleaseEnterFullName,\n },\n });\n\n self.partnerEmail = ko.observable(null).extend({\n required: {\n param: true,\n message: R.PartnerEmailRequired,\n },\n maxLength: 75,\n email: {\n message: R.InvalidEmail,\n },\n });\n\n self.partnerCpr = ko\n .observable('')\n .extend({ cprClean: true })\n .extend({\n required: {\n param: true,\n message: R.PartnerCprRequired,\n },\n validCprLength: true,\n validCprDate: true,\n overAndIncludingCertainAge: 18,\n });\n\n self.CPRConfirmed = ko.observable(false);\n\n self.inputGroup = ko.validatedObservable([\n self.partnerName,\n self.partnerCpr,\n self.partnerEmail,\n ]);\n self.inputGroup.errors.showAllMessages(false);\n self.showModulus11Warning = ko.observable(false);\n\n self.selectedPartnerToDelete = null;\n\n self.CPRFormatted = ko.pureComputed(function () {\n return Utils.formatCpr(self.partnerCpr());\n });\n }\n\n public confirmCprIsValid = (): void => {\n this.CPRConfirmed(true);\n this.invitePartner();\n };\n\n public hideModulus11Warning = (): void => {\n this.showModulus11Warning(false);\n };\n\n public openInvitePartnerModal = () => {\n const self = this;\n self.partnerEmail(null);\n self.partnerName(null);\n self.partnerCpr(null);\n this.inputGroup.errors.showAllMessages(false);\n this.showModulus11Warning(false);\n this.CPRConfirmed(false);\n Modal.show('invite-partner-modal');\n };\n\n public openDeletePartnerModal(\n partnerToDelete: IAdultHouseholdMember,\n ): void {\n this.selectedPartnerToDelete = partnerToDelete;\n Modal.show('confirm-delete-modal');\n }\n public closeDeletePartnerModal(): void {\n this.selectedPartnerToDelete = null;\n Modal.close('confirm-delete-modal');\n }\n\n public invitePartner = async () => {\n const self = this;\n\n if (!this.inputGroup.isValid()) {\n this.inputGroup.errors.showAllMessages(true);\n return;\n }\n\n if (!Utils.cprModulusCheck(this.partnerCpr()) && !this.CPRConfirmed()) {\n this.showModulus11Warning(true);\n return;\n }\n\n const request: IAddPartnerRequest = {\n Name: self.partnerName(),\n Email: self.partnerEmail(),\n Cpr: self.partnerCpr(),\n };\n\n try {\n const response: IStatus = await fetch(\n '/api/patients/adult-household-member',\n 'POST',\n request,\n );\n\n if (response.HasErrors) {\n this.alertModal.openAlert(\n R.ErrorInvitePartner +\n response.Errors.map((e) => e.Value).join('\\n'),\n );\n Modal.close('invite-partner-modal');\n return;\n }\n\n window.location.reload();\n } catch (error) {\n this.alertModal.openAlert(R.ErrorInvitePartner + error);\n Modal.close('invite-partner-modal');\n }\n };\n\n public deletePartner = async () => {\n const self = this;\n\n const request: IDeleteAdultHouseholdMemberRequest = {\n Cpr: self.selectedPartnerToDelete.Cpr,\n };\n\n try {\n const response: IStatus = await fetch(\n '/api/patients/adult-household-member/delete',\n 'POST',\n request,\n );\n\n if (response.HasErrors) {\n this.alertModal.openAlert(\n R.ErrorDeletePartner +\n response.Errors.map((e) => e.Value).join('\\n'),\n );\n Modal.close('confirm-delete-modal');\n return;\n }\n\n window.location.reload();\n } catch (error) {\n this.alertModal.openAlert(R.ErrorDeletePartner + error);\n Modal.close('confirm-delete-modal');\n }\n };\n}\n","import 'knockout.validation';\nimport * as ko from 'knockout';\n\nimport { IAddPetRequest, IPetDto, IStatus } from '@/shared/interfaces';\nimport { R } from '@/Resources.resx';\nimport Modal from '@/shared/Modal';\nimport { AlertViewModel } from './AlertViewModel';\nimport { fetch } from '@/shared/fetch';\nimport { PetSexEnum, PetTypeEnum } from '@/shared/enums';\n\nexport class PetModalViewModel {\n public selectedPetId: KnockoutObservable;\n public selectedPetToDelete: IPetDto;\n public inputGroup: KnockoutValidationGroup;\n\n public loading: KnockoutObservable;\n\n public name: KnockoutObservable;\n public type: KnockoutObservable;\n public sex: KnockoutObservable;\n public weight: KnockoutObservable;\n public race: KnockoutObservable;\n public birthMonth: KnockoutObservable;\n public birthYear: KnockoutObservable;\n public birthDate: KnockoutObservable;\n\n public petTypeOptions: KnockoutObservableArray<{\n value: PetTypeEnum;\n text: string;\n }>;\n public petSexOptions: KnockoutObservableArray<{\n value: PetSexEnum;\n text: string;\n }>;\n public months: KnockoutObservableArray<{ value: number; text: string }>;\n public years: KnockoutObservableArray<{ value: number; text: string }>;\n\n public alertModal: AlertViewModel;\n\n constructor() {\n const self = this;\n self.alertModal = new AlertViewModel();\n\n self.loading = ko.observable(false);\n\n self.name = ko.observable('').extend({\n required: {\n param: true,\n message: R.PleaseEnterPetName,\n },\n });\n self.type = ko.observable(null).extend({\n required: {\n param: true,\n message: R.PleaseSelectPetType,\n },\n });\n self.sex = ko.observable(null).extend({\n required: {\n param: true,\n message: R.PleaseSelectPetSex,\n },\n });\n self.race = ko.observable('');\n self.weight = ko.observable('').extend({\n isNumberOrEmpty: {\n param: true,\n message: R.PleaseEnterANumber,\n },\n });\n\n self.birthMonth = ko.observable(null).extend({\n required: {\n param: true,\n message: R.PleaseSelectMonth,\n },\n });\n\n self.birthYear = ko.observable(null).extend({\n required: {\n param: true,\n message: R.PleaseSelectYear,\n },\n });\n\n self.birthDate = ko\n .computed(() => {\n return new Date(this.birthYear(), this.birthMonth(), 2);\n })\n .extend({\n petBirthdateNotInTheFuture: {\n param: true,\n message: R.ErrorDateInTheFuture,\n },\n });\n\n self.inputGroup = ko.validatedObservable([\n self.name,\n self.race,\n self.birthDate,\n self.type,\n self.sex,\n self.birthMonth,\n self.birthYear,\n ]);\n self.inputGroup.errors.showAllMessages(false);\n\n self.selectedPetId = ko.observable(null);\n\n self.petTypeOptions = ko.observableArray([\n { value: null, text: R.SelectPetType },\n { value: PetTypeEnum.Dog, text: R.PetTypeDog },\n { value: PetTypeEnum.Cat, text: R.PetTypeCat },\n {\n value: PetTypeEnum.Rabbit,\n text: R.PetTypeRabbit,\n },\n {\n value: PetTypeEnum.Rodent,\n text: R.PetTypeRodent,\n },\n ]);\n\n self.petSexOptions = ko.observableArray([\n { value: null, text: R.SelectPetSex },\n {\n value: PetSexEnum.Female,\n text: R.PetSexFemale,\n },\n {\n value: PetSexEnum.FemaleSterilized,\n text: R.PetSexFemaleSterilized,\n },\n { value: PetSexEnum.Male, text: R.PetSexMale },\n {\n value: PetSexEnum.MaleNeutered,\n text: R.PetSexMaleNeutered,\n },\n {\n value: PetSexEnum.Unknown,\n text: R.PetSexUnknown,\n },\n ]);\n\n self.months = ko.observableArray([\n { value: null, text: R.SelectMonth },\n { value: 0, text: R.MonthJanuary },\n { value: 1, text: R.MonthFebruary },\n { value: 2, text: R.MonthMarch },\n { value: 3, text: R.MonthApril },\n { value: 4, text: R.MonthMay },\n { value: 5, text: R.MonthJune },\n { value: 6, text: R.MonthJuly },\n { value: 7, text: R.MonthAugust },\n { value: 8, text: R.MonthSeptember },\n { value: 9, text: R.MonthOctober },\n { value: 10, text: R.MonthNovember },\n { value: 11, text: R.MonthDecember },\n ]);\n\n const currentYear = new Date().getFullYear();\n const maxYears = currentYear - 30;\n\n self.years = ko.observableArray([\n { value: null, text: R.SelectYear },\n ...Array.from(\n { length: currentYear - maxYears + 1 },\n (_, i) => maxYears + i,\n ).map((year) => ({ value: year, text: year.toString() })),\n ]);\n }\n\n public openAddPetModal = () => {\n this.selectedPetId(null);\n this.name('');\n this.race('');\n this.type(null);\n this.sex(null);\n this.weight('');\n this.birthMonth(null);\n this.birthYear(null);\n this.setModalTitle();\n this.inputGroup.errors.showAllMessages(false);\n Modal.show('petModal');\n };\n\n public openEditPetModal = (pet: IPetDto) => {\n this.name(pet.Name);\n this.type(pet.Type);\n this.sex(pet.Sex);\n this.weight(pet.WeightKg?.toString()?.replace('.', ','));\n this.race(pet.Race);\n this.birthMonth(new Date(pet.Birthdate).getMonth());\n this.birthYear(new Date(pet.Birthdate).getFullYear());\n this.selectedPetId(pet.Id);\n this.setModalTitle();\n this.inputGroup.errors.showAllMessages(false);\n Modal.show('petModal');\n };\n\n public addPet = async () => {\n if (!this.inputGroup.isValid()) {\n this.inputGroup.errors.showAllMessages(true);\n return;\n }\n\n if (this.loading()) return;\n this.loading(true);\n\n const request: IAddPetRequest = {\n Name: this.name(),\n Type: this.type(),\n Race: this.race(),\n Sex: this.sex(),\n Birthdate: this.birthDate(),\n WeightKg: this.parseNumber(this.weight()),\n };\n\n try {\n const response: IStatus = await fetch(\n '/api/pets',\n 'POST',\n request,\n );\n\n if (response.HasErrors) {\n this.alertModal.openAlert(\n R.CouldNotCreatePet +\n response.Errors.map((e) => e.Value).join('\\n'),\n );\n Modal.close('petModal');\n return;\n }\n\n window.location.reload();\n } catch (error) {\n this.alertModal.openAlert(R.CouldNotCreatePet + error);\n Modal.close('petModal');\n }\n };\n\n public editPet = async () => {\n if (!this.inputGroup.isValid()) {\n this.inputGroup.errors.showAllMessages(true);\n return;\n }\n\n if (this.loading()) return;\n this.loading(true);\n\n const petToUpdate: IPetDto = {\n Id: this.selectedPetId(),\n Name: this.name(),\n Type: this.type(),\n Race: this.race(),\n Sex: this.sex(),\n Birthdate: this.birthDate(),\n WeightKg: this.parseNumber(this.weight()),\n };\n\n try {\n const response: IStatus = await fetch(\n '/api/pets/',\n 'PUT',\n petToUpdate,\n );\n\n if (response.HasErrors) {\n this.alertModal.openAlert(\n R.CouldNotUpdatePet +\n response.Errors.map((e) => e.Value).join('\\n'),\n );\n Modal.close('petModal');\n return;\n }\n\n window.location.reload();\n } catch (error) {\n this.alertModal.openAlert(R.CouldNotUpdatePet + error);\n Modal.close('petModal');\n }\n };\n\n public openDeletePetModal(petToDelete: IPetDto): void {\n this.selectedPetToDelete = petToDelete;\n Modal.show('confirm-modal-pet');\n }\n\n public closeDeletePetModal(): void {\n this.selectedPetToDelete = null;\n Modal.close('confirm-modal-pet');\n }\n\n public deletePet = async () => {\n try {\n const response: IStatus = await fetch(\n `/api/pets/${this.selectedPetToDelete.Id}`,\n 'DELETE',\n );\n\n if (response.HasErrors) {\n this.alertModal.openAlert(\n R.ErrorDeletePet +\n response.Errors.map((e) => e.Value).join('\\n'),\n );\n Modal.close('confirm-modal-pet');\n return;\n }\n window.location.reload();\n } catch (error) {\n this.alertModal.openAlert(R.ErrorDeletePet + error);\n Modal.close('confirm-modal-pet');\n }\n };\n\n public setModalTitle() {\n const titleElement = document.getElementById('petModal-title');\n if (titleElement) {\n if (this.selectedPetId() == null) {\n titleElement.textContent = R.Profile_AddPet;\n } else {\n titleElement.textContent = R.Profile_EditPet;\n }\n }\n }\n\n public getPetIconPath(petType: PetTypeEnum): string {\n switch (petType) {\n case PetTypeEnum.Dog:\n return '/images/icons/pet-dog.svg';\n case PetTypeEnum.Cat:\n return '/images/icons/pet-cat.svg';\n case PetTypeEnum.Rabbit:\n return '/images/icons/pet-rabbit.svg';\n case PetTypeEnum.Rodent:\n return '/images/icons/pet-rodent.svg';\n default:\n return '/images/icons/pet-dog.svg';\n }\n }\n\n public parseNumber(input: string): number | null {\n if (!input) return null;\n\n const standardizedInput = input.replace(',', '.');\n const parsedValue = parseFloat(standardizedInput);\n\n if (isNaN(parsedValue)) {\n throw new Error('Invalid number format');\n }\n\n return parsedValue;\n }\n}\n","import 'knockout.validation';\nimport * as ko from 'knockout';\n\nimport {\n IAdultHouseholdMember,\n IAdultHouseholdMemberDto,\n IKid,\n IPatientDto,\n IPet,\n IPetDto,\n ISelfResponse,\n} from '@/shared/interfaces';\nimport { Log } from '@/shared/Log';\nimport { R } from '@/Resources.resx';\nimport { Utils } from '@/shared/Utils';\nimport { AlertViewModel } from './AlertViewModel';\nimport { ReceiveVideoCall } from './consultations/ReceiveVideoCallFromDoctor';\nimport Modal from '@/shared/Modal';\nimport { ChildModalViewModel } from './ChildModalViewModel';\nimport { PartnerModalViewModel } from './PartnerModalViewModel';\nimport { PetModalViewModel } from './PetModalViewModel';\nimport { fetch } from '@/shared/fetch';\nimport { ajaxCall } from '@/knockout/ajaxCall';\n\nexport class ProfileViewModel {\n public receiveVideoCall: ReceiveVideoCall;\n public childModal: ChildModalViewModel;\n public partnerModal: PartnerModalViewModel;\n public petModal: PetModalViewModel;\n\n public profileState: KnockoutObservable;\n public isSubmitting: KnockoutComputed;\n public profileErrorMessage: KnockoutObservable;\n\n // My information\n public name: KnockoutObservable;\n public CPR: KnockoutObservable;\n public cprFormatted: KnockoutObservable;\n public email: KnockoutObservable;\n public phone: KnockoutObservable;\n public emailEdit: KnockoutObservable;\n public phoneEdit: KnockoutObservable;\n\n public policyNumber: KnockoutObservable;\n public hasPolicyNumber: KnockoutComputed;\n public kids: KnockoutObservableArray;\n public adultHouseholdMembers: KnockoutObservableArray;\n public pets: KnockoutObservableArray;\n\n public error: KnockoutValidationGroup;\n public profileError: KnockoutValidationGroup;\n\n public newsletterSwitch = ko.observable(false);\n public newsletterSwitchDisabled = ko.observable(false);\n\n private profileStates = {\n ready: 'ready',\n saving: 'saving',\n saved: 'saved',\n };\n\n private alertModal: AlertViewModel;\n\n constructor() {\n const self = this;\n self.alertModal = new AlertViewModel();\n self.receiveVideoCall = new ReceiveVideoCall();\n self.partnerModal = new PartnerModalViewModel();\n self.petModal = new PetModalViewModel();\n\n self.profileState = ko.observable(self.profileStates.ready);\n self.isSubmitting = ko.computed(() => {\n return self.profileState() == self.profileStates.saving;\n });\n self.profileErrorMessage = ko.observable(null);\n\n self.name = ko.observable('').extend({\n required: {\n param: true,\n message: R.NameRequired,\n },\n fullname: true,\n });\n self.CPR = ko\n .observable('')\n .extend({ cprClean: true })\n .extend({\n required: {\n param: true,\n message: R.CprRequired,\n },\n pattern: {\n message: R.InvalidCpr,\n params: '^[0-9]{10}$',\n },\n });\n self.cprFormatted = ko.pureComputed(function () {\n return Utils.formatCpr(self.CPR());\n });\n self.email = ko.observable('').extend({\n required: {\n param: true,\n message: R.EmailRequired,\n },\n maxLength: 256,\n email: {\n message: R.InvalidEmail,\n },\n });\n self.emailEdit = ko.observable('').extend({\n required: {\n param: true,\n message: R.EmailRequired,\n },\n maxLength: 256,\n email: {\n message: R.InvalidEmail,\n },\n });\n self.phone = ko.observable(null).extend({\n pattern: {\n params: '^[+]?[0-9]{8,20}$',\n message: R.InvalidPhoneNumber,\n },\n validation: {\n validator: function (val: string) {\n return val !== null && val.trim() !== '';\n },\n message: R.PhoneNumberRequired,\n },\n });\n self.phoneEdit = ko.observable(null).extend({\n pattern: {\n params: '^[+]?[0-9]{8,20}$',\n message: R.InvalidPhoneNumber,\n },\n validation: {\n validator: function (val: string) {\n return val !== null && val.trim() !== '';\n },\n message: R.PhoneNumberRequired,\n },\n });\n self.policyNumber = ko.observable('');\n\n self.hasPolicyNumber = ko.pureComputed(() => {\n return self.policyNumber() && self.policyNumber().length > 0;\n });\n\n self.profileError = ko.validatedObservable([\n self.phoneEdit,\n self.emailEdit,\n ]);\n self.profileError.errors.showAllMessages(false);\n\n self.kids = ko.observableArray([]);\n\n self.adultHouseholdMembers = ko.observableArray([]);\n\n self.pets = ko.observableArray([]);\n\n self.error = ko.validatedObservable([\n self.name,\n self.CPR,\n self.email,\n self.phone,\n ]);\n self.error.errors.showAllMessages(false);\n }\n\n public getProfileData = async (onlyPartnerData = false) => {\n const self = this;\n\n await fetch('/api/patients/self', 'GET')\n .then((res: ISelfResponse) => {\n self.getProfileDataCallback(res, onlyPartnerData);\n })\n .catch((err) => {\n self.alertModal.openAlert(\n R.ErrorFetchingProfileData + '\\n' + err,\n );\n });\n\n await this.getPets();\n };\n\n public getProfileDataCallback(\n response: ISelfResponse,\n onlyPartnerData: boolean,\n ) {\n const self = this;\n if (!onlyPartnerData) {\n if (!response.Me || !response.Me.User) {\n Log.error('getProfileDataCallback: User not set', response);\n self.alertModal.openAlert(R.ErrorFetchingProfileData);\n return;\n }\n self.name(response.Me.User.FullName);\n self.CPR(response.Me.CPR);\n self.email(response.Me.Email);\n self.phone(response.Me.MobilePhone);\n self.policyNumber(response.Me.PolicyNumber);\n self.newsletterSwitch(response.Me.AcceptMarketing);\n self.newsletterSwitch.subscribe((newValue) =>\n this.toggleNewsletterSwitch(newValue),\n );\n\n self.kids.removeAll();\n response.Kids.forEach((item: IPatientDto) => {\n const currentKid: IKid = {\n Name: item.User.FullName,\n UID: item.User.UID,\n CPR: item.CPR,\n FormattedCpr: Utils.formatCpr(item.CPR),\n };\n self.kids.push(currentKid);\n });\n\n self.profileError.errors.showAllMessages(false);\n }\n\n if (response.AdultHouseholdMembers !== null) {\n self.adultHouseholdMembers([]);\n response.AdultHouseholdMembers.forEach(\n (item: IAdultHouseholdMemberDto) => {\n const currentAdultHouseholdMember: IAdultHouseholdMember = {\n ID: item.ID,\n UID: item.UID,\n Name: item.Name,\n Email: item.Email,\n Status: item.Status,\n Cpr: item.Cpr,\n };\n self.adultHouseholdMembers.push(\n currentAdultHouseholdMember,\n );\n },\n );\n }\n }\n\n public getPets = async () => {\n try {\n const response: IPetDto[] = await fetch('/api/pets', 'GET');\n response.forEach((x: IPetDto) => {\n const pet: IPet = {\n ...x,\n IconPath: this.petModal.getPetIconPath(x.Type),\n };\n this.pets.push(pet);\n });\n } catch (error) {\n this.alertModal.openAlert(R.CouldNotGetPets + error);\n Modal.close('petModal');\n }\n };\n\n public deleteAccount(): void {\n const callBackAjax = (\n data: any,\n textStatus: string,\n jqXhr: JQueryXHR,\n ): void => {\n this.closeDeleteAccountModal();\n this.logout();\n };\n const errorCallBack = (\n jqXhr: JQueryXHR,\n textStatus: string,\n error: string,\n ): void => {\n this.closeDeleteAccountModal();\n this.alertModal.openAlert(R.ErrorDeleteAccount);\n };\n\n ajaxCall(\n 'DELETE',\n 'api/patients/account',\n callBackAjax,\n errorCallBack,\n null,\n null,\n false,\n );\n }\n\n public openDeleteAccountModal(): void {\n Modal.show('delete-account-modal');\n }\n\n public closeDeleteAccountModal(): void {\n Modal.close('delete-account-modal');\n }\n\n public closeConfirmModal(): void {\n Modal.close('confirm-modal');\n }\n\n public openRemoveInsurancePartnerModal(): void {\n Modal.show('remove-insurance-partner-modal');\n }\n\n public closeRemoveInsurancePartnerModal(): void {\n Modal.close('remove-insurance-partner-modal');\n }\n\n public openUnsubscribeModal(): void {\n Modal.show('confirm-unsubscribe-modal');\n }\n\n public closeUnsubscribeModal(): void {\n Modal.close('confirm-unsubscribe-modal');\n }\n\n public logout(): boolean {\n Utils.logout();\n return true;\n }\n\n public async toggleNewsletterSwitch(newValue: boolean) {\n const self = this;\n self.newsletterSwitchDisabled(true);\n\n const url = newValue\n ? `/email/subscribe?email=${encodeURIComponent(self.email())}&getView=false`\n : `/email/unsubscribe?email=${encodeURIComponent(self.email())}&getView=false`;\n\n await fetch(url, 'GET')\n .then((_: ISelfResponse) => {\n self.newsletterSwitchDisabled(false);\n self.newsletterSwitch(newValue);\n })\n .catch((err) => {\n self.newsletterSwitchDisabled(false);\n self.alertModal.openAlert(\n R.ErrorTogglingNewsletter + '\\n' + err,\n );\n });\n }\n\n public chooseLanguageOnEnter(\n data: ProfileViewModel,\n event: JQuery.Event,\n languageCode: 'da' | 'en' | 'no',\n ) {\n if (event.key !== 'Enter') return true; // to avoid prevention of default behaviour\n\n window.location.href =\n window.location.pathname + '?lang=' + languageCode;\n }\n\n public toggleNewsletterOnEnter(\n data: ProfileViewModel,\n event: JQuery.Event,\n ) {\n if (event.key !== 'Enter') return true; // to avoid prevention of default behaviour\n\n this.toggleNewsletterSwitch(!this.newsletterSwitch()).then(null);\n }\n}\n","import { format } from \"@hejdoktor/resx-compiler\"\nconst pluralRules = new Intl.PluralRules(\"da\")\n\nexport const R = {\n\t\"AddMore\": \"Tilføj flere\",\n\t\"BookTimeVideoCall\": \"Har du ikke tid lige nu, så find en ledig tid herunder og bestil din videokonsultation. Vi sender dig en e-mail med yderligere information inden opkaldet.\",\n\t\"BookVideoConsultation_FirstAvailableCaregiver\": \"Først ledige\",\n\t\"DynamicCodeSubject\": \"Dynamic Code recept\",\n\t\"ErrorCreateConsultation\": \"Der opstod en fejl under oprettelse af konsultationen\",\n\t\"ErrorFetchingTimetable\": \"Der opstod en fejl under hentning af tidsplan. Prøv venligst igen, eller kontakt os hvis problemet fortsætter.\",\n\t\"ErrorSchedulingConsultation\": \"Der opstod en fejl under planlægning af konsultationen. Prøv venligst igen, eller kontakt os hvis problemet fortsætter.\",\n\t\"ErrorSendingMessage\": \"Der opstod en fejl under afsendelse af besked. Prøv venligst igen, eller kontakt os hvis problemet fortsætter.\",\n\t\"FillOutMessage\": \"Udfyld venligst en besked.\",\n\t\"InvalidFileType\": \"Ugyldig filtype.\",\n\t\"InvalidPayment\": \"Ugyldig betaling\",\n\t\"InvalidPhoneNumber\": \"Ugyldigt telefonnummer\",\n\t\"MaxFilesExceeded\": \"Du kan ikke tilføje flere filer.\",\n\t\"NoDoctorsAvailableForQueueScheduleMessage\": \"Find en ledig tid herunder og bestil din videokonsultation. Vi sender dig en e-mail med yderligere information inden opkaldet.\",\n\t\"PayButton\": \"Gå til betaling\",\n\t\"PhoneNumberRequired\": \"Angiv venligst telefonnummer. Så kan vi få fat på dig, hvis teknikken driller.\",\n\t\"PleaseAttachAnImageOfTheProblem\": \"Tilføj venligst et billede der viser problemet\",\n\t\"PleaseChooseDate\": \"Vælg dato for videokonsultation\",\n\t\"SendButton\": \"Send\",\n\t\"SubjectRequired\": \"Emne skal udfyldes\",\n\t\"TimeSlotUnavailable\": \"Tiden er desværre allerede booket, vælg venligst et andet tidspunkt.\",\n\t\"TimeZoneWarning\": \"Tidspunkterne vises i din lokale tidszone: {0}\",\n\t\"Today\": \"I dag\",\n\t\"TooLateToReschedule\": \"Det er desværre ikke længere muligt at ændre tidspunktet for konsultationen.\",\n\t\"UploadFailedTooLarge\": \"Filen \\\"{0}\\\" er for stor, og kan derfor ikke uploades. Tjek venligst at din fil ikke er større end 30 MB.\",\n\t\"WaitingTimeText\": (number: number, { minimumFractionDigits = 0, maximumFractionDigits = 3 }: { minimumFractionDigits?: number, maximumFractionDigits?: number } = {}) => {\n\t\tconst nf = new Intl.NumberFormat(\"da\", { minimumFractionDigits, maximumFractionDigits })\n\t\tswitch(pluralRules.select(number)) {\n\t\t\tcase \"one\":\n\t\t\t\treturn format(\"Der er i øjeblikket ca. {0} minuts ventetid.\", nf.format(number))\n\t\t\tdefault:\n\t\t\tcase \"other\":\n\t\t\t\treturn format(\"Der er i øjeblikket ca. {0} minutters ventetid.\", nf.format(number))\n\t\t}\n\t},\n}","import { format } from \"@hejdoktor/resx-compiler\"\nconst pluralRules = new Intl.PluralRules(\"en\")\n\nexport const R = {\n\t\"AddMore\": \"Add more\",\n\t\"BookTimeVideoCall\": \"If you don't have time right now, find a free time below and book your video consultation. We will send you an email with further information before the call.\",\n\t\"BookVideoConsultation_FirstAvailableCaregiver\": \"First available\",\n\t\"DynamicCodeSubject\": \"Dynamic Code prescription\",\n\t\"ErrorCreateConsultation\": \"An error occurred while creating the consultation\",\n\t\"ErrorFetchingTimetable\": \"An error occurred while retrieving schedule. Please try again or contact us if the problem persists.\",\n\t\"ErrorSchedulingConsultation\": \"An error occurred while scheduling the consultation. Please try again or contact us if the problem persists.\",\n\t\"ErrorSendingMessage\": \"An error occurred while sending message. Please try again or contact us if the problem persists.\",\n\t\"FillOutMessage\": \"Please fill in a message\",\n\t\"InvalidFileType\": \"Invalid file type.\",\n\t\"InvalidPayment\": \"Invalid payment\",\n\t\"InvalidPhoneNumber\": \"Invalid phone number\",\n\t\"MaxFilesExceeded\": \"You can't add more files.\",\n\t\"NoDoctorsAvailableForQueueScheduleMessage\": \"Find an available time below and book your video consultation. We will send you an email with further information before the call.\",\n\t\"PayButton\": \"Go to payment\",\n\t\"PhoneNumberRequired\": \"Please provide a phone number. We will use this to get in touch with you in case of technical issues.\",\n\t\"PleaseAttachAnImageOfTheProblem\": \"Please attach an image of the problem\",\n\t\"PleaseChooseDate\": \"Select date for video consultation\",\n\t\"SendButton\": \"Send\",\n\t\"SubjectRequired\": \"Subject is required\",\n\t\"TimeSlotUnavailable\": \"Unfortunately, the time is already booked, choose another time.\",\n\t\"TimeZoneWarning\": \"The times are shown in your local timezone: {0}\",\n\t\"Today\": \"Today\",\n\t\"TooLateToReschedule\": \"Unfortunately, it is no longer possible to reschedule the consultation.\",\n\t\"UploadFailedTooLarge\": \"The file \\\"{0}\\\" is too large and therefore cannot be uploaded. Please check that your file is not larger than 30 MB.\",\n\t\"WaitingTimeText\": (number: number, { minimumFractionDigits = 0, maximumFractionDigits = 3 }: { minimumFractionDigits?: number, maximumFractionDigits?: number } = {}) => {\n\t\tconst nf = new Intl.NumberFormat(\"en\", { minimumFractionDigits, maximumFractionDigits })\n\t\tswitch(pluralRules.select(number)) {\n\t\t\tcase \"one\":\n\t\t\t\treturn format(\"Waiting time is around {0} minute.\", nf.format(number))\n\t\t\tdefault:\n\t\t\tcase \"other\":\n\t\t\t\treturn format(\"Waiting time is around {0} minutes.\", nf.format(number))\n\t\t}\n\t},\n}","import { format } from \"@hejdoktor/resx-compiler\"\nexport { format }\nimport { getLocale } from \"@hejdoktor/resx-compiler\"\n\nimport { R as _da } from \"./ConsultationResources.da.resx\"\nimport { R as _en } from \"./ConsultationResources.en.resx\"\n\ntype Translations = {\n\t\"AddMore\": string,\n\t\"BookTimeVideoCall\": string,\n\t\"BookVideoConsultation_FirstAvailableCaregiver\": string,\n\t\"DynamicCodeSubject\": string,\n\t\"ErrorCreateConsultation\": string,\n\t\"ErrorFetchingTimetable\": string,\n\t\"ErrorSchedulingConsultation\": string,\n\t\"ErrorSendingMessage\": string,\n\t\"FillOutMessage\": string,\n\t\"InvalidFileType\": string,\n\t\"InvalidPayment\": string,\n\t\"InvalidPhoneNumber\": string,\n\t\"MaxFilesExceeded\": string,\n\t\"NoDoctorsAvailableForQueueScheduleMessage\": string,\n\t\"PayButton\": string,\n\t\"PhoneNumberRequired\": string,\n\t\"PleaseAttachAnImageOfTheProblem\": string,\n\t\"PleaseChooseDate\": string,\n\t\"SendButton\": string,\n\t\"SubjectRequired\": string,\n\t\"TimeSlotUnavailable\": string,\n\t\"TimeZoneWarning\": string,\n\t\"Today\": string,\n\t\"TooLateToReschedule\": string,\n\t\"UploadFailedTooLarge\": string,\n\t\"WaitingTimeText\": (number: number, options?: { minimumFractionDigits?: number, maximumFractionDigits?: number }) => string,\n}\n\nconst R = new Proxy({}, {\n\tget(target, name: keyof Translations, receiver) {\n\t\tif(process.env.enforcedLocale === \"da\" || (!process.env.enforcedLocale && getLocale(\"da\") === \"da\")) {\n\t\t\treturn _da[name] ?? name\n\t\t}\n\nif(process.env.enforcedLocale === \"en\" || (!process.env.enforcedLocale && getLocale(\"da\") === \"en\")) {\n\t\t\treturn _en[name] ?? name\n\t\t}\n\n\t\treturn name\n\t},\n}) as Translations\n\nexport { R }","import ko from 'knockout';\nimport { Log } from '@/shared/Log';\nimport { fetch } from '@/shared/fetch';\nimport { ConsultationTypeEnum } from '@/shared/enums';\n\ntype StopWordsMap = Record;\n\ntype StopWordDetails = {\n Words: string[];\n WarningTitle: string;\n WarningMessage: string;\n WarningMessageForEmailConsultation?: string;\n};\n\nexport enum InputType {\n Subject,\n Message,\n}\n\nexport class StopWordChecker {\n private isEmailConsultation: KnockoutObservable;\n\n public stopWords: KnockoutObservable | null =\n ko.observable(null);\n private shortestStopWordLength: KnockoutObservable =\n ko.observable(0);\n private shortestCompoundStopWordLength: KnockoutObservable =\n ko.observable(0);\n\n private minimumMatchWordLength = ko.pureComputed(() => {\n return (\n this.shortestStopWordLength() -\n this.getMaxLevenshteinDistance(this.shortestStopWordLength())\n );\n });\n private minimumCompoundMatchWordLength = ko.pureComputed(() => {\n return (\n this.shortestCompoundStopWordLength() -\n this.getMaxLevenshteinDistance(\n this.shortestCompoundStopWordLength(),\n )\n );\n });\n\n public stopWordWarningTitleForSubject: KnockoutObservable =\n ko.observable('');\n public stopWordWarningMessageForSubject: KnockoutObservable =\n ko.observable('');\n public matchedStopWordForSubject: KnockoutObservable =\n ko.observable('');\n public stopWordWarningTitleForMessage: KnockoutObservable =\n ko.observable('');\n public stopWordWarningMessageForMessage: KnockoutObservable =\n ko.observable('');\n public matchedStopWordForMessage: KnockoutObservable =\n ko.observable('');\n public showSubjectWarning: KnockoutObservable =\n ko.observable(false);\n public showMessageWarning: KnockoutObservable =\n ko.observable(false);\n\n public closeSubjectWarning(): void {\n this.showSubjectWarning(false);\n }\n\n public closeMessageWarning(): void {\n this.showMessageWarning(false);\n }\n\n constructor(\n consultationType: ConsultationTypeEnum,\n isEmailConsultation: boolean = false,\n ) {\n this.isEmailConsultation = ko.observable(isEmailConsultation);\n this.getStopWords(consultationType);\n }\n\n private getStopWords = async (\n consultationType: ConsultationTypeEnum,\n ): Promise => {\n try {\n const response: StopWordsMap = await fetch(\n `/api/consultations/stop-words?consultationType=${consultationType}`,\n 'GET',\n );\n\n if (!response) return;\n\n this.stopWords = ko.observable(response);\n\n let shortestWordLength: number = 0;\n let shortestCompoundWordLength: number = 0;\n\n Object.values(response).forEach((details) => {\n details.Words.forEach((word: string) => {\n const isCompoundWord = word.includes(' ');\n\n if (!isCompoundWord) {\n shortestWordLength =\n shortestWordLength == 0\n ? word.length\n : Math.min(shortestWordLength, word.length);\n } else if (isCompoundWord) {\n shortestCompoundWordLength =\n shortestCompoundWordLength == 0\n ? word.length\n : Math.min(\n shortestCompoundWordLength,\n word.length,\n );\n }\n });\n });\n this.shortestStopWordLength(shortestWordLength);\n this.shortestCompoundStopWordLength(shortestCompoundWordLength);\n } catch (error) {\n Log.error('Error when fetching stop words', error);\n return null;\n }\n };\n\n public checkForStopWords = (\n messageText: string | null,\n inputType: InputType = InputType.Subject,\n ): void => {\n if (this.stopWords() === null) return;\n\n const words = messageText?.split(' ');\n\n if (!words.length) return;\n\n const lastWord = words.pop().replace('.', ' ').trim().toLowerCase();\n const lastTwoWords = !words.length ? '' : words.pop() + ' ' + lastWord;\n\n // Only check if length of the last word(s) makes matches possible\n const checkSingleStopWords =\n lastWord.length >= this.minimumMatchWordLength();\n\n const checkCompoundStopWords =\n lastTwoWords.length >= this.minimumCompoundMatchWordLength();\n\n if (!checkSingleStopWords && !checkCompoundStopWords) return;\n\n const maxDistanceSingleWord = this.getMaxLevenshteinDistance(\n lastWord.length,\n );\n const maxDistanceCompoundWord = this.getMaxLevenshteinDistance(\n lastTwoWords.length,\n );\n\n let foundCompoundStopWordMatch = false;\n\n // check for compound words first, since they are more specific\n if (checkCompoundStopWords) {\n for (const [category, details] of Object.entries(\n this.stopWords(),\n )) {\n for (const stopWord of details.Words) {\n const isCompoundWord = stopWord.includes(' ');\n if (!isCompoundWord) continue;\n\n const trimmedStopWord = stopWord.replace(' ', '');\n const wordToMatch = lastTwoWords.replace(' ', '');\n\n if (\n this.isStopWordMatching(\n trimmedStopWord,\n wordToMatch,\n maxDistanceCompoundWord,\n )\n ) {\n this.handleStopWordMatch(category, stopWord, inputType);\n foundCompoundStopWordMatch = true;\n break;\n }\n }\n }\n }\n\n // if compound word match is found, do not proceed\n if (checkSingleStopWords && !foundCompoundStopWordMatch) {\n for (const [category, details] of Object.entries(\n this.stopWords(),\n )) {\n for (const stopWord of details.Words) {\n const isCompoundWord = stopWord.includes(' ');\n if (isCompoundWord) continue;\n\n const matchedWord =\n inputType == InputType.Subject\n ? this.matchedStopWordForSubject()\n : this.matchedStopWordForMessage();\n\n // do not match on less specific stop words\n if (matchedWord.includes(stopWord)) {\n return;\n }\n\n if (\n this.isStopWordMatching(\n stopWord,\n lastWord,\n maxDistanceSingleWord,\n )\n ) {\n this.handleStopWordMatch(category, stopWord, inputType);\n break;\n }\n }\n }\n }\n };\n\n private isStopWordMatching(\n stopWord: string,\n wordToMatch: string,\n maxDistanceAllowed: number,\n ): boolean {\n // Only check if length of stop word is within maxDistanceSingleWord\n if (stopWord.length > wordToMatch.length + maxDistanceAllowed)\n return false;\n if (stopWord.length < wordToMatch.length - maxDistanceAllowed)\n return false;\n\n // Perform regular string matching if maximum allowed distance is 0\n if (maxDistanceAllowed === 0) {\n return stopWord.toLowerCase() === wordToMatch;\n }\n\n // If some fuzziness is allowed, use Levenshtein\n const distance = this.getLevenshteinDistance(\n wordToMatch,\n stopWord,\n maxDistanceAllowed,\n );\n return distance <= maxDistanceAllowed;\n }\n\n private handleStopWordMatch(\n category: string,\n matchedStopWord: string,\n inputType: InputType,\n ): void {\n const stopWordCategory = this.stopWords()[category];\n\n const warningTitle = stopWordCategory.WarningTitle;\n if (!warningTitle) {\n Log.error(\n `Could not find Warning Title for ${category}. Update StopWords_Resource`,\n );\n return;\n }\n\n const specialWarningForEmailConsultation = this.isEmailConsultation()\n ? stopWordCategory?.WarningMessageForEmailConsultation\n : null;\n const warningMessage =\n specialWarningForEmailConsultation ??\n stopWordCategory.WarningMessage;\n\n if (!warningMessage) {\n Log.error(\n `Could not find Warning Message for ${category}. Update StopWords_Resource`,\n );\n return;\n }\n\n // Log the fact that we caught a stop word\n Log.info(\n `Caught StopWord: ${matchedStopWord} (in StopWord category: ${category})`,\n );\n\n const capitalizedStopWord =\n matchedStopWord.charAt(0).toUpperCase() + matchedStopWord.slice(1);\n\n if (inputType === InputType.Subject) {\n this.matchedStopWordForSubject(capitalizedStopWord);\n this.stopWordWarningTitleForSubject(warningTitle);\n this.stopWordWarningMessageForSubject(warningMessage);\n this.showSubjectWarning(true);\n }\n\n if (inputType === InputType.Message) {\n this.matchedStopWordForMessage(capitalizedStopWord);\n this.stopWordWarningTitleForMessage(warningTitle);\n this.stopWordWarningMessageForMessage(warningMessage);\n this.showMessageWarning(true);\n }\n\n // We don't want to show (or look for) the same warning twice\n delete this.stopWords()[category];\n }\n\n private getLevenshteinDistance = (\n input: string,\n target: string,\n maxDistance: number,\n ): number => {\n if (input == null || target == null || maxDistance == null) {\n throw new Error('Arguments cannot be null');\n }\n\n // Initialize the matrix\n const matrix: number[][] = Array.from(\n { length: input.length + 1 },\n (_, i) =>\n Array.from({ length: target.length + 1 }, (_, j) =>\n i === 0 ? j : j === 0 ? i : 0,\n ),\n );\n\n // Loop through each character and calculate the minimum edit distance\n for (let i = 1; i <= input.length; i++) {\n let minDistanceInRow = Infinity;\n\n for (let j = 1; j <= target.length; j++) {\n const charactersMatch = input[i - 1] === target[j - 1];\n const cost = charactersMatch ? 0 : 1;\n\n const substitutionCost = matrix[i - 1][j - 1] + cost;\n const deletionCost = matrix[i - 1][j] + 1;\n const insertionCost = matrix[i][j - 1] + 1;\n\n matrix[i][j] = Math.min(\n substitutionCost,\n deletionCost,\n insertionCost,\n );\n\n minDistanceInRow = Math.min(minDistanceInRow, matrix[i][j]);\n }\n\n // Exit early if the minimum distance in the current row exceeds maxDistance\n if (minDistanceInRow > maxDistance) {\n return maxDistance + 1; // Return a value greater than maxDistance to indicate early exit\n }\n }\n\n return matrix[input.length][target.length];\n };\n\n private getMaxLevenshteinDistance = (wordLength: number): number => {\n return wordLength < 5\n ? 0\n : wordLength < 8\n ? 1\n : wordLength <= 12\n ? 2\n : 3;\n };\n\n public logIfUserContinuesWithStopWord(): void {\n if (\n !this.matchedStopWordForMessage() &&\n !this.matchedStopWordForSubject()\n ) {\n return;\n }\n\n let logMessage =\n 'Booking flow continued after StopWord warning was shown: \\n';\n\n if (this.matchedStopWordForSubject()) {\n logMessage += `- StopWord in Subject: ${this.matchedStopWordForSubject()}. \\n`;\n }\n\n if (this.matchedStopWordForMessage()) {\n logMessage += `- StopWord in Message: ${this.matchedStopWordForMessage()}. \\n`;\n }\n\n Log.info(logMessage);\n }\n}\n","import Dropzone, { DropzoneOptions } from 'dropzone';\nimport * as ko from 'knockout';\nimport 'knockout.validation';\nimport { ConsultationTypeEnum, ServiceTypeEnum } from '@/shared/enums';\nimport {\n IOpenMessageConsultationRequest,\n IOpenMessageConsultationResponse,\n} from '@/shared/interfaces';\nimport { Log } from '@/shared/Log';\nimport { AlertViewModel } from '../AlertViewModel';\nimport { R, format } from './ConsultationResources.resx';\nimport { InputType, StopWordChecker } from './StopWordChecker';\nimport { ReceiveVideoCall } from './ReceiveVideoCallFromDoctor';\nimport { ajaxCall } from '@/knockout/ajaxCall';\n\nenum Page {\n DetailsForm = 0,\n NotifyOwnDoctor = 1,\n Categories = 2,\n}\n\nexport class BookEmailConsultationViewModel {\n public stopWordChecker: StopWordChecker;\n public alertModal: AlertViewModel;\n public receiveVideoCall: ReceiveVideoCall;\n public name: string;\n public CPR: string;\n public phone: KnockoutObservable;\n public subject: KnockoutObservable;\n public description: KnockoutObservable;\n public attachments: KnockoutObservableArray;\n public error: KnockoutValidationGroup;\n public formValidation: KnockoutComputed;\n public showSpinner: KnockoutObservable;\n public notifyOwnDoctor: KnockoutObservable;\n public shouldPay: KnockoutObservable;\n public shouldPayLabel: KnockoutComputed;\n public isAttachmentRequired: KnockoutObservable;\n // This must be defined before the usages, or they will fail on construction\n private currentPage = ko.observable(Page.NotifyOwnDoctor);\n private isQuestionnaireOnly = false;\n\n public shouldShowNotifyOwnDoctor = ko.computed(\n () => this.currentPage() == Page.NotifyOwnDoctor,\n );\n public shouldShowDetailsForm = ko.computed(\n () => this.currentPage() == Page.DetailsForm,\n );\n public shouldShowCategories = ko.computed(\n () => this.currentPage() == Page.Categories,\n );\n public category = ko.observable(null);\n\n public isSubmitting = ko.observable(false);\n\n private existingMessageUuid: string | null = null;\n private onBehalfOfUuid: string | null = null;\n private consultationType: ConsultationTypeEnum;\n private serviceType: ServiceTypeEnum;\n private dropzone: Dropzone;\n private dropzoneSelector = '#dropzone';\n private consultationHasCategories: boolean;\n private questionnaireResult: any = null;\n\n private dropzoneCleaner: () => void;\n\n private getInitialPage = () => {\n if (this.isQuestionnaireOnly) {\n return Page.DetailsForm;\n }\n return Page.NotifyOwnDoctor;\n };\n\n constructor(\n consultationType: ConsultationTypeEnum,\n serviceType: ServiceTypeEnum,\n price: number,\n consultationHasCategories: boolean,\n name = '',\n cpr = '',\n messageUuid: string | null = null,\n subject = '',\n message = '',\n onBehalfOf: string | null = null,\n attachments: string[] = [],\n questionnaireResult: any,\n phone: string | null,\n isQuestionnaireOnly: boolean,\n isAttachmentRequired: boolean,\n ) {\n const self = this;\n self.isQuestionnaireOnly = isQuestionnaireOnly;\n self.currentPage(this.getInitialPage());\n self.name = name;\n self.CPR = cpr;\n this.consultationType = consultationType;\n this.serviceType = serviceType;\n this.consultationHasCategories = consultationHasCategories;\n self.isAttachmentRequired = ko.observable(isAttachmentRequired);\n\n self.existingMessageUuid = messageUuid;\n self.onBehalfOfUuid = onBehalfOf;\n\n self.questionnaireResult = questionnaireResult;\n\n self.phone = ko.observable(null).extend({\n pattern: {\n params: '^[+]?[0-9]{8,20}$',\n message: R.InvalidPhoneNumber,\n },\n validation: {\n validator: function (val: string) {\n return val !== null && val.trim() !== '';\n },\n message: R.PhoneNumberRequired,\n },\n phone: true,\n });\n self.phone(phone);\n\n self.subject = ko.observable(subject).extend({\n required: {\n message: R.SubjectRequired,\n param: true,\n },\n });\n\n self.subject.subscribe((newValue) => {\n self.stopWordChecker.checkForStopWords(newValue);\n });\n\n self.description = ko.observable(message).extend({\n required: {\n message: R.FillOutMessage,\n param: true,\n },\n });\n\n self.description.subscribe((newValue) => {\n self.stopWordChecker.checkForStopWords(newValue, InputType.Message);\n });\n\n self.attachments = ko.observableArray(attachments);\n self.notifyOwnDoctor = ko.observable(false);\n self.shouldPay = ko.observable(price !== 0);\n self.shouldPayLabel = ko.computed(() => {\n let label = R.SendButton;\n if (this.shouldPay()) {\n label = R.PayButton;\n }\n\n return label;\n });\n\n self.stopWordChecker = new StopWordChecker(consultationType, true);\n self.alertModal = new AlertViewModel();\n self.receiveVideoCall = new ReceiveVideoCall();\n\n self.formValidation = ko.computed(() => {\n return (\n self.name !== '' &&\n self.CPR !== '' &&\n self.phone() !== '' &&\n self.subject() !== '' &&\n self.description() !== ''\n );\n });\n\n self.showSpinner = ko.observable(false);\n\n const dropzoneOptions: DropzoneOptions = {\n url: '/api/files/upload',\n method: 'POST',\n success: (file) => {\n const uid = JSON.parse(file.xhr.responseText);\n (file as any).uid = uid;\n this.attachments.push(uid);\n },\n init: function () {\n this.on('addedfile', function (file) {\n if (file.size > dropzoneOptions.maxFilesize) {\n alert(format(R.UploadFailedTooLarge, file.name));\n self.dropzone.removeFile(file);\n }\n\n const dropzoneContainer =\n document.getElementById('dropzone');\n const previewElements =\n document.querySelectorAll('.dz-preview');\n if (previewElements.length !== 0) {\n dropzoneContainer.style.height = 'auto';\n }\n });\n this.on('removedfile', function (file) {\n const dropzoneContainer =\n document.getElementById('dropzone');\n const previewElements =\n document.querySelectorAll('.dz-preview');\n if (previewElements.length === 0) {\n dropzoneContainer.style.height = '0';\n self.attachments([]);\n }\n });\n },\n addRemoveLinks: true,\n acceptedFiles: 'image/jpeg,image/png,image/gif,.pdf,.mov',\n maxFiles: 10,\n maxFilesize: 30_000_000,\n };\n self.dropzone = new Dropzone(self.dropzoneSelector, dropzoneOptions);\n\n self.dropzoneCleaner = () => {\n self.dropzone.removeAllFiles(true);\n $(self.dropzoneSelector).empty();\n };\n\n self.dropzone.on('removedfile', (file: any) => {\n self.attachments.remove(file.uid);\n });\n\n if (messageUuid != null) {\n $.get(`/api/files/attachments/${messageUuid}`, (data) => {\n $.each(data, (key, value) => {\n const mockFile = {\n name: value.FileName,\n size: value.FileByteSize,\n };\n self.dropzone.emit('addedfile', mockFile);\n self.dropzone.options.thumbnail.call(\n self.dropzone,\n mockFile,\n '/api/files/' + value.UID,\n );\n self.dropzone.emit('complete', mockFile);\n });\n });\n }\n\n document\n .getElementById('attachment-input')\n .addEventListener('change', function () {\n $('.js-send-email-button').prop('disabled', true);\n $('.js-upload-anchor').prop('disabled', true);\n const input = this as HTMLInputElement;\n for (let i = 0; i < input.files.length; i++) {\n const file = input.files.item(i);\n const fd = new FormData();\n fd.append('file', file);\n $.ajax('/api/files/upload', {\n method: 'POST',\n success: (data) => {\n self.attachments.push(data);\n $('.js-send-email-button').prop('disabled', false);\n $('.js-upload-anchor').prop('disabled', false);\n },\n error: (data) => {\n self.alertModal.openAlert(\n 'Filen kunne ikke vedhæftes. Prøv venligst igen.',\n );\n $('.js-send-email-button').prop('disabled', false);\n $('.js-upload-anchor').prop('disabled', false);\n },\n contentType: false,\n processData: false,\n data: fd,\n });\n }\n });\n\n self.error = ko.validatedObservable(this);\n self.error.errors.showAllMessages(false);\n }\n\n public executeSendMessage(): void {\n this.sendMessage();\n }\n\n public sendMessage(): void {\n const self = this;\n\n if (!self.error.isValid()) {\n self.error.errors.showAllMessages();\n return;\n }\n\n this.stopWordChecker.logIfUserContinuesWithStopWord();\n\n this.isSubmitting(true);\n\n const callbackSucces = (\n response: IOpenMessageConsultationResponse,\n status: any,\n error: any,\n ): void => {\n if (response.RequiresPayment) {\n window.location.href =\n window.location.origin +\n '/payment/plan?consultation=' +\n response.ConsultationGuid;\n } else {\n window.location.href =\n window.location.origin +\n '/consultations/' +\n response.ConsultationGuid +\n '/sentemail';\n }\n };\n\n const callbackError = (\n response: any,\n status: any,\n error: any,\n ): void => {\n this.isSubmitting(false);\n switch (response.status) {\n case 402:\n self.alertModal.openAlert(R.InvalidPayment);\n break;\n default:\n self.alertModal.openAlert(R.ErrorCreateConsultation);\n break;\n }\n };\n\n self.openMessageConsultation(callbackSucces, callbackError);\n }\n\n public getOpenMessageConsultationRequest(): IOpenMessageConsultationRequest {\n const self = this;\n\n const request: IOpenMessageConsultationRequest = {\n FromExistingMessageGuid: self.existingMessageUuid,\n FromFullName: self.name,\n CprNumber: self.CPR,\n MobileNumber: self.phone(),\n Subject: self.subject(),\n FileUids: self.attachments(),\n Message: self.description(),\n OnBehalfUID:\n self.onBehalfOfUuid === null ? null : self.onBehalfOfUuid,\n ConsultationType: this.consultationType,\n Category: this.category(),\n NotifyOwnDoctor: self.notifyOwnDoctor(),\n QuestionnaireResult: self.questionnaireResult,\n };\n\n return request;\n }\n\n public openMessageConsultation(\n successCallback: (\n response: IOpenMessageConsultationResponse,\n status: string,\n jqXhr: JQueryXHR,\n ) => any,\n errorCallback: (jqXhr: JQueryXHR, status: string, error: string) => any,\n ): void {\n const self = this;\n\n const consultationRequest = self.getOpenMessageConsultationRequest();\n\n ajaxCall(\n 'POST',\n 'api/consultations/message',\n successCallback,\n errorCallback,\n JSON.stringify(consultationRequest),\n );\n }\n\n public uploadAttachment = () => {\n $(this.dropzoneSelector).trigger('click');\n };\n\n public acceptNotifyOwnDoctor(): void {\n this.notifyOwnDoctor(true);\n this.currentPage(Page.DetailsForm);\n }\n\n public declineNotifyOwnDoctor(): void {\n this.notifyOwnDoctor(false);\n this.currentPage(Page.DetailsForm);\n }\n\n public detailsFormComplete(): void {\n if (this.isAttachmentRequired() && this.attachments().length == 0) {\n this.alertModal.openAlert(R.PleaseAttachAnImageOfTheProblem);\n } else if (this.consultationHasCategories) {\n this.currentPage(Page.Categories);\n this.scrollToTop();\n } else {\n this.executeSendMessage();\n }\n }\n\n public backToDetails(): void {\n this.currentPage(Page.DetailsForm);\n this.scrollToTop();\n }\n\n public categorySelected(): void {\n if (this.category()) {\n this.executeSendMessage();\n }\n }\n\n private scrollToTop() {\n const anchor = document.querySelector('#js-top-anchor');\n if (anchor) {\n anchor.scrollIntoView();\n }\n }\n\n public scrollElementToTop(id: string) {\n const anchor = document.querySelector('#' + id);\n\n let shouldScroll =\n anchor != null &&\n this.stopWordChecker.stopWords() != null &&\n !this.stopWordChecker.showSubjectWarning();\n\n // always scroll on mobile\n if (window.innerWidth < 650) {\n shouldScroll = true;\n }\n\n if (shouldScroll) {\n anchor.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n }\n\n public clearForm(): void {\n const self = this;\n\n ajaxCall(\n 'DELETE',\n `api/consultations/messages/${self.existingMessageUuid}`,\n (response: any, status: string, jqXhr: JQueryXHR) => {\n if (jqXhr.status === 200) {\n self.onBehalfOfUuid = null;\n self.attachments.removeAll();\n self.subject('');\n self.description('');\n self.dropzoneCleaner();\n\n self.error.errors.showAllMessages(false);\n } else {\n alert('Failed to clear message!');\n }\n },\n (response, status, error) => {\n Log.error('failed to delete message');\n },\n );\n }\n}\n","import {\n addDays,\n format as formatDate,\n isToday,\n parseISO,\n startOfToday,\n} from 'date-fns';\nimport Dropzone, { DropzoneOptions } from 'dropzone';\nimport * as ko from 'knockout';\nimport 'knockout.validation';\nimport {\n ConsultationTypeEnum,\n OpenVideoConsultationStatusEnum,\n ServiceTypeEnum,\n} from '@/shared/enums';\nimport { fetch } from '@/shared/fetch';\nimport {\n IApproximateWaitingTimeResponse,\n IGetScheduleRequest,\n IOpenVideoConsultationRequest,\n IOpenVideoConsultationResult,\n ITimeSlotDto,\n} from '@/shared/interfaces';\nimport Modal from '@/shared/Modal';\nimport { Utils } from '@/shared/Utils';\nimport { AlertViewModel } from '../AlertViewModel';\nimport { StepProgress } from '../StepProgress';\nimport { R, format as formatString } from './ConsultationResources.resx';\nimport { ReceiveVideoCall } from './ReceiveVideoCallFromDoctor';\nimport { StopWordChecker } from './StopWordChecker';\nimport { ajaxCall } from '@/knockout/ajaxCall';\n\nenum Page {\n DetailsForm = 0,\n NotifyOwnDoctor = 1,\n Timetable = 2,\n Categories = 3,\n SelectCaregiver = 4,\n}\ninterface ITimeslotsByDay {\n day: string;\n timeslots: Date[];\n}\n\n// Shim in case the browser does not support []#findLast (latest major browser to receive it was Firefox on 2022-08-22)\nfunction findLast(\n arr: Array,\n fn: (element: T, index: number, array: Array) => boolean,\n): T | undefined {\n if ((arr as any).findLast) {\n return (arr as any).findLast(fn);\n }\n\n return arr.slice().reverse().find(fn);\n}\n\nconst emptyUuid = '00000000-0000-0000-0000-000000000000';\n\nexport class BookVideoConsultationViewModel {\n public alertModal: AlertViewModel;\n public receiveVideoCall: ReceiveVideoCall;\n public stopWordChecker: StopWordChecker;\n\n private selectCaregiverModal: string;\n private caregivers = ko.observableArray<{\n Uid: string;\n FullName: string;\n } | null>(null);\n public preferredCaregiver = ko.observable(emptyUuid);\n public preferredCaregiverName = ko.computed(() => {\n const caregivers = this.caregivers();\n if (caregivers == null) {\n return '';\n }\n\n const preferredCaregiver = this.preferredCaregiver();\n const matchingCaregiver =\n preferredCaregiver === emptyUuid\n ? null\n : caregivers.find((x) => x.Uid == preferredCaregiver);\n\n return (\n matchingCaregiver?.FullName ??\n R.BookVideoConsultation_FirstAvailableCaregiver\n );\n });\n public cpr: string;\n public phone: KnockoutObservable;\n public name: string;\n public subject: KnockoutObservable;\n public attachments: KnockoutObservableArray;\n public category = ko.observable(null);\n private pages: Array<{\n page: Page;\n isEnabled(): boolean;\n isValid(): boolean;\n }>;\n private currentPage = ko.observable(Page.DetailsForm);\n public shouldShowDetailsForm = ko.computed(\n () => this.currentPage() == Page.DetailsForm,\n );\n public shouldShowNotifyOwnDoctor = ko.computed(\n () => this.currentPage() == Page.NotifyOwnDoctor,\n );\n public shouldShowTimetable = ko.computed(\n () => this.currentPage() == Page.Timetable,\n );\n public shouldShowCategories = ko.computed(\n () => this.currentPage() == Page.Categories,\n );\n public shouldShowSelectCaregiver = ko.computed(\n () => this.currentPage() === Page.SelectCaregiver,\n );\n public error: KnockoutValidationGroup;\n public checkboxValidation: KnockoutComputed;\n\n public timeZoneWarning = formatString(\n R.TimeZoneWarning,\n Intl.DateTimeFormat().resolvedOptions().timeZone,\n );\n\n public showTimeZoneWarning =\n Intl.DateTimeFormat().resolvedOptions().timeZone != 'Europe/Copenhagen';\n\n public selectedTimeslot = ko.observable(null);\n\n // rateLimit prevents updating the timeslotsByDay computed on every insert\n private allTimeSlots = ko.observableArray();\n public timeslots = ko.computed(() => {\n const preferredCaregiver = this.preferredCaregiver();\n let timeslots = this.allTimeSlots();\n if (preferredCaregiver !== emptyUuid) {\n timeslots = timeslots.filter((x) => {\n return x.AvailableCaregivers.includes(preferredCaregiver);\n });\n }\n const arrayOfTimeSlots = timeslots.map((x) => parseISO(x.Start));\n\n if (\n arrayOfTimeSlots.length > 0 &&\n this.consultationDraftScheduledOn != null\n ) {\n const consultationDraftScheduledOnFormatted = parseISO(\n this.consultationDraftScheduledOn,\n );\n const timeSlotDraft = arrayOfTimeSlots.find(\n (t) =>\n t.toJSON() ==\n consultationDraftScheduledOnFormatted.toJSON(),\n );\n\n if (timeSlotDraft) {\n this.selectedTimeslot(timeSlotDraft);\n }\n }\n\n return arrayOfTimeSlots;\n });\n\n public timeslotsByDay = ko.computed(() => {\n const timeslotMap: { [day: string]: Date[] } = {};\n\n // group the timeslots by date in a map\n this.timeslots().reduce((result, currentItem) => {\n const key = isToday(currentItem)\n ? R.Today\n : formatDate(currentItem, 'eeee') +\n ', ' +\n Utils.formatLongDate(currentItem);\n (result[key] = result[key] || []).push(currentItem);\n return result;\n }, timeslotMap);\n\n // convert the map to an array to simplify knockout rendering\n const timeslotArray: ITimeslotsByDay[] = [];\n\n for (const key in timeslotMap) {\n const value = timeslotMap[key];\n timeslotArray.push({ day: key, timeslots: value });\n }\n\n return timeslotArray;\n });\n\n public currentTimeslotDay = ko.observable(0);\n\n public visibleTimeslotsPerDay = ko.computed(() => {\n return this.timeslotsByDay()[this.currentTimeslotDay()];\n });\n\n public isPreviousDayButtonVisible = ko.computed(() => {\n return this.currentTimeslotDay() > 0;\n });\n\n public isNextDayButtonVisible = ko.computed(() => {\n return !!this.timeslotsByDay()[this.currentTimeslotDay() + 1];\n });\n\n public isLongWaitingTime: KnockoutObservable;\n\n private isOpenNow = ko.observable(false);\n private canQueueNow = ko.observable(false);\n public isSupportedDevice = ko.observable(true);\n\n public isQueueNowButtonEnabled = ko.computed(() => {\n if (this.preferredCaregiver() !== emptyUuid) {\n return false;\n }\n //we enable button in opening hours and also if opened for queueing (potentially before workhours)\n return this.isOpenNow() || this.canQueueNow();\n });\n\n public isQueueNowVisible = ko.computed(() => {\n if (this.preferredCaregiver() !== emptyUuid) {\n return false;\n }\n return this.canQueueNow();\n });\n\n public scheduleTimeMessage = ko.computed(() => {\n return this.isQueueNowVisible()\n ? R.BookTimeVideoCall\n : R.NoDoctorsAvailableForQueueScheduleMessage;\n });\n\n public minutesWaiting: KnockoutObservable;\n public notifyOwnDoctor: KnockoutObservable;\n\n public hasLoadedTimeslots = ko.observable(false);\n public firstAvailableTimeslot = ko.observable(null);\n public firstAvailableTimeslotFormatted = ko.observable(null);\n\n public stepProgress: StepProgress;\n private onBehalfUid: string | null = null;\n private onBehalfPetID: string = null;\n private isScheduleNow: boolean;\n private consultationType: ConsultationTypeEnum;\n private bookImmediately: boolean;\n private isBooking: boolean;\n private consultationHasCategories: boolean;\n private testResultUid: string = null;\n private questionnaireResult: any = null;\n private consultationUid: string | null = null;\n private consultationDraftScheduledOn: string | null = null;\n private dropzone: Dropzone;\n private dropzoneSelector = '#dropzone';\n private dropzoneCleaner: () => void;\n\n constructor(\n consultationType: ConsultationTypeEnum,\n serviceType: ServiceTypeEnum,\n price: number,\n consultationHasCategories: boolean,\n canQueueNow: boolean,\n stepProgress: StepProgress,\n skipConsultationDetails: boolean,\n bookImmediately: boolean,\n testResultUidParam: string,\n questionnaireResult: any,\n {\n caregivers,\n selectCaregiverModal,\n }: {\n caregivers: Array<{ Uid: string; FullName: string }> | null;\n selectCaregiverModal: string;\n },\n subjectTextDraft: string | null,\n notifyOwnDoctorEnabled: boolean,\n notifyOwnDoctorDraft: boolean,\n onBehalfOfNameDraft: string | null,\n onBehalfOfCprDraft: string | null,\n onBehalfOfUidDraft: string | null,\n onBehalfOfPetID: string | null,\n consultationUid: string | null,\n consultationDraftScheduledOn: string | null,\n preferredCaregiverUid: string | null,\n attachments: string[] = [],\n selectedPatientName: string | null,\n selectedPatientCpr: string | null,\n selectedPatientUid: string | null,\n isChildSelected: boolean,\n phone: string | null,\n isOpenNow: boolean | null,\n ) {\n const self = this;\n this.consultationType = consultationType;\n this.consultationHasCategories = consultationHasCategories;\n this.caregivers(caregivers);\n this.selectCaregiverModal = selectCaregiverModal;\n this.consultationUid = consultationUid;\n this.consultationDraftScheduledOn = consultationDraftScheduledOn;\n this.isOpenNow(isOpenNow);\n\n if (preferredCaregiverUid !== null) {\n this.preferredCaregiver(preferredCaregiverUid);\n }\n\n this.preferredCaregiver.subscribe(() => {\n Modal.close(this.selectCaregiverModal);\n });\n this.pages = [\n {\n page: Page.DetailsForm,\n isEnabled() {\n return true;\n },\n isValid() {\n return true;\n },\n },\n {\n page: Page.NotifyOwnDoctor,\n isEnabled() {\n return notifyOwnDoctorEnabled;\n },\n isValid() {\n return true;\n },\n },\n {\n page: Page.Categories,\n isEnabled: () => this.consultationHasCategories,\n isValid() {\n return true;\n },\n },\n {\n page: Page.SelectCaregiver,\n isEnabled: () => {\n const caregivers = this.caregivers();\n return (\n caregivers?.length &&\n caregivers.find((x) => x.Uid === emptyUuid) == null\n );\n },\n isValid: () =>\n this.caregivers()?.find((x) => x.Uid === emptyUuid) !=\n null || this.preferredCaregiver() !== emptyUuid,\n },\n {\n page: Page.Timetable,\n isEnabled() {\n return true;\n },\n isValid() {\n return true;\n },\n },\n ];\n\n self.stopWordChecker = new StopWordChecker(consultationType);\n self.alertModal = new AlertViewModel();\n self.receiveVideoCall = new ReceiveVideoCall();\n self.bookImmediately = bookImmediately;\n self.canQueueNow(canQueueNow);\n self.testResultUid = testResultUidParam;\n self.questionnaireResult = questionnaireResult;\n\n // To load the package in the background\n Utils.isSupportedDevice().then((isSupportedDevice) => {\n self.isSupportedDevice(isSupportedDevice);\n });\n\n self.phone = ko.observable(null).extend({\n pattern: {\n params: '^[+]?[0-9]{8,20}$',\n message: R.InvalidPhoneNumber,\n },\n validation: {\n validator: function (val: string) {\n return val !== null && val.trim() !== '';\n },\n message: R.PhoneNumberRequired,\n },\n phone: !skipConsultationDetails,\n });\n this.phone(phone);\n\n self.subject = ko.observable(null).extend({\n required: {\n params: !skipConsultationDetails,\n message: R.SubjectRequired,\n },\n });\n\n self.subject.subscribe((newValue) => {\n self.stopWordChecker.checkForStopWords(newValue);\n });\n\n self.attachments = ko.observableArray(attachments);\n\n self.error = ko.validatedObservable(this);\n self.isLongWaitingTime = ko.observable(false);\n self.minutesWaiting = ko.observable(null);\n self.notifyOwnDoctor = ko.observable(false);\n self.error.errors.showAllMessages(false);\n\n self.stepProgress = stepProgress;\n\n if (self.testResultUid !== null) {\n self.subject(R.DynamicCodeSubject);\n } else if (\n self.consultationType == ConsultationTypeEnum.AllergyCheckVideo\n ) {\n self.subject('Allergitjek');\n }\n\n const loadDraft: boolean = subjectTextDraft !== null;\n const loadBehalfOfDraft: boolean =\n loadDraft && onBehalfOfNameDraft !== null;\n const isPatientSelected: boolean = selectedPatientName !== null;\n\n if (loadDraft) {\n self.subject(subjectTextDraft);\n self.notifyOwnDoctor(notifyOwnDoctorDraft);\n }\n\n self.onBehalfPetID = onBehalfOfPetID;\n\n if (isChildSelected) {\n self.name = selectedPatientName;\n self.cpr = selectedPatientCpr;\n self.onBehalfUid = selectedPatientUid;\n } else if (loadBehalfOfDraft && !isPatientSelected) {\n self.name = onBehalfOfNameDraft;\n self.cpr = onBehalfOfCprDraft;\n self.onBehalfUid = onBehalfOfUidDraft;\n } else {\n self.name = selectedPatientName;\n self.cpr = selectedPatientCpr;\n }\n\n if (self.bookImmediately) {\n self.executeSeeDoctorNow();\n }\n\n if (document.querySelector(this.dropzoneSelector)) {\n const dropzoneOptions: DropzoneOptions = {\n url: '/api/files/upload',\n method: 'POST',\n success: (file) => {\n const uid = JSON.parse(file.xhr.responseText);\n (file as any).uid = uid;\n this.attachments.remove(null);\n this.attachments.push(uid);\n },\n init: function () {\n this.on('addedfile', function (file) {\n if (file.size > dropzoneOptions.maxFilesize) {\n alert(\n formatString(R.UploadFailedTooLarge, file.name),\n );\n self.dropzone.removeFile(file);\n }\n\n const dropzoneContainer =\n document.getElementById('dropzone');\n const previewElements =\n document.querySelectorAll('.dz-preview');\n if (previewElements.length !== 0) {\n dropzoneContainer.style.height = 'auto';\n }\n });\n this.on('removedfile', function (file) {\n const dropzoneContainer =\n document.getElementById('dropzone');\n const previewElements =\n document.querySelectorAll('.dz-preview');\n if (previewElements.length === 0) {\n dropzoneContainer.style.height = '0';\n }\n });\n },\n addRemoveLinks: true,\n acceptedFiles: 'image/jpeg,image/png,image/gif,.pdf,.mov',\n maxFiles: 10,\n maxFilesize: 30_000_000,\n };\n\n self.dropzone = new Dropzone(\n self.dropzoneSelector,\n dropzoneOptions,\n );\n\n self.dropzoneCleaner = () => {\n self.dropzone.removeAllFiles(true);\n $(self.dropzoneSelector).empty();\n };\n\n self.dropzone.on('removedfile', (file: any) => {\n self.attachments.remove(file.uid);\n });\n\n if (consultationUid != null) {\n $.get(`/api/files/attachments/${consultationUid}`, (data) => {\n $.each(data, (key, value) => {\n const mockFile = {\n name: value.FileName,\n size: value.FileByteSize,\n };\n self.dropzone.emit('addedfile', mockFile);\n self.dropzone.options.thumbnail.call(\n self.dropzone,\n mockFile,\n '/api/files/' + value.UID,\n );\n self.dropzone.emit('complete', mockFile);\n });\n });\n }\n }\n }\n\n public showSelectCaregiver() {\n Modal.show(this.selectCaregiverModal);\n }\n\n public openBookingBusyModal(): void {\n Modal.show('bookingbusy-modal');\n }\n public bookChooseTime(): void {\n //just close modal, we are already on book time page\n Modal.close('bookingbusy-modal');\n }\n public bookNextAvailableTimeslot(): void {\n Modal.close('bookingbusy-modal');\n this.selectedTimeslot(this.firstAvailableTimeslot());\n this.executeScheduleConsultationOnSpecificDate();\n }\n\n public uploadAttachment = () => {\n $(this.dropzoneSelector).trigger('click');\n };\n\n public clearQuestionnaireData(): void {\n document.cookie =\n 'QuestionnaireData' +\n '=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';\n document.cookie =\n 'QuestionnaireServiceType' +\n '=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';\n document.location.reload();\n }\n\n // for unknown reasons `this` is set to the date parameter on click\n // so we have to pass in a reference to the view model manually\n public selectTimeslot(\n self: BookVideoConsultationViewModel,\n date: Date,\n ): void {\n self.selectedTimeslot(date);\n }\n\n public acceptNotifyOwnDoctor(): void {\n this.notifyOwnDoctor(true);\n this.navigateForward();\n }\n\n public declineNotifyOwnDoctor(): void {\n this.notifyOwnDoctor(false);\n this.navigateForward();\n }\n\n public nextDayClicked() {\n this.currentTimeslotDay(this.currentTimeslotDay() + 1);\n }\n\n public previousDayClicked() {\n this.currentTimeslotDay(this.currentTimeslotDay() - 1);\n }\n\n public openNextAfterDetailsForm(): void {\n if (!this.error.isValid()) {\n this.error.errors.showAllMessages(true);\n return;\n }\n\n this.navigateForward();\n }\n\n public categorySelected(): void {\n if (!this.category()) {\n return;\n }\n this.navigateForward();\n }\n\n public navigateBack(): void {\n const currentIndex = this.pages.findIndex(\n (x) => x.page === this.currentPage(),\n );\n const next = findLast(\n this.pages,\n (x, idx) => idx < currentIndex && x.isEnabled(),\n );\n if (next == null) {\n return;\n }\n\n this.navigate(next.page);\n }\n\n public navigateForward() {\n const currentIndex = this.pages.findIndex(\n (x) => x.page === this.currentPage(),\n );\n\n const current = this.pages[currentIndex];\n if (!current.isValid()) {\n return;\n }\n\n const next = this.pages.find(\n (x, idx) => idx > currentIndex && x.isEnabled(),\n );\n if (next == null) {\n return;\n }\n\n if (this.currentPage() == Page.DetailsForm) {\n this.stopWordChecker.logIfUserContinuesWithStopWord();\n }\n\n this.navigate(next.page);\n }\n\n private navigate(page: Page): void {\n this.currentPage(page);\n switch (page) {\n case Page.SelectCaregiver:\n this.stepProgress.current(2);\n break;\n case Page.NotifyOwnDoctor:\n this.stepProgress.current(1);\n break;\n case Page.Categories:\n this.stepProgress.current(2);\n break;\n case Page.DetailsForm:\n this.stepProgress.current(1);\n break;\n case Page.Timetable:\n this.stepProgress.current(\n this.consultationHasCategories ? 3 : 2,\n );\n this.openVideoConsultationDetails();\n break;\n }\n this.scrollStepperIntoView();\n }\n\n private scrollStepperIntoView() {\n window.scrollTo({ top: 0, behavior: 'smooth' });\n }\n\n private openVideoConsultationDetails(): void {\n this.getSchedule();\n this.getApproximateWaitingTime();\n }\n\n public backToDetails() {\n this.navigate(Page.DetailsForm);\n }\n\n public executeSeeDoctorNow() {\n /* if caregiver is avalable now, start video consultation, else show booking busy dialog instead*/\n if (this.canQueueNow()) {\n this.seeDoctorNow();\n } else {\n this.openBookingBusyModal();\n }\n }\n\n public seeDoctorNow(): void {\n $('.js-schedule-now-btn').addClass('button--loading');\n\n this.isScheduleNow = true;\n this.selectedTimeslot(null);\n this.openVideoConsultation();\n }\n\n public executeScheduleConsultationOnSpecificDate() {\n this.scheduleConsultationOnSpecificDate();\n }\n\n public scheduleConsultationOnSpecificDate(): void {\n this.isScheduleNow = false;\n\n if (this.selectedTimeslot() == null) {\n this.alertModal.openAlert(R.PleaseChooseDate);\n return;\n }\n\n $('.js-schedule-btn').addClass('button--loading');\n\n this.openVideoConsultation();\n }\n\n public openVideoConsultation(): void {\n const self = this;\n\n if (!self.error.isValid()) {\n self.error.errors.showAllMessages();\n $('.js-schedule-now-btn').removeClass('button--loading');\n $('.js-schedule-btn').removeClass('button--loading');\n return;\n }\n\n if (self.isBooking) {\n return;\n }\n\n self.isBooking = true;\n\n const callbackError = (\n response: any,\n status: any,\n error: any,\n ): void => {\n self.isBooking = false;\n switch (response.status) {\n case 402:\n self.alertModal.openAlert(R.InvalidPayment);\n break;\n case 409:\n if (\n response.responseJSON.Status ===\n OpenVideoConsultationStatusEnum.TimeSlotOverbooked ||\n response.responseJSON.Status ===\n OpenVideoConsultationStatusEnum.NoDoctorsAvailable\n ) {\n self.alertModal.openAlert(R.TimeSlotUnavailable);\n self.getSchedule();\n break;\n }\n default:\n self.alertModal.openAlert(R.ErrorSchedulingConsultation);\n break;\n }\n $('.js-schedule-now-btn').removeClass('button--loading');\n $('.js-schedule-btn').removeClass('button--loading');\n };\n\n const callbackSucces = (\n response: IOpenVideoConsultationResult,\n status: any,\n error: any,\n ): void => {\n if (response.Status === 0 && response.NewConsultationGuid) {\n let redirectUrl: string;\n if (self.isScheduleNow) {\n redirectUrl =\n window.location.origin +\n '/consultations/' +\n response.NewConsultationGuid +\n '/videocall';\n } else {\n const scheduledDateParam =\n '?scheduled=' +\n encodeURIComponent(\n self.selectedTimeslot().toISOString(),\n );\n\n redirectUrl =\n window.location.origin +\n '/consultations/video/' +\n response.NewConsultationGuid +\n '/scheduled-date' +\n scheduledDateParam;\n }\n\n if (response.RequiresPayment) {\n window.location.href =\n window.location.origin +\n '/payment/plan?consultation=' +\n response.NewConsultationGuid;\n } else {\n window.location.href = redirectUrl;\n }\n } else {\n callbackError(response, status, error);\n }\n };\n\n self.createVideoConsultation(callbackSucces, callbackError);\n }\n\n public createVideoConsultation(\n successCallback: (\n response: any,\n status: string,\n jqXhr: JQueryXHR,\n ) => any,\n errorCallback: (jqXhr: JQueryXHR, status: string, error: string) => any,\n ): void {\n const request: IOpenVideoConsultationRequest = {\n FromFullName: this.name,\n Category: this.category(),\n CprNumber: this.cpr,\n MobileNumber: this.phone(),\n Subject: this.subject() || 'Videokonsultation',\n OnBehalfUID: this.onBehalfUid,\n OnBehalfOfPetID: this.onBehalfPetID,\n ConsultationType: this.consultationType,\n NotifyOwnDoctor: this.notifyOwnDoctor(),\n TestResultUid: this.testResultUid,\n QuestionnaireResult: this.questionnaireResult,\n PreferredCaregiverUid: this.preferredCaregiver() || null,\n ConsultationUid: this.consultationUid,\n FileUids: this.attachments(),\n };\n if (this.selectedTimeslot() != null) {\n request.ScheduledOn = this.selectedTimeslot();\n }\n\n ajaxCall(\n 'POST',\n 'api/consultations/video',\n successCallback,\n errorCallback,\n JSON.stringify(request),\n );\n }\n\n private async getSchedule(): Promise {\n const startingDate = startOfToday();\n const endingDate = addDays(new Date(), 6);\n\n const request: IGetScheduleRequest = {\n FromDate: startingDate.toJSON(),\n ToDate: endingDate.toJSON(),\n ConsultationType: this.consultationType,\n ConsultationDraftScheduledOn: this.consultationDraftScheduledOn,\n };\n\n try {\n const query = Object.entries(request)\n .map(([key, value]) => key + '=' + encodeURIComponent(value))\n .join('&');\n const response: ITimeSlotDto[] = await fetch(\n '/api/consultations/video/schedule/v2?' + query,\n );\n\n this.allTimeSlots.removeAll();\n this.allTimeSlots.push(...response);\n this.hasLoadedTimeslots(true);\n if (this.allTimeSlots().length > 0) {\n const firstTimeslot = parseISO(this.allTimeSlots()[0].Start);\n\n this.firstAvailableTimeslot(firstTimeslot);\n this.firstAvailableTimeslotFormatted(\n Utils.formatLongDateTime(this.allTimeSlots()[0].Start),\n );\n }\n } catch (error) {\n this.alertModal.openAlert(R.ErrorFetchingTimetable);\n }\n }\n\n private getApproximateWaitingTime(): void {\n const callBackAjax = (\n response: IApproximateWaitingTimeResponse,\n status: any,\n error: any,\n ): void => {\n if (!response.IsQueueEnabled) {\n this.disableQueueNow();\n return;\n }\n\n const waitingTimeMinutes = Utils.timeSpanStringToMinutes(\n response.ApproximateWaitingTime,\n );\n\n this.minutesWaiting(R.WaitingTimeText(waitingTimeMinutes));\n this.isLongWaitingTime(response.IsLongWaitingTime);\n };\n\n const errorCallBack = (response: JQueryXHR): void => {\n this.alertModal.openAlert(R.ErrorFetchingTimetable);\n };\n\n ajaxCall(\n 'GET',\n `api/consultations/video/waitingtime/v2?consultationType=${this.consultationType}`,\n callBackAjax,\n errorCallBack,\n );\n }\n\n public toggleCategoryOnEnter(\n data: BookVideoConsultationViewModel,\n event: JQuery.Event,\n categoryId: string,\n ) {\n if (event.key !== 'Enter') return true; // to avoid prevention of default behaviour\n\n this.category(categoryId);\n }\n\n private disableQueueNow(): void {\n this.canQueueNow(false);\n }\n}\n","export class StepProgress {\n public steps: number;\n public current: KnockoutObservable;\n\n constructor(steps: number, current: number) {\n this.steps = steps;\n this.current = ko.observable(current);\n }\n}\n","import {\n IConsultationDto,\n IRateConsultationRequest,\n} from '@/shared/interfaces';\nimport { fetch } from '@/shared/fetch';\nimport { R } from '@/Resources.resx';\nimport { AlertViewModel } from '../AlertViewModel';\nimport { ReceiveVideoCall } from './ReceiveVideoCallFromDoctor';\n\nexport class RateConsultation {\n public receiveVideoCall: ReceiveVideoCall;\n\n public rating: KnockoutObservable;\n public comment: KnockoutObservable;\n public isSubmitting: KnockoutObservable;\n public feedbackTitle: KnockoutComputed;\n public feedbackText: KnockoutComputed;\n public messages: { title: string; text: string }[];\n private consultationUid: string;\n private alertModal: AlertViewModel;\n\n constructor(consultation: IConsultationDto) {\n this.messages = [\n {\n title: R.Darn,\n text: R.SorryForYourConcerns,\n },\n {\n title: R.Darn,\n text: R.SorryForYourConcerns,\n },\n {\n title: R.ThankYou,\n text: R.ImproveOurselves,\n },\n {\n title: R.Great,\n text: R.BigHelp,\n },\n {\n title: R.Great,\n text: R.BigHelp,\n },\n ];\n\n this.consultationUid = consultation.UID;\n this.alertModal = new AlertViewModel();\n this.receiveVideoCall = new ReceiveVideoCall();\n\n this.rating = ko.observable(consultation.Rating);\n this.comment = ko.observable(consultation.RatingComment);\n this.isSubmitting = ko.observable(false);\n\n this.feedbackTitle = ko.computed(() => {\n const value = this.rating();\n const isValid = value >= 1 && value <= this.messages.length;\n return isValid ? this.messages[value - 1].title : '';\n });\n\n this.feedbackText = ko.computed(() => {\n const value = this.rating();\n const isValid = value >= 1 && value <= this.messages.length;\n return isValid ? this.messages[value - 1].text : '';\n });\n\n this.rating.subscribe(async (newValue) => {\n try {\n await this.saveRating();\n } catch (error) {\n // fails quietly\n }\n });\n }\n\n async handleSubmit() {\n try {\n await this.saveRating();\n window.location.href =\n window.location.origin + '/consultations/rateconfirmation';\n } catch (error) {\n this.alertModal.openAlert(R.ErrorRate);\n }\n }\n\n public async saveRating(): Promise {\n if (this.isSubmitting()) {\n return;\n }\n this.isSubmitting(true);\n\n const request: IRateConsultationRequest = {\n Rating: this.rating(),\n RatingComment: this.comment(),\n };\n\n try {\n await fetch(\n `/api/consultations/${this.consultationUid}/rate`,\n 'POST',\n request,\n 'application/json',\n );\n this.isSubmitting(false);\n } catch (error) {\n this.isSubmitting(false);\n throw error;\n }\n }\n}\n","import 'knockout.validation';\nimport * as ko from 'knockout';\nimport {\n IInsurancePolicyProvider,\n ISetPolicyNumberRequest,\n ISetPolicyNumberResponse,\n IStatus,\n} from '@/shared/interfaces';\nimport { R } from '@/Resources.resx';\nimport { Utils } from '@/shared/Utils';\nimport { ajaxCall } from '@/knockout/ajaxCall';\n\nexport class ProfileInsuranceViewModel {\n public provider = ko.observable();\n\n public policyNumber = ko.observable('');\n public title = ko.observable('');\n public description = ko.observable('');\n public inputLabel = ko.observable('');\n public callToAction = ko.observable('');\n public isSubmitting = ko.observable(false);\n public interactedWithInput = ko.observable(false);\n\n public showInputField = ko.pureComputed(\n () => this.useIdentifierField && this.isOnFinalPage(),\n );\n public isOnFinalPage = ko.pureComputed(\n () =>\n !this.hasTwoPages ||\n this.description() == this.provider().Description2,\n );\n\n private hasTwoPages = false;\n private useIdentifierField = false;\n\n private validator: KnockoutValidationGroup;\n\n constructor(provider: IInsurancePolicyProvider, policyNumber?: string) {\n this.provider(provider);\n\n this.policyNumber.extend({\n required: {\n param: true,\n message: () => {\n return this.provider()\n ? this.provider().IdentifierTerm + ' skal udfyldes'\n : '';\n },\n },\n });\n\n this.validator = ko.validatedObservable([this.policyNumber]);\n\n this.policyNumber(policyNumber);\n this.title(provider.Name);\n this.description(\n policyNumber && provider.PrefilledIdentifierDescription\n ? provider.PrefilledIdentifierDescription\n : provider.Description,\n );\n this.callToAction(provider.CallToAction);\n this.inputLabel(provider.IdentifierTerm);\n this.useIdentifierField = provider.ShowIdentifierField;\n this.hasTwoPages = provider.HasTwoPages;\n }\n\n public setPolicyNumber = () => {\n if (!this.isOnFinalPage()) {\n this.description(this.provider().Description2);\n this.callToAction(this.provider().CallToAction2);\n if (document.activeElement instanceof HTMLElement) {\n document.activeElement.blur();\n }\n return;\n }\n\n const redirect = () => {\n const urlParams = new URLSearchParams(window.location.search);\n const returnUrl = urlParams.get('returnUrl') || '/p';\n location.href = returnUrl;\n };\n\n if (!this.useIdentifierField && !this.policyNumber()) {\n this.policyNumber(crypto.randomUUID());\n }\n this.interactedWithInput(true);\n this.policyNumber.clearError();\n\n if (!this.validator.isValid()) {\n this.validator.errors.showAllMessages(true);\n return;\n }\n\n if (this.isSubmitting()) return;\n\n this.isSubmitting(true);\n\n const ok = (\n response: IStatus,\n textStatus: string,\n jqXhr: JQueryXHR,\n ): void => {\n if (response.HasErrors) {\n const message = response.Errors.map((x) => x.Value).join();\n this.policyNumber.setError(message);\n this.validator.errors.showAllMessages(true);\n this.isSubmitting(false);\n return;\n }\n redirect();\n };\n\n const error = (\n jqXhr: JQueryXHR,\n textStatus: string,\n error: string,\n ): void => {\n const message = R.ErrorValidatingInsuranceMembership;\n this.policyNumber.setError(message);\n this.validator.errors.showAllMessages(true);\n this.isSubmitting(false);\n };\n\n const request: ISetPolicyNumberRequest = {\n Number: this.policyNumber(),\n InsurancePolicyProviderType:\n this.provider().InsurancePolicyProviderType,\n };\n\n ajaxCall(\n 'POST',\n 'api/insurance/policy-number/set/v2',\n ok,\n error,\n JSON.stringify(request),\n );\n };\n}\n","import {\n addDays,\n format as formatDate,\n intervalToDuration,\n isToday,\n parseISO,\n startOfToday,\n} from 'date-fns';\nimport Dropzone, { DropzoneOptions } from 'dropzone';\nimport * as ko from 'knockout';\nimport 'knockout.validation';\nimport {\n ConsultationTypeEnum,\n OpenVideoConsultationStatusEnum,\n} from '@/shared/enums';\nimport { fetch as commonFetch } from '@/shared/fetch';\nimport {\n IAttachment,\n IConsultationDto,\n IConsultationMessageAttachmentDto,\n IConsultationMessageDto,\n IContinueMessageConsultationRequest,\n IGetScheduleRequest,\n IOpenMessageConsultationResponse,\n IRescheduleVideoConsultationRequest,\n IRescheduleVideoConsultationResult,\n ITimelineMessage,\n ITimeSlotDto,\n ResponseError,\n} from '@/shared/interfaces';\nimport { Log } from '@/shared/Log';\nimport Modal from '@/shared/Modal';\nimport { R, format as formatString } from './ConsultationResources.resx';\nimport { Utils } from '@/shared/Utils';\nimport { AlertViewModel } from '../AlertViewModel';\nimport { ReceiveVideoCall } from './ReceiveVideoCallFromDoctor';\nimport { ajaxCall } from '@/knockout/ajaxCall';\n\ninterface ITimeslotsByDay {\n day: string;\n timeslots: Date[];\n}\n\nconst emptyUuid = '00000000-0000-0000-0000-000000000000';\n\nexport class ConsultationDetailsViewModel {\n public arrowImagePath = ko.observable('/images/icons/chevron-down.svg');\n public confirmMessage = ko.observable('');\n public daysTillWaitingRoomOpens = ko.observable(0);\n public hoursTillWaitingRoomOpens = ko.observable(0);\n public minutesTillWaitingRoomOpens = ko.observable(0);\n public showWaitingRoomOpen: KnockoutObservable;\n public showCountdown: KnockoutObservable;\n public showDays = ko.observable(false);\n public showMinutes = ko.observable(true);\n private linkToCancellation: string;\n public receiveVideoCall: ReceiveVideoCall;\n public alertModal: AlertViewModel;\n public messages = ko.observableArray([]);\n public textMessage: KnockoutObservable;\n public attachments: KnockoutObservableArray;\n private isBooking: boolean;\n public isPaid = ko.observable(true);\n public shouldPay = ko.observable(true);\n public error: KnockoutValidationGroup;\n public showWaitingForReplyInfo: KnockoutObservable;\n public isVideo: KnockoutObservable;\n private consultationUid: string;\n private dropzone: Dropzone;\n private dropzoneCleaner: () => void;\n private existingMessageUuid: string;\n private isSending = false;\n public isSendMessageButtonDisabled: KnockoutComputed;\n public errorMessages = ko.observableArray([]);\n private caregivers = ko.observableArray<{\n Uid: string;\n FullName: string;\n } | null>(null);\n public preferredCaregiver = ko.observable(emptyUuid);\n public preferredCaregiverName = ko.computed(() => {\n const caregivers = this.caregivers();\n if (caregivers == null) {\n return '';\n }\n\n const preferredCaregiver = this.preferredCaregiver();\n const matchingCaregiver =\n preferredCaregiver === emptyUuid\n ? null\n : caregivers.find((x) => x.Uid == preferredCaregiver);\n\n return (\n matchingCaregiver?.FullName ??\n R.BookVideoConsultation_FirstAvailableCaregiver\n );\n });\n private consultationDraftScheduledOn: string | null = null;\n public selectedTimeslot = ko.observable(null);\n public hasLoadedTimeslots = ko.observable(false);\n private consultationType: ConsultationTypeEnum;\n public firstAvailableTimeslot = ko.observable(null);\n public firstAvailableTimeslotFormatted = ko.observable(null);\n public showTimeZoneWarning =\n Intl.DateTimeFormat().resolvedOptions().timeZone != 'Europe/Copenhagen';\n public timeZoneWarning = formatString(\n R.TimeZoneWarning,\n Intl.DateTimeFormat().resolvedOptions().timeZone,\n );\n\n // rateLimit prevents updating the timeslotsByDay computed on every insert\n private allTimeSlots = ko.observableArray();\n\n public shouldShowSelectCaregiver = ko.computed(() => {\n return this.caregivers() != null && this.preferredCaregiver() == null;\n });\n\n public timeslots = ko.computed(() => {\n const preferredCaregiver = this.preferredCaregiver();\n let timeslots = this.allTimeSlots();\n if (preferredCaregiver !== emptyUuid) {\n timeslots = timeslots.filter((x) => {\n return x.AvailableCaregivers.includes(preferredCaregiver);\n });\n }\n const arrayOfTimeSlots = timeslots.map((x) => parseISO(x.Start));\n\n if (\n arrayOfTimeSlots.length > 0 &&\n this.consultationDraftScheduledOn != null\n ) {\n const consultationDraftScheduledOnFormatted = parseISO(\n this.consultationDraftScheduledOn,\n );\n const timeSlotDraft = arrayOfTimeSlots.find(\n (t) =>\n t.toJSON() ==\n consultationDraftScheduledOnFormatted.toJSON(),\n );\n\n if (timeSlotDraft) {\n this.selectedTimeslot(timeSlotDraft);\n }\n }\n\n return arrayOfTimeSlots;\n });\n\n public timeslotsByDay = ko.computed(() => {\n const timeslotMap: { [day: string]: Date[] } = {};\n\n // group the timeslots by date in a map\n this.timeslots().reduce((result, currentItem) => {\n const key = isToday(currentItem)\n ? R.Today\n : formatDate(currentItem, 'eeee') +\n ', ' +\n Utils.formatLongDate(currentItem);\n (result[key] = result[key] || []).push(currentItem);\n return result;\n }, timeslotMap);\n\n // convert the map to an array to simplify knockout rendering\n const timeslotArray: ITimeslotsByDay[] = [];\n\n for (const key in timeslotMap) {\n const value = timeslotMap[key];\n timeslotArray.push({ day: key, timeslots: value });\n }\n\n return timeslotArray;\n });\n\n public currentTimeslotDay = ko.observable(0);\n\n public visibleTimeslotsPerDay = ko.computed(() => {\n return this.timeslotsByDay()[this.currentTimeslotDay()];\n });\n\n constructor(\n consultation: IConsultationDto,\n consultationType: ConsultationTypeEnum,\n caregivers: Array<{ Uid: string; FullName: string }> | null,\n preferredCaregiver: string = emptyUuid,\n existingMessageUuid: string | null = null,\n message = '',\n attachments: string[] = [],\n canReply = false,\n isVideo = false,\n ) {\n const self = this;\n self.receiveVideoCall = new ReceiveVideoCall();\n\n const now = new Date();\n const opensOn = parseISO(consultation.OpensOn);\n const closesOn = parseISO(consultation.ClosesOn);\n self.showWaitingRoomOpen = ko.observable(\n opensOn < now && now < closesOn,\n );\n self.showCountdown = ko.observable(now < opensOn);\n self.updateTime(opensOn, closesOn);\n setInterval(self.updateTime.bind(self), 1_000, opensOn, closesOn);\n self.existingMessageUuid = existingMessageUuid;\n self.consultationUid = consultation.UID;\n self.alertModal = new AlertViewModel();\n self.attachments = ko.observableArray(attachments);\n self.textMessage = ko.observable(message).extend({\n required: {\n message: ' ',\n },\n });\n self.isVideo = ko.observable(isVideo);\n self.isSendMessageButtonDisabled = ko.computed(() => {\n return this.textMessage().trim() === '';\n });\n self.consultationType = consultationType;\n self.caregivers(caregivers);\n self.preferredCaregiver(preferredCaregiver);\n\n if (canReply) {\n const dropzoneOptions: DropzoneOptions = {\n url: '/api/files/upload',\n method: 'POST',\n success: (file: any) => {\n const uid = JSON.parse(file.xhr.responseText);\n (file as any).uid = uid;\n this.attachments.push(uid);\n },\n init: function () {\n this.on('addedfile', function (file) {\n if (file.size > dropzoneOptions.maxFilesize) {\n const newErrorMessage = formatString(\n R.UploadFailedTooLarge,\n file.name,\n );\n self.errorMessages.push(newErrorMessage);\n self.dropzone.removeFile(file);\n return;\n }\n\n const dropzoneContainer =\n document.getElementById('dropzone');\n\n const previewElements =\n document.querySelectorAll('.dz-preview');\n if (previewElements.length !== 0) {\n dropzoneContainer.style.height = 'auto';\n }\n\n // Show \"Add more\" icon\n const existingAddFilesContainer =\n document.getElementById('addFilesContainer');\n if (existingAddFilesContainer) {\n existingAddFilesContainer.remove();\n }\n\n const addFilesContainer = document.createElement('div');\n addFilesContainer.id = 'addFilesContainer';\n addFilesContainer.className =\n 'inline-block mt-1 mr-1 mb-2 ml-1 border border-grey-100 hover:bg-grey-100';\n addFilesContainer.style.borderRadius = '20px';\n addFilesContainer.style.width = '80px';\n addFilesContainer.style.height = '80px';\n addFilesContainer.onclick = function () {\n self.uploadAttachment();\n };\n\n const alignmentWrapper = document.createElement('div');\n alignmentWrapper.className =\n 'flex flex-col h-full items-center justify-center';\n alignmentWrapper.style.cursor = 'pointer';\n\n const addFilesIcon = document.createElement('img');\n addFilesIcon.src =\n '/images/icons/attachment-plus-icon.svg';\n addFilesIcon.style.width = '24px';\n addFilesIcon.style.height = '24px';\n addFilesIcon.style.cursor = 'pointer';\n\n const addFilesText = document.createElement('div');\n addFilesText.className = 'text-sm mt-2';\n addFilesText.textContent = R.AddMore;\n addFilesText.style.cursor = 'pointer';\n\n alignmentWrapper.appendChild(addFilesIcon);\n alignmentWrapper.appendChild(addFilesText);\n addFilesContainer.appendChild(alignmentWrapper);\n dropzoneContainer.appendChild(addFilesContainer);\n\n // Show \"Remove file\" icon\n const customRemoveLink =\n document.createElement('button');\n customRemoveLink.className =\n 'p-0 border-0 bg-transparent dz-remove absolute mt-1 mr-1 z-[999] top-0 right-0';\n customRemoveLink.innerHTML =\n '';\n customRemoveLink.style.height = '24px';\n\n file.previewElement.appendChild(customRemoveLink);\n\n customRemoveLink.addEventListener('click', function () {\n self.dropzone.removeFile(file);\n\n // Remove outdated error messages\n self.errorMessages.removeAll();\n\n // Remove 'Add more' icon, if no files are selected\n const previewElements =\n document.querySelectorAll('.dz-preview');\n if (previewElements.length === 0) {\n const addFilesContainer =\n document.getElementById(\n 'addFilesContainer',\n );\n if (addFilesContainer) {\n addFilesContainer.remove();\n }\n\n // Hide dropzone, if no files are selected\n const dropzoneContainer =\n document.getElementById('dropzone');\n dropzoneContainer.style.height = '0px';\n }\n });\n });\n this.on('error', function (file, message) {\n self.dropzone.removeFile(file);\n const newErrorMessage = message.toString();\n\n // Only show 'MaxFilesExceeded' error message once\n self.errorMessages.remove(newErrorMessage);\n self.errorMessages.push(newErrorMessage);\n });\n },\n addRemoveLinks: false,\n acceptedFiles: 'image/jpeg,image/png,image/gif,.pdf,.mov',\n maxFiles: 10,\n maxFilesize: 30_000_000,\n dictMaxFilesExceeded: R.MaxFilesExceeded,\n dictInvalidFileType: R.InvalidFileType,\n };\n\n self.dropzone = new Dropzone('#dropzone', dropzoneOptions);\n\n self.dropzone.on('removedfile', (file: any) => {\n self.attachments.remove(file.uid);\n });\n\n self.dropzoneCleaner = () => {\n self.dropzone.removeAllFiles(true);\n $('#dropzone').empty();\n };\n\n if (existingMessageUuid !== null) {\n fetch(`/api/files/attachments/${existingMessageUuid}`)\n .then((response) => response.json())\n .then(\n (\n data: Array<{\n FileName: string;\n FileByteSize: number;\n UID: string;\n }>,\n ) => {\n data.forEach((value) => {\n const mockFile = {\n name: value.FileName,\n size: value.FileByteSize,\n };\n self.dropzone.emit('addedfile', mockFile);\n self.dropzone.options.thumbnail.call(\n self.dropzone,\n mockFile,\n '/api/files/' + value.UID,\n );\n self.dropzone.emit('complete', mockFile);\n });\n },\n )\n .catch((error) => Log.error('Error fetching data:', error));\n }\n\n document\n .getElementById('attachment-input')\n .addEventListener('change', function () {\n $('.js-send-button').prop('disabled', true);\n $('.js-upload-anchor').prop('disabled', true);\n const input = this as HTMLInputElement;\n for (let i = 0; i < input.files.length; i++) {\n const file = input.files.item(i);\n const fd = new FormData();\n fd.append('file', file);\n $.ajax({\n method: 'POST',\n url: '/api/files/upload',\n success: (data) => {\n self.attachments.push(data);\n $('.js-send-button').prop('disabled', false);\n $('.js-upload-anchor').prop('disabled', false);\n },\n error: (data) => {\n self.alertModal.openAlert(\n 'Error occured while uploading file',\n );\n $('.js-send-button').prop('disabled', false);\n $('.js-upload-anchor').prop('disabled', false);\n },\n contentType: false,\n processData: false,\n accepts: { '*': '' },\n data: fd,\n });\n }\n });\n }\n\n self.error = ko.validatedObservable(this);\n self.error.errors.showAllMessages(false);\n self.initConsultation(consultation);\n self.showWaitingForReplyInfo = ko.computed(() => {\n const consultationLength = this.messages().length;\n\n if (consultationLength > 0) {\n const latestMessage = this.messages()[consultationLength - 1];\n return !latestMessage.isDoctorType;\n }\n\n return false;\n });\n }\n\n public nextDayClicked() {\n this.currentTimeslotDay(this.currentTimeslotDay() + 1);\n }\n\n public previousDayClicked() {\n this.currentTimeslotDay(this.currentTimeslotDay() - 1);\n }\n\n public isPreviousDayButtonVisible = ko.computed(() => {\n return this.currentTimeslotDay() > 0;\n });\n\n public isNextDayButtonVisible = ko.computed(() => {\n return !!this.timeslotsByDay()[this.currentTimeslotDay() + 1];\n });\n\n // for unknown reasons `this` is set to the date parameter on click\n // so we have to pass in a reference to the view model manually\n public selectTimeslot(\n self: ConsultationDetailsViewModel,\n date: Date,\n ): void {\n self.selectedTimeslot(date);\n }\n\n public toggleBookingConfirmation(): void {\n const button = document.getElementById(\n 'toggleBookingConfirmationButton',\n );\n const panel = button.nextElementSibling as HTMLElement;\n\n if (panel.style.maxHeight != '0px') {\n this.arrowImagePath('/images/icons/chevron-down.svg');\n panel.style.maxHeight = '0px';\n } else {\n this.arrowImagePath('/images/icons/chevron-up.svg');\n panel.style.maxHeight = panel.scrollHeight + 'px';\n }\n\n button.blur();\n }\n\n public cancelConsultation(): void {\n document.location.href = this.linkToCancellation;\n }\n\n public openConfirmCancelModal(\n linkToCancellation: string,\n consultationScheduledOn: string,\n minutesToMeetingAfterWhichBookingCantBeRefunded: number,\n confirmCancelMessage: string,\n ): void {\n this.linkToCancellation = linkToCancellation;\n\n this.confirmMessage('');\n const scheduledOn = new Date(consultationScheduledOn).getTime();\n const now = new Date().getTime();\n const totalMinutes = Math.floor((scheduledOn - now) / 1000 / 60);\n const itIsBitLateForCancellation =\n totalMinutes < minutesToMeetingAfterWhichBookingCantBeRefunded;\n if (itIsBitLateForCancellation) {\n this.confirmMessage(confirmCancelMessage);\n }\n\n Modal.show('confirm-cancel-modal');\n }\n\n public closeConfirmModal(): void {\n Modal.close('confirm-cancel-modal');\n }\n\n public openRescheduleConsultationModal(): void {\n this.getSchedule();\n Modal.show('reschedule-consultations-modal');\n }\n\n public closeRescheduleConsultationModal(): void {\n Modal.close('reschedule-consultations-modal');\n }\n\n private updateTime(\n waitingRoomOpensOn: Date,\n waitingRoomClosesOn: Date,\n ): void {\n const now = new Date();\n\n const duration = intervalToDuration({\n start: now,\n end: waitingRoomOpensOn,\n });\n\n this.daysTillWaitingRoomOpens(duration.days);\n this.hoursTillWaitingRoomOpens(duration.hours);\n this.minutesTillWaitingRoomOpens(duration.minutes + 1);\n\n this.showDays(this.daysTillWaitingRoomOpens() > 0);\n this.showMinutes(!this.showDays());\n\n this.showWaitingRoomOpen(\n waitingRoomOpensOn < now && now < waitingRoomClosesOn,\n );\n this.showCountdown(now < waitingRoomOpensOn);\n }\n\n public uploadAttachment = () => {\n // Remove outdated error messages\n this.errorMessages.removeAll();\n\n $('#dropzone').trigger('click');\n };\n\n public sendMessage(): void {\n const self = this;\n\n if (!self.error.isValid()) {\n self.error.errors.showAllMessages();\n return;\n }\n\n if (self.isSending) {\n return;\n }\n\n self.isSending = true;\n\n const errorCallback = (\n response: JQueryXHR,\n status: string,\n error: string,\n ): void => {\n self.isSending = false;\n switch (response.status) {\n case 402:\n self.alertModal.openAlert(R.InvalidPayment);\n break;\n default:\n self.alertModal.openAlert(R.ErrorSendingMessage);\n break;\n }\n };\n\n const successCallback = (\n response: IOpenMessageConsultationResponse,\n status: string,\n jqXhr: JQueryXHR,\n ): void => {\n if (response.RequiresPayment) {\n window.location.href =\n window.location.origin +\n '/payment/plan?consultation=' +\n response.ConsultationMessageGuid;\n } else {\n window.location.href =\n window.location.origin +\n '/consultations/' +\n response.ConsultationMessageGuid +\n '/sentemail';\n }\n };\n\n self.responseToDoctor(successCallback, errorCallback);\n }\n\n public responseToDoctor(\n successCallback: (\n response: IOpenMessageConsultationResponse,\n status: string,\n jqXhr: JQueryXHR,\n ) => any,\n errorCallback: (\n response: JQueryXHR,\n status: string,\n error: string,\n ) => any,\n ): void {\n const self = this;\n\n const request: IContinueMessageConsultationRequest = {\n ExistingMessageGuid: self.existingMessageUuid,\n Message: self.textMessage(),\n FileUids: self.attachments(),\n };\n\n ajaxCall(\n 'POST',\n 'api/consultations/' + self.consultationUid + '/messages/v3',\n successCallback,\n errorCallback,\n JSON.stringify(request),\n );\n }\n\n private initConsultation(consultation: IConsultationDto): void {\n const self = this;\n\n self.isPaid(consultation.PaidOn !== null);\n self.shouldPay(consultation.RequiresPayment);\n\n const messages: IConsultationMessageDto[] = self.isVideo()\n ? consultation.VideoMessages\n : consultation.Messages;\n\n messages.forEach((item: IConsultationMessageDto) => {\n const isDoctor = item.FromUser === null;\n if (!item.PaymentVerificationData.PaidOn && !isDoctor) {\n return;\n }\n const currentTimelineMessage: ITimelineMessage = {\n userUid: item.FromUser == null ? null : item.FromUser.UID,\n // naive link detection\n message: item.Message.replace(\n /(\\b(https?):\\/\\/[\\-A-Z0-9+&@#\\/%?=~_|!:,.;]*[\\-A-Z0-9+&@#\\/%=~_|])/gi,\n '$1',\n ).trim(),\n isDoctorType: isDoctor,\n sentOn: item.SentOn,\n attachments: item.Attachments.map(\n (attachment: IConsultationMessageAttachmentDto) => {\n const file: IAttachment = {\n fileUid: attachment.File.UID,\n fileName: this.truncateFileName(\n attachment.File.FileName,\n ),\n canShowPreview: this.canShowPreview(\n attachment.File.FileName,\n ),\n };\n return file;\n },\n ).sort(\n (a, b) =>\n // place attachments with no preview on bottom\n Number(b.canShowPreview) - Number(a.canShowPreview),\n ),\n };\n self.messages.push(currentTimelineMessage);\n });\n }\n\n private canShowPreview(fileName: string): boolean {\n const pathParts = fileName.split('.');\n const fileType = pathParts[pathParts.length - 1];\n return (\n fileType === 'png' ||\n fileType === 'jpeg' ||\n fileType === 'gif' ||\n fileType === 'jpg'\n );\n }\n\n private truncateFileName(fileName: string): string {\n const maxLength = 20;\n const cutOffPoint = 8;\n\n if (fileName.length < maxLength) {\n return fileName;\n }\n\n const start = fileName.substring(0, cutOffPoint);\n const end = fileName.substring(fileName.length - cutOffPoint);\n const middle = '....';\n return `${start}${middle}${end}`;\n }\n\n public autoExpandHeight(): void {\n const textarea = document.getElementById('textMessage');\n\n if (!textarea) return;\n\n textarea.style.height = 'auto'; // decrease height when text is removed\n textarea.style.height = textarea.scrollHeight + 'px'; // increase height when text is added\n textarea.style.borderRadius =\n textarea.scrollHeight > 39 ? '16px' : '28px';\n }\n\n private async getSchedule(): Promise {\n const startingDate = startOfToday();\n const endingDate = addDays(new Date(), 6);\n\n const request: IGetScheduleRequest = {\n FromDate: startingDate.toJSON(),\n ToDate: endingDate.toJSON(),\n ConsultationType: this.consultationType,\n ConsultationDraftScheduledOn: this.consultationDraftScheduledOn,\n };\n\n try {\n const query = Object.entries(request)\n .map(([key, value]) => key + '=' + encodeURIComponent(value))\n .join('&');\n const response: ITimeSlotDto[] = await commonFetch(\n '/api/consultations/video/schedule/v2?' + query,\n );\n\n this.allTimeSlots.removeAll();\n this.allTimeSlots.push(...response);\n this.hasLoadedTimeslots(true);\n if (this.allTimeSlots().length > 0) {\n const firstTimeslot = parseISO(this.allTimeSlots()[0].Start);\n\n this.firstAvailableTimeslot(firstTimeslot);\n this.firstAvailableTimeslotFormatted(\n Utils.formatLongDateTime(this.allTimeSlots()[0].Start),\n );\n }\n } catch (error) {\n this.alertModal.openAlert(R.ErrorFetchingTimetable);\n }\n }\n\n public executeScheduleConsultationOnSpecificDate() {\n this.rescheduleConsultationOnSpecificDate();\n }\n\n public rescheduleConsultationOnSpecificDate(): void {\n if (this.selectedTimeslot() == null) {\n this.alertModal.openAlert(R.PleaseChooseDate);\n return;\n }\n $('.js-schedule-btn').addClass('button--loading');\n\n this.rescheduleVideoConsultation();\n }\n\n public async rescheduleVideoConsultation(): Promise {\n const self = this;\n\n if (self.isBooking) {\n return;\n }\n\n self.isBooking = true;\n\n const request: IRescheduleVideoConsultationRequest = {\n UID: this.consultationUid,\n PreferredCaregiverUid: this.preferredCaregiver(),\n ConsultationType: this.consultationType,\n };\n if (this.selectedTimeslot() != null) {\n request.ScheduledOn = this.selectedTimeslot();\n }\n\n try {\n const response =\n await commonFetch(\n '/api/consultations/reschedule-video',\n 'POST',\n request,\n );\n if (response.Status == 0) {\n this.callbackSucces(response);\n }\n } catch (error) {\n this.isBooking = false;\n $('.js-schedule-btn').removeClass('button--loading');\n if ((error as ResponseError).status == 409) {\n if (\n error.data.Status ==\n OpenVideoConsultationStatusEnum.TooLateToReschedule\n ) {\n self.alertModal.openAlert(R.TooLateToReschedule);\n } else {\n self.alertModal.openAlert(R.TimeSlotUnavailable);\n self.getSchedule();\n }\n } else {\n this.alertModal.openAlert(R.ErrorSchedulingConsultation);\n }\n }\n }\n\n public showSelectCaregiver(): void {\n this.preferredCaregiver(null);\n this.selectedTimeslot(null);\n }\n private callbackSucces(response: IRescheduleVideoConsultationResult) {\n if (response.Status === 0 && response.ConsultationGuid) {\n window.location.reload();\n }\n }\n}\n","import {\n ICallQualityFeedbackDto,\n ICallQualityFeedbackRequest,\n} from '@/shared/interfaces';\nimport { R } from '@/Resources.resx';\nimport { AlertViewModel } from '../AlertViewModel';\nimport { ajaxCall } from '@/knockout/ajaxCall';\n\nexport class CallQualityFeedback {\n public qualityOk: KnockoutObservable;\n public qualityBad: KnockoutObservable;\n public qualityBadSound: KnockoutObservable;\n public qualityBadVideo: KnockoutObservable;\n public qualityBadConnection: KnockoutObservable;\n public qualityNoConnection: KnockoutObservable;\n public qualityBadUserInterface: KnockoutObservable;\n public qualityBadOther: KnockoutObservable;\n public qualityDescription: KnockoutObservable;\n private consultationUid: string;\n private videoSessionUid: string;\n private azureCallId: string;\n private alertModal: AlertViewModel;\n private isSaving: boolean;\n\n constructor(feedback: ICallQualityFeedbackDto) {\n const self = this;\n\n self.consultationUid = feedback.ConsultationUid;\n self.videoSessionUid = feedback.VideoSessionUid;\n self.azureCallId = feedback.AzureCallId;\n\n self.alertModal = new AlertViewModel();\n self.isSaving = false;\n\n self.qualityOk = ko.observable(false);\n self.qualityBad = ko.observable(true);\n self.qualityBadSound = ko.observable(false);\n self.qualityBadVideo = ko.observable(false);\n self.qualityBadConnection = ko.observable(false);\n self.qualityNoConnection = ko.observable(false);\n self.qualityBadUserInterface = ko.observable(false);\n self.qualityBadOther = ko.observable(false);\n\n self.qualityDescription = ko.observable('');\n }\n\n public saveFeedback(): void {\n const self = this;\n\n if (self.isSaving) {\n // Guard against double submits\n return;\n }\n self.isSaving = true;\n\n const request: ICallQualityFeedbackRequest = {\n QualityOk: self.qualityOk(),\n QualityBad: self.qualityBad(),\n QualityBadSound: self.qualityBadSound(),\n QualityBadVideo: self.qualityBadVideo(),\n QualityBadConnection: self.qualityBadConnection(),\n QualityNoConnection: self.qualityNoConnection(),\n QualityBadUserInterface: self.qualityBadUserInterface(),\n QualityBadOther: self.qualityBadOther(),\n QualityDescription: self.qualityDescription(),\n AzureCallId: self.azureCallId,\n };\n\n const callBackAjax = (\n response: any,\n status: string,\n jqXhr: JQueryXHR,\n ): void => {\n window.location.href = window.location.origin + '/doctor';\n };\n\n const errorCallBack = (\n jqXhr: JQueryXHR,\n textStatus: string,\n error: string,\n ): void => {\n self.isSaving = false;\n self.alertModal.openAlert(R.ErrorCallQualityFeedback);\n };\n\n ajaxCall(\n 'POST',\n 'api/doctors/calls/' +\n self.consultationUid +\n '/feedback/' +\n self.videoSessionUid,\n callBackAjax,\n errorCallBack,\n JSON.stringify(request),\n );\n }\n}\n","import 'knockout.validation';\nimport * as ko from 'knockout';\n\nimport { IAddKidRequest, IKid, IStatus } from '@/shared/interfaces';\nimport { R } from '@/Resources.resx';\nimport { Utils } from '@/shared/Utils';\nimport Modal from '@/shared/Modal';\nimport { AlertViewModel } from './AlertViewModel';\nimport { fetch } from '@/shared/fetch';\nimport { ajaxCall } from '@/knockout/ajaxCall';\n\nexport class ChildModalViewModel {\n public name: KnockoutObservable;\n public CPR: KnockoutObservable;\n public CPRFormatted: KnockoutObservable;\n public CPRConfirmed: KnockoutObservable;\n public showModulus11Warning: KnockoutObservable;\n public selectedKidUid: KnockoutObservable;\n public selectedKidToDelete: IKid;\n public inputGroup: KnockoutValidationGroup;\n\n public alertModal: AlertViewModel;\n\n constructor() {\n const self = this;\n self.alertModal = new AlertViewModel();\n\n self.name = ko.observable('').extend({\n required: {\n param: true,\n message: R.PleaseEnterFullName,\n },\n fullname: {\n param: true,\n message: R.PleaseEnterFullName,\n },\n });\n\n self.CPR = ko\n .observable('')\n .extend({ cprClean: true })\n .extend({\n required: {\n param: true,\n message: R.CprRequired,\n },\n validCprLength: true,\n validCprDate: true,\n underCertainAge: 18,\n });\n\n self.CPR.subscribe((_newValue) => {\n self.showModulus11Warning(false);\n self.CPRConfirmed(false);\n });\n\n self.CPRConfirmed = ko.observable(false);\n\n self.inputGroup = ko.validatedObservable([self.name, self.CPR]);\n self.inputGroup.errors.showAllMessages(false);\n\n self.showModulus11Warning = ko.observable(false);\n\n self.CPRFormatted = ko.pureComputed(function () {\n return Utils.formatCpr(self.CPR());\n });\n\n self.selectedKidUid = ko.observable(null);\n }\n\n public confirmCprIsValid = (): void => {\n this.CPRConfirmed(true);\n if (this.selectedKidUid()) {\n this.editChild();\n } else {\n this.addChild();\n }\n };\n\n public hideModulus11Warning = (): void => {\n this.showModulus11Warning(false);\n };\n\n public openAddChildModal = () => {\n this.selectedKidUid(null);\n this.name('');\n this.CPR(null);\n this.setModalTitle();\n this.inputGroup.errors.showAllMessages(false);\n this.showModulus11Warning(false);\n this.CPRConfirmed(false);\n Modal.show('childModal');\n };\n\n public openEditChildModal = (kid: IKid) => {\n this.name(kid.Name);\n this.CPR(kid.CPR);\n this.selectedKidUid(kid.UID);\n this.setModalTitle();\n this.inputGroup.errors.showAllMessages(false);\n this.showModulus11Warning(false);\n this.CPRConfirmed(false);\n Modal.show('childModal');\n };\n\n public addChild = async () => {\n if (!this.inputGroup.isValid()) {\n this.inputGroup.errors.showAllMessages(true);\n return;\n }\n\n if (!Utils.cprModulusCheck(this.CPR()) && !this.CPRConfirmed()) {\n this.showModulus11Warning(true);\n return;\n }\n\n const request: IAddKidRequest = {\n Name: this.name(),\n CPR: this.CPR(),\n };\n\n try {\n const response: IStatus = await fetch(\n '/api/patients/child',\n 'POST',\n request,\n );\n\n if (response.HasErrors) {\n this.alertModal.openAlert(\n R.CouldNotCreateChild +\n response.Errors.map((e) => e.Value).join('\\n'),\n );\n Modal.close('childModal');\n return;\n }\n\n window.location.reload();\n } catch (error) {\n this.alertModal.openAlert(R.CouldNotCreateChild + error);\n Modal.close('childModal');\n }\n };\n\n public editChild = async () => {\n if (!this.inputGroup.isValid()) {\n this.inputGroup.errors.showAllMessages(true);\n return;\n }\n\n if (!Utils.cprModulusCheck(this.CPR()) && !this.CPRConfirmed()) {\n this.showModulus11Warning(true);\n return;\n }\n\n const kidToUpdate: IKid = {\n CPR: this.CPR().toString(),\n UID: this.selectedKidUid(),\n Name: this.name(),\n };\n\n try {\n const response: IStatus = await fetch(\n '/api/patients/kid',\n 'PUT',\n kidToUpdate,\n );\n\n if (response.HasErrors) {\n this.alertModal.openAlert(\n R.CouldNotUpdateChild +\n response.Errors.map((e) => e.Value).join('\\n'),\n );\n Modal.close('childModal');\n return;\n }\n\n window.location.reload();\n } catch (error) {\n this.alertModal.openAlert(R.CouldNotUpdateChild + error);\n Modal.close('childModal');\n }\n };\n\n public openDeleteKidModal(kidToDelete: IKid): void {\n this.selectedKidToDelete = kidToDelete;\n Modal.show('confirm-modal-kid');\n }\n\n public closeDeleteKidModal(): void {\n this.selectedKidToDelete = null;\n Modal.close('confirm-modal-kid');\n }\n\n public deleteChild(): void {\n const successCallback = (\n response: IStatus,\n textStatus: string,\n jqXhr: JQueryXHR,\n ): void => {\n if (response.HasErrors) {\n this.alertModal.openAlert(\n R.ErrorDeleteChild +\n response.Errors.map((e) => e.Value).join('\\n'),\n );\n Modal.close('confirm-modal-kid');\n return;\n }\n window.location.reload();\n };\n\n const errorCallBack = (\n jqXhr: JQueryXHR,\n textStatus: string,\n error: string,\n ): void => {\n this.alertModal.openAlert(R.ErrorDeleteChild + error);\n Modal.close('confirm-modal-kid');\n };\n\n ajaxCall(\n 'DELETE',\n 'api/patients/kid/' + this.selectedKidToDelete.UID,\n successCallback,\n errorCallBack,\n null,\n null,\n false,\n );\n }\n\n public setModalTitle() {\n const titleElement = document.getElementById('childModal-title');\n if (titleElement) {\n if (this.selectedKidUid() == null) {\n titleElement.textContent = R.Profile_AddChild;\n } else {\n titleElement.textContent = R.Profile_EditChild;\n }\n }\n }\n}\n","import { IPatientUpcomingConsultationDto } from '@/shared/interfaces';\nimport Modal from '@/shared/Modal';\nimport { AlertViewModel } from '../AlertViewModel';\nimport { ReceiveVideoCall } from './ReceiveVideoCallFromDoctor';\nimport { ConsultationTypeEnum } from '@/shared/enums';\nimport { ChildModalViewModel } from '../ChildModalViewModel';\nimport { PetModalViewModel } from '../PetModalViewModel';\nimport { fetch, FetchError } from '@/shared/fetch';\nimport { Log } from '@/shared/Log';\n\nexport class SelectPatientViewModel {\n public receiveVideoCall: ReceiveVideoCall;\n public profileState: KnockoutObservable;\n public childModal: ChildModalViewModel;\n public petModal: PetModalViewModel;\n public alertModal: AlertViewModel;\n public usersUpcomingBookingConsultationMap: IPatientUpcomingConsultationDto[];\n\n constructor(consultationType: ConsultationTypeEnum) {\n const self = this;\n self.usersUpcomingBookingConsultationMap = [];\n self.alertModal = new AlertViewModel();\n self.receiveVideoCall = new ReceiveVideoCall();\n self.childModal = new ChildModalViewModel();\n self.petModal = new PetModalViewModel();\n\n self.fetchUpcomingConsultations(consultationType).then();\n }\n\n private fetchUpcomingConsultations = async (\n consultationType: ConsultationTypeEnum,\n ) => {\n fetch(\n `/api/patients/has-upcoming-video-consultation-per-user/${consultationType}`,\n 'GET',\n )\n .then((response: IPatientUpcomingConsultationDto[]) => {\n this.usersUpcomingBookingConsultationMap = response;\n })\n .catch((err: FetchError) => {\n if (err.status === 401) window.location.reload();\n\n Log.error(\n 'Error when fetching upcoming consultations for patient',\n null,\n err,\n );\n });\n };\n\n public onSelectPatient = async (\n consultationType: string,\n handledBy: string,\n continuationUrl: string,\n patientUid: string,\n childId: number = null,\n ) => {\n const isPhysioTherapyVideo = [\n ConsultationTypeEnum[\n ConsultationTypeEnum.PhysiotherapistStartupVideo\n ],\n ConsultationTypeEnum[\n ConsultationTypeEnum.PhysiotherapistCheckupVideo\n ],\n ].includes(consultationType);\n\n if (isPhysioTherapyVideo && childId !== null) {\n try {\n const correctConsultationTypeForChild: ConsultationTypeEnum =\n await fetch(\n `/api/products/v2/${childId}/${handledBy}`,\n 'GET',\n );\n\n if (\n consultationType !=\n (correctConsultationTypeForChild as unknown as string)\n ) {\n const url = `${continuationUrl}/${correctConsultationTypeForChild}?viaselectpatient=true&patientUid=${patientUid}`;\n await this.fetchUpcomingConsultations(\n correctConsultationTypeForChild,\n );\n\n this.validateIfPatientHaveUpcomingConsultationBeforeContinuing(\n url,\n patientUid,\n );\n }\n } catch (err) {\n Log.error(\n `Error when checking correct consultation type for child in SelectPatientViewModel. Handled by ${handledBy}. ChildID: ${childId}`,\n null,\n err,\n );\n }\n } else {\n const url = `${continuationUrl}/${consultationType}?viaselectpatient=true&patientUid=${patientUid}`;\n this.validateIfPatientHaveUpcomingConsultationBeforeContinuing(\n url,\n patientUid,\n );\n }\n };\n\n public validateIfPatientHaveUpcomingConsultationBeforeContinuing = (\n continuationUrl: string,\n patientUid: string,\n ) => {\n const self = this;\n const selectedUser = self.usersUpcomingBookingConsultationMap.find(\n (x) => x.UID == patientUid,\n );\n if (selectedUser && selectedUser.HasUpcomingVideoConsultation) {\n Modal.show('youAlreadyHaveUpcomingConsultation');\n return;\n }\n\n document.location.href = continuationUrl;\n };\n\n public closeYouAlreadyHaveUpcomingConsultation = () => {\n Modal.close('youAlreadyHaveUpcomingConsultation');\n };\n}\n","import * as ko from 'knockout';\nimport 'knockout.validation';\n\nexport class PfaResultPageViewModel {\n public isSubmitting: KnockoutObservable = ko.observable(false);\n\n constructor() {\n const form = document.getElementById('acceptAndApplyForm');\n form.addEventListener('submit', () => {\n this.isSubmitting(true);\n });\n }\n}\n","export const R = {\n\t\"EditMyInformationLabelA11y\": \"Rediger mine informationer. Klik for at åbne vindue hvor du kan redigere email og telefonnummer.\",\n\t\"Name\": \"Navn\",\n\t\"Phone\": \"Telefon\",\n\t\"Email\": \"E-mail\",\n\t\"Edit\": \"Redigér\",\n\t\"CprNumber\": \"CPR-nummer\",\n\t\"Save\": \"Gem\",\n\t\"InvalidCpr\": \"Indtast venligst et gyldigt CPR‑nummer på 10 cifre.\",\n\t\"InvalidEmail\": \"Indtast venligst en gyldig e-mail.\",\n\t\"NetworkError\": \"Der opstod en fejl. Prøv venligst igen. {0}\",\n\t\"OpenEditPetModalA11y\": \"Rediger kæledyr. Klik for at åbne vindue hvor du kan redigere dit kæledyrs oplysninger.\",\n\t\"OpenDeletePetModalA11y\": \"Fjern kæledyr. Klik for at åbne vindue hvor du kan bekræfte sletning.\",\n\t\"AddPet\": \"Tilføj kæledyr\",\n\t\"PetName\": \"Kæledyrets navn\",\n\t\"PetSex\": \"Køn og status\",\n\t\"PetRace\": \"Race (valgfri)\",\n\t\"PetRacePlaceholder\": \"f.eks. labrador\",\n\t\"PetBirthdate\": \"Fødselsmåned og -år\",\n\t\"PetBirthdateHint\": \"Er du i tvivl? Dit bedste bud er fint.\",\n\t\"PetType\": \"Kæledyrstype\",\n\t\"PetWeight\": \"Vægt i kilo (valgfri)\",\n\t\"PetWeightPlaceholder\": \"f.eks. 5,2 eller 5.2\",\n\t\"MonthJanuary\": \"Januar\",\n\t\"MonthFebruary\": \"Februar\",\n\t\"MonthMay\": \"Maj\",\n\t\"MonthMarch\": \"Marts\",\n\t\"MonthApril\": \"April\",\n\t\"MonthJune\": \"Juni\",\n\t\"MonthJuly\": \"Juli\",\n\t\"MonthAugust\": \"August\",\n\t\"MonthSeptember\": \"September\",\n\t\"MonthOctober\": \"Oktober\",\n\t\"MonthNovember\": \"November\",\n\t\"MonthDecember\": \"December\",\n\t\"SelectMonth\": \"Vælg måned\",\n\t\"SelectYear\": \"Vælg år\",\n\t\"PetSexMale\": \"Han\",\n\t\"PetSexFemale\": \"Hun\",\n\t\"PetSexMaleNeutered\": \"Kastreret han\",\n\t\"PetSexFemaleSterilized\": \"Steriliseret hun\",\n\t\"PetSexUnknown\": \"Ukendt\",\n\t\"PetTypeDog\": \"Hund\",\n\t\"PetTypeCat\": \"Kat\",\n\t\"PetTypeRabbit\": \"Kanin\",\n\t\"PetTypeRodent\": \"Gnaver\",\n\t\"SelectPetType\": \"Vælg kæledyrstype\",\n\t\"SelectPetSex\": \"Vælg køn\",\n\t\"ConfirmAddPet\": \"Gem\",\n\t\"ConfirmEditPet\": \"Opdater\",\n\t\"PleaseEnterPetName\": \"Indtast venligst dit kæledyrs navn\",\n\t\"PleaseSelectPetType\": \"Vælg venligst kæledyrstype\",\n\t\"PleaseSelectPetSex\": \"Vælg venligst køn\",\n\t\"PleaseChoosePetAge\": \"Vælg venligst dit kæledyrs fødselsdato. Det behøver ikke at være 100% nøjagtigt.\",\n\t\"PleaseSelectMonth\": \"Vælg venligst måned\",\n\t\"PleaseSelectYear\": \"Vælg venligst år\"\n}","export const R = {\n\t\"EditMyInformationLabelA11y\": \"Edit my information. Click to open a modal where you can edit email address and phone number\",\n\t\"Name\": \"Name\",\n\t\"Phone\": \"Phone\",\n\t\"Email\": \"Email\",\n\t\"Edit\": \"Edit\",\n\t\"CprNumber\": \"CPR number\",\n\t\"Save\": \"Save\",\n\t\"InvalidCpr\": \"Please enter a valid CPR number (10 digits).\",\n\t\"InvalidEmail\": \"Please enter a valid email address.\",\n\t\"NetworkError\": \"There was an error. Please try again. {0}\",\n\t\"OpenEditPetModalA11y\": \"Edit pet. Click to open a modal where you can edit your pet's information.\",\n\t\"OpenDeletePetModalA11y\": \"Remove pet. Click to open a modal for confirmation of removal\",\n\t\"AddPet\": \"Add pet\",\n\t\"PetName\": \"Name of pet\",\n\t\"PetSex\": \"Sex and status\",\n\t\"PetRace\": \"Breed (optional)\",\n\t\"PetRacePlaceholder\": \"e.g. labrador\",\n\t\"PetBirthdate\": \"Birthmonth and year\",\n\t\"PetBirthdateHint\": \"Are you in doubt? Your best guess is fine.\",\n\t\"PetType\": \"Type of pet\",\n\t\"PetWeight\": \"Weight in kilograms (optional)\",\n\t\"PetWeightPlaceholder\": \"e.g. 5.2 or 5,2\",\n\t\"MonthJanuary\": \"January\",\n\t\"MonthFebruary\": \"February\",\n\t\"MonthMay\": \"May\",\n\t\"MonthMarch\": \"March\",\n\t\"MonthApril\": \"April\",\n\t\"MonthJune\": \"June\",\n\t\"MonthJuly\": \"July\",\n\t\"MonthAugust\": \"August\",\n\t\"MonthSeptember\": \"September\",\n\t\"MonthOctober\": \"October\",\n\t\"MonthNovember\": \"November\",\n\t\"MonthDecember\": \"December\",\n\t\"SelectMonth\": \"Select month\",\n\t\"SelectYear\": \"Select year\",\n\t\"PetSexMale\": \"Male\",\n\t\"PetSexFemale\": \"Female\",\n\t\"PetSexMaleNeutered\": \"Male neutered\",\n\t\"PetSexFemaleSterilized\": \"Female sterilized\",\n\t\"PetSexUnknown\": \"Unknown\",\n\t\"PetTypeDog\": \"Dog\",\n\t\"PetTypeCat\": \"Cat\",\n\t\"PetTypeRabbit\": \"Rabbit\",\n\t\"PetTypeRodent\": \"Rodent\",\n\t\"SelectPetType\": \"Select pet type\",\n\t\"SelectPetSex\": \"Select pet sex\",\n\t\"ConfirmAddPet\": \"Save\",\n\t\"ConfirmEditPet\": \"Update\",\n\t\"PleaseEnterPetName\": \"Please enter the name of your pet\",\n\t\"PleaseSelectPetType\": \"Please select pet type\",\n\t\"PleaseSelectPetSex\": \"Please select sex\",\n\t\"PleaseChoosePetAge\": \"Please select the birthdate of your pet. It does not need to be 100% accurate.\",\n\t\"PleaseSelectMonth\": \"Please select month\",\n\t\"PleaseSelectYear\": \"Please select year\"\n}","import { format } from \"@hejdoktor/resx-compiler\"\nexport { format }\nimport { getLocale } from \"@hejdoktor/resx-compiler\"\n\nimport { R as _da } from \"./ProfileResources.da.resx\"\nimport { R as _en } from \"./ProfileResources.en.resx\"\n\ntype Translations = {\n\t\"EditMyInformationLabelA11y\": string,\n\t\"Name\": string,\n\t\"Phone\": string,\n\t\"Email\": string,\n\t\"Edit\": string,\n\t\"CprNumber\": string,\n\t\"Save\": string,\n\t\"InvalidCpr\": string,\n\t\"InvalidEmail\": string,\n\t\"NetworkError\": string,\n\t\"OpenEditPetModalA11y\": string,\n\t\"OpenDeletePetModalA11y\": string,\n\t\"AddPet\": string,\n\t\"PetName\": string,\n\t\"PetSex\": string,\n\t\"PetRace\": string,\n\t\"PetRacePlaceholder\": string,\n\t\"PetBirthdate\": string,\n\t\"PetBirthdateHint\": string,\n\t\"PetType\": string,\n\t\"PetWeight\": string,\n\t\"PetWeightPlaceholder\": string,\n\t\"MonthJanuary\": string,\n\t\"MonthFebruary\": string,\n\t\"MonthMay\": string,\n\t\"MonthMarch\": string,\n\t\"MonthApril\": string,\n\t\"MonthJune\": string,\n\t\"MonthJuly\": string,\n\t\"MonthAugust\": string,\n\t\"MonthSeptember\": string,\n\t\"MonthOctober\": string,\n\t\"MonthNovember\": string,\n\t\"MonthDecember\": string,\n\t\"SelectMonth\": string,\n\t\"SelectYear\": string,\n\t\"PetSexMale\": string,\n\t\"PetSexFemale\": string,\n\t\"PetSexMaleNeutered\": string,\n\t\"PetSexFemaleSterilized\": string,\n\t\"PetSexUnknown\": string,\n\t\"PetTypeDog\": string,\n\t\"PetTypeCat\": string,\n\t\"PetTypeRabbit\": string,\n\t\"PetTypeRodent\": string,\n\t\"SelectPetType\": string,\n\t\"SelectPetSex\": string,\n\t\"ConfirmAddPet\": string,\n\t\"ConfirmEditPet\": string,\n\t\"PleaseEnterPetName\": string,\n\t\"PleaseSelectPetType\": string,\n\t\"PleaseSelectPetSex\": string,\n\t\"PleaseChoosePetAge\": string,\n\t\"PleaseSelectMonth\": string,\n\t\"PleaseSelectYear\": string,\n}\n\nconst R = new Proxy({}, {\n\tget(target, name: keyof Translations, receiver) {\n\t\tif(process.env.enforcedLocale === \"da\" || (!process.env.enforcedLocale && getLocale(\"da\") === \"da\")) {\n\t\t\treturn _da[name] ?? name\n\t\t}\n\nif(process.env.enforcedLocale === \"en\" || (!process.env.enforcedLocale && getLocale(\"da\") === \"en\")) {\n\t\t\treturn _en[name] ?? name\n\t\t}\n\n\t\treturn name\n\t},\n}) as Translations\n\nexport { R }","import React from 'react';\n\nvar isCheckBoxInput = (element) => element.type === 'checkbox';\n\nvar isDateObject = (value) => value instanceof Date;\n\nvar isNullOrUndefined = (value) => value == null;\n\nconst isObjectType = (value) => typeof value === 'object';\nvar isObject = (value) => !isNullOrUndefined(value) &&\n !Array.isArray(value) &&\n isObjectType(value) &&\n !isDateObject(value);\n\nvar getEventValue = (event) => isObject(event) && event.target\n ? isCheckBoxInput(event.target)\n ? event.target.checked\n : event.target.value\n : event;\n\nvar getNodeParentName = (name) => name.substring(0, name.search(/\\.\\d+(\\.|$)/)) || name;\n\nvar isNameInFieldArray = (names, name) => names.has(getNodeParentName(name));\n\nvar isPlainObject = (tempObject) => {\n const prototypeCopy = tempObject.constructor && tempObject.constructor.prototype;\n return (isObject(prototypeCopy) && prototypeCopy.hasOwnProperty('isPrototypeOf'));\n};\n\nvar isWeb = typeof window !== 'undefined' &&\n typeof window.HTMLElement !== 'undefined' &&\n typeof document !== 'undefined';\n\nfunction cloneObject(data) {\n let copy;\n const isArray = Array.isArray(data);\n const isFileListInstance = typeof FileList !== 'undefined' ? data instanceof FileList : false;\n if (data instanceof Date) {\n copy = new Date(data);\n }\n else if (data instanceof Set) {\n copy = new Set(data);\n }\n else if (!(isWeb && (data instanceof Blob || isFileListInstance)) &&\n (isArray || isObject(data))) {\n copy = isArray ? [] : {};\n if (!isArray && !isPlainObject(data)) {\n copy = data;\n }\n else {\n for (const key in data) {\n if (data.hasOwnProperty(key)) {\n copy[key] = cloneObject(data[key]);\n }\n }\n }\n }\n else {\n return data;\n }\n return copy;\n}\n\nvar compact = (value) => Array.isArray(value) ? value.filter(Boolean) : [];\n\nvar isUndefined = (val) => val === undefined;\n\nvar get = (object, path, defaultValue) => {\n if (!path || !isObject(object)) {\n return defaultValue;\n }\n const result = compact(path.split(/[,[\\].]+?/)).reduce((result, key) => isNullOrUndefined(result) ? result : result[key], object);\n return isUndefined(result) || result === object\n ? isUndefined(object[path])\n ? defaultValue\n : object[path]\n : result;\n};\n\nvar isBoolean = (value) => typeof value === 'boolean';\n\nvar isKey = (value) => /^\\w*$/.test(value);\n\nvar stringToPath = (input) => compact(input.replace(/[\"|']|\\]/g, '').split(/\\.|\\[/));\n\nvar set = (object, path, value) => {\n let index = -1;\n const tempPath = isKey(path) ? [path] : stringToPath(path);\n const length = tempPath.length;\n const lastIndex = length - 1;\n while (++index < length) {\n const key = tempPath[index];\n let newValue = value;\n if (index !== lastIndex) {\n const objValue = object[key];\n newValue =\n isObject(objValue) || Array.isArray(objValue)\n ? objValue\n : !isNaN(+tempPath[index + 1])\n ? []\n : {};\n }\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n return;\n }\n object[key] = newValue;\n object = object[key];\n }\n return object;\n};\n\nconst EVENTS = {\n BLUR: 'blur',\n FOCUS_OUT: 'focusout',\n CHANGE: 'change',\n};\nconst VALIDATION_MODE = {\n onBlur: 'onBlur',\n onChange: 'onChange',\n onSubmit: 'onSubmit',\n onTouched: 'onTouched',\n all: 'all',\n};\nconst INPUT_VALIDATION_RULES = {\n max: 'max',\n min: 'min',\n maxLength: 'maxLength',\n minLength: 'minLength',\n pattern: 'pattern',\n required: 'required',\n validate: 'validate',\n};\n\nconst HookFormContext = React.createContext(null);\n/**\n * This custom hook allows you to access the form context. useFormContext is intended to be used in deeply nested structures, where it would become inconvenient to pass the context as a prop. To be used with {@link FormProvider}.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useformcontext) • [Demo](https://codesandbox.io/s/react-hook-form-v7-form-context-ytudi)\n *\n * @returns return all useForm methods\n *\n * @example\n * ```tsx\n * function App() {\n * const methods = useForm();\n * const onSubmit = data => console.log(data);\n *\n * return (\n * \n *
\n * \n * \n * \n *
\n * );\n * }\n *\n * function NestedInput() {\n * const { register } = useFormContext(); // retrieve all hook methods\n * return ;\n * }\n * ```\n */\nconst useFormContext = () => React.useContext(HookFormContext);\n/**\n * A provider component that propagates the `useForm` methods to all children components via [React Context](https://reactjs.org/docs/context.html) API. To be used with {@link useFormContext}.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useformcontext) • [Demo](https://codesandbox.io/s/react-hook-form-v7-form-context-ytudi)\n *\n * @param props - all useForm methods\n *\n * @example\n * ```tsx\n * function App() {\n * const methods = useForm();\n * const onSubmit = data => console.log(data);\n *\n * return (\n * \n *
\n * \n * \n * \n *
\n * );\n * }\n *\n * function NestedInput() {\n * const { register } = useFormContext(); // retrieve all hook methods\n * return ;\n * }\n * ```\n */\nconst FormProvider = (props) => {\n const { children, ...data } = props;\n return (React.createElement(HookFormContext.Provider, { value: data }, children));\n};\n\nvar getProxyFormState = (formState, control, localProxyFormState, isRoot = true) => {\n const result = {\n defaultValues: control._defaultValues,\n };\n for (const key in formState) {\n Object.defineProperty(result, key, {\n get: () => {\n const _key = key;\n if (control._proxyFormState[_key] !== VALIDATION_MODE.all) {\n control._proxyFormState[_key] = !isRoot || VALIDATION_MODE.all;\n }\n localProxyFormState && (localProxyFormState[_key] = true);\n return formState[_key];\n },\n });\n }\n return result;\n};\n\nvar isEmptyObject = (value) => isObject(value) && !Object.keys(value).length;\n\nvar shouldRenderFormState = (formStateData, _proxyFormState, updateFormState, isRoot) => {\n updateFormState(formStateData);\n const { name, ...formState } = formStateData;\n return (isEmptyObject(formState) ||\n Object.keys(formState).length >= Object.keys(_proxyFormState).length ||\n Object.keys(formState).find((key) => _proxyFormState[key] ===\n (!isRoot || VALIDATION_MODE.all)));\n};\n\nvar convertToArrayPayload = (value) => (Array.isArray(value) ? value : [value]);\n\nvar shouldSubscribeByName = (name, signalName, exact) => !name ||\n !signalName ||\n name === signalName ||\n convertToArrayPayload(name).some((currentName) => currentName &&\n (exact\n ? currentName === signalName\n : currentName.startsWith(signalName) ||\n signalName.startsWith(currentName)));\n\nfunction useSubscribe(props) {\n const _props = React.useRef(props);\n _props.current = props;\n React.useEffect(() => {\n const subscription = !props.disabled &&\n _props.current.subject &&\n _props.current.subject.subscribe({\n next: _props.current.next,\n });\n return () => {\n subscription && subscription.unsubscribe();\n };\n }, [props.disabled]);\n}\n\n/**\n * This custom hook allows you to subscribe to each form state, and isolate the re-render at the custom hook level. It has its scope in terms of form state subscription, so it would not affect other useFormState and useForm. Using this hook can reduce the re-render impact on large and complex form application.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useformstate) • [Demo](https://codesandbox.io/s/useformstate-75xly)\n *\n * @param props - include options on specify fields to subscribe. {@link UseFormStateReturn}\n *\n * @example\n * ```tsx\n * function App() {\n * const { register, handleSubmit, control } = useForm({\n * defaultValues: {\n * firstName: \"firstName\"\n * }});\n * const { dirtyFields } = useFormState({\n * control\n * });\n * const onSubmit = (data) => console.log(data);\n *\n * return (\n *
\n * \n * {dirtyFields.firstName &&

Field is dirty.

}\n * \n *
\n * );\n * }\n * ```\n */\nfunction useFormState(props) {\n const methods = useFormContext();\n const { control = methods.control, disabled, name, exact } = props || {};\n const [formState, updateFormState] = React.useState(control._formState);\n const _mounted = React.useRef(true);\n const _localProxyFormState = React.useRef({\n isDirty: false,\n isLoading: false,\n dirtyFields: false,\n touchedFields: false,\n validatingFields: false,\n isValidating: false,\n isValid: false,\n errors: false,\n });\n const _name = React.useRef(name);\n _name.current = name;\n useSubscribe({\n disabled,\n next: (value) => _mounted.current &&\n shouldSubscribeByName(_name.current, value.name, exact) &&\n shouldRenderFormState(value, _localProxyFormState.current, control._updateFormState) &&\n updateFormState({\n ...control._formState,\n ...value,\n }),\n subject: control._subjects.state,\n });\n React.useEffect(() => {\n _mounted.current = true;\n _localProxyFormState.current.isValid && control._updateValid(true);\n return () => {\n _mounted.current = false;\n };\n }, [control]);\n return React.useMemo(() => getProxyFormState(formState, control, _localProxyFormState.current, false), [formState, control]);\n}\n\nvar isString = (value) => typeof value === 'string';\n\nvar generateWatchOutput = (names, _names, formValues, isGlobal, defaultValue) => {\n if (isString(names)) {\n isGlobal && _names.watch.add(names);\n return get(formValues, names, defaultValue);\n }\n if (Array.isArray(names)) {\n return names.map((fieldName) => (isGlobal && _names.watch.add(fieldName), get(formValues, fieldName)));\n }\n isGlobal && (_names.watchAll = true);\n return formValues;\n};\n\n/**\n * Custom hook to subscribe to field change and isolate re-rendering at the component level.\n *\n * @remarks\n *\n * [API](https://react-hook-form.com/docs/usewatch) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-usewatch-h9i5e)\n *\n * @example\n * ```tsx\n * const { control } = useForm();\n * const values = useWatch({\n * name: \"fieldName\"\n * control,\n * })\n * ```\n */\nfunction useWatch(props) {\n const methods = useFormContext();\n const { control = methods.control, name, defaultValue, disabled, exact, } = props || {};\n const _name = React.useRef(name);\n _name.current = name;\n useSubscribe({\n disabled,\n subject: control._subjects.values,\n next: (formState) => {\n if (shouldSubscribeByName(_name.current, formState.name, exact)) {\n updateValue(cloneObject(generateWatchOutput(_name.current, control._names, formState.values || control._formValues, false, defaultValue)));\n }\n },\n });\n const [value, updateValue] = React.useState(control._getWatch(name, defaultValue));\n React.useEffect(() => control._removeUnmounted());\n return value;\n}\n\n/**\n * Custom hook to work with controlled component, this function provide you with both form and field level state. Re-render is isolated at the hook level.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/usecontroller) • [Demo](https://codesandbox.io/s/usecontroller-0o8px)\n *\n * @param props - the path name to the form field value, and validation rules.\n *\n * @returns field properties, field and form state. {@link UseControllerReturn}\n *\n * @example\n * ```tsx\n * function Input(props) {\n * const { field, fieldState, formState } = useController(props);\n * return (\n *
\n * \n *

{fieldState.isTouched && \"Touched\"}

\n *

{formState.isSubmitted ? \"submitted\" : \"\"}

\n *
\n * );\n * }\n * ```\n */\nfunction useController(props) {\n const methods = useFormContext();\n const { name, disabled, control = methods.control, shouldUnregister } = props;\n const isArrayField = isNameInFieldArray(control._names.array, name);\n const value = useWatch({\n control,\n name,\n defaultValue: get(control._formValues, name, get(control._defaultValues, name, props.defaultValue)),\n exact: true,\n });\n const formState = useFormState({\n control,\n name,\n exact: true,\n });\n const _registerProps = React.useRef(control.register(name, {\n ...props.rules,\n value,\n ...(isBoolean(props.disabled) ? { disabled: props.disabled } : {}),\n }));\n const fieldState = React.useMemo(() => Object.defineProperties({}, {\n invalid: {\n enumerable: true,\n get: () => !!get(formState.errors, name),\n },\n isDirty: {\n enumerable: true,\n get: () => !!get(formState.dirtyFields, name),\n },\n isTouched: {\n enumerable: true,\n get: () => !!get(formState.touchedFields, name),\n },\n isValidating: {\n enumerable: true,\n get: () => !!get(formState.validatingFields, name),\n },\n error: {\n enumerable: true,\n get: () => get(formState.errors, name),\n },\n }), [formState, name]);\n const field = React.useMemo(() => ({\n name,\n value,\n ...(isBoolean(disabled) || formState.disabled\n ? { disabled: formState.disabled || disabled }\n : {}),\n onChange: (event) => _registerProps.current.onChange({\n target: {\n value: getEventValue(event),\n name: name,\n },\n type: EVENTS.CHANGE,\n }),\n onBlur: () => _registerProps.current.onBlur({\n target: {\n value: get(control._formValues, name),\n name: name,\n },\n type: EVENTS.BLUR,\n }),\n ref: (elm) => {\n const field = get(control._fields, name);\n if (field && elm) {\n field._f.ref = {\n focus: () => elm.focus(),\n select: () => elm.select(),\n setCustomValidity: (message) => elm.setCustomValidity(message),\n reportValidity: () => elm.reportValidity(),\n };\n }\n },\n }), [\n name,\n control._formValues,\n disabled,\n formState.disabled,\n value,\n control._fields,\n ]);\n React.useEffect(() => {\n const _shouldUnregisterField = control._options.shouldUnregister || shouldUnregister;\n const updateMounted = (name, value) => {\n const field = get(control._fields, name);\n if (field && field._f) {\n field._f.mount = value;\n }\n };\n updateMounted(name, true);\n if (_shouldUnregisterField) {\n const value = cloneObject(get(control._options.defaultValues, name));\n set(control._defaultValues, name, value);\n if (isUndefined(get(control._formValues, name))) {\n set(control._formValues, name, value);\n }\n }\n !isArrayField && control.register(name);\n return () => {\n (isArrayField\n ? _shouldUnregisterField && !control._state.action\n : _shouldUnregisterField)\n ? control.unregister(name)\n : updateMounted(name, false);\n };\n }, [name, control, isArrayField, shouldUnregister]);\n React.useEffect(() => {\n control._updateDisabledField({\n disabled,\n fields: control._fields,\n name,\n });\n }, [disabled, name, control]);\n return React.useMemo(() => ({\n field,\n formState,\n fieldState,\n }), [field, formState, fieldState]);\n}\n\n/**\n * Component based on `useController` hook to work with controlled component.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/usecontroller/controller) • [Demo](https://codesandbox.io/s/react-hook-form-v6-controller-ts-jwyzw) • [Video](https://www.youtube.com/watch?v=N2UNk_UCVyA)\n *\n * @param props - the path name to the form field value, and validation rules.\n *\n * @returns provide field handler functions, field and form state.\n *\n * @example\n * ```tsx\n * function App() {\n * const { control } = useForm({\n * defaultValues: {\n * test: \"\"\n * }\n * });\n *\n * return (\n *
\n * (\n * <>\n * \n *

{formState.isSubmitted ? \"submitted\" : \"\"}

\n *

{fieldState.isTouched ? \"touched\" : \"\"}

\n * \n * )}\n * />\n * \n * );\n * }\n * ```\n */\nconst Controller = (props) => props.render(useController(props));\n\nconst flatten = (obj) => {\n const output = {};\n for (const key of Object.keys(obj)) {\n if (isObjectType(obj[key]) && obj[key] !== null) {\n const nested = flatten(obj[key]);\n for (const nestedKey of Object.keys(nested)) {\n output[`${key}.${nestedKey}`] = nested[nestedKey];\n }\n }\n else {\n output[key] = obj[key];\n }\n }\n return output;\n};\n\nconst POST_REQUEST = 'post';\n/**\n * Form component to manage submission.\n *\n * @param props - to setup submission detail. {@link FormProps}\n *\n * @returns form component or headless render prop.\n *\n * @example\n * ```tsx\n * function App() {\n * const { control, formState: { errors } } = useForm();\n *\n * return (\n *
\n * \n *

{errors?.root?.server && 'Server error'}

\n * \n *
\n * );\n * }\n * ```\n */\nfunction Form(props) {\n const methods = useFormContext();\n const [mounted, setMounted] = React.useState(false);\n const { control = methods.control, onSubmit, children, action, method = POST_REQUEST, headers, encType, onError, render, onSuccess, validateStatus, ...rest } = props;\n const submit = async (event) => {\n let hasError = false;\n let type = '';\n await control.handleSubmit(async (data) => {\n const formData = new FormData();\n let formDataJson = '';\n try {\n formDataJson = JSON.stringify(data);\n }\n catch (_a) { }\n const flattenFormValues = flatten(control._formValues);\n for (const key in flattenFormValues) {\n formData.append(key, flattenFormValues[key]);\n }\n if (onSubmit) {\n await onSubmit({\n data,\n event,\n method,\n formData,\n formDataJson,\n });\n }\n if (action) {\n try {\n const shouldStringifySubmissionData = [\n headers && headers['Content-Type'],\n encType,\n ].some((value) => value && value.includes('json'));\n const response = await fetch(String(action), {\n method,\n headers: {\n ...headers,\n ...(encType ? { 'Content-Type': encType } : {}),\n },\n body: shouldStringifySubmissionData ? formDataJson : formData,\n });\n if (response &&\n (validateStatus\n ? !validateStatus(response.status)\n : response.status < 200 || response.status >= 300)) {\n hasError = true;\n onError && onError({ response });\n type = String(response.status);\n }\n else {\n onSuccess && onSuccess({ response });\n }\n }\n catch (error) {\n hasError = true;\n onError && onError({ error });\n }\n }\n })(event);\n if (hasError && props.control) {\n props.control._subjects.state.next({\n isSubmitSuccessful: false,\n });\n props.control.setError('root.server', {\n type,\n });\n }\n };\n React.useEffect(() => {\n setMounted(true);\n }, []);\n return render ? (React.createElement(React.Fragment, null, render({\n submit,\n }))) : (React.createElement(\"form\", { noValidate: mounted, action: action, method: method, encType: encType, onSubmit: submit, ...rest }, children));\n}\n\nvar appendErrors = (name, validateAllFieldCriteria, errors, type, message) => validateAllFieldCriteria\n ? {\n ...errors[name],\n types: {\n ...(errors[name] && errors[name].types ? errors[name].types : {}),\n [type]: message || true,\n },\n }\n : {};\n\nvar generateId = () => {\n const d = typeof performance === 'undefined' ? Date.now() : performance.now() * 1000;\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16 + d) % 16 | 0;\n return (c == 'x' ? r : (r & 0x3) | 0x8).toString(16);\n });\n};\n\nvar getFocusFieldName = (name, index, options = {}) => options.shouldFocus || isUndefined(options.shouldFocus)\n ? options.focusName ||\n `${name}.${isUndefined(options.focusIndex) ? index : options.focusIndex}.`\n : '';\n\nvar getValidationModes = (mode) => ({\n isOnSubmit: !mode || mode === VALIDATION_MODE.onSubmit,\n isOnBlur: mode === VALIDATION_MODE.onBlur,\n isOnChange: mode === VALIDATION_MODE.onChange,\n isOnAll: mode === VALIDATION_MODE.all,\n isOnTouch: mode === VALIDATION_MODE.onTouched,\n});\n\nvar isWatched = (name, _names, isBlurEvent) => !isBlurEvent &&\n (_names.watchAll ||\n _names.watch.has(name) ||\n [..._names.watch].some((watchName) => name.startsWith(watchName) &&\n /^\\.\\w+/.test(name.slice(watchName.length))));\n\nconst iterateFieldsByAction = (fields, action, fieldsNames, abortEarly) => {\n for (const key of fieldsNames || Object.keys(fields)) {\n const field = get(fields, key);\n if (field) {\n const { _f, ...currentField } = field;\n if (_f) {\n if (_f.refs && _f.refs[0] && action(_f.refs[0], key) && !abortEarly) {\n return true;\n }\n else if (_f.ref && action(_f.ref, _f.name) && !abortEarly) {\n return true;\n }\n else {\n if (iterateFieldsByAction(currentField, action)) {\n break;\n }\n }\n }\n else if (isObject(currentField)) {\n if (iterateFieldsByAction(currentField, action)) {\n break;\n }\n }\n }\n }\n return;\n};\n\nvar updateFieldArrayRootError = (errors, error, name) => {\n const fieldArrayErrors = convertToArrayPayload(get(errors, name));\n set(fieldArrayErrors, 'root', error[name]);\n set(errors, name, fieldArrayErrors);\n return errors;\n};\n\nvar isFileInput = (element) => element.type === 'file';\n\nvar isFunction = (value) => typeof value === 'function';\n\nvar isHTMLElement = (value) => {\n if (!isWeb) {\n return false;\n }\n const owner = value ? value.ownerDocument : 0;\n return (value instanceof\n (owner && owner.defaultView ? owner.defaultView.HTMLElement : HTMLElement));\n};\n\nvar isMessage = (value) => isString(value);\n\nvar isRadioInput = (element) => element.type === 'radio';\n\nvar isRegex = (value) => value instanceof RegExp;\n\nconst defaultResult = {\n value: false,\n isValid: false,\n};\nconst validResult = { value: true, isValid: true };\nvar getCheckboxValue = (options) => {\n if (Array.isArray(options)) {\n if (options.length > 1) {\n const values = options\n .filter((option) => option && option.checked && !option.disabled)\n .map((option) => option.value);\n return { value: values, isValid: !!values.length };\n }\n return options[0].checked && !options[0].disabled\n ? // @ts-expect-error expected to work in the browser\n options[0].attributes && !isUndefined(options[0].attributes.value)\n ? isUndefined(options[0].value) || options[0].value === ''\n ? validResult\n : { value: options[0].value, isValid: true }\n : validResult\n : defaultResult;\n }\n return defaultResult;\n};\n\nconst defaultReturn = {\n isValid: false,\n value: null,\n};\nvar getRadioValue = (options) => Array.isArray(options)\n ? options.reduce((previous, option) => option && option.checked && !option.disabled\n ? {\n isValid: true,\n value: option.value,\n }\n : previous, defaultReturn)\n : defaultReturn;\n\nfunction getValidateError(result, ref, type = 'validate') {\n if (isMessage(result) ||\n (Array.isArray(result) && result.every(isMessage)) ||\n (isBoolean(result) && !result)) {\n return {\n type,\n message: isMessage(result) ? result : '',\n ref,\n };\n }\n}\n\nvar getValueAndMessage = (validationData) => isObject(validationData) && !isRegex(validationData)\n ? validationData\n : {\n value: validationData,\n message: '',\n };\n\nvar validateField = async (field, disabledFieldNames, formValues, validateAllFieldCriteria, shouldUseNativeValidation, isFieldArray) => {\n const { ref, refs, required, maxLength, minLength, min, max, pattern, validate, name, valueAsNumber, mount, } = field._f;\n const inputValue = get(formValues, name);\n if (!mount || disabledFieldNames.has(name)) {\n return {};\n }\n const inputRef = refs ? refs[0] : ref;\n const setCustomValidity = (message) => {\n if (shouldUseNativeValidation && inputRef.reportValidity) {\n inputRef.setCustomValidity(isBoolean(message) ? '' : message || '');\n inputRef.reportValidity();\n }\n };\n const error = {};\n const isRadio = isRadioInput(ref);\n const isCheckBox = isCheckBoxInput(ref);\n const isRadioOrCheckbox = isRadio || isCheckBox;\n const isEmpty = ((valueAsNumber || isFileInput(ref)) &&\n isUndefined(ref.value) &&\n isUndefined(inputValue)) ||\n (isHTMLElement(ref) && ref.value === '') ||\n inputValue === '' ||\n (Array.isArray(inputValue) && !inputValue.length);\n const appendErrorsCurry = appendErrors.bind(null, name, validateAllFieldCriteria, error);\n const getMinMaxMessage = (exceedMax, maxLengthMessage, minLengthMessage, maxType = INPUT_VALIDATION_RULES.maxLength, minType = INPUT_VALIDATION_RULES.minLength) => {\n const message = exceedMax ? maxLengthMessage : minLengthMessage;\n error[name] = {\n type: exceedMax ? maxType : minType,\n message,\n ref,\n ...appendErrorsCurry(exceedMax ? maxType : minType, message),\n };\n };\n if (isFieldArray\n ? !Array.isArray(inputValue) || !inputValue.length\n : required &&\n ((!isRadioOrCheckbox && (isEmpty || isNullOrUndefined(inputValue))) ||\n (isBoolean(inputValue) && !inputValue) ||\n (isCheckBox && !getCheckboxValue(refs).isValid) ||\n (isRadio && !getRadioValue(refs).isValid))) {\n const { value, message } = isMessage(required)\n ? { value: !!required, message: required }\n : getValueAndMessage(required);\n if (value) {\n error[name] = {\n type: INPUT_VALIDATION_RULES.required,\n message,\n ref: inputRef,\n ...appendErrorsCurry(INPUT_VALIDATION_RULES.required, message),\n };\n if (!validateAllFieldCriteria) {\n setCustomValidity(message);\n return error;\n }\n }\n }\n if (!isEmpty && (!isNullOrUndefined(min) || !isNullOrUndefined(max))) {\n let exceedMax;\n let exceedMin;\n const maxOutput = getValueAndMessage(max);\n const minOutput = getValueAndMessage(min);\n if (!isNullOrUndefined(inputValue) && !isNaN(inputValue)) {\n const valueNumber = ref.valueAsNumber ||\n (inputValue ? +inputValue : inputValue);\n if (!isNullOrUndefined(maxOutput.value)) {\n exceedMax = valueNumber > maxOutput.value;\n }\n if (!isNullOrUndefined(minOutput.value)) {\n exceedMin = valueNumber < minOutput.value;\n }\n }\n else {\n const valueDate = ref.valueAsDate || new Date(inputValue);\n const convertTimeToDate = (time) => new Date(new Date().toDateString() + ' ' + time);\n const isTime = ref.type == 'time';\n const isWeek = ref.type == 'week';\n if (isString(maxOutput.value) && inputValue) {\n exceedMax = isTime\n ? convertTimeToDate(inputValue) > convertTimeToDate(maxOutput.value)\n : isWeek\n ? inputValue > maxOutput.value\n : valueDate > new Date(maxOutput.value);\n }\n if (isString(minOutput.value) && inputValue) {\n exceedMin = isTime\n ? convertTimeToDate(inputValue) < convertTimeToDate(minOutput.value)\n : isWeek\n ? inputValue < minOutput.value\n : valueDate < new Date(minOutput.value);\n }\n }\n if (exceedMax || exceedMin) {\n getMinMaxMessage(!!exceedMax, maxOutput.message, minOutput.message, INPUT_VALIDATION_RULES.max, INPUT_VALIDATION_RULES.min);\n if (!validateAllFieldCriteria) {\n setCustomValidity(error[name].message);\n return error;\n }\n }\n }\n if ((maxLength || minLength) &&\n !isEmpty &&\n (isString(inputValue) || (isFieldArray && Array.isArray(inputValue)))) {\n const maxLengthOutput = getValueAndMessage(maxLength);\n const minLengthOutput = getValueAndMessage(minLength);\n const exceedMax = !isNullOrUndefined(maxLengthOutput.value) &&\n inputValue.length > +maxLengthOutput.value;\n const exceedMin = !isNullOrUndefined(minLengthOutput.value) &&\n inputValue.length < +minLengthOutput.value;\n if (exceedMax || exceedMin) {\n getMinMaxMessage(exceedMax, maxLengthOutput.message, minLengthOutput.message);\n if (!validateAllFieldCriteria) {\n setCustomValidity(error[name].message);\n return error;\n }\n }\n }\n if (pattern && !isEmpty && isString(inputValue)) {\n const { value: patternValue, message } = getValueAndMessage(pattern);\n if (isRegex(patternValue) && !inputValue.match(patternValue)) {\n error[name] = {\n type: INPUT_VALIDATION_RULES.pattern,\n message,\n ref,\n ...appendErrorsCurry(INPUT_VALIDATION_RULES.pattern, message),\n };\n if (!validateAllFieldCriteria) {\n setCustomValidity(message);\n return error;\n }\n }\n }\n if (validate) {\n if (isFunction(validate)) {\n const result = await validate(inputValue, formValues);\n const validateError = getValidateError(result, inputRef);\n if (validateError) {\n error[name] = {\n ...validateError,\n ...appendErrorsCurry(INPUT_VALIDATION_RULES.validate, validateError.message),\n };\n if (!validateAllFieldCriteria) {\n setCustomValidity(validateError.message);\n return error;\n }\n }\n }\n else if (isObject(validate)) {\n let validationResult = {};\n for (const key in validate) {\n if (!isEmptyObject(validationResult) && !validateAllFieldCriteria) {\n break;\n }\n const validateError = getValidateError(await validate[key](inputValue, formValues), inputRef, key);\n if (validateError) {\n validationResult = {\n ...validateError,\n ...appendErrorsCurry(key, validateError.message),\n };\n setCustomValidity(validateError.message);\n if (validateAllFieldCriteria) {\n error[name] = validationResult;\n }\n }\n }\n if (!isEmptyObject(validationResult)) {\n error[name] = {\n ref: inputRef,\n ...validationResult,\n };\n if (!validateAllFieldCriteria) {\n return error;\n }\n }\n }\n }\n setCustomValidity(true);\n return error;\n};\n\nvar appendAt = (data, value) => [\n ...data,\n ...convertToArrayPayload(value),\n];\n\nvar fillEmptyArray = (value) => Array.isArray(value) ? value.map(() => undefined) : undefined;\n\nfunction insert(data, index, value) {\n return [\n ...data.slice(0, index),\n ...convertToArrayPayload(value),\n ...data.slice(index),\n ];\n}\n\nvar moveArrayAt = (data, from, to) => {\n if (!Array.isArray(data)) {\n return [];\n }\n if (isUndefined(data[to])) {\n data[to] = undefined;\n }\n data.splice(to, 0, data.splice(from, 1)[0]);\n return data;\n};\n\nvar prependAt = (data, value) => [\n ...convertToArrayPayload(value),\n ...convertToArrayPayload(data),\n];\n\nfunction removeAtIndexes(data, indexes) {\n let i = 0;\n const temp = [...data];\n for (const index of indexes) {\n temp.splice(index - i, 1);\n i++;\n }\n return compact(temp).length ? temp : [];\n}\nvar removeArrayAt = (data, index) => isUndefined(index)\n ? []\n : removeAtIndexes(data, convertToArrayPayload(index).sort((a, b) => a - b));\n\nvar swapArrayAt = (data, indexA, indexB) => {\n [data[indexA], data[indexB]] = [data[indexB], data[indexA]];\n};\n\nfunction baseGet(object, updatePath) {\n const length = updatePath.slice(0, -1).length;\n let index = 0;\n while (index < length) {\n object = isUndefined(object) ? index++ : object[updatePath[index++]];\n }\n return object;\n}\nfunction isEmptyArray(obj) {\n for (const key in obj) {\n if (obj.hasOwnProperty(key) && !isUndefined(obj[key])) {\n return false;\n }\n }\n return true;\n}\nfunction unset(object, path) {\n const paths = Array.isArray(path)\n ? path\n : isKey(path)\n ? [path]\n : stringToPath(path);\n const childObject = paths.length === 1 ? object : baseGet(object, paths);\n const index = paths.length - 1;\n const key = paths[index];\n if (childObject) {\n delete childObject[key];\n }\n if (index !== 0 &&\n ((isObject(childObject) && isEmptyObject(childObject)) ||\n (Array.isArray(childObject) && isEmptyArray(childObject)))) {\n unset(object, paths.slice(0, -1));\n }\n return object;\n}\n\nvar updateAt = (fieldValues, index, value) => {\n fieldValues[index] = value;\n return fieldValues;\n};\n\n/**\n * A custom hook that exposes convenient methods to perform operations with a list of dynamic inputs that need to be appended, updated, removed etc. • [Demo](https://codesandbox.io/s/react-hook-form-usefieldarray-ssugn) • [Video](https://youtu.be/4MrbfGSFY2A)\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/usefieldarray) • [Demo](https://codesandbox.io/s/react-hook-form-usefieldarray-ssugn)\n *\n * @param props - useFieldArray props\n *\n * @returns methods - functions to manipulate with the Field Arrays (dynamic inputs) {@link UseFieldArrayReturn}\n *\n * @example\n * ```tsx\n * function App() {\n * const { register, control, handleSubmit, reset, trigger, setError } = useForm({\n * defaultValues: {\n * test: []\n * }\n * });\n * const { fields, append } = useFieldArray({\n * control,\n * name: \"test\"\n * });\n *\n * return (\n *
console.log(data))}>\n * {fields.map((item, index) => (\n * \n * ))}\n * \n * \n *
\n * );\n * }\n * ```\n */\nfunction useFieldArray(props) {\n const methods = useFormContext();\n const { control = methods.control, name, keyName = 'id', shouldUnregister, rules, } = props;\n const [fields, setFields] = React.useState(control._getFieldArray(name));\n const ids = React.useRef(control._getFieldArray(name).map(generateId));\n const _fieldIds = React.useRef(fields);\n const _name = React.useRef(name);\n const _actioned = React.useRef(false);\n _name.current = name;\n _fieldIds.current = fields;\n control._names.array.add(name);\n rules &&\n control.register(name, rules);\n useSubscribe({\n next: ({ values, name: fieldArrayName, }) => {\n if (fieldArrayName === _name.current || !fieldArrayName) {\n const fieldValues = get(values, _name.current);\n if (Array.isArray(fieldValues)) {\n setFields(fieldValues);\n ids.current = fieldValues.map(generateId);\n }\n }\n },\n subject: control._subjects.array,\n });\n const updateValues = React.useCallback((updatedFieldArrayValues) => {\n _actioned.current = true;\n control._updateFieldArray(name, updatedFieldArrayValues);\n }, [control, name]);\n const append = (value, options) => {\n const appendValue = convertToArrayPayload(cloneObject(value));\n const updatedFieldArrayValues = appendAt(control._getFieldArray(name), appendValue);\n control._names.focus = getFocusFieldName(name, updatedFieldArrayValues.length - 1, options);\n ids.current = appendAt(ids.current, appendValue.map(generateId));\n updateValues(updatedFieldArrayValues);\n setFields(updatedFieldArrayValues);\n control._updateFieldArray(name, updatedFieldArrayValues, appendAt, {\n argA: fillEmptyArray(value),\n });\n };\n const prepend = (value, options) => {\n const prependValue = convertToArrayPayload(cloneObject(value));\n const updatedFieldArrayValues = prependAt(control._getFieldArray(name), prependValue);\n control._names.focus = getFocusFieldName(name, 0, options);\n ids.current = prependAt(ids.current, prependValue.map(generateId));\n updateValues(updatedFieldArrayValues);\n setFields(updatedFieldArrayValues);\n control._updateFieldArray(name, updatedFieldArrayValues, prependAt, {\n argA: fillEmptyArray(value),\n });\n };\n const remove = (index) => {\n const updatedFieldArrayValues = removeArrayAt(control._getFieldArray(name), index);\n ids.current = removeArrayAt(ids.current, index);\n updateValues(updatedFieldArrayValues);\n setFields(updatedFieldArrayValues);\n !Array.isArray(get(control._fields, name)) &&\n set(control._fields, name, undefined);\n control._updateFieldArray(name, updatedFieldArrayValues, removeArrayAt, {\n argA: index,\n });\n };\n const insert$1 = (index, value, options) => {\n const insertValue = convertToArrayPayload(cloneObject(value));\n const updatedFieldArrayValues = insert(control._getFieldArray(name), index, insertValue);\n control._names.focus = getFocusFieldName(name, index, options);\n ids.current = insert(ids.current, index, insertValue.map(generateId));\n updateValues(updatedFieldArrayValues);\n setFields(updatedFieldArrayValues);\n control._updateFieldArray(name, updatedFieldArrayValues, insert, {\n argA: index,\n argB: fillEmptyArray(value),\n });\n };\n const swap = (indexA, indexB) => {\n const updatedFieldArrayValues = control._getFieldArray(name);\n swapArrayAt(updatedFieldArrayValues, indexA, indexB);\n swapArrayAt(ids.current, indexA, indexB);\n updateValues(updatedFieldArrayValues);\n setFields(updatedFieldArrayValues);\n control._updateFieldArray(name, updatedFieldArrayValues, swapArrayAt, {\n argA: indexA,\n argB: indexB,\n }, false);\n };\n const move = (from, to) => {\n const updatedFieldArrayValues = control._getFieldArray(name);\n moveArrayAt(updatedFieldArrayValues, from, to);\n moveArrayAt(ids.current, from, to);\n updateValues(updatedFieldArrayValues);\n setFields(updatedFieldArrayValues);\n control._updateFieldArray(name, updatedFieldArrayValues, moveArrayAt, {\n argA: from,\n argB: to,\n }, false);\n };\n const update = (index, value) => {\n const updateValue = cloneObject(value);\n const updatedFieldArrayValues = updateAt(control._getFieldArray(name), index, updateValue);\n ids.current = [...updatedFieldArrayValues].map((item, i) => !item || i === index ? generateId() : ids.current[i]);\n updateValues(updatedFieldArrayValues);\n setFields([...updatedFieldArrayValues]);\n control._updateFieldArray(name, updatedFieldArrayValues, updateAt, {\n argA: index,\n argB: updateValue,\n }, true, false);\n };\n const replace = (value) => {\n const updatedFieldArrayValues = convertToArrayPayload(cloneObject(value));\n ids.current = updatedFieldArrayValues.map(generateId);\n updateValues([...updatedFieldArrayValues]);\n setFields([...updatedFieldArrayValues]);\n control._updateFieldArray(name, [...updatedFieldArrayValues], (data) => data, {}, true, false);\n };\n React.useEffect(() => {\n control._state.action = false;\n isWatched(name, control._names) &&\n control._subjects.state.next({\n ...control._formState,\n });\n if (_actioned.current &&\n (!getValidationModes(control._options.mode).isOnSubmit ||\n control._formState.isSubmitted)) {\n if (control._options.resolver) {\n control._executeSchema([name]).then((result) => {\n const error = get(result.errors, name);\n const existingError = get(control._formState.errors, name);\n if (existingError\n ? (!error && existingError.type) ||\n (error &&\n (existingError.type !== error.type ||\n existingError.message !== error.message))\n : error && error.type) {\n error\n ? set(control._formState.errors, name, error)\n : unset(control._formState.errors, name);\n control._subjects.state.next({\n errors: control._formState.errors,\n });\n }\n });\n }\n else {\n const field = get(control._fields, name);\n if (field &&\n field._f &&\n !(getValidationModes(control._options.reValidateMode).isOnSubmit &&\n getValidationModes(control._options.mode).isOnSubmit)) {\n validateField(field, control._names.disabled, control._formValues, control._options.criteriaMode === VALIDATION_MODE.all, control._options.shouldUseNativeValidation, true).then((error) => !isEmptyObject(error) &&\n control._subjects.state.next({\n errors: updateFieldArrayRootError(control._formState.errors, error, name),\n }));\n }\n }\n }\n control._subjects.values.next({\n name,\n values: { ...control._formValues },\n });\n control._names.focus &&\n iterateFieldsByAction(control._fields, (ref, key) => {\n if (control._names.focus &&\n key.startsWith(control._names.focus) &&\n ref.focus) {\n ref.focus();\n return 1;\n }\n return;\n });\n control._names.focus = '';\n control._updateValid();\n _actioned.current = false;\n }, [fields, name, control]);\n React.useEffect(() => {\n !get(control._formValues, name) && control._updateFieldArray(name);\n return () => {\n (control._options.shouldUnregister || shouldUnregister) &&\n control.unregister(name);\n };\n }, [name, control, keyName, shouldUnregister]);\n return {\n swap: React.useCallback(swap, [updateValues, name, control]),\n move: React.useCallback(move, [updateValues, name, control]),\n prepend: React.useCallback(prepend, [updateValues, name, control]),\n append: React.useCallback(append, [updateValues, name, control]),\n remove: React.useCallback(remove, [updateValues, name, control]),\n insert: React.useCallback(insert$1, [updateValues, name, control]),\n update: React.useCallback(update, [updateValues, name, control]),\n replace: React.useCallback(replace, [updateValues, name, control]),\n fields: React.useMemo(() => fields.map((field, index) => ({\n ...field,\n [keyName]: ids.current[index] || generateId(),\n })), [fields, keyName]),\n };\n}\n\nvar createSubject = () => {\n let _observers = [];\n const next = (value) => {\n for (const observer of _observers) {\n observer.next && observer.next(value);\n }\n };\n const subscribe = (observer) => {\n _observers.push(observer);\n return {\n unsubscribe: () => {\n _observers = _observers.filter((o) => o !== observer);\n },\n };\n };\n const unsubscribe = () => {\n _observers = [];\n };\n return {\n get observers() {\n return _observers;\n },\n next,\n subscribe,\n unsubscribe,\n };\n};\n\nvar isPrimitive = (value) => isNullOrUndefined(value) || !isObjectType(value);\n\nfunction deepEqual(object1, object2) {\n if (isPrimitive(object1) || isPrimitive(object2)) {\n return object1 === object2;\n }\n if (isDateObject(object1) && isDateObject(object2)) {\n return object1.getTime() === object2.getTime();\n }\n const keys1 = Object.keys(object1);\n const keys2 = Object.keys(object2);\n if (keys1.length !== keys2.length) {\n return false;\n }\n for (const key of keys1) {\n const val1 = object1[key];\n if (!keys2.includes(key)) {\n return false;\n }\n if (key !== 'ref') {\n const val2 = object2[key];\n if ((isDateObject(val1) && isDateObject(val2)) ||\n (isObject(val1) && isObject(val2)) ||\n (Array.isArray(val1) && Array.isArray(val2))\n ? !deepEqual(val1, val2)\n : val1 !== val2) {\n return false;\n }\n }\n }\n return true;\n}\n\nvar isMultipleSelect = (element) => element.type === `select-multiple`;\n\nvar isRadioOrCheckbox = (ref) => isRadioInput(ref) || isCheckBoxInput(ref);\n\nvar live = (ref) => isHTMLElement(ref) && ref.isConnected;\n\nvar objectHasFunction = (data) => {\n for (const key in data) {\n if (isFunction(data[key])) {\n return true;\n }\n }\n return false;\n};\n\nfunction markFieldsDirty(data, fields = {}) {\n const isParentNodeArray = Array.isArray(data);\n if (isObject(data) || isParentNodeArray) {\n for (const key in data) {\n if (Array.isArray(data[key]) ||\n (isObject(data[key]) && !objectHasFunction(data[key]))) {\n fields[key] = Array.isArray(data[key]) ? [] : {};\n markFieldsDirty(data[key], fields[key]);\n }\n else if (!isNullOrUndefined(data[key])) {\n fields[key] = true;\n }\n }\n }\n return fields;\n}\nfunction getDirtyFieldsFromDefaultValues(data, formValues, dirtyFieldsFromValues) {\n const isParentNodeArray = Array.isArray(data);\n if (isObject(data) || isParentNodeArray) {\n for (const key in data) {\n if (Array.isArray(data[key]) ||\n (isObject(data[key]) && !objectHasFunction(data[key]))) {\n if (isUndefined(formValues) ||\n isPrimitive(dirtyFieldsFromValues[key])) {\n dirtyFieldsFromValues[key] = Array.isArray(data[key])\n ? markFieldsDirty(data[key], [])\n : { ...markFieldsDirty(data[key]) };\n }\n else {\n getDirtyFieldsFromDefaultValues(data[key], isNullOrUndefined(formValues) ? {} : formValues[key], dirtyFieldsFromValues[key]);\n }\n }\n else {\n dirtyFieldsFromValues[key] = !deepEqual(data[key], formValues[key]);\n }\n }\n }\n return dirtyFieldsFromValues;\n}\nvar getDirtyFields = (defaultValues, formValues) => getDirtyFieldsFromDefaultValues(defaultValues, formValues, markFieldsDirty(formValues));\n\nvar getFieldValueAs = (value, { valueAsNumber, valueAsDate, setValueAs }) => isUndefined(value)\n ? value\n : valueAsNumber\n ? value === ''\n ? NaN\n : value\n ? +value\n : value\n : valueAsDate && isString(value)\n ? new Date(value)\n : setValueAs\n ? setValueAs(value)\n : value;\n\nfunction getFieldValue(_f) {\n const ref = _f.ref;\n if (isFileInput(ref)) {\n return ref.files;\n }\n if (isRadioInput(ref)) {\n return getRadioValue(_f.refs).value;\n }\n if (isMultipleSelect(ref)) {\n return [...ref.selectedOptions].map(({ value }) => value);\n }\n if (isCheckBoxInput(ref)) {\n return getCheckboxValue(_f.refs).value;\n }\n return getFieldValueAs(isUndefined(ref.value) ? _f.ref.value : ref.value, _f);\n}\n\nvar getResolverOptions = (fieldsNames, _fields, criteriaMode, shouldUseNativeValidation) => {\n const fields = {};\n for (const name of fieldsNames) {\n const field = get(_fields, name);\n field && set(fields, name, field._f);\n }\n return {\n criteriaMode,\n names: [...fieldsNames],\n fields,\n shouldUseNativeValidation,\n };\n};\n\nvar getRuleValue = (rule) => isUndefined(rule)\n ? rule\n : isRegex(rule)\n ? rule.source\n : isObject(rule)\n ? isRegex(rule.value)\n ? rule.value.source\n : rule.value\n : rule;\n\nconst ASYNC_FUNCTION = 'AsyncFunction';\nvar hasPromiseValidation = (fieldReference) => !!fieldReference &&\n !!fieldReference.validate &&\n !!((isFunction(fieldReference.validate) &&\n fieldReference.validate.constructor.name === ASYNC_FUNCTION) ||\n (isObject(fieldReference.validate) &&\n Object.values(fieldReference.validate).find((validateFunction) => validateFunction.constructor.name === ASYNC_FUNCTION)));\n\nvar hasValidation = (options) => options.mount &&\n (options.required ||\n options.min ||\n options.max ||\n options.maxLength ||\n options.minLength ||\n options.pattern ||\n options.validate);\n\nfunction schemaErrorLookup(errors, _fields, name) {\n const error = get(errors, name);\n if (error || isKey(name)) {\n return {\n error,\n name,\n };\n }\n const names = name.split('.');\n while (names.length) {\n const fieldName = names.join('.');\n const field = get(_fields, fieldName);\n const foundError = get(errors, fieldName);\n if (field && !Array.isArray(field) && name !== fieldName) {\n return { name };\n }\n if (foundError && foundError.type) {\n return {\n name: fieldName,\n error: foundError,\n };\n }\n names.pop();\n }\n return {\n name,\n };\n}\n\nvar skipValidation = (isBlurEvent, isTouched, isSubmitted, reValidateMode, mode) => {\n if (mode.isOnAll) {\n return false;\n }\n else if (!isSubmitted && mode.isOnTouch) {\n return !(isTouched || isBlurEvent);\n }\n else if (isSubmitted ? reValidateMode.isOnBlur : mode.isOnBlur) {\n return !isBlurEvent;\n }\n else if (isSubmitted ? reValidateMode.isOnChange : mode.isOnChange) {\n return isBlurEvent;\n }\n return true;\n};\n\nvar unsetEmptyArray = (ref, name) => !compact(get(ref, name)).length && unset(ref, name);\n\nconst defaultOptions = {\n mode: VALIDATION_MODE.onSubmit,\n reValidateMode: VALIDATION_MODE.onChange,\n shouldFocusError: true,\n};\nfunction createFormControl(props = {}) {\n let _options = {\n ...defaultOptions,\n ...props,\n };\n let _formState = {\n submitCount: 0,\n isDirty: false,\n isLoading: isFunction(_options.defaultValues),\n isValidating: false,\n isSubmitted: false,\n isSubmitting: false,\n isSubmitSuccessful: false,\n isValid: false,\n touchedFields: {},\n dirtyFields: {},\n validatingFields: {},\n errors: _options.errors || {},\n disabled: _options.disabled || false,\n };\n let _fields = {};\n let _defaultValues = isObject(_options.defaultValues) || isObject(_options.values)\n ? cloneObject(_options.defaultValues || _options.values) || {}\n : {};\n let _formValues = _options.shouldUnregister\n ? {}\n : cloneObject(_defaultValues);\n let _state = {\n action: false,\n mount: false,\n watch: false,\n };\n let _names = {\n mount: new Set(),\n disabled: new Set(),\n unMount: new Set(),\n array: new Set(),\n watch: new Set(),\n };\n let delayErrorCallback;\n let timer = 0;\n const _proxyFormState = {\n isDirty: false,\n dirtyFields: false,\n validatingFields: false,\n touchedFields: false,\n isValidating: false,\n isValid: false,\n errors: false,\n };\n const _subjects = {\n values: createSubject(),\n array: createSubject(),\n state: createSubject(),\n };\n const validationModeBeforeSubmit = getValidationModes(_options.mode);\n const validationModeAfterSubmit = getValidationModes(_options.reValidateMode);\n const shouldDisplayAllAssociatedErrors = _options.criteriaMode === VALIDATION_MODE.all;\n const debounce = (callback) => (wait) => {\n clearTimeout(timer);\n timer = setTimeout(callback, wait);\n };\n const _updateValid = async (shouldUpdateValid) => {\n if (!_options.disabled && (_proxyFormState.isValid || shouldUpdateValid)) {\n const isValid = _options.resolver\n ? isEmptyObject((await _executeSchema()).errors)\n : await executeBuiltInValidation(_fields, true);\n if (isValid !== _formState.isValid) {\n _subjects.state.next({\n isValid,\n });\n }\n }\n };\n const _updateIsValidating = (names, isValidating) => {\n if (!_options.disabled &&\n (_proxyFormState.isValidating || _proxyFormState.validatingFields)) {\n (names || Array.from(_names.mount)).forEach((name) => {\n if (name) {\n isValidating\n ? set(_formState.validatingFields, name, isValidating)\n : unset(_formState.validatingFields, name);\n }\n });\n _subjects.state.next({\n validatingFields: _formState.validatingFields,\n isValidating: !isEmptyObject(_formState.validatingFields),\n });\n }\n };\n const _updateFieldArray = (name, values = [], method, args, shouldSetValues = true, shouldUpdateFieldsAndState = true) => {\n if (args && method && !_options.disabled) {\n _state.action = true;\n if (shouldUpdateFieldsAndState && Array.isArray(get(_fields, name))) {\n const fieldValues = method(get(_fields, name), args.argA, args.argB);\n shouldSetValues && set(_fields, name, fieldValues);\n }\n if (shouldUpdateFieldsAndState &&\n Array.isArray(get(_formState.errors, name))) {\n const errors = method(get(_formState.errors, name), args.argA, args.argB);\n shouldSetValues && set(_formState.errors, name, errors);\n unsetEmptyArray(_formState.errors, name);\n }\n if (_proxyFormState.touchedFields &&\n shouldUpdateFieldsAndState &&\n Array.isArray(get(_formState.touchedFields, name))) {\n const touchedFields = method(get(_formState.touchedFields, name), args.argA, args.argB);\n shouldSetValues && set(_formState.touchedFields, name, touchedFields);\n }\n if (_proxyFormState.dirtyFields) {\n _formState.dirtyFields = getDirtyFields(_defaultValues, _formValues);\n }\n _subjects.state.next({\n name,\n isDirty: _getDirty(name, values),\n dirtyFields: _formState.dirtyFields,\n errors: _formState.errors,\n isValid: _formState.isValid,\n });\n }\n else {\n set(_formValues, name, values);\n }\n };\n const updateErrors = (name, error) => {\n set(_formState.errors, name, error);\n _subjects.state.next({\n errors: _formState.errors,\n });\n };\n const _setErrors = (errors) => {\n _formState.errors = errors;\n _subjects.state.next({\n errors: _formState.errors,\n isValid: false,\n });\n };\n const updateValidAndValue = (name, shouldSkipSetValueAs, value, ref) => {\n const field = get(_fields, name);\n if (field) {\n const defaultValue = get(_formValues, name, isUndefined(value) ? get(_defaultValues, name) : value);\n isUndefined(defaultValue) ||\n (ref && ref.defaultChecked) ||\n shouldSkipSetValueAs\n ? set(_formValues, name, shouldSkipSetValueAs ? defaultValue : getFieldValue(field._f))\n : setFieldValue(name, defaultValue);\n _state.mount && _updateValid();\n }\n };\n const updateTouchAndDirty = (name, fieldValue, isBlurEvent, shouldDirty, shouldRender) => {\n let shouldUpdateField = false;\n let isPreviousDirty = false;\n const output = {\n name,\n };\n if (!_options.disabled) {\n const disabledField = !!(get(_fields, name) &&\n get(_fields, name)._f &&\n get(_fields, name)._f.disabled);\n if (!isBlurEvent || shouldDirty) {\n if (_proxyFormState.isDirty) {\n isPreviousDirty = _formState.isDirty;\n _formState.isDirty = output.isDirty = _getDirty();\n shouldUpdateField = isPreviousDirty !== output.isDirty;\n }\n const isCurrentFieldPristine = disabledField || deepEqual(get(_defaultValues, name), fieldValue);\n isPreviousDirty = !!(!disabledField && get(_formState.dirtyFields, name));\n isCurrentFieldPristine || disabledField\n ? unset(_formState.dirtyFields, name)\n : set(_formState.dirtyFields, name, true);\n output.dirtyFields = _formState.dirtyFields;\n shouldUpdateField =\n shouldUpdateField ||\n (_proxyFormState.dirtyFields &&\n isPreviousDirty !== !isCurrentFieldPristine);\n }\n if (isBlurEvent) {\n const isPreviousFieldTouched = get(_formState.touchedFields, name);\n if (!isPreviousFieldTouched) {\n set(_formState.touchedFields, name, isBlurEvent);\n output.touchedFields = _formState.touchedFields;\n shouldUpdateField =\n shouldUpdateField ||\n (_proxyFormState.touchedFields &&\n isPreviousFieldTouched !== isBlurEvent);\n }\n }\n shouldUpdateField && shouldRender && _subjects.state.next(output);\n }\n return shouldUpdateField ? output : {};\n };\n const shouldRenderByError = (name, isValid, error, fieldState) => {\n const previousFieldError = get(_formState.errors, name);\n const shouldUpdateValid = _proxyFormState.isValid &&\n isBoolean(isValid) &&\n _formState.isValid !== isValid;\n if (_options.delayError && error) {\n delayErrorCallback = debounce(() => updateErrors(name, error));\n delayErrorCallback(_options.delayError);\n }\n else {\n clearTimeout(timer);\n delayErrorCallback = null;\n error\n ? set(_formState.errors, name, error)\n : unset(_formState.errors, name);\n }\n if ((error ? !deepEqual(previousFieldError, error) : previousFieldError) ||\n !isEmptyObject(fieldState) ||\n shouldUpdateValid) {\n const updatedFormState = {\n ...fieldState,\n ...(shouldUpdateValid && isBoolean(isValid) ? { isValid } : {}),\n errors: _formState.errors,\n name,\n };\n _formState = {\n ..._formState,\n ...updatedFormState,\n };\n _subjects.state.next(updatedFormState);\n }\n };\n const _executeSchema = async (name) => {\n _updateIsValidating(name, true);\n const result = await _options.resolver(_formValues, _options.context, getResolverOptions(name || _names.mount, _fields, _options.criteriaMode, _options.shouldUseNativeValidation));\n _updateIsValidating(name);\n return result;\n };\n const executeSchemaAndUpdateState = async (names) => {\n const { errors } = await _executeSchema(names);\n if (names) {\n for (const name of names) {\n const error = get(errors, name);\n error\n ? set(_formState.errors, name, error)\n : unset(_formState.errors, name);\n }\n }\n else {\n _formState.errors = errors;\n }\n return errors;\n };\n const executeBuiltInValidation = async (fields, shouldOnlyCheckValid, context = {\n valid: true,\n }) => {\n for (const name in fields) {\n const field = fields[name];\n if (field) {\n const { _f, ...fieldValue } = field;\n if (_f) {\n const isFieldArrayRoot = _names.array.has(_f.name);\n const isPromiseFunction = field._f && hasPromiseValidation(field._f);\n if (isPromiseFunction && _proxyFormState.validatingFields) {\n _updateIsValidating([name], true);\n }\n const fieldError = await validateField(field, _names.disabled, _formValues, shouldDisplayAllAssociatedErrors, _options.shouldUseNativeValidation && !shouldOnlyCheckValid, isFieldArrayRoot);\n if (isPromiseFunction && _proxyFormState.validatingFields) {\n _updateIsValidating([name]);\n }\n if (fieldError[_f.name]) {\n context.valid = false;\n if (shouldOnlyCheckValid) {\n break;\n }\n }\n !shouldOnlyCheckValid &&\n (get(fieldError, _f.name)\n ? isFieldArrayRoot\n ? updateFieldArrayRootError(_formState.errors, fieldError, _f.name)\n : set(_formState.errors, _f.name, fieldError[_f.name])\n : unset(_formState.errors, _f.name));\n }\n !isEmptyObject(fieldValue) &&\n (await executeBuiltInValidation(fieldValue, shouldOnlyCheckValid, context));\n }\n }\n return context.valid;\n };\n const _removeUnmounted = () => {\n for (const name of _names.unMount) {\n const field = get(_fields, name);\n field &&\n (field._f.refs\n ? field._f.refs.every((ref) => !live(ref))\n : !live(field._f.ref)) &&\n unregister(name);\n }\n _names.unMount = new Set();\n };\n const _getDirty = (name, data) => !_options.disabled &&\n (name && data && set(_formValues, name, data),\n !deepEqual(getValues(), _defaultValues));\n const _getWatch = (names, defaultValue, isGlobal) => generateWatchOutput(names, _names, {\n ...(_state.mount\n ? _formValues\n : isUndefined(defaultValue)\n ? _defaultValues\n : isString(names)\n ? { [names]: defaultValue }\n : defaultValue),\n }, isGlobal, defaultValue);\n const _getFieldArray = (name) => compact(get(_state.mount ? _formValues : _defaultValues, name, _options.shouldUnregister ? get(_defaultValues, name, []) : []));\n const setFieldValue = (name, value, options = {}) => {\n const field = get(_fields, name);\n let fieldValue = value;\n if (field) {\n const fieldReference = field._f;\n if (fieldReference) {\n !fieldReference.disabled &&\n set(_formValues, name, getFieldValueAs(value, fieldReference));\n fieldValue =\n isHTMLElement(fieldReference.ref) && isNullOrUndefined(value)\n ? ''\n : value;\n if (isMultipleSelect(fieldReference.ref)) {\n [...fieldReference.ref.options].forEach((optionRef) => (optionRef.selected = fieldValue.includes(optionRef.value)));\n }\n else if (fieldReference.refs) {\n if (isCheckBoxInput(fieldReference.ref)) {\n fieldReference.refs.length > 1\n ? fieldReference.refs.forEach((checkboxRef) => (!checkboxRef.defaultChecked || !checkboxRef.disabled) &&\n (checkboxRef.checked = Array.isArray(fieldValue)\n ? !!fieldValue.find((data) => data === checkboxRef.value)\n : fieldValue === checkboxRef.value))\n : fieldReference.refs[0] &&\n (fieldReference.refs[0].checked = !!fieldValue);\n }\n else {\n fieldReference.refs.forEach((radioRef) => (radioRef.checked = radioRef.value === fieldValue));\n }\n }\n else if (isFileInput(fieldReference.ref)) {\n fieldReference.ref.value = '';\n }\n else {\n fieldReference.ref.value = fieldValue;\n if (!fieldReference.ref.type) {\n _subjects.values.next({\n name,\n values: { ..._formValues },\n });\n }\n }\n }\n }\n (options.shouldDirty || options.shouldTouch) &&\n updateTouchAndDirty(name, fieldValue, options.shouldTouch, options.shouldDirty, true);\n options.shouldValidate && trigger(name);\n };\n const setValues = (name, value, options) => {\n for (const fieldKey in value) {\n const fieldValue = value[fieldKey];\n const fieldName = `${name}.${fieldKey}`;\n const field = get(_fields, fieldName);\n (_names.array.has(name) ||\n isObject(fieldValue) ||\n (field && !field._f)) &&\n !isDateObject(fieldValue)\n ? setValues(fieldName, fieldValue, options)\n : setFieldValue(fieldName, fieldValue, options);\n }\n };\n const setValue = (name, value, options = {}) => {\n const field = get(_fields, name);\n const isFieldArray = _names.array.has(name);\n const cloneValue = cloneObject(value);\n set(_formValues, name, cloneValue);\n if (isFieldArray) {\n _subjects.array.next({\n name,\n values: { ..._formValues },\n });\n if ((_proxyFormState.isDirty || _proxyFormState.dirtyFields) &&\n options.shouldDirty) {\n _subjects.state.next({\n name,\n dirtyFields: getDirtyFields(_defaultValues, _formValues),\n isDirty: _getDirty(name, cloneValue),\n });\n }\n }\n else {\n field && !field._f && !isNullOrUndefined(cloneValue)\n ? setValues(name, cloneValue, options)\n : setFieldValue(name, cloneValue, options);\n }\n isWatched(name, _names) && _subjects.state.next({ ..._formState });\n _subjects.values.next({\n name: _state.mount ? name : undefined,\n values: { ..._formValues },\n });\n };\n const onChange = async (event) => {\n _state.mount = true;\n const target = event.target;\n let name = target.name;\n let isFieldValueUpdated = true;\n const field = get(_fields, name);\n const getCurrentFieldValue = () => target.type ? getFieldValue(field._f) : getEventValue(event);\n const _updateIsFieldValueUpdated = (fieldValue) => {\n isFieldValueUpdated =\n Number.isNaN(fieldValue) ||\n (isDateObject(fieldValue) && isNaN(fieldValue.getTime())) ||\n deepEqual(fieldValue, get(_formValues, name, fieldValue));\n };\n if (field) {\n let error;\n let isValid;\n const fieldValue = getCurrentFieldValue();\n const isBlurEvent = event.type === EVENTS.BLUR || event.type === EVENTS.FOCUS_OUT;\n const shouldSkipValidation = (!hasValidation(field._f) &&\n !_options.resolver &&\n !get(_formState.errors, name) &&\n !field._f.deps) ||\n skipValidation(isBlurEvent, get(_formState.touchedFields, name), _formState.isSubmitted, validationModeAfterSubmit, validationModeBeforeSubmit);\n const watched = isWatched(name, _names, isBlurEvent);\n set(_formValues, name, fieldValue);\n if (isBlurEvent) {\n field._f.onBlur && field._f.onBlur(event);\n delayErrorCallback && delayErrorCallback(0);\n }\n else if (field._f.onChange) {\n field._f.onChange(event);\n }\n const fieldState = updateTouchAndDirty(name, fieldValue, isBlurEvent, false);\n const shouldRender = !isEmptyObject(fieldState) || watched;\n !isBlurEvent &&\n _subjects.values.next({\n name,\n type: event.type,\n values: { ..._formValues },\n });\n if (shouldSkipValidation) {\n if (_proxyFormState.isValid) {\n if (_options.mode === 'onBlur' && isBlurEvent) {\n _updateValid();\n }\n else if (!isBlurEvent) {\n _updateValid();\n }\n }\n return (shouldRender &&\n _subjects.state.next({ name, ...(watched ? {} : fieldState) }));\n }\n !isBlurEvent && watched && _subjects.state.next({ ..._formState });\n if (_options.resolver) {\n const { errors } = await _executeSchema([name]);\n _updateIsFieldValueUpdated(fieldValue);\n if (isFieldValueUpdated) {\n const previousErrorLookupResult = schemaErrorLookup(_formState.errors, _fields, name);\n const errorLookupResult = schemaErrorLookup(errors, _fields, previousErrorLookupResult.name || name);\n error = errorLookupResult.error;\n name = errorLookupResult.name;\n isValid = isEmptyObject(errors);\n }\n }\n else {\n _updateIsValidating([name], true);\n error = (await validateField(field, _names.disabled, _formValues, shouldDisplayAllAssociatedErrors, _options.shouldUseNativeValidation))[name];\n _updateIsValidating([name]);\n _updateIsFieldValueUpdated(fieldValue);\n if (isFieldValueUpdated) {\n if (error) {\n isValid = false;\n }\n else if (_proxyFormState.isValid) {\n isValid = await executeBuiltInValidation(_fields, true);\n }\n }\n }\n if (isFieldValueUpdated) {\n field._f.deps &&\n trigger(field._f.deps);\n shouldRenderByError(name, isValid, error, fieldState);\n }\n }\n };\n const _focusInput = (ref, key) => {\n if (get(_formState.errors, key) && ref.focus) {\n ref.focus();\n return 1;\n }\n return;\n };\n const trigger = async (name, options = {}) => {\n let isValid;\n let validationResult;\n const fieldNames = convertToArrayPayload(name);\n if (_options.resolver) {\n const errors = await executeSchemaAndUpdateState(isUndefined(name) ? name : fieldNames);\n isValid = isEmptyObject(errors);\n validationResult = name\n ? !fieldNames.some((name) => get(errors, name))\n : isValid;\n }\n else if (name) {\n validationResult = (await Promise.all(fieldNames.map(async (fieldName) => {\n const field = get(_fields, fieldName);\n return await executeBuiltInValidation(field && field._f ? { [fieldName]: field } : field);\n }))).every(Boolean);\n !(!validationResult && !_formState.isValid) && _updateValid();\n }\n else {\n validationResult = isValid = await executeBuiltInValidation(_fields);\n }\n _subjects.state.next({\n ...(!isString(name) ||\n (_proxyFormState.isValid && isValid !== _formState.isValid)\n ? {}\n : { name }),\n ...(_options.resolver || !name ? { isValid } : {}),\n errors: _formState.errors,\n });\n options.shouldFocus &&\n !validationResult &&\n iterateFieldsByAction(_fields, _focusInput, name ? fieldNames : _names.mount);\n return validationResult;\n };\n const getValues = (fieldNames) => {\n const values = {\n ...(_state.mount ? _formValues : _defaultValues),\n };\n return isUndefined(fieldNames)\n ? values\n : isString(fieldNames)\n ? get(values, fieldNames)\n : fieldNames.map((name) => get(values, name));\n };\n const getFieldState = (name, formState) => ({\n invalid: !!get((formState || _formState).errors, name),\n isDirty: !!get((formState || _formState).dirtyFields, name),\n error: get((formState || _formState).errors, name),\n isValidating: !!get(_formState.validatingFields, name),\n isTouched: !!get((formState || _formState).touchedFields, name),\n });\n const clearErrors = (name) => {\n name &&\n convertToArrayPayload(name).forEach((inputName) => unset(_formState.errors, inputName));\n _subjects.state.next({\n errors: name ? _formState.errors : {},\n });\n };\n const setError = (name, error, options) => {\n const ref = (get(_fields, name, { _f: {} })._f || {}).ref;\n const currentError = get(_formState.errors, name) || {};\n // Don't override existing error messages elsewhere in the object tree.\n const { ref: currentRef, message, type, ...restOfErrorTree } = currentError;\n set(_formState.errors, name, {\n ...restOfErrorTree,\n ...error,\n ref,\n });\n _subjects.state.next({\n name,\n errors: _formState.errors,\n isValid: false,\n });\n options && options.shouldFocus && ref && ref.focus && ref.focus();\n };\n const watch = (name, defaultValue) => isFunction(name)\n ? _subjects.values.subscribe({\n next: (payload) => name(_getWatch(undefined, defaultValue), payload),\n })\n : _getWatch(name, defaultValue, true);\n const unregister = (name, options = {}) => {\n for (const fieldName of name ? convertToArrayPayload(name) : _names.mount) {\n _names.mount.delete(fieldName);\n _names.array.delete(fieldName);\n if (!options.keepValue) {\n unset(_fields, fieldName);\n unset(_formValues, fieldName);\n }\n !options.keepError && unset(_formState.errors, fieldName);\n !options.keepDirty && unset(_formState.dirtyFields, fieldName);\n !options.keepTouched && unset(_formState.touchedFields, fieldName);\n !options.keepIsValidating &&\n unset(_formState.validatingFields, fieldName);\n !_options.shouldUnregister &&\n !options.keepDefaultValue &&\n unset(_defaultValues, fieldName);\n }\n _subjects.values.next({\n values: { ..._formValues },\n });\n _subjects.state.next({\n ..._formState,\n ...(!options.keepDirty ? {} : { isDirty: _getDirty() }),\n });\n !options.keepIsValid && _updateValid();\n };\n const _updateDisabledField = ({ disabled, name, field, fields, }) => {\n if ((isBoolean(disabled) && _state.mount) ||\n !!disabled ||\n _names.disabled.has(name)) {\n disabled ? _names.disabled.add(name) : _names.disabled.delete(name);\n updateTouchAndDirty(name, getFieldValue(field ? field._f : get(fields, name)._f), false, false, true);\n }\n };\n const register = (name, options = {}) => {\n let field = get(_fields, name);\n const disabledIsDefined = isBoolean(options.disabled) || isBoolean(_options.disabled);\n set(_fields, name, {\n ...(field || {}),\n _f: {\n ...(field && field._f ? field._f : { ref: { name } }),\n name,\n mount: true,\n ...options,\n },\n });\n _names.mount.add(name);\n if (field) {\n _updateDisabledField({\n field,\n disabled: isBoolean(options.disabled)\n ? options.disabled\n : _options.disabled,\n name,\n });\n }\n else {\n updateValidAndValue(name, true, options.value);\n }\n return {\n ...(disabledIsDefined\n ? { disabled: options.disabled || _options.disabled }\n : {}),\n ...(_options.progressive\n ? {\n required: !!options.required,\n min: getRuleValue(options.min),\n max: getRuleValue(options.max),\n minLength: getRuleValue(options.minLength),\n maxLength: getRuleValue(options.maxLength),\n pattern: getRuleValue(options.pattern),\n }\n : {}),\n name,\n onChange,\n onBlur: onChange,\n ref: (ref) => {\n if (ref) {\n register(name, options);\n field = get(_fields, name);\n const fieldRef = isUndefined(ref.value)\n ? ref.querySelectorAll\n ? ref.querySelectorAll('input,select,textarea')[0] || ref\n : ref\n : ref;\n const radioOrCheckbox = isRadioOrCheckbox(fieldRef);\n const refs = field._f.refs || [];\n if (radioOrCheckbox\n ? refs.find((option) => option === fieldRef)\n : fieldRef === field._f.ref) {\n return;\n }\n set(_fields, name, {\n _f: {\n ...field._f,\n ...(radioOrCheckbox\n ? {\n refs: [\n ...refs.filter(live),\n fieldRef,\n ...(Array.isArray(get(_defaultValues, name)) ? [{}] : []),\n ],\n ref: { type: fieldRef.type, name },\n }\n : { ref: fieldRef }),\n },\n });\n updateValidAndValue(name, false, undefined, fieldRef);\n }\n else {\n field = get(_fields, name, {});\n if (field._f) {\n field._f.mount = false;\n }\n (_options.shouldUnregister || options.shouldUnregister) &&\n !(isNameInFieldArray(_names.array, name) && _state.action) &&\n _names.unMount.add(name);\n }\n },\n };\n };\n const _focusError = () => _options.shouldFocusError &&\n iterateFieldsByAction(_fields, _focusInput, _names.mount);\n const _disableForm = (disabled) => {\n if (isBoolean(disabled)) {\n _subjects.state.next({ disabled });\n iterateFieldsByAction(_fields, (ref, name) => {\n const currentField = get(_fields, name);\n if (currentField) {\n ref.disabled = currentField._f.disabled || disabled;\n if (Array.isArray(currentField._f.refs)) {\n currentField._f.refs.forEach((inputRef) => {\n inputRef.disabled = currentField._f.disabled || disabled;\n });\n }\n }\n }, 0, false);\n }\n };\n const handleSubmit = (onValid, onInvalid) => async (e) => {\n let onValidError = undefined;\n if (e) {\n e.preventDefault && e.preventDefault();\n e.persist && e.persist();\n }\n let fieldValues = cloneObject(_formValues);\n if (_names.disabled.size) {\n for (const name of _names.disabled) {\n set(fieldValues, name, undefined);\n }\n }\n _subjects.state.next({\n isSubmitting: true,\n });\n if (_options.resolver) {\n const { errors, values } = await _executeSchema();\n _formState.errors = errors;\n fieldValues = values;\n }\n else {\n await executeBuiltInValidation(_fields);\n }\n unset(_formState.errors, 'root');\n if (isEmptyObject(_formState.errors)) {\n _subjects.state.next({\n errors: {},\n });\n try {\n await onValid(fieldValues, e);\n }\n catch (error) {\n onValidError = error;\n }\n }\n else {\n if (onInvalid) {\n await onInvalid({ ..._formState.errors }, e);\n }\n _focusError();\n setTimeout(_focusError);\n }\n _subjects.state.next({\n isSubmitted: true,\n isSubmitting: false,\n isSubmitSuccessful: isEmptyObject(_formState.errors) && !onValidError,\n submitCount: _formState.submitCount + 1,\n errors: _formState.errors,\n });\n if (onValidError) {\n throw onValidError;\n }\n };\n const resetField = (name, options = {}) => {\n if (get(_fields, name)) {\n if (isUndefined(options.defaultValue)) {\n setValue(name, cloneObject(get(_defaultValues, name)));\n }\n else {\n setValue(name, options.defaultValue);\n set(_defaultValues, name, cloneObject(options.defaultValue));\n }\n if (!options.keepTouched) {\n unset(_formState.touchedFields, name);\n }\n if (!options.keepDirty) {\n unset(_formState.dirtyFields, name);\n _formState.isDirty = options.defaultValue\n ? _getDirty(name, cloneObject(get(_defaultValues, name)))\n : _getDirty();\n }\n if (!options.keepError) {\n unset(_formState.errors, name);\n _proxyFormState.isValid && _updateValid();\n }\n _subjects.state.next({ ..._formState });\n }\n };\n const _reset = (formValues, keepStateOptions = {}) => {\n const updatedValues = formValues ? cloneObject(formValues) : _defaultValues;\n const cloneUpdatedValues = cloneObject(updatedValues);\n const isEmptyResetValues = isEmptyObject(formValues);\n const values = isEmptyResetValues ? _defaultValues : cloneUpdatedValues;\n if (!keepStateOptions.keepDefaultValues) {\n _defaultValues = updatedValues;\n }\n if (!keepStateOptions.keepValues) {\n if (keepStateOptions.keepDirtyValues) {\n const fieldsToCheck = new Set([\n ..._names.mount,\n ...Object.keys(getDirtyFields(_defaultValues, _formValues)),\n ]);\n for (const fieldName of Array.from(fieldsToCheck)) {\n get(_formState.dirtyFields, fieldName)\n ? set(values, fieldName, get(_formValues, fieldName))\n : setValue(fieldName, get(values, fieldName));\n }\n }\n else {\n if (isWeb && isUndefined(formValues)) {\n for (const name of _names.mount) {\n const field = get(_fields, name);\n if (field && field._f) {\n const fieldReference = Array.isArray(field._f.refs)\n ? field._f.refs[0]\n : field._f.ref;\n if (isHTMLElement(fieldReference)) {\n const form = fieldReference.closest('form');\n if (form) {\n form.reset();\n break;\n }\n }\n }\n }\n }\n _fields = {};\n }\n _formValues = _options.shouldUnregister\n ? keepStateOptions.keepDefaultValues\n ? cloneObject(_defaultValues)\n : {}\n : cloneObject(values);\n _subjects.array.next({\n values: { ...values },\n });\n _subjects.values.next({\n values: { ...values },\n });\n }\n _names = {\n mount: keepStateOptions.keepDirtyValues ? _names.mount : new Set(),\n unMount: new Set(),\n array: new Set(),\n disabled: new Set(),\n watch: new Set(),\n watchAll: false,\n focus: '',\n };\n _state.mount =\n !_proxyFormState.isValid ||\n !!keepStateOptions.keepIsValid ||\n !!keepStateOptions.keepDirtyValues;\n _state.watch = !!_options.shouldUnregister;\n _subjects.state.next({\n submitCount: keepStateOptions.keepSubmitCount\n ? _formState.submitCount\n : 0,\n isDirty: isEmptyResetValues\n ? false\n : keepStateOptions.keepDirty\n ? _formState.isDirty\n : !!(keepStateOptions.keepDefaultValues &&\n !deepEqual(formValues, _defaultValues)),\n isSubmitted: keepStateOptions.keepIsSubmitted\n ? _formState.isSubmitted\n : false,\n dirtyFields: isEmptyResetValues\n ? {}\n : keepStateOptions.keepDirtyValues\n ? keepStateOptions.keepDefaultValues && _formValues\n ? getDirtyFields(_defaultValues, _formValues)\n : _formState.dirtyFields\n : keepStateOptions.keepDefaultValues && formValues\n ? getDirtyFields(_defaultValues, formValues)\n : keepStateOptions.keepDirty\n ? _formState.dirtyFields\n : {},\n touchedFields: keepStateOptions.keepTouched\n ? _formState.touchedFields\n : {},\n errors: keepStateOptions.keepErrors ? _formState.errors : {},\n isSubmitSuccessful: keepStateOptions.keepIsSubmitSuccessful\n ? _formState.isSubmitSuccessful\n : false,\n isSubmitting: false,\n });\n };\n const reset = (formValues, keepStateOptions) => _reset(isFunction(formValues)\n ? formValues(_formValues)\n : formValues, keepStateOptions);\n const setFocus = (name, options = {}) => {\n const field = get(_fields, name);\n const fieldReference = field && field._f;\n if (fieldReference) {\n const fieldRef = fieldReference.refs\n ? fieldReference.refs[0]\n : fieldReference.ref;\n if (fieldRef.focus) {\n fieldRef.focus();\n options.shouldSelect &&\n isFunction(fieldRef.select) &&\n fieldRef.select();\n }\n }\n };\n const _updateFormState = (updatedFormState) => {\n _formState = {\n ..._formState,\n ...updatedFormState,\n };\n };\n const _resetDefaultValues = () => isFunction(_options.defaultValues) &&\n _options.defaultValues().then((values) => {\n reset(values, _options.resetOptions);\n _subjects.state.next({\n isLoading: false,\n });\n });\n return {\n control: {\n register,\n unregister,\n getFieldState,\n handleSubmit,\n setError,\n _executeSchema,\n _getWatch,\n _getDirty,\n _updateValid,\n _removeUnmounted,\n _updateFieldArray,\n _updateDisabledField,\n _getFieldArray,\n _reset,\n _resetDefaultValues,\n _updateFormState,\n _disableForm,\n _subjects,\n _proxyFormState,\n _setErrors,\n get _fields() {\n return _fields;\n },\n get _formValues() {\n return _formValues;\n },\n get _state() {\n return _state;\n },\n set _state(value) {\n _state = value;\n },\n get _defaultValues() {\n return _defaultValues;\n },\n get _names() {\n return _names;\n },\n set _names(value) {\n _names = value;\n },\n get _formState() {\n return _formState;\n },\n set _formState(value) {\n _formState = value;\n },\n get _options() {\n return _options;\n },\n set _options(value) {\n _options = {\n ..._options,\n ...value,\n };\n },\n },\n trigger,\n register,\n handleSubmit,\n watch,\n setValue,\n getValues,\n reset,\n resetField,\n clearErrors,\n unregister,\n setError,\n setFocus,\n getFieldState,\n };\n}\n\n/**\n * Custom hook to manage the entire form.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform) • [Demo](https://codesandbox.io/s/react-hook-form-get-started-ts-5ksmm) • [Video](https://www.youtube.com/watch?v=RkXv4AXXC_4)\n *\n * @param props - form configuration and validation parameters.\n *\n * @returns methods - individual functions to manage the form state. {@link UseFormReturn}\n *\n * @example\n * ```tsx\n * function App() {\n * const { register, handleSubmit, watch, formState: { errors } } = useForm();\n * const onSubmit = data => console.log(data);\n *\n * console.log(watch(\"example\"));\n *\n * return (\n *
\n * \n * \n * {errors.exampleRequired && This field is required}\n * \n *
\n * );\n * }\n * ```\n */\nfunction useForm(props = {}) {\n const _formControl = React.useRef(undefined);\n const _values = React.useRef(undefined);\n const [formState, updateFormState] = React.useState({\n isDirty: false,\n isValidating: false,\n isLoading: isFunction(props.defaultValues),\n isSubmitted: false,\n isSubmitting: false,\n isSubmitSuccessful: false,\n isValid: false,\n submitCount: 0,\n dirtyFields: {},\n touchedFields: {},\n validatingFields: {},\n errors: props.errors || {},\n disabled: props.disabled || false,\n defaultValues: isFunction(props.defaultValues)\n ? undefined\n : props.defaultValues,\n });\n if (!_formControl.current) {\n _formControl.current = {\n ...createFormControl(props),\n formState,\n };\n }\n const control = _formControl.current.control;\n control._options = props;\n useSubscribe({\n subject: control._subjects.state,\n next: (value) => {\n if (shouldRenderFormState(value, control._proxyFormState, control._updateFormState, true)) {\n updateFormState({ ...control._formState });\n }\n },\n });\n React.useEffect(() => control._disableForm(props.disabled), [control, props.disabled]);\n React.useEffect(() => {\n if (control._proxyFormState.isDirty) {\n const isDirty = control._getDirty();\n if (isDirty !== formState.isDirty) {\n control._subjects.state.next({\n isDirty,\n });\n }\n }\n }, [control, formState.isDirty]);\n React.useEffect(() => {\n if (props.values && !deepEqual(props.values, _values.current)) {\n control._reset(props.values, control._options.resetOptions);\n _values.current = props.values;\n updateFormState((state) => ({ ...state }));\n }\n else {\n control._resetDefaultValues();\n }\n }, [props.values, control]);\n React.useEffect(() => {\n if (props.errors) {\n control._setErrors(props.errors);\n }\n }, [props.errors, control]);\n React.useEffect(() => {\n if (!control._state.mount) {\n control._updateValid();\n control._state.mount = true;\n }\n if (control._state.watch) {\n control._state.watch = false;\n control._subjects.state.next({ ...control._formState });\n }\n control._removeUnmounted();\n });\n React.useEffect(() => {\n props.shouldUnregister &&\n control._subjects.values.next({\n values: control._getWatch(),\n });\n }, [props.shouldUnregister, control]);\n _formControl.current.formState = getProxyFormState(formState, control);\n return _formControl.current;\n}\n\nexport { Controller, Form, FormProvider, appendErrors, get, set, useController, useFieldArray, useForm, useFormContext, useFormState, useWatch };\n//# sourceMappingURL=index.esm.mjs.map\n","import { IStatus } from '@/shared/interfaces';\nimport { fetch } from '@/shared/fetch';\nimport { R } from '@/Resources.resx';\n\nexport const fetchIStatus = async (\n url: string,\n method = 'GET',\n requestData?: U,\n): Promise => {\n let responseData: IStatus;\n\n try {\n responseData = await fetch>(\n url,\n method,\n requestData,\n 'application/json',\n );\n } catch (error) {\n // Handle error and throw a detailed message\n throw new Error(\n error instanceof Error ? error.message : R.UnknownError,\n );\n }\n\n // Check for errors in the response\n if (responseData?.HasErrors) {\n const errorMessage = responseData?.Errors.map((e) => e.Value).join(\n '\\n',\n );\n throw new Error(errorMessage);\n }\n\n // Assuming response.Result contains some success information\n return responseData?.Result;\n};\n","import { ISelfResponse, IUpdateSelfRequest } from '@/shared/interfaces';\nimport { fetchIStatus } from '@/shared/fetchIStatus';\n\nexport const updateSelf = async (\n newValue: IUpdateSelfRequest,\n): Promise => {\n return await fetchIStatus('/api/patients/self/v2', 'post', newValue);\n};\n","import { ISelfResponse, IUpdateSelfRequest } from '@/shared/interfaces';\nimport { Input, Modal } from '@/components';\nimport { R } from '../ProfileResources.resx';\nimport { R as GlobalResources } from '@/Resources.resx';\nimport { Button } from '@/components/Button';\nimport { useForm } from 'react-hook-form';\nimport {\n isEmail,\n isFullName,\n isPhoneNumber,\n isCprNumber,\n} from '@/shared/validators';\nimport { FormErrorText } from '@/components/FormErrorText';\nimport { updateSelf } from '@/api/profile/updateSelf';\nimport { useMutation } from '@tanstack/react-query';\n\ntype MyInfoModalProps = {\n selfOnOpen: IUpdateSelfRequest;\n onClose: (selfResponse?: ISelfResponse) => void;\n};\n\nexport const MyInfoModal = ({ selfOnOpen, onClose }: MyInfoModalProps) => {\n const {\n register,\n handleSubmit,\n formState: { errors },\n } = useForm({ mode: 'onBlur', values: selfOnOpen });\n\n const updateSelfMutation = useMutation({\n mutationFn: updateSelf,\n });\n\n const onSubmit = async (data: IUpdateSelfRequest) => {\n if (updateSelfMutation.isPending) return;\n updateSelfMutation.mutate(data, {\n onSuccess: (data) => onClose(data),\n });\n };\n\n const onCancel = () => onClose();\n\n return (\n \n
\n
\n {!selfOnOpen.Name && (\n \n )}\n {!selfOnOpen.CPR && (\n value.replace('-', ''),\n validate: isCprNumber,\n })}\n maxLength={11}\n error={errors.CPR && GlobalResources.InvalidCpr}\n />\n )}\n\n \n\n \n {updateSelfMutation.isError && (\n \n )}\n
\n
\n \n {R.Save}\n \n
\n
\n
\n );\n};\n","import { ISelfResponse, IUpdateSelfRequest } from '@/shared/interfaces';\nimport { atom } from 'jotai/index';\n\n// Backing atom that holds the ISelfResponse we get from the server\nexport const selfResponseAtom = atom();\n\n// Derived atom that transforms ISelfResponse -> IUpdateSelfRequest\nexport const selfRequestAtom = atom((get) => {\n const response = get(selfResponseAtom);\n if (!response) return null;\n\n return {\n Name:\n response.Me.User.FullName === 'Pseudonym'\n ? ''\n : (response.Me.User.FullName ?? ''),\n Email: response.Me.Email ?? '',\n CPR: response.Me.CprValidated ? (response.Me.CPR ?? '') : '',\n Mobile: response.Me.MobilePhone ?? '',\n } as IUpdateSelfRequest;\n});\n","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M15.2167%205.03811C15.0538%204.95815%2014.8536%205.00694%2014.7468%205.1588C14.7347%205.17598%2014.722%205.19278%2014.7089%205.20916L13.3564%206.89557L16.2153%209.278L17.5642%207.59771C17.589%207.56676%2017.6157%207.53732%2017.644%207.50954C17.705%207.44981%2017.7395%207.36819%2017.74%207.28285C17.7404%207.20772%2017.7144%207.13518%2017.667%207.07768L15.2167%205.03811ZM14.9637%2010.8384L12.1031%208.45462L6.15565%2015.8754L6.01348%2018.9451L9.03756%2018.2284L14.9637%2010.8384ZM11.3755%206.16882C11.3589%206.1867%2011.3428%206.20532%2011.3273%206.22467L4.5847%2014.6375C4.33566%2014.9333%204.18757%2015.3012%204.16238%2015.6875L4.16133%2015.7063L4.00107%2019.1668C3.99877%2019.2165%204.00018%2019.2662%204.00528%2019.3157C4.10639%2020.296%204.94856%2021.0312%205.93359%2020.999C6.00028%2020.9968%206.06658%2020.9879%206.13151%2020.9725L9.56568%2020.1586L9.58123%2020.1548C9.96009%2020.0586%2010.2984%2019.8442%2010.5472%2019.5426L17.4701%2010.9098C17.4715%2010.908%2017.473%2010.9062%2017.4744%2010.9044L19.0917%208.88969C19.504%208.4613%2019.7367%207.89011%2019.74%207.29384C19.7434%206.67491%2019.4993%206.08028%2019.0621%205.64222C19.0404%205.62047%2019.0177%205.59974%2018.994%205.58008L16.4333%203.44861C16.4015%203.4221%2016.368%203.3976%2016.3331%203.37524C15.2728%202.69579%2013.8688%202.96329%2013.1316%203.97918L11.3755%206.16882Z'%20fill='%232E3149'/%3e%3c/svg%3e\"","import { useState } from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { R } from '../ProfileResources.resx';\nimport { useAtom, useSetAtom } from 'jotai';\nimport { Utils } from '@/shared/Utils';\nimport { MyInfoModal } from './MyInfoModal';\nimport { selfRequestAtom, selfResponseAtom } from './myInfoAtoms';\nimport { ISelfResponse } from '@/shared/interfaces';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport editIcon from '../../../../wwwroot/images/icons/edit.svg';\nimport { useHydrateAtoms } from 'jotai/utils';\n\nexport const MyInfoApp = (\n containerQuery: string,\n selfResponse: ISelfResponse,\n) => {\n const elm = document.querySelector(containerQuery);\n const root = createRoot(elm);\n const queryClient = new QueryClient();\n root.render(\n \n \n ,\n );\n};\n\ntype MyInfoProps = {\n bootstrappedSelfResponse: ISelfResponse;\n};\n\nconst MyInfo = ({ bootstrappedSelfResponse }: MyInfoProps) => {\n useHydrateAtoms([[selfResponseAtom, bootstrappedSelfResponse]]);\n\n const [isModalOpen, setIsModalOpen] = useState(false);\n const setSelfResponseAtom = useSetAtom(selfResponseAtom);\n const [self] = useAtom(selfRequestAtom);\n\n return (\n self && (\n <>\n
\n
\n \n
\n {self.Name}\n
\n \n
\n {Utils.formatCpr(self.CPR)}\n
\n
\n\n setIsModalOpen(true)}\n >\n \n
\n {self.Email}\n
\n \n
\n {self.Mobile}\n
\n \n \n
\n {isModalOpen && (\n {\n if (selfResponse) setSelfResponseAtom(selfResponse);\n setIsModalOpen(false);\n }}\n >\n )}\n \n )\n );\n};\n","import { IKid, ISelfResponse } from '@/shared/interfaces';\nimport { atom } from 'jotai/index';\nimport { Utils } from '@/shared/Utils';\n// Backing atom that holds the ISelfResponse we get from the server\nexport const profileAtom = atom();\n// Derived atom that transforms ISelfResponse -> IPatientDto[]\nexport const kidsAtom = atom((get) => {\n const response = get(profileAtom);\n if (!response?.Kids) return null;\n\n const kids: IKid[] = response.Kids?.map((kid) => {\n return {\n Name: kid.User.FullName,\n UID: kid.User.UID,\n CPR: kid.CPR,\n FormattedCpr: Utils.formatCpr(kid.CPR),\n };\n });\n return kids;\n});\n","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M5%209C5%208.44772%205.44772%208%206%208H18C18.5523%208%2019%208.44772%2019%209V18C19%2020.2091%2017.2091%2022%2015%2022H9C6.79086%2022%205%2020.2091%205%2018V9ZM7%2010V18C7%2019.1046%207.89543%2020%209%2020H15C16.1046%2020%2017%2019.1046%2017%2018V10H7Z'%20fill='%23ED1818'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M13.382%202H10.618C9.86081%202.0004%209.16804%202.42881%208.82943%203.106L7.88178%205H7C6.44772%205%206%205.44772%206%206C6%206.55228%206.44772%207%207%207H17C17.5523%207%2018%206.55228%2018%206C18%205.44772%2017.5523%205%2017%205H16.1182L15.1703%203.10554C14.8317%202.42835%2014.1391%202.0004%2013.382%202ZM13.8818%205L13.3817%204.00046L10.6185%204L10.1182%205H13.8818Z'%20fill='%23ED1818'/%3e%3crect%20x='13'%20y='12'%20width='2'%20height='6'%20rx='1'%20fill='%23ED1818'/%3e%3crect%20x='9'%20y='12'%20width='2'%20height='6'%20rx='1'%20fill='%23ED1818'/%3e%3c/svg%3e\"","import { Modal } from '@/components';\nimport { Button } from '@/components/Button';\nimport { R } from '@/Resources.resx';\n\nexport type InlineAlertProps = {\n onClose: () => void;\n errorMessage: string;\n};\n\nexport const InlineAlert = ({ onClose, errorMessage }: InlineAlertProps) => {\n return (\n
\n

{R.Error}

\n
\n

{errorMessage}

\n
\n
\n \n
\n
\n );\n};\n","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M12%2020C16.4183%2020%2020%2016.4183%2020%2012C20%207.58172%2016.4183%204%2012%204C7.58172%204%204%207.58172%204%2012C4%2016.4183%207.58172%2020%2012%2020ZM12%2022C17.5228%2022%2022%2017.5228%2022%2012C22%206.47715%2017.5228%202%2012%202C6.47715%202%202%206.47715%202%2012C2%2017.5228%206.47715%2022%2012%2022Z'%20fill='currentColor'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M12%2010C12.5523%2010%2013%2010.4477%2013%2011V16C13%2016.5523%2012.5523%2017%2012%2017C11.4477%2017%2011%2016.5523%2011%2016V11C11%2010.4477%2011.4477%2010%2012%2010Z'%20fill='currentColor'/%3e%3ccircle%20cx='12'%20cy='8'%20r='0.5'%20fill='currentColor'%20stroke='currentColor'/%3e%3c/svg%3e\"","import infoIcon from '../../../../../../wwwroot/images/icons/info.svg';\nimport { R } from '@/Resources.resx';\nimport { Button } from '@/components/Button';\nimport * as React from 'react';\nimport { Utils } from '@/shared/Utils';\nimport { IFormKid } from '@/features/profile/MinorChildren/ChildModal/ChildModal.types';\n\ntype ModulusWarningProps = {\n cprNumber: string;\n onConfirm: (data: IFormKid) => void;\n onBack: () => void;\n data: IFormKid;\n isPending: boolean;\n};\n\nexport const ModulusWarning: React.FunctionComponent = ({\n cprNumber,\n onConfirm,\n onBack,\n data,\n isPending,\n}: ModulusWarningProps) => {\n return (\n
\n \n
\n

{R.ConfirmCprIsCorrectHeader}

\n

\n {`${Utils.formatCpr(cprNumber)} `}\n {R.CprModulusCheckWarning}\n

\n
\n\n
\n \n {R.Back}\n \n onConfirm(data)}\n >\n {R.ConfirmAndSave}\n \n
\n
\n );\n};\n","import { IAddKidRequest } from '@/shared/interfaces';\nimport { fetchIStatus } from '@/shared/fetchIStatus';\n\nexport const createChild = async (childData: IAddKidRequest) => {\n return await fetchIStatus(\n '/api/patients/child',\n 'POST',\n childData,\n );\n};\n","import { atomWithMutation } from 'jotai-tanstack-query';\nimport { IAddKidRequest } from '@/shared/interfaces';\nimport { R } from '@/Resources.resx';\nimport { createChild } from '@/api/profile/createChild';\n\nexport const addChildMutationAtom = atomWithMutation((get) => ({\n mutationFn: async (variables: IAddKidRequest): Promise => {\n return createChild(variables).catch((error) => {\n // Modify the error message but still throw it for React Query to handle\n throw new Error(\n `${R.CouldNotCreateChild}${error instanceof Error ? error.message : R.UnknownError}`,\n );\n });\n },\n}));\n","import { useAtom } from 'jotai';\nimport { addChildMutationAtom } from '@/features/profile/MinorChildren/state/addChildMutationAtom';\n\n// Custom hook to add a child\nexport const useAddChild = () => {\n const [{ mutate, status, reset, error }] = useAtom(addChildMutationAtom); // `useAtom` to access the mutation state and trigger function\n\n // Return the mutation state and trigger function\n return {\n mutate, // This will trigger the mutation\n status,\n reset,\n errorMessage: error instanceof Error ? error.message : null,\n };\n};\n","import { IKid } from '@/shared/interfaces';\nimport { fetchIStatus } from '@/shared/fetchIStatus';\n\nexport const editChild = async (childData: IKid) => {\n return await fetchIStatus(\n '/api/patients/kid',\n 'PUT',\n childData,\n );\n};\n","import { atomWithMutation } from 'jotai-tanstack-query';\nimport { IKid } from '@/shared/interfaces';\nimport { R } from '@/Resources.resx';\nimport { editChild } from '@/api/profile/editChild';\n\nexport const editChildMutationAtom = atomWithMutation((get) => ({\n mutationFn: async (variables: IKid): Promise => {\n return editChild(variables).catch((error) => {\n // Modify the error message but still throw it for React Query to handle\n throw new Error(\n `${R.CouldNotUpdateChild}${error instanceof Error ? error.message : R.UnknownError}`,\n );\n });\n },\n}));\n","import { useAtom } from 'jotai';\nimport { editChildMutationAtom } from '@/features/profile/MinorChildren/state/editChildMutationAtom';\n\n// Custom hook to add a child\nexport const useEditChild = () => {\n const [{ mutate, status, reset, error }] = useAtom(editChildMutationAtom); // `useAtom` to access the mutation state and trigger function\n\n // Return the mutation state and trigger function\n return {\n mutate, // This will trigger the mutation\n status,\n reset,\n errorMessage: error instanceof Error ? error.message : null,\n };\n};\n","import { useAddChild } from '@/features/profile/MinorChildren/hooks/useAddChild';\nimport { useEditChild } from '@/features/profile/MinorChildren/hooks/useEditChild';\nimport { ChildModalMode } from '@/features/profile/MinorChildren/ChildModal/ChildModal.types';\n\nexport const useAddOrEditChild = ({ mode }: { mode: ChildModalMode }) => {\n const addChild = useAddChild();\n const editChild = useEditChild();\n\n if (mode.isAdding) {\n return addChild;\n }\n\n if (mode.isEditing) {\n return editChild;\n }\n\n return {\n mutate: async () => Promise.resolve(), // No-op function as fallback\n status: 'idle',\n errorMessage: '',\n reset: () => {},\n };\n};\n","import { useState } from 'react';\nimport { useForm, SubmitHandler } from 'react-hook-form';\nimport { useAddOrEditChild } from '@/features/profile/MinorChildren/ChildModal/useAddOrEditChild';\nimport { Utils } from '@/shared/Utils';\nimport { ChildModalMode, ChildModalProps, IFormKid } from './ChildModal.types';\nimport { IKid } from '@/shared/interfaces';\n\nexport const useChildForm = ({\n mode,\n kid,\n onMutationSuccess,\n onClose,\n}: ChildModalProps) => {\n const {\n register,\n handleSubmit,\n formState: { errors },\n } = useForm({\n defaultValues: createDefaultFormValues(mode, kid),\n });\n\n const [modulusWarningProps, setModulusWarningProps] = useState<{\n cprNumber: string;\n data: IFormKid;\n show: boolean;\n } | null>(null);\n\n const [runningOnMutationSuccess, setRunningOnMutationSuccess] =\n useState(false);\n\n const { mutate, status, reset, errorMessage } = useAddOrEditChild({ mode });\n\n const isProcessing = status === 'pending' || runningOnMutationSuccess;\n\n const onSuccess = async () => {\n setRunningOnMutationSuccess(true);\n try {\n await onMutationSuccess?.();\n } finally {\n setRunningOnMutationSuccess(false);\n hideModulusWarning();\n onClose();\n }\n reset();\n };\n\n const onError = () => {\n hideModulusWarning();\n };\n\n const onSubmit: SubmitHandler = (data) => {\n if (!Utils.cprModulusCheck(data.CPR)) {\n setModulusWarningProps({ cprNumber: data.CPR, data, show: true });\n return;\n }\n if (status !== 'pending') {\n mutate(data, { onSuccess, onError });\n }\n };\n\n const confirmCprAfterModulusWarning = async (data: IFormKid) => {\n if (status !== 'pending') {\n await mutate(data, { onSuccess, onError });\n }\n };\n\n const hideModulusWarning = () => setModulusWarningProps(null);\n\n return {\n register,\n handleSubmit,\n errors,\n onSubmit,\n status,\n isProcessing,\n reset,\n errorMessage,\n modulusWarningProps,\n hideModulusWarning,\n confirmCprAfterModulusWarning,\n };\n};\n\nconst createDefaultFormValues = (\n mode: ChildModalMode,\n kid?: IKid,\n): IFormKid => {\n if (mode.isEditing && kid)\n return (({ FormattedCpr, ...rest }) => rest)(kid);\n\n if (mode.isAdding)\n return {\n Name: '',\n CPR: '',\n };\n return undefined;\n};\n","import { Button, Modal } from '@/components';\nimport { R } from '@/Resources.resx';\nimport { Input } from '@/components/Input';\nimport { InlineAlert } from '@/components/InlineAlert';\nimport { ModulusWarning } from '@/features/profile/MinorChildren/ChildModal/ModulusWarning/ModulusWarning';\nimport { useChildForm } from './useChildForm';\nimport {\n ChildModalMode,\n ChildModalProps,\n} from '@/features/profile/MinorChildren/ChildModal/ChildModal.types';\nimport {\n isCprNumber,\n isFullName,\n isUnderCertainAge,\n} from '@/shared/validators';\nimport * as React from 'react';\nimport { ReactElement } from 'react';\n\nexport const ChildModal = (props: ChildModalProps) => {\n const {\n register,\n handleSubmit,\n errors,\n onSubmit,\n status,\n isProcessing,\n reset,\n errorMessage,\n modulusWarningProps,\n hideModulusWarning,\n confirmCprAfterModulusWarning,\n } = useChildForm(props);\n\n const { mode, onClose } = props;\n const confirmButton = generateConfirmButton(props.mode, isProcessing);\n\n return (\n {\n reset();\n onClose();\n }}\n title={generateTitle(mode)}\n showCloseButtonInRightCorner\n >\n {modulusWarningProps?.show && (\n \n )}\n\n {!modulusWarningProps?.show && status !== 'error' && (\n
\n \n isFullName(value) || R.PleaseEnterFullName,\n },\n })}\n error={errors.Name?.message}\n />\n value.replace('-', ''),\n validate: {\n validCpr: (value: string) =>\n isCprNumber(value) || R.InvalidCpr,\n isUnderCertainAge: (value: string) =>\n isUnderCertainAge(value, 18) || R.CprTooOld,\n },\n })}\n error={errors.CPR?.message}\n maxLength={11}\n />\n

\n
\n
{confirmButton}
\n
\n \n )}\n\n {status === 'error' && (\n \n )}\n \n );\n};\n\nconst generateConfirmButton = (\n mode: ChildModalMode,\n isProcessing: boolean,\n): ReactElement => {\n if (mode.isAdding) {\n return (\n \n {R.ProfileConfirmAddKid}\n \n );\n }\n if (mode.isEditing) {\n return (\n \n {R.ProfileConfirmEditKid}\n \n );\n }\n};\n\nconst generateTitle = (mode: ChildModalMode): string => {\n if (mode.isEditing) {\n return R.Profile_EditChild;\n }\n if (mode.isAdding) {\n return R.Profile_AddChild;\n }\n return;\n};\n","import { fetch } from '@/shared/fetch';\nimport { ISelfResponse } from '@/shared/interfaces';\n\nexport const fetchProfile = async () => {\n return await fetch('/api/patients/self/v2', 'GET');\n};\n","import { atomWithQuery } from 'jotai-tanstack-query';\nimport { ISelfResponse } from '@/shared/interfaces';\nimport { fetchProfile } from '@/api/profile/fetchProfile';\n\nexport const fetchProfileQueryAtom = atomWithQuery(\n () => ({\n queryKey: ['profile'],\n queryFn: async () => {\n return fetchProfile();\n },\n initialData: undefined,\n enabled: false, // avoid initial fetch\n }),\n);\n","import { useAtom } from 'jotai';\n\nimport { ISelfResponse } from '@/shared/interfaces';\nimport { fetchProfileQueryAtom } from '@/features/profile/MinorChildren/state/fetchProfileQueryAtom';\nimport { atom } from 'jotai/index';\nimport { QueryObserverResult } from '@tanstack/react-query';\n\ntype ProfileResponse = {\n profile: ISelfResponse | undefined;\n status: 'pending' | 'success' | 'error' | 'idle';\n refetch: () => Promise<\n QueryObserverResult\n >;\n errorMessage: string | null;\n};\n\nconst profileFetchedAtom = atom(false);\n\n// Custom hook to fetch the profile\nexport const useProfile = (): ProfileResponse => {\n const [{ refetch, error, data, status }] = useAtom(fetchProfileQueryAtom);\n const [isFetched, setIsFetched] = useAtom(profileFetchedAtom);\n\n return {\n profile: data, // The fetched profile data\n status: isFetched ? status : 'idle', // The query status (loading, success, error): override this status to not have it set to 'pending' initially\n refetch: async () => {\n const refetchedData = await refetch();\n setIsFetched(true);\n return refetchedData; // Return the latest profile data\n },\n errorMessage: error instanceof Error ? error.message : null,\n };\n};\n","import { Button } from '@/components/Button';\n\nexport type InlineConfirmationProps = {\n message: string;\n confirmButtonText: string;\n confirmButtonClick: () => void;\n cancelButtonText: string;\n onClose: () => void;\n isPending: boolean;\n};\n\nexport const InlineConfirmation = ({\n message,\n confirmButtonText,\n cancelButtonText,\n confirmButtonClick,\n onClose,\n isPending,\n}: InlineConfirmationProps) => {\n return (\n <>\n
\n
{message}
\n
\n {\n onClose();\n }}\n >\n {cancelButtonText}\n \n {\n confirmButtonClick();\n }}\n >\n {confirmButtonText}\n \n
\n
\n \n );\n};\n","import { fetchIStatus } from '@/shared/fetchIStatus';\n\nexport const deleteChild = async (UID: string) => {\n const url = `/api/patients/kid/${UID}`;\n\n return await fetchIStatus(url, 'DELETE');\n};\n","import { atomWithMutation } from 'jotai-tanstack-query';\nimport { deleteChild } from '@/api/profile/deleteChild';\nimport { R } from '@/Resources.resx';\n\nexport const deleteChildMutationAtom = atomWithMutation((get) => ({\n mutationFn: async (childId: string): Promise => {\n return deleteChild(childId).catch((error) => {\n throw new Error(\n `${R.ErrorDeleteChild} ${error instanceof Error ? error.message : R.UnknownError}`,\n );\n });\n },\n}));\n","import { useAtom } from 'jotai';\nimport { deleteChildMutationAtom } from '@/features/profile/MinorChildren/state/deleteChildMutationAtom';\n\n// Custom hook to delete a child\nexport const useDeleteChild = () => {\n const [{ mutate, status, reset, error }] = useAtom(deleteChildMutationAtom); // `useAtom` to access the mutation state and trigger function\n\n // Return the mutation state and trigger function\n return {\n mutate, // This will trigger the mutation\n status,\n reset,\n errorMessage: error instanceof Error ? error.message : null,\n };\n};\n","import { Modal } from '@/components';\nimport { InlineConfirmation } from '@/components/InlineConfirmation';\nimport { InlineAlert } from '@/components/InlineAlert';\nimport { useDeleteChild } from '@/features/profile/MinorChildren/hooks/useDeleteChild';\nimport { R } from '@/Resources.resx';\nimport { IKid } from '@/shared/interfaces';\nimport * as React from 'react';\n\nexport const ConfirmDeletionModal = ({\n kid,\n onClose,\n onMutationSuccess,\n title,\n}: {\n kid: IKid; // The child to delete\n onClose: () => void;\n onMutationSuccess?: () => Promise;\n title?: string;\n}) => {\n const { mutate, status, reset, errorMessage } = useDeleteChild();\n\n const [runningOnMutationSuccess, setRunningOnMutationSuccess] =\n React.useState(false);\n\n const onSuccess = async () => {\n setRunningOnMutationSuccess(true);\n try {\n await onMutationSuccess();\n } finally {\n setRunningOnMutationSuccess(false);\n }\n onClose(); // Close the modal when the mutation succeeds\n reset(); // Reset mutation state to avoid unnecessary re-renders\n };\n\n const confirmationProps = {\n confirmButtonText: R.DeleteProfile,\n message: R.RemoveChildText,\n confirmButtonClick: () => {\n if (status !== 'pending') {\n mutate(kid.UID, { onSuccess });\n }\n },\n cancelButtonText: R.KeepProfile,\n onClose: onClose,\n isPending: status === 'pending' || runningOnMutationSuccess,\n };\n\n const inlineAlertProps = {\n onClose: () => reset(),\n errorMessage,\n };\n\n return (\n \n {status !== 'error' && (\n \n )}\n {status === 'error' && }\n \n );\n};\n","import * as React from 'react';\nimport { useState } from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { R } from '@/Resources.resx';\nimport { IKid, ISelfResponse } from '@/shared/interfaces';\nimport { Button } from '@/components/Button';\nimport { useSetAtom } from 'jotai';\nimport { kidsAtom, profileAtom } from '@/features/profile/MinorChildren/store';\nimport editIcon from '../../../../wwwroot/images/icons/edit.svg';\nimport trashIcon from '../../../../wwwroot/images/icons/trash.svg';\nimport { ChildModal } from '@/features/profile/MinorChildren/ChildModal/ChildModal';\nimport { useHydrateAtoms } from 'jotai/utils';\n\nimport { useAtom } from 'jotai/index';\nimport { useProfile } from '@/features/profile/MinorChildren/hooks/useProfile';\nimport { ConfirmDeletionModal } from '@/features/profile/MinorChildren/ConfirmDeletionModal/ConfirmDeletionModal';\nimport { toast } from '@/shared/Toast';\n\nexport function MinorChildrenApp(\n containerQuery: string,\n selfResponse: ISelfResponse,\n childTerms: string,\n) {\n const elm = document.querySelector(containerQuery);\n const root = createRoot(elm);\n root.render(\n ,\n );\n}\n\ntype MinorChildrenProps = {\n selfResponse: ISelfResponse;\n childTerms: string;\n};\nconst MinorChildren: ({\n selfResponse,\n childTerms,\n}: MinorChildrenProps) => React.ReactNode = ({ selfResponse, childTerms }) => {\n const setProfileAtom = useSetAtom(profileAtom);\n useHydrateAtoms([[profileAtom, selfResponse]]);\n\n const [kids] = useAtom(kidsAtom); // use this derived atom\n const { refetch } = useProfile(); // refetch data when updating, adding or deleting a child.\n\n // Refetch and populate the profile atom again\n const handleRefetch = async () => {\n const updatedProfile = await refetch();\n\n if (updatedProfile?.error) {\n toast.addToast({\n type: 'error',\n message: R.RefreshDataError,\n autoClose: true,\n });\n return;\n }\n\n if (updatedProfile?.data) {\n setProfileAtom(updatedProfile.data);\n }\n };\n\n const [deleteModalForKid, setDeleteModalForKid] = useState(null);\n const [editModalForKid, setEditModalForKid] = useState(null);\n const [addModalForKid, setAddModalForKid] = useState(false);\n\n const openDeleteKidModal = (kid: IKid): void => {\n setDeleteModalForKid(kid);\n };\n const closeDeleteKidModal = (): void => {\n setDeleteModalForKid(null);\n };\n\n const openEditKidModal = (kid: IKid): void => {\n setEditModalForKid(kid);\n };\n const closeEditKidModal = (): void => {\n setEditModalForKid(null);\n };\n\n const openAddKidModal = (): void => {\n setAddModalForKid(true);\n };\n const closeAddKidModal = (): void => {\n setAddModalForKid(false);\n };\n\n return (\n <>\n

\n {R.Profile_Description_Children}\n

\n {kids?.map((kid) => (\n \n
\n \n openEditKidModal(kid)}\n >\n \n {kid.Name}\n
\n
\n {kid.FormattedCpr}\n
\n \n openEditKidModal(kid)}\n />\n \n \n \n \n ))}\n\n \n\n {deleteModalForKid && (\n \n )}\n\n {editModalForKid && (\n \n )}\n\n {addModalForKid && (\n \n )}\n \n );\n};\n","import { IPet } from '@/shared/interfaces';\nimport { Modal } from '@/components';\nimport { R } from '@/features/profile/ProfileResources.resx';\nimport { PetSexEnum, PetTypeEnum } from '@/shared/enums';\nimport { useState } from 'react';\nimport { Select, Button, Input, FormErrorText } from '@/components';\nimport { Utils } from '@/shared/Utils';\n\nexport type PetModalProps = {\n pet: IPet;\n onClose: () => void;\n};\n\nconst petTypeOptions = [\n { value: PetTypeEnum.Dog, label: R.PetTypeDog },\n { value: PetTypeEnum.Cat, label: R.PetTypeCat },\n { value: PetTypeEnum.Rabbit, label: R.PetTypeRabbit },\n { value: PetTypeEnum.Rodent, label: R.PetTypeRodent },\n];\n\nconst petSexOptions = [\n { value: PetSexEnum.Female, label: R.PetSexFemale },\n { value: PetSexEnum.FemaleSterilized, label: R.PetSexFemaleSterilized },\n { value: PetSexEnum.Male, label: R.PetSexMale },\n { value: PetSexEnum.MaleNeutered, label: R.PetSexMaleNeutered },\n { value: PetSexEnum.Unknown, label: R.PetSexUnknown },\n];\n\nconst months = [\n { value: 0, label: R.MonthJanuary },\n { value: 1, label: R.MonthFebruary },\n { value: 2, label: R.MonthMarch },\n { value: 3, label: R.MonthApril },\n { value: 4, label: R.MonthMay },\n { value: 5, label: R.MonthJune },\n { value: 6, label: R.MonthJuly },\n { value: 7, label: R.MonthAugust },\n { value: 8, label: R.MonthSeptember },\n { value: 9, label: R.MonthOctober },\n { value: 10, label: R.MonthNovember },\n { value: 11, label: R.MonthDecember },\n];\n\nconst currentYear = new Date().getFullYear();\nconst maxYears = currentYear - 30;\n\nconst years = [\n ...Array.from(\n { length: currentYear - maxYears + 1 },\n (_, i) => maxYears + i,\n ).map((year) => ({ value: year, label: year.toString() })),\n];\n\nexport const PetModal = ({ onClose, pet }: PetModalProps) => {\n const [selectedPetType, setSelectedPetType] = useState('');\n const [selectedPetSex, setSelectedPetSex] = useState('');\n const [selectedMonth, setSelectedMonth] = useState('');\n const [selectedYear, setSelectedYear] = useState('');\n\n const onCancel = () => onClose();\n\n const isEditing = pet != null;\n\n return (\n \n
\n
\n
\n \n\n
\n
\n \n {R.PetType}\n

\n
\n \n setSelectedPetType(e.target.value)\n }\n >\n \n
\n
\n\n
\n \n {R.PetSex}\n

\n
\n \n setSelectedPetSex(e.target.value)\n }\n >\n \n
\n
\n
\n\n
\n

\n {R.PetBirthdate}\n

\n
\n
\n \n setSelectedMonth(e.target.value)\n }\n >\n \n
\n\n
\n \n setSelectedYear(e.target.value)\n }\n >\n \n
\n
\n
\n {R.PetBirthdateHint}\n
\n
\n\n \n\n \n
\n
\n\n
\n \n
\n
\n
\n );\n};\n","import * as React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { IPet } from '@/shared/interfaces';\nimport { PetTypeEnum } from '@/shared/enums';\nimport { R } from '@/features/profile/ProfileResources.resx';\nimport { Button } from '@/components';\nimport { useState } from 'react';\nimport { PetModal } from '@/features/profile/pets/PetModal';\n\nexport function PetsApp(containerQuery: string, pets: IPet[]) {\n const elm = document.querySelector(containerQuery);\n const root = createRoot(elm);\n root.render();\n}\n\ntype PetProps = {\n pets: IPet[];\n};\n\nconst iconPath: (petType: PetTypeEnum) => string = (petType) => {\n switch (petType) {\n case PetTypeEnum.Dog:\n return '/images/icons/pet-dog.svg';\n case PetTypeEnum.Cat:\n return '/images/icons/pet-cat.svg';\n case PetTypeEnum.Rabbit:\n return '/images/icons/pet-rabbit.svg';\n case PetTypeEnum.Rodent:\n return '/images/icons/pet-rodent.svg';\n default:\n return '/images/icons/pet-dog.svg';\n }\n};\n\nconst Pets: ({ pets }: PetProps) => React.ReactNode = ({ pets }) => {\n const [selectedPet, setSelectedPet] = useState();\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n const openEditPetModal = (pet: IPet | null): void => {\n setSelectedPet(pet);\n setIsModalOpen(true);\n };\n return (\n <>\n \n {pets.map((pet) => (\n \n openEditPetModal(pet)}\n >\n \n
\n
\n {pet.Name}\n
\n
\n {pet.Race}\n
\n
\n \n \n\n \n \n ))}\n \n\n \n\n {isModalOpen && (\n {\n setIsModalOpen(false);\n }}\n >\n )}\n \n );\n};\n","import './shared/sentry';\n\nconst w = window as any;\n\nimport jquery from 'jquery';\nw.$ = w.jQuery = jquery;\n\nimport './knockout/KnockoutExtenders';\nimport './knockout/KnockoutValidationExtenders';\n\nimport * as ko from 'knockout';\nw.ko = ko;\n\nimport Dropzone from 'dropzone';\nDropzone.autoDiscover = false;\nw.Dropzone = Dropzone;\n\nimport { ProfileViewModel } from './knockout/viewModels/ProfileViewModel';\nimport { Utils } from './shared/Utils';\n\nimport { Locale, setDefaultOptions } from 'date-fns';\nimport { da, enGB, nb } from 'date-fns/locale';\n\nconst cultureQuery = Utils.getParameterByName('culture');\nconst cultureCookie = decodeURIComponent(\n Utils.getCookie('.AspNetCore.Culture'),\n);\n\nconst formatRelativeLocale: any = {\n lastWeek: R.dateFnsLongDateTimeFormat,\n yesterday: R.dateFnsLongDateTimeFormat,\n today: R.dateFnsTodayRelativeFormat,\n tomorrow: R.dateFnsTomorrowRelativeFormat,\n nextWeek: R.dateFnsLongDateTimeFormat,\n other: R.dateFnsLongDateTimeFormat,\n};\n\nif (cultureQuery == 'en' || cultureCookie == 'c=en|uic=en') {\n setLocale(enGB);\n} else if (cultureQuery == 'no' || cultureCookie == 'c=no|uic=no') {\n setLocale(nb);\n} else {\n setLocale(da);\n}\n\nfunction setLocale(locale: Locale) {\n setDefaultOptions({\n locale: {\n ...locale,\n formatRelative: (token: string) => formatRelativeLocale[token],\n },\n });\n}\n\nimport {\n ConsultationTypeEnum,\n ShouldPayConsultationTypeEnum,\n} from './shared/enums';\nimport { BookEmailConsultationViewModel } from './knockout/viewModels/consultations/BookEmailConsultationViewModel';\nimport { BookVideoConsultationViewModel } from './knockout/viewModels/consultations/BookVideoConsultationViewModel';\nimport { StepProgress } from './knockout/viewModels/StepProgress';\nimport { Log } from './shared/Log';\nimport { Heartbeat } from './shared/heartbeat';\nimport { AlertViewModel } from './knockout/viewModels/AlertViewModel';\nimport { RateConsultation } from './knockout/viewModels/consultations/RateConsultationViewModel';\nimport { ReceiveVideoCall } from './knockout/viewModels/consultations/ReceiveVideoCallFromDoctor';\nimport { ProfileInsuranceViewModel } from './knockout/viewModels/ProfileInsuranceViewModel';\nimport { ConsultationDetailsViewModel } from './knockout/viewModels/consultations/ConsultationDetailsViewModel';\nimport { CallQualityFeedback } from './knockout/viewModels/doctor/CallQualityFeedbackViewModel';\nimport { SelectPatientViewModel } from './knockout/viewModels/consultations/SelectPatientViewModel';\nimport { ClockValidatorApp } from './features/clockValidator/ClockValidatorApp';\nimport { R } from '@/Resources.resx';\nimport { PfaResultPageViewModel } from './knockout/viewModels/PfaResultPageViewModel';\nimport { MyInfoApp } from '@/features/profile/myInfo/MyInfoApp';\nimport { MinorChildrenApp } from '@/features/profile/MinorChildren/MinorChildrenApp';\nimport { PetsApp } from '@/features/profile/pets/PetsApp';\n\nw.Hejdoktor = {\n ProfileViewModel: ProfileViewModel,\n Utils: Utils,\n ShouldPayConsultationTypeEnum: ShouldPayConsultationTypeEnum,\n ConsultationTypeEnum: ConsultationTypeEnum,\n BookEmailConsultationViewModel: BookEmailConsultationViewModel,\n BookVideoConsultationViewModel: BookVideoConsultationViewModel,\n StepProgress: StepProgress,\n Log: Log,\n AlertViewModel: AlertViewModel,\n RateConsultation: RateConsultation,\n ReceiveVideoCall: ReceiveVideoCall,\n ProfileInsuranceViewModel: ProfileInsuranceViewModel,\n ConsultationDetailsViewModel: ConsultationDetailsViewModel,\n Heartbeat: Heartbeat,\n CallQualityFeedback: CallQualityFeedback,\n SelectPatientViewModel: SelectPatientViewModel,\n ClockValidatorApp: ClockValidatorApp,\n MinorChildrenApp: MinorChildrenApp,\n PfaResultPageViewModel: PfaResultPageViewModel,\n MyInfoApp: MyInfoApp,\n PetsApp: PetsApp,\n};\n"],"names":["shouldThrowError","throwError","params","noop","useMutation","options","queryClient","client","useQueryClient","observer","React.useState","MutationObserver","React.useEffect","result","React.useSyncExternalStore","React.useCallback","onStoreChange","notifyManager","mutate","variables","mutateOptions","addDays","date","amount","_date","toDate","constructFrom","addMonths","dayOfMonth","endOfDesiredMonth","daysInMonth","add","duration","years","months","weeks","days","hours","minutes","seconds","dateWithMonths","dateWithDays","minutesToAdd","msToAdd","compareAsc","dateLeft","dateRight","diff","constructNow","isSameDay","laterDate","earlierDate","dateLeft_","dateRight_","normalizeDates","startOfDay","differenceInCalendarMonths","laterDate_","earlierDate_","yearsDiff","monthsDiff","differenceInCalendarYears","differenceInDays","sign","compareLocalAsc","difference","differenceInCalendarDays","isLastDayNotFull","getRoundingMethod","method","number","differenceInHours","millisecondsInHour","differenceInMilliseconds","differenceInMinutes","millisecondsInMinute","endOfDay","endOfMonth","month","isLastDayOfMonth","differenceInMonths","workingLaterDate","isLastMonthNotFull","differenceInSeconds","differenceInYears","partial","normalizeInterval","context","interval","start","end","intervalToDuration","remainingMonths","remainingDays","remainingHours","remainingMinutes","remainingSeconds","isToday","startOfToday","ko.extenders","target","ko.computed","newValue","current","valueToWrite","isPhoneNumber","input","isFullName","isEmail","isCprNumber","day","isUnderCertainAge","cpr","validate","cleanedCPR","birthday","cprToDateOfBirth","maxAgeYearsAgo","year","seventhDigit","century","CprHelper","ko.validation","R","minAgeYearsAgo","mainInt","factors","cprDigit","name","phone","value","currentYear","currentMonth","ReceiveVideoCall","pollingInterval","self","Log","Modal","ajaxCall","response","_status","error","reason","PartnerModalViewModel","Utils","request","fetch","e","AlertViewModel","ko.observable","ko.validatedObservable","ko.pureComputed","partnerToDelete","PetModalViewModel","pet","petToUpdate","ko.observableArray","PetTypeEnum","PetSexEnum","maxYears","_","i","petToDelete","titleElement","petType","standardizedInput","parsedValue","ProfileViewModel","onlyPartnerData","res","err","x","val","item","currentKid","currentAdultHouseholdMember","data","textStatus","jqXhr","url","event","languageCode","pluralRules","minimumFractionDigits","maximumFractionDigits","nf","format","receiver","getLocale","_da","_en","InputType","InputType2","StopWordChecker","consultationType","isEmailConsultation","ko","shortestWordLength","shortestCompoundWordLength","details","word","isCompoundWord","messageText","inputType","words","lastWord","lastTwoWords","checkSingleStopWords","checkCompoundStopWords","maxDistanceSingleWord","maxDistanceCompoundWord","foundCompoundStopWordMatch","category","stopWord","trimmedStopWord","wordToMatch","maxDistance","matrix","j","minDistanceInRow","cost","substitutionCost","deletionCost","insertionCost","wordLength","maxDistanceAllowed","matchedStopWord","stopWordCategory","warningTitle","warningMessage","capitalizedStopWord","logMessage","BookEmailConsultationViewModel","serviceType","price","consultationHasCategories","messageUuid","subject","message","onBehalfOf","attachments","questionnaireResult","isQuestionnaireOnly","isAttachmentRequired","label","dropzoneOptions","file","uid","dropzoneContainer","Dropzone","key","mockFile","fd","callbackSucces","status","callbackError","successCallback","errorCallback","consultationRequest","anchor","id","shouldScroll","findLast","arr","fn","emptyUuid","BookVideoConsultationViewModel","canQueueNow","stepProgress","skipConsultationDetails","bookImmediately","testResultUidParam","caregivers","selectCaregiverModal","subjectTextDraft","notifyOwnDoctorEnabled","notifyOwnDoctorDraft","onBehalfOfNameDraft","onBehalfOfCprDraft","onBehalfOfUidDraft","onBehalfOfPetID","consultationUid","consultationDraftScheduledOn","preferredCaregiverUid","selectedPatientName","selectedPatientCpr","selectedPatientUid","isChildSelected","isOpenNow","preferredCaregiver","formatString","timeslots","arrayOfTimeSlots","parseISO","consultationDraftScheduledOnFormatted","timeSlotDraft","t","timeslotMap","currentItem","formatDate","timeslotArray","isSupportedDevice","ConsultationTypeEnum","loadDraft","loadBehalfOfDraft","isPatientSelected","currentIndex","next","idx","page","OpenVideoConsultationStatusEnum","redirectUrl","scheduledDateParam","startingDate","endingDate","query","firstTimeslot","callBackAjax","waitingTimeMinutes","errorCallBack","categoryId","StepProgress","steps","RateConsultation","consultation","ProfileInsuranceViewModel","provider","policyNumber","redirect","returnUrl","ok","ConsultationDetailsViewModel","existingMessageUuid","canReply","isVideo","now","opensOn","closesOn","newErrorMessage","existingAddFilesContainer","addFilesContainer","alignmentWrapper","addFilesIcon","addFilesText","customRemoveLink","previewElements","consultationLength","button","panel","linkToCancellation","consultationScheduledOn","minutesToMeetingAfterWhichBookingCantBeRefunded","confirmCancelMessage","scheduledOn","waitingRoomOpensOn","waitingRoomClosesOn","isDoctor","currentTimelineMessage","attachment","a","b","fileName","pathParts","fileType","textarea","commonFetch","CallQualityFeedback","feedback","ChildModalViewModel","kid","kidToUpdate","_newValue","kidToDelete","SelectPatientViewModel","handledBy","continuationUrl","patientUid","childId","correctConsultationTypeForChild","selectedUser","PfaResultPageViewModel","isCheckBoxInput","element","isDateObject","isNullOrUndefined","isObjectType","isObject","getEventValue","getNodeParentName","isNameInFieldArray","names","isPlainObject","tempObject","prototypeCopy","isWeb","cloneObject","copy","isArray","isFileListInstance","compact","isUndefined","get","object","path","defaultValue","isBoolean","isKey","stringToPath","set","index","tempPath","length","lastIndex","objValue","EVENTS","VALIDATION_MODE","INPUT_VALIDATION_RULES","React","getProxyFormState","formState","control","localProxyFormState","isRoot","_key","isEmptyObject","shouldRenderFormState","formStateData","_proxyFormState","updateFormState","convertToArrayPayload","useSubscribe","props","_props","subscription","isString","generateWatchOutput","_names","formValues","isGlobal","fieldName","appendErrors","validateAllFieldCriteria","errors","type","getValidationModes","mode","isWatched","isBlurEvent","watchName","iterateFieldsByAction","fields","action","fieldsNames","abortEarly","field","_f","currentField","updateFieldArrayRootError","fieldArrayErrors","isFileInput","isFunction","isHTMLElement","owner","isMessage","isRadioInput","isRegex","defaultResult","validResult","getCheckboxValue","values","option","defaultReturn","getRadioValue","previous","getValidateError","ref","getValueAndMessage","validationData","validateField","disabledFieldNames","shouldUseNativeValidation","isFieldArray","refs","required","maxLength","minLength","min","max","pattern","valueAsNumber","mount","inputValue","inputRef","setCustomValidity","isRadio","isCheckBox","isRadioOrCheckbox","isEmpty","appendErrorsCurry","getMinMaxMessage","exceedMax","maxLengthMessage","minLengthMessage","maxType","minType","exceedMin","maxOutput","minOutput","valueNumber","valueDate","convertTimeToDate","time","isTime","isWeek","maxLengthOutput","minLengthOutput","patternValue","validateError","validationResult","baseGet","updatePath","isEmptyArray","obj","unset","paths","childObject","createSubject","_observers","isPrimitive","deepEqual","object1","object2","keys1","keys2","val1","val2","isMultipleSelect","live","objectHasFunction","markFieldsDirty","isParentNodeArray","getDirtyFieldsFromDefaultValues","dirtyFieldsFromValues","getDirtyFields","defaultValues","getFieldValueAs","valueAsDate","setValueAs","getFieldValue","getResolverOptions","_fields","criteriaMode","getRuleValue","rule","ASYNC_FUNCTION","hasPromiseValidation","fieldReference","validateFunction","hasValidation","schemaErrorLookup","foundError","skipValidation","isTouched","isSubmitted","reValidateMode","unsetEmptyArray","defaultOptions","createFormControl","_options","_formState","_defaultValues","_formValues","_state","delayErrorCallback","timer","_subjects","validationModeBeforeSubmit","validationModeAfterSubmit","shouldDisplayAllAssociatedErrors","debounce","callback","wait","_updateValid","shouldUpdateValid","isValid","_executeSchema","executeBuiltInValidation","_updateIsValidating","isValidating","_updateFieldArray","args","shouldSetValues","shouldUpdateFieldsAndState","fieldValues","touchedFields","_getDirty","updateErrors","_setErrors","updateValidAndValue","shouldSkipSetValueAs","setFieldValue","updateTouchAndDirty","fieldValue","shouldDirty","shouldRender","shouldUpdateField","isPreviousDirty","output","disabledField","isCurrentFieldPristine","isPreviousFieldTouched","shouldRenderByError","fieldState","previousFieldError","updatedFormState","executeSchemaAndUpdateState","shouldOnlyCheckValid","isFieldArrayRoot","isPromiseFunction","fieldError","_removeUnmounted","unregister","getValues","_getWatch","_getFieldArray","optionRef","checkboxRef","radioRef","trigger","setValues","fieldKey","setValue","cloneValue","onChange","isFieldValueUpdated","getCurrentFieldValue","_updateIsFieldValueUpdated","shouldSkipValidation","watched","previousErrorLookupResult","errorLookupResult","_focusInput","fieldNames","getFieldState","clearErrors","inputName","setError","currentError","currentRef","restOfErrorTree","watch","payload","_updateDisabledField","disabled","register","disabledIsDefined","fieldRef","radioOrCheckbox","_focusError","_disableForm","handleSubmit","onValid","onInvalid","onValidError","resetField","_reset","keepStateOptions","updatedValues","cloneUpdatedValues","isEmptyResetValues","fieldsToCheck","form","reset","useForm","_formControl","_values","isDirty","state","fetchIStatus","requestData","responseData","errorMessage","updateSelf","MyInfoModal","selfOnOpen","onClose","updateSelfMutation","onSubmit","onCancel","jsx","jsxs","Input","GlobalResources","FormErrorText","Button","selfResponseAtom","atom","selfRequestAtom","editIcon","MyInfoApp","containerQuery","selfResponse","elm","root","createRoot","QueryClient","QueryClientProvider","MyInfo","bootstrappedSelfResponse","useHydrateAtoms","isModalOpen","setIsModalOpen","useState","setSelfResponseAtom","useSetAtom","useAtom","Fragment","profileAtom","kidsAtom","trashIcon","InlineAlert","infoIcon","ModulusWarning","cprNumber","onConfirm","onBack","isPending","createChild","childData","addChildMutationAtom","atomWithMutation","useAddChild","editChild","editChildMutationAtom","useEditChild","useAddOrEditChild","addChild","useChildForm","onMutationSuccess","createDefaultFormValues","modulusWarningProps","setModulusWarningProps","runningOnMutationSuccess","setRunningOnMutationSuccess","isProcessing","onSuccess","hideModulusWarning","onError","confirmCprAfterModulusWarning","FormattedCpr","rest","ChildModal","confirmButton","generateConfirmButton","generateTitle","fetchProfile","fetchProfileQueryAtom","atomWithQuery","profileFetchedAtom","useProfile","refetch","isFetched","setIsFetched","refetchedData","InlineConfirmation","confirmButtonText","cancelButtonText","confirmButtonClick","deleteChild","UID","deleteChildMutationAtom","useDeleteChild","ConfirmDeletionModal","title","confirmationProps","inlineAlertProps","MinorChildrenApp","childTerms","MinorChildren","setProfileAtom","kids","handleRefetch","updatedProfile","toast","deleteModalForKid","setDeleteModalForKid","editModalForKid","setEditModalForKid","addModalForKid","setAddModalForKid","openDeleteKidModal","closeDeleteKidModal","openEditKidModal","closeEditKidModal","openAddKidModal","closeAddKidModal","petTypeOptions","petSexOptions","PetModal","selectedPetType","setSelectedPetType","selectedPetSex","setSelectedPetSex","selectedMonth","setSelectedMonth","selectedYear","setSelectedYear","isEditing","Select","PetsApp","pets","Pets","iconPath","selectedPet","setSelectedPet","openEditPetModal","w","jquery","cultureQuery","cultureCookie","formatRelativeLocale","setLocale","enGB","nb","da","locale","setDefaultOptions","token","ShouldPayConsultationTypeEnum","Heartbeat","ClockValidatorApp"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,49]}