From 3418f7346e38032540a8a5f0c696c65005ac740d Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 30 Jan 2026 22:57:18 +0000 Subject: [PATCH 1/2] Optimize PlatformPicker with React.memo to prevent unnecessary re-renders Co-authored-by: xRahul <1639945+xRahul@users.noreply.github.com> --- __tests__/PlatformPickerBenchmark.test.js | 58 +++++++++++++++++++++++ src/components/PlatformPicker.js | 2 +- 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 __tests__/PlatformPickerBenchmark.test.js diff --git a/__tests__/PlatformPickerBenchmark.test.js b/__tests__/PlatformPickerBenchmark.test.js new file mode 100644 index 0000000..c830ce3 --- /dev/null +++ b/__tests__/PlatformPickerBenchmark.test.js @@ -0,0 +1,58 @@ +import React from 'react'; +import renderer from 'react-test-renderer'; +import PlatformPicker from '../src/components/PlatformPicker'; + +const mockPickerRender = jest.fn(); + +jest.mock('react-native', () => { + const React = require('react'); + const View = props => React.createElement('View', props, props.children); + const Text = props => React.createElement('Text', props, props.children); + const Picker = props => { + mockPickerRender(); + return React.createElement('Picker', props, props.children); + }; + Picker.Item = props => React.createElement('Picker.Item', props); + + return { + View, + Text, + Picker, + StyleSheet: { + create: obj => obj, + flatten: obj => obj, + }, + Platform: { + OS: 'ios', + select: obj => obj.ios, + } + }; +}); + +describe('PlatformPicker Performance', () => { + test('renders repeatedly', () => { + mockPickerRender.mockClear(); + const handler = () => {}; + const selectedValue = 'mobile'; + + // Initial render + const component = renderer.create( + + ); + + expect(mockPickerRender).toHaveBeenCalledTimes(1); + + const start = Date.now(); + + // Update 5000 times + for (let i = 0; i < 5000; i++) { + component.update( + + ); + } + + const end = Date.now(); + console.log(`Benchmark Duration: ${end - start}ms`); + console.log(`Picker Render Count: ${mockPickerRender.mock.calls.length}`); + }); +}); diff --git a/src/components/PlatformPicker.js b/src/components/PlatformPicker.js index ee7d28e..7ff2394 100644 --- a/src/components/PlatformPicker.js +++ b/src/components/PlatformPicker.js @@ -22,4 +22,4 @@ const PlatformPicker = ({selectedValue, onValueChange}) => { ); }; -export default PlatformPicker; +export default React.memo(PlatformPicker); From 810441bf3f0d9807608add515c52fdf6281720f1 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 30 Jan 2026 22:59:48 +0000 Subject: [PATCH 2/2] Fix lint errors in PlatformPickerBenchmark test Co-authored-by: xRahul <1639945+xRahul@users.noreply.github.com> --- __tests__/PlatformPickerBenchmark.test.js | 29 +++++++++++++---------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/__tests__/PlatformPickerBenchmark.test.js b/__tests__/PlatformPickerBenchmark.test.js index c830ce3..b384d35 100644 --- a/__tests__/PlatformPickerBenchmark.test.js +++ b/__tests__/PlatformPickerBenchmark.test.js @@ -5,27 +5,27 @@ import PlatformPicker from '../src/components/PlatformPicker'; const mockPickerRender = jest.fn(); jest.mock('react-native', () => { - const React = require('react'); - const View = props => React.createElement('View', props, props.children); - const Text = props => React.createElement('Text', props, props.children); + const ReactLib = require('react'); + const View = props => ReactLib.createElement('View', props, props.children); + const Text = props => ReactLib.createElement('Text', props, props.children); const Picker = props => { - mockPickerRender(); - return React.createElement('Picker', props, props.children); + mockPickerRender(); + return ReactLib.createElement('Picker', props, props.children); }; - Picker.Item = props => React.createElement('Picker.Item', props); + Picker.Item = props => ReactLib.createElement('Picker.Item', props); return { View, Text, Picker, StyleSheet: { - create: obj => obj, - flatten: obj => obj, + create: obj => obj, + flatten: obj => obj, }, Platform: { OS: 'ios', select: obj => obj.ios, - } + }, }; }); @@ -37,7 +37,7 @@ describe('PlatformPicker Performance', () => { // Initial render const component = renderer.create( - + , ); expect(mockPickerRender).toHaveBeenCalledTimes(1); @@ -46,9 +46,12 @@ describe('PlatformPicker Performance', () => { // Update 5000 times for (let i = 0; i < 5000; i++) { - component.update( - - ); + component.update( + , + ); } const end = Date.now();