Skip to content

Commit 18b1069

Browse files
committed
Fix ESLint warning in Table stories
1 parent 18caae2 commit 18b1069

File tree

1 file changed

+64
-23
lines changed

1 file changed

+64
-23
lines changed

src/table/table.stories.tsx

Lines changed: 64 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {useState, useCallback, useEffect} from 'react';
1+
import {useState, useCallback, useReducer} from 'react';
22
import {type StoryFn} from '@storybook/react-webpack5';
33

44
import {Grid, Row, Col} from '../grid/grid';
@@ -38,34 +38,75 @@ interface Item extends SelectionItem {
3838
interface BasicDemoProps extends TableAttrs<Item> {
3939
withCaption: boolean;
4040
}
41-
export const Basic: StoryFn<BasicDemoProps> = args => {
42-
const {onSort, onSelect, withCaption, onReorder, ...restProps} = args;
43-
const [data, setData] = useState<Item[]>([]);
44-
const [selection, setSelection] = useState<Selection<Item>>(new Selection());
45-
const [sortKey, setSortKey] = useState<keyof Item>('country');
46-
const [sortOrder, setSortOrder] = useState<boolean>(true);
47-
const [page, setPage] = useState<number>(1);
48-
49-
const isItemSelectable = useCallback((item: Item) => item.id !== 14, []);
50-
51-
useEffect(() => {
52-
let newData: Item[] = [...mock];
53-
newData.sort((a, b) => String(a[sortKey]).localeCompare(String(b[sortKey])) * (sortOrder ? 1 : -1));
54-
newData = newData.slice((page - 1) * PAGE_SIZE, (page - 1) * PAGE_SIZE + PAGE_SIZE);
41+
type BasicAction =
42+
| {
43+
type: 'setData';
44+
payload: Item[];
45+
}
46+
| {
47+
type: 'setSelection';
48+
payload: Selection<Item>;
49+
}
50+
| {
51+
type: 'setSort';
52+
payload: SortParams;
53+
}
54+
| {
55+
type: 'setPage';
56+
payload: number;
57+
};
58+
interface BasicStateInput {
59+
sortKey: keyof Item;
60+
sortOrder: boolean;
61+
page: number;
62+
}
63+
interface BasicState extends BasicStateInput {
64+
data: Item[];
65+
selection: Selection<Item>;
66+
}
67+
const isItemSelectable = (item: Item) => item.id !== 14;
68+
function processState(input: BasicStateInput): BasicState {
69+
const {sortKey, sortOrder, page} = input;
70+
let data: Item[] = [...mock];
71+
data.sort((a, b) => String(a[sortKey]).localeCompare(String(b[sortKey])) * (sortOrder ? 1 : -1));
72+
data = data.slice((page - 1) * PAGE_SIZE, (page - 1) * PAGE_SIZE + PAGE_SIZE);
5573

56-
const newSelection = new Selection({data: newData, isItemSelectable});
74+
const selection = new Selection({data, isItemSelectable});
75+
return {...input, data, selection};
76+
}
5777

58-
// TODO fix
59-
// eslint-disable-next-line react-hooks/set-state-in-effect
60-
setData(newData);
61-
setSelection(newSelection);
62-
}, [isItemSelectable, page, sortKey, sortOrder]);
78+
export const Basic: StoryFn<BasicDemoProps> = args => {
79+
const {onSort, onSelect, withCaption, onReorder, ...restProps} = args;
80+
const [{data, selection, sortKey, sortOrder, page}, dispatch] = useReducer(
81+
(state, {type, payload}: BasicAction) => {
82+
switch (type) {
83+
case 'setData':
84+
return {...state, data: payload};
85+
case 'setSelection':
86+
return {...state, selection: payload};
87+
case 'setSort':
88+
return processState({...state, sortKey: payload.column.id as keyof Item, sortOrder: payload.order});
89+
case 'setPage':
90+
return processState({...state, page: payload});
91+
default:
92+
return state;
93+
}
94+
},
95+
processState({
96+
sortKey: 'country',
97+
sortOrder: true,
98+
page: 1,
99+
}),
100+
);
101+
const setData = (payload: Item[]) => dispatch({type: 'setData', payload});
102+
const setSelection = (payload: Selection<Item>) => dispatch({type: 'setSelection', payload});
103+
const setSort = (payload: SortParams) => dispatch({type: 'setSort', payload});
104+
const setPage = (payload: number) => dispatch({type: 'setPage', payload});
63105

64106
const handleSort = useCallback(
65107
(event: SortParams) => {
66108
onSort?.(event);
67-
setSortKey(event.column.id as keyof Item);
68-
setSortOrder(event.order);
109+
setSort(event);
69110
},
70111
[onSort],
71112
);

0 commit comments

Comments
 (0)