build for prod

This commit is contained in:
fred 2025-08-05 22:53:11 +00:00
parent 93e298a9f1
commit e9eea69545
9 changed files with 25 additions and 138 deletions

View file

@ -8,6 +8,7 @@
"name": "frontend", "name": "frontend",
"version": "0.0.0", "version": "0.0.0",
"dependencies": { "dependencies": {
"@types/node": "^24.2.0",
"autoprefixer": "^10.4.21", "autoprefixer": "^10.4.21",
"react": "^19.1.0", "react": "^19.1.0",
"react-dom": "^19.1.0", "react-dom": "^19.1.0",
@ -1464,6 +1465,15 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/node": {
"version": "24.2.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.2.0.tgz",
"integrity": "sha512-3xyG3pMCq3oYCNg7/ZP+E1ooTaGB4cG8JWRsqqOYQdbWNY4zbaV0Ennrd7stjiJEFZCaybcIgpTjJWHRfBSIDw==",
"license": "MIT",
"dependencies": {
"undici-types": "~7.10.0"
}
},
"node_modules/@types/react": { "node_modules/@types/react": {
"version": "19.1.8", "version": "19.1.8",
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz",
@ -4160,6 +4170,12 @@
"typescript": ">=4.8.4 <5.9.0" "typescript": ">=4.8.4 <5.9.0"
} }
}, },
"node_modules/undici-types": {
"version": "7.10.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz",
"integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==",
"license": "MIT"
},
"node_modules/update-browserslist-db": { "node_modules/update-browserslist-db": {
"version": "1.1.3", "version": "1.1.3",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",

View file

@ -5,13 +5,14 @@
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite --host 0.0.0.0 --port 80", "dev": "vite --host 0.0.0.0 --port 80",
"production": "vite --host 0.0.0.0 --port 80", "production": "tsc -b && vite build && vite --host 0.0.0.0 --port 80",
"demo": "vite --host 0.0.0.0 --port 80", "demo": "tsc -b && vite build && vite --host 0.0.0.0 --port 80",
"build": "tsc -b && vite build", "build": "tsc -b && vite build",
"lint": "eslint .", "lint": "eslint .",
"preview": "vite preview" "preview": "vite preview"
}, },
"dependencies": { "dependencies": {
"@types/node": "^24.2.0",
"autoprefixer": "^10.4.21", "autoprefixer": "^10.4.21",
"react": "^19.1.0", "react": "^19.1.0",
"react-dom": "^19.1.0", "react-dom": "^19.1.0",

View file

@ -1,79 +0,0 @@
import React, { useState } from 'react';
import { type Ingredient } from "../types/Recipe";
interface AddIngredientFormProps {
ingredients: Ingredient[];
onSubmit?: (ingredients: Ingredient[]) => void;
}
const AddIngredientsForm: React.FC<AddIngredientFormProps> = ({ ingredients, onSubmit }) => {
const [newIngredient, setNewIngredient] = useState<Partial<Ingredient>>({});
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const { name, value } = e.target;
setNewIngredient(prev => ({ ...prev, [name]: value }));
};
const handleSelectChange = (e: React.ChangeEvent<HTMLSelectElement>) => {
const { name, value } = e.target;
setNewIngredient(prev => ({ ...prev, [name]: value }));
};
const handleIngredientSubmit = (e: React.FormEvent) => {
e.preventDefault();
if (!newIngredient.name || !newIngredient.quantity || !newIngredient.unit) {
return;
}
const newIngredientObj: Ingredient = {
quantity: parseFloat(newIngredient.quantity.toString()),
unit: newIngredient.unit,
name: newIngredient.name
};
const updatedIngredients = [...ingredients, newIngredientObj];
setNewIngredient({});
if (onSubmit) onSubmit(updatedIngredients);
};
return (
<div>
<form onSubmit={handleIngredientSubmit}>
<input
type="number"
name="quantity"
placeholder="Quantity"
value={(newIngredient.quantity !== undefined ? newIngredient.quantity : '')}
onChange={handleChange}
/>
<select
name="unit"
value={newIngredient.unit || ''}
onChange={handleSelectChange}
>
<option value="">Select Unit</option>
<option value="grams">Grams</option>
<option value="kilograms">Kilograms</option>
<option value="cups">Cups</option>
</select>
<input
type="text"
name="name"
placeholder="Ingredient Name"
value={newIngredient.name || ''}
onChange={handleChange}
/>
<button type="submit">Add Ingredient</button>
</form>
</div>
);
};
export default AddIngredientsForm;

View file

@ -1,51 +0,0 @@
import React, { useState } from 'react';
import { type Step } from "../types/Recipe";
interface AddStepFormProps {
steps: Step[];
onSubmit?: (steps: Step[]) => void;
}
const AddStepsForm: React.FC<AddStepFormProps> = ({ steps, onSubmit }) => {
const [newStep, setNewStep] = useState<Partial<Step>>({});
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const { name, value } = e.target;
setNewStep(prev => ({ ...prev, [name]: value }));
}
const handleStepSubmit = (e: React.FormEvent) => {
e.preventDefault();
if (!newStep.instructions) {
return;
}
const newStepObj: Step = {
idx: steps.length + 1,
instructions: newStep.instructions
}
const updatedSteps = [...steps, newStepObj];
setNewStep({});
if (onSubmit) onSubmit(updatedSteps)
}
return (
<div>
<form onSubmit={handleStepSubmit}>
<input
type="text"
name="instructions"
value={newStep.instructions || ''}
onChange={handleChange}
/>
<button type="submit">Add Step</button>
</form>
</div>
)
}
export default AddStepsForm

View file

@ -1,4 +1,4 @@
import React, { useState } from 'react'; import { useState } from 'react';
import { type RecipeSmall } from "../types/Recipe" import { type RecipeSmall } from "../types/Recipe"
import Modal from '../components/Modal.tsx' import Modal from '../components/Modal.tsx'
import DemoModal from '../components/DemoModal.tsx' import DemoModal from '../components/DemoModal.tsx'

View file

@ -1,4 +1,3 @@
import React from 'react';
import { useState, useEffect } from "react"; import { useState, useEffect } from "react";
import { Link, useLocation } from 'react-router-dom'; import { Link, useLocation } from 'react-router-dom';
import { getRecipes } from "../services/frontendApi.js"; import { getRecipes } from "../services/frontendApi.js";

View file

@ -7,7 +7,7 @@ const StarRating = ({ rating, onRatingChange }: StarRatingProps) => {
return ( return (
<div> <div>
{[...Array(5)].map((star, index) => { {[...Array(5)].map((_, index) => {
index += 1; index += 1;
return ( return (
<span <span

View file

@ -38,7 +38,7 @@ function AddRecipe() {
if (recipeName && recipeCuisine && Object.keys(stepsHash).length > 0 && ingredients.length > 0) { if (recipeName && recipeCuisine && Object.keys(stepsHash).length > 0 && ingredients.length > 0) {
const recipeData = { const recipeData = {
name: recipeName, name: recipeName,
cuisine: recipeCuisine, cuisine: recipeCuisine.toLowerCase(),
author: author, author: author,
prep_minutes: prepMinutes, prep_minutes: prepMinutes,
cook_minutes: cookMinutes, cook_minutes: cookMinutes,
@ -92,7 +92,7 @@ function AddRecipe() {
placeholder="prep time in minutes" placeholder="prep time in minutes"
className="recipe-cusine p-2 border border-gray-300 rounded w-24" className="recipe-cusine p-2 border border-gray-300 rounded w-24"
value={prepMinutes} value={prepMinutes}
onChange={(e) => setPrepMinutes(e.target.value)} onChange={(e) => setPrepMinutes(parseInt(e.target.value))}
/> />
<span className="ml-2">minutes</span> <span className="ml-2">minutes</span>
</div> </div>
@ -103,7 +103,7 @@ function AddRecipe() {
placeholder="cook time in minutes" placeholder="cook time in minutes"
className="recipe-cusine p-2 border border-gray-300 rounded w-24" className="recipe-cusine p-2 border border-gray-300 rounded w-24"
value={cookMinutes} value={cookMinutes}
onChange={(e) => setCookMinutes(e.target.value)} onChange={(e) => setCookMinutes(parseInt(e.target.value))}
/> />
<span className="ml-2">minutes</span> <span className="ml-2">minutes</span>
</div> </div>

View file

@ -5,6 +5,7 @@ import react from "@vitejs/plugin-react";
export default defineConfig({ export default defineConfig({
plugins: [react()], plugins: [react()],
server: { server: {
hmr: false,
allowedHosts: ["recipe-prod.fredzernia.com", "recipe-demo.fredzernia.com"], allowedHosts: ["recipe-prod.fredzernia.com", "recipe-demo.fredzernia.com"],
}, },
}); });