diff --git a/src/services/helpers.ts b/src/services/helpers.ts index df67a4c..c4a3292 100644 --- a/src/services/helpers.ts +++ b/src/services/helpers.ts @@ -6,38 +6,43 @@ import { replaceElementOfArray, } from '@services/utils' -function reorderCardsOnColumn(column: any, reorderCards: any) { +function reorderCardsOnColumn(column: Column, reorderCards: (cards: TCard[]) => TCard[]): Column { return { ...column, cards: reorderCards(column.cards) } } -function moveColumn(board: any, { fromPosition }: any, { toPosition }: any) { +function moveColumn(board: KanbanBoard, fromPosition: number, toPosition: number): KanbanBoard { return { ...board, columns: changeElementOfPositionInArray(board.columns, fromPosition, toPosition) } } -function moveCard(board: any, { fromPosition, fromColumnId }: any, { toPosition, toColumnId }: any) { - const sourceColumn = board.columns.find((column: any) => column.id === fromColumnId) - const destinationColumn = board.columns.find((column: any) => column.id === toColumnId) +function moveCard( + board: KanbanBoard, + fromPosition: number, + fromColumnId: string, + toPosition: number, + toColumnId: string +): KanbanBoard { + const sourceColumn = board.columns.find((column) => column.id === fromColumnId) + const destinationColumn = board.columns.find((column) => column.id === toColumnId) + + if (!sourceColumn || !destinationColumn) { + throw new Error('Source or destination column not found') + } - const reorderColumnsOnBoard = (reorderColumnsMapper: any) => ({ + const reorderColumnsOnBoard = (reorderColumnsMapper: (column: Column) => Column) => ({ ...board, columns: board.columns.map(reorderColumnsMapper), }) + const reorderCardsOnSourceColumn = reorderCardsOnColumn.bind(null, sourceColumn) const reorderCardsOnDestinationColumn = reorderCardsOnColumn.bind(null, destinationColumn) if (sourceColumn.id === destinationColumn.id) { - const reorderedCardsOnColumn = reorderCardsOnSourceColumn((cards: any) => { - return changeElementOfPositionInArray(cards, fromPosition, toPosition) - }) - return reorderColumnsOnBoard((column: any) => (column.id === sourceColumn.id ? reorderedCardsOnColumn : column)) + const reorderedCardsOnColumn = reorderCardsOnSourceColumn((cards) => changeElementOfPositionInArray(cards, fromPosition, toPosition)) + return reorderColumnsOnBoard((column) => (column.id === sourceColumn.id ? reorderedCardsOnColumn : column)) } else { - const reorderedCardsOnSourceColumn = reorderCardsOnSourceColumn((cards: any) => { - return removeFromArrayAtPosition(cards, fromPosition) - }) - const reorderedCardsOnDestinationColumn = reorderCardsOnDestinationColumn((cards: any) => { - return addInArrayAtPosition(cards, sourceColumn.cards[fromPosition], toPosition) - }) - return reorderColumnsOnBoard((column: any) => { + const reorderedCardsOnSourceColumn = reorderCardsOnSourceColumn((cards) => removeFromArrayAtPosition(cards, fromPosition)) + const reorderedCardsOnDestinationColumn = reorderCardsOnDestinationColumn((cards) => addInArrayAtPosition(cards, sourceColumn.cards[fromPosition], toPosition)) + return reorderColumnsOnBoard((column) => { if (column.id === sourceColumn.id) return reorderedCardsOnSourceColumn if (column.id === destinationColumn.id) return reorderedCardsOnDestinationColumn return column @@ -45,22 +50,18 @@ function moveCard(board: any, { fromPosition, fromColumnId }: any, { toPosition, } } -function addColumn(board: KanbanBoard, column: Partial>) { - return { ...board, columns: addInArrayAtPosition(board.columns, column, board.columns.length) } +function addColumn(board: KanbanBoard, column: Partial>): KanbanBoard { + return { ...board, columns: addInArrayAtPosition(board.columns, column as Column, board.columns.length) } } -function removeColumn(board: KanbanBoard, column: Column) { - return { ...board, columns: board.columns.filter(({ id }: any) => id !== column.id) } +function removeColumn(board: KanbanBoard, column: Column): KanbanBoard { + return { ...board, columns: board.columns.filter(({ id }) => id !== column.id) } } -function changeColumn( - board: KanbanBoard, - column: Column, - newColumn: Partial> -) { +function changeColumn(board: KanbanBoard, column: Column, newColumn: Partial>): KanbanBoard { const changedColumns = replaceElementOfArray(board.columns)({ - when: ({ id }: any) => id === column.id, - for: (value: any) => ({ + when: ({ id }) => id === column.id, + for: (value) => ({ ...value, ...newColumn, }), @@ -68,18 +69,13 @@ function changeColumn( return { ...board, columns: changedColumns } } -function addCard( - board: KanbanBoard, - inColumn: any, - card: TCard, - { on }: any = {} -): KanbanBoard { - const columnToAdd = board.columns.find(({ id }: any) => id === inColumn.id) +function addCard(board: KanbanBoard, inColumn: Column, card: TCard, { on }: { on?: 'top' | 'bottom' } = {}): KanbanBoard { + const columnToAdd = board.columns.find(({ id }) => id === inColumn.id) if (!columnToAdd) throw new Error(`Cannot find column with ID: ${inColumn.id}`) const cards = addInArrayAtPosition(columnToAdd.cards, card, on === 'top' ? 0 : columnToAdd.cards.length) const columns = replaceElementOfArray(board.columns)({ - when: ({ id }: any) => inColumn.id === id, - for: (value: any) => ({ + when: ({ id }) => inColumn.id === id, + for: (value) => ({ ...value, cards, }), @@ -87,19 +83,20 @@ function addCard( return { ...board, columns } } -function removeCard(board: any, fromColumn: any, card: any): KanbanBoard { - const columnToRemove = board.columns.find(({ id }: any) => id === fromColumn.id) - const filteredCards = columnToRemove.cards.filter(({ id }: any) => card.id !== id) +function removeCard(board: KanbanBoard, fromColumn: Column, card: TCard): KanbanBoard { + const columnToRemove = board.columns.find(({ id }) => id === fromColumn.id) + if (!columnToRemove) throw new Error(`Cannot find column with ID: ${fromColumn.id}`) + const filteredCards = columnToRemove.cards.filter(({ id }) => card.id !== id) const columnWithoutCard = { ...columnToRemove, cards: filteredCards } - const filteredColumns = board.columns.map((column: any) => (fromColumn.id === column.id ? columnWithoutCard : column)) + const filteredColumns = board.columns.map((column) => (fromColumn.id === column.id ? columnWithoutCard : column)) return { ...board, columns: filteredColumns } } -function changeCard(board: any, cardId: any, newCard: any) { - const changedCards = (cards: any) => +function changeCard(board: KanbanBoard, cardId: string, newCard: Partial): KanbanBoard { + const changedCards = (cards: TCard[]) => replaceElementOfArray(cards)({ - when: ({ id }: any) => id === cardId, - for: (card: any) => ({ + when: ({ id }) => id === cardId, + for: (card) => ({ ...card, ...newCard, }), @@ -107,7 +104,7 @@ function changeCard(board: any, cardId: any, newCard: any) { return { ...board, - columns: board.columns.map((column: any) => ({ + columns: board.columns.map((column) => ({ ...column, cards: changedCards(column.cards), })),