/** * テストページコンポーネント * 白紙の状態で表示されるテスト用のページ */ import React, { useState, useEffect } from 'react'; import { Container, Typography, Tooltip, List, ListItem, ListItemText, ListItemSecondaryAction, IconButton, Checkbox, Fab, Dialog, DialogTitle, DialogContent, DialogActions, TextField, Button, Box, MenuItem, Select, FormControl, InputLabel, ListItemIcon } from '@mui/material'; import { Add as AddIcon, Delete as DeleteIcon, ShoppingBasket as ShoppingBasketIcon, SoupKitchen as SoupKitchenIcon, Edit as EditIcon, Save as SaveIcon, ListAlt as ListAltIcon } from '@mui/icons-material'; import AddStuffAmountDialog from '../components/AddStuffAmountDialog'; import { StuffAndCategoryAndAmount } from '../types/types'; import EditAmountDialog from '../components/EditAmountDialog'; import { recipeApi, toBuyApi } from '../services/api'; import { useNavigate, useParams } from 'react-router-dom'; const AddRecipe: React.FC = () => { const { recipeId: recipeIdStr } = useParams(); const recipeId = recipeIdStr ? parseInt(recipeIdStr) : null const navigate = useNavigate(); // 料理名,説明 const [recipeName, setRecipeName] = useState(''); const [recipeSummary, setRecipeSummary] = useState(''); // 材料リスト const [items, setItems] = useState([]); // 材料追加作成ダイアログの表示状態 const [openAddDialog, setOpenAddDialog] = useState(false); // 材料追加作成ダイアログの表示状態 const [openAmountDialog, setOpenAmountDialog] = useState(false); // 新規アイテムの入力内容 const emptyItem: StuffAndCategoryAndAmount = { stuffId: null, stuffName: '', category: '', amount: 1 } const [newItem, setNewItem] = useState(emptyItem); // 編集しているアイテム const [editingItem, setEditingItem] = useState(emptyItem); const [editingItemIdx, setEditingItemIdx] = useState(0); const loadRecipe = async () => { if (recipeId && !recipeName) { const recipe = await recipeApi.getById(recipeId); console.log('loaded recipe=', recipe) setRecipeName(recipe.recipeName) setRecipeSummary(recipe.summary) setItems(recipe.stuffAndAmountArray) } } const handleSaveRecipe = async () => { if (!recipeId) { // 新規追加 const response = await recipeApi.addRecipe({ recipeName, summary: recipeSummary, stuffAndAmountArray: items, }) return response.recipeId; } const response = await recipeApi.updateRecipe({ recipeId, recipeName, summary: recipeSummary, stuffAndAmountArray: items, }) return recipeId; } const handleSubmit = async () => { const recipeId = await handleSaveRecipe(); // alert('レシピが保存されました!'); navigate('/recipeList'); } const handleSubmitAndAddToBuy = async () => { const recipeId = await handleSaveRecipe(); await toBuyApi.addByRecipe(recipeId); // alert('レシピが保存されて買うものリストに追加されました!'); navigate('/tasks'); } // コンポーネントマウント時にタスク一覧を取得 useEffect(() => { loadRecipe(); }, []); return ( (recipeId && !recipeName) ?

読み込み中...

:

{!recipeId ? '料理の追加' : '料理の編集'}

setRecipeName(e.target.value)} /> setRecipeSummary(e.target.value)} />

材料リスト

{/* すべての材料情報を表示 */} {(!items || !items.length) ? (

+ボタンで材料を追加してください

) : ({items.map((item, index) => ( {/* 買い物リスト:食材情報記入ボタン */} {`× ${item.amount}`} {/* 買い物リスト:数量変更ボタン */} { setOpenAmountDialog(true) setEditingItemIdx(index) setEditingItem(item) }} > {/* 買い物リスト:食材削除ボタン */} setItems([...items.slice(0, index), ...items.slice(index + 1)])}> ))})}
材料を追加 setOpenAddDialog(true)}>
{/* 新規材料追加ダイアログ */} { console.log('newItem:', newItem); setItems([...items, newItem]); setOpenAddDialog(false); }} /> {/* 数量変更ダイアログ */} setEditingItem({ ...editingItem, ...v })} onSubmit={() => { setItems([...items.slice(0, editingItemIdx), editingItem, ...items.slice(editingItemIdx + 1)]) setOpenAmountDialog(false); }} />
); }; export default AddRecipe;