import React, { useState, useEffect } from 'react' import { useForm } from 'react-hook-form' import { zodResolver } from '@hookform/resolvers/zod' import { z } from 'zod' import { Link } from 'react-router-dom' import { Box, Button, Input, VStack, HStack, Text, Heading, Card, Textarea, Stack, } from '@chakra-ui/react' import { Field } from '../../components/ui/field' import { cigarettesApi } from '../../api/client' import { URLs } from '../../__data__/urls' import type { Cigarette } from '../../types/api' const logCigaretteSchema = z.object({ smokedAt: z.string().optional(), note: z.string().optional(), }) type LogCigaretteFormData = z.infer export const TrackerPage: React.FC = () => { const [cigarettes, setCigarettes] = useState([]) const [isLoading, setIsLoading] = useState(false) const [error, setError] = useState(null) const [success, setSuccess] = useState(null) const { register, handleSubmit, reset, formState: { errors }, } = useForm({ resolver: zodResolver(logCigaretteSchema), }) const fetchCigarettes = async () => { try { const response = await cigarettesApi.getAll() if (response.success) { // Show most recent first setCigarettes(response.body.reverse()) } } catch (err: any) { console.error('Failed to fetch cigarettes:', err) } } useEffect(() => { fetchCigarettes() }, []) const logQuick = async () => { setIsLoading(true) setError(null) setSuccess(null) try { const response = await cigarettesApi.log({}) if (response.success) { setSuccess('Сигарета записана!') await fetchCigarettes() setTimeout(() => setSuccess(null), 3000) } } catch (err: any) { const errorMessage = err?.response?.data?.errors || err?.response?.data?.message || 'Ошибка при записи' setError(errorMessage) } finally { setIsLoading(false) } } const onSubmit = async (data: LogCigaretteFormData) => { setIsLoading(true) setError(null) setSuccess(null) try { const response = await cigarettesApi.log({ smokedAt: data.smokedAt || undefined, note: data.note || undefined, }) if (response.success) { setSuccess('Сигарета записана с заметкой!') reset() await fetchCigarettes() setTimeout(() => setSuccess(null), 3000) } } catch (err: any) { const errorMessage = err?.response?.data?.errors || err?.response?.data?.message || 'Ошибка при записи' setError(errorMessage) } finally { setIsLoading(false) } } const formatDate = (dateString: string) => { const date = new Date(dateString) return date.toLocaleString('ru-RU', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit', }) } return ( Трекер курения {/* Quick log button */} Быстрая запись {/* Form with custom time and note */}
Запись с дополнительными данными