Skip to content

Commit 68a4fb4

Browse files
committed
refactor: combine query result provider and cell providers together
1 parent 64575a5 commit 68a4fb4

File tree

10 files changed

+157
-176
lines changed

10 files changed

+157
-176
lines changed
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
import NotImplementCallback from 'libs/NotImplementCallback';
2+
import ResultChangeCollector from 'libs/ResultChangeCollector';
3+
4+
import {
5+
createContext,
6+
PropsWithChildren,
7+
useCallback,
8+
useContext,
9+
useMemo,
10+
} from 'react';
11+
12+
import { TableEditableCellHandler } from 'renderer/screens/DatabaseScreen/QueryResultViewer/TableCell/TableEditableCell';
13+
14+
export class TableCellManager {
15+
protected focused: [number, number] | null = null;
16+
protected cells: Record<
17+
string,
18+
Record<string, TableEditableCellHandler | null>
19+
> = {};
20+
21+
setFocus(row: number, col: number) {
22+
this.clearFocus();
23+
this.focused = [row, col];
24+
25+
const cell = this.cells[row][col];
26+
if (cell) {
27+
cell.setFocus(true);
28+
}
29+
}
30+
31+
getFocus() {
32+
return this.focused ? [...this.focused] : null;
33+
}
34+
35+
getFocusCell() {
36+
if (this.focused) {
37+
return this.get(this.focused[0], this.focused[1]);
38+
}
39+
return null;
40+
}
41+
42+
clearFocus() {
43+
if (this.focused) {
44+
const cell = this.cells[this.focused[0]][this.focused[1]];
45+
if (cell) {
46+
cell.setFocus(false);
47+
}
48+
}
49+
this.focused = null;
50+
}
51+
52+
set(row: number, col: number, ref: TableEditableCellHandler | null) {
53+
if (this.cells[row]) {
54+
this.cells[row][col] = ref;
55+
} else {
56+
this.cells[row] = {};
57+
this.cells[row][col] = ref;
58+
}
59+
}
60+
61+
get(row: number, col: number) {
62+
if (this.cells[row]) {
63+
return this.cells[row][col];
64+
}
65+
return null;
66+
}
67+
}
68+
69+
const QueryResultChangeContext = createContext<{
70+
setChange: (row: number, col: number, value: unknown) => void;
71+
removeChange: (row: number, col: number) => void;
72+
collector: ResultChangeCollector;
73+
clearChange: () => void;
74+
cellManager: TableCellManager;
75+
}>({
76+
collector: new ResultChangeCollector(),
77+
setChange: NotImplementCallback,
78+
removeChange: NotImplementCallback,
79+
clearChange: NotImplementCallback,
80+
cellManager: new TableCellManager(),
81+
});
82+
83+
export function useEditableResult() {
84+
return useContext(QueryResultChangeContext);
85+
}
86+
87+
export function EditableQueryResultProvider({ children }: PropsWithChildren) {
88+
const collector = useMemo(() => new ResultChangeCollector(), []);
89+
const manager = useMemo(() => new TableCellManager(), []);
90+
91+
const setChange = useCallback(
92+
(row: number, col: number, value: unknown) => {
93+
collector.addChange(row, col, value);
94+
},
95+
[collector]
96+
);
97+
98+
const removeChange = useCallback(
99+
(row: number, col: number) => {
100+
collector.removeChange(row, col);
101+
},
102+
[collector]
103+
);
104+
105+
const clearChange = useCallback(() => {
106+
collector.clear();
107+
}, [collector]);
108+
109+
return (
110+
<QueryResultChangeContext.Provider
111+
value={{
112+
removeChange,
113+
setChange,
114+
collector,
115+
clearChange,
116+
cellManager: manager,
117+
}}
118+
>
119+
{children}
120+
</QueryResultChangeContext.Provider>
121+
);
122+
}

src/renderer/contexts/QueryResultChangeProvider.tsx

Lines changed: 0 additions & 55 deletions
This file was deleted.

src/renderer/screens/DatabaseScreen/QueryResultViewer/QueryResultAction.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { useCallback, useState, useEffect } from 'react';
22
import applyQueryResultChanges from 'libs/ApplyQueryResultChanges';
33
import generateSqlFromChanges from 'libs/GenerateSqlFromChanges';
44
import generateSqlFromPlan from 'libs/GenerateSqlFromPlan';
5-
import { useQueryResultChange } from 'renderer/contexts/QueryResultChangeProvider';
65
import { useSchema } from 'renderer/contexts/SchemaProvider';
76
import { useSqlExecute } from 'renderer/contexts/SqlExecuteProvider';
87
import { QueryResult } from 'types/SqlResult';
@@ -16,6 +15,7 @@ import {
1615
faChevronRight,
1716
} from '@fortawesome/free-solid-svg-icons';
1817
import { useDebounceEffect } from 'hooks/useDebounce';
18+
import { useEditableResult } from 'renderer/contexts/EditableQueryResultProvider';
1919

2020
interface QueryResultActionProps {
2121
result: QueryResult;
@@ -43,7 +43,7 @@ export default function QueryResultAction({
4343
const { showErrorDialog } = useDialog();
4444
const [changeCount, setChangeCount] = useState(0);
4545
const [showExportModal, setShowExportModal] = useState(false);
46-
const { clearChange, collector } = useQueryResultChange();
46+
const { clearChange, collector } = useEditableResult();
4747
const { schema, currentDatabase } = useSchema();
4848
const [search, setSearch] = useState('');
4949
const { runner } = useSqlExecute();

src/renderer/screens/DatabaseScreen/QueryResultViewer/QueryResultTable.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ import TableCell from 'renderer/screens/DatabaseScreen/QueryResultViewer/TableCe
44
import { QueryResultHeader, QueryResultWithIndex } from 'types/SqlResult';
55
import { getUpdatableTable } from 'libs/GenerateSqlFromChanges';
66
import { useSchema } from 'renderer/contexts/SchemaProvider';
7-
import { useQueryResultChange } from 'renderer/contexts/QueryResultChangeProvider';
8-
import { useTableCellManager } from './TableCellManager';
97
import OptimizeTable from 'renderer/components/OptimizeTable';
108
import Icon from 'renderer/components/Icon';
119
import useDataTableContextMenu from './useDataTableContextMenu';
@@ -16,6 +14,7 @@ import {
1614
faChevronDown,
1715
faChevronUp,
1816
} from '@fortawesome/free-solid-svg-icons';
17+
import { useEditableResult } from 'renderer/contexts/EditableQueryResultProvider';
1918

2019
interface QueryResultTableProps {
2120
headers: QueryResultHeader[];
@@ -33,8 +32,7 @@ function QueryResultTable({
3332
sortedHeader,
3433
}: QueryResultTableProps) {
3534
const [newRowCount, setNewRowCount] = useState(0);
36-
const { collector } = useQueryResultChange();
37-
const { cellManager } = useTableCellManager();
35+
const { collector, cellManager } = useEditableResult();
3836
const { schema, currentDatabase } = useSchema();
3937

4038
const [selectedRowsIndex, setSelectedRowsIndex] = useState<number[]>([]);

src/renderer/screens/DatabaseScreen/QueryResultViewer/TableCell/TableEditableCell.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,8 @@ import {
88
useRef,
99
} from 'react';
1010
import styles from './styles.module.css';
11-
import { useQueryResultChange } from 'renderer/contexts/QueryResultChangeProvider';
12-
import { useTableCellManager } from '../TableCellManager';
1311
import { QueryResultHeader } from 'types/SqlResult';
12+
import { useEditableResult } from 'renderer/contexts/EditableQueryResultProvider';
1413

1514
export interface TableEditableCellHandler {
1615
discard: () => void;
@@ -67,8 +66,8 @@ const TableEditableCell = forwardRef<
6766
},
6867
ref
6968
) {
70-
const { cellManager } = useTableCellManager();
71-
const { setChange, removeChange, collector } = useQueryResultChange();
69+
const { cellManager, setChange, removeChange, collector } =
70+
useEditableResult();
7271
const [afterValue, setAfterValue] = useState(
7372
collector.getChange(row, col, value)
7473
);

src/renderer/screens/DatabaseScreen/QueryResultViewer/TableCell/createTableCellType.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ import TableEditableCell, {
33
TableEditableEditorProps,
44
TableEditableContentProps,
55
} from './TableEditableCell';
6-
import { useTableCellManager } from '../TableCellManager';
76
import { QueryResultHeader } from 'types/SqlResult';
7+
import { useEditableResult } from 'renderer/contexts/EditableQueryResultProvider';
88

99
interface TableCellCustomTypeOptions<T> {
1010
diff: (prev: T, current: T) => boolean;
@@ -35,7 +35,7 @@ export default function createTableCellType<T>(
3535
header,
3636
}: TableCellCustomTypeProps<T>) {
3737
const ref = useRef(null);
38-
const { cellManager } = useTableCellManager();
38+
const { cellManager } = useEditableResult();
3939

4040
useEffect(() => {
4141
cellManager.set(row, col, ref?.current || null);

src/renderer/screens/DatabaseScreen/QueryResultViewer/TableCellManager.tsx

Lines changed: 0 additions & 77 deletions
This file was deleted.

0 commit comments

Comments
 (0)