import React, { useState, useEffect } from 'react'; import { GenericModal } from "../atoms/GenericModal"; import { MenuItem, Typography, CircularProgress, Alert, AlertTitle, Chip } from "@mui/material"; import Button from "@mui/material/Button"; import TextField from "@mui/material/TextField"; import axios from 'axios'; import { useGlobalInfoStore } from '../../context/globalInfo'; import { getStoredRecording } from '../../api/storage'; import { apiUrl } from '../../apiConfig.js'; interface IntegrationProps { isOpen: boolean; handleStart: (data: IntegrationSettings) => void; handleClose: () => void; } export interface IntegrationSettings { spreadsheetId: string; spreadsheetName: string; data: string; } export const IntegrationSettingsModal = ({ isOpen, handleStart, handleClose }: IntegrationProps) => { const [settings, setSettings] = useState({ spreadsheetId: '', spreadsheetName: '', data: '', }); const [spreadsheets, setSpreadsheets] = useState<{ id: string, name: string }[]>([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const { recordingId, notify } = useGlobalInfoStore(); const [recording, setRecording] = useState(null); const authenticateWithGoogle = () => { window.location.href = `${apiUrl}/auth/google?robotId=${recordingId}`; }; const handleOAuthCallback = async () => { try { const response = await axios.get(`${apiUrl}/auth/google/callback`); const { google_sheet_email, files } = response.data; } catch (error) { setError('Error authenticating with Google'); } }; const fetchSpreadsheetFiles = async () => { try { const response = await axios.get(`${apiUrl}/auth/gsheets/files?robotId=${recordingId}`, { withCredentials: true, }); setSpreadsheets(response.data); } catch (error: any) { console.error('Error fetching spreadsheet files:', error.response?.data?.message || error.message); notify('error', `Error fetching spreadsheet files: ${error.response?.data?.message || error.message}`); } }; const handleSpreadsheetSelect = (e: React.ChangeEvent) => { const selectedSheet = spreadsheets.find(sheet => sheet.id === e.target.value); if (selectedSheet) { setSettings({ ...settings, spreadsheetId: selectedSheet.id, spreadsheetName: selectedSheet.name }); } }; const updateGoogleSheetId = async () => { try { const response = await axios.post( `${apiUrl}/auth/gsheets/update`, { spreadsheetId: settings.spreadsheetId, spreadsheetName: settings.spreadsheetName, robotId: recordingId }, { withCredentials: true } ); console.log('Google Sheet ID updated:', response.data); } catch (error: any) { console.error('Error updating Google Sheet ID:', error.response?.data?.message || error.message); } }; const removeIntegration = async () => { try { await axios.post( `${apiUrl}/auth/gsheets/remove`, { robotId: recordingId }, { withCredentials: true } ); setRecording(null); setSpreadsheets([]); setSettings({ spreadsheetId: '', spreadsheetName: '', data: '' }); } catch (error: any) { console.error('Error removing Google Sheets integration:', error.response?.data?.message || error.message); } }; useEffect(() => { // Check if we're on the callback URL const urlParams = new URLSearchParams(window.location.search); const code = urlParams.get('code'); if (code) { handleOAuthCallback(); } const fetchRecordingInfo = async () => { if (!recordingId) return; const recording = await getStoredRecording(recordingId); if (recording) { setRecording(recording); } }; fetchRecordingInfo(); }, [recordingId]); return (
Integrate with Google Sheet {recording && recording.google_sheet_id ? ( <> Google Sheet Integrated Successfully. Every time this robot creates a successful run, its captured data is appended to your {recording.google_sheet_name} Google Sheet. You can check the data updates here.
Note: The data extracted before integrating with Google Sheets will not be synced in the Google Sheet. Only the data extracted after the integration will be synced.
) : ( <> {!recording?.google_sheet_email ? ( <>

If you enable this option, every time this robot runs a task successfully, its captured data will be appended to your Google Sheet.

) : ( <> {recording.google_sheet_email && ( Authenticated as: {recording.google_sheet_email} )} {loading ? ( ) : error ? ( {error} ) : spreadsheets.length === 0 ? ( <>
) : ( <> {spreadsheets.map(sheet => ( {sheet.name} ))} {settings.spreadsheetId && ( Selected Sheet: {spreadsheets.find(s => s.id === settings.spreadsheetId)?.name} (ID: {settings.spreadsheetId}) )} )} )} )}
); }; export const modalStyle = { top: '40%', left: '50%', transform: 'translate(-50%, -50%)', width: '50%', backgroundColor: 'background.paper', p: 4, height: 'fit-content', display: 'block', padding: '20px', };