Skip to content

Commit 87e58ab

Browse files
committed
fix: use mutators for lastSyncValue
1 parent 3533e2f commit 87e58ab

5 files changed

Lines changed: 19 additions & 37 deletions

File tree

‎package.json‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
"classnames": "^2.3.1",
5454
"expr-eval": "^2.0.2",
5555
"final-form": "^4.20.6",
56+
"final-form-set-field-data": "^1.0.2",
5657
"history": "^5.1.0",
5758
"html-react-parser": "^1.4.8",
5859
"idb-keyval": "^6.1.0",

‎src/data-workspace/data-entry-cell/inner-wrapper.js‎

Lines changed: 6 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { IconMore16, colors } from '@dhis2/ui'
22
import { useIsMutating } from '@tanstack/react-query'
33
import cx from 'classnames'
44
import PropTypes from 'prop-types'
5-
import React, { useEffect } from 'react'
5+
import React from 'react'
66
import { useField } from 'react-final-form'
77
import {
88
mutationKeys as dataValueMutationKeys,
@@ -50,8 +50,6 @@ export function InnerWrapper({
5050
fieldname,
5151
deId,
5252
cocId,
53-
syncStatus,
54-
setSyncStatus,
5553
}) {
5654
const hasComment = useValueStore((state) =>
5755
state.hasComment({
@@ -63,34 +61,17 @@ export function InnerWrapper({
6361
const highlighted = item && deId === item.de.id && cocId === item.coc.id
6462
const {
6563
input: { value },
66-
meta: { invalid, active, dirty },
64+
meta: { invalid, active, data },
6765
} = useField(fieldname, {
6866
subscription: {
6967
value: true,
7068
invalid: true,
7169
active: true,
7270
dirty: true,
71+
data: true,
7372
},
7473
})
75-
useEffect(
76-
() =>
77-
setSyncStatus((prev) => ({
78-
...prev,
79-
lastSyncedValue: value,
80-
})),
81-
// eslint-disable-next-line react-hooks/exhaustive-deps
82-
[setSyncStatus]
83-
)
84-
// clear sync-status when field changes
85-
useEffect(() => {
86-
const { synced, lastSyncedValue } = syncStatus
87-
if (synced && lastSyncedValue !== value) {
88-
setSyncStatus((prev) => ({ ...prev, synced: false }))
89-
} else if (!synced && dirty && lastSyncedValue === value) {
90-
setSyncStatus((prev) => ({ ...prev, synced: true }))
91-
}
92-
}, [value, syncStatus, setSyncStatus, dirty])
93-
74+
const synced = data.lastSyncedValue === value
9475
// Detect if this field is sending data
9576
const dataValueParams = useDataValueParams({ deId, cocId })
9677
const activeMutations = useIsMutating({
@@ -101,7 +82,7 @@ export function InnerWrapper({
10182
// see https://dhis2.atlassian.net/browse/TECH-1316
10283
const cellStateClassName = invalid
10384
? styles.invalid
104-
: activeMutations === 0 && syncStatus.synced
85+
: activeMutations === 0 && synced
10586
? styles.synced
10687
: null
10788

@@ -117,7 +98,7 @@ export function InnerWrapper({
11798
{children}
11899
<SyncStatusIndicator
119100
isLoading={activeMutations > 0}
120-
isSynced={syncStatus.synced}
101+
isSynced={synced}
121102
/>
122103
<CommentIndicator hasComment={hasComment} />
123104
</div>
@@ -130,9 +111,4 @@ InnerWrapper.propTypes = {
130111
disabled: PropTypes.bool,
131112
fieldname: PropTypes.string,
132113
locked: PropTypes.bool,
133-
setSyncStatus: PropTypes.func,
134-
syncStatus: PropTypes.shape({
135-
lastSyncedValue: PropTypes.any,
136-
synced: PropTypes.bool,
137-
}),
138114
}

‎src/data-workspace/final-form-wrapper.js‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import setFieldData from 'final-form-set-field-data'
12
import PropTypes from 'prop-types'
23
import React, { useState } from 'react'
34
import { Form } from 'react-final-form'
@@ -37,6 +38,7 @@ export function FinalFormWrapper({ children, dataValueSet }) {
3738
initialValues={initialValues}
3839
subscriptions={subscriptions}
3940
keepDirtyOnReinitialize
41+
mutators={{ setFieldData }}
4042
>
4143
{() => children}
4244
</Form>

‎src/data-workspace/inputs/generic-input.js‎

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import cx from 'classnames'
22
import PropTypes from 'prop-types'
33
import React from 'react'
4-
import { useField } from 'react-final-form'
4+
import { useField, useForm } from 'react-final-form'
55
import {
66
NUMBER_TYPES,
77
VALUE_TYPES,
@@ -25,8 +25,6 @@ export const GenericInput = ({
2525
fieldname,
2626
deId,
2727
cocId,
28-
setSyncStatus,
29-
syncStatus,
3028
valueType,
3129
onKeyDown,
3230
onFocus,
@@ -47,9 +45,10 @@ export const GenericInput = ({
4745
return value.trim()
4846
}
4947
}
48+
const form = useForm()
5049
const { input, meta } = useField(fieldname, {
5150
validate: validateByValueTypeWithLimits(valueType, limits),
52-
subscription: { value: true, dirty: true, valid: true },
51+
subscription: { value: true, dirty: true, valid: true, data: true },
5352
format: formatValue,
5453
formatOnBlur: true,
5554
// This is require to ensure form is validated on first page load
@@ -65,8 +64,7 @@ export const GenericInput = ({
6564
{ value: value || '' },
6665
{
6766
onSuccess: () => {
68-
setSyncStatus({
69-
synced: true,
67+
form.mutators.setFieldData(fieldname, {
7068
lastSyncedValue: value,
7169
})
7270
},
@@ -78,7 +76,7 @@ export const GenericInput = ({
7876
const { value } = input
7977
const formattedValue = formatValue(value)
8078
const { valid } = meta
81-
if (valid && formattedValue !== syncStatus.lastSyncedValue) {
79+
if (valid && formattedValue !== meta.data.lastSyncedValue) {
8280
syncData(formattedValue)
8381
}
8482
}

‎yarn.lock‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8446,6 +8446,11 @@ filter-obj@^1.1.0:
84468446
resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b"
84478447
integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==
84488448

8449+
final-form-set-field-data@^1.0.2:
8450+
version "1.0.2"
8451+
resolved "https://registry.yarnpkg.com/final-form-set-field-data/-/final-form-set-field-data-1.0.2.tgz#ce19095af5d607148c1e6ce3403d75d40223d848"
8452+
integrity sha512-gAnENimyQ5GW3OEGca5pbwm4lYshW2orzfBlPUYqzcm7ZxkQrVO8FqCAgEcCM+Rq9U1OU0q+D+UkqETvvDY6jw==
8453+
84498454
final-form@^4.20.2, final-form@^4.20.6:
84508455
version "4.20.7"
84518456
resolved "https://registry.yarnpkg.com/final-form/-/final-form-4.20.7.tgz#e7e2eb5fd952951d4fe6153d46043da2d68b207e"

0 commit comments

Comments
 (0)