Skip to content

Commit

Permalink
Merge 40a3011 into 38bd04e
Browse files Browse the repository at this point in the history
  • Loading branch information
markdlv committed Nov 27, 2023
2 parents 38bd04e + 40a3011 commit 3d84682
Show file tree
Hide file tree
Showing 8 changed files with 136 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/components/TrackTile/PillarsTile/PillarsTile.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import { Pillar } from './Pillar';
import { Card } from 'react-native-paper';
import { useStyles } from '../../../hooks/useStyles';
import { createStyles } from '../../BrandConfigProvider';
import { DefaultOnError } from '../common/DefaultOnError';

export type PillarsTileProps = {
onOpenDetails: (
Expand Down Expand Up @@ -70,6 +71,7 @@ export const PillarsTile = ({
trackerValues={trackerDayValues}
tracker={tracker}
valuesContext={valuesContext}
onError={DefaultOnError}
onOpenDetails={() => onOpenDetails(tracker, valuesContext)}
onSaveNewValueOverride={
onSaveNewValueOverride
Expand Down
18 changes: 18 additions & 0 deletions src/components/TrackTile/TrackerDetails/to-procedure-resource.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,25 @@
import {
TrackerResource,
TRACKER_CODE_SYSTEM,
TrackerDetailsError,
} from '../services/TrackTileService';
import { format, addSeconds, startOfDay } from 'date-fns';
import { Code, ResourceSettings } from './to-fhir-resource';
import { convertToStoreUnit } from '../util/convert-value';
import { t } from 'i18next';

export const TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSxxx";

export class OneDayLimitError extends TrackerDetailsError {
constructor(message?: string | undefined) {
super(message);
this.userErrorMessage = t(
'duration-lt-24h',
'Duration cannot be greater than or equal to 24 hours.',
);
}
}

const toFhirProcedureResource = (
from: ResourceSettings,
code?: Code,
Expand All @@ -22,6 +34,12 @@ const toFhirProcedureResource = (

// NOTE: All Procedure units MUST use system http://unitsofmeasure.org
const seconds = convertToStoreUnit(value, tracker);

// Procedures in the trackers/pillars space should never be >= 24 hours.
if (seconds >= 60 * 60 * 24) {
throw new OneDayLimitError();
}

const endTime = addSeconds(startDate, seconds);

return {
Expand Down
22 changes: 22 additions & 0 deletions src/components/TrackTile/common/DefaultOnError.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { Alert } from 'react-native';
import { DefaultOnError } from './DefaultOnError';
import { TrackerDetailsError } from '../services/TrackTileService';

const alertSpy = jest.spyOn(Alert, 'alert');

describe('DefaultOnError', () => {
it('should display user error message if provided', () => {
const error = new TrackerDetailsError();
error.userErrorMessage = 'unit test';
DefaultOnError(error);
expect(alertSpy).toHaveBeenCalledWith(error.userErrorMessage);
});

it('should display generic error message if userMessage not provided', () => {
const error = new Error();
DefaultOnError(error);
expect(alertSpy).toHaveBeenCalledWith(
'Error saving tracker details. Please try again.',
);
});
});
15 changes: 15 additions & 0 deletions src/components/TrackTile/common/DefaultOnError.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { Alert } from 'react-native';
import { t } from '../../../../lib/i18n';
import { TrackerDetailsError } from '../services/TrackTileService';

export function DefaultOnError(error: any) {
console.warn('Error in tracker details', error);
let message = t(
'generic-tracker-error-message',
'Error saving tracker details. Please try again.',
);
if (error instanceof TrackerDetailsError && error.userErrorMessage) {
message = error.userErrorMessage;
}
Alert.alert(message);
}
4 changes: 4 additions & 0 deletions src/components/TrackTile/services/TrackTileService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,10 @@ export type TrackerValuesContext = {
shouldUseOntology?: boolean;
};

export class TrackerDetailsError extends Error {
userErrorMessage?: string;
}

export const TRACK_TILE_CAPABILITIES_VERSION = 3;
export const TRACK_TILE_CAPABILITIES_VERSION_HEADER =
'LifeOmic-TrackTile-Capabilities-Version';
Expand Down
2 changes: 2 additions & 0 deletions src/screens/TrackTileAdvancedDetailsScreen.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import React from 'react';
import { AdvancedTrackerDetails } from '../components/TrackTile/TrackerDetails/AdvancedTrackerDetails/AdvancedTrackerDetails';
import { HomeStackScreenProps } from '../navigators/types';
import { DefaultOnError } from '../components/TrackTile/common/DefaultOnError';

export const AdvancedTrackerDetailsScreen = ({
navigation,
Expand All @@ -15,6 +16,7 @@ export const AdvancedTrackerDetailsScreen = ({
tracker={tracker}
valuesContext={valuesContext}
referenceDate={referenceDate}
onError={DefaultOnError}
onEditValue={(trackerValue) =>
navigation.push('Home/AdvancedTrackerEditor', {
tracker,
Expand Down
71 changes: 71 additions & 0 deletions src/screens/TrackTileTrackerScreen.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import React from 'react';
import { render } from '@testing-library/react-native';
import TrackTileTrackerScreen from './TrackTileTrackerScreen';
import {
TRACKER_CODE_SYSTEM,
TrackTileServiceProvider,
} from '../components/TrackTile/main';
import { TrackerDetails } from '../components/TrackTile/TrackerDetails/TrackerDetails';

jest.mock('../components/TrackTile/TrackerDetails/TrackerDetails', () => ({
TrackerDetails: jest.fn(() => null),
}));

const TrackerDetailsMock = TrackerDetails as any as jest.Mock;
const navSetOptions = jest.fn();
const tracker = {
account: 'account-id',
description: 'desc',
lifePoints: 0,
installed: true,
system: TRACKER_CODE_SYSTEM,
id: 'activity',
metricId: 'activity',
name: 'activity',
icon: 'running',
color: '#CD335E',
resourceType: 'Procedure',
code: 'activity',
order: 1,
units: [
{
code: 'activity',
default: true,
display: 'min',
system: 'http://lifeomic.com/fhir/track-tile-pillar-value/activity',
target: 30,
unit: 'min',
},
],
};

const valuesContext = {};
const referenceDate = {};
const navigation: any = { setOptions: navSetOptions };
const route: any = {
params: {
tracker,
valuesContext,
referenceDate,
},
};

const renderInContext = () => {
return render(
<TrackTileTrackerScreen navigation={navigation as any} route={route} />,
{
wrapper: ({ children }) => (
<TrackTileServiceProvider value={{} as any}>
{children}
</TrackTileServiceProvider>
),
},
);
};

describe('TrackTileTrackerScreen', () => {
it('should render', () => {
renderInContext();
expect(TrackerDetailsMock).toHaveBeenCalled();
});
});
2 changes: 2 additions & 0 deletions src/screens/TrackTileTrackerScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { HomeStackParamList } from '../navigators/types';
import { t } from '../../lib/i18n';
import { createStyles } from '../components/BrandConfigProvider';
import { useStyles } from '../hooks';
import { DefaultOnError } from '../components/TrackTile/common/DefaultOnError';

type Props = NativeStackScreenProps<HomeStackParamList, 'Home/TrackTile'>;

Expand All @@ -29,6 +30,7 @@ export const TrackTileTrackerScreen = ({
valuesContext={valuesContext}
referenceDate={referenceDate}
canEditUnit={true}
onError={DefaultOnError}
/>
</View>
);
Expand Down

0 comments on commit 3d84682

Please sign in to comment.