Summary: Migrating tables' row collection to Immutable.js List: 1. Migrate createTablePlugin to ManagedTable_immutable ----- Current implementation of tables forces to copy arrays on new data arrival which causes O(N^2) complexity -> tables can't handle a lot of new rows in short period of time -> tables freeze and become unresponsive for a few seconds. Immutable data structures will bring us to O(N) complexity Reviewed By: jknoxville Differential Revision: D16416867 fbshipit-source-id: 20890aa851cd2e34e33fd2ed69c5d6048af14cbb
80 lines
2.0 KiB
JavaScript
80 lines
2.0 KiB
JavaScript
/**
|
|
* Copyright 2018-present Facebook.
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
* @format
|
|
*/
|
|
|
|
import {createTablePlugin} from '../createTablePlugin.js';
|
|
|
|
import type {TableRows_immutable} from 'flipper';
|
|
|
|
//import type {PersistedState, RowData} from '../createTablePlugin.js';
|
|
import {FlipperPlugin} from '../plugin.js';
|
|
|
|
import {List, Map as ImmutableMap} from 'immutable';
|
|
|
|
const PROPS = {
|
|
method: 'method',
|
|
resetMethod: 'resetMethod',
|
|
columns: {},
|
|
columnSizes: {},
|
|
renderSidebar: (r: {id: string}) => {},
|
|
buildRow: (r: {id: string}) => {},
|
|
};
|
|
|
|
type PersistedState<T> = {|
|
|
rows: TableRows_immutable,
|
|
datas: ImmutableMap<string, T>,
|
|
|};
|
|
|
|
type RowData = {
|
|
id: string,
|
|
};
|
|
|
|
test('createTablePlugin returns FlipperPlugin', () => {
|
|
const tablePlugin = createTablePlugin({...PROPS});
|
|
expect(tablePlugin.prototype).toBeInstanceOf(FlipperPlugin);
|
|
});
|
|
|
|
test('persistedStateReducer is resetting data', () => {
|
|
const resetMethod = 'resetMethod';
|
|
const tablePlugin = createTablePlugin<RowData>({...PROPS, resetMethod});
|
|
|
|
const ps: PersistedState<RowData> = {
|
|
datas: ImmutableMap({'1': {id: '1'}}),
|
|
rows: List([
|
|
{
|
|
key: '1',
|
|
columns: {
|
|
id: {
|
|
value: '1',
|
|
},
|
|
},
|
|
},
|
|
]),
|
|
};
|
|
|
|
// $FlowFixMe persistedStateReducer exists for createTablePlugin
|
|
const {rows, datas} = tablePlugin.persistedStateReducer(ps, resetMethod, {});
|
|
|
|
expect(datas.toJSON()).toEqual({});
|
|
expect(rows.size).toBe(0);
|
|
});
|
|
|
|
test('persistedStateReducer is adding data', () => {
|
|
const method = 'method';
|
|
const tablePlugin = createTablePlugin({...PROPS, method});
|
|
const id = '1';
|
|
|
|
// $FlowFixMe persistedStateReducer exists for createTablePlugin
|
|
const {rows, datas} = tablePlugin.persistedStateReducer(
|
|
tablePlugin.defaultPersistedState,
|
|
method,
|
|
{id},
|
|
);
|
|
|
|
expect(rows.size).toBe(1);
|
|
expect([...datas.keys()]).toEqual([id]);
|
|
});
|