@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.
- package/coverage/clover.xml +586 -588
- package/coverage/coverage-final.json +27 -27
- package/coverage/lcov-report/index.html +7 -7
- package/coverage/lcov-report/src/RecommendationScreen.tsx.html +979 -10
- package/coverage/lcov-report/src/__tests__/index.html +1 -1
- package/coverage/lcov-report/src/__tests__/utils.tsx.html +29 -8
- package/coverage/lcov-report/src/components/Header.tsx.html +13 -4
- package/coverage/lcov-report/src/components/InfoBars.tsx.html +86 -2
- package/coverage/lcov-report/src/components/InvisibleNumberInput.tsx.html +196 -4
- package/coverage/lcov-report/src/components/LimitationMessage.tsx.html +20 -2
- package/coverage/lcov-report/src/components/LineSeparator.tsx.html +12 -3
- package/coverage/lcov-report/src/components/RecentInsulin.tsx.html +30 -3
- package/coverage/lcov-report/src/components/RecommendationModal.tsx.html +184 -4
- package/coverage/lcov-report/src/components/RecommendedCarbs.tsx.html +205 -7
- package/coverage/lcov-report/src/components/RecommendedInsulin.tsx.html +187 -19
- package/coverage/lcov-report/src/components/Remeasure.tsx.html +114 -3
- package/coverage/lcov-report/src/components/TransferToLogbook.tsx.html +67 -4
- package/coverage/lcov-report/src/components/TwoOptionModal.tsx.html +34 -10
- package/coverage/lcov-report/src/components/activity/Activity.tsx.html +58 -7
- package/coverage/lcov-report/src/components/activity/ActivityIcon.tsx.html +42 -3
- package/coverage/lcov-report/src/components/activity/ActivityIntensity.tsx.html +30 -6
- package/coverage/lcov-report/src/components/activity/index.html +1 -1
- package/coverage/lcov-report/src/components/index.html +10 -10
- package/coverage/lcov-report/src/components/mood/Emotion.tsx.html +78 -3
- package/coverage/lcov-report/src/components/mood/MoodIcon.tsx.html +80 -5
- package/coverage/lcov-report/src/components/mood/index.html +1 -1
- package/coverage/lcov-report/src/index.html +1 -1
- package/coverage/lcov-report/src/locale/i18nUtils.ts.html +41 -2
- package/coverage/lcov-report/src/locale/index.html +1 -1
- package/coverage/lcov-report/src/utils/AttentionMessages.tsx.html +231 -3
- package/coverage/lcov-report/src/utils/Constants.ts.html +71 -2
- package/coverage/lcov-report/src/utils/RecommendationError.tsx.html +89 -2
- package/coverage/lcov-report/src/utils/RecommendationUtils.ts.html +306 -9
- package/coverage/lcov-report/src/utils/Translations.ts.html +27 -3
- package/coverage/lcov-report/src/utils/Utils.ts.html +278 -2
- package/coverage/lcov-report/src/utils/Validations.ts.html +716 -14
- package/coverage/lcov-report/src/utils/index.html +1 -1
- package/coverage/lcov.info +1158 -1164
- package/ignore-git.sh +1 -0
- package/ignore-publish.sh +1 -0
- package/package.json +5 -3
- package/src/RecommendationScreen.d.ts +323 -6
- package/src/RecommendationScreen.js +234 -1
- package/src/__tests__/RecommendationScreen.test.js +1 -1
- package/src/__tests__/utils.d.ts +5 -5
- package/src/__tests__/utils.js +1 -1
- package/src/components/Header.d.ts +4 -43
- package/src/components/Header.js +3 -1
- package/src/components/Icon.d.ts +9 -2
- package/src/components/Icon.js +6 -1
- package/src/components/InfoBars.d.ts +28 -0
- package/src/components/InfoBars.js +23 -0
- package/src/components/InvisibleNumberInput.d.ts +66 -3
- package/src/components/InvisibleNumberInput.js +53 -0
- package/src/components/LimitationMessage.d.ts +6 -0
- package/src/components/LimitationMessage.js +4 -0
- package/src/components/LineSeparator.d.ts +4 -2
- package/src/components/LineSeparator.js +2 -0
- package/src/components/RecentInsulin.d.ts +10 -2
- package/src/components/RecentInsulin.js +7 -0
- package/src/components/RecommendationModal.d.ts +61 -3
- package/src/components/RecommendationModal.js +45 -0
- package/src/components/RecommendedCarbs.d.ts +71 -4
- package/src/components/RecommendedCarbs.js +56 -0
- package/src/components/RecommendedInsulin.d.ts +66 -4
- package/src/components/RecommendedInsulin.js +51 -5
- package/src/components/Remeasure.d.ts +38 -2
- package/src/components/Remeasure.js +31 -0
- package/src/components/TransferToLogbook.d.ts +23 -3
- package/src/components/TransferToLogbook.js +18 -0
- package/src/components/TwoOptionModal.d.ts +12 -1
- package/src/components/TwoOptionModal.js +3 -3
- package/src/components/activity/Activity.d.ts +21 -5
- package/src/components/activity/Activity.js +14 -0
- package/src/components/activity/ActivityIcon.d.ts +15 -0
- package/src/components/activity/ActivityIcon.js +14 -1
- package/src/components/activity/ActivityIntensity.d.ts +11 -4
- package/src/components/activity/ActivityIntensity.js +7 -0
- package/src/components/mood/Emotion.d.ts +26 -1
- package/src/components/mood/Emotion.js +20 -0
- package/src/components/mood/MoodIcon.d.ts +28 -2
- package/src/components/mood/MoodIcon.js +20 -2
- package/src/locale/i18nUtils.d.ts +13 -0
- package/src/locale/i18nUtils.js +13 -0
- package/src/types/enum.d.ts +10 -0
- package/src/types/enum.js +9 -0
- package/src/types/types.d.ts +9 -7
- package/src/utils/AttentionMessages.d.ts +65 -0
- package/src/utils/AttentionMessages.js +65 -1
- package/src/utils/Constants.d.ts +23 -0
- package/src/utils/Constants.js +23 -0
- package/src/utils/RecommendationError.d.ts +29 -0
- package/src/utils/RecommendationError.js +29 -0
- package/src/utils/RecommendationUtils.d.ts +98 -6
- package/src/utils/RecommendationUtils.js +92 -0
- package/src/utils/Translations.d.ts +7 -0
- package/src/utils/Translations.js +7 -0
- package/src/utils/Utils.d.ts +92 -0
- package/src/utils/Utils.js +92 -0
- package/src/utils/Validations.d.ts +232 -9
- package/src/utils/Validations.js +225 -2
- 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
|
|
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
|
|
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"> </span>
|
|
212
|
+
<span class="cline-any cline-neutral"> </span>
|
|
213
|
+
<span class="cline-any cline-neutral"> </span>
|
|
214
|
+
<span class="cline-any cline-neutral"> </span>
|
|
215
|
+
<span class="cline-any cline-neutral"> </span>
|
|
216
|
+
<span class="cline-any cline-neutral"> </span>
|
|
217
|
+
<span class="cline-any cline-neutral"> </span>
|
|
218
|
+
<span class="cline-any cline-neutral"> </span>
|
|
205
219
|
<span class="cline-any cline-neutral"> </span>
|
|
206
220
|
<span class="cline-any cline-neutral"> </span>
|
|
207
221
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -345,7 +359,15 @@
|
|
|
345
359
|
<span class="cline-any cline-neutral"> </span>
|
|
346
360
|
<span class="cline-any cline-yes">69x</span>
|
|
347
361
|
<span class="cline-any cline-neutral"> </span>
|
|
348
|
-
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import {
|
|
362
|
+
<span class="cline-any cline-neutral"> </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
|
|
|
358
379
|
const ActivityEnum = Activity.Enums.ActivityEnum;
|
|
359
380
|
const ActivityIntensity = Activity.Enums.ActivityIntensity;
|
|
@@ -388,7 +409,7 @@ export function getRecommendationProps(partials?: Partial<IRecommendationProp
|
|
|
388
409
|
};
|
|
389
410
|
}
|
|
390
411
|
|
|
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
|
|
|
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
|
|
|
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():
|
|
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
|
|
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
|
|
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"> </span>
|
|
153
|
+
<span class="cline-any cline-neutral"> </span>
|
|
154
|
+
<span class="cline-any cline-neutral"> </span>
|
|
155
|
+
<span class="cline-any cline-neutral"> </span>
|
|
150
156
|
<span class="cline-any cline-neutral"> </span>
|
|
151
157
|
<span class="cline-any cline-neutral"> </span>
|
|
152
158
|
<span class="cline-any cline-neutral"> </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
|
|
|
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
|
|
|
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<IProps> {
|
|
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
|
<React.Fragment>
|
|
@@ -283,7 +292,7 @@ export default class Header extends React.Component<IProps> {
|
|
|
283
292
|
}
|
|
284
293
|
}
|
|
285
294
|
|
|
286
|
-
|
|
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
|
|
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
|
|
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"> </span>
|
|
207
|
+
<span class="cline-any cline-neutral"> </span>
|
|
208
|
+
<span class="cline-any cline-neutral"> </span>
|
|
209
|
+
<span class="cline-any cline-neutral"> </span>
|
|
210
|
+
<span class="cline-any cline-neutral"> </span>
|
|
211
|
+
<span class="cline-any cline-neutral"> </span>
|
|
212
|
+
<span class="cline-any cline-neutral"> </span>
|
|
213
|
+
<span class="cline-any cline-neutral"> </span>
|
|
214
|
+
<span class="cline-any cline-neutral"> </span>
|
|
215
|
+
<span class="cline-any cline-neutral"> </span>
|
|
216
|
+
<span class="cline-any cline-neutral"> </span>
|
|
217
|
+
<span class="cline-any cline-neutral"> </span>
|
|
218
|
+
<span class="cline-any cline-neutral"> </span>
|
|
219
|
+
<span class="cline-any cline-neutral"> </span>
|
|
220
|
+
<span class="cline-any cline-neutral"> </span>
|
|
221
|
+
<span class="cline-any cline-neutral"> </span>
|
|
222
|
+
<span class="cline-any cline-neutral"> </span>
|
|
179
223
|
<span class="cline-any cline-neutral"> </span>
|
|
180
224
|
<span class="cline-any cline-neutral"> </span>
|
|
181
225
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -200,6 +244,14 @@
|
|
|
200
244
|
<span class="cline-any cline-yes">410x</span>
|
|
201
245
|
<span class="cline-any cline-neutral"> </span>
|
|
202
246
|
<span class="cline-any cline-neutral"> </span>
|
|
247
|
+
<span class="cline-any cline-neutral"> </span>
|
|
248
|
+
<span class="cline-any cline-neutral"> </span>
|
|
249
|
+
<span class="cline-any cline-neutral"> </span>
|
|
250
|
+
<span class="cline-any cline-neutral"> </span>
|
|
251
|
+
<span class="cline-any cline-neutral"> </span>
|
|
252
|
+
<span class="cline-any cline-neutral"> </span>
|
|
253
|
+
<span class="cline-any cline-neutral"> </span>
|
|
254
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
210
262
|
<span class="cline-any cline-neutral"> </span>
|
|
211
263
|
<span class="cline-any cline-neutral"> </span>
|
|
264
|
+
<span class="cline-any cline-neutral"> </span>
|
|
265
|
+
<span class="cline-any cline-neutral"> </span>
|
|
266
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
@@ -238,6 +293,7 @@
|
|
|
238
293
|
<span class="cline-any cline-neutral"> </span>
|
|
239
294
|
<span class="cline-any cline-neutral"> </span>
|
|
240
295
|
<span class="cline-any cline-neutral"> </span>
|
|
296
|
+
<span class="cline-any cline-neutral"> </span>
|
|
241
297
|
<span class="cline-any cline-yes">6x</span>
|
|
242
298
|
<span class="cline-any cline-neutral"> </span>
|
|
243
299
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -303,14 +359,30 @@ import { BORDER_COLOUR_GREY } from "../utils/Constants";
|
|
|
303
359
|
import { Utils } from "../utils/Utils";
|
|
304
360
|
|
|
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
|
|
|
374
|
+
/** A standard panel to display some data that the user entered. */
|
|
313
375
|
export default class InfoBars extends React.Component<IProps> {
|
|
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 => {
|
|
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<IProps> {
|
|
|
318
390
|
return value ?? (showNullAsDash ? nullPlaceholder : `0`);
|
|
319
391
|
};
|
|
320
392
|
|
|
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 => {
|
|
322
402
|
const { unit } = this.props;
|
|
323
403
|
if (!unit) {
|
|
@@ -326,6 +406,9 @@ export default class InfoBars extends React.Component<IProps> {
|
|
|
326
406
|
return unit === i18n._(t`units`) ? unit : Utils.formatUnit(unit as BloodGlucoseUnit | BloodKetonesUnit);
|
|
327
407
|
};
|
|
328
408
|
|
|
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<IProps> {
|
|
|
356
439
|
}
|
|
357
440
|
}
|
|
358
441
|
|
|
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
|
|
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
|
|
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"> </span>
|
|
223
|
+
<span class="cline-any cline-neutral"> </span>
|
|
224
|
+
<span class="cline-any cline-neutral"> </span>
|
|
225
|
+
<span class="cline-any cline-neutral"> </span>
|
|
226
|
+
<span class="cline-any cline-neutral"> </span>
|
|
227
|
+
<span class="cline-any cline-neutral"> </span>
|
|
228
|
+
<span class="cline-any cline-neutral"> </span>
|
|
229
|
+
<span class="cline-any cline-neutral"> </span>
|
|
230
|
+
<span class="cline-any cline-neutral"> </span>
|
|
231
|
+
<span class="cline-any cline-neutral"> </span>
|
|
232
|
+
<span class="cline-any cline-neutral"> </span>
|
|
233
|
+
<span class="cline-any cline-neutral"> </span>
|
|
234
|
+
<span class="cline-any cline-neutral"> </span>
|
|
235
|
+
<span class="cline-any cline-neutral"> </span>
|
|
236
|
+
<span class="cline-any cline-neutral"> </span>
|
|
237
|
+
<span class="cline-any cline-neutral"> </span>
|
|
238
|
+
<span class="cline-any cline-neutral"> </span>
|
|
239
|
+
<span class="cline-any cline-neutral"> </span>
|
|
240
|
+
<span class="cline-any cline-neutral"> </span>
|
|
241
|
+
<span class="cline-any cline-neutral"> </span>
|
|
159
242
|
<span class="cline-any cline-neutral"> </span>
|
|
160
243
|
<span class="cline-any cline-neutral"> </span>
|
|
161
244
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -182,6 +265,14 @@
|
|
|
182
265
|
<span class="cline-any cline-neutral"> </span>
|
|
183
266
|
<span class="cline-any cline-neutral"> </span>
|
|
184
267
|
<span class="cline-any cline-neutral"> </span>
|
|
268
|
+
<span class="cline-any cline-neutral"> </span>
|
|
269
|
+
<span class="cline-any cline-neutral"> </span>
|
|
270
|
+
<span class="cline-any cline-neutral"> </span>
|
|
271
|
+
<span class="cline-any cline-neutral"> </span>
|
|
272
|
+
<span class="cline-any cline-neutral"> </span>
|
|
273
|
+
<span class="cline-any cline-neutral"> </span>
|
|
274
|
+
<span class="cline-any cline-neutral"> </span>
|
|
275
|
+
<span class="cline-any cline-neutral"> </span>
|
|
185
276
|
<span class="cline-any cline-yes">143x</span>
|
|
186
277
|
<span class="cline-any cline-neutral"> </span>
|
|
187
278
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -193,6 +284,20 @@
|
|
|
193
284
|
<span class="cline-any cline-neutral"> </span>
|
|
194
285
|
<span class="cline-any cline-neutral"> </span>
|
|
195
286
|
<span class="cline-any cline-neutral"> </span>
|
|
287
|
+
<span class="cline-any cline-neutral"> </span>
|
|
288
|
+
<span class="cline-any cline-neutral"> </span>
|
|
289
|
+
<span class="cline-any cline-neutral"> </span>
|
|
290
|
+
<span class="cline-any cline-neutral"> </span>
|
|
291
|
+
<span class="cline-any cline-neutral"> </span>
|
|
292
|
+
<span class="cline-any cline-neutral"> </span>
|
|
293
|
+
<span class="cline-any cline-neutral"> </span>
|
|
294
|
+
<span class="cline-any cline-neutral"> </span>
|
|
295
|
+
<span class="cline-any cline-neutral"> </span>
|
|
296
|
+
<span class="cline-any cline-neutral"> </span>
|
|
297
|
+
<span class="cline-any cline-neutral"> </span>
|
|
298
|
+
<span class="cline-any cline-neutral"> </span>
|
|
299
|
+
<span class="cline-any cline-neutral"> </span>
|
|
300
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
208
313
|
<span class="cline-any cline-neutral"> </span>
|
|
314
|
+
<span class="cline-any cline-neutral"> </span>
|
|
315
|
+
<span class="cline-any cline-neutral"> </span>
|
|
316
|
+
<span class="cline-any cline-neutral"> </span>
|
|
317
|
+
<span class="cline-any cline-neutral"> </span>
|
|
318
|
+
<span class="cline-any cline-neutral"> </span>
|
|
319
|
+
<span class="cline-any cline-neutral"> </span>
|
|
320
|
+
<span class="cline-any cline-neutral"> </span>
|
|
321
|
+
<span class="cline-any cline-neutral"> </span>
|
|
322
|
+
<span class="cline-any cline-neutral"> </span>
|
|
323
|
+
<span class="cline-any cline-neutral"> </span>
|
|
324
|
+
<span class="cline-any cline-neutral"> </span>
|
|
325
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
220
337
|
<span class="cline-any cline-neutral"> </span>
|
|
338
|
+
<span class="cline-any cline-neutral"> </span>
|
|
339
|
+
<span class="cline-any cline-neutral"> </span>
|
|
340
|
+
<span class="cline-any cline-neutral"> </span>
|
|
341
|
+
<span class="cline-any cline-neutral"> </span>
|
|
342
|
+
<span class="cline-any cline-neutral"> </span>
|
|
343
|
+
<span class="cline-any cline-neutral"> </span>
|
|
344
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
225
349
|
<span class="cline-any cline-neutral"> </span>
|
|
226
350
|
<span class="cline-any cline-neutral"> </span>
|
|
351
|
+
<span class="cline-any cline-neutral"> </span>
|
|
352
|
+
<span class="cline-any cline-neutral"> </span>
|
|
353
|
+
<span class="cline-any cline-neutral"> </span>
|
|
354
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
@@ -256,29 +384,56 @@
|
|
|
256
384
|
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import React from "react";
|
|
257
385
|
import { StyleSheet, TextInput } from "react-native";
|
|
258
386
|
|
|
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: () => 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
|
|
|
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
|
|
|
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<IProps, IState> {
|
|
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
|
|
|
424
|
+
/** Initialise the state value variable with `0` */
|
|
278
425
|
public state: IState = {
|
|
279
426
|
value: `0`,
|
|
280
427
|
};
|
|
281
428
|
|
|
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<IProps, ISt
|
|
|
291
446
|
});
|
|
292
447
|
}
|
|
293
448
|
|
|
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
|
+
|
|
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 => {
|
|
295
464
|
const replaced = text.replace(/\,/g, `.`).replace(/(\d*\.\d*).*/, `$1`);
|
|
296
465
|
const round = (value: string): string => {
|
|
@@ -304,6 +473,18 @@ export default class InvisibleNumberInput extends React.Component<IProps, ISt
|
|
|
304
473
|
return `0`;
|
|
305
474
|
};
|
|
306
475
|
|
|
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 => {
|
|
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<IProps, ISt
|
|
|
316
497
|
this.props.partialInput?.(`${replacedSeparator}`);
|
|
317
498
|
};
|
|
318
499
|
|
|
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 => {
|
|
320
508
|
const cleaned = this.cleanInput(this.state.value);
|
|
321
509
|
this.props.onEnd?.(Number(cleaned));
|
|
322
510
|
};
|
|
323
511
|
|
|
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
|
|
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>
|