import React, { useState, useEffect } from 'react' import { useAuth } from './auth/AuthContext' import LoadingError from './LoadingError' import Toast from './Toast' import './Integrations.css' function TodoistIntegration({ onNavigate }) { const { authFetch } = useAuth() const [connected, setConnected] = useState(false) const [todoistEmail, setTodoistEmail] = useState('') const [loading, setLoading] = useState(true) const [error, setError] = useState('') const [message, setMessage] = useState('') const [toastMessage, setToastMessage] = useState(null) const [isLoadingError, setIsLoadingError] = useState(false) useEffect(() => { checkStatus() // Проверяем URL параметры для сообщений const params = new URLSearchParams(window.location.search) const integration = params.get('integration') const status = params.get('status') if (integration === 'todoist') { if (status === 'connected') { setMessage('✅ Todoist успешно подключен!') // Очищаем URL параметры window.history.replaceState({}, '', window.location.pathname) } else if (status === 'error') { const errorMsg = params.get('message') || 'Произошла ошибка' setToastMessage({ text: errorMsg, type: 'error' }) window.history.replaceState({}, '', window.location.pathname) } } }, []) const checkStatus = async () => { try { setLoading(true) setError('') const response = await authFetch('/api/integrations/todoist/status') if (!response.ok) { throw new Error('Ошибка при проверке статуса') } const data = await response.json() setConnected(data.connected || false) if (data.connected && data.todoist_email) { setTodoistEmail(data.todoist_email) } } catch (error) { console.error('Error checking status:', error) setError(error.message || 'Не удалось проверить статус') setIsLoadingError(true) } finally { setLoading(false) } } const handleConnect = async () => { try { setLoading(true) setError('') // Получаем URL для редиректа через авторизованный запрос const response = await authFetch('/api/integrations/todoist/oauth/connect') if (!response.ok) { const errorData = await response.json().catch(() => ({})) throw new Error(errorData.error || 'Ошибка при подключении Todoist') } const data = await response.json() if (data.auth_url) { // Делаем редирект на Todoist OAuth window.location.href = data.auth_url } else { throw new Error('URL для авторизации не получен') } } catch (error) { console.error('Error connecting Todoist:', error) setToastMessage({ text: error.message || 'Не удалось подключить Todoist', type: 'error' }) setLoading(false) } } const handleDisconnect = async () => { if (!window.confirm('Вы уверены, что хотите отключить Todoist?')) { return } try { setLoading(true) setError('') const response = await authFetch('/api/integrations/todoist/disconnect', { method: 'DELETE', }) if (!response.ok) { const errorData = await response.json().catch(() => ({})) throw new Error(errorData.error || 'Ошибка при отключении') } setConnected(false) setTodoistEmail('') setToastMessage({ text: 'Todoist отключен', type: 'success' }) } catch (error) { console.error('Error disconnecting:', error) setToastMessage({ text: error.message || 'Не удалось отключить Todoist', type: 'error' }) } finally { setLoading(false) } } if (isLoadingError && !loading) { return (
) } return (

Todoist интеграция

{loading ? (
Загрузка...
) : connected ? (

Статус подключения

✅ Todoist подключен
{todoistEmail && (
Email: {todoistEmail}
)}

Как это работает

✅ Todoist подключен! Закрывайте задачи в Todoist — они автоматически появятся в Play Life.

Никаких дополнительных настроек не требуется. Просто закрывайте задачи в Todoist, и они будут обработаны автоматически.

) : (

Подключение Todoist

Подключите свой Todoist аккаунт для автоматической обработки закрытых задач.

Что нужно сделать

  1. Нажмите кнопку "Подключить Todoist"
  2. Авторизуйтесь в Todoist
  3. Готово! Закрытые задачи будут автоматически обрабатываться
)} {toastMessage && ( setToastMessage(null)} /> )}
) } export default TodoistIntegration