* wip * fields reorder works but fields are not yet persisted * fields are persisted * modify according to comments
62 lines
2.0 KiB
TypeScript
62 lines
2.0 KiB
TypeScript
import { useCallback } from 'react';
|
|
|
|
import { savedBoardCardFieldsFamilyState } from '@/ui/layout/board/states/savedBoardCardFieldsFamilyState';
|
|
import { BoardFieldDefinition } from '@/ui/layout/board/types/BoardFieldDefinition';
|
|
import { FieldMetadata } from '@/ui/object/field/types/FieldMetadata';
|
|
import { ColumnDefinition } from '@/ui/object/record-table/types/ColumnDefinition';
|
|
import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState';
|
|
|
|
import { boardCardFieldsScopedState } from '../states/boardCardFieldsScopedState';
|
|
|
|
import { useBoardContext } from './useBoardContext';
|
|
|
|
export const useBoardCardFields = () => {
|
|
const { BoardRecoilScopeContext, onFieldsChange } = useBoardContext();
|
|
|
|
const [, setBoardCardFields] = useRecoilScopedState(
|
|
boardCardFieldsScopedState,
|
|
BoardRecoilScopeContext,
|
|
);
|
|
|
|
const [, setSavedBoardCardFields] = useRecoilScopedState(
|
|
savedBoardCardFieldsFamilyState,
|
|
BoardRecoilScopeContext,
|
|
);
|
|
|
|
const handleFieldVisibilityChange = (
|
|
field: Omit<ColumnDefinition<FieldMetadata>, 'size' | 'position'>,
|
|
) => {
|
|
setBoardCardFields((previousFields) =>
|
|
previousFields.map((previousField) =>
|
|
previousField.fieldMetadataId === field.fieldMetadataId
|
|
? { ...previousField, isVisible: !field.isVisible }
|
|
: previousField,
|
|
),
|
|
);
|
|
};
|
|
|
|
const handleFieldsChange = useCallback(
|
|
async (fields: BoardFieldDefinition<FieldMetadata>[]) => {
|
|
setSavedBoardCardFields(fields);
|
|
setBoardCardFields(fields);
|
|
|
|
await onFieldsChange?.(fields);
|
|
},
|
|
[setBoardCardFields, setSavedBoardCardFields, onFieldsChange],
|
|
);
|
|
|
|
const handleFieldsReorder = useCallback(
|
|
async (fields: BoardFieldDefinition<FieldMetadata>[]) => {
|
|
const updatedFields = fields.map((column, index) => ({
|
|
...column,
|
|
position: index,
|
|
}));
|
|
|
|
await handleFieldsChange(updatedFields);
|
|
},
|
|
[handleFieldsChange],
|
|
);
|
|
|
|
return { handleFieldVisibilityChange, handleFieldsReorder };
|
|
};
|