Skip to content

Commit

Permalink
Merge pull request #8595 from opencrvs/memo-dynamic-options
Browse files Browse the repository at this point in the history
chore: Refactor to only memoize for dynamic selects
  • Loading branch information
tumbledwyer authored Feb 7, 2025
2 parents 68bf3ca + c0b2de8 commit 911bace
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1197,7 +1197,12 @@ export function questionnaireToTemplateFieldTransformer(
if (!offlineCountryConfig) {
return
}
const options = getFieldOptions(field, queryData, offlineCountryConfig)
const options = getFieldOptions(
sectionId,
field,
queryData,
offlineCountryConfig
)
transformedData[sectionId][field.name] =
options
.find((option) => option.value === selectedQuestion.value)
Expand Down
47 changes: 36 additions & 11 deletions packages/client/src/forms/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ import {
BUTTON,
Ii18nButtonFormField,
IRedirectFormField,
REDIRECT
REDIRECT,
SELECT_WITH_DYNAMIC_OPTIONS
} from '@client/forms'
import { IntlShape, MessageDescriptor } from 'react-intl'
import {
Expand Down Expand Up @@ -445,19 +446,43 @@ export const getFieldOptionsSlow = (
}
}

export const getFieldOptions = (
_sectionName: string,
field:
| ISelectFormFieldWithOptions
| ISelectFormFieldWithDynamicOptions
| IDocumentUploaderWithOptionsFormField,
values: IFormSectionData,
offlineCountryConfig: IOfflineData,
declaration?: IFormData
) => {
if (field.type === SELECT_WITH_DYNAMIC_OPTIONS) {
return getMemoisedFieldOptions(
_sectionName,
field,
values,
offlineCountryConfig
)
}

return getFieldOptionsSlow(
_sectionName,
field,
values,
offlineCountryConfig,
declaration
)
}

/** Due to the large location trees with dependencies, generating options for them can be slow. We fix this by memoizing the options */
export const getFieldOptions = memoize(
const getMemoisedFieldOptions = memoize(
getFieldOptionsSlow,
(sectionName, field, values) => {
if (
field.type === SELECT_WITH_OPTIONS ||
field.type === DOCUMENT_UPLOADER_WITH_OPTION
) {
return `field:${sectionName}.${field.name}`
}

const dependencyVal = values[field.dynamicOptions.dependency!] as string
return `field:${sectionName}.${field.name},dependency:${field.dynamicOptions.dependency},dependencyValue:${dependencyVal}`
const dynamicField = field as ISelectFormFieldWithDynamicOptions
const dependencyVal = values[
dynamicField.dynamicOptions.dependency!
] as string
return `field:${sectionName}.${field.name},dependency:${dynamicField.dynamicOptions.dependency},dependencyValue:${dependencyVal}`
}
)

Expand Down

0 comments on commit 911bace

Please sign in to comment.