(FEAT): Worked on dockerization

This commit is contained in:
Hayden Hargreaves 2025-12-17 23:47:50 -07:00
parent 8873727585
commit c729e883e0
7 changed files with 34 additions and 8 deletions

6
docker-compose.yml Normal file
View File

@ -0,0 +1,6 @@
services:
app:
build: ./web/.
container_name: potion.frontend
ports:
- "3002:3002" # host:container

22
web/Dockerfile Normal file
View File

@ -0,0 +1,22 @@
# Build stage
FROM node:18-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# Runtime stage
FROM node:18-alpine
WORKDIR /app
# Install static file server
RUN npm install -g serve
# Copy build output only
COPY --from=build /app/dist ./dist
EXPOSE 3002
CMD ["serve", "-s", "dist", "-l", "3002"]

View File

@ -1,4 +1,4 @@
import { use, useEffect, useState, type ChangeEvent, type FormEvent } from "react"; import { use, useEffect, useState, type ChangeEvent, type Dispatch, type FormEvent, type SetStateAction } from "react";
import type { SearchFilters } from "../../types/search"; import type { SearchFilters } from "../../types/search";
import FilterButton from "../buttons/FilterButton"; import FilterButton from "../buttons/FilterButton";
import RecipeSearchFilterDropdown from "./RecipeSearchFilterDropdown"; import RecipeSearchFilterDropdown from "./RecipeSearchFilterDropdown";
@ -14,11 +14,11 @@ interface RecipeSearchBarProps {
redirect: boolean; redirect: boolean;
searchOnLoad: boolean; searchOnLoad: boolean;
favorites: boolean; favorites: boolean;
setRecipes: React.Dispatch<React.SetStateAction<Recipe[]>> | null; setRecipes: Dispatch<SetStateAction<Recipe[]>> | null;
// Loading is optional // Loading is optional
loading?: boolean; loading?: boolean;
setLoading?: React.Dispatch<React.SetStateAction<boolean>>; setLoading?: Dispatch<SetStateAction<boolean>>;
}; };
export default function RecipeSearchBar({ redirect, searchOnLoad, favorites, setRecipes, loading, setLoading }: RecipeSearchBarProps) { export default function RecipeSearchBar({ redirect, searchOnLoad, favorites, setRecipes, loading, setLoading }: RecipeSearchBarProps) {

View File

@ -4,7 +4,7 @@ import DropdownButton from "../buttons/DropdownButton";
interface RecipeSearchFilterDropdownProps { interface RecipeSearchFilterDropdownProps {
filters: SearchFilters; filters: SearchFilters;
setFilters: React.Dispatch<React.SetStateAction<SearchFilters>>; setFilters: (filters: SearchFilters) => void;
display: boolean; display: boolean;
}; };

View File

@ -24,7 +24,7 @@ export default function IngredientList({ ingredients }: IngredientListProps) {
></path> ></path>
</svg> </svg>
</span> </span>
<span className="font-semibold mr-2">{ingredient.Quantity}: </span> {ingredient.Name} <span className="font-semibold mr-2">{ingredient.Amount}: </span> {ingredient.Name}
</li> </li>
))} ))}
</ul> </ul>

View File

@ -1,2 +0,0 @@
export function ProtectedRoute

View File

@ -6,7 +6,7 @@ import { useSearchParams } from "react-router-dom";
export default function LoginPage() { export default function LoginPage() {
const [error, setError] = useState<string>(""); const [error, setError] = useState<string>("");
const [searchParams, setSearchParams] = useSearchParams(); const [searchParams, ] = useSearchParams();
const clickHandler = async (): Promise<void> => { const clickHandler = async (): Promise<void> => {
const result: string | ApiError = await GetGoogleAuthUrl(); const result: string | ApiError = await GetGoogleAuthUrl();