From 27a05da9ab2b46f3d02d01adc2a5c7c3ac837515 Mon Sep 17 00:00:00 2001 From: Abhishek Sharma Date: Sun, 6 Oct 2024 21:28:14 +0700 Subject: [PATCH 1/3] getPickerInitialValue method for better redability and reduced redundency --- src/components/hv-picker-field/index.ios.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/components/hv-picker-field/index.ios.tsx b/src/components/hv-picker-field/index.ios.tsx index e8f82541a..9f652a126 100644 --- a/src/components/hv-picker-field/index.ios.tsx +++ b/src/components/hv-picker-field/index.ios.tsx @@ -34,21 +34,21 @@ export default class HvPickerField extends PureComponent { return getNameValueFormInputValues(element); }; + getPickerInitialValue = (): string => { const value = this.getValue(); const pickerItems: Element[] = this.getPickerItems(); - if ( - pickerItems - .map((item: Element) => item.getAttribute('value')) - .includes(value) - ) { + + const valueExists = pickerItems.some(item => item.getAttribute('value') === value); + + if (valueExists) { return value; } - if (pickerItems.length > 0) { - return pickerItems[0].getAttribute('value') || ''; - } - return ''; + + return pickerItems.length > 0 ? + pickerItems[0].getAttribute('value') || '' : ''; }; + /** * Returns a string representing the value in the field. From 6359dc82e42d54c0c74aa249c0b98875ecc9c1c7 Mon Sep 17 00:00:00 2001 From: Abhishek Sharma Date: Mon, 21 Oct 2024 12:40:00 +0700 Subject: [PATCH 2/3] src/components/hv-picker-field/index.ios.tsx --- src/components/hv-picker-field/index.ios.tsx | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/components/hv-picker-field/index.ios.tsx b/src/components/hv-picker-field/index.ios.tsx index 9f652a126..96d9e60b1 100644 --- a/src/components/hv-picker-field/index.ios.tsx +++ b/src/components/hv-picker-field/index.ios.tsx @@ -34,21 +34,19 @@ export default class HvPickerField extends PureComponent { return getNameValueFormInputValues(element); }; - getPickerInitialValue = (): string => { const value = this.getValue(); const pickerItems: Element[] = this.getPickerItems(); - - const valueExists = pickerItems.some(item => item.getAttribute('value') === value); - + const valueExists = pickerItems.some( + item => item.getAttribute('value') === value, + ); if (valueExists) { return value; } - - return pickerItems.length > 0 ? - pickerItems[0].getAttribute('value') || '' : ''; + return pickerItems.length > 0 + ? pickerItems[0].getAttribute('value') || '' + : ''; }; - /** * Returns a string representing the value in the field. From 4f4011180e3452b5412bbd61d335dbd7d43014b0 Mon Sep 17 00:00:00 2001 From: Abhishek Sharma Date: Wed, 23 Oct 2024 11:20:19 +0700 Subject: [PATCH 3/3] Cache the value-label pairs when the picker items are fetched --- src/components/hv-picker-field/index.ios.tsx | 47 +++++++++++--------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/src/components/hv-picker-field/index.ios.tsx b/src/components/hv-picker-field/index.ios.tsx index 96d9e60b1..507667701 100644 --- a/src/components/hv-picker-field/index.ios.tsx +++ b/src/components/hv-picker-field/index.ios.tsx @@ -24,10 +24,10 @@ import { View } from 'react-native'; * opens a system dialog. */ export default class HvPickerField extends PureComponent { - static namespaceURI = Namespaces.HYPERVIEW; + pickerItemsCache: Array<{ label: string | null | undefined; value: string | null | undefined }> | null = null; + static namespaceURI = Namespaces.HYPERVIEW; static localName = LOCAL_NAME.PICKER_FIELD; - static localNameAliases = []; static getFormInputValues = (element: Element): Array<[string, string]> => { @@ -53,32 +53,35 @@ export default class HvPickerField extends PureComponent { */ getValue = (): string => this.props.element.getAttribute('value') || ''; + /** + * + * Cache the value-label pairs when the picker items are fetched. + */ + getPickerItemsCache = () => { + if (!this.pickerItemsCache) { + const pickerItemElements = this.props.element.getElementsByTagNameNS( + Namespaces.HYPERVIEW, + LOCAL_NAME.PICKER_ITEM, + ); + this.pickerItemsCache = Array.from(pickerItemElements).map(item => ({ + value: item.getAttribute('value'), + label: item.getAttribute('label'), + })); + } + return this.pickerItemsCache; + }; + /** * Gets the label from the picker items for the given value. * If the value doesn't have a picker item, returns null. */ - getLabelForValue = (value: DOMString): string | null | undefined => { - const pickerItemElements: HTMLCollectionOf = this.props.element.getElementsByTagNameNS( - Namespaces.HYPERVIEW, - LOCAL_NAME.PICKER_ITEM, + getLabelForValue = (value: DOMString): string | null => { + const item = this.getPickerItemsCache().find( + item => item.value === value, ); - - let item: Element | null | undefined = null; - for (let i = 0; i < pickerItemElements.length; i += 1) { - const pickerItemElement: - | Element - | null - | undefined = pickerItemElements.item(i); - if ( - pickerItemElement && - pickerItemElement.getAttribute('value') === value - ) { - item = pickerItemElement; - break; - } - } - return item ? item.getAttribute('label') : null; + return item ? item.label ?? null : null; }; + /** * Returns a string representing the value in the picker.