import React, { useState } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import * as z from "zod"; import { Button } from "@/components/ui/button"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { TrelloBoard } from "./types"; import { toast } from "sonner"; const trelloCredentialsSchema = z.object({ trello_api_key: z.string().min(1, "API Key is required."), trello_api_token: z.string().min(1, "Token is required."), }); type TrelloCredentialsFormValues = z.infer; interface Props { connectorId: number; config: { trello_api_key?: string; trello_api_token?: string; selected_boards?: TrelloBoard[]; }; onConfigUpdate: (newConfig: any) => Promise; } const EditTrelloConnectorConfig: React.FC = ({ connectorId, config, onConfigUpdate, }) => { const [boards, setBoards] = useState([]); const [isLoading, setIsLoading] = useState(false); const [selectedBoards, setSelectedBoards] = useState( config.selected_boards || [] ); const form = useForm({ resolver: zodResolver(trelloCredentialsSchema), defaultValues: { trello_api_key: config.trello_api_key || "", trello_api_token: config.trello_api_token || "", }, }); const handleFetchBoards = async (values: TrelloCredentialsFormValues) => { setIsLoading(true); try { const response = await fetch("/api/trello/boards", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(values), }); if (!response.ok) { throw new Error("Failed to fetch Trello boards."); } const data: TrelloBoard[] = await response.json(); setBoards(data); toast.success("Successfully fetched Trello boards."); } catch (error) { toast.error("Failed to fetch Trello boards."); } finally { setIsLoading(false); } }; const handleToggleBoardSelection = (board: TrelloBoard) => { setSelectedBoards((prev) => prev.find((b) => b.id === board.id) ? prev.filter((b) => b.id !== board.id) : [...prev, board] ); }; const handleSaveChanges = async () => { try { await onConfigUpdate({ ...config, selected_boards: selectedBoards, }); toast.success("Changes saved successfully."); } catch (error) { toast.error("Failed to save changes."); } }; return (
( Trello API Key )} /> ( Trello API Token )} /> {boards.length > 0 && (

Select Boards to Index

{boards.map((board) => (
{board.name}
))}
)}
); }; export default EditTrelloConnectorConfig;