@oneblink/apps-react 9.0.0-beta.4 → 9.0.0-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/OneBlinkFormBase.js +1 -1
  2. package/dist/OneBlinkFormBase.js.map +1 -1
  3. package/dist/PaymentReceipt.js +2 -2
  4. package/dist/PaymentReceipt.js.map +1 -1
  5. package/dist/apps/tenants.d.ts +2 -1
  6. package/dist/apps/tenants.js +25 -1
  7. package/dist/apps/tenants.js.map +1 -1
  8. package/dist/components/ArcGISWebMap.js +6 -3
  9. package/dist/components/ArcGISWebMap.js.map +1 -1
  10. package/dist/components/ConfirmDialog.js +3 -2
  11. package/dist/components/ConfirmDialog.js.map +1 -1
  12. package/dist/components/formStore/OneBlinkFormStoreClearFiltersButton.js +1 -3
  13. package/dist/components/formStore/OneBlinkFormStoreClearFiltersButton.js.map +1 -1
  14. package/dist/components/formStore/OneBlinkFormStoreRefreshButton.js +1 -3
  15. package/dist/components/formStore/OneBlinkFormStoreRefreshButton.js.map +1 -1
  16. package/dist/components/formStore/OneBlinkFormStoreTable.js +3 -3
  17. package/dist/components/formStore/OneBlinkFormStoreTable.js.map +1 -1
  18. package/dist/components/formStore/table/RepeatableSetCell.js +1 -0
  19. package/dist/components/formStore/table/RepeatableSetCell.js.map +1 -1
  20. package/dist/components/formStore/table/useFormStoreTable.js +1 -0
  21. package/dist/components/formStore/table/useFormStoreTable.js.map +1 -1
  22. package/dist/components/renderer/Modal.js +3 -1
  23. package/dist/components/renderer/Modal.js.map +1 -1
  24. package/dist/components/renderer/Tooltip.js +3 -1
  25. package/dist/components/renderer/Tooltip.js.map +1 -1
  26. package/dist/form-elements/FormElementBSB.js +1 -1
  27. package/dist/form-elements/FormElementBSB.js.map +1 -1
  28. package/dist/form-elements/FormElementFreshdeskDependentField.js +3 -10
  29. package/dist/form-elements/FormElementFreshdeskDependentField.js.map +1 -1
  30. package/dist/form-elements/FormElementLocation.js +5 -1
  31. package/dist/form-elements/FormElementLocation.js.map +1 -1
  32. package/dist/form-elements/FormElementLookupButton.js +1 -1
  33. package/dist/form-elements/FormElementLookupButton.js.map +1 -1
  34. package/dist/form-elements/FormElementSummary.js +3 -1
  35. package/dist/form-elements/FormElementSummary.js.map +1 -1
  36. package/dist/hooks/form-date-picker/useFormDatePickerProps.js +2 -0
  37. package/dist/hooks/form-date-picker/useFormDatePickerProps.js.map +1 -1
  38. package/dist/hooks/useFormSubmissionDuration.js +2 -0
  39. package/dist/hooks/useFormSubmissionDuration.js.map +1 -1
  40. package/dist/hooks/useLoadDataState.js +4 -3
  41. package/dist/hooks/useLoadDataState.js.map +1 -1
  42. package/dist/hooks/useOneBlinkFormContainer.d.ts +2 -1
  43. package/dist/hooks/useOneBlinkFormContainer.js +2 -2
  44. package/dist/hooks/useOneBlinkFormContainer.js.map +1 -1
  45. package/package.json +10 -7
@@ -1 +1 @@
1
- {"version":3,"file":"FormElementLocation.js","sourceRoot":"","sources":["../../src/form-elements/FormElementLocation.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { FormTypes } from '@oneblink/types'\nimport { Sentry } from '../apps'\nimport clsx from 'clsx'\nimport { GoogleMap, Marker } from '@react-google-maps/api'\nimport queryString from 'query-string'\n\nimport useBooleanState from '../hooks/useBooleanState'\nimport useIsOffline from '../hooks/useIsOffline'\nimport * as geolocation from '../services/geolocation'\nimport OnLoading from '../components/renderer/OnLoading'\nimport defaultCoords from '../services/defaultCoordinates'\nimport useGoogle from '../hooks/useGoogle'\nimport useGoogleMapsApiKey from '../hooks/useGoogleMapsApiKey'\nimport FormElementLabelContainer from '../components/renderer/FormElementLabelContainer'\nimport { FormElementValueChangeHandler, IsDirtyProps } from '../types/form'\nimport { LookupNotificationContext } from '../hooks/useLookupNotification'\nimport { useReverseGeocodeContext } from '../components/renderer/ReverseGeocode'\nimport useElementAriaDescribedby from '../hooks/useElementAriaDescribedby'\nimport FormElementValidationMessage from '../components/renderer/FormElementValidationMessage'\n\ntype Props = {\n id: string\n element: FormTypes.LocationElement\n value: unknown | undefined\n onChange: FormElementValueChangeHandler<Coords>\n displayValidationMessage: boolean\n validationMessage: string | undefined\n} & IsDirtyProps\n\ntype Coords = {\n latitude: number\n longitude: number\n zoom?: number\n}\n\nexport const stringifyLocation = (location: Coords | undefined) => {\n if (location) {\n return `${location.latitude},${location.longitude}`\n }\n}\n\nexport function parseLocationValue(value: unknown): Coords | undefined {\n if (!value || typeof value !== 'object') {\n return\n }\n\n const { latitude, longitude, zoom } = value as Record<string, unknown>\n if (typeof latitude !== 'number' || typeof longitude !== 'number') {\n return\n }\n\n return {\n latitude,\n longitude,\n zoom: typeof zoom === 'number' ? zoom : initialMapZoom,\n }\n}\n\nconst mapHeight = 300\nconst initialMapZoom = 15\nconst apiUrl = 'https://maps.googleapis.com/maps/api/staticmap'\n\nfunction FormElementLocation({\n id,\n element,\n value,\n onChange,\n validationMessage,\n displayValidationMessage,\n isDirty,\n setIsDirty,\n}: Props) {\n const ariaDescribedby = useElementAriaDescribedby(id, element)\n const [isLocationPickerOpen, showLocationPicker, hideLocationPicker] =\n useBooleanState(false)\n\n const [location, setLocation] = React.useState<Coords | undefined>(undefined)\n const onClear = React.useCallback(() => {\n hideLocationPicker()\n onChange(element, {\n value: undefined,\n })\n setLocation(undefined)\n }, [element, hideLocationPicker, onChange])\n\n const onCancel = React.useCallback(() => {\n hideLocationPicker()\n setLocation(parseLocationValue(value))\n }, [hideLocationPicker, value])\n\n const onLocate = React.useCallback(async () => {\n showLocationPicker()\n\n if (location) {\n return\n }\n\n let currentLocation = null\n try {\n const result = await geolocation.getCurrentPosition()\n currentLocation = result.coords\n } catch (err) {\n console.error(\n 'Error while attempting to find the users current location',\n err,\n )\n Sentry.captureException(err)\n } finally {\n setLocation(parseLocationValue(currentLocation || defaultCoords()))\n }\n }, [location, showLocationPicker])\n\n const isLoadingLocation = !location && isLocationPickerOpen\n\n const onConfirm = React.useCallback(() => {\n setIsDirty()\n hideLocationPicker()\n onChange(element, {\n value: location,\n })\n }, [element, hideLocationPicker, location, onChange, setIsDirty])\n\n // SET DEFAULT/PREFILL DATA\n React.useEffect(() => {\n const newValue = parseLocationValue(value)\n if (newValue) {\n setLocation(newValue)\n }\n }, [value])\n\n const { isLookingUp } = React.useContext(LookupNotificationContext)\n const isDisplayingValidationMessage =\n (isDirty || displayValidationMessage) && !!validationMessage && !isLookingUp\n\n const { isReverseGeocoding, reverseGeocodingErrorMsg } =\n useReverseGeocodeContext()\n\n return (\n <div className=\"cypress-location-element\">\n <FormElementLabelContainer\n className=\"ob-location\"\n id={id}\n element={element}\n required={element.required}\n >\n <div className=\"control\">\n <LocationDisplay\n isOpen={isLocationPickerOpen}\n isLoading={isLoadingLocation}\n location={location}\n onChange={setLocation}\n />\n\n <div className=\"buttons ob-buttons ob-location__buttons\">\n {isLocationPickerOpen || isReverseGeocoding ? (\n <>\n <button\n type=\"button\"\n className=\"is-light button ob-button ob-button__cancel ob-location__button ob-location__button-cancel cypress-cancel-location-button\"\n onClick={onCancel}\n disabled={element.readOnly || isReverseGeocoding}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className={clsx(\n 'is-primary button ob-button ob-button__confirm ob-location__button ob-location__button-confirm cypress-confirm-location-button',\n {\n 'is-loading': isReverseGeocoding,\n },\n )}\n onClick={onConfirm}\n disabled={element.readOnly || !location || isReverseGeocoding}\n >\n Confirm\n </button>\n </>\n ) : (\n <>\n <button\n type=\"button\"\n className=\"is-light button ob-button ob-button__clear ob-button-clear ob-location__button ob-location__button-clear cypress-clear-location-button\"\n onClick={onClear}\n disabled={element.readOnly}\n >\n Clear\n </button>\n <button\n type=\"button\"\n className=\"is-primary button ob-button ob-button__edit ob-location__button ob-location__button-edit cypress-locate-button\"\n onClick={onLocate}\n disabled={element.readOnly}\n onBlur={setIsDirty}\n id={id}\n aria-describedby={ariaDescribedby}\n >\n Locate\n </button>\n </>\n )}\n </div>\n </div>\n\n {isDisplayingValidationMessage && (\n <FormElementValidationMessage message={validationMessage} />\n )}\n {reverseGeocodingErrorMsg && (\n <FormElementValidationMessage message={reverseGeocodingErrorMsg} />\n )}\n </FormElementLabelContainer>\n </div>\n )\n}\n\nconst LocationDisplay = React.memo(function LocationDisplay({\n isLoading,\n isOpen,\n location,\n onChange,\n}: {\n isLoading: boolean\n isOpen: boolean\n location: Coords | undefined\n onChange: (location: Coords) => void\n}) {\n const isOffline = useIsOffline()\n\n if (isLoading) {\n return (\n <figure className=\"ob-figure\">\n <div className=\"figure-content\">\n <OnLoading small></OnLoading>\n </div>\n </figure>\n )\n }\n\n if (isOffline) {\n return <LocationIsOffline location={location} isOpen={isOpen} />\n }\n\n if (isOpen) {\n if (!location) {\n // There is no location to display while user is attempting to pick a location.\n // This should never happen, if loading has finished a default should be set.\n // Fail fast!!!\n // https://en.wikipedia.org/wiki/Fail-fast\n throw new Error(\n 'Default location was not set for \"location\" form element',\n )\n }\n\n return <LocationPicker location={location} onChange={onChange} />\n }\n\n if (location) {\n return <LocationImage location={location} />\n }\n\n return null\n})\n\nfunction LocationIsOfflineFigureContent({\n children,\n}: {\n children: React.ReactNode\n}) {\n return (\n <figure className=\"ob-figure\">\n <div className=\"figure-content has-text-centered\">\n <h4 className=\"title is-4\" role=\"alert\">\n You are currently offline\n </h4>\n {children}\n </div>\n </figure>\n )\n}\n\nconst LocationIsOffline = React.memo(function LocationIsOffline({\n location,\n isOpen,\n}: {\n location: Coords | undefined\n isOpen: boolean\n}) {\n if (isOpen) {\n if (location) {\n // If user is offline and attempting to pick a location and there is one set already\n return (\n <LocationIsOfflineFigureContent>\n <p>\n Click the <b>Confirm</b> button below to set the location to your\n current position.\n </p>\n </LocationIsOfflineFigureContent>\n )\n }\n\n // If user is offline and attempting to pick a location and there is one nothing set yet\n return (\n <LocationIsOfflineFigureContent>\n <p>\n We could not find your current location. Click the <b>Cancel</b>{' '}\n button below to try again.\n </p>\n </LocationIsOfflineFigureContent>\n )\n }\n\n // If user is offline and has confirmed a location\n if (location) {\n return (\n <LocationIsOfflineFigureContent>\n <h3 className=\"title is-3 ob-location__latitude\">Latitude</h3>\n <p>\n <b>{location.latitude}</b>\n </p>\n <h3 className=\"title is-3 ob-location__longitude\">Longitude</h3>\n <p>\n <b>{location.longitude}</b>\n </p>\n </LocationIsOfflineFigureContent>\n )\n }\n\n // User is offline with no location set and not attempting to pick a location\n return null\n})\n\nconst LocationImage = React.memo(function LocationImage({\n location,\n}: {\n location: Coords\n}) {\n const googleMapsApiKey = useGoogleMapsApiKey()\n\n const staticUrl = React.useMemo(() => {\n const center = `${location.latitude},${location.longitude}`\n const queries = {\n key: googleMapsApiKey,\n size: `${mapHeight}x${mapHeight}`,\n zoom: location.zoom,\n center,\n markers: `color:red|${center}`,\n }\n return `${apiUrl}?${queryString.stringify(queries)}`\n }, [googleMapsApiKey, location])\n\n return (\n <figure className=\"ob-figure\">\n <img\n className=\"ob-location__map\"\n alt={`map with center at ${location.latitude} latitude, ${location.longitude} longitude`}\n src={staticUrl}\n height={mapHeight}\n width={mapHeight}\n />\n </figure>\n )\n})\n\nconst LocationPicker = React.memo(function LocationPicker({\n location,\n onChange,\n}: {\n location: Coords\n onChange: (newLocation: Coords) => void\n}) {\n const { isLoaded } = useGoogle()\n\n return (\n <figure className=\"ob-figure\">\n {isLoaded && (\n <GoogleLocationPicker location={location} onChange={onChange} />\n )}\n </figure>\n )\n})\n\nconst GoogleLocationPicker = React.memo(function GoogleLocationPicker({\n location,\n onChange,\n}: {\n location: Coords\n onChange: (newLocation: Coords) => void\n}) {\n const [map, setMap] = React.useState<google.maps.Map | null>(null)\n const [marker, setMarker] = React.useState<google.maps.Marker | null>(null)\n\n const originalCenter = React.useRef<{ lat: number; lng: number }>({\n lat: location.latitude,\n lng: location.longitude,\n })\n\n const markerAnimation = React.useMemo(() => google.maps.Animation.DROP, [])\n\n const onZoomChanged = React.useCallback(() => {\n if (!map) {\n return\n }\n\n onChange({\n latitude: location.latitude,\n longitude: location.longitude,\n zoom: map.getZoom(),\n })\n }, [location.latitude, location.longitude, map, onChange])\n\n const handleDragEnd = React.useCallback(\n (e: google.maps.MapMouseEvent) => {\n if (!e.latLng) {\n return\n }\n const { lat, lng } = e.latLng.toJSON()\n onChange({\n latitude: lat,\n longitude: lng,\n zoom: location.zoom,\n })\n if (map) {\n map.panTo(e.latLng)\n }\n },\n [location.zoom, map, onChange],\n )\n\n const handleClick = React.useCallback(\n (e: google.maps.MapMouseEvent) => {\n handleDragEnd(e)\n\n if (!e.latLng || !marker) {\n return\n }\n\n marker.setPosition(e.latLng)\n // this enables the marker to animate after moving it\n marker.setMap(null)\n marker.setAnimation(markerAnimation)\n marker.setMap(map)\n },\n [handleDragEnd, map, marker, markerAnimation],\n )\n\n return (\n <GoogleMap\n onLoad={(map) => setMap(map)}\n onUnmount={() => setMap(null)}\n mapContainerStyle={{\n height: 300,\n }}\n center={originalCenter.current}\n zoom={location.zoom}\n onZoomChanged={onZoomChanged}\n onClick={handleClick}\n options={{ draggableCursor: 'pointer' }}\n >\n <Marker\n onLoad={(marker) => setMarker(marker)}\n onUnmount={() => setMarker(null)}\n animation={markerAnimation}\n position={originalCenter.current}\n draggable\n onDragEnd={handleDragEnd}\n ></Marker>\n </GoogleMap>\n )\n})\n\nexport default React.memo(FormElementLocation)\n"]}
1
+ {"version":3,"file":"FormElementLocation.js","sourceRoot":"","sources":["../../src/form-elements/FormElementLocation.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { FormTypes } from '@oneblink/types'\nimport { Sentry } from '../apps'\nimport clsx from 'clsx'\nimport { GoogleMap, Marker } from '@react-google-maps/api'\nimport queryString from 'query-string'\n\nimport useBooleanState from '../hooks/useBooleanState'\nimport useIsOffline from '../hooks/useIsOffline'\nimport * as geolocation from '../services/geolocation'\nimport OnLoading from '../components/renderer/OnLoading'\nimport defaultCoords from '../services/defaultCoordinates'\nimport useGoogle from '../hooks/useGoogle'\nimport useGoogleMapsApiKey from '../hooks/useGoogleMapsApiKey'\nimport FormElementLabelContainer from '../components/renderer/FormElementLabelContainer'\nimport { FormElementValueChangeHandler, IsDirtyProps } from '../types/form'\nimport { LookupNotificationContext } from '../hooks/useLookupNotification'\nimport { useReverseGeocodeContext } from '../components/renderer/ReverseGeocode'\nimport useElementAriaDescribedby from '../hooks/useElementAriaDescribedby'\nimport FormElementValidationMessage from '../components/renderer/FormElementValidationMessage'\n\ntype Props = {\n id: string\n element: FormTypes.LocationElement\n value: unknown | undefined\n onChange: FormElementValueChangeHandler<Coords>\n displayValidationMessage: boolean\n validationMessage: string | undefined\n} & IsDirtyProps\n\ntype Coords = {\n latitude: number\n longitude: number\n zoom?: number\n}\n\nexport const stringifyLocation = (location: Coords | undefined) => {\n if (location) {\n return `${location.latitude},${location.longitude}`\n }\n}\n\nexport function parseLocationValue(value: unknown): Coords | undefined {\n if (!value || typeof value !== 'object') {\n return\n }\n\n const { latitude, longitude, zoom } = value as Record<string, unknown>\n if (typeof latitude !== 'number' || typeof longitude !== 'number') {\n return\n }\n\n return {\n latitude,\n longitude,\n zoom: typeof zoom === 'number' ? zoom : initialMapZoom,\n }\n}\n\nconst mapHeight = 300\nconst initialMapZoom = 15\nconst apiUrl = 'https://maps.googleapis.com/maps/api/staticmap'\n\nfunction FormElementLocation({\n id,\n element,\n value,\n onChange,\n validationMessage,\n displayValidationMessage,\n isDirty,\n setIsDirty,\n}: Props) {\n const ariaDescribedby = useElementAriaDescribedby(id, element)\n const [isLocationPickerOpen, showLocationPicker, hideLocationPicker] =\n useBooleanState(false)\n\n const [location, setLocation] = React.useState<Coords | undefined>(undefined)\n const onClear = React.useCallback(() => {\n hideLocationPicker()\n onChange(element, {\n value: undefined,\n })\n setLocation(undefined)\n }, [element, hideLocationPicker, onChange])\n\n const onCancel = React.useCallback(() => {\n hideLocationPicker()\n setLocation(parseLocationValue(value))\n }, [hideLocationPicker, value])\n\n const onLocate = React.useCallback(async () => {\n showLocationPicker()\n\n if (location) {\n return\n }\n\n let currentLocation = null\n try {\n const result = await geolocation.getCurrentPosition()\n currentLocation = result.coords\n } catch (err) {\n console.error(\n 'Error while attempting to find the users current location',\n err,\n )\n Sentry.captureException(err)\n } finally {\n setLocation(parseLocationValue(currentLocation || defaultCoords()))\n }\n }, [location, showLocationPicker])\n\n const isLoadingLocation = !location && isLocationPickerOpen\n\n const onConfirm = React.useCallback(() => {\n setIsDirty()\n hideLocationPicker()\n onChange(element, {\n value: location,\n })\n }, [element, hideLocationPicker, location, onChange, setIsDirty])\n\n // SET DEFAULT/PREFILL DATA\n React.useEffect(() => {\n const newValue = parseLocationValue(value)\n if (newValue) {\n setLocation(newValue)\n }\n }, [value])\n\n const { isLookingUp } = React.useContext(LookupNotificationContext)\n const isDisplayingValidationMessage =\n (isDirty || displayValidationMessage) && !!validationMessage && !isLookingUp\n\n const { isReverseGeocoding, reverseGeocodingErrorMsg } =\n useReverseGeocodeContext()\n\n return (\n <div className=\"cypress-location-element\">\n <FormElementLabelContainer\n className=\"ob-location\"\n id={id}\n element={element}\n required={element.required}\n >\n <div className=\"control\">\n <LocationDisplay\n isOpen={isLocationPickerOpen}\n isLoading={isLoadingLocation}\n location={location}\n onChange={setLocation}\n />\n\n <div className=\"buttons ob-buttons ob-location__buttons\">\n {isLocationPickerOpen || isReverseGeocoding ? (\n <>\n <button\n type=\"button\"\n className=\"is-light button ob-button ob-button__cancel ob-location__button ob-location__button-cancel cypress-cancel-location-button\"\n onClick={onCancel}\n disabled={element.readOnly || isReverseGeocoding}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className={clsx(\n 'is-primary button ob-button ob-button__confirm ob-location__button ob-location__button-confirm cypress-confirm-location-button',\n {\n 'is-loading': isReverseGeocoding,\n },\n )}\n onClick={onConfirm}\n disabled={element.readOnly || !location || isReverseGeocoding}\n >\n Confirm\n </button>\n </>\n ) : (\n <>\n <button\n type=\"button\"\n className=\"is-light button ob-button ob-button__clear ob-button-clear ob-location__button ob-location__button-clear cypress-clear-location-button\"\n onClick={onClear}\n disabled={element.readOnly}\n >\n Clear\n </button>\n <button\n type=\"button\"\n className=\"is-primary button ob-button ob-button__edit ob-location__button ob-location__button-edit cypress-locate-button\"\n onClick={onLocate}\n disabled={element.readOnly}\n onBlur={setIsDirty}\n id={id}\n aria-describedby={ariaDescribedby}\n >\n Locate\n </button>\n </>\n )}\n </div>\n </div>\n\n {isDisplayingValidationMessage && (\n <FormElementValidationMessage message={validationMessage} />\n )}\n {reverseGeocodingErrorMsg && (\n <FormElementValidationMessage message={reverseGeocodingErrorMsg} />\n )}\n </FormElementLabelContainer>\n </div>\n )\n}\n\nconst LocationDisplay = React.memo(function LocationDisplay({\n isLoading,\n isOpen,\n location,\n onChange,\n}: {\n isLoading: boolean\n isOpen: boolean\n location: Coords | undefined\n onChange: (location: Coords) => void\n}) {\n const isOffline = useIsOffline()\n\n if (isLoading) {\n return (\n <figure className=\"ob-figure\">\n <div className=\"figure-content\">\n <OnLoading small></OnLoading>\n </div>\n </figure>\n )\n }\n\n if (isOffline) {\n return <LocationIsOffline location={location} isOpen={isOpen} />\n }\n\n if (isOpen) {\n if (!location) {\n // There is no location to display while user is attempting to pick a location.\n // This should never happen, if loading has finished a default should be set.\n // Fail fast!!!\n // https://en.wikipedia.org/wiki/Fail-fast\n throw new Error(\n 'Default location was not set for \"location\" form element',\n )\n }\n\n return <LocationPicker location={location} onChange={onChange} />\n }\n\n if (location) {\n return <LocationImage location={location} />\n }\n\n return null\n})\n\nfunction LocationIsOfflineFigureContent({\n children,\n}: {\n children: React.ReactNode\n}) {\n return (\n <figure className=\"ob-figure\">\n <div className=\"figure-content has-text-centered\">\n <h4 className=\"title is-4\" role=\"alert\">\n You are currently offline\n </h4>\n {children}\n </div>\n </figure>\n )\n}\n\nconst LocationIsOffline = React.memo(function LocationIsOffline({\n location,\n isOpen,\n}: {\n location: Coords | undefined\n isOpen: boolean\n}) {\n if (isOpen) {\n if (location) {\n // If user is offline and attempting to pick a location and there is one set already\n return (\n <LocationIsOfflineFigureContent>\n <p>\n Click the <b>Confirm</b> button below to set the location to your\n current position.\n </p>\n </LocationIsOfflineFigureContent>\n )\n }\n\n // If user is offline and attempting to pick a location and there is one nothing set yet\n return (\n <LocationIsOfflineFigureContent>\n <p>\n We could not find your current location. Click the <b>Cancel</b>{' '}\n button below to try again.\n </p>\n </LocationIsOfflineFigureContent>\n )\n }\n\n // If user is offline and has confirmed a location\n if (location) {\n return (\n <LocationIsOfflineFigureContent>\n <h3 className=\"title is-3 ob-location__latitude\">Latitude</h3>\n <p>\n <b>{location.latitude}</b>\n </p>\n <h3 className=\"title is-3 ob-location__longitude\">Longitude</h3>\n <p>\n <b>{location.longitude}</b>\n </p>\n </LocationIsOfflineFigureContent>\n )\n }\n\n // User is offline with no location set and not attempting to pick a location\n return null\n})\n\nconst LocationImage = React.memo(function LocationImage({\n location,\n}: {\n location: Coords\n}) {\n const googleMapsApiKey = useGoogleMapsApiKey()\n\n const staticUrl = React.useMemo(() => {\n const center = `${location.latitude},${location.longitude}`\n const queries = {\n key: googleMapsApiKey,\n size: `${mapHeight}x${mapHeight}`,\n zoom: location.zoom,\n center,\n markers: `color:red|${center}`,\n }\n return `${apiUrl}?${queryString.stringify(queries)}`\n }, [googleMapsApiKey, location])\n\n return (\n <figure className=\"ob-figure\">\n <img\n className=\"ob-location__map\"\n alt={`map with center at ${location.latitude} latitude, ${location.longitude} longitude`}\n src={staticUrl}\n height={mapHeight}\n width={mapHeight}\n />\n </figure>\n )\n})\n\nconst LocationPicker = React.memo(function LocationPicker({\n location,\n onChange,\n}: {\n location: Coords\n onChange: (newLocation: Coords) => void\n}) {\n const { isLoaded } = useGoogle()\n\n return (\n <figure className=\"ob-figure\">\n {isLoaded && (\n <GoogleLocationPicker location={location} onChange={onChange} />\n )}\n </figure>\n )\n})\n\nconst GoogleLocationPicker = React.memo(function GoogleLocationPicker({\n location,\n onChange,\n}: {\n location: Coords\n onChange: (newLocation: Coords) => void\n}) {\n const [map, setMap] = React.useState<google.maps.Map | null>(null)\n const [marker, setMarker] = React.useState<google.maps.Marker | null>(null)\n\n const originalCenter = React.useRef<{ lat: number; lng: number }>({\n lat: location.latitude,\n lng: location.longitude,\n })\n\n const markerAnimation = React.useMemo(() => google.maps.Animation.DROP, [])\n\n const onZoomChanged = React.useCallback(() => {\n if (!map) {\n return\n }\n\n onChange({\n latitude: location.latitude,\n longitude: location.longitude,\n zoom: map.getZoom(),\n })\n }, [location.latitude, location.longitude, map, onChange])\n\n const handleDragEnd = React.useCallback(\n (e: google.maps.MapMouseEvent) => {\n if (!e.latLng) {\n return\n }\n const { lat, lng } = e.latLng.toJSON()\n onChange({\n latitude: lat,\n longitude: lng,\n zoom: location.zoom,\n })\n if (map) {\n map.panTo(e.latLng)\n }\n },\n [location.zoom, map, onChange],\n )\n\n const handleClick = React.useCallback(\n (e: google.maps.MapMouseEvent) => {\n handleDragEnd(e)\n\n if (!e.latLng || !marker) {\n return\n }\n\n marker.setPosition(e.latLng)\n // this enables the marker to animate after moving it\n marker.setMap(null)\n marker.setAnimation(markerAnimation)\n marker.setMap(map)\n },\n [handleDragEnd, map, marker, markerAnimation],\n )\n\n return (\n <GoogleMap\n onLoad={(map) => setMap(map)}\n onUnmount={() => setMap(null)}\n mapContainerStyle={{\n height: 300,\n }}\n // eslint-disable-next-line react-hooks/refs\n center={originalCenter.current}\n zoom={location.zoom}\n onZoomChanged={onZoomChanged}\n onClick={handleClick}\n options={{ draggableCursor: 'pointer' }}\n >\n <Marker\n onLoad={(marker) => setMarker(marker)}\n onUnmount={() => setMarker(null)}\n animation={markerAnimation}\n // eslint-disable-next-line react-hooks/refs\n position={originalCenter.current}\n draggable\n onDragEnd={handleDragEnd}\n ></Marker>\n </GoogleMap>\n )\n})\n\nexport default React.memo(FormElementLocation)\n"]}
@@ -10,7 +10,7 @@ import FormElementValidationMessage from '../components/renderer/FormElementVali
10
10
  function stringifyLookupButtonValue(v) {
11
11
  return JSON.stringify(v);
12
12
  }
13
- const FormElementLookupButtonValidationMessage = memo(function _FormElementLookupButtonValidationMessage({ validationMessage, displayValidationMessage, isDirty, }) {
13
+ const FormElementLookupButtonValidationMessage = memo(function FormElementLookupButtonValidationMessageComponent({ validationMessage, displayValidationMessage, isDirty, }) {
14
14
  const { isLookingUp } = useContext(LookupNotificationContext);
15
15
  const isDisplayingValidationMessage = (isDirty || displayValidationMessage) &&
16
16
  !!validationMessage &&
@@ -1 +1 @@
1
- {"version":3,"file":"FormElementLookupButton.js","sourceRoot":"","sources":["../../src/form-elements/FormElementLookupButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import { memo, useCallback, useContext, useEffect, useMemo } from 'react'\nimport LookupButton from '../components/renderer/LookupButton'\nimport { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport FormElementLabelContainer from '../components/renderer/FormElementLabelContainer'\nimport {\n FormElementLookupHandler,\n FormElementValueChangeHandler,\n IsDirtyProps,\n} from '../types/form'\nimport { LookupNotificationContext } from '../hooks/useLookupNotification'\nimport LookupNotification from '../components/renderer/LookupNotification'\nimport useFormSubmissionModel from '../hooks/useFormSubmissionModelContext'\nimport { formElementsService } from '@oneblink/sdk-core'\nimport FormElementValidationMessage from '../components/renderer/FormElementValidationMessage'\n\ntype ValidationMessageProps = {\n displayValidationMessage: boolean\n validationMessage: string | undefined\n} & IsDirtyProps\n\ntype Props = {\n id: string\n element: FormTypes.LookupButtonFormElement\n} & ValidationMessageProps\n\nfunction stringifyLookupButtonValue(v: unknown): string {\n return JSON.stringify(v) as string\n}\n\nconst FormElementLookupButtonValidationMessage = memo(\n function _FormElementLookupButtonValidationMessage({\n validationMessage,\n displayValidationMessage,\n isDirty,\n }: ValidationMessageProps) {\n const { isLookingUp } = useContext(LookupNotificationContext)\n const isDisplayingValidationMessage =\n (isDirty || displayValidationMessage) &&\n !!validationMessage &&\n !isLookingUp\n\n if (!isDisplayingValidationMessage) {\n return null\n }\n\n return <FormElementValidationMessage message={validationMessage} />\n },\n)\n\nfunction FormElementLookupButton({\n id,\n element,\n onChange,\n onLookup,\n ...validationMessageProps\n}: Props & {\n onChange: FormElementValueChangeHandler\n onLookup: FormElementLookupHandler\n}) {\n const { formSubmissionModel, elements } = useFormSubmissionModel()\n const { isAutoLookup, data } = useMemo(() => {\n return generateLookupButtonValue(\n element.elementDependencies,\n elements,\n formSubmissionModel,\n )\n }, [element.elementDependencies, elements, formSubmissionModel])\n\n const handleLookup = useCallback<FormElementLookupHandler>(\n (setter) => {\n onLookup((data) => {\n const dataAfterSetting = setter(data)\n dataAfterSetting.submission[element.name] = true\n return dataAfterSetting\n })\n },\n [element.name, onLookup],\n )\n\n const stringifyData = useMemo(() => {\n if (!data) {\n return undefined\n }\n return stringifyLookupButtonValue(data)\n }, [data])\n\n useEffect(() => {\n onChange(element, {\n value: false,\n })\n }, [element, onChange, stringifyData])\n\n const value = useMemo(() => {\n // Want the value to be `true` if there is data or if there are\n // no element dependencies i.e. the lookup can be run at any time.\n if (!element.elementDependencies.length || data) {\n return true\n }\n return undefined\n }, [data, element.elementDependencies.length])\n\n return (\n <LookupNotification\n autoLookupValue={isAutoLookup ? stringifyData : undefined}\n element={element}\n onLookup={handleLookup}\n stringifyAutoLookupValue={stringifyLookupButtonValue}\n >\n <div className=\"cypress-lookup-button-element\">\n <FormElementLabelContainer\n className=\"ob-lookup-button\"\n id={id}\n element={element}\n required={false}\n >\n <LookupButton\n value={value}\n validationMessage={undefined}\n lookupButtonConfig={element.lookupButton}\n />\n <FormElementLookupButtonValidationMessage\n {...validationMessageProps}\n />\n </FormElementLabelContainer>\n </div>\n </LookupNotification>\n )\n}\n\nexport default memo(FormElementLookupButton)\n\nfunction generateLookupButtonValue(\n elementDependencies: FormTypes.LookupButtonFormElement['elementDependencies'],\n elements: FormTypes.FormElement[],\n formSubmissionModel:\n | SubmissionTypes.S3SubmissionData['submission']\n | undefined,\n): {\n isAutoLookup: boolean\n data: SubmissionTypes.S3SubmissionData['submission'] | undefined\n} {\n if (!formSubmissionModel) {\n return {\n isAutoLookup: false,\n data: undefined,\n }\n }\n\n // \"data\" should be `undefined` if there are no dependent elements with a value.\n // If a least one dependent element has a value, we will enable to lookup to run.\n return elementDependencies.reduce<{\n isAutoLookup: boolean\n data: SubmissionTypes.S3SubmissionData['submission'] | undefined\n }>(\n (memo, elementDependency) => {\n const formElement = formElementsService.findFormElement(\n elements,\n (formElement) => formElement.id === elementDependency.elementId,\n )\n if (!formElement || !('name' in formElement)) {\n return memo\n }\n\n const formElementValue = formSubmissionModel[formElement.name]\n\n switch (elementDependency.type) {\n case 'FORM_FORM_ELEMENT': {\n if (\n formElement.type === 'form' &&\n Array.isArray(formElement.elements)\n ) {\n const nestedLookupButtonValue = generateLookupButtonValue(\n [elementDependency.elementDependency],\n formElement.elements,\n formElementValue as SubmissionTypes.S3SubmissionData['submission'],\n )\n return {\n isAutoLookup:\n memo.isAutoLookup && nestedLookupButtonValue.isAutoLookup,\n data:\n nestedLookupButtonValue.data !== undefined\n ? {\n ...memo.data,\n [formElement.name]: {\n ...(memo?.data?.[formElement.name] || {}),\n ...nestedLookupButtonValue.data,\n },\n }\n : memo.data,\n }\n }\n break\n }\n case 'REPEATABLE_SET_FORM_ELEMENT': {\n if (formElement.type === 'repeatableSet') {\n const entries: {\n isAutoLookup: boolean\n data: Record<\n number,\n SubmissionTypes.S3SubmissionData['submission'] | undefined\n >\n } = {\n isAutoLookup: memo.isAutoLookup,\n data: {},\n }\n let hasAnEntry = false\n const existingEntries =\n (memo.data?.[formElement.name] as object[]) || undefined\n if (Array.isArray(formElementValue)) {\n for (const entry of formElementValue) {\n const index = formElementValue.indexOf(entry)\n const nestedLookupButtonValue = generateLookupButtonValue(\n [elementDependency.elementDependency],\n formElement.elements,\n entry as SubmissionTypes.S3SubmissionData['submission'],\n )\n entries.isAutoLookup =\n entries.isAutoLookup && nestedLookupButtonValue.isAutoLookup\n if (nestedLookupButtonValue.data || existingEntries?.[index]) {\n entries.data[index] = {\n ...existingEntries?.[index],\n ...nestedLookupButtonValue.data,\n }\n hasAnEntry = true\n } else {\n entries.data[index] = undefined\n }\n }\n }\n\n return {\n isAutoLookup: memo.isAutoLookup && entries.isAutoLookup,\n data: hasAnEntry\n ? {\n ...memo.data,\n [formElement.name]: entries.data,\n }\n : memo.data,\n }\n }\n break\n }\n default: {\n if (formElement && 'name' in formElement) {\n const dependencyValue = formSubmissionModel[formElement.name]\n const isAutoLookupChecker = autoLookupElementMap[formElement.type]\n const isFormElementAutoLookup =\n typeof isAutoLookupChecker === 'function'\n ? isAutoLookupChecker(formElement)\n : isAutoLookupChecker\n return {\n isAutoLookup: memo.isAutoLookup && isFormElementAutoLookup,\n data:\n dependencyValue !== undefined && dependencyValue !== null\n ? {\n ...memo.data,\n [formElement.name]: dependencyValue,\n }\n : memo.data,\n }\n }\n break\n }\n }\n\n return memo\n },\n {\n isAutoLookup: true,\n data: undefined,\n },\n )\n}\n\n// Creating an object here so we get a Typescript error when adding a\n// new element type and forgetting to add to the array of allowed types\nconst autoLookupElementMap: Record<\n Exclude<FormTypes.FormElement['type'], 'page'>,\n boolean | ((element: FormTypes.FormElement) => boolean)\n> = {\n text: false,\n textarea: false,\n number: false,\n email: false,\n telephone: false,\n barcodeScanner: false,\n radio: true,\n checkboxes: false,\n select: (formElement) => formElement.type === 'select' && !formElement.multi,\n autocomplete: true,\n boolean: true,\n date: false,\n datetime: false,\n time: false,\n heading: false,\n html: false,\n image: false,\n infoPage: false,\n camera: false,\n repeatableSet: false,\n draw: false,\n calculation: false,\n location: true,\n files: true,\n captcha: false,\n form: false,\n summary: false,\n compliance: true,\n geoscapeAddress: true,\n pointAddress: true,\n pointAddressV3: true,\n googleAddress: false,\n civicaStreetName: true,\n civicaNameRecord: false,\n section: false,\n bsb: false,\n abn: false,\n freshdeskDependentField: false,\n apiNSWLiquorLicence: true,\n arcGISWebMap: true,\n pointCadastralParcel: true,\n lookupButton: false,\n}\n"]}
1
+ {"version":3,"file":"FormElementLookupButton.js","sourceRoot":"","sources":["../../src/form-elements/FormElementLookupButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import { memo, useCallback, useContext, useEffect, useMemo } from 'react'\nimport LookupButton from '../components/renderer/LookupButton'\nimport { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport FormElementLabelContainer from '../components/renderer/FormElementLabelContainer'\nimport {\n FormElementLookupHandler,\n FormElementValueChangeHandler,\n IsDirtyProps,\n} from '../types/form'\nimport { LookupNotificationContext } from '../hooks/useLookupNotification'\nimport LookupNotification from '../components/renderer/LookupNotification'\nimport useFormSubmissionModel from '../hooks/useFormSubmissionModelContext'\nimport { formElementsService } from '@oneblink/sdk-core'\nimport FormElementValidationMessage from '../components/renderer/FormElementValidationMessage'\n\ntype ValidationMessageProps = {\n displayValidationMessage: boolean\n validationMessage: string | undefined\n} & IsDirtyProps\n\ntype Props = {\n id: string\n element: FormTypes.LookupButtonFormElement\n} & ValidationMessageProps\n\nfunction stringifyLookupButtonValue(v: unknown): string {\n return JSON.stringify(v) as string\n}\n\nconst FormElementLookupButtonValidationMessage = memo(\n function FormElementLookupButtonValidationMessageComponent({\n validationMessage,\n displayValidationMessage,\n isDirty,\n }: ValidationMessageProps) {\n const { isLookingUp } = useContext(LookupNotificationContext)\n const isDisplayingValidationMessage =\n (isDirty || displayValidationMessage) &&\n !!validationMessage &&\n !isLookingUp\n\n if (!isDisplayingValidationMessage) {\n return null\n }\n\n return <FormElementValidationMessage message={validationMessage} />\n },\n)\n\nfunction FormElementLookupButton({\n id,\n element,\n onChange,\n onLookup,\n ...validationMessageProps\n}: Props & {\n onChange: FormElementValueChangeHandler\n onLookup: FormElementLookupHandler\n}) {\n const { formSubmissionModel, elements } = useFormSubmissionModel()\n const { isAutoLookup, data } = useMemo(() => {\n return generateLookupButtonValue(\n element.elementDependencies,\n elements,\n formSubmissionModel,\n )\n }, [element.elementDependencies, elements, formSubmissionModel])\n\n const handleLookup = useCallback<FormElementLookupHandler>(\n (setter) => {\n onLookup((data) => {\n const dataAfterSetting = setter(data)\n dataAfterSetting.submission[element.name] = true\n return dataAfterSetting\n })\n },\n [element.name, onLookup],\n )\n\n const stringifyData = useMemo(() => {\n if (!data) {\n return undefined\n }\n return stringifyLookupButtonValue(data)\n }, [data])\n\n useEffect(() => {\n onChange(element, {\n value: false,\n })\n }, [element, onChange, stringifyData])\n\n const value = useMemo(() => {\n // Want the value to be `true` if there is data or if there are\n // no element dependencies i.e. the lookup can be run at any time.\n if (!element.elementDependencies.length || data) {\n return true\n }\n return undefined\n }, [data, element.elementDependencies.length])\n\n return (\n <LookupNotification\n autoLookupValue={isAutoLookup ? stringifyData : undefined}\n element={element}\n onLookup={handleLookup}\n stringifyAutoLookupValue={stringifyLookupButtonValue}\n >\n <div className=\"cypress-lookup-button-element\">\n <FormElementLabelContainer\n className=\"ob-lookup-button\"\n id={id}\n element={element}\n required={false}\n >\n <LookupButton\n value={value}\n validationMessage={undefined}\n lookupButtonConfig={element.lookupButton}\n />\n <FormElementLookupButtonValidationMessage\n {...validationMessageProps}\n />\n </FormElementLabelContainer>\n </div>\n </LookupNotification>\n )\n}\n\nexport default memo(FormElementLookupButton)\n\nfunction generateLookupButtonValue(\n elementDependencies: FormTypes.LookupButtonFormElement['elementDependencies'],\n elements: FormTypes.FormElement[],\n formSubmissionModel:\n | SubmissionTypes.S3SubmissionData['submission']\n | undefined,\n): {\n isAutoLookup: boolean\n data: SubmissionTypes.S3SubmissionData['submission'] | undefined\n} {\n if (!formSubmissionModel) {\n return {\n isAutoLookup: false,\n data: undefined,\n }\n }\n\n // \"data\" should be `undefined` if there are no dependent elements with a value.\n // If a least one dependent element has a value, we will enable to lookup to run.\n return elementDependencies.reduce<{\n isAutoLookup: boolean\n data: SubmissionTypes.S3SubmissionData['submission'] | undefined\n }>(\n (memo, elementDependency) => {\n const formElement = formElementsService.findFormElement(\n elements,\n (formElement) => formElement.id === elementDependency.elementId,\n )\n if (!formElement || !('name' in formElement)) {\n return memo\n }\n\n const formElementValue = formSubmissionModel[formElement.name]\n\n switch (elementDependency.type) {\n case 'FORM_FORM_ELEMENT': {\n if (\n formElement.type === 'form' &&\n Array.isArray(formElement.elements)\n ) {\n const nestedLookupButtonValue = generateLookupButtonValue(\n [elementDependency.elementDependency],\n formElement.elements,\n formElementValue as SubmissionTypes.S3SubmissionData['submission'],\n )\n return {\n isAutoLookup:\n memo.isAutoLookup && nestedLookupButtonValue.isAutoLookup,\n data:\n nestedLookupButtonValue.data !== undefined\n ? {\n ...memo.data,\n [formElement.name]: {\n ...(memo?.data?.[formElement.name] || {}),\n ...nestedLookupButtonValue.data,\n },\n }\n : memo.data,\n }\n }\n break\n }\n case 'REPEATABLE_SET_FORM_ELEMENT': {\n if (formElement.type === 'repeatableSet') {\n const entries: {\n isAutoLookup: boolean\n data: Record<\n number,\n SubmissionTypes.S3SubmissionData['submission'] | undefined\n >\n } = {\n isAutoLookup: memo.isAutoLookup,\n data: {},\n }\n let hasAnEntry = false\n const existingEntries =\n (memo.data?.[formElement.name] as object[]) || undefined\n if (Array.isArray(formElementValue)) {\n for (const entry of formElementValue) {\n const index = formElementValue.indexOf(entry)\n const nestedLookupButtonValue = generateLookupButtonValue(\n [elementDependency.elementDependency],\n formElement.elements,\n entry as SubmissionTypes.S3SubmissionData['submission'],\n )\n entries.isAutoLookup =\n entries.isAutoLookup && nestedLookupButtonValue.isAutoLookup\n if (nestedLookupButtonValue.data || existingEntries?.[index]) {\n entries.data[index] = {\n ...existingEntries?.[index],\n ...nestedLookupButtonValue.data,\n }\n hasAnEntry = true\n } else {\n entries.data[index] = undefined\n }\n }\n }\n\n return {\n isAutoLookup: memo.isAutoLookup && entries.isAutoLookup,\n data: hasAnEntry\n ? {\n ...memo.data,\n [formElement.name]: entries.data,\n }\n : memo.data,\n }\n }\n break\n }\n default: {\n if (formElement && 'name' in formElement) {\n const dependencyValue = formSubmissionModel[formElement.name]\n const isAutoLookupChecker = autoLookupElementMap[formElement.type]\n const isFormElementAutoLookup =\n typeof isAutoLookupChecker === 'function'\n ? isAutoLookupChecker(formElement)\n : isAutoLookupChecker\n return {\n isAutoLookup: memo.isAutoLookup && isFormElementAutoLookup,\n data:\n dependencyValue !== undefined && dependencyValue !== null\n ? {\n ...memo.data,\n [formElement.name]: dependencyValue,\n }\n : memo.data,\n }\n }\n break\n }\n }\n\n return memo\n },\n {\n isAutoLookup: true,\n data: undefined,\n },\n )\n}\n\n// Creating an object here so we get a Typescript error when adding a\n// new element type and forgetting to add to the array of allowed types\nconst autoLookupElementMap: Record<\n Exclude<FormTypes.FormElement['type'], 'page'>,\n boolean | ((element: FormTypes.FormElement) => boolean)\n> = {\n text: false,\n textarea: false,\n number: false,\n email: false,\n telephone: false,\n barcodeScanner: false,\n radio: true,\n checkboxes: false,\n select: (formElement) => formElement.type === 'select' && !formElement.multi,\n autocomplete: true,\n boolean: true,\n date: false,\n datetime: false,\n time: false,\n heading: false,\n html: false,\n image: false,\n infoPage: false,\n camera: false,\n repeatableSet: false,\n draw: false,\n calculation: false,\n location: true,\n files: true,\n captcha: false,\n form: false,\n summary: false,\n compliance: true,\n geoscapeAddress: true,\n pointAddress: true,\n pointAddressV3: true,\n googleAddress: false,\n civicaStreetName: true,\n civicaNameRecord: false,\n section: false,\n bsb: false,\n abn: false,\n freshdeskDependentField: false,\n apiNSWLiquorLicence: true,\n arcGISWebMap: true,\n pointCadastralParcel: true,\n lookupButton: false,\n}\n"]}
@@ -46,7 +46,9 @@ function FormElementSummary({ element, onChange, value }) {
46
46
  // to find the summary elements. Need to start a new array for
47
47
  // this structure and look at each entry in the repeatable set
48
48
  for (const entry of formElementValue) {
49
- const repeatableSetSummaryValues = formElement.elements.reduce((partialSummary, formElement) => reducer(partialSummary, formElement,
49
+ const repeatableSetSummaryValues = formElement.elements.reduce((partialSummary, formElement) =>
50
+ // eslint-disable-next-line react-hooks/immutability
51
+ reducer(partialSummary, formElement,
50
52
  // Pleasing TypeScript
51
53
  entry instanceof Object ? entry : {}), []);
52
54
  if (repeatableSetSummaryValues.length) {
@@ -1 +1 @@
1
- {"version":3,"file":"FormElementSummary.js","sourceRoot":"","sources":["../../src/form-elements/FormElementSummary.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAE7C,OAAO,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAA;AACrF,OAAO,kBAAkB,MAAM,oCAAoC,CAAA;AASnE,MAAM,cAAc,GAAG,CAAC,CAAY,EAAE,CAAY,EAAE,EAAE;IACpD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAA;QACzB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IAEvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAc,EAAE,CAAC,CAAC,CAAC,CAAc,CAAC,CAAA;YACrE,IAAI,CAAC,QAAQ;gBAAE,OAAO,KAAK,CAAA;YAC3B,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAA;IACjC,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AACD,SAAS,kBAAkB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAS;IAC7D,MAAM,EAAE,mBAAmB,EAAE,GAAG,4BAA4B,EAAE,CAAA;IAC9D,MAAM,iBAAiB,GAAG,kBAAkB,EAAE,CAAA;IAE9C,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAC/B,CACE,cAAyC,EACzC,WAAkC,EAClC,UAA0D,EAC1D,EAAE;QACF,IAAI,CAAC,CAAC,MAAM,IAAI,WAAW,CAAC;YAAE,OAAO,cAAc,CAAA;QACnD,IACE,WAAW,CAAC,IAAI,KAAK,eAAe;YACpC,WAAW,CAAC,IAAI,KAAK,MAAM;YAC3B,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,WAAW,CAAC,EAAE,CAAC,EACrE,CAAC;YACD,OAAO,cAAc,CAAA;QACvB,CAAC;QAED,MAAM,gBAAgB,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;QACrD,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,KAAK,CAAC,EAAE,CAAC;YAChD,OAAO,cAAc,CAAA;QACvB,CAAC;QAED,QAAQ,WAAW,CAAC,IAAI,EAAE,CAAC;YACzB,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC;oBAAE,OAAO,cAAc,CAAA;gBAC3D,4DAA4D;gBAC5D,8DAA8D;gBAC9D,8DAA8D;gBAC9D,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;oBACrC,MAAM,0BAA0B,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,CAC5D,CACE,cAAyC,EACzC,WAAkC,EAClC,EAAE,CACF,OAAO,CACL,cAAc,EACd,WAAW;oBACX,sBAAsB;oBACtB,KAAK,YAAY,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CACrC,EACH,EAAE,CACH,CAAA;oBACD,IAAI,0BAA0B,CAAC,MAAM,EAAE,CAAC;wBACtC,cAAc,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;oBACjD,CAAC;gBACH,CAAC;gBACD,MAAK;YACP,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,iBAAiB,GAAG,CAAC,WAAW,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAC3D,CACE,cAAyC,EACzC,WAAkC,EAClC,EAAE,CACF,OAAO,CACL,cAAc,EACd,WAAW;gBACX,uCAAuC;gBACvC,gBAAgB,YAAY,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAC3D,EACH,EAAE,CACH,CAAA;gBACD,IAAI,iBAAiB,CAAC,MAAM,EAAE,CAAC;oBAC7B,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;gBACxC,CAAC;gBAED,MAAK;YACP,CAAC;YACD,KAAK,QAAQ,CAAC;YACd,KAAK,cAAc,CAAC;YACpB,KAAK,OAAO,CAAC;YACb,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,MAAM,YAAY,GAAG,EAAE,CAAA;gBACvB,IAAI,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBACpC,YAAY,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,CAAA;gBACxC,CAAC;qBAAM,CAAC;oBACN,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;gBACrC,CAAC;gBACD,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;oBACvC,cAAc,CAAC,IAAI,CACjB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE;;wBACnD,MAAM,MAAM,GAAG,MAAA,WAAW,CAAC,OAAO,0CAAE,IAAI,CACtC,CAAC,EAAE,KAAK,EAAiC,EAAE,EAAE,CAC3C,WAAW,KAAK,KAAK,CACxB,CAAA;wBACD,IAAI,MAAM,EAAE,CAAC;4BACX,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;wBACjC,CAAC;wBACD,OAAO,YAAY,CAAA;oBACrB,CAAC,EAAE,EAAE,CAAC,CACP,CAAA;gBACH,CAAC;gBACD,MAAK;YACP,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,IAAI,GAAG,mBAAmB,CAAC,YAAY,CAAC;oBAC5C,UAAU,EAAE,SAAS;oBACrB,KAAK,EAAE,gBAA0B;iBAClC,CAAC,CAAA;gBACF,IAAI,IAAI,EAAE,CAAC;oBACT,cAAc,CAAC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;gBAC3D,CAAC;gBACD,MAAK;YACP,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,IAAI,OAAO,gBAAgB,KAAK,QAAQ;oBAAE,OAAO,cAAc,CAAA;gBAC/D,cAAc,CAAC,IAAI,CACjB,mBAAmB,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAC/D,CAAA;gBACD,MAAK;YACP,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,IAAI,OAAO,gBAAgB,KAAK,QAAQ;oBAAE,OAAO,cAAc,CAAA;gBAC/D,cAAc,CAAC,IAAI,CACjB,mBAAmB,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAC3D,CAAA;gBACD,MAAK;YACP,CAAC;YACD,OAAO,CAAC,CAAC,CAAC;gBACR,+CAA+C;gBAC/C,IACE,OAAO,gBAAgB,KAAK,QAAQ;oBACpC,OAAO,gBAAgB,KAAK,QAAQ;oBACpC,OAAO,gBAAgB,KAAK,QAAQ;oBACpC,OAAO,gBAAgB,KAAK,UAAU;oBACtC,OAAO,gBAAgB,KAAK,SAAS,EACrC,CAAC;oBACD,OAAO,cAAc,CAAA;gBACvB,CAAC;gBAED,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAA;YAClD,CAAC;QACH,CAAC;QACD,OAAO,cAAc,CAAA;IACvB,CAAC,EACD,CAAC,OAAO,CAAC,UAAU,CAAC,CACrB,CAAA;IAED,iBAAiB;IACjB,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CACtC,CAAC,cAAc,EAAE,WAAW,EAAE,EAAE;YAC9B,OAAO,OAAO,CAAC,cAAc,EAAE,WAAW,EAAE,mBAAmB,CAAC,CAAA;QAClE,CAAC,EAED,EAAE,CACH,CAAA;QAED,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,OAAM;QAC7B,CAAC;QACD,IAAI,cAAc,CAAC,KAAkC,EAAE,OAAO,CAAC,EAAE,CAAC;YAChE,OAAM;QACR,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,QAAQ,CAAC,OAAO,EAAE;gBAChB,KAAK,EAAE,OAAO;aACf,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,OAAO,EAAE;gBAChB,KAAK,EAAE,SAAS;aACjB,CAAC,CAAA;QACJ,CAAC;IACH,CAAC,EAAE;QACD,OAAO;QACP,iBAAiB;QACjB,mBAAmB;QACnB,QAAQ;QACR,OAAO;QACP,KAAK;KACN,CAAC,CAAA;IAEF,OAAO,CACL,cAAK,SAAS,EAAC,qDAAqD,YACjE,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAClC,KAAC,aAAa,IAAC,OAAO,EAAE,KAAK,GAAkB,CAChD,GACG,CACP,CAAA;AACH,CAAC;AAOD,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAC9B,SAAS,aAAa,CAAC,EAAE,OAAO,EAAE;IAChC,OAAO,CACL,4BACG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACzB,OAAO,CACL,cAEE,SAAS,EAAC,8BAA8B,YAEvC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAC5B,YAAG,SAAS,EAAC,gEAAgE,YAC1E,MAAM,GACL,CACL,CAAC,CAAC,CAAC,CACF,KAAC,aAAa,IAAC,OAAO,EAAE,MAAM,GAAkB,CACjD,IATI,GAAG,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAU5B,CACP,CAAA;QACH,CAAC,CAAC,GACD,CACJ,CAAA;AACH,CAAC,CACF,CAAA;AAED,eAAe,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA","sourcesContent":["import * as React from 'react'\nimport { localisationService } from '../apps'\n\nimport { useFormSubmissionModelParent } from '../hooks/useFormSubmissionModelContext'\nimport useFlattenElements from '../hooks/useFlattenElementsContext'\nimport { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport { FormElementValueChangeHandler } from '../types/form'\ntype Props = {\n element: FormTypes.SummaryElement\n onChange: FormElementValueChangeHandler\n value: unknown\n}\n\nconst arraysAreEqual = (a: unknown[], b: unknown[]) => {\n if (!Array.isArray(a) || !Array.isArray(b)) {\n if (a !== b) return false\n return true\n }\n if (a.length !== b.length) return false\n\n for (let i = 0; i < a.length; i++) {\n if (Array.isArray(a[i]) && Array.isArray(b[i])) {\n const areEqual = arraysAreEqual(a[i] as unknown[], b[i] as unknown[])\n if (!areEqual) return false\n continue\n }\n if (a[i] !== b[i]) return false\n }\n return true\n}\nfunction FormElementSummary({ element, onChange, value }: Props) {\n const { formSubmissionModel } = useFormSubmissionModelParent()\n const flattenedElements = useFlattenElements()\n\n const reducer = React.useCallback(\n (\n partialSummary: FormElementSummaryResults,\n formElement: FormTypes.FormElement,\n submission: SubmissionTypes.S3SubmissionData['submission'],\n ) => {\n if (!('name' in formElement)) return partialSummary\n if (\n formElement.type !== 'repeatableSet' &&\n formElement.type !== 'form' &&\n !element.elementIds.some((elementId) => elementId === formElement.id)\n ) {\n return partialSummary\n }\n\n const formElementValue = submission[formElement.name]\n if (!formElementValue && formElementValue !== 0) {\n return partialSummary\n }\n\n switch (formElement.type) {\n case 'repeatableSet': {\n if (!Array.isArray(formElementValue)) return partialSummary\n // If we found a repeatable set, look through child elements\n // to find the summary elements. Need to start a new array for\n // this structure and look at each entry in the repeatable set\n for (const entry of formElementValue) {\n const repeatableSetSummaryValues = formElement.elements.reduce(\n (\n partialSummary: FormElementSummaryResults,\n formElement: FormTypes.FormElement,\n ) =>\n reducer(\n partialSummary,\n formElement,\n // Pleasing TypeScript\n entry instanceof Object ? entry : {},\n ),\n [],\n )\n if (repeatableSetSummaryValues.length) {\n partialSummary.push(repeatableSetSummaryValues)\n }\n }\n break\n }\n case 'form': {\n const formSummaryValues = (formElement.elements || []).reduce(\n (\n partialSummary: FormElementSummaryResults,\n formElement: FormTypes.FormElement,\n ) =>\n reducer(\n partialSummary,\n formElement,\n // @ts-expect-error Pleasing TypeScript\n formElementValue instanceof Object ? formElementValue : {},\n ),\n [],\n )\n if (formSummaryValues.length) {\n partialSummary.push(formSummaryValues)\n }\n\n break\n }\n case 'select':\n case 'autocomplete':\n case 'radio':\n case 'checkboxes': {\n const optionValues = []\n if (Array.isArray(formElementValue)) {\n optionValues.push(...formElementValue)\n } else {\n optionValues.push(formElementValue)\n }\n if (Array.isArray(formElement.options)) {\n partialSummary.push(\n ...optionValues.reduce((optionLabels, optionValue) => {\n const option = formElement.options?.find(\n ({ value }: FormTypes.ChoiceElementOption) =>\n optionValue === value,\n )\n if (option) {\n optionLabels.push(option.label)\n }\n return optionLabels\n }, []),\n )\n }\n break\n }\n case 'date': {\n const date = localisationService.generateDate({\n daysOffset: undefined,\n value: formElementValue as string,\n })\n if (date) {\n partialSummary.push(localisationService.formatDate(date))\n }\n break\n }\n case 'datetime': {\n if (typeof formElementValue !== 'string') return partialSummary\n partialSummary.push(\n localisationService.formatDatetime(new Date(formElementValue)),\n )\n break\n }\n case 'time': {\n if (typeof formElementValue !== 'string') return partialSummary\n partialSummary.push(\n localisationService.formatTime(new Date(formElementValue)),\n )\n break\n }\n default: {\n // Pleasing TypeScript WHILE COVERING ALL BASES\n if (\n typeof formElementValue !== 'string' &&\n typeof formElementValue !== 'object' &&\n typeof formElementValue !== 'number' &&\n typeof formElementValue !== 'function' &&\n typeof formElementValue !== 'boolean'\n ) {\n return partialSummary\n }\n\n partialSummary.push(formElementValue.toString())\n }\n }\n return partialSummary\n },\n [element.elementIds],\n )\n\n // MODEL LISTENER\n React.useEffect(() => {\n const summary = flattenedElements.reduce<FormElementSummaryResults>(\n (partialSummary, formElement) => {\n return reducer(partialSummary, formElement, formSubmissionModel)\n },\n\n [],\n )\n\n if (value === undefined) {\n if (!summary.length) return\n }\n if (arraysAreEqual(value as FormElementSummaryResults, summary)) {\n return\n }\n if (summary.length) {\n onChange(element, {\n value: summary,\n })\n } else {\n onChange(element, {\n value: undefined,\n })\n }\n }, [\n element,\n flattenedElements,\n formSubmissionModel,\n onChange,\n reducer,\n value,\n ])\n\n return (\n <div className=\"ob-form__element ob-summary cypress-summary-result \">\n {!!value && Array.isArray(value) && (\n <SummaryResult results={value}></SummaryResult>\n )}\n </div>\n )\n}\n\ntype FormElementSummaryResults = Array<string | FormElementSummaryResults>\ntype FormElementSummaryResultProps = {\n results: FormElementSummaryResults\n}\n\nconst SummaryResult = React.memo<FormElementSummaryResultProps>(\n function SummaryResult({ results }) {\n return (\n <>\n {results.map((result, i) => {\n return (\n <div\n key={`${result.toString()}-${i}`}\n className=\"ob-summary__result-container\"\n >\n {typeof result === 'string' ? (\n <p className=\"ob-summary__result has-line-breaks cypress-summary-result-text\">\n {result}\n </p>\n ) : (\n <SummaryResult results={result}></SummaryResult>\n )}\n </div>\n )\n })}\n </>\n )\n },\n)\n\nexport default React.memo(FormElementSummary)\n"]}
1
+ {"version":3,"file":"FormElementSummary.js","sourceRoot":"","sources":["../../src/form-elements/FormElementSummary.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { localisationService } from '../apps'\n\nimport { useFormSubmissionModelParent } from '../hooks/useFormSubmissionModelContext'\nimport useFlattenElements from '../hooks/useFlattenElementsContext'\nimport { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport { FormElementValueChangeHandler } from '../types/form'\ntype Props = {\n element: FormTypes.SummaryElement\n onChange: FormElementValueChangeHandler\n value: unknown\n}\n\nconst arraysAreEqual = (a: unknown[], b: unknown[]) => {\n if (!Array.isArray(a) || !Array.isArray(b)) {\n if (a !== b) return false\n return true\n }\n if (a.length !== b.length) return false\n\n for (let i = 0; i < a.length; i++) {\n if (Array.isArray(a[i]) && Array.isArray(b[i])) {\n const areEqual = arraysAreEqual(a[i] as unknown[], b[i] as unknown[])\n if (!areEqual) return false\n continue\n }\n if (a[i] !== b[i]) return false\n }\n return true\n}\nfunction FormElementSummary({ element, onChange, value }: Props) {\n const { formSubmissionModel } = useFormSubmissionModelParent()\n const flattenedElements = useFlattenElements()\n\n const reducer = React.useCallback(\n (\n partialSummary: FormElementSummaryResults,\n formElement: FormTypes.FormElement,\n submission: SubmissionTypes.S3SubmissionData['submission'],\n ) => {\n if (!('name' in formElement)) return partialSummary\n if (\n formElement.type !== 'repeatableSet' &&\n formElement.type !== 'form' &&\n !element.elementIds.some((elementId) => elementId === formElement.id)\n ) {\n return partialSummary\n }\n\n const formElementValue = submission[formElement.name]\n if (!formElementValue && formElementValue !== 0) {\n return partialSummary\n }\n\n switch (formElement.type) {\n case 'repeatableSet': {\n if (!Array.isArray(formElementValue)) return partialSummary\n // If we found a repeatable set, look through child elements\n // to find the summary elements. Need to start a new array for\n // this structure and look at each entry in the repeatable set\n for (const entry of formElementValue) {\n const repeatableSetSummaryValues = formElement.elements.reduce(\n (\n partialSummary: FormElementSummaryResults,\n formElement: FormTypes.FormElement,\n ) =>\n // eslint-disable-next-line react-hooks/immutability\n reducer(\n partialSummary,\n formElement,\n // Pleasing TypeScript\n entry instanceof Object ? entry : {},\n ),\n [],\n )\n if (repeatableSetSummaryValues.length) {\n partialSummary.push(repeatableSetSummaryValues)\n }\n }\n break\n }\n case 'form': {\n const formSummaryValues = (formElement.elements || []).reduce(\n (\n partialSummary: FormElementSummaryResults,\n formElement: FormTypes.FormElement,\n ) =>\n reducer(\n partialSummary,\n formElement,\n // @ts-expect-error Pleasing TypeScript\n formElementValue instanceof Object ? formElementValue : {},\n ),\n [],\n )\n if (formSummaryValues.length) {\n partialSummary.push(formSummaryValues)\n }\n\n break\n }\n case 'select':\n case 'autocomplete':\n case 'radio':\n case 'checkboxes': {\n const optionValues = []\n if (Array.isArray(formElementValue)) {\n optionValues.push(...formElementValue)\n } else {\n optionValues.push(formElementValue)\n }\n if (Array.isArray(formElement.options)) {\n partialSummary.push(\n ...optionValues.reduce((optionLabels, optionValue) => {\n const option = formElement.options?.find(\n ({ value }: FormTypes.ChoiceElementOption) =>\n optionValue === value,\n )\n if (option) {\n optionLabels.push(option.label)\n }\n return optionLabels\n }, []),\n )\n }\n break\n }\n case 'date': {\n const date = localisationService.generateDate({\n daysOffset: undefined,\n value: formElementValue as string,\n })\n if (date) {\n partialSummary.push(localisationService.formatDate(date))\n }\n break\n }\n case 'datetime': {\n if (typeof formElementValue !== 'string') return partialSummary\n partialSummary.push(\n localisationService.formatDatetime(new Date(formElementValue)),\n )\n break\n }\n case 'time': {\n if (typeof formElementValue !== 'string') return partialSummary\n partialSummary.push(\n localisationService.formatTime(new Date(formElementValue)),\n )\n break\n }\n default: {\n // Pleasing TypeScript WHILE COVERING ALL BASES\n if (\n typeof formElementValue !== 'string' &&\n typeof formElementValue !== 'object' &&\n typeof formElementValue !== 'number' &&\n typeof formElementValue !== 'function' &&\n typeof formElementValue !== 'boolean'\n ) {\n return partialSummary\n }\n\n partialSummary.push(formElementValue.toString())\n }\n }\n return partialSummary\n },\n [element.elementIds],\n )\n\n // MODEL LISTENER\n React.useEffect(() => {\n const summary = flattenedElements.reduce<FormElementSummaryResults>(\n (partialSummary, formElement) => {\n return reducer(partialSummary, formElement, formSubmissionModel)\n },\n\n [],\n )\n\n if (value === undefined) {\n if (!summary.length) return\n }\n if (arraysAreEqual(value as FormElementSummaryResults, summary)) {\n return\n }\n if (summary.length) {\n onChange(element, {\n value: summary,\n })\n } else {\n onChange(element, {\n value: undefined,\n })\n }\n }, [\n element,\n flattenedElements,\n formSubmissionModel,\n onChange,\n reducer,\n value,\n ])\n\n return (\n <div className=\"ob-form__element ob-summary cypress-summary-result \">\n {!!value && Array.isArray(value) && (\n <SummaryResult results={value}></SummaryResult>\n )}\n </div>\n )\n}\n\ntype FormElementSummaryResults = Array<string | FormElementSummaryResults>\ntype FormElementSummaryResultProps = {\n results: FormElementSummaryResults\n}\n\nconst SummaryResult = React.memo<FormElementSummaryResultProps>(\n function SummaryResult({ results }) {\n return (\n <>\n {results.map((result, i) => {\n return (\n <div\n key={`${result.toString()}-${i}`}\n className=\"ob-summary__result-container\"\n >\n {typeof result === 'string' ? (\n <p className=\"ob-summary__result has-line-breaks cypress-summary-result-text\">\n {result}\n </p>\n ) : (\n <SummaryResult results={result}></SummaryResult>\n )}\n </div>\n )\n })}\n </>\n )\n },\n)\n\nexport default React.memo(FormElementSummary)\n"]}
@@ -38,6 +38,7 @@ export default function useFormDatePickerProps({ id, value, maxDate, minDate, ar
38
38
  slots: {
39
39
  textField: Input,
40
40
  },
41
+ /* eslint-disable react-hooks/refs */
41
42
  slotProps: {
42
43
  actionBar: {
43
44
  actions: [
@@ -69,6 +70,7 @@ export default function useFormDatePickerProps({ id, value, maxDate, minDate, ar
69
70
  onClick: openPickerOnMobile,
70
71
  },
71
72
  },
73
+ /* eslint-enable react-hooks/refs */
72
74
  ref,
73
75
  open: isPickerOpen,
74
76
  onClose: () => {
@@ -1 +1 @@
1
- {"version":3,"file":"useFormDatePickerProps.js","sourceRoot":"","sources":["../../../src/hooks/form-date-picker/useFormDatePickerProps.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { PickersActionBarAction } from '@mui/x-date-pickers'\nimport clsx from 'clsx'\nimport useBooleanState from '../useBooleanState'\nimport { PopperProps, TextFieldProps, useMediaQuery } from '@mui/material'\nimport Tooltip from '../../components/renderer/Tooltip'\nimport MaterialIcon from '../../components/MaterialIcon'\n\nexport const PickerInputButton = React.memo(function PickerInputButton({\n icon,\n tooltip,\n onClick,\n}: {\n icon: string\n tooltip: string\n onClick: () => void\n}) {\n return (\n <div className=\"control\">\n <Tooltip title={tooltip}>\n <button\n onClick={onClick}\n className=\"button is-input-addon cypress-date-picker-button\"\n type=\"button\"\n >\n <span className=\"icon\">\n <MaterialIcon>{icon}</MaterialIcon>\n </span>\n </button>\n </Tooltip>\n </div>\n )\n})\n\nfunction Input({\n /* eslint-disable @typescript-eslint/no-unused-vars */\n focused,\n sx,\n label,\n size,\n ownerState,\n defaultValue,\n InputProps,\n error,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n // need to use the deprecated inputProps because slotProps are not currently passed down\n inputProps,\n inputRef,\n value,\n ref,\n ...props\n}: TextFieldProps & { ownerState?: unknown }) {\n return (\n <div className=\"control is-expanded has-icons-right\" ref={ref}>\n <input\n ref={inputRef}\n value={value as string}\n {...props}\n {...inputProps}\n />\n </div>\n )\n}\n\nexport default function useFormDatePickerProps({\n id,\n value,\n maxDate,\n minDate,\n ariaDescribedby,\n placeholder,\n disabled,\n className,\n onBlur,\n onChange,\n required,\n}: {\n id: string\n value: string | undefined\n maxDate: string | undefined\n minDate: string | undefined\n ariaDescribedby: string | undefined\n placeholder: string | undefined\n disabled: boolean | undefined\n className: string\n required: boolean\n onBlur: () => void\n onChange: (newDate: Date | undefined) => void\n}) {\n const ref = React.useRef<HTMLDivElement>(null)\n const [isPickerOpen, openPicker, closePicker] = useBooleanState(false)\n\n const valueMemo = React.useMemo(() => {\n return value ? new Date(value) : null\n }, [value])\n\n const maxDateMemo = React.useMemo(\n () => (maxDate ? new Date(maxDate) : undefined),\n [maxDate],\n )\n const minDateMemo = React.useMemo(\n () => (minDate ? new Date(minDate) : undefined),\n [minDate],\n )\n // default used by mui to determine when the mobile picker is used\n // https://mui.com/x/react-date-pickers/date-picker/#available-components\n const desktopMediaQuery = '@media (pointer: fine)'\n\n const isDesktop = useMediaQuery(desktopMediaQuery)\n\n const openPickerOnMobile = React.useCallback(() => {\n if (!isDesktop) {\n openPicker()\n }\n }, [isDesktop, openPicker])\n\n return [\n {\n slots: {\n textField: Input,\n },\n slotProps: {\n actionBar: {\n actions: [\n 'clear',\n 'today',\n 'cancel',\n 'accept',\n ] as PickersActionBarAction[],\n },\n popper: {\n container: ref.current,\n anchorEl: ref.current,\n modifiers: [\n {\n name: 'preventOverflow',\n options: {\n altAxis: false,\n },\n },\n ],\n } as Partial<PopperProps>,\n textField: {\n id,\n placeholder: placeholder,\n 'aria-describedby': ariaDescribedby,\n 'aria-required': required,\n onBlur,\n className: clsx('input ob-input', className),\n onClick: openPickerOnMobile,\n } as TextFieldProps,\n },\n ref,\n open: isPickerOpen,\n onClose: () => {\n onBlur()\n closePicker()\n },\n onChange: (newDate: Date | null) => {\n if (!(newDate instanceof Date) || isNaN(newDate.valueOf())) {\n onChange(undefined)\n } else {\n onChange(newDate)\n }\n },\n maxDate: maxDateMemo,\n minDate: minDateMemo,\n value: valueMemo,\n disabled,\n desktopMediaQuery,\n enableAccessibleFieldDOMStructure: false,\n },\n openPicker,\n ] as const\n}\n"]}
1
+ {"version":3,"file":"useFormDatePickerProps.js","sourceRoot":"","sources":["../../../src/hooks/form-date-picker/useFormDatePickerProps.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { PickersActionBarAction } from '@mui/x-date-pickers'\nimport clsx from 'clsx'\nimport useBooleanState from '../useBooleanState'\nimport { PopperProps, TextFieldProps, useMediaQuery } from '@mui/material'\nimport Tooltip from '../../components/renderer/Tooltip'\nimport MaterialIcon from '../../components/MaterialIcon'\n\nexport const PickerInputButton = React.memo(function PickerInputButton({\n icon,\n tooltip,\n onClick,\n}: {\n icon: string\n tooltip: string\n onClick: () => void\n}) {\n return (\n <div className=\"control\">\n <Tooltip title={tooltip}>\n <button\n onClick={onClick}\n className=\"button is-input-addon cypress-date-picker-button\"\n type=\"button\"\n >\n <span className=\"icon\">\n <MaterialIcon>{icon}</MaterialIcon>\n </span>\n </button>\n </Tooltip>\n </div>\n )\n})\n\nfunction Input({\n /* eslint-disable @typescript-eslint/no-unused-vars */\n focused,\n sx,\n label,\n size,\n ownerState,\n defaultValue,\n InputProps,\n error,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n // need to use the deprecated inputProps because slotProps are not currently passed down\n inputProps,\n inputRef,\n value,\n ref,\n ...props\n}: TextFieldProps & { ownerState?: unknown }) {\n return (\n <div className=\"control is-expanded has-icons-right\" ref={ref}>\n <input\n ref={inputRef}\n value={value as string}\n {...props}\n {...inputProps}\n />\n </div>\n )\n}\n\nexport default function useFormDatePickerProps({\n id,\n value,\n maxDate,\n minDate,\n ariaDescribedby,\n placeholder,\n disabled,\n className,\n onBlur,\n onChange,\n required,\n}: {\n id: string\n value: string | undefined\n maxDate: string | undefined\n minDate: string | undefined\n ariaDescribedby: string | undefined\n placeholder: string | undefined\n disabled: boolean | undefined\n className: string\n required: boolean\n onBlur: () => void\n onChange: (newDate: Date | undefined) => void\n}) {\n const ref = React.useRef<HTMLDivElement>(null)\n const [isPickerOpen, openPicker, closePicker] = useBooleanState(false)\n\n const valueMemo = React.useMemo(() => {\n return value ? new Date(value) : null\n }, [value])\n\n const maxDateMemo = React.useMemo(\n () => (maxDate ? new Date(maxDate) : undefined),\n [maxDate],\n )\n const minDateMemo = React.useMemo(\n () => (minDate ? new Date(minDate) : undefined),\n [minDate],\n )\n // default used by mui to determine when the mobile picker is used\n // https://mui.com/x/react-date-pickers/date-picker/#available-components\n const desktopMediaQuery = '@media (pointer: fine)'\n\n const isDesktop = useMediaQuery(desktopMediaQuery)\n\n const openPickerOnMobile = React.useCallback(() => {\n if (!isDesktop) {\n openPicker()\n }\n }, [isDesktop, openPicker])\n\n return [\n {\n slots: {\n textField: Input,\n },\n /* eslint-disable react-hooks/refs */\n slotProps: {\n actionBar: {\n actions: [\n 'clear',\n 'today',\n 'cancel',\n 'accept',\n ] as PickersActionBarAction[],\n },\n popper: {\n container: ref.current,\n anchorEl: ref.current,\n modifiers: [\n {\n name: 'preventOverflow',\n options: {\n altAxis: false,\n },\n },\n ],\n } as Partial<PopperProps>,\n textField: {\n id,\n placeholder: placeholder,\n 'aria-describedby': ariaDescribedby,\n 'aria-required': required,\n onBlur,\n className: clsx('input ob-input', className),\n onClick: openPickerOnMobile,\n } as TextFieldProps,\n },\n /* eslint-enable react-hooks/refs */\n ref,\n open: isPickerOpen,\n onClose: () => {\n onBlur()\n closePicker()\n },\n onChange: (newDate: Date | null) => {\n if (!(newDate instanceof Date) || isNaN(newDate.valueOf())) {\n onChange(undefined)\n } else {\n onChange(newDate)\n }\n },\n maxDate: maxDateMemo,\n minDate: minDateMemo,\n value: valueMemo,\n disabled,\n desktopMediaQuery,\n enableAccessibleFieldDOMStructure: false,\n },\n openPicker,\n ] as const\n}\n"]}
@@ -3,6 +3,8 @@ import { differenceInSeconds } from 'date-fns';
3
3
  export default function useFormSubmissionDuration(initialPreviousElapsedDurationSeconds) {
4
4
  // a "seconds" value indicating the previous time spent on this form submission
5
5
  const [previousElapsedDurationSeconds, setPreviousElapsedDurationSeconds] = React.useState(initialPreviousElapsedDurationSeconds);
6
+ // purity not required given we're after the time
7
+ // eslint-disable-next-line react-hooks/purity
6
8
  const startTime = React.useRef(Date.now());
7
9
  // return the current submission duration in seconds
8
10
  const getCurrentSubmissionDuration = React.useCallback(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"useFormSubmissionDuration.js","sourceRoot":"","sources":["../../src/hooks/useFormSubmissionDuration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAE9C,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAC/C,qCAA8C;IAE9C,+EAA+E;IAC/E,MAAM,CAAC,8BAA8B,EAAE,iCAAiC,CAAC,GACvE,KAAK,CAAC,QAAQ,CAAqB,qCAAqC,CAAC,CAAA;IAC3E,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;IAE1C,oDAAoD;IACpD,MAAM,4BAA4B,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QAC1D,MAAM,sBAAsB,GAAG,mBAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,OAAO,CAAC,CAAA;QACjF,OAAO,sBAAsB,GAAG,CAAC,8BAA8B,IAAI,CAAC,CAAC,CAAA;IACvE,CAAC,EAAE,CAAC,8BAA8B,CAAC,CAAC,CAAA;IAEpC,MAAM,8BAA8B,GAAG,KAAK,CAAC,WAAW,CACtD,CAAC,iCAA0C,EAAE,EAAE;QAC7C,iCAAiC,CAAC,iCAAiC,CAAC,CAAA;QACpE,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAChC,CAAC,EACD,EAAE,CACH,CAAA;IAED,OAAO,CAAC,4BAA4B,EAAE,8BAA8B,CAAU,CAAA;AAChF,CAAC","sourcesContent":["import * as React from 'react'\nimport { differenceInSeconds } from 'date-fns'\n\nexport default function useFormSubmissionDuration(\n initialPreviousElapsedDurationSeconds?: number,\n) {\n // a \"seconds\" value indicating the previous time spent on this form submission\n const [previousElapsedDurationSeconds, setPreviousElapsedDurationSeconds] =\n React.useState<number | undefined>(initialPreviousElapsedDurationSeconds)\n const startTime = React.useRef(Date.now())\n\n // return the current submission duration in seconds\n const getCurrentSubmissionDuration = React.useCallback(() => {\n const currentSessionDuration = differenceInSeconds(Date.now(), startTime.current)\n return currentSessionDuration + (previousElapsedDurationSeconds || 0)\n }, [previousElapsedDurationSeconds])\n\n const resetCurrentSubmissionDuration = React.useCallback(\n (newPreviousElapsedDurationSeconds?: number) => {\n setPreviousElapsedDurationSeconds(newPreviousElapsedDurationSeconds)\n startTime.current = Date.now()\n },\n [],\n )\n\n return [getCurrentSubmissionDuration, resetCurrentSubmissionDuration] as const\n}\n"]}
1
+ {"version":3,"file":"useFormSubmissionDuration.js","sourceRoot":"","sources":["../../src/hooks/useFormSubmissionDuration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAE9C,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAC/C,qCAA8C;IAE9C,+EAA+E;IAC/E,MAAM,CAAC,8BAA8B,EAAE,iCAAiC,CAAC,GACvE,KAAK,CAAC,QAAQ,CAAqB,qCAAqC,CAAC,CAAA;IAC3E,iDAAiD;IACjD,8CAA8C;IAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;IAE1C,oDAAoD;IACpD,MAAM,4BAA4B,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QAC1D,MAAM,sBAAsB,GAAG,mBAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,OAAO,CAAC,CAAA;QACjF,OAAO,sBAAsB,GAAG,CAAC,8BAA8B,IAAI,CAAC,CAAC,CAAA;IACvE,CAAC,EAAE,CAAC,8BAA8B,CAAC,CAAC,CAAA;IAEpC,MAAM,8BAA8B,GAAG,KAAK,CAAC,WAAW,CACtD,CAAC,iCAA0C,EAAE,EAAE;QAC7C,iCAAiC,CAAC,iCAAiC,CAAC,CAAA;QACpE,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAChC,CAAC,EACD,EAAE,CACH,CAAA;IAED,OAAO,CAAC,4BAA4B,EAAE,8BAA8B,CAAU,CAAA;AAChF,CAAC","sourcesContent":["import * as React from 'react'\nimport { differenceInSeconds } from 'date-fns'\n\nexport default function useFormSubmissionDuration(\n initialPreviousElapsedDurationSeconds?: number,\n) {\n // a \"seconds\" value indicating the previous time spent on this form submission\n const [previousElapsedDurationSeconds, setPreviousElapsedDurationSeconds] =\n React.useState<number | undefined>(initialPreviousElapsedDurationSeconds)\n // purity not required given we're after the time\n // eslint-disable-next-line react-hooks/purity\n const startTime = React.useRef(Date.now())\n\n // return the current submission duration in seconds\n const getCurrentSubmissionDuration = React.useCallback(() => {\n const currentSessionDuration = differenceInSeconds(Date.now(), startTime.current)\n return currentSessionDuration + (previousElapsedDurationSeconds || 0)\n }, [previousElapsedDurationSeconds])\n\n const resetCurrentSubmissionDuration = React.useCallback(\n (newPreviousElapsedDurationSeconds?: number) => {\n setPreviousElapsedDurationSeconds(newPreviousElapsedDurationSeconds)\n startTime.current = Date.now()\n },\n [],\n )\n\n return [getCurrentSubmissionDuration, resetCurrentSubmissionDuration] as const\n}\n"]}
@@ -43,7 +43,8 @@ import useLoadDataEffect from './useLoadDataEffect';
43
43
  * @group Hooks
44
44
  */
45
45
  export default function useLoadDataState(onLoad) {
46
- const isMounted = useIsMounted();
46
+ const isMountedRef = useIsMounted();
47
+ const isMounted = isMountedRef.current;
47
48
  const [state, setState] = React.useState({
48
49
  status: 'LOADING',
49
50
  });
@@ -53,7 +54,7 @@ export default function useLoadDataState(onLoad) {
53
54
  });
54
55
  try {
55
56
  const result = await onLoad(abortSignal);
56
- if (isMounted.current && !abortSignal.aborted) {
57
+ if (isMounted && !abortSignal.aborted) {
57
58
  setState({
58
59
  status: 'SUCCESS',
59
60
  result,
@@ -61,7 +62,7 @@ export default function useLoadDataState(onLoad) {
61
62
  }
62
63
  }
63
64
  catch (err) {
64
- if (isMounted.current && !abortSignal.aborted) {
65
+ if (isMounted && !abortSignal.aborted) {
65
66
  setState({
66
67
  status: 'ERROR',
67
68
  error: err,
@@ -1 +1 @@
1
- {"version":3,"file":"useLoadDataState.js","sourceRoot":"","sources":["../../src/hooks/useLoadDataState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,YAAY,MAAM,gBAAgB,CAAA;AACzC,OAAO,iBAAiB,MAAM,qBAAqB,CAAA;AAiBnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CACtC,MAAgD;IAMhD,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;IAChC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAmB;QACzD,MAAM,EAAE,SAAS;KAClB,CAAC,CAAA;IAEF,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAClC,KAAK,EAAE,WAAwB,EAAE,EAAE;QACjC,QAAQ,CAAC;YACP,MAAM,EAAE,SAAS;SAClB,CAAC,CAAA;QACF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAA;YACxC,IAAI,SAAS,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;gBAC9C,QAAQ,CAAC;oBACP,MAAM,EAAE,SAAS;oBACjB,MAAM;iBACP,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,SAAS,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;gBAC9C,QAAQ,CAAC;oBACP,MAAM,EAAE,OAAO;oBACf,KAAK,EAAE,GAAY;iBACpB,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC,EACD,CAAC,SAAS,EAAE,MAAM,CAAC,CACpB,CAAA;IAED,MAAM,SAAS,GAA4C,KAAK,CAAC,WAAW,CAC1E,CAAC,MAAM,EAAE,EAAE;QACT,QAAQ,CAAC,CAAC,YAA8B,EAAE,EAAE;YAC1C,IAAI,YAAY,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACtC,OAAO;oBACL,GAAG,YAAY;oBACf,MAAM,EACJ,OAAO,MAAM,KAAK,UAAU;wBAC1B,CAAC,CAAC,oFAAoF;4BACpF,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;wBAC7B,CAAC,CAAC,MAAM;iBACb,CAAA;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,YAAY,CAAA;YACrB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,EACD,EAAE,CACH,CAAA;IAED,MAAM,aAAa,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAA;IAEnD,OAAO,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,CAAC,CAAA;AAC1C,CAAC","sourcesContent":["import * as React from 'react'\nimport useIsMounted from './useIsMounted'\nimport useLoadDataEffect from './useLoadDataEffect'\n\nexport type LoadDataState<T> =\n | {\n status: 'SUCCESS'\n /** Your data. */\n result: T\n }\n | {\n status: 'ERROR'\n /** A JavaScript `Error` object. */\n error: Error\n }\n | {\n status: 'LOADING'\n }\n\n/**\n * This function is a react hook for managing the state involved with loading\n * data.\n *\n * ## Example\n *\n * ```js\n * import { useLoadDataState } from '@oneblink/apps-react'\n * const fetchData = async () => {\n * const response = await fetch(`https://some-website.com/api?data=data`)\n *\n * if (!response.ok) {\n * const text = await response.text()\n * throw new Error(text)\n * }\n *\n * return await response.json()\n * }\n *\n * const MyComponent = () => {\n * const [state, refresh, setResult] = useLoadDataState(fetchData)\n *\n * switch (state.status) {\n * case 'LOADING':\n * return <Loading />\n * case 'ERROR':\n * return <Error message={state.error} />\n * case 'SUCCESS':\n * // RENDER UI\n * }\n * }\n *\n * export default MyComponent\n * ```\n *\n * @typeParam T The type of the data returned by your `onLoad` function\n * @param onLoad The function that fetches your data. Should be a Promise that\n * returns your data\n * @returns\n * @group Hooks\n */\nexport default function useLoadDataState<T>(\n onLoad: (abortSignal: AbortSignal) => Promise<T>,\n): [\n state: LoadDataState<T>,\n handleRefresh: () => void,\n setResult: React.Dispatch<React.SetStateAction<T>>,\n] {\n const isMounted = useIsMounted()\n const [state, setState] = React.useState<LoadDataState<T>>({\n status: 'LOADING',\n })\n\n const handleLoad = React.useCallback(\n async (abortSignal: AbortSignal) => {\n setState({\n status: 'LOADING',\n })\n try {\n const result = await onLoad(abortSignal)\n if (isMounted.current && !abortSignal.aborted) {\n setState({\n status: 'SUCCESS',\n result,\n })\n }\n } catch (err) {\n if (isMounted.current && !abortSignal.aborted) {\n setState({\n status: 'ERROR',\n error: err as Error,\n })\n }\n }\n },\n [isMounted, onLoad],\n )\n\n const setResult: React.Dispatch<React.SetStateAction<T>> = React.useCallback(\n (setter) => {\n setState((currentState: LoadDataState<T>) => {\n if (currentState.status === 'SUCCESS') {\n return {\n ...currentState,\n result:\n typeof setter === 'function'\n ? // @ts-expect-error Typescript cannot tell between a generic type (T) and a function\n setter(currentState.result)\n : setter,\n }\n } else {\n return currentState\n }\n })\n },\n [],\n )\n\n const handleRefresh = useLoadDataEffect(handleLoad)\n\n return [state, handleRefresh, setResult]\n}\n"]}
1
+ {"version":3,"file":"useLoadDataState.js","sourceRoot":"","sources":["../../src/hooks/useLoadDataState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,YAAY,MAAM,gBAAgB,CAAA;AACzC,OAAO,iBAAiB,MAAM,qBAAqB,CAAA;AAiBnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CACtC,MAAgD;IAMhD,MAAM,YAAY,GAAG,YAAY,EAAE,CAAA;IAEnC,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAA;IAEtC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAmB;QACzD,MAAM,EAAE,SAAS;KAClB,CAAC,CAAA;IAEF,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAClC,KAAK,EAAE,WAAwB,EAAE,EAAE;QACjC,QAAQ,CAAC;YACP,MAAM,EAAE,SAAS;SAClB,CAAC,CAAA;QACF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAA;YACxC,IAAI,SAAS,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;gBACtC,QAAQ,CAAC;oBACP,MAAM,EAAE,SAAS;oBACjB,MAAM;iBACP,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,SAAS,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;gBACtC,QAAQ,CAAC;oBACP,MAAM,EAAE,OAAO;oBACf,KAAK,EAAE,GAAY;iBACpB,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC,EACD,CAAC,SAAS,EAAE,MAAM,CAAC,CACpB,CAAA;IAED,MAAM,SAAS,GAA4C,KAAK,CAAC,WAAW,CAC1E,CAAC,MAAM,EAAE,EAAE;QACT,QAAQ,CAAC,CAAC,YAA8B,EAAE,EAAE;YAC1C,IAAI,YAAY,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACtC,OAAO;oBACL,GAAG,YAAY;oBACf,MAAM,EACJ,OAAO,MAAM,KAAK,UAAU;wBAC1B,CAAC,CAAC,oFAAoF;4BACpF,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;wBAC7B,CAAC,CAAC,MAAM;iBACb,CAAA;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,YAAY,CAAA;YACrB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,EACD,EAAE,CACH,CAAA;IAED,MAAM,aAAa,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAA;IAEnD,OAAO,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,CAAC,CAAA;AAC1C,CAAC","sourcesContent":["import * as React from 'react'\nimport useIsMounted from './useIsMounted'\nimport useLoadDataEffect from './useLoadDataEffect'\n\nexport type LoadDataState<T> =\n | {\n status: 'SUCCESS'\n /** Your data. */\n result: T\n }\n | {\n status: 'ERROR'\n /** A JavaScript `Error` object. */\n error: Error\n }\n | {\n status: 'LOADING'\n }\n\n/**\n * This function is a react hook for managing the state involved with loading\n * data.\n *\n * ## Example\n *\n * ```js\n * import { useLoadDataState } from '@oneblink/apps-react'\n * const fetchData = async () => {\n * const response = await fetch(`https://some-website.com/api?data=data`)\n *\n * if (!response.ok) {\n * const text = await response.text()\n * throw new Error(text)\n * }\n *\n * return await response.json()\n * }\n *\n * const MyComponent = () => {\n * const [state, refresh, setResult] = useLoadDataState(fetchData)\n *\n * switch (state.status) {\n * case 'LOADING':\n * return <Loading />\n * case 'ERROR':\n * return <Error message={state.error} />\n * case 'SUCCESS':\n * // RENDER UI\n * }\n * }\n *\n * export default MyComponent\n * ```\n *\n * @typeParam T The type of the data returned by your `onLoad` function\n * @param onLoad The function that fetches your data. Should be a Promise that\n * returns your data\n * @returns\n * @group Hooks\n */\nexport default function useLoadDataState<T>(\n onLoad: (abortSignal: AbortSignal) => Promise<T>,\n): [\n state: LoadDataState<T>,\n handleRefresh: () => void,\n setResult: React.Dispatch<React.SetStateAction<T>>,\n] {\n const isMountedRef = useIsMounted()\n\n const isMounted = isMountedRef.current\n\n const [state, setState] = React.useState<LoadDataState<T>>({\n status: 'LOADING',\n })\n\n const handleLoad = React.useCallback(\n async (abortSignal: AbortSignal) => {\n setState({\n status: 'LOADING',\n })\n try {\n const result = await onLoad(abortSignal)\n if (isMounted && !abortSignal.aborted) {\n setState({\n status: 'SUCCESS',\n result,\n })\n }\n } catch (err) {\n if (isMounted && !abortSignal.aborted) {\n setState({\n status: 'ERROR',\n error: err as Error,\n })\n }\n }\n },\n [isMounted, onLoad],\n )\n\n const setResult: React.Dispatch<React.SetStateAction<T>> = React.useCallback(\n (setter) => {\n setState((currentState: LoadDataState<T>) => {\n if (currentState.status === 'SUCCESS') {\n return {\n ...currentState,\n result:\n typeof setter === 'function'\n ? // @ts-expect-error Typescript cannot tell between a generic type (T) and a function\n setter(currentState.result)\n : setter,\n }\n } else {\n return currentState\n }\n })\n },\n [],\n )\n\n const handleRefresh = useLoadDataEffect(handleLoad)\n\n return [state, handleRefresh, setResult]\n}\n"]}
@@ -1,4 +1,5 @@
1
- type OneBlinkFormContainerContextValue = HTMLElement | null;
1
+ import { RefObject } from 'react';
2
+ type OneBlinkFormContainerContextValue = RefObject<HTMLElement | null>;
2
3
  export declare const OneBlinkFormContainerContext: import("react").Context<OneBlinkFormContainerContextValue>;
3
4
  export default function useOneBlinkFormContainer(): OneBlinkFormContainerContextValue;
4
5
  export {};
@@ -1,5 +1,5 @@
1
- import { createContext, useContext } from 'react';
2
- export const OneBlinkFormContainerContext = createContext(null);
1
+ import { createContext, useContext, createRef } from 'react';
2
+ export const OneBlinkFormContainerContext = createContext(createRef());
3
3
  export default function useOneBlinkFormContainer() {
4
4
  return useContext(OneBlinkFormContainerContext);
5
5
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useOneBlinkFormContainer.js","sourceRoot":"","sources":["../../src/hooks/useOneBlinkFormContainer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAIjD,MAAM,CAAC,MAAM,4BAA4B,GACvC,aAAa,CAAoC,IAAI,CAAC,CAAA;AAExD,MAAM,CAAC,OAAO,UAAU,wBAAwB;IAC9C,OAAO,UAAU,CAAC,4BAA4B,CAAC,CAAA;AACjD,CAAC","sourcesContent":["import { createContext, useContext } from 'react'\n\ntype OneBlinkFormContainerContextValue = HTMLElement | null\n\nexport const OneBlinkFormContainerContext =\n createContext<OneBlinkFormContainerContextValue>(null)\n\nexport default function useOneBlinkFormContainer() {\n return useContext(OneBlinkFormContainerContext)\n}\n"]}
1
+ {"version":3,"file":"useOneBlinkFormContainer.js","sourceRoot":"","sources":["../../src/hooks/useOneBlinkFormContainer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAa,SAAS,EAAE,MAAM,OAAO,CAAA;AAIvE,MAAM,CAAC,MAAM,4BAA4B,GACvC,aAAa,CAAoC,SAAS,EAAE,CAAC,CAAA;AAE/D,MAAM,CAAC,OAAO,UAAU,wBAAwB;IAC9C,OAAO,UAAU,CAAC,4BAA4B,CAAC,CAAA;AACjD,CAAC","sourcesContent":["import { createContext, useContext, RefObject, createRef } from 'react'\n\ntype OneBlinkFormContainerContextValue = RefObject<HTMLElement | null>\n\nexport const OneBlinkFormContainerContext =\n createContext<OneBlinkFormContainerContextValue>(createRef())\n\nexport default function useOneBlinkFormContainer() {\n return useContext(OneBlinkFormContainerContext)\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@oneblink/apps-react",
3
3
  "description": "Helper functions for OneBlink apps in ReactJS.",
4
- "version": "9.0.0-beta.4",
4
+ "version": "9.0.0-beta.5",
5
5
  "author": "OneBlink <developers@oneblink.io> (https://oneblink.io)",
6
6
  "bugs": {
7
7
  "url": "https://github.com/oneblink/apps-react/issues"
@@ -53,7 +53,10 @@
53
53
  },
54
54
  "devDependencies": {
55
55
  "@babel/preset-env": "^7.28.5",
56
- "@microsoft/eslint-plugin-sdl": "^0.2.2",
56
+ "@eslint/compat": "^2.0.1",
57
+ "@eslint/eslintrc": "^3.3.3",
58
+ "@eslint/js": "^9.39.2",
59
+ "@microsoft/eslint-plugin-sdl": "^1.1.0",
57
60
  "@mui/material": "^7.3.7",
58
61
  "@mui/x-date-pickers": "^8.24.0",
59
62
  "@oneblink/release-cli": "^3.4.0",
@@ -77,12 +80,12 @@
77
80
  "@typescript-eslint/eslint-plugin": "^8.52.0",
78
81
  "@typescript-eslint/parser": "^8.52.0",
79
82
  "copyfiles": "^2.4.1",
80
- "eslint": "^8.57.1",
81
- "eslint-config-prettier": "^9.1.2",
82
- "eslint-plugin-prettier": "^5.5.4",
83
- "eslint-plugin-react": "^7.37.5",
84
- "eslint-plugin-react-hooks": "^4.6.2",
83
+ "eslint": "^9.39.2",
84
+ "eslint-config-prettier": "^10.1.8",
85
+ "eslint-plugin-prettier": "^5.5.5",
86
+ "eslint-plugin-react-hooks": "^7.0.1",
85
87
  "fixpack": "^4.0.0",
88
+ "globals": "^17.0.0",
86
89
  "jsdom": "^27.4.0",
87
90
  "prettier": "^3.7.4",
88
91
  "prettier-plugin-jsdoc": "^1.8.0",