mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
chore: refactor row hook
This commit is contained in:
parent
c8569d3c62
commit
79c1568295
@ -9,12 +9,14 @@ import {
|
|||||||
import { useAppDispatch, useAppSelector } from '../../../stores/store';
|
import { useAppDispatch, useAppSelector } from '../../../stores/store';
|
||||||
import loadField from './loadField';
|
import loadField from './loadField';
|
||||||
import { FieldInfo } from '../../../stores/effects/database/field/field_controller';
|
import { FieldInfo } from '../../../stores/effects/database/field/field_controller';
|
||||||
|
import { RowInfo } from '../../../stores/effects/database/row/row_cache';
|
||||||
|
|
||||||
export const useDatabase = (viewId: string) => {
|
export const useDatabase = (viewId: string) => {
|
||||||
const dispatch = useAppDispatch();
|
const dispatch = useAppDispatch();
|
||||||
const databaseStore = useAppSelector((state) => state.database);
|
const databaseStore = useAppSelector((state) => state.database);
|
||||||
const boardStore = useAppSelector((state) => state.board);
|
const boardStore = useAppSelector((state) => state.board);
|
||||||
const [controller, setController] = useState<DatabaseController>();
|
const [controller, setController] = useState<DatabaseController>();
|
||||||
|
const [rows, setRows] = useState<readonly RowInfo[]>([]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!viewId.length) return;
|
if (!viewId.length) return;
|
||||||
@ -46,5 +48,21 @@ export const useDatabase = (viewId: string) => {
|
|||||||
console.log(fields, columns);
|
console.log(fields, columns);
|
||||||
};
|
};
|
||||||
|
|
||||||
return { loadFields, controller };
|
useEffect(() => {
|
||||||
|
if (!controller) return;
|
||||||
|
|
||||||
|
void (async () => {
|
||||||
|
controller.subscribe({
|
||||||
|
onRowsChanged: (rowInfos) => {
|
||||||
|
setRows(rowInfos);
|
||||||
|
},
|
||||||
|
onFieldsChanged: (fieldInfos) => {
|
||||||
|
void loadFields(fieldInfos);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
await controller.open();
|
||||||
|
})();
|
||||||
|
}, [controller]);
|
||||||
|
|
||||||
|
return { loadFields, controller, rows };
|
||||||
};
|
};
|
||||||
|
@ -2,31 +2,42 @@ import { DatabaseController } from '../../../stores/effects/database/database_co
|
|||||||
import { RowController } from '../../../stores/effects/database/row/row_controller';
|
import { RowController } from '../../../stores/effects/database/row/row_controller';
|
||||||
import { RowInfo } from '../../../stores/effects/database/row/row_cache';
|
import { RowInfo } from '../../../stores/effects/database/row/row_cache';
|
||||||
import { CellIdentifier } from '../../../stores/effects/database/cell/cell_bd_svc';
|
import { CellIdentifier } from '../../../stores/effects/database/cell/cell_bd_svc';
|
||||||
import { useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
|
|
||||||
export const useRow = (viewId: string, databaseController: DatabaseController, rowInfo: RowInfo) => {
|
export const useRow = (viewId: string, databaseController: DatabaseController, rowInfo: RowInfo) => {
|
||||||
const [cells, setCells] = useState<{ fieldId: string; cellIdentifier: CellIdentifier }[]>([]);
|
const [cells, setCells] = useState<{ fieldId: string; cellIdentifier: CellIdentifier }[]>([]);
|
||||||
|
const [rowController, setRowController] = useState<RowController>();
|
||||||
|
|
||||||
const rowCache = databaseController.databaseViewCache.getRowCache();
|
useEffect(() => {
|
||||||
const fieldController = databaseController.fieldController;
|
const rowCache = databaseController.databaseViewCache.getRowCache();
|
||||||
const rowController = new RowController(rowInfo, fieldController, rowCache);
|
const fieldController = databaseController.fieldController;
|
||||||
|
const c = new RowController(rowInfo, fieldController, rowCache);
|
||||||
|
setRowController(c);
|
||||||
|
|
||||||
const loadRow = async () => {
|
return () => {
|
||||||
const cellsPB = await rowController.loadCells();
|
// dispose row controller in future
|
||||||
const loadingCells: { fieldId: string; cellIdentifier: CellIdentifier }[] = [];
|
};
|
||||||
|
}, []);
|
||||||
|
|
||||||
for (const [fieldId, cellIdentifier] of cellsPB.entries()) {
|
useEffect(() => {
|
||||||
loadingCells.push({
|
if (!rowController) return;
|
||||||
fieldId,
|
|
||||||
cellIdentifier,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
setCells(loadingCells);
|
void (async () => {
|
||||||
};
|
const cellsPB = await rowController.loadCells();
|
||||||
|
const loadingCells: { fieldId: string; cellIdentifier: CellIdentifier }[] = [];
|
||||||
|
|
||||||
|
for (const [fieldId, cellIdentifier] of cellsPB.entries()) {
|
||||||
|
loadingCells.push({
|
||||||
|
fieldId,
|
||||||
|
cellIdentifier,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
setCells(loadingCells);
|
||||||
|
})();
|
||||||
|
}, [rowController]);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
loadRow: loadRow,
|
|
||||||
cells: cells,
|
cells: cells,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -1,15 +1,14 @@
|
|||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { useAppDispatch, useAppSelector } from '../../stores/store';
|
import { useAppDispatch, useAppSelector } from '../../stores/store';
|
||||||
import { boardActions } from '../../stores/reducers/board/slice';
|
import { boardActions } from '../../stores/reducers/board/slice';
|
||||||
import { IDatabase, IDatabaseRow, ISelectOption } from '../../stores/reducers/database/slice';
|
import { ISelectOption, ISelectOptionType } from '../../stores/reducers/database/slice';
|
||||||
|
|
||||||
export const useBoard = () => {
|
export const useBoard = () => {
|
||||||
const dispatch = useAppDispatch();
|
const dispatch = useAppDispatch();
|
||||||
const groupingFieldId = useAppSelector((state) => state.board);
|
const groupingFieldId = useAppSelector((state) => state.board);
|
||||||
const database = useAppSelector((state) => state.database);
|
const database = useAppSelector((state) => state.database);
|
||||||
const [title, setTitle] = useState('');
|
const [title, setTitle] = useState('');
|
||||||
const [boardColumns, setBoardColumns] =
|
const [boardColumns, setBoardColumns] = useState<ISelectOption[]>([]);
|
||||||
useState<(ISelectOption & { rows: (IDatabaseRow & { isGhost: boolean })[] })[]>();
|
|
||||||
const [movingRowId, setMovingRowId] = useState<string | undefined>(undefined);
|
const [movingRowId, setMovingRowId] = useState<string | undefined>(undefined);
|
||||||
const [ghostLocation, setGhostLocation] = useState<{ column: number; row: number }>({ column: 0, row: 0 });
|
const [ghostLocation, setGhostLocation] = useState<{ column: number; row: number }>({ column: 0, row: 0 });
|
||||||
|
|
||||||
@ -17,18 +16,7 @@ export const useBoard = () => {
|
|||||||
setTitle(database.title);
|
setTitle(database.title);
|
||||||
if (database.fields[groupingFieldId]) {
|
if (database.fields[groupingFieldId]) {
|
||||||
setBoardColumns(
|
setBoardColumns(
|
||||||
database.fields[groupingFieldId].fieldOptions.selectOptions?.map((groupFieldItem) => {
|
(database.fields[groupingFieldId].fieldOptions as ISelectOptionType | undefined)?.selectOptions || []
|
||||||
/* const rows = database.rows
|
|
||||||
.filter((row) => row.cells[groupingFieldId].data?.some((so) => so === groupFieldItem.selectOptionId))
|
|
||||||
.map((row) => ({
|
|
||||||
...row,
|
|
||||||
isGhost: false,
|
|
||||||
}));*/
|
|
||||||
return {
|
|
||||||
...groupFieldItem,
|
|
||||||
rows: [],
|
|
||||||
};
|
|
||||||
}) || []
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}, [database, groupingFieldId]);
|
}, [database, groupingFieldId]);
|
||||||
|
@ -4,11 +4,9 @@ import { BoardBlock } from './BoardBlock';
|
|||||||
import { NewBoardBlock } from './NewBoardBlock';
|
import { NewBoardBlock } from './NewBoardBlock';
|
||||||
import { useBoard } from './Board.hooks';
|
import { useBoard } from './Board.hooks';
|
||||||
import { useDatabase } from '../_shared/database-hooks/useDatabase';
|
import { useDatabase } from '../_shared/database-hooks/useDatabase';
|
||||||
import { useEffect, useState } from 'react';
|
|
||||||
import { RowInfo } from '../../stores/effects/database/row/row_cache';
|
|
||||||
|
|
||||||
export const Board = ({ viewId }: { viewId: string }) => {
|
export const Board = ({ viewId }: { viewId: string }) => {
|
||||||
const { controller, loadFields } = useDatabase(viewId);
|
const { controller, rows } = useDatabase(viewId);
|
||||||
|
|
||||||
const {
|
const {
|
||||||
title,
|
title,
|
||||||
@ -22,24 +20,6 @@ export const Board = ({ viewId }: { viewId: string }) => {
|
|||||||
ghostLocation,
|
ghostLocation,
|
||||||
} = useBoard();
|
} = useBoard();
|
||||||
|
|
||||||
const [rows, setRows] = useState<readonly RowInfo[]>([]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (!controller) return;
|
|
||||||
|
|
||||||
void (async () => {
|
|
||||||
controller.subscribe({
|
|
||||||
onRowsChanged: (rowInfos) => {
|
|
||||||
setRows(rowInfos);
|
|
||||||
},
|
|
||||||
onFieldsChanged: (fieldInfos) => {
|
|
||||||
void loadFields(fieldInfos);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
await controller.open();
|
|
||||||
})();
|
|
||||||
}, [controller]);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className='flex w-full items-center justify-between'>
|
<div className='flex w-full items-center justify-between'>
|
||||||
|
@ -1,10 +1,7 @@
|
|||||||
import { Details2Svg } from '../_shared/svg/Details2Svg';
|
import { Details2Svg } from '../_shared/svg/Details2Svg';
|
||||||
import AddSvg from '../_shared/svg/AddSvg';
|
import AddSvg from '../_shared/svg/AddSvg';
|
||||||
import { DatabaseFieldMap, IDatabaseColumn, IDatabaseRow } from '../../stores/reducers/database/slice';
|
|
||||||
import { BoardCard } from './BoardCard';
|
import { BoardCard } from './BoardCard';
|
||||||
import { RowInfo } from '../../stores/effects/database/row/row_cache';
|
import { RowInfo } from '../../stores/effects/database/row/row_cache';
|
||||||
import { useEffect } from 'react';
|
|
||||||
import { useRow } from '../_shared/database-hooks/useRow';
|
|
||||||
import { DatabaseController } from '../../stores/effects/database/database_controller';
|
import { DatabaseController } from '../../stores/effects/database/database_controller';
|
||||||
|
|
||||||
export const BoardBlock = ({
|
export const BoardBlock = ({
|
||||||
|
@ -28,6 +28,8 @@ export const BoardCard = ({
|
|||||||
startMove: () => void;
|
startMove: () => void;
|
||||||
endMove: () => void;
|
endMove: () => void;
|
||||||
}) => {
|
}) => {
|
||||||
|
const { cells } = useRow(viewId, controller, row);
|
||||||
|
|
||||||
const databaseStore = useAppSelector((state) => state.database);
|
const databaseStore = useAppSelector((state) => state.database);
|
||||||
const [isMoving, setIsMoving] = useState(false);
|
const [isMoving, setIsMoving] = useState(false);
|
||||||
const [isDown, setIsDown] = useState(false);
|
const [isDown, setIsDown] = useState(false);
|
||||||
@ -36,6 +38,7 @@ export const BoardCard = ({
|
|||||||
const [ghostLeft, setGhostLeft] = useState(0);
|
const [ghostLeft, setGhostLeft] = useState(0);
|
||||||
const [ghostTop, setGhostTop] = useState(0);
|
const [ghostTop, setGhostTop] = useState(0);
|
||||||
const el = useRef<HTMLDivElement>(null);
|
const el = useRef<HTMLDivElement>(null);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (el.current?.getBoundingClientRect && isMoving) {
|
if (el.current?.getBoundingClientRect && isMoving) {
|
||||||
const { left, top, width, height } = el.current.getBoundingClientRect();
|
const { left, top, width, height } = el.current.getBoundingClientRect();
|
||||||
@ -53,13 +56,6 @@ export const BoardCard = ({
|
|||||||
}
|
}
|
||||||
}, [el, isMoving]);
|
}, [el, isMoving]);
|
||||||
|
|
||||||
const { loadRow, cells } = useRow(viewId, controller, row);
|
|
||||||
useEffect(() => {
|
|
||||||
void (async () => {
|
|
||||||
await loadRow();
|
|
||||||
})();
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const onMouseMove: MouseEventHandler<HTMLDivElement> = (e) => {
|
const onMouseMove: MouseEventHandler<HTMLDivElement> = (e) => {
|
||||||
setGhostLeft(ghostLeft + e.movementX);
|
setGhostLeft(ghostLeft + e.movementX);
|
||||||
setGhostTop(ghostTop + e.movementY);
|
setGhostTop(ghostTop + e.movementY);
|
||||||
|
Loading…
Reference in New Issue
Block a user