|
|
|
@ -4,7 +4,6 @@ |
|
|
|
|
*/ |
|
|
|
|
import React, { useState, useEffect } from 'react'; |
|
|
|
|
import { |
|
|
|
|
Container, |
|
|
|
|
Typography, |
|
|
|
|
Tooltip, |
|
|
|
|
List, |
|
|
|
@ -12,7 +11,6 @@ import { |
|
|
|
|
ListItemText, |
|
|
|
|
ListItemSecondaryAction, |
|
|
|
|
IconButton, |
|
|
|
|
Checkbox, |
|
|
|
|
Fab, |
|
|
|
|
Dialog, |
|
|
|
|
DialogTitle, |
|
|
|
@ -21,12 +19,6 @@ import { |
|
|
|
|
TextField, |
|
|
|
|
Button, |
|
|
|
|
Box, |
|
|
|
|
MenuItem, |
|
|
|
|
Select, |
|
|
|
|
FormControl, |
|
|
|
|
InputLabel, |
|
|
|
|
ListItemIcon, |
|
|
|
|
AlertColor |
|
|
|
|
} from '@mui/material'; |
|
|
|
|
import { |
|
|
|
|
Add as AddIcon, Delete as DeleteIcon, ShoppingBasket as ShoppingBasketIcon, |
|
|
|
@ -48,6 +40,9 @@ const AddRecipe: React.FC = () => { |
|
|
|
|
|
|
|
|
|
// 編集時,既存情報を読み込んだかどうか
|
|
|
|
|
const [recipeLoaded, setRecipeLoaded] = useState(false); |
|
|
|
|
// 何人分かを格納する
|
|
|
|
|
const [numOfPeaple, setNumOfPeaple] = useState<number>(1); |
|
|
|
|
const [openNumOfPeapleDialog, setOpenNumOfPeapleDialog] = useState(false); |
|
|
|
|
// 料理名,説明
|
|
|
|
|
const [recipeName, setRecipeName] = useState<string>(''); |
|
|
|
|
const [recipeSummary, setRecipeSummary] = useState<string>(''); |
|
|
|
@ -84,17 +79,20 @@ const AddRecipe: React.FC = () => { |
|
|
|
|
|
|
|
|
|
if (!recipeName) { |
|
|
|
|
showErrorMessage('レシピ名が入力されていません!') |
|
|
|
|
console.log("yes1"); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!items.length) { |
|
|
|
|
showErrorMessage('材料が追加されていません!') |
|
|
|
|
console.log("yes2"); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
if (!recipeId) { |
|
|
|
|
// 新規追加
|
|
|
|
|
console.log("yes3"); |
|
|
|
|
// 新規追加
|
|
|
|
|
const response = await recipeApi.addRecipe({ |
|
|
|
|
recipeName, |
|
|
|
|
summary: recipeSummary, |
|
|
|
@ -113,10 +111,26 @@ const AddRecipe: React.FC = () => { |
|
|
|
|
showErrorMessage('レシピの送信に失敗しました。同じ料理名が存在する可能性があります。'); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
console.log("yes4"); |
|
|
|
|
return recipeId; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const checkRecipeAndItems = async () => { |
|
|
|
|
|
|
|
|
|
if (!recipeName) { |
|
|
|
|
showErrorMessage('レシピ名が入力されていません!') |
|
|
|
|
console.log("yes1"); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!items.length) { |
|
|
|
|
showErrorMessage('材料が追加されていません!') |
|
|
|
|
console.log("yes2"); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const handleSubmit = async () => { |
|
|
|
|
const recipeId = await handleSaveRecipe(); |
|
|
|
|
if (!recipeId) return; |
|
|
|
@ -125,13 +139,34 @@ const AddRecipe: React.FC = () => { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const handleSubmitAndAddToBuy = async () => { |
|
|
|
|
console.log("too"); |
|
|
|
|
console.log(recipeName); |
|
|
|
|
const recipeId = await handleSaveRecipe(); |
|
|
|
|
console.log("before"); |
|
|
|
|
if (!recipeId) return false; |
|
|
|
|
await toBuyApi.addByRecipe(recipeId); |
|
|
|
|
console.log("ds"); |
|
|
|
|
if (!numOfPeaple) { |
|
|
|
|
showErrorMessage('人数が入力されていません!') |
|
|
|
|
console.log("yes2"); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
await toBuyApi.addByRecipe(recipeId, numOfPeaple); |
|
|
|
|
showSuccessMessage('レシピが保存されて買うものリストに追加されました!'); |
|
|
|
|
navigate('/tasks'); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const openNumOfPeopleDialog = async () => { |
|
|
|
|
const check = await checkRecipeAndItems(); |
|
|
|
|
if (!check) return false; |
|
|
|
|
setOpenNumOfPeapleDialog(true); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const cancelNumOfPeopleDialog = async () => { |
|
|
|
|
const recipeId = await handleSaveRecipe(); |
|
|
|
|
if (!recipeId) return false; |
|
|
|
|
setOpenNumOfPeapleDialog(false); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// コンポーネントマウント時にタスク一覧を取得
|
|
|
|
|
useEffect(() => { |
|
|
|
|
loadRecipe(); |
|
|
|
@ -211,6 +246,7 @@ const AddRecipe: React.FC = () => { |
|
|
|
|
|
|
|
|
|
))}</List>)} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div style={{ position: "fixed", left: "80%", transform: 'translateX(-50%)', bottom: "10%" }}> |
|
|
|
|
<Box sx={{ textAlign: 'center' }}> |
|
|
|
@ -226,7 +262,7 @@ const AddRecipe: React.FC = () => { |
|
|
|
|
<SaveIcon sx={{ fontSize: "1.5rem", marginRight: "0.5rem" }} /> |
|
|
|
|
レシピを保存 |
|
|
|
|
</Button> |
|
|
|
|
<Button variant='contained' color="primary" onClick={handleSubmitAndAddToBuy}> |
|
|
|
|
<Button variant='contained' color="primary" onClick={openNumOfPeopleDialog}> |
|
|
|
|
<ListAltIcon sx={{ fontSize: "1.5rem", marginRight: "0.5rem" }} /> |
|
|
|
|
保存して買うものリストへ追加 |
|
|
|
|
</Button> |
|
|
|
@ -272,6 +308,45 @@ const AddRecipe: React.FC = () => { |
|
|
|
|
setOpenAmountDialog(false); |
|
|
|
|
}} /> |
|
|
|
|
|
|
|
|
|
{/* 人数入力ダイアログ */} |
|
|
|
|
<Dialog open={openNumOfPeapleDialog} onClose={() => setOpenNumOfPeapleDialog(false)} disableScrollLock={true} |
|
|
|
|
style={{ width : '100%', position : 'fixed', left: '50%', transform: 'translateX(-50%)' }} |
|
|
|
|
> |
|
|
|
|
<Box display="flex" alignItems="center" |
|
|
|
|
> |
|
|
|
|
<DialogTitle sx={{ flexGrow: 1 }}>買うものリストへ追加</DialogTitle> |
|
|
|
|
</Box> |
|
|
|
|
<DialogContent> |
|
|
|
|
<div> |
|
|
|
|
{/* 人数入力フィールド */} |
|
|
|
|
<TextField |
|
|
|
|
margin="dense" |
|
|
|
|
label="何人前" |
|
|
|
|
fullWidth |
|
|
|
|
value={numOfPeaple} |
|
|
|
|
onChange={(e) => { |
|
|
|
|
const value = e.target.value; |
|
|
|
|
const parsedValue = parseInt(value, 10); // 数値に変換
|
|
|
|
|
if (/*!isNaN(parsedValue) && */ isNaN(parsedValue) || parsedValue >= 1) { //負数除外
|
|
|
|
|
setNumOfPeaple(parsedValue); // number型で保存
|
|
|
|
|
} |
|
|
|
|
}} |
|
|
|
|
sx={{ minWidth: "8px", width: "100%" }} |
|
|
|
|
type="number" |
|
|
|
|
inputProps={{ inputMode: "numeric", pattern: "[0-9]*" }} // ここで整数のみ許可
|
|
|
|
|
|
|
|
|
|
/> |
|
|
|
|
</div> |
|
|
|
|
</DialogContent> |
|
|
|
|
<DialogActions> |
|
|
|
|
<Button onClick={() => setOpenNumOfPeapleDialog(false)}>前の画面に戻る</Button> |
|
|
|
|
<Button onClick={() => handleSubmitAndAddToBuy()} variant="contained" |
|
|
|
|
style={{ width: '40%', fontSize: 'clamp(12px, 3vw, 20px)' }} |
|
|
|
|
> |
|
|
|
|
追加 |
|
|
|
|
</Button> |
|
|
|
|
</DialogActions> |
|
|
|
|
</Dialog> |
|
|
|
|
</Box> |
|
|
|
|
} |
|
|
|
|
</> |
|
|
|
|