817d6dcb05
* Add ability to associate a new company to pipeline * Fix tests
83 lines
2.3 KiB
TypeScript
83 lines
2.3 KiB
TypeScript
import { useCallback, useState } from 'react';
|
|
import { useRecoilState } from 'recoil';
|
|
import { v4 as uuidv4 } from 'uuid';
|
|
|
|
import { Column } from '@/ui/components/board/Board';
|
|
import { NewButton as UINewButton } from '@/ui/components/board/NewButton';
|
|
import { RecoilScope } from '@/ui/hooks/RecoilScope';
|
|
import {
|
|
Company,
|
|
PipelineProgressableType,
|
|
useCreateOnePipelineProgressMutation,
|
|
} from '~/generated/graphql';
|
|
|
|
import { boardColumnsState } from '../states/boardColumnsState';
|
|
import { boardItemsState } from '../states/boardItemsState';
|
|
|
|
import { NewCompanyBoardCard } from './NewCompanyBoardCard';
|
|
|
|
type OwnProps = {
|
|
pipelineId: string;
|
|
columnId: string;
|
|
};
|
|
|
|
export function NewButton({ pipelineId, columnId }: OwnProps) {
|
|
const [isCreatingCard, setIsCreatingCard] = useState(false);
|
|
const [board, setBoard] = useRecoilState(boardColumnsState);
|
|
const [items, setItems] = useRecoilState(boardItemsState);
|
|
|
|
const [createOnePipelineProgress] = useCreateOnePipelineProgressMutation();
|
|
const onEntitySelect = useCallback(
|
|
async (company: Pick<Company, 'id' | 'name' | 'domainName'>) => {
|
|
setIsCreatingCard(false);
|
|
const newUuid = uuidv4();
|
|
const newBoard = JSON.parse(JSON.stringify(board));
|
|
const destinationColumnIndex = newBoard.findIndex(
|
|
(column: Column) => column.id === columnId,
|
|
);
|
|
newBoard[destinationColumnIndex].itemKeys.push(newUuid);
|
|
setItems({
|
|
...items,
|
|
[newUuid]: {
|
|
id: company.id,
|
|
name: company.name,
|
|
domainName: company.domainName,
|
|
createdAt: new Date().toISOString(),
|
|
},
|
|
});
|
|
setBoard(newBoard);
|
|
await createOnePipelineProgress({
|
|
variables: {
|
|
pipelineStageId: columnId,
|
|
pipelineId,
|
|
entityId: company.id,
|
|
entityType: PipelineProgressableType.Company,
|
|
},
|
|
});
|
|
},
|
|
[
|
|
createOnePipelineProgress,
|
|
columnId,
|
|
pipelineId,
|
|
board,
|
|
setBoard,
|
|
items,
|
|
setItems,
|
|
],
|
|
);
|
|
|
|
const onNewClick = useCallback(() => {
|
|
setIsCreatingCard(true);
|
|
}, [setIsCreatingCard]);
|
|
return (
|
|
<>
|
|
{isCreatingCard && (
|
|
<RecoilScope>
|
|
<NewCompanyBoardCard onEntitySelect={onEntitySelect} />
|
|
</RecoilScope>
|
|
)}
|
|
<UINewButton onClick={onNewClick} />
|
|
</>
|
|
);
|
|
}
|