@transferwise/components 0.0.0-experimental-322d55c → 0.0.0-experimental-cb4aafe

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.
@@ -1 +1 @@
1
- {"version":3,"file":"SegmentedControl.d.ts","sourceRoot":"","sources":["../../../src/segmentedControl/SegmentedControl.tsx"],"names":[],"mappings":";AAMA,KAAK,WAAW,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhE,KAAK,OAAO,GAAG,WAAW,GAAG;IAAE,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAClD,KAAK,mBAAmB,GAAG,WAAW,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9D,MAAM,MAAM,QAAQ,GAAG,SAAS,OAAO,EAAE,GAAG,SAAS,mBAAmB,EAAE,CAAC;AAE3E,KAAK,yBAAyB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,CAAC;AAEF,KAAK,yBAAyB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAC1C,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,yBAAyB,GAC3D,CAAC,yBAAyB,GAAG,0BAA0B,CAAC,CAAC;AAE3D,QAAA,MAAM,gBAAgB,sDAMnB,qBAAqB,gCAsIvB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"SegmentedControl.d.ts","sourceRoot":"","sources":["../../../src/segmentedControl/SegmentedControl.tsx"],"names":[],"mappings":";AAMA,KAAK,WAAW,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhE,KAAK,OAAO,GAAG,WAAW,GAAG;IAAE,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAClD,KAAK,mBAAmB,GAAG,WAAW,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9D,MAAM,MAAM,QAAQ,GAAG,SAAS,OAAO,EAAE,GAAG,SAAS,mBAAmB,EAAE,CAAC;AAE3E,KAAK,yBAAyB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,CAAC;AAEF,KAAK,yBAAyB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAC1C,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,yBAAyB,GAC3D,CAAC,yBAAyB,GAAG,0BAA0B,CAAC,CAAC;AAE3D,QAAA,MAAM,gBAAgB,sDAMnB,qBAAqB,gCAuIvB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@transferwise/components",
3
- "version": "0.0.0-experimental-322d55c",
3
+ "version": "0.0.0-experimental-cb4aafe",
4
4
  "description": "Neptune React components",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -1,5 +1,7 @@
1
1
  import '@testing-library/jest-dom';
2
- import { render, screen, userEvent } from '../test-utils';
2
+ import React from 'react';
3
+
4
+ import { render, screen, userEvent, waitFor } from '../test-utils';
3
5
 
4
6
  import SegmentedControl, { SegmentedControlProps } from './SegmentedControl';
5
7
 
@@ -86,6 +88,30 @@ describe('SegmentedControl', () => {
86
88
  expect(onChange).toHaveBeenCalledWith('reporting');
87
89
  });
88
90
 
91
+ it('does not repeatedly call the onChange, when the provided onChange prop changes on every render of its parent component', async () => {
92
+ let onChangeCallCount = 0;
93
+
94
+ const ParentComponent = () => {
95
+ const [_, simulateRerender] = React.useState({});
96
+
97
+ // new function is created on every render
98
+ const onChange = () => {
99
+ onChangeCallCount++;
100
+ simulateRerender({});
101
+ };
102
+
103
+ return <SegmentedControl {...defaultProps} onChange={onChange} />;
104
+ };
105
+
106
+ const { rerender } = render(<ParentComponent />);
107
+
108
+ rerender(<ParentComponent />);
109
+
110
+ await waitFor(() => {
111
+ expect(onChangeCallCount).toBe(1);
112
+ });
113
+ });
114
+
89
115
  it('throws error if user tries to add too many segments', () => {
90
116
  expect(() => {
91
117
  renderSegmentedControl({
@@ -87,7 +87,9 @@ const SegmentedControl = ({
87
87
 
88
88
  useEffect(() => {
89
89
  onChange(selectedValue);
90
- }, [onChange, selectedValue]);
90
+ // only call onChange once when the component mounts, to maintain previous behavior
91
+ // eslint-disable-next-line react-hooks/exhaustive-deps
92
+ }, []);
91
93
 
92
94
  return (
93
95
  <div
@@ -103,8 +105,13 @@ const SegmentedControl = ({
103
105
  })}
104
106
  role={mode !== 'input' ? 'tablist' : undefined}
105
107
  >
106
- {segmentsWithRefs.map((segment) =>
107
- mode === 'input' ? (
108
+ {segmentsWithRefs.map((segment) => {
109
+ const onSelect = () => {
110
+ setAnimate(true);
111
+ setSelectedValue(segment.value);
112
+ onChange(segment.value);
113
+ };
114
+ return mode === 'input' ? (
108
115
  <label
109
116
  ref={segment.ref as React.RefObject<HTMLLabelElement>}
110
117
  key={segment.id}
@@ -120,10 +127,7 @@ const SegmentedControl = ({
120
127
  name={name}
121
128
  value={segment.value}
122
129
  checked={selectedValue === segment.value}
123
- onChange={() => {
124
- setAnimate(true);
125
- setSelectedValue(segment.value);
126
- }}
130
+ onChange={onSelect}
127
131
  />
128
132
  <Body
129
133
  className="segmented-control__text"
@@ -149,10 +153,7 @@ const SegmentedControl = ({
149
153
  className={classNames('segmented-control__segment', 'segmented-control__button', {
150
154
  'segmented-control__selected-segment': selectedValue === segment.value,
151
155
  })}
152
- onClick={() => {
153
- setAnimate(true);
154
- setSelectedValue(segment.value);
155
- }}
156
+ onClick={onSelect}
156
157
  >
157
158
  <Body
158
159
  as="span"
@@ -166,8 +167,8 @@ const SegmentedControl = ({
166
167
  {segment.label}
167
168
  </Body>
168
169
  </button>
169
- ),
170
- )}
170
+ );
171
+ })}
171
172
  </div>
172
173
  </div>
173
174
  );