@react-native/virtualized-lists 0.72.0 → 0.72.1

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.
@@ -84,7 +84,7 @@ function horizontalOrDefault(horizontal: ?boolean) {
84
84
  return horizontal ?? false;
85
85
  }
86
86
 
87
- // initialNumToRenderOrDefault(this.props.initialNumToRenderOrDefault)
87
+ // initialNumToRenderOrDefault(this.props.initialNumToRender)
88
88
  function initialNumToRenderOrDefault(initialNumToRender: ?number) {
89
89
  return initialNumToRender ?? 10;
90
90
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-native/virtualized-lists",
3
- "version": "0.72.0",
3
+ "version": "0.72.1",
4
4
  "description": "Virtualized lists for React Native.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,78 +0,0 @@
1
- /**
2
- * Copyright (c) Meta Platforms, Inc. and affiliates.
3
- *
4
- * This source code is licensed under the MIT license found in the
5
- * LICENSE file in the root directory of this source tree.
6
- *
7
- * @format
8
- * @oncall react_native
9
- */
10
-
11
- 'use strict';
12
-
13
- function expectToBeCalledOnce(fn) {
14
- expect(fn.mock.calls.length).toBe(1);
15
- }
16
-
17
- describe('Batchinator', () => {
18
- const Batchinator = require('../Batchinator');
19
-
20
- it('executes vanilla tasks', () => {
21
- const callback = jest.fn();
22
- const batcher = new Batchinator(callback, 10000);
23
- batcher.schedule();
24
- jest.runAllTimers();
25
- expectToBeCalledOnce(callback);
26
- });
27
-
28
- it('batches up tasks', () => {
29
- const callback = jest.fn();
30
- const batcher = new Batchinator(callback, 10000);
31
- batcher.schedule();
32
- batcher.schedule();
33
- batcher.schedule();
34
- batcher.schedule();
35
- expect(callback).not.toBeCalled();
36
- jest.runAllTimers();
37
- expectToBeCalledOnce(callback);
38
- });
39
-
40
- it('flushes on dispose', () => {
41
- const callback = jest.fn();
42
- const batcher = new Batchinator(callback, 10000);
43
- batcher.schedule();
44
- batcher.schedule();
45
- batcher.dispose();
46
- expectToBeCalledOnce(callback);
47
- jest.runAllTimers();
48
- expectToBeCalledOnce(callback);
49
- });
50
-
51
- it('should call tasks scheduled by the callback', () => {
52
- let batcher = null;
53
- let hasRescheduled = false;
54
- const callback = jest.fn(() => {
55
- if (!hasRescheduled) {
56
- batcher.schedule();
57
- hasRescheduled = true;
58
- }
59
- });
60
- batcher = new Batchinator(callback, 10000);
61
- batcher.schedule();
62
- jest.runAllTimers();
63
- expect(callback.mock.calls.length).toBe(2);
64
- });
65
-
66
- it('does not run callbacks more than once', () => {
67
- const callback = jest.fn();
68
- const batcher = new Batchinator(callback, 10000);
69
- batcher.schedule();
70
- batcher.schedule();
71
- jest.runAllTimers();
72
- expectToBeCalledOnce(callback);
73
- jest.runAllTimers();
74
- expectToBeCalledOnce(callback);
75
- batcher.dispose();
76
- expectToBeCalledOnce(callback);
77
- });
78
- });
@@ -1,188 +0,0 @@
1
- /**
2
- * Copyright (c) Meta Platforms, Inc. and affiliates.
3
- *
4
- * This source code is licensed under the MIT license found in the
5
- * LICENSE file in the root directory of this source tree.
6
- *
7
- * @flow strict
8
- * @format
9
- */
10
-
11
- import {CellRenderMask} from '../CellRenderMask';
12
-
13
- describe('CellRenderMask', () => {
14
- it('throws when constructed with invalid size', () => {
15
- expect(() => new CellRenderMask(-1)).toThrow();
16
- });
17
-
18
- it('allows creation of empty mask', () => {
19
- const renderMask = new CellRenderMask(0);
20
- expect(renderMask.enumerateRegions()).toEqual([]);
21
- });
22
-
23
- it('allows creation of single-cell mask', () => {
24
- const renderMask = new CellRenderMask(1);
25
- expect(renderMask.enumerateRegions()).toEqual([
26
- {first: 0, last: 0, isSpacer: true},
27
- ]);
28
- });
29
-
30
- it('throws when adding invalid cell ranges', () => {
31
- const renderMask = new CellRenderMask(5);
32
-
33
- expect(() => renderMask.addCells({first: -2, last: -1})).toThrow();
34
- expect(() => renderMask.addCells({first: -2, last: 0})).toThrow();
35
- expect(() => renderMask.addCells({first: 0, last: 5})).toThrow();
36
- expect(() => renderMask.addCells({first: 6, last: 7})).toThrow();
37
- });
38
-
39
- it('allows adding single cell at beginning', () => {
40
- const renderMask = new CellRenderMask(5);
41
- renderMask.addCells({first: 0, last: 0});
42
-
43
- expect(renderMask.enumerateRegions()).toEqual([
44
- {first: 0, last: 0, isSpacer: false},
45
- {first: 1, last: 4, isSpacer: true},
46
- ]);
47
- });
48
-
49
- it('allows adding single cell at end', () => {
50
- const renderMask = new CellRenderMask(5);
51
- renderMask.addCells({first: 4, last: 4});
52
-
53
- expect(renderMask.enumerateRegions()).toEqual([
54
- {first: 0, last: 3, isSpacer: true},
55
- {first: 4, last: 4, isSpacer: false},
56
- ]);
57
- });
58
-
59
- it('allows adding single cell in middle', () => {
60
- const renderMask = new CellRenderMask(5);
61
- renderMask.addCells({first: 2, last: 2});
62
-
63
- expect(renderMask.enumerateRegions()).toEqual([
64
- {first: 0, last: 1, isSpacer: true},
65
- {first: 2, last: 2, isSpacer: false},
66
- {first: 3, last: 4, isSpacer: true},
67
- ]);
68
- });
69
-
70
- it('allows marking entire cell range', () => {
71
- const renderMask = new CellRenderMask(5);
72
- renderMask.addCells({first: 0, last: 4});
73
-
74
- expect(renderMask.enumerateRegions()).toEqual([
75
- {first: 0, last: 4, isSpacer: false},
76
- ]);
77
- });
78
-
79
- it('allows adding empty cell range', () => {
80
- const renderMask = new CellRenderMask(5);
81
- renderMask.addCells({first: 0, last: -1});
82
-
83
- expect(renderMask.enumerateRegions()).toEqual([
84
- {first: 0, last: 4, isSpacer: true},
85
- ]);
86
- });
87
-
88
- it('correctly replaces fragmented cell ranges', () => {
89
- const renderMask = new CellRenderMask(10);
90
-
91
- renderMask.addCells({first: 3, last: 3});
92
- renderMask.addCells({first: 5, last: 7});
93
-
94
- expect(renderMask.enumerateRegions()).toEqual([
95
- {first: 0, last: 2, isSpacer: true},
96
- {first: 3, last: 3, isSpacer: false},
97
- {first: 4, last: 4, isSpacer: true},
98
- {first: 5, last: 7, isSpacer: false},
99
- {first: 8, last: 9, isSpacer: true},
100
- ]);
101
-
102
- renderMask.addCells({first: 3, last: 7});
103
-
104
- expect(renderMask.enumerateRegions()).toEqual([
105
- {first: 0, last: 2, isSpacer: true},
106
- {first: 3, last: 7, isSpacer: false},
107
- {first: 8, last: 9, isSpacer: true},
108
- ]);
109
- });
110
-
111
- it('left-expands region', () => {
112
- const renderMask = new CellRenderMask(5);
113
-
114
- renderMask.addCells({first: 3, last: 3});
115
-
116
- expect(renderMask.enumerateRegions()).toEqual([
117
- {first: 0, last: 2, isSpacer: true},
118
- {first: 3, last: 3, isSpacer: false},
119
- {first: 4, last: 4, isSpacer: true},
120
- ]);
121
-
122
- renderMask.addCells({first: 2, last: 3});
123
-
124
- expect(renderMask.enumerateRegions()).toEqual([
125
- {first: 0, last: 1, isSpacer: true},
126
- {first: 2, last: 3, isSpacer: false},
127
- {first: 4, last: 4, isSpacer: true},
128
- ]);
129
- });
130
-
131
- it('right-expands region', () => {
132
- const renderMask = new CellRenderMask(5);
133
-
134
- renderMask.addCells({first: 3, last: 3});
135
-
136
- expect(renderMask.enumerateRegions()).toEqual([
137
- {first: 0, last: 2, isSpacer: true},
138
- {first: 3, last: 3, isSpacer: false},
139
- {first: 4, last: 4, isSpacer: true},
140
- ]);
141
-
142
- renderMask.addCells({first: 3, last: 4});
143
-
144
- expect(renderMask.enumerateRegions()).toEqual([
145
- {first: 0, last: 2, isSpacer: true},
146
- {first: 3, last: 4, isSpacer: false},
147
- ]);
148
- });
149
-
150
- it('left+right expands region', () => {
151
- const renderMask = new CellRenderMask(5);
152
-
153
- renderMask.addCells({first: 3, last: 3});
154
-
155
- expect(renderMask.enumerateRegions()).toEqual([
156
- {first: 0, last: 2, isSpacer: true},
157
- {first: 3, last: 3, isSpacer: false},
158
- {first: 4, last: 4, isSpacer: true},
159
- ]);
160
-
161
- renderMask.addCells({first: 2, last: 4});
162
-
163
- expect(renderMask.enumerateRegions()).toEqual([
164
- {first: 0, last: 1, isSpacer: true},
165
- {first: 2, last: 4, isSpacer: false},
166
- ]);
167
- });
168
-
169
- it('does nothing when adding existing cells', () => {
170
- const renderMask = new CellRenderMask(5);
171
-
172
- renderMask.addCells({first: 2, last: 3});
173
-
174
- expect(renderMask.enumerateRegions()).toEqual([
175
- {first: 0, last: 1, isSpacer: true},
176
- {first: 2, last: 3, isSpacer: false},
177
- {first: 4, last: 4, isSpacer: true},
178
- ]);
179
-
180
- renderMask.addCells({first: 3, last: 3});
181
-
182
- expect(renderMask.enumerateRegions()).toEqual([
183
- {first: 0, last: 1, isSpacer: true},
184
- {first: 2, last: 3, isSpacer: false},
185
- {first: 4, last: 4, isSpacer: true},
186
- ]);
187
- });
188
- });
@@ -1,120 +0,0 @@
1
- /**
2
- * Copyright (c) Meta Platforms, Inc. and affiliates.
3
- *
4
- * This source code is licensed under the MIT license found in the
5
- * LICENSE file in the root directory of this source tree.
6
- *
7
- * @format
8
- * @oncall react_native
9
- */
10
-
11
- 'use strict';
12
-
13
- const FillRateHelper = require('../FillRateHelper');
14
-
15
- let rowFramesGlobal;
16
- const dataGlobal = [
17
- {key: 'header'},
18
- {key: 'a'},
19
- {key: 'b'},
20
- {key: 'c'},
21
- {key: 'd'},
22
- {key: 'footer'},
23
- ];
24
- function getFrameMetrics(index: number) {
25
- const frame = rowFramesGlobal[dataGlobal[index].key];
26
- return {length: frame.height, offset: frame.y, inLayout: frame.inLayout};
27
- }
28
-
29
- function computeResult({helper, props, state, scroll}): number {
30
- helper.activate();
31
- return helper.computeBlankness(
32
- {
33
- data: dataGlobal,
34
- getItemCount: data2 => data2.length,
35
- initialNumToRender: 10,
36
- ...(props || {}),
37
- },
38
- {first: 1, last: 2, ...(state || {})},
39
- {offset: 0, visibleLength: 100, ...(scroll || {})},
40
- );
41
- }
42
-
43
- describe('computeBlankness', function () {
44
- beforeEach(() => {
45
- FillRateHelper.setSampleRate(1);
46
- FillRateHelper.setMinSampleCount(0);
47
- });
48
-
49
- it('computes correct blankness of viewport', function () {
50
- const helper = new FillRateHelper(getFrameMetrics);
51
- rowFramesGlobal = {
52
- header: {y: 0, height: 0, inLayout: true},
53
- a: {y: 0, height: 50, inLayout: true},
54
- b: {y: 50, height: 50, inLayout: true},
55
- };
56
- let blankness = computeResult({helper});
57
- expect(blankness).toBe(0);
58
- blankness = computeResult({helper, state: {last: 1}});
59
- expect(blankness).toBe(0.5);
60
- blankness = computeResult({helper, scroll: {offset: 25}});
61
- expect(blankness).toBe(0.25);
62
- blankness = computeResult({helper, scroll: {visibleLength: 400}});
63
- expect(blankness).toBe(0.75);
64
- blankness = computeResult({helper, scroll: {offset: 100}});
65
- expect(blankness).toBe(1);
66
- });
67
-
68
- it('skips frames that are not in layout', function () {
69
- const helper = new FillRateHelper(getFrameMetrics);
70
- rowFramesGlobal = {
71
- header: {y: 0, height: 0, inLayout: false},
72
- a: {y: 0, height: 10, inLayout: false},
73
- b: {y: 10, height: 30, inLayout: true},
74
- c: {y: 40, height: 40, inLayout: true},
75
- d: {y: 80, height: 20, inLayout: false},
76
- footer: {y: 100, height: 0, inLayout: false},
77
- };
78
- const blankness = computeResult({helper, state: {last: 4}});
79
- expect(blankness).toBe(0.3);
80
- });
81
-
82
- it('sampling rate can disable', function () {
83
- let helper = new FillRateHelper(getFrameMetrics);
84
- rowFramesGlobal = {
85
- header: {y: 0, height: 0, inLayout: true},
86
- a: {y: 0, height: 40, inLayout: true},
87
- b: {y: 40, height: 40, inLayout: true},
88
- };
89
- let blankness = computeResult({helper});
90
- expect(blankness).toBe(0.2);
91
-
92
- FillRateHelper.setSampleRate(0);
93
-
94
- helper = new FillRateHelper(getFrameMetrics);
95
- blankness = computeResult({helper});
96
- expect(blankness).toBe(0);
97
- });
98
-
99
- it('can handle multiple listeners and unsubscribe', function () {
100
- const listeners = [jest.fn(), jest.fn(), jest.fn()];
101
- const subscriptions = listeners.map(listener =>
102
- FillRateHelper.addListener(listener),
103
- );
104
- subscriptions[1].remove();
105
- const helper = new FillRateHelper(getFrameMetrics);
106
- rowFramesGlobal = {
107
- header: {y: 0, height: 0, inLayout: true},
108
- a: {y: 0, height: 40, inLayout: true},
109
- b: {y: 40, height: 40, inLayout: true},
110
- };
111
- const blankness = computeResult({helper});
112
- expect(blankness).toBe(0.2);
113
- helper.deactivateAndFlush();
114
- const info0 = listeners[0].mock.calls[0][0];
115
- expect(info0.pixels_blank / info0.pixels_sampled).toBe(blankness);
116
- expect(listeners[1]).not.toBeCalled();
117
- const info1 = listeners[2].mock.calls[0][0];
118
- expect(info1.pixels_blank / info1.pixels_sampled).toBe(blankness);
119
- });
120
- });