fixes to get this to build using 'npm run build'

This commit is contained in:
2026-01-18 21:53:35 -05:00
parent b55bd7041d
commit b1e2b38506
5 changed files with 59 additions and 27 deletions
+6 -6
View File
@@ -22,11 +22,11 @@ export default function PrivacyPolicy() {
<section>
<h2 className="mb-4 text-xl font-semibold">1. Introduction</h2>
<p>
Battl Builder ("we," "us," "our," or "Company") respects your privacy
Battl Builder (&quot;we,&quot; &quot;us,&quot; &quot;our,&quot; or &quot;Company&quot;) respects your privacy
and is committed to protecting it through this Privacy Policy. This
policy explains our practices regarding the collection, use, and
protection of your personal information when you access our website
and use our services (the "Service").
and use our services (the &quot;Service&quot;).
</p>
<p className="mt-4">
Please read this Privacy Policy carefully. If you do not agree with
@@ -331,7 +331,7 @@ export default function PrivacyPolicy() {
{/* 10. Children's Privacy */}
<section>
<h2 className="mb-4 text-xl font-semibold">10. Children's Privacy</h2>
<h2 className="mb-4 text-xl font-semibold">10. Children&apos;s Privacy</h2>
<p>
The Service is not intended for users under 18 years of age. We do not
knowingly collect personal information from children under 18.
@@ -339,7 +339,7 @@ export default function PrivacyPolicy() {
<p className="mt-4">
If we become aware that we have collected information from a child
under 18, we will delete such information immediately and terminate the
child's account.
child&apos;s account.
</p>
<p className="mt-4">
If you believe we have collected information from a child under 18,
@@ -392,7 +392,7 @@ export default function PrivacyPolicy() {
</p>
<p className="mt-4">
We will notify you of material changes by posting the updated policy
here and updating the "Last Updated" date. Your continued use of the
here and updating the &quot;Last Updated&quot; date. Your continued use of the
Service following the posting of changes constitutes your acceptance
of the updated Privacy Policy.
</p>
@@ -415,7 +415,7 @@ export default function PrivacyPolicy() {
<p>
<strong>Mailing Address:</strong>
<br />
Battl Builder, Inc.
Battl Builder, LLC.
<br />
[Your Address]
<br />
+3 -2
View File
@@ -5,6 +5,7 @@ import Link from "next/link";
import { useParams, useRouter } from "next/navigation";
import { useAuth } from "@/context/AuthContext";
import { useApi } from "@/lib/api";
import Image from "next/image";
type BuildDto = {
uuid: string;
@@ -556,7 +557,7 @@ export default function VaultBuildEditPage() {
</button>
<img
<Image
src={p.url}
alt="Pending upload"
className="h-32 w-full object-cover"
@@ -573,7 +574,7 @@ export default function VaultBuildEditPage() {
key={p.uuid}
className="overflow-hidden rounded-lg border border-white/10 bg-black/20"
>
<img
<Image
src={p.url}
alt={p.caption ?? "Build photo"}
className="h-32 w-full object-cover"
+18 -16
View File
@@ -123,24 +123,26 @@ export function BulkBar(props: {
runBulk(patch);
};
const footer = useMemo(() => {
let footer: JSX.Element;
// eslint-disable-next-line react-hooks/rules-of-hooks
footer = useMemo(() => {
return (
<div className="flex items-center justify-between gap-2">
<div className="text-sm text-white/60">
Selected: <span className="font-semibold text-white">{selectedCount}</span>
</div>
<div className="flex items-center justify-between gap-2">
<div className="text-sm text-white/60">
Selected: <span className="font-semibold text-white">{selectedCount}</span>
</div>
<button
className="rounded-md bg-emerald-600 px-3 py-2 text-sm font-semibold hover:bg-emerald-500 disabled:opacity-50"
disabled={disabled}
onClick={() => {
applyFieldChanges();
setOpen(false);
}}
>
Apply changes
</button>
</div>
<button
className="rounded-md bg-emerald-600 px-3 py-2 text-sm font-semibold hover:bg-emerald-500 disabled:opacity-50"
disabled={disabled}
onClick={() => {
applyFieldChanges();
setOpen(false);
}}
>
Apply changes
</button>
</div>
);
}, [applyFieldChanges, disabled, selectedCount]);
+10 -3
View File
@@ -3,6 +3,7 @@
import { useEffect, useMemo, useState } from "react";
import Link from "next/link";
import PlatformSwitcher from "./PlatformSwitcher";
import Image from "next/image";
const API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL ?? "http://localhost:8080";
@@ -138,10 +139,16 @@ export default function PartsListPageClient(props: {
className="group rounded-lg border border-zinc-800 bg-black/30 p-3 hover:border-zinc-700"
>
<div className="flex gap-3">
<div className="h-16 w-16 overflow-hidden rounded-md border border-zinc-800 bg-zinc-950">
<div className="relative h-16 w-16 overflow-hidden rounded-md border border-zinc-800 bg-zinc-950">
{/* eslint-disable-next-line @next/next/no-img-element */}
{p.imageUrl ? (
<img src={p.imageUrl} alt={p.name} className="h-full w-full object-cover" />
<Image
src={p.imageUrl}
alt={p.name}
fill
sizes="64px"
className="object-cover"
/>
) : (
<div className="h-full w-full grid place-items-center text-xs text-zinc-600">
@@ -175,4 +182,4 @@ export default function PartsListPageClient(props: {
</div>
</main>
);
}
}
+22
View File
@@ -0,0 +1,22 @@
# Stage 1: Build the static assets
FROM node:20-alpine as builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
# Run the Next.js build command
RUN npm run build
# Stage 2: Run the production application (Next.js server)
FROM node:20-alpine
WORKDIR /app
# Copy only the necessary files for running the app
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./package.json
COPY --from=builder /app/public ./public
# Set environment variables
ENV NODE_ENV production
EXPOSE 3000
# Run the Next.js production server
CMD ["npm", "start"]