From d21c368cfdb441a03c20dd54c8b43277b2619569 Mon Sep 17 00:00:00 2001 From: jessikitty Date: Tue, 27 Jan 2026 22:22:59 +1100 Subject: [PATCH] Add CreateChoreModal component --- frontend/src/components/CreateChoreModal.tsx | 206 +++++++++++++++++++ 1 file changed, 206 insertions(+) create mode 100644 frontend/src/components/CreateChoreModal.tsx diff --git a/frontend/src/components/CreateChoreModal.tsx b/frontend/src/components/CreateChoreModal.tsx new file mode 100644 index 0000000..fe34554 --- /dev/null +++ b/frontend/src/components/CreateChoreModal.tsx @@ -0,0 +1,206 @@ +import React, { useState, useEffect } from 'react'; +import { choreService, CreateChoreRequest } from '../api/chores'; +import api from '../api/axios'; +import { User } from '../api/auth'; + +interface CreateChoreModalProps { + onClose: () => void; + onSuccess: () => void; +} + +const CreateChoreModal: React.FC = ({ onClose, onSuccess }) => { + const [formData, setFormData] = useState({ + title: '', + description: '', + room: '', + frequency: 'once', + assigned_to: undefined, + due_date: '', + }); + const [users, setUsers] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(''); + + useEffect(() => { + loadUsers(); + }, []); + + const loadUsers = async () => { + try { + const response = await api.get('/api/v1/users'); + setUsers(response.data); + } catch (error) { + console.error('Failed to load users:', error); + } + }; + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setError(''); + setIsLoading(true); + + try { + await choreService.createChore(formData); + onSuccess(); + } catch (err: any) { + setError(err.response?.data?.detail || 'Failed to create task'); + } finally { + setIsLoading(false); + } + }; + + const handleChange = (e: React.ChangeEvent) => { + const { name, value } = e.target; + setFormData(prev => ({ + ...prev, + [name]: name === 'assigned_to' ? (value ? parseInt(value) : undefined) : value, + })); + }; + + return ( +
+
+
+
+

Create New Task

+ +
+ +
+ {error && ( +
+ {error} +
+ )} + +
+ + +
+ +
+ +