From eaf3b8d12f010a663ffd95cee58642d9c98dacfb Mon Sep 17 00:00:00 2001 From: John Overton Date: Sat, 8 Mar 2025 20:29:44 -0600 Subject: [PATCH] added default units --- app/api/settings/route.ts | 15 ++ app/api/units/route.ts | 28 ++++ .../migration.sql | 21 +++ prisma/schema.prisma | 17 ++- src/components/forms/SettingsForm.tsx | 135 +++++++++++++++++- 5 files changed, 207 insertions(+), 9 deletions(-) create mode 100644 app/api/units/route.ts create mode 100644 prisma/migrations/20250309022730_add_default_unit_settings/migration.sql diff --git a/app/api/settings/route.ts b/app/api/settings/route.ts index e5dd491..4bd6e5b 100644 --- a/app/api/settings/route.ts +++ b/app/api/settings/route.ts @@ -13,6 +13,11 @@ export async function GET() { data: { familyName: 'My Family', // Default family name timezone: 'America/Chicago', // Default timezone + defaultBottleUnit: 'OZ', + defaultSolidsUnit: 'TBSP', + defaultHeightUnit: 'IN', + defaultWeightUnit: 'LB', + defaultTempUnit: 'F', }, }); } @@ -42,6 +47,11 @@ export async function POST(req: NextRequest) { familyName: body.familyName, timezone: body.timezone, securityPin: body.securityPin, + defaultBottleUnit: body.defaultBottleUnit, + defaultSolidsUnit: body.defaultSolidsUnit, + defaultHeightUnit: body.defaultHeightUnit, + defaultWeightUnit: body.defaultWeightUnit, + defaultTempUnit: body.defaultTempUnit, }, }); @@ -84,6 +94,11 @@ export async function PUT(req: NextRequest) { familyName: body.familyName, timezone: body.timezone, securityPin: body.securityPin, + defaultBottleUnit: body.defaultBottleUnit, + defaultSolidsUnit: body.defaultSolidsUnit, + defaultHeightUnit: body.defaultHeightUnit, + defaultWeightUnit: body.defaultWeightUnit, + defaultTempUnit: body.defaultTempUnit, }, }); diff --git a/app/api/units/route.ts b/app/api/units/route.ts new file mode 100644 index 0000000..56416bf --- /dev/null +++ b/app/api/units/route.ts @@ -0,0 +1,28 @@ +import { NextResponse } from 'next/server'; +import prisma from '../db'; +import { ApiResponse } from '../types'; +import { Unit } from '@prisma/client'; + +export async function GET() { + try { + const units = await prisma.unit.findMany({ + orderBy: { + unitName: 'asc', + }, + }); + + return NextResponse.json>({ + success: true, + data: units, + }); + } catch (error) { + console.error('Error fetching units:', error); + return NextResponse.json>( + { + success: false, + error: 'Failed to fetch units', + }, + { status: 500 } + ); + } +} diff --git a/prisma/migrations/20250309022730_add_default_unit_settings/migration.sql b/prisma/migrations/20250309022730_add_default_unit_settings/migration.sql new file mode 100644 index 0000000..e1b18da --- /dev/null +++ b/prisma/migrations/20250309022730_add_default_unit_settings/migration.sql @@ -0,0 +1,21 @@ +-- RedefineTables +PRAGMA defer_foreign_keys=ON; +PRAGMA foreign_keys=OFF; +CREATE TABLE "new_Settings" ( + "id" TEXT NOT NULL PRIMARY KEY, + "familyName" TEXT NOT NULL DEFAULT 'My Family', + "timezone" TEXT NOT NULL DEFAULT 'America/Chicago', + "securityPin" TEXT NOT NULL DEFAULT '111222', + "defaultBottleUnit" TEXT NOT NULL DEFAULT 'OZ', + "defaultSolidsUnit" TEXT NOT NULL DEFAULT 'TBSP', + "defaultHeightUnit" TEXT NOT NULL DEFAULT 'IN', + "defaultWeightUnit" TEXT NOT NULL DEFAULT 'LB', + "defaultTempUnit" TEXT NOT NULL DEFAULT 'F', + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL +); +INSERT INTO "new_Settings" ("createdAt", "familyName", "id", "securityPin", "timezone", "updatedAt") SELECT "createdAt", "familyName", "id", "securityPin", "timezone", "updatedAt" FROM "Settings"; +DROP TABLE "Settings"; +ALTER TABLE "new_Settings" RENAME TO "Settings"; +PRAGMA foreign_keys=ON; +PRAGMA defer_foreign_keys=OFF; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 8429e9f..f5c3d7c 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -222,10 +222,15 @@ model Note { } model Settings { - id String @id @default(uuid()) - familyName String @default("My Family") - timezone String @default("America/Chicago") - securityPin String @default("111222") - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + id String @id @default(uuid()) + familyName String @default("My Family") + timezone String @default("America/Chicago") + securityPin String @default("111222") + defaultBottleUnit String @default("OZ") // Default unit for bottle feeding + defaultSolidsUnit String @default("TBSP") // Default unit for solid feeding + defaultHeightUnit String @default("IN") // Default unit for height measurement + defaultWeightUnit String @default("LB") // Default unit for weight measurement + defaultTempUnit String @default("F") // Default unit for temperature + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt } diff --git a/src/components/forms/SettingsForm.tsx b/src/components/forms/SettingsForm.tsx index 8e1f790..c3ea31c 100644 --- a/src/components/forms/SettingsForm.tsx +++ b/src/components/forms/SettingsForm.tsx @@ -1,7 +1,7 @@ 'use client'; import React, { useEffect, useState } from 'react'; -import { Baby } from '@prisma/client'; +import { Baby, Unit } from '@prisma/client'; import { Settings } from '@/app/api/types'; import { Settings as Plus, Edit, Download, Upload } from 'lucide-react'; import { Button } from '@/src/components/ui/button'; @@ -46,6 +46,7 @@ export default function SettingsForm({ const [localSelectedBabyId, setLocalSelectedBabyId] = useState(selectedBabyId); const [showChangePinModal, setShowChangePinModal] = useState(false); const [isRestoring, setIsRestoring] = useState(false); + const [units, setUnits] = useState([]); const fileInputRef = React.useRef(null); useEffect(() => { @@ -55,9 +56,10 @@ export default function SettingsForm({ const fetchData = async () => { try { setLoading(true); - const [settingsResponse, babiesResponse] = await Promise.all([ + const [settingsResponse, babiesResponse, unitsResponse] = await Promise.all([ fetch('/api/settings'), - fetch('/api/baby') + fetch('/api/baby'), + fetch('/api/units') ]); if (settingsResponse.ok) { @@ -69,6 +71,11 @@ export default function SettingsForm({ const babiesData = await babiesResponse.json(); setBabies(babiesData.data); } + + if (unitsResponse.ok) { + const unitsData = await unitsResponse.json(); + setUnits(unitsData.data); + } } catch (error) { console.error('Error fetching data:', error); } finally { @@ -283,6 +290,128 @@ export default function SettingsForm({ + +
+

Default Units

+
+
+ {/* Bottle Feeding Unit */} +
+ + +
+ + {/* Solid Feeding Unit */} +
+ + +
+ + {/* Height Unit */} +
+ + +
+ + {/* Weight Unit */} +
+ + +
+ + {/* Temperature Unit */} +
+ + +
+
+
+