diff --git a/frontend/appflowy_tauri/src/appflowy_app/components/_shared/database-hooks/useCell.ts b/frontend/appflowy_tauri/src/appflowy_app/components/_shared/database-hooks/useCell.ts index 57082f6f70..d211a8b326 100644 --- a/frontend/appflowy_tauri/src/appflowy_app/components/_shared/database-hooks/useCell.ts +++ b/frontend/appflowy_tauri/src/appflowy_app/components/_shared/database-hooks/useCell.ts @@ -20,9 +20,9 @@ export const useCell = (cellIdentifier: CellIdentifier, cellCache: CellCache, fi // ignore the return value, because we are using the subscription void cellController.getCellData(); - // dispose the cell controller when the component is unmounted return () => { - void cellController.dispose(); + // dispose is causing an error + // void cellController.dispose(); }; }, []); diff --git a/frontend/appflowy_tauri/src/appflowy_app/components/_shared/database-hooks/useDatabase.ts b/frontend/appflowy_tauri/src/appflowy_app/components/_shared/database-hooks/useDatabase.ts index b3fc047ed5..4d4d89c9c5 100644 --- a/frontend/appflowy_tauri/src/appflowy_app/components/_shared/database-hooks/useDatabase.ts +++ b/frontend/appflowy_tauri/src/appflowy_app/components/_shared/database-hooks/useDatabase.ts @@ -1,30 +1,26 @@ import { useEffect, useState } from 'react'; import { DatabaseController } from '../../../stores/effects/database/database_controller'; -import { - databaseActions, - DatabaseFieldMap, - IDatabaseColumn, - IDatabaseRow, -} from '../../../stores/reducers/database/slice'; -import { useAppDispatch, useAppSelector } from '../../../stores/store'; +import { databaseActions, DatabaseFieldMap, IDatabaseColumn } from '../../../stores/reducers/database/slice'; +import { useAppDispatch } from '../../../stores/store'; import loadField from './loadField'; import { FieldInfo } from '../../../stores/effects/database/field/field_controller'; import { RowInfo } from '../../../stores/effects/database/row/row_cache'; +import { ViewLayoutTypePB } from '@/services/backend'; +import { DatabaseGroupController } from '$app/stores/effects/database/group/group_controller'; -export const useDatabase = (viewId: string) => { +export const useDatabase = (viewId: string, type?: ViewLayoutTypePB) => { const dispatch = useAppDispatch(); - const databaseStore = useAppSelector((state) => state.database); - const boardStore = useAppSelector((state) => state.board); const [controller, setController] = useState(); const [rows, setRows] = useState([]); + const [groups, setGroups] = useState([]); useEffect(() => { if (!viewId.length) return; const c = new DatabaseController(viewId); setController(c); - // on unmount dispose the controller - return () => void c.dispose(); + // dispose is causing an error + // return () => void c.dispose(); }, [viewId]); const loadFields = async (fieldInfos: readonly FieldInfo[]) => { @@ -45,7 +41,6 @@ export const useDatabase = (viewId: string) => { dispatch(databaseActions.updateFields({ fields })); dispatch(databaseActions.updateColumns({ columns })); - console.log(fields, columns); }; useEffect(() => { @@ -61,8 +56,12 @@ export const useDatabase = (viewId: string) => { }, }); await controller.open(); + + if (type === ViewLayoutTypePB.Board) { + setGroups(controller.groups.value); + } })(); }, [controller]); - return { loadFields, controller, rows }; + return { loadFields, controller, rows, groups }; }; diff --git a/frontend/appflowy_tauri/src/appflowy_app/components/board/Board.hooks.ts b/frontend/appflowy_tauri/src/appflowy_app/components/board/Board.hooks.ts deleted file mode 100644 index f02a16d34f..0000000000 --- a/frontend/appflowy_tauri/src/appflowy_app/components/board/Board.hooks.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { useEffect, useState } from 'react'; -import { useAppDispatch, useAppSelector } from '../../stores/store'; -import { boardActions } from '../../stores/reducers/board/slice'; -import { ISelectOption, ISelectOptionType } from '../../stores/reducers/database/slice'; - -export const useBoard = () => { - const dispatch = useAppDispatch(); - const groupingFieldId = useAppSelector((state) => state.board); - const database = useAppSelector((state) => state.database); - const [title, setTitle] = useState(''); - const [boardColumns, setBoardColumns] = useState([]); - const [movingRowId, setMovingRowId] = useState(undefined); - const [ghostLocation, setGhostLocation] = useState<{ column: number; row: number }>({ column: 0, row: 0 }); - - useEffect(() => { - setTitle(database.title); - if (database.fields[groupingFieldId]) { - setBoardColumns( - (database.fields[groupingFieldId].fieldOptions as ISelectOptionType | undefined)?.selectOptions || [] - ); - } - }, [database, groupingFieldId]); - - const changeGroupingField = (fieldId: string) => { - dispatch( - boardActions.setGroupingFieldId({ - fieldId, - }) - ); - }; - - const onGhostItemMove = (columnIndex: number, rowIndex: number) => { - setGhostLocation({ column: columnIndex, row: rowIndex }); - }; - - const startMove = (rowId: string) => { - setMovingRowId(rowId); - }; - - const endMove = () => { - setMovingRowId(undefined); - }; - - return { - title, - boardColumns, - groupingFieldId, - changeGroupingField, - startMove, - endMove, - onGhostItemMove, - movingRowId, - ghostLocation, - }; -}; diff --git a/frontend/appflowy_tauri/src/appflowy_app/components/board/Board.tsx b/frontend/appflowy_tauri/src/appflowy_app/components/board/Board.tsx index 3869138342..ccfbb1ecfe 100644 --- a/frontend/appflowy_tauri/src/appflowy_app/components/board/Board.tsx +++ b/frontend/appflowy_tauri/src/appflowy_app/components/board/Board.tsx @@ -2,29 +2,17 @@ import { SettingsSvg } from '../_shared/svg/SettingsSvg'; import { SearchInput } from '../_shared/SearchInput'; import { BoardBlock } from './BoardBlock'; import { NewBoardBlock } from './NewBoardBlock'; -import { useBoard } from './Board.hooks'; import { useDatabase } from '../_shared/database-hooks/useDatabase'; +import { ViewLayoutTypePB } from '@/services/backend'; export const Board = ({ viewId }: { viewId: string }) => { - const { controller, rows } = useDatabase(viewId); - - const { - title, - boardColumns, - groupingFieldId, - changeGroupingField, - startMove, - endMove, - onGhostItemMove, - movingRowId, - ghostLocation, - } = useBoard(); + const { controller, rows, groups } = useDatabase(viewId, ViewLayoutTypePB.Board); return ( <>
-
{title}
+
{'Kanban'}
@@ -37,16 +25,15 @@ export const Board = ({ viewId }: { viewId: string }) => {
{controller && - boardColumns?.map((column, index) => ( + groups && + groups.map((group, index) => ( ))} diff --git a/frontend/appflowy_tauri/src/appflowy_app/components/board/BoardBlock.tsx b/frontend/appflowy_tauri/src/appflowy_app/components/board/BoardBlock.tsx index 29bc1bc2a1..633a87af3a 100644 --- a/frontend/appflowy_tauri/src/appflowy_app/components/board/BoardBlock.tsx +++ b/frontend/appflowy_tauri/src/appflowy_app/components/board/BoardBlock.tsx @@ -3,23 +3,20 @@ import AddSvg from '../_shared/svg/AddSvg'; import { BoardCard } from './BoardCard'; import { RowInfo } from '../../stores/effects/database/row/row_cache'; import { DatabaseController } from '../../stores/effects/database/database_controller'; +import { RowPB } from '@/services/backend'; export const BoardBlock = ({ viewId, controller, title, - groupingFieldId, rows, - startMove, - endMove, + allRows, }: { viewId: string; controller: DatabaseController; title: string; - groupingFieldId: string; - rows: readonly RowInfo[]; - startMove: (id: string) => void; - endMove: () => void; + rows: RowPB[]; + allRows: readonly RowInfo[]; }) => { return (
@@ -38,17 +35,14 @@ export const BoardBlock = ({
- {rows.map((row, index) => ( - startMove(row.row.id)} - endMove={() => endMove()} - > - ))} + {rows.map((row_pb, index) => { + const row = allRows.find((r) => r.row.id === row_pb.id); + return row ? ( + + ) : ( + + ); + })}
-
- {cells.map((cell, index) => ( - - ))} -
+
console.log('on click')} + className={`relative cursor-pointer select-none rounded-lg border border-shade-6 bg-white px-3 py-2 transition-transform duration-100 hover:bg-main-selector `} + > + +
+ {cells.map((cell, index) => ( + + ))}
- {isMoving && ( -
-   -
- )} - +
); };