import clsx from 'clsx'; import React, { useState } from 'react'; import { useEnv } from '@/context/EnvContext'; import { useTranslation } from '@/hooks/useTranslation'; import { useSettingsStore } from '@/store/settingsStore'; import { eventDispatcher } from '@/utils/event'; import { ReadwiseClient } from '@/services/readwise'; import SubPageHeader from '../SubPageHeader'; import { SectionTitle, SettingLabel } from '../primitives'; interface ReadwiseFormProps { onBack: () => void; } const ReadwiseForm: React.FC = ({ onBack }) => { const _ = useTranslation(); const { envConfig } = useEnv(); const { settings, setSettings, saveSettings } = useSettingsStore(); const [accessToken, setAccessToken] = useState(''); const [isConnecting, setIsConnecting] = useState(false); const isConfigured = !!settings.readwise?.accessToken; const handleConnect = async () => { setIsConnecting(true); try { const client = new ReadwiseClient({ enabled: true, accessToken, lastSyncedAt: 0 }); const { valid, isNetworkError } = await client.validateToken(); if (valid) { const newSettings = { ...settings, readwise: { enabled: true, accessToken, lastSyncedAt: settings.readwise?.lastSyncedAt ?? 0, }, }; setSettings(newSettings); await saveSettings(envConfig, newSettings); } else if (isNetworkError) { eventDispatcher.dispatch('toast', { message: _('Unable to connect to Readwise. Please check your network connection.'), type: 'error', }); } else { eventDispatcher.dispatch('toast', { message: _('Invalid Readwise access token'), type: 'error', }); } } finally { setIsConnecting(false); setAccessToken(''); } }; const handleDisconnect = async () => { const newSettings = { ...settings, readwise: { enabled: false, accessToken: '', lastSyncedAt: 0 }, }; setSettings(newSettings); await saveSettings(envConfig, newSettings); eventDispatcher.dispatch('toast', { message: _('Disconnected from Readwise'), type: 'info' }); }; const handleToggleEnabled = async () => { const newSettings = { ...settings, readwise: { ...settings.readwise, enabled: !settings.readwise?.enabled }, }; setSettings(newSettings); await saveSettings(envConfig, newSettings); }; const lastSyncedAt = settings.readwise?.lastSyncedAt ?? 0; const lastSyncedLabel = lastSyncedAt ? new Date(lastSyncedAt).toLocaleString() : _('Never'); const description: React.ReactNode = isConfigured ? ( _('Connected to Readwise. Last synced {{time}}.', { time: lastSyncedLabel }) ) : ( <> {_('Connect your Readwise account to sync highlights.')} {_('Get your access token at')}{' '} readwise.io/access_token . ); return (
{isConfigured ? (
) : (
{_('Access Token')} setAccessToken(e.target.value)} />
)}
); }; export default ReadwiseForm;