@hedia/recommendation-screen 2.1.15 → 2.1.16

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 (102) hide show
  1. package/coverage/clover.xml +586 -588
  2. package/coverage/coverage-final.json +27 -27
  3. package/coverage/lcov-report/index.html +7 -7
  4. package/coverage/lcov-report/src/RecommendationScreen.tsx.html +979 -10
  5. package/coverage/lcov-report/src/__tests__/index.html +1 -1
  6. package/coverage/lcov-report/src/__tests__/utils.tsx.html +29 -8
  7. package/coverage/lcov-report/src/components/Header.tsx.html +13 -4
  8. package/coverage/lcov-report/src/components/InfoBars.tsx.html +86 -2
  9. package/coverage/lcov-report/src/components/InvisibleNumberInput.tsx.html +196 -4
  10. package/coverage/lcov-report/src/components/LimitationMessage.tsx.html +20 -2
  11. package/coverage/lcov-report/src/components/LineSeparator.tsx.html +12 -3
  12. package/coverage/lcov-report/src/components/RecentInsulin.tsx.html +30 -3
  13. package/coverage/lcov-report/src/components/RecommendationModal.tsx.html +184 -4
  14. package/coverage/lcov-report/src/components/RecommendedCarbs.tsx.html +205 -7
  15. package/coverage/lcov-report/src/components/RecommendedInsulin.tsx.html +187 -19
  16. package/coverage/lcov-report/src/components/Remeasure.tsx.html +114 -3
  17. package/coverage/lcov-report/src/components/TransferToLogbook.tsx.html +67 -4
  18. package/coverage/lcov-report/src/components/TwoOptionModal.tsx.html +34 -10
  19. package/coverage/lcov-report/src/components/activity/Activity.tsx.html +58 -7
  20. package/coverage/lcov-report/src/components/activity/ActivityIcon.tsx.html +42 -3
  21. package/coverage/lcov-report/src/components/activity/ActivityIntensity.tsx.html +30 -6
  22. package/coverage/lcov-report/src/components/activity/index.html +1 -1
  23. package/coverage/lcov-report/src/components/index.html +10 -10
  24. package/coverage/lcov-report/src/components/mood/Emotion.tsx.html +78 -3
  25. package/coverage/lcov-report/src/components/mood/MoodIcon.tsx.html +80 -5
  26. package/coverage/lcov-report/src/components/mood/index.html +1 -1
  27. package/coverage/lcov-report/src/index.html +1 -1
  28. package/coverage/lcov-report/src/locale/i18nUtils.ts.html +41 -2
  29. package/coverage/lcov-report/src/locale/index.html +1 -1
  30. package/coverage/lcov-report/src/utils/AttentionMessages.tsx.html +231 -3
  31. package/coverage/lcov-report/src/utils/Constants.ts.html +71 -2
  32. package/coverage/lcov-report/src/utils/RecommendationError.tsx.html +89 -2
  33. package/coverage/lcov-report/src/utils/RecommendationUtils.ts.html +306 -9
  34. package/coverage/lcov-report/src/utils/Translations.ts.html +27 -3
  35. package/coverage/lcov-report/src/utils/Utils.ts.html +278 -2
  36. package/coverage/lcov-report/src/utils/Validations.ts.html +716 -14
  37. package/coverage/lcov-report/src/utils/index.html +1 -1
  38. package/coverage/lcov.info +1158 -1164
  39. package/ignore-git.sh +1 -0
  40. package/ignore-publish.sh +1 -0
  41. package/package.json +5 -3
  42. package/src/RecommendationScreen.d.ts +323 -6
  43. package/src/RecommendationScreen.js +234 -1
  44. package/src/__tests__/RecommendationScreen.test.js +1 -1
  45. package/src/__tests__/utils.d.ts +5 -5
  46. package/src/__tests__/utils.js +1 -1
  47. package/src/components/Header.d.ts +4 -43
  48. package/src/components/Header.js +3 -1
  49. package/src/components/Icon.d.ts +9 -2
  50. package/src/components/Icon.js +6 -1
  51. package/src/components/InfoBars.d.ts +28 -0
  52. package/src/components/InfoBars.js +23 -0
  53. package/src/components/InvisibleNumberInput.d.ts +66 -3
  54. package/src/components/InvisibleNumberInput.js +53 -0
  55. package/src/components/LimitationMessage.d.ts +6 -0
  56. package/src/components/LimitationMessage.js +4 -0
  57. package/src/components/LineSeparator.d.ts +4 -2
  58. package/src/components/LineSeparator.js +2 -0
  59. package/src/components/RecentInsulin.d.ts +10 -2
  60. package/src/components/RecentInsulin.js +7 -0
  61. package/src/components/RecommendationModal.d.ts +61 -3
  62. package/src/components/RecommendationModal.js +45 -0
  63. package/src/components/RecommendedCarbs.d.ts +71 -4
  64. package/src/components/RecommendedCarbs.js +56 -0
  65. package/src/components/RecommendedInsulin.d.ts +66 -4
  66. package/src/components/RecommendedInsulin.js +51 -5
  67. package/src/components/Remeasure.d.ts +38 -2
  68. package/src/components/Remeasure.js +31 -0
  69. package/src/components/TransferToLogbook.d.ts +23 -3
  70. package/src/components/TransferToLogbook.js +18 -0
  71. package/src/components/TwoOptionModal.d.ts +12 -1
  72. package/src/components/TwoOptionModal.js +3 -3
  73. package/src/components/activity/Activity.d.ts +21 -5
  74. package/src/components/activity/Activity.js +14 -0
  75. package/src/components/activity/ActivityIcon.d.ts +15 -0
  76. package/src/components/activity/ActivityIcon.js +14 -1
  77. package/src/components/activity/ActivityIntensity.d.ts +11 -4
  78. package/src/components/activity/ActivityIntensity.js +7 -0
  79. package/src/components/mood/Emotion.d.ts +26 -1
  80. package/src/components/mood/Emotion.js +20 -0
  81. package/src/components/mood/MoodIcon.d.ts +28 -2
  82. package/src/components/mood/MoodIcon.js +20 -2
  83. package/src/locale/i18nUtils.d.ts +13 -0
  84. package/src/locale/i18nUtils.js +13 -0
  85. package/src/types/enum.d.ts +10 -0
  86. package/src/types/enum.js +9 -0
  87. package/src/types/types.d.ts +9 -7
  88. package/src/utils/AttentionMessages.d.ts +65 -0
  89. package/src/utils/AttentionMessages.js +65 -1
  90. package/src/utils/Constants.d.ts +23 -0
  91. package/src/utils/Constants.js +23 -0
  92. package/src/utils/RecommendationError.d.ts +29 -0
  93. package/src/utils/RecommendationError.js +29 -0
  94. package/src/utils/RecommendationUtils.d.ts +98 -6
  95. package/src/utils/RecommendationUtils.js +92 -0
  96. package/src/utils/Translations.d.ts +7 -0
  97. package/src/utils/Translations.js +7 -0
  98. package/src/utils/Utils.d.ts +92 -0
  99. package/src/utils/Utils.js +92 -0
  100. package/src/utils/Validations.d.ts +232 -9
  101. package/src/utils/Validations.js +225 -2
  102. package/typedoc.json +13 -0
@@ -95,7 +95,7 @@
95
95
  <div class='footer quiet pad2 space-top1 center small'>
96
96
  Code coverage generated by
97
97
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
98
- at Fri Jul 09 2021 12:31:53 GMT+0000 (Coordinated Universal Time)
98
+ at Thu Jul 29 2021 07:55:43 GMT+0000 (Coordinated Universal Time)
99
99
  </div>
100
100
  </div>
101
101
  <script src="../../prettify.js"></script>
@@ -201,7 +201,21 @@
201
201
  <a name='L142'></a><a href='#L142'>142</a>
202
202
  <a name='L143'></a><a href='#L143'>143</a>
203
203
  <a name='L144'></a><a href='#L144'>144</a>
204
- <a name='L145'></a><a href='#L145'>145</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
204
+ <a name='L145'></a><a href='#L145'>145</a>
205
+ <a name='L146'></a><a href='#L146'>146</a>
206
+ <a name='L147'></a><a href='#L147'>147</a>
207
+ <a name='L148'></a><a href='#L148'>148</a>
208
+ <a name='L149'></a><a href='#L149'>149</a>
209
+ <a name='L150'></a><a href='#L150'>150</a>
210
+ <a name='L151'></a><a href='#L151'>151</a>
211
+ <a name='L152'></a><a href='#L152'>152</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
212
+ <span class="cline-any cline-neutral">&nbsp;</span>
213
+ <span class="cline-any cline-neutral">&nbsp;</span>
214
+ <span class="cline-any cline-neutral">&nbsp;</span>
215
+ <span class="cline-any cline-neutral">&nbsp;</span>
216
+ <span class="cline-any cline-neutral">&nbsp;</span>
217
+ <span class="cline-any cline-neutral">&nbsp;</span>
218
+ <span class="cline-any cline-neutral">&nbsp;</span>
205
219
  <span class="cline-any cline-neutral">&nbsp;</span>
206
220
  <span class="cline-any cline-neutral">&nbsp;</span>
207
221
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -345,7 +359,15 @@
345
359
  <span class="cline-any cline-neutral">&nbsp;</span>
346
360
  <span class="cline-any cline-yes">69x</span>
347
361
  <span class="cline-any cline-neutral">&nbsp;</span>
348
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Activity, BloodGlucoseUnit, BloodKetonesUnit, Languages, UserSettings } from "@hedia/types";
362
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import {
363
+ Activity,
364
+ BloodGlucoseUnit,
365
+ BloodKetonesUnit,
366
+ BolusCalculator,
367
+ Languages,
368
+ Logbook,
369
+ UserSettings,
370
+ } from "@hedia/types";
349
371
  import { I18nProvider } from "@lingui/react";
350
372
  import React from "react";
351
373
  import { RenderAPI } from "react-native-testing-library";
@@ -353,7 +375,6 @@ import { ReactTestInstance } from "react-test-renderer";
353
375
  import { i18n } from "../locale/i18nUtils";
354
376
  import { IRecommendationProps } from "../RecommendationScreen";
355
377
  import { Testing } from "../types/enum";
356
- import { IActivityParams, IRecommendationParams, logbookEntry } from "../types/types";
357
378
  &nbsp;
358
379
  const ActivityEnum = Activity.Enums.ActivityEnum;
359
380
  const ActivityIntensity = Activity.Enums.ActivityIntensity;
@@ -388,7 +409,7 @@ export function getRecommendationProps(partials?: Partial&lt;IRecommendationProp
388
409
  };
389
410
  }
390
411
  &nbsp;
391
- export function generateDefaultCalculatorParams(): IRecommendationParams {
412
+ export function generateDefaultCalculatorParams(): BolusCalculator.Types.IRecommendationParams {
392
413
  return {
393
414
  carbohydrateRatio: 10,
394
415
  carbohydrates: 4,
@@ -409,7 +430,7 @@ export function generateDefaultCalculatorParams(): IRecommendationParams {
409
430
  };
410
431
  }
411
432
  &nbsp;
412
- export function generateActivityProps(): IActivityParams {
433
+ export function generateActivityProps(): BolusCalculator.Types.IActivityParams {
413
434
  return {
414
435
  activityDate: new Date(),
415
436
  activityDuration: 30,
@@ -418,7 +439,7 @@ export function generateActivityProps(): IActivityParams {
418
439
  };
419
440
  }
420
441
  &nbsp;
421
- export function generateDefaultActivitySettings(): IActivityParams["activitySettings"] {
442
+ export function generateDefaultActivitySettings(): BolusCalculator.Types.IActivityParams["activitySettings"] {
422
443
  return {
423
444
  hard: { fromFortysix: null, fromThirty: 0.25, fromZero: 1 },
424
445
  light: { fromFortysix: 0.5, fromThirty: 0.75, fromZero: 1 },
@@ -427,7 +448,7 @@ export function generateDefaultActivitySettings(): IActivityParams["activitySett
427
448
  target: 9,
428
449
  };
429
450
  }
430
- export function generateDefaultLogbook(): logbookEntry {
451
+ export function generateDefaultLogbook(): Logbook.Types.ILogbookEntry {
431
452
  return {
432
453
  blood_glucose_millimolar: 6,
433
454
  carbohydrates_entered_grams: 25,
@@ -496,7 +517,7 @@ export function getIcon(wrapper: RenderAPI, name: string, active: boolean): Reac
496
517
  <div class='footer quiet pad2 space-top1 center small'>
497
518
  Code coverage generated by
498
519
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
499
- at Fri Jul 09 2021 12:31:53 GMT+0000 (Coordinated Universal Time)
520
+ at Thu Jul 29 2021 07:55:43 GMT+0000 (Coordinated Universal Time)
500
521
  </div>
501
522
  </div>
502
523
  <script src="../../prettify.js"></script>
@@ -146,7 +146,13 @@
146
146
  <a name='L87'></a><a href='#L87'>87</a>
147
147
  <a name='L88'></a><a href='#L88'>88</a>
148
148
  <a name='L89'></a><a href='#L89'>89</a>
149
- <a name='L90'></a><a href='#L90'>90</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
149
+ <a name='L90'></a><a href='#L90'>90</a>
150
+ <a name='L91'></a><a href='#L91'>91</a>
151
+ <a name='L92'></a><a href='#L92'>92</a>
152
+ <a name='L93'></a><a href='#L93'>93</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
153
+ <span class="cline-any cline-neutral">&nbsp;</span>
154
+ <span class="cline-any cline-neutral">&nbsp;</span>
155
+ <span class="cline-any cline-neutral">&nbsp;</span>
150
156
  <span class="cline-any cline-neutral">&nbsp;</span>
151
157
  <span class="cline-any cline-neutral">&nbsp;</span>
152
158
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -243,11 +249,14 @@ import { Testing } from "../types/enum";
243
249
  import { BACKGROUND_COLOUR_PURPLE, BORDER_COLOUR_GREY } from "../utils/Constants";
244
250
  import Icon from "./Icon";
245
251
  &nbsp;
246
- interface IProps {
252
+ export interface IProps {
253
+ /** A callback that doesn’t take any arguments and doesn’t return a value to be called when the cancel-button is pressed. */
247
254
  exitCallback(): void;
248
255
  }
249
256
  &nbsp;
257
+ /** Component to display a header text along with a cancel-button that triggers a callback function. */
250
258
  export default class Header extends React.Component&lt;IProps&gt; {
259
+ /** JSX element to display the cancel button and header. When the cancel button in the header is tabbed, the exitCallback prop callback function should be called. */
251
260
  public render(): JSX.Element {
252
261
  return (
253
262
  &lt;React.Fragment&gt;
@@ -283,7 +292,7 @@ export default class Header extends React.Component&lt;IProps&gt; {
283
292
  }
284
293
  }
285
294
  &nbsp;
286
- export const headerStyles = StyleSheet.create({
295
+ const headerStyles = StyleSheet.create({
287
296
  backgroundColour: {
288
297
  backgroundColor: BACKGROUND_COLOUR_PURPLE,
289
298
  },
@@ -331,7 +340,7 @@ export const headerStyles = StyleSheet.create({
331
340
  <div class='footer quiet pad2 space-top1 center small'>
332
341
  Code coverage generated by
333
342
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
334
- at Fri Jul 09 2021 12:31:53 GMT+0000 (Coordinated Universal Time)
343
+ at Thu Jul 29 2021 07:55:43 GMT+0000 (Coordinated Universal Time)
335
344
  </div>
336
345
  </div>
337
346
  <script src="../../prettify.js"></script>
@@ -175,7 +175,51 @@
175
175
  <a name='L116'></a><a href='#L116'>116</a>
176
176
  <a name='L117'></a><a href='#L117'>117</a>
177
177
  <a name='L118'></a><a href='#L118'>118</a>
178
- <a name='L119'></a><a href='#L119'>119</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
178
+ <a name='L119'></a><a href='#L119'>119</a>
179
+ <a name='L120'></a><a href='#L120'>120</a>
180
+ <a name='L121'></a><a href='#L121'>121</a>
181
+ <a name='L122'></a><a href='#L122'>122</a>
182
+ <a name='L123'></a><a href='#L123'>123</a>
183
+ <a name='L124'></a><a href='#L124'>124</a>
184
+ <a name='L125'></a><a href='#L125'>125</a>
185
+ <a name='L126'></a><a href='#L126'>126</a>
186
+ <a name='L127'></a><a href='#L127'>127</a>
187
+ <a name='L128'></a><a href='#L128'>128</a>
188
+ <a name='L129'></a><a href='#L129'>129</a>
189
+ <a name='L130'></a><a href='#L130'>130</a>
190
+ <a name='L131'></a><a href='#L131'>131</a>
191
+ <a name='L132'></a><a href='#L132'>132</a>
192
+ <a name='L133'></a><a href='#L133'>133</a>
193
+ <a name='L134'></a><a href='#L134'>134</a>
194
+ <a name='L135'></a><a href='#L135'>135</a>
195
+ <a name='L136'></a><a href='#L136'>136</a>
196
+ <a name='L137'></a><a href='#L137'>137</a>
197
+ <a name='L138'></a><a href='#L138'>138</a>
198
+ <a name='L139'></a><a href='#L139'>139</a>
199
+ <a name='L140'></a><a href='#L140'>140</a>
200
+ <a name='L141'></a><a href='#L141'>141</a>
201
+ <a name='L142'></a><a href='#L142'>142</a>
202
+ <a name='L143'></a><a href='#L143'>143</a>
203
+ <a name='L144'></a><a href='#L144'>144</a>
204
+ <a name='L145'></a><a href='#L145'>145</a>
205
+ <a name='L146'></a><a href='#L146'>146</a>
206
+ <a name='L147'></a><a href='#L147'>147</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
207
+ <span class="cline-any cline-neutral">&nbsp;</span>
208
+ <span class="cline-any cline-neutral">&nbsp;</span>
209
+ <span class="cline-any cline-neutral">&nbsp;</span>
210
+ <span class="cline-any cline-neutral">&nbsp;</span>
211
+ <span class="cline-any cline-neutral">&nbsp;</span>
212
+ <span class="cline-any cline-neutral">&nbsp;</span>
213
+ <span class="cline-any cline-neutral">&nbsp;</span>
214
+ <span class="cline-any cline-neutral">&nbsp;</span>
215
+ <span class="cline-any cline-neutral">&nbsp;</span>
216
+ <span class="cline-any cline-neutral">&nbsp;</span>
217
+ <span class="cline-any cline-neutral">&nbsp;</span>
218
+ <span class="cline-any cline-neutral">&nbsp;</span>
219
+ <span class="cline-any cline-neutral">&nbsp;</span>
220
+ <span class="cline-any cline-neutral">&nbsp;</span>
221
+ <span class="cline-any cline-neutral">&nbsp;</span>
222
+ <span class="cline-any cline-neutral">&nbsp;</span>
179
223
  <span class="cline-any cline-neutral">&nbsp;</span>
180
224
  <span class="cline-any cline-neutral">&nbsp;</span>
181
225
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -200,6 +244,14 @@
200
244
  <span class="cline-any cline-yes">410x</span>
201
245
  <span class="cline-any cline-neutral">&nbsp;</span>
202
246
  <span class="cline-any cline-neutral">&nbsp;</span>
247
+ <span class="cline-any cline-neutral">&nbsp;</span>
248
+ <span class="cline-any cline-neutral">&nbsp;</span>
249
+ <span class="cline-any cline-neutral">&nbsp;</span>
250
+ <span class="cline-any cline-neutral">&nbsp;</span>
251
+ <span class="cline-any cline-neutral">&nbsp;</span>
252
+ <span class="cline-any cline-neutral">&nbsp;</span>
253
+ <span class="cline-any cline-neutral">&nbsp;</span>
254
+ <span class="cline-any cline-neutral">&nbsp;</span>
203
255
  <span class="cline-any cline-yes">203x</span>
204
256
  <span class="cline-any cline-yes">410x</span>
205
257
  <span class="cline-any cline-yes">410x</span>
@@ -209,6 +261,9 @@
209
261
  <span class="cline-any cline-neutral">&nbsp;</span>
210
262
  <span class="cline-any cline-neutral">&nbsp;</span>
211
263
  <span class="cline-any cline-neutral">&nbsp;</span>
264
+ <span class="cline-any cline-neutral">&nbsp;</span>
265
+ <span class="cline-any cline-neutral">&nbsp;</span>
266
+ <span class="cline-any cline-neutral">&nbsp;</span>
212
267
  <span class="cline-any cline-yes">410x</span>
213
268
  <span class="cline-any cline-yes">410x</span>
214
269
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -238,6 +293,7 @@
238
293
  <span class="cline-any cline-neutral">&nbsp;</span>
239
294
  <span class="cline-any cline-neutral">&nbsp;</span>
240
295
  <span class="cline-any cline-neutral">&nbsp;</span>
296
+ <span class="cline-any cline-neutral">&nbsp;</span>
241
297
  <span class="cline-any cline-yes">6x</span>
242
298
  <span class="cline-any cline-neutral">&nbsp;</span>
243
299
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -303,14 +359,30 @@ import { BORDER_COLOUR_GREY } from "../utils/Constants";
303
359
  import { Utils } from "../utils/Utils";
304
360
  &nbsp;
305
361
  export interface IProps {
362
+ /** The display label that describes the value to the user. */
306
363
  label: string;
364
+ /** The value to display. */
307
365
  value: string | null;
366
+ /** Unit label to print after the value. */
308
367
  unit: string | BloodGlucoseUnit | BloodKetonesUnit | null;
368
+ /** If true then a dash character (“-”) will be printed in place of the value if the value is null. */
309
369
  showNullAsDash: boolean;
370
+ /** optional object that contains as properties a valueID and a unitID */
310
371
  testID?: { valueID: Testing.Id.InfoBarTestIds.Value; unitID: Testing.Id.InfoBarTestIds.Unit };
311
372
  }
312
373
  &nbsp;
374
+ /** A standard panel to display some data that the user entered. */
313
375
  export default class InfoBars extends React.Component&lt;IProps&gt; {
376
+ /**
377
+ * Determine the value to be displayed in the infobar.
378
+ *
379
+ * Steps:
380
+ * 1. Unpack showNullAsDash, unit, and value from props.
381
+ * 2. Set noDecimal to be true if unit is BloodGlucoseUnit.MG_DL or if unit is BloodKetonesUnit.MG_DL.
382
+ * 3. Set nullPlaceholder to be ‘-' if noDecimal is true and to '-.-’ otherwise.
383
+ * 4. Return value if it is not null or undefined. Otherwise, if showNullAsDash is true then return nullPlaceholder, otherwise return the string '0'.
384
+ * @returns The string to display as the value in the infobar.
385
+ */
314
386
  public displayValue = (): string =&gt; {
315
387
  const { showNullAsDash, unit, value } = this.props;
316
388
  const noDecimal = unit === BloodGlucoseUnit.MG_DL || unit === BloodKetonesUnit.MG_DL;
@@ -318,6 +390,14 @@ export default class InfoBars extends React.Component&lt;IProps&gt; {
318
390
  return value ?? (showNullAsDash ? nullPlaceholder : `0`);
319
391
  };
320
392
  &nbsp;
393
+ /**
394
+ * Determine the unit string to be displayed in the infobar.
395
+ *
396
+ * Steps:
397
+ * 1. Unpack unit from props.
398
+ * 2. Return unit if unit is “units” or the result of calling formatUnit() with unit as argument otherwise.
399
+ * @returns The string to display as the unit in the infobar
400
+ */
321
401
  public displayUnit = (): string | null =&gt; {
322
402
  const { unit } = this.props;
323
403
  if (!unit) {
@@ -326,6 +406,9 @@ export default class InfoBars extends React.Component&lt;IProps&gt; {
326
406
  return unit === i18n._(t`units`) ? unit : Utils.formatUnit(unit as BloodGlucoseUnit | BloodKetonesUnit);
327
407
  };
328
408
  &nbsp;
409
+ /**
410
+ * @returns JSX element to display a card with the entered value.
411
+ */
329
412
  public render(): JSX.Element {
330
413
  const { testID } = this.props;
331
414
  return (
@@ -356,6 +439,7 @@ export default class InfoBars extends React.Component&lt;IProps&gt; {
356
439
  }
357
440
  }
358
441
  &nbsp;
442
+ /** @internal */
359
443
  export const infoStyles = StyleSheet.create({
360
444
  container: { flex: 1 },
361
445
  margin: {
@@ -418,7 +502,7 @@ export const infoStyles = StyleSheet.create({
418
502
  <div class='footer quiet pad2 space-top1 center small'>
419
503
  Code coverage generated by
420
504
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
421
- at Fri Jul 09 2021 12:31:53 GMT+0000 (Coordinated Universal Time)
505
+ at Thu Jul 29 2021 07:55:43 GMT+0000 (Coordinated Universal Time)
422
506
  </div>
423
507
  </div>
424
508
  <script src="../../prettify.js"></script>
@@ -155,7 +155,90 @@
155
155
  <a name='L96'></a><a href='#L96'>96</a>
156
156
  <a name='L97'></a><a href='#L97'>97</a>
157
157
  <a name='L98'></a><a href='#L98'>98</a>
158
- <a name='L99'></a><a href='#L99'>99</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
158
+ <a name='L99'></a><a href='#L99'>99</a>
159
+ <a name='L100'></a><a href='#L100'>100</a>
160
+ <a name='L101'></a><a href='#L101'>101</a>
161
+ <a name='L102'></a><a href='#L102'>102</a>
162
+ <a name='L103'></a><a href='#L103'>103</a>
163
+ <a name='L104'></a><a href='#L104'>104</a>
164
+ <a name='L105'></a><a href='#L105'>105</a>
165
+ <a name='L106'></a><a href='#L106'>106</a>
166
+ <a name='L107'></a><a href='#L107'>107</a>
167
+ <a name='L108'></a><a href='#L108'>108</a>
168
+ <a name='L109'></a><a href='#L109'>109</a>
169
+ <a name='L110'></a><a href='#L110'>110</a>
170
+ <a name='L111'></a><a href='#L111'>111</a>
171
+ <a name='L112'></a><a href='#L112'>112</a>
172
+ <a name='L113'></a><a href='#L113'>113</a>
173
+ <a name='L114'></a><a href='#L114'>114</a>
174
+ <a name='L115'></a><a href='#L115'>115</a>
175
+ <a name='L116'></a><a href='#L116'>116</a>
176
+ <a name='L117'></a><a href='#L117'>117</a>
177
+ <a name='L118'></a><a href='#L118'>118</a>
178
+ <a name='L119'></a><a href='#L119'>119</a>
179
+ <a name='L120'></a><a href='#L120'>120</a>
180
+ <a name='L121'></a><a href='#L121'>121</a>
181
+ <a name='L122'></a><a href='#L122'>122</a>
182
+ <a name='L123'></a><a href='#L123'>123</a>
183
+ <a name='L124'></a><a href='#L124'>124</a>
184
+ <a name='L125'></a><a href='#L125'>125</a>
185
+ <a name='L126'></a><a href='#L126'>126</a>
186
+ <a name='L127'></a><a href='#L127'>127</a>
187
+ <a name='L128'></a><a href='#L128'>128</a>
188
+ <a name='L129'></a><a href='#L129'>129</a>
189
+ <a name='L130'></a><a href='#L130'>130</a>
190
+ <a name='L131'></a><a href='#L131'>131</a>
191
+ <a name='L132'></a><a href='#L132'>132</a>
192
+ <a name='L133'></a><a href='#L133'>133</a>
193
+ <a name='L134'></a><a href='#L134'>134</a>
194
+ <a name='L135'></a><a href='#L135'>135</a>
195
+ <a name='L136'></a><a href='#L136'>136</a>
196
+ <a name='L137'></a><a href='#L137'>137</a>
197
+ <a name='L138'></a><a href='#L138'>138</a>
198
+ <a name='L139'></a><a href='#L139'>139</a>
199
+ <a name='L140'></a><a href='#L140'>140</a>
200
+ <a name='L141'></a><a href='#L141'>141</a>
201
+ <a name='L142'></a><a href='#L142'>142</a>
202
+ <a name='L143'></a><a href='#L143'>143</a>
203
+ <a name='L144'></a><a href='#L144'>144</a>
204
+ <a name='L145'></a><a href='#L145'>145</a>
205
+ <a name='L146'></a><a href='#L146'>146</a>
206
+ <a name='L147'></a><a href='#L147'>147</a>
207
+ <a name='L148'></a><a href='#L148'>148</a>
208
+ <a name='L149'></a><a href='#L149'>149</a>
209
+ <a name='L150'></a><a href='#L150'>150</a>
210
+ <a name='L151'></a><a href='#L151'>151</a>
211
+ <a name='L152'></a><a href='#L152'>152</a>
212
+ <a name='L153'></a><a href='#L153'>153</a>
213
+ <a name='L154'></a><a href='#L154'>154</a>
214
+ <a name='L155'></a><a href='#L155'>155</a>
215
+ <a name='L156'></a><a href='#L156'>156</a>
216
+ <a name='L157'></a><a href='#L157'>157</a>
217
+ <a name='L158'></a><a href='#L158'>158</a>
218
+ <a name='L159'></a><a href='#L159'>159</a>
219
+ <a name='L160'></a><a href='#L160'>160</a>
220
+ <a name='L161'></a><a href='#L161'>161</a>
221
+ <a name='L162'></a><a href='#L162'>162</a>
222
+ <a name='L163'></a><a href='#L163'>163</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
223
+ <span class="cline-any cline-neutral">&nbsp;</span>
224
+ <span class="cline-any cline-neutral">&nbsp;</span>
225
+ <span class="cline-any cline-neutral">&nbsp;</span>
226
+ <span class="cline-any cline-neutral">&nbsp;</span>
227
+ <span class="cline-any cline-neutral">&nbsp;</span>
228
+ <span class="cline-any cline-neutral">&nbsp;</span>
229
+ <span class="cline-any cline-neutral">&nbsp;</span>
230
+ <span class="cline-any cline-neutral">&nbsp;</span>
231
+ <span class="cline-any cline-neutral">&nbsp;</span>
232
+ <span class="cline-any cline-neutral">&nbsp;</span>
233
+ <span class="cline-any cline-neutral">&nbsp;</span>
234
+ <span class="cline-any cline-neutral">&nbsp;</span>
235
+ <span class="cline-any cline-neutral">&nbsp;</span>
236
+ <span class="cline-any cline-neutral">&nbsp;</span>
237
+ <span class="cline-any cline-neutral">&nbsp;</span>
238
+ <span class="cline-any cline-neutral">&nbsp;</span>
239
+ <span class="cline-any cline-neutral">&nbsp;</span>
240
+ <span class="cline-any cline-neutral">&nbsp;</span>
241
+ <span class="cline-any cline-neutral">&nbsp;</span>
159
242
  <span class="cline-any cline-neutral">&nbsp;</span>
160
243
  <span class="cline-any cline-neutral">&nbsp;</span>
161
244
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -182,6 +265,14 @@
182
265
  <span class="cline-any cline-neutral">&nbsp;</span>
183
266
  <span class="cline-any cline-neutral">&nbsp;</span>
184
267
  <span class="cline-any cline-neutral">&nbsp;</span>
268
+ <span class="cline-any cline-neutral">&nbsp;</span>
269
+ <span class="cline-any cline-neutral">&nbsp;</span>
270
+ <span class="cline-any cline-neutral">&nbsp;</span>
271
+ <span class="cline-any cline-neutral">&nbsp;</span>
272
+ <span class="cline-any cline-neutral">&nbsp;</span>
273
+ <span class="cline-any cline-neutral">&nbsp;</span>
274
+ <span class="cline-any cline-neutral">&nbsp;</span>
275
+ <span class="cline-any cline-neutral">&nbsp;</span>
185
276
  <span class="cline-any cline-yes">143x</span>
186
277
  <span class="cline-any cline-neutral">&nbsp;</span>
187
278
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -193,6 +284,20 @@
193
284
  <span class="cline-any cline-neutral">&nbsp;</span>
194
285
  <span class="cline-any cline-neutral">&nbsp;</span>
195
286
  <span class="cline-any cline-neutral">&nbsp;</span>
287
+ <span class="cline-any cline-neutral">&nbsp;</span>
288
+ <span class="cline-any cline-neutral">&nbsp;</span>
289
+ <span class="cline-any cline-neutral">&nbsp;</span>
290
+ <span class="cline-any cline-neutral">&nbsp;</span>
291
+ <span class="cline-any cline-neutral">&nbsp;</span>
292
+ <span class="cline-any cline-neutral">&nbsp;</span>
293
+ <span class="cline-any cline-neutral">&nbsp;</span>
294
+ <span class="cline-any cline-neutral">&nbsp;</span>
295
+ <span class="cline-any cline-neutral">&nbsp;</span>
296
+ <span class="cline-any cline-neutral">&nbsp;</span>
297
+ <span class="cline-any cline-neutral">&nbsp;</span>
298
+ <span class="cline-any cline-neutral">&nbsp;</span>
299
+ <span class="cline-any cline-neutral">&nbsp;</span>
300
+ <span class="cline-any cline-neutral">&nbsp;</span>
196
301
  <span class="cline-any cline-yes">143x</span>
197
302
  <span class="cline-any cline-yes">45x</span>
198
303
  <span class="cline-any cline-yes">45x</span>
@@ -206,6 +311,18 @@
206
311
  <span class="cline-any cline-yes">5x</span>
207
312
  <span class="cline-any cline-neutral">&nbsp;</span>
208
313
  <span class="cline-any cline-neutral">&nbsp;</span>
314
+ <span class="cline-any cline-neutral">&nbsp;</span>
315
+ <span class="cline-any cline-neutral">&nbsp;</span>
316
+ <span class="cline-any cline-neutral">&nbsp;</span>
317
+ <span class="cline-any cline-neutral">&nbsp;</span>
318
+ <span class="cline-any cline-neutral">&nbsp;</span>
319
+ <span class="cline-any cline-neutral">&nbsp;</span>
320
+ <span class="cline-any cline-neutral">&nbsp;</span>
321
+ <span class="cline-any cline-neutral">&nbsp;</span>
322
+ <span class="cline-any cline-neutral">&nbsp;</span>
323
+ <span class="cline-any cline-neutral">&nbsp;</span>
324
+ <span class="cline-any cline-neutral">&nbsp;</span>
325
+ <span class="cline-any cline-neutral">&nbsp;</span>
209
326
  <span class="cline-any cline-yes">143x</span>
210
327
  <span class="cline-any cline-yes">41x</span>
211
328
  <span class="cline-any cline-yes">41x</span>
@@ -218,12 +335,23 @@
218
335
  <span class="cline-any cline-yes">41x</span>
219
336
  <span class="cline-any cline-neutral">&nbsp;</span>
220
337
  <span class="cline-any cline-neutral">&nbsp;</span>
338
+ <span class="cline-any cline-neutral">&nbsp;</span>
339
+ <span class="cline-any cline-neutral">&nbsp;</span>
340
+ <span class="cline-any cline-neutral">&nbsp;</span>
341
+ <span class="cline-any cline-neutral">&nbsp;</span>
342
+ <span class="cline-any cline-neutral">&nbsp;</span>
343
+ <span class="cline-any cline-neutral">&nbsp;</span>
344
+ <span class="cline-any cline-neutral">&nbsp;</span>
221
345
  <span class="cline-any cline-yes">143x</span>
222
346
  <span class="cline-any cline-yes">14x</span>
223
347
  <span class="cline-any cline-yes">14x</span>
224
348
  <span class="cline-any cline-neutral">&nbsp;</span>
225
349
  <span class="cline-any cline-neutral">&nbsp;</span>
226
350
  <span class="cline-any cline-neutral">&nbsp;</span>
351
+ <span class="cline-any cline-neutral">&nbsp;</span>
352
+ <span class="cline-any cline-neutral">&nbsp;</span>
353
+ <span class="cline-any cline-neutral">&nbsp;</span>
354
+ <span class="cline-any cline-neutral">&nbsp;</span>
227
355
  <span class="cline-any cline-yes">459x</span>
228
356
  <span class="cline-any cline-yes">459x</span>
229
357
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -256,29 +384,56 @@
256
384
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import React from "react";
257
385
  import { StyleSheet, TextInput } from "react-native";
258
386
  &nbsp;
259
- interface IProps {
387
+ export interface IProps {
388
+ /** The initial value to put in the input field. */
260
389
  startValue?: string;
390
+ /** The precision with which the content of the input field may be displayed */
261
391
  decimalPlaces: number;
392
+ /** Whether or not the clean method should be used on the content every time it is changed */
262
393
  cleanPartialInput: boolean;
394
+ /** Whether or not negative values can be entered. */
263
395
  negativeAllowed: boolean;
396
+ /** Max length of the content in the input field. */
264
397
  maxLength?: number;
398
+ /** Test id used for component testing */
265
399
  testID: string;
400
+ /** Callback function taking a function as argument - For passing a reference for the input field’s to the parent component. */
266
401
  visible(toggle: () =&gt; void): void;
402
+ /** Callback function taking a number argument - To be called when the user finishes editing the invisible text field with the final numerical value as argument. */
267
403
  onEnd?(value: number): void;
404
+ /** Callback function taking a string as input and not returning anything - To be called every time the content in the input field changes. */
268
405
  partialInput?(value: string): void;
269
406
  }
270
407
  &nbsp;
271
- interface IState {
408
+ export interface IState {
409
+ /** For storing the value of the text input so it is available for handling in onEndEdit() when editing the text input ends. */
272
410
  value: string;
273
411
  }
274
412
  &nbsp;
413
+ /**
414
+ * InvisibleNumberInput is used to enable numerical input by the user without displaying a traditional input field on the screen.
415
+ * Since the input field is made invisible and thus can’t be tapped directly by the user we need to be able to call
416
+ * its focus() method from the parent component in order to activate the input field and show the keyboard.
417
+ * We do this by defining a function that calls the input field’s focus() method inside the InvisibleNumberInput component when it has been mounted.
418
+ * This function is then passed to the parent by giving it as the argument for a callback function named visible.
419
+ */
275
420
  export default class InvisibleNumberInput extends React.Component&lt;IProps, IState&gt; {
421
+ /** For holding a reference to the TextInput component so it can be focused when the InvisibleNumberInput component has been mounted. */
276
422
  public textInput?: TextInput;
277
423
  &nbsp;
424
+ /** Initialise the state value variable with `0` */
278
425
  public state: IState = {
279
426
  value: `0`,
280
427
  };
281
428
  &nbsp;
429
+ /**
430
+ * Called immediately after a component is mounted. Setting state here will trigger re-rendering.
431
+ * Perform various initialisation steps:
432
+ * 1. Set the value state of the component to the startValue prop (or to '0' if it is undefined)
433
+ * 2. Call the visible callback function using an anonymous function as argument. The anonymous function shall do the following:
434
+ * - Set the value state of the InvisibleNumberInput component to the startValue prop (or to '0' if it is undefined)
435
+ * - Return the value from calling the focus() method on the input field.
436
+ */
282
437
  public componentDidMount(): void {
283
438
  this.setState({
284
439
  value: this.props.startValue ?? `0`,
@@ -291,6 +446,20 @@ export default class InvisibleNumberInput extends React.Component&lt;IProps, ISt
291
446
  });
292
447
  }
293
448
  &nbsp;
449
+ /**
450
+ * Sanitise a user-entered value by removing invalid characters
451
+ *
452
+ * Steps:
453
+ * 1. Use regular expressions to make the following manipulations to the text argument in the defined order and save the result to a local string variable named replaced.
454
+ * - Replace any commas with periods
455
+ * - Remove any characters that comes after two groups of zero or more digits separated by a period.
456
+ * 2. Define a function named round that rounds a given string that contains a number to have the amount of decimals given by the decimalPlaces prop. Return the result as a string.
457
+ * 3. If the value of the replaced variable from step 1 is not a NaN (not a number) when converted to a Number type then use the round function defined in step 2 on replaced and return the result
458
+ * 4. (If the NaN-check from step 2 didn’t fail) return the string '0'.
459
+ &nbsp;
460
+ * @param text The string input to clean up
461
+ * @returns A string with the cleaned text.
462
+ */
294
463
  public cleanInput = (text: string): string =&gt; {
295
464
  const replaced = text.replace(/\,/g, `.`).replace(/(\d*\.\d*).*/, `$1`);
296
465
  const round = (value: string): string =&gt; {
@@ -304,6 +473,18 @@ export default class InvisibleNumberInput extends React.Component&lt;IProps, ISt
304
473
  return `0`;
305
474
  };
306
475
  &nbsp;
476
+ /**
477
+ * Handle what happens when the text in the input field is being changed.
478
+ * That includes cleaning the text a little and then saving the value and potentially calling a callback function.
479
+ *
480
+ * Steps:
481
+ * 1. If the cleanPartialInput prop is true, use the cleanInput() method to to clean the content of the text argument and save it to a variable named cleaned.
482
+ * Otherwise just replace any commas in the text argument with periods and save the result to the same variable.
483
+ * 2. Remove repeated periods from the text in the cleaned variable and save the the result in a new variable named replacedSeparator.
484
+ * 3. Set the value state of the component to replacedSeparator.
485
+ * 4. If the partialInput callback function prop is defined, call it with replacedSeparator as argument.
486
+ * @param text The updated text in the input field
487
+ */
307
488
  public handleOnChangeText = (text: string): void =&gt; {
308
489
  const cleaned = this.props.cleanPartialInput ? this.cleanInput(text) : text.replace(/\,/g, `.`);
309
490
  let replacedSeparator = cleaned.replace(/\.+/g, `.`).replace(/(\d*\.\d*).*/, `$1`);
@@ -316,11 +497,22 @@ export default class InvisibleNumberInput extends React.Component&lt;IProps, ISt
316
497
  this.props.partialInput?.(`${replacedSeparator}`);
317
498
  };
318
499
  &nbsp;
500
+ /**
501
+ * Handle what should happen when the user finish editing the input field.
502
+ *
503
+ * Steps:
504
+ * 1. Use the cleanInput() method on the value state and store the result in a variable named cleaned.
505
+ * 2. If the onEnd prop is not null, then convert the value of cleaned to a number and use it as an argument to call the onEnd prop function.
506
+ */
319
507
  public onEndEdit = (): void =&gt; {
320
508
  const cleaned = this.cleanInput(this.state.value);
321
509
  this.props.onEnd?.(Number(cleaned));
322
510
  };
323
511
  &nbsp;
512
+ /**
513
+ * @returns JSX element to display a TextInput field with the component’s value state as its value
514
+ * and the handleOnChangeText() and onEndEdit() methods as the textInput’s onChangeText and onEndEditing respectively.
515
+ */
324
516
  public render(): JSX.Element {
325
517
  const { testID } = this.props;
326
518
  return (
@@ -358,7 +550,7 @@ const inputStyles = StyleSheet.create({
358
550
  <div class='footer quiet pad2 space-top1 center small'>
359
551
  Code coverage generated by
360
552
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
361
- at Fri Jul 09 2021 12:31:53 GMT+0000 (Coordinated Universal Time)
553
+ at Thu Jul 29 2021 07:55:43 GMT+0000 (Coordinated Universal Time)
362
554
  </div>
363
555
  </div>
364
556
  <script src="../../prettify.js"></script>