From ac5434850314b7125103b5bfa3366267f5f74d07 Mon Sep 17 00:00:00 2001 From: Henry Date: Mon, 26 Feb 2024 22:26:45 +0000 Subject: [PATCH] feat: import cards from trello --- src/app/boards/components/BoardsList.tsx | 24 +- .../boards/components/ImportBoardsForm.tsx | 123 ++- src/app/boards/page.tsx | 6 +- src/server/api/routers/import.ts | 114 ++- src/server/db/migrations/0007_open_nuke.sql | 15 + .../db/migrations/meta/0007_snapshot.json | 769 ++++++++++++++++++ src/server/db/migrations/meta/_journal.json | 7 + src/server/db/schema.ts | 57 +- tailwind.config.ts | 2 +- 9 files changed, 1065 insertions(+), 52 deletions(-) create mode 100644 src/server/db/migrations/0007_open_nuke.sql create mode 100644 src/server/db/migrations/meta/0007_snapshot.json diff --git a/src/app/boards/components/BoardsList.tsx b/src/app/boards/components/BoardsList.tsx index 9c682f40..8abeeb6a 100644 --- a/src/app/boards/components/BoardsList.tsx +++ b/src/app/boards/components/BoardsList.tsx @@ -8,18 +8,16 @@ export function BoardsList() { if (data?.length === 0) return <>; return ( - <> - {data?.map((board) => { - return ( - -
-

- {board.name} -

-
- - ); - })} - +
+ {data?.map((board) => ( + +
+

+ {board.name} +

+
+ + ))} +
); } diff --git a/src/app/boards/components/ImportBoardsForm.tsx b/src/app/boards/components/ImportBoardsForm.tsx index 7f39051e..30779691 100644 --- a/src/app/boards/components/ImportBoardsForm.tsx +++ b/src/app/boards/components/ImportBoardsForm.tsx @@ -97,13 +97,37 @@ const SelectSource = ({ handleNextStep }: { handleNextStep: () => void }) => { ); }; -interface ImportTrelloProps { - handleSetAuthDetails: (apiKey: string, token: string) => void; -} +const ImportTrello: React.FC = () => { + const utils = api.useUtils(); + const [apiKey, setApiKey] = useState(""); + const [token, setToken] = useState(""); + const { closeModal } = useModal(); + + const refetchBoards = () => utils.board.all.refetch(); + + const boards = api.import.trello.getBoards.useQuery( + { apiKey, token }, + { + enabled: apiKey && token ? true : false, + }, + ); + + const handleSetAuthDetails = (apiKey: string, token: string) => { + setApiKey(apiKey); + setToken(token); + }; + + const importBoards = api.import.trello.importBoards.useMutation({ + onSuccess: async () => { + try { + await refetchBoards(); + closeModal(); + } catch (e) { + console.log(e); + } + }, + }); -const ImportTrello: React.FC = ({ - handleSetAuthDetails, -}) => { const formik = useFormik({ initialValues: { apiKey: "", @@ -114,6 +138,72 @@ const ImportTrello: React.FC = ({ }, }); + const boardsFormik = useFormik({ + initialValues: { + ...Object.fromEntries( + boards?.data?.map((board) => [board.id, true]) ?? [], + ), + }, + onSubmit: () => { + const boardIds = Object.keys(boardsFormik.values).filter( + (key) => boardsFormik.values[key] === true, + ); + + importBoards.mutate({ + boardIds, + apiKey: formik.values.apiKey, + token: formik.values.token, + }); + }, + enableReinitialize: true, + }); + + if (boards?.data?.length) + return ( +
+
+ {boards.data.map((board) => ( +
+
{ + e.preventDefault(); + await boardsFormik.setFieldValue( + board.id, + !boardsFormik.values[board.id], + ); + }} + > + event.stopPropagation()} + checked={boardsFormik.values[board.id]} + /> + +
+
+ ))} +
+ +
+ +
+
+ ); + return (