import { useState, useEffect } from 'react'; const GarminSync = () => { const [syncStatus, setSyncStatus] = useState(null); const [syncing, setSyncing] = useState(false); const [error, setError] = useState(null); const triggerSync = async () => { setSyncing(true); setError(null); try { // Check API key configuration if (!process.env.REACT_APP_API_KEY) { throw new Error('API key missing - check environment configuration'); } const response = await fetch('/api/workouts/sync', { method: 'POST', headers: { 'X-API-Key': process.env.REACT_APP_API_KEY, 'Content-Type': 'application/json' } }); if (!response.ok) { throw new Error(`Sync failed: ${response.statusText}`); } // Start polling for status updates pollSyncStatus(); } catch (err) { console.error('Garmin sync failed:', err); setError(err.message); setSyncing(false); } }; const pollSyncStatus = () => { const interval = setInterval(async () => { try { const response = await fetch('/api/workouts/sync-status'); const status = await response.json(); setSyncStatus(status); // Stop polling when sync is no longer in progress if (status.status !== 'in_progress') { setSyncing(false); clearInterval(interval); } } catch (err) { console.error('Error fetching sync status:', err); setError('Failed to get sync status'); setSyncing(false); clearInterval(interval); } }, 2000); }; return (

Garmin Connect Sync

{error && (
Error: {error}
)} {syncStatus && (

Sync Status

Last sync:
{syncStatus.last_sync_time ? new Date(syncStatus.last_sync_time).toLocaleString() : 'Never'}
Status:
{syncStatus.status}
{syncStatus.activities_synced > 0 && ( <>
Activities synced:
{syncStatus.activities_synced}
)}
Last Updated:
{syncStatus.last_sync_time ? new Date(syncStatus.last_sync_time).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', hour12: true }) : 'Never'}
{syncStatus.activities_synced > 0 && ( <>
New Activities:
{syncStatus.activities_synced}
)} {syncStatus.warnings?.length > 0 && ( <>
Warnings:
{syncStatus.warnings.join(', ')}
)}
)}
); }; export default GarminSync;