From 5c47e480d071f76fa99a2f86b0569dc75b0d3a9a Mon Sep 17 00:00:00 2001 From: Dean Hidri Date: Fri, 28 Jun 2024 23:21:36 +0200 Subject: [PATCH 01/10] initial revamp --- README.md | 133 ++++++------ bun.lockb | Bin 315949 -> 316773 bytes drizzle.config.ts | 26 ++- drizzle/0000_careful_shotgun.sql | 30 --- drizzle/0000_talented_kinsey_walden.sql | 40 ++++ drizzle/meta/0000_snapshot.json | 83 ++++++-- drizzle/meta/_journal.json | 6 +- package.json | 129 ++++++------ src/actions/profile.ts | 32 +++ src/actions/records.ts | 98 +++++---- src/app/app/columns.tsx | 60 ------ src/app/app/data-table.tsx | 82 -------- src/app/app/layout.tsx | 70 +++---- src/app/app/onboarding/page.tsx | 9 + src/app/app/page.tsx | 121 +++++------ src/app/app/settings/navigation.tsx | 58 ++++++ src/app/app/settings/page.tsx | 65 ++++-- src/app/app/settings/profile-form.tsx | 212 +++++++++++++++++++ src/app/app/welcome/actions.ts | 29 --- src/app/app/welcome/onboarding-form.tsx | 87 -------- src/app/app/welcome/page.tsx | 30 --- src/app/auth/signin/page.tsx | 58 +++--- src/app/auth/signin/signin-form.tsx | 266 ++++++++++++------------ src/app/globals.css | 135 ++++++------ src/app/layout.tsx | 55 ++--- src/app/middleware.ts | 12 -- src/components/AddRecordCard.tsx | 175 ++++++++++++++++ src/components/DeleteRecordDialog.tsx | 102 ++++----- src/components/EmptyRecord.tsx | 28 +++ src/components/Navbar.tsx | 162 +++++++-------- src/components/NewRecordDialog.tsx | 45 ---- src/components/NewRecordForm.tsx | 125 ----------- src/components/RecordCard.tsx | 136 ++++++++++++ src/components/Toolbar.tsx | 32 +++ src/components/ui/date-range-picker.tsx | 66 ++++++ src/db/index.ts | 28 +-- src/db/schema.ts | 104 +++++---- src/lib/form-validations.ts | 27 ++- src/lib/supabase/middleware.ts | 60 ------ src/middleware.ts | 79 +++++++ src/types/user.ts | 14 +- 41 files changed, 1762 insertions(+), 1347 deletions(-) mode change 100644 => 100755 bun.lockb delete mode 100644 drizzle/0000_careful_shotgun.sql create mode 100644 drizzle/0000_talented_kinsey_walden.sql create mode 100644 src/actions/profile.ts delete mode 100644 src/app/app/columns.tsx delete mode 100644 src/app/app/data-table.tsx create mode 100644 src/app/app/onboarding/page.tsx create mode 100644 src/app/app/settings/navigation.tsx create mode 100644 src/app/app/settings/profile-form.tsx delete mode 100644 src/app/app/welcome/actions.ts delete mode 100644 src/app/app/welcome/onboarding-form.tsx delete mode 100644 src/app/app/welcome/page.tsx delete mode 100644 src/app/middleware.ts create mode 100644 src/components/AddRecordCard.tsx create mode 100644 src/components/EmptyRecord.tsx delete mode 100644 src/components/NewRecordDialog.tsx delete mode 100644 src/components/NewRecordForm.tsx create mode 100644 src/components/RecordCard.tsx create mode 100644 src/components/Toolbar.tsx create mode 100644 src/components/ui/date-range-picker.tsx delete mode 100644 src/lib/supabase/middleware.ts create mode 100644 src/middleware.ts diff --git a/README.md b/README.md index feb9797..1d4aa59 100644 --- a/README.md +++ b/README.md @@ -1,63 +1,70 @@ -# cardia - -**cardia** is a blood pressure documentation application built with Next.js, using Drizzle as an ORM, and Supabase for authentication and database management. It allows users to easily add and track their blood pressure records. - -## Getting Started - -To set up cardia locally, follow these steps: - -1. Clone this repository to your local machine: - - ```bash - git clone https://github.com/visualcookie/cardia.git - - OR - - gh repo clone visualcookie/cardia - ``` - -2. Navigate to the project directory: - - ```bash - cd cardia - ``` - -3. Install dependencies: - - ```bash - bun install - ``` - -4. Set up your Supabase project: - - - Sign up or log in to [Supabase](https://supabase.io/). - - Create a new project and database. - - Set up authentication and obtain your Supabase URL and public key. - -5. Configure environment variables: - - Create a `.env.local` file in the root directory and add the following: - - ```plaintext - NEXT_PUBLIC_BASE_URL=http://localhost:3000 - NEXT_PUBLIC_SUPABASE_URL=your-supabase-url - NEXT_PUBLIC_SUPABASE_ANON_KEY=your-supabase-public-key - ``` - -6. Run the development server: - - ```bash - bun run dev - ``` - -7. Open [http://localhost:3000](http://localhost:3000) in your browser to access cardia. - -## TODO - -- [ ] Add data visualization for blood pressure records. -- [ ] Implement reminders or notifications for regular blood pressure checks. -- [ ] Improve the export. - -## License - -This project is licensed under the "The Unlicense" license. See the [LICENSE.md](LICENSE.md) file for details. +# cardia + +**cardia** is a blood pressure documentation application built with Next.js, using Drizzle as an ORM, and Supabase for authentication and database management. It allows users to easily add and track their blood pressure records. + +## Getting Started + +To set up cardia locally, follow these steps: + +1. Clone this repository to your local machine: + + ```bash + git clone https://github.com/visualcookie/cardia.git + + OR + + gh repo clone visualcookie/cardia + ``` + +2. Navigate to the project directory: + + ```bash + cd cardia + ``` + +3. Install dependencies: + + ```bash + bun install + ``` + +4. Set up your Supabase project: + + - Sign up or log in to [Supabase](https://supabase.io/). + - Create a new project and database. + - Set up authentication and obtain your Supabase URL and public key. + +5. Configure environment variables: + + Create a `.env.local` file in the root directory and add the following: + + ```plaintext + NEXT_PUBLIC_BASE_URL=http://localhost:3000 + NEXT_PUBLIC_SUPABASE_URL=your-supabase-url + NEXT_PUBLIC_SUPABASE_ANON_KEY=your-supabase-public-key + ``` + +6. Run the development server: + + ```bash + bun run dev + ``` + +7. Open [http://localhost:3000](http://localhost:3000) in your browser to access cardia. + +## TODO + +- [ ] Add data visualization for blood pressure records +- [ ] Implement reminders for regular blood pressure checks +- [ ] Improve the export +- [ ] Add import from CSV +- [ ] Add filter to stages +- [ ] Group data by day/date +- [ ] Add filter by date range +- [ ] Display last 10 records +- [ ] Add "Load more" functionality +- [ ] Settings page + +## License + +This project is licensed under the "The Unlicense" license. See the [LICENSE.md](LICENSE.md) file for details. diff --git a/bun.lockb b/bun.lockb old mode 100644 new mode 100755 index 8754aa3a82f22011daf9ce88075269c7ca808b32..e2b9b38a18dde41f986d423909c800343aa65472 GIT binary patch literal 316773 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 diff --git a/drizzle.config.ts b/drizzle.config.ts index 66aa921..f197315 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -1,11 +1,15 @@ -import 'dotenv/config' -import type { Config } from 'drizzle-kit' - -export default { - schema: './src/db/schema.ts', - out: './drizzle', - driver: 'pg', - dbCredentials: { - connectionString: process.env.DB_URL!, - }, -} satisfies Config +import 'dotenv/config' +import { defineConfig } from 'drizzle-kit' + +export default defineConfig({ + dialect: 'postgresql', + dbCredentials: { + url: process.env.DB_URL!, + }, + migrations: { + table: 'migrations', + schema: 'cardia', + }, + schema: './src/db/schema.ts', + out: './drizzle', +}) diff --git a/drizzle/0000_careful_shotgun.sql b/drizzle/0000_careful_shotgun.sql deleted file mode 100644 index 311d32a..0000000 --- a/drizzle/0000_careful_shotgun.sql +++ /dev/null @@ -1,30 +0,0 @@ -CREATE SCHEMA IF NOT EXISTS "auth"; ---> statement-breakpoint -CREATE SCHEMA IF NOT EXISTS "cardia"; ---> statement-breakpoint -CREATE TABLE IF NOT EXISTS "cardia"."users" ( - "id" uuid PRIMARY KEY NOT NULL, - "username" text, - "profile_picture" text -); ---> statement-breakpoint -CREATE TABLE IF NOT EXISTS "cardia"."record" ( - "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, - "user_id" uuid NOT NULL, - "systolic" integer NOT NULL, - "diastolic" integer NOT NULL, - "pulse" integer NOT NULL, - "recorded_at" timestamp DEFAULT now() NOT NULL -); ---> statement-breakpoint -DO $$ BEGIN - ALTER TABLE "cardia"."users" ADD CONSTRAINT "users_id_users_id_fk" FOREIGN KEY ("id") REFERENCES "auth"."users"("id") ON DELETE cascade ON UPDATE no action; -EXCEPTION - WHEN duplicate_object THEN null; -END $$; ---> statement-breakpoint -DO $$ BEGIN - ALTER TABLE "cardia"."record" ADD CONSTRAINT "record_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "cardia"."users"("id") ON DELETE cascade ON UPDATE no action; -EXCEPTION - WHEN duplicate_object THEN null; -END $$; diff --git a/drizzle/0000_talented_kinsey_walden.sql b/drizzle/0000_talented_kinsey_walden.sql new file mode 100644 index 0000000..0625f40 --- /dev/null +++ b/drizzle/0000_talented_kinsey_walden.sql @@ -0,0 +1,40 @@ +CREATE SCHEMA IF NOT EXISTS "auth"; +--> statement-breakpoint +CREATE SCHEMA IF NOT EXISTS "cardia"; +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "auth"."users" ( + "id" uuid PRIMARY KEY NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "cardia"."profile" ( + "id" uuid PRIMARY KEY NOT NULL, + "username" text, + "email" varchar NOT NULL, + "avatar" text, + "dob" timestamp, + "weight" integer, + "height" integer, + "onboarding_completed" boolean DEFAULT false NOT NULL, + CONSTRAINT "profile_username_unique" UNIQUE("username") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "cardia"."record" ( + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "user_id" uuid NOT NULL, + "systolic" integer NOT NULL, + "diastolic" integer NOT NULL, + "pulse" integer NOT NULL, + "recorded_at" timestamp DEFAULT now() NOT NULL +); +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "cardia"."profile" ADD CONSTRAINT "profile_id_users_id_fk" FOREIGN KEY ("id") REFERENCES "auth"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "cardia"."record" ADD CONSTRAINT "record_user_id_profile_id_fk" FOREIGN KEY ("user_id") REFERENCES "cardia"."profile"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; diff --git a/drizzle/meta/0000_snapshot.json b/drizzle/meta/0000_snapshot.json index b67b638..e3cc535 100644 --- a/drizzle/meta/0000_snapshot.json +++ b/drizzle/meta/0000_snapshot.json @@ -1,11 +1,27 @@ { - "id": "6723e6e2-f2b2-4adb-96b0-27336337c267", + "id": "5afdf2a3-b3c1-46f4-8339-b721ae181fda", "prevId": "00000000-0000-0000-0000-000000000000", - "version": "5", - "dialect": "pg", + "version": "7", + "dialect": "postgresql", "tables": { - "users": { + "auth.users": { "name": "users", + "schema": "auth", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "cardia.profile": { + "name": "profile", "schema": "cardia", "columns": { "id": { @@ -20,18 +36,49 @@ "primaryKey": false, "notNull": false }, - "profile_picture": { - "name": "profile_picture", + "email": { + "name": "email", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "avatar": { + "name": "avatar", "type": "text", "primaryKey": false, "notNull": false + }, + "dob": { + "name": "dob", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "weight": { + "name": "weight", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "height": { + "name": "height", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "onboarding_completed": { + "name": "onboarding_completed", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false } }, "indexes": {}, "foreignKeys": { - "users_id_users_id_fk": { - "name": "users_id_users_id_fk", - "tableFrom": "users", + "profile_id_users_id_fk": { + "name": "profile_id_users_id_fk", + "tableFrom": "profile", "tableTo": "users", "schemaTo": "auth", "columnsFrom": [ @@ -45,9 +92,17 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": { + "profile_username_unique": { + "name": "profile_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + } + } }, - "record": { + "cardia.record": { "name": "record", "schema": "cardia", "columns": { @@ -92,10 +147,10 @@ }, "indexes": {}, "foreignKeys": { - "record_user_id_users_id_fk": { - "name": "record_user_id_users_id_fk", + "record_user_id_profile_id_fk": { + "name": "record_user_id_profile_id_fk", "tableFrom": "record", - "tableTo": "users", + "tableTo": "profile", "schemaTo": "cardia", "columnsFrom": [ "user_id" diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index 420ecb4..a9024f3 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -4,9 +4,9 @@ "entries": [ { "idx": 0, - "version": "5", - "when": 1711815144834, - "tag": "0000_careful_shotgun", + "version": "7", + "when": 1718830410828, + "tag": "0000_talented_kinsey_walden", "breakpoints": true } ] diff --git a/package.json b/package.json index 8962328..970b484 100644 --- a/package.json +++ b/package.json @@ -1,65 +1,64 @@ -{ - "name": "cardia", - "version": "0.1.0", - "private": true, - "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start", - "lint": "next lint", - "migrate": "drizzle-kit generate:pg && node -r esbuild-register src/db/migrate.ts" - }, - "dependencies": { - "@auth/core": "^0.28.1", - "@auth/drizzle-adapter": "^0.8.1", - "@hookform/resolvers": "^3.3.4", - "@radix-ui/react-alert-dialog": "^1.0.5", - "@radix-ui/react-avatar": "^1.0.4", - "@radix-ui/react-dialog": "^1.0.5", - "@radix-ui/react-dropdown-menu": "^2.0.6", - "@radix-ui/react-icons": "^1.3.0", - "@radix-ui/react-label": "^2.0.2", - "@radix-ui/react-popover": "^1.0.7", - "@radix-ui/react-select": "^2.0.0", - "@radix-ui/react-slot": "^1.0.2", - "@radix-ui/react-toast": "^1.1.5", - "@supabase/ssr": "^0.1.0", - "@supabase/supabase-js": "^2.41.1", - "@tanstack/react-table": "^8.15.3", - "class-variance-authority": "^0.7.0", - "clsx": "^2.1.0", - "date-fns": "^3.6.0", - "dayjs": "^1.11.10", - "dotenv": "^16.4.5", - "drizzle-orm": "^0.30.6", - "exceljs": "^4.4.0", - "lucide-react": "^0.363.0", - "next": "14.1.4", - "next-auth": "beta", - "pg": "^8.11.3", - "postgres": "^3.4.4", - "react": "^18", - "react-aria": "^3.32.1", - "react-day-picker": "^8.10.0", - "react-dom": "^18", - "react-hook-form": "^7.51.2", - "react-stately": "^3.30.1", - "tailwind-merge": "^2.2.2", - "tailwindcss-animate": "^1.0.7", - "zod": "^3.22.4" - }, - "devDependencies": { - "@types/node": "^20", - "@types/pg": "^8.11.4", - "@types/react": "^18", - "@types/react-dom": "^18", - "autoprefixer": "^10.0.1", - "drizzle-kit": "^0.20.14", - "eslint": "^8", - "eslint-config-next": "14.1.4", - "eslint-config-prettier": "^9.1.0", - "postcss": "^8", - "tailwindcss": "^3.3.0", - "typescript": "^5" - } -} +{ + "name": "cardia", + "version": "0.2.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint", + "migrate": "drizzle-kit generate && node -r esbuild-register src/db/migrate.ts" + }, + "dependencies": { + "@hookform/resolvers": "^3.3.4", + "@radix-ui/react-alert-dialog": "^1.0.5", + "@radix-ui/react-avatar": "^1.0.4", + "@radix-ui/react-dialog": "^1.0.5", + "@radix-ui/react-dropdown-menu": "^2.0.6", + "@radix-ui/react-icons": "^1.3.0", + "@radix-ui/react-label": "^2.0.2", + "@radix-ui/react-popover": "^1.0.7", + "@radix-ui/react-select": "^2.0.0", + "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-toast": "^1.1.5", + "@supabase/ssr": "^0.3.0", + "@supabase/supabase-js": "^2.43.5", + "@tanstack/react-table": "^8.15.3", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.0", + "date-fns": "^3.6.0", + "dayjs": "^1.11.10", + "dotenv": "^16.4.5", + "drizzle-orm": "^0.31.2", + "exceljs": "^4.4.0", + "lucide-react": "^0.395.0", + "next": "14.2.4", + "next-easy-middlewares": "^1.1.2", + "pg": "^8.12.0", + "postgres": "^3.4.4", + "react": "^18", + "react-aria": "^3.32.1", + "react-day-picker": "^8.10.0", + "react-dom": "^18", + "react-hook-form": "^7.51.2", + "react-stately": "^3.30.1", + "tailwind-merge": "^2.3.0", + "tailwindcss-animate": "^1.0.7", + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/node": "^20", + "@types/pg": "^8.11.6", + "@types/react": "^18", + "@types/react-dom": "^18", + "autoprefixer": "^10.4.19", + "drizzle-kit": "^0.22.7", + "eslint": "^8", + "eslint-config-next": "14.2.4", + "eslint-config-prettier": "^9.1.0", + "postcss": "^8", + "tailwindcss": "^3.4.4", + "typescript": "^5" + } +} + diff --git a/src/actions/profile.ts b/src/actions/profile.ts new file mode 100644 index 0000000..b32dec4 --- /dev/null +++ b/src/actions/profile.ts @@ -0,0 +1,32 @@ +'use server' + +import { revalidatePath } from 'next/cache' +import { eq } from 'drizzle-orm' +import { z } from 'zod' +import { db } from '@/db' +import { profile } from '@/db/schema' +import { profileSchema } from '@/lib/form-validations' + +export async function updateProfile( + userId: string, + data: z.infer +) { + const transformedData = { + ...data, + dob: data.dob ? new Date(data.dob) : null, + weight: data.weight ? Number(data.weight) : null, + height: data.height ? Number(data.height) : null, + } + + const updateProfile = await db + .update(profile) + .set(transformedData) + .where(eq(profile.id, userId)) + .returning() + + if (!updateProfile) { + throw new Error('Could not update profile') + } + + revalidatePath('/app') +} diff --git a/src/actions/records.ts b/src/actions/records.ts index f418b18..0a5f8b8 100644 --- a/src/actions/records.ts +++ b/src/actions/records.ts @@ -1,46 +1,52 @@ -'use server' - -import { revalidatePath } from 'next/cache' -import { eq } from 'drizzle-orm' -import { z } from 'zod' -import { newRecordSchema } from '@/components/NewRecordForm' -import { db } from '@/db' -import { records } from '@/db/schema' - -export async function createRecord( - userId: string, - data: z.infer -) { - const transformData = { - ...data, - systolic: parseInt(data.systolic, 10), - diastolic: parseInt(data.diastolic, 10), - pulse: parseInt(data.pulse, 10), - } - const createRecord = await db - .insert(records) - .values({ - ...transformData, - userId, - }) - .returning() - - if (!createRecord) { - throw new Error('Could not create record') - } - - revalidatePath('/app') -} - -export async function deleteRecord(recordId: string) { - const deleteRecord = await db - .delete(records) - .where(eq(records.id, recordId)) - .returning() - - if (!deleteRecord) { - throw new Error('Could not delete record') - } - - revalidatePath('/app') -} +'use server' + +import { revalidatePath } from 'next/cache' +import { eq } from 'drizzle-orm' +import { z } from 'zod' +import { parse } from 'date-fns' +import { db } from '@/db' +import { records } from '@/db/schema' +import { recordSchema } from '@/lib/form-validations' + +export async function createRecord( + userId: string, + data: z.infer +) { + const transformData = { + recordedAt: parse( + `${data.date} ${data.time}`, + 'yyyy-MM-dd HH:mm', + new Date() + ), + systolic: parseInt(data.systolic, 10), + diastolic: parseInt(data.diastolic, 10), + pulse: parseInt(data.pulse, 10), + } + + const createRecord = await db + .insert(records) + .values({ + ...transformData, + userId, + }) + .returning() + + if (!createRecord) { + throw new Error('Could not create record') + } + + revalidatePath('/app') +} + +export async function deleteRecord(recordId: string) { + const deleteRecord = await db + .delete(records) + .where(eq(records.id, recordId)) + .returning() + + if (!deleteRecord) { + throw new Error('Could not delete record') + } + + revalidatePath('/app') +} diff --git a/src/app/app/columns.tsx b/src/app/app/columns.tsx deleted file mode 100644 index 0653b73..0000000 --- a/src/app/app/columns.tsx +++ /dev/null @@ -1,60 +0,0 @@ -'use client' - -import DeleteRecordDialog from '@/components/DeleteRecordDialog' -import { ColumnDef } from '@tanstack/react-table' - -export type Records = { - id: string - recordedAt: Date - systolic: number - diastolic: number - pulse: number - userId: string -} - -export const columns: ColumnDef[] = [ - { - header: 'Date of record', - accessorKey: 'recordedAt', - enableSorting: true, - cell: ({ row }) => { - const recordedAt = row.getValue('recordedAt') as string - const formatted = new Intl.DateTimeFormat('de-DE', { - year: 'numeric', - month: 'long', - day: 'numeric', - hour: 'numeric', - minute: 'numeric', - }).format(new Date(recordedAt)) - - return formatted - }, - }, - { - header: 'SYS', - accessorKey: 'systolic', - size: 40, - }, - { - header: 'DIA', - accessorKey: 'diastolic', - size: 40, - }, - { - header: 'Pulse', - accessorKey: 'pulse', - size: 40, - }, - { - id: 'actions', - size: 80, - cell: ({ row }) => { - const record = row.original - return ( -
- -
- ) - }, - }, -] diff --git a/src/app/app/data-table.tsx b/src/app/app/data-table.tsx deleted file mode 100644 index 99cc6c8..0000000 --- a/src/app/app/data-table.tsx +++ /dev/null @@ -1,82 +0,0 @@ -'use client' - -import { - ColumnDef, - flexRender, - getCoreRowModel, - useReactTable, -} from '@tanstack/react-table' -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from '@/components/ui/table' - -interface DataTableProps { - columns: ColumnDef[] - data: TData[] -} - -export function DataTable({ - columns, - data, -}: Readonly>) { - const table = useReactTable({ - data, - columns, - getCoreRowModel: getCoreRowModel(), - }) - - return ( -
- - - {table.getHeaderGroups().map((headerGroup) => ( - - {headerGroup.headers.map((header) => { - return ( - - {header.isPlaceholder - ? null - : flexRender( - header.column.columnDef.header, - header.getContext() - )} - - ) - })} - - ))} - - - {table.getRowModel().rows?.length ? ( - table.getRowModel().rows.map((row) => ( - - {row.getVisibleCells().map((cell) => ( - - {flexRender(cell.column.columnDef.cell, cell.getContext())} - - ))} - - )) - ) : ( - - - No results. - - - )} - -
-
- ) -} diff --git a/src/app/app/layout.tsx b/src/app/app/layout.tsx index a4a5e66..6425e79 100644 --- a/src/app/app/layout.tsx +++ b/src/app/app/layout.tsx @@ -1,39 +1,31 @@ -import { eq } from 'drizzle-orm' -import { redirect } from 'next/navigation' -import { db } from '@/db' -import { users } from '@/db/schema' -import { createClient } from '@/lib/supabase/server' -import { AuthProvider } from '@/providers/SupabaseAuthProvider' -import Navbar from '@/components/Navbar' - -const AppLayout: React.FC<{ children: React.ReactNode }> = async ({ - children, -}) => { - const supabase = createClient() - const { data, error } = await supabase.auth.getUser() - - if (error || !data?.user) { - redirect('/auth/signin') - } - - const dbUser = await db.query.users.findFirst({ - where: eq(users.id, data.user?.id), - }) - - if (!dbUser) { - redirect('/app/welcome/onboarding') - } - - return ( - -
- -
-
{children}
-
-
-
- ) -} - -export default AppLayout +import { redirect } from 'next/navigation' +import { createClient } from '@/lib/supabase/server' +import { AuthProvider } from '@/providers/SupabaseAuthProvider' +import Navbar from '@/components/Navbar' +import { db } from '@/db' +import { eq } from 'drizzle-orm' +import { profile } from '@/db/schema' + +const AppLayout: React.FC<{ children: React.ReactNode }> = async ({ + children, +}) => { + const supabase = createClient() + const { data, error } = await supabase.auth.getUser() + + if (error || !data?.user) { + redirect('/auth/signin') + } + + return ( + +
+ +
+
{children}
+
+
+
+ ) +} + +export default AppLayout diff --git a/src/app/app/onboarding/page.tsx b/src/app/app/onboarding/page.tsx new file mode 100644 index 0000000..5066d4f --- /dev/null +++ b/src/app/app/onboarding/page.tsx @@ -0,0 +1,9 @@ +const OnboardingPage = () => { + return ( +
+

Onboarding Page

+
+ ) +} + +export default OnboardingPage diff --git a/src/app/app/page.tsx b/src/app/app/page.tsx index 478cae1..45b01df 100644 --- a/src/app/app/page.tsx +++ b/src/app/app/page.tsx @@ -1,59 +1,62 @@ -import { desc, eq } from 'drizzle-orm' -import { redirect } from 'next/navigation' -import ExportRecords from '@/components/ExportRecords' -import NewRecordDialog from '@/components/NewRecordDialog' -import { - Card, - CardContent, - CardDescription, - CardHeader, - CardTitle, -} from '@/components/ui/card' -import { db } from '@/db' -import { records, users } from '@/db/schema' -import { createClient } from '@/lib/supabase/server' -import { columns } from './columns' -import { DataTable } from './data-table' - -const AppMainPage = async () => { - const supabase = createClient() - const { data, error } = await supabase.auth.getUser() - - if (error || !data?.user) { - redirect('/auth/signin') - } - - // TODO: Move this to a middleware - const shouldOnboard = await db.query.users.findFirst({ - where: eq(users.id, data.user.id), - }) - - if (!shouldOnboard?.username || !shouldOnboard?.profilePicture) { - redirect('/app/welcome') - } - - const dbRecords = await db.query.records.findMany({ - where: eq(records.userId, data.user.id), - orderBy: desc(records.recordedAt), - }) - - return ( - - -
- Records - Your blood pressure records. -
-
- - -
-
- - - -
- ) -} - -export default AppMainPage +import { desc, eq } from 'drizzle-orm' +import { redirect } from 'next/navigation' +import { db } from '@/db' +import { records } from '@/db/schema' +import { createClient } from '@/lib/supabase/server' +import { RecordCard } from '@/components/RecordCard' +import { Toolbar } from '@/components/Toolbar' +import { EmptyRecord } from '@/components/EmptyRecord' + +const AppMainPage = async () => { + const supabase = createClient() + const { data, error } = await supabase.auth.getUser() + + if (error || !data?.user) { + redirect('/auth/signin') + } + + const dbRecords = await db.query.records.findMany({ + where: eq(records.userId, data.user.id), + orderBy: desc(records.recordedAt), + }) + + return ( +
+
+

Blood Pressure Records

+

+ Here you can see all your blood pressure records. +

+
+ + {dbRecords.length <= 0 && } + + {dbRecords.length > 0 && ( + <> + + + {dbRecords.map( + ({ id, systolic, diastolic, pulse, recordedAt }, index) => { + return ( + + ) + } + )} + + )} + + {/* TODO: Implement logic + hover for better visualisation */} + {/* */} +
+ ) +} + +export default AppMainPage diff --git a/src/app/app/settings/navigation.tsx b/src/app/app/settings/navigation.tsx new file mode 100644 index 0000000..7dd2b97 --- /dev/null +++ b/src/app/app/settings/navigation.tsx @@ -0,0 +1,58 @@ +'use client' + +import Link from 'next/link' +import { usePathname } from 'next/navigation' +import { Bell, User } from 'lucide-react' +import { cn } from '@/lib/utils' + +interface IProfileNavigation { + icon: React.FC + title: string + href: string + deactivate?: boolean + hidden?: boolean +} + +const profileNavigation: IProfileNavigation[] = [ + { + icon: User, + title: 'Profile', + href: 'settings', + }, + { + icon: Bell, + title: 'Reminders', + href: 'settings/reminders', + deactivate: true, + }, +] + +export const SettingsNavigation = () => { + const pathname = usePathname() + const isActive = (href: string) => pathname.includes(href) + return ( + + ) +} diff --git a/src/app/app/settings/page.tsx b/src/app/app/settings/page.tsx index ea16887..b5a81a9 100644 --- a/src/app/app/settings/page.tsx +++ b/src/app/app/settings/page.tsx @@ -1,18 +1,47 @@ -import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' - -const SettingsPage = async () => { - return ( -
- - - Account Settings - - - {/* */} - - -
- ) -} - -export default SettingsPage +import { ProfileForm } from './profile-form' +import { db } from '@/db' +import { createClient } from '@/lib/supabase/server' +import { redirect } from 'next/navigation' +import { eq } from 'drizzle-orm' +import { SettingsNavigation } from './navigation' +import { profile } from '@/db/schema' + +const SettingsPage = async () => { + const supabase = createClient() + const { data, error } = await supabase.auth.getUser() + + if (error || !data?.user) { + redirect('/auth/signin') + } + + const profileData = await db.query.profile.findFirst({ + where: eq(profile.id, data.user?.id), + }) + + return ( +
+ +
+
+

Profile

+
+
+ +
+
+ ) +} + +export default SettingsPage diff --git a/src/app/app/settings/profile-form.tsx b/src/app/app/settings/profile-form.tsx new file mode 100644 index 0000000..714cbe7 --- /dev/null +++ b/src/app/app/settings/profile-form.tsx @@ -0,0 +1,212 @@ +'use client' +import { useEffect, useState } from 'react' +import { useForm } from 'react-hook-form' +import { Check } from 'lucide-react' +import { z } from 'zod' +import { zodResolver } from '@hookform/resolvers/zod' +import { updateProfile } from '@/actions/profile' +import { profileSchema } from '@/lib/form-validations' +import SubmitButton from '@/components/SubmitButton' +import { Button } from '@/components/ui/button' +import { + FormField, + FormItem, + FormControl, + FormMessage, + Form, + FormLabel, + FormDescription, +} from '@/components/ui/form' +import { Input } from '@/components/ui/input' + +export interface ProfileFormProps { + profileData?: { + id: string + username: string | null + email: string | null + avatar: string | null + dob: string | Date | null + weight: string | number | null | undefined + height: string | number | null | undefined + } + userId: string +} + +export const ProfileForm: React.FC = ({ + profileData, + userId, +}) => { + const [success, setSuccess] = useState(false) + + const form = useForm>({ + resolver: zodResolver(profileSchema), + }) + + useEffect(() => { + if (!profileData) return + + form.reset({ + username: profileData.username ?? '', + email: profileData.email ?? '', + avatar: profileData.avatar ?? '', + dob: profileData.dob + ? new Date(profileData.dob).toISOString().split('T')[0] + : '', + weight: profileData.weight ?? '', + height: profileData.height ?? '', + }) + }, [profileData]) + + useEffect(() => { + // auto-hide success message after 3 seconds + let timer: NodeJS.Timeout + + if (form.formState.isSubmitSuccessful) { + timer = setTimeout(() => { + setSuccess(false) + }, 5000) + } + + return () => clearTimeout(timer) + }, [form.formState.isSubmitSuccessful]) + + const onSubmit = async (values: z.infer) => { + try { + await updateProfile(userId, values) + setSuccess(true) + } catch (error) { + console.error('Something went wrong', error) + } + } + + return ( +
+ + ( + + Profile picture (URL) + + + + + + )} + /> +
+ ( + + Username + + + + + + )} + /> + ( + + Email + + + + + Your email address is not editable. + + + + )} + /> +
+

Personal information

+ ( + + Date of birth + + + + + + )} + /> +
+ ( + + + Weight (kg) + + optional + + + + + + + + )} + /> + ( + + + Height (cm) + + optional + + + + + + + + )} + /> +
+
+
+ + +
+ + {success && ( + + + Profile updated successfully + + )} +
+ + + ) +} diff --git a/src/app/app/welcome/actions.ts b/src/app/app/welcome/actions.ts deleted file mode 100644 index 8b58db8..0000000 --- a/src/app/app/welcome/actions.ts +++ /dev/null @@ -1,29 +0,0 @@ -// TODO: Implement validation -'use server' - -import { redirect } from 'next/navigation' -import { z } from 'zod' -import { eq } from 'drizzle-orm' -import { db } from '@/db' -import { users } from '@/db/schema' -import { onboardingSchema } from './onboarding-form' - -export async function setupUser( - formData: z.infer, - userId: string -) { - const setupUser = await db - .update(users) - .set({ - username: formData.username, - profilePicture: formData.profilePicture, - }) - .where(eq(users.id, userId)) - .returning() - - if (!setupUser) { - throw new Error('Could not set up user') - } - - redirect('/app') -} diff --git a/src/app/app/welcome/onboarding-form.tsx b/src/app/app/welcome/onboarding-form.tsx deleted file mode 100644 index fa4ae7c..0000000 --- a/src/app/app/welcome/onboarding-form.tsx +++ /dev/null @@ -1,87 +0,0 @@ -'use client' - -import { useForm } from 'react-hook-form' -import { zodResolver } from '@hookform/resolvers/zod' -import { z } from 'zod' -import { Button } from '@/components/ui/button' -import { - Form, - FormControl, - FormField, - FormItem, - FormLabel, - FormMessage, -} from '@/components/ui/form' -import { Input } from '@/components/ui/input' -import { toast } from '@/components/ui/use-toast' -import { setupUser } from './actions' -import { useAuth } from '@/providers/SupabaseAuthProvider' - -export const onboardingSchema = z.object({ - username: z.string().min(3, 'Username must be at least 3 characters'), - profilePicture: z.string().url('Profile picture must be a valid URL'), -}) - -const OnboardingForm: React.FC = () => { - const auth = useAuth() - const form = useForm>({ - resolver: zodResolver(onboardingSchema), - }) - - const onSubmit = async (data: z.infer) => { - try { - await setupUser(data, auth.user?.id ?? '') - toast({ - title: 'Ready to go!', - description: 'You can now start using the app.', - }) - } catch (error) { - toast({ - title: 'Oops!', - description: 'Could not set up your profile. Please try again.', - }) - } - } - - return ( -
- - ( - - Username - - - - - - )} - /> - ( - - Profile picture (URL) - - - - - - )} - /> - - - - ) -} - -export default OnboardingForm diff --git a/src/app/app/welcome/page.tsx b/src/app/app/welcome/page.tsx deleted file mode 100644 index 96f9017..0000000 --- a/src/app/app/welcome/page.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { redirect } from 'next/navigation' -import { createClient } from '@/lib/supabase/server' -import OnboardingForm from './onboarding-form' -import { - Card, - CardContent, - CardDescription, - CardHeader, - CardTitle, -} from '@/components/ui/card' - -const WelcomePage = async () => { - return ( -
- - - Set up your profile - - {`Welcome! Let's set up your profile so you can start using the app.`} - - - - - - -
- ) -} - -export default WelcomePage diff --git a/src/app/auth/signin/page.tsx b/src/app/auth/signin/page.tsx index 5414bfe..493f601 100644 --- a/src/app/auth/signin/page.tsx +++ b/src/app/auth/signin/page.tsx @@ -1,32 +1,26 @@ -import Image from 'next/image' -import SignInForm from './signin-form' - -const SignInPage = () => { - return ( -
-
-
-
-

Sign in

-

- Sign in to your account. -

-
- -

{`Hint: If you don't have an account yet, this will create you an account.`}

-
-
-
- Image -
-
- ) -} - -export default SignInPage +import { HeartPulseIcon } from 'lucide-react' +import { Card, CardContent } from '@/components/ui/card' +import SignInForm from './signin-form' + +// FIXME: Styling +const SignInPage = () => { + return ( +
+
+
+ +

+ Cardia +

+
+ + + + + +
+
+ ) +} + +export default SignInPage diff --git a/src/app/auth/signin/signin-form.tsx b/src/app/auth/signin/signin-form.tsx index fe3ae6d..394c412 100644 --- a/src/app/auth/signin/signin-form.tsx +++ b/src/app/auth/signin/signin-form.tsx @@ -1,132 +1,134 @@ -'use client' - -import { useEffect, useState, useTransition } from 'react' -import { useForm } from 'react-hook-form' -import { AlertTriangleIcon } from 'lucide-react' -import { zodResolver } from '@hookform/resolvers/zod' -import { z } from 'zod' -import SubmitButton from '@/components/SubmitButton' -import { Alert, AlertDescription } from '@/components/ui/alert' -import { - Form, - FormControl, - FormField, - FormItem, - FormLabel, - FormMessage, -} from '@/components/ui/form' -import { Input } from '@/components/ui/input' -import { signinSchema } from '@/lib/form-validations' -import { signin } from './actions' - -export type SigninFields = z.infer - -const SignInForm: React.FC = () => { - const [pending, startTransition] = useTransition() - const [waitCounter, setWaitCounter] = useState(0) - const [waitingForMagicLink, setWaitingForMagicLink] = useState(false) - const [signinError, setSigninError] = useState(undefined) - const form = useForm({ - resolver: zodResolver(signinSchema), - mode: 'onChange', - }) - - const onSubmit = async (formData: SigninFields) => { - setSigninError(undefined) - setWaitingForMagicLink(false) - - startTransition(async () => { - const { success, message } = await signin(formData) - - if (!success) { - setSigninError(message) - } - - if (success) { - setWaitCounter(30) - } - }) - } - - useEffect(() => { - if (signinError) { - setWaitingForMagicLink(false) - setWaitCounter(0) - } - }, [signinError]) - - useEffect(() => { - let countdown: NodeJS.Timeout - - if (form.formState.isSubmitted && waitCounter > 0) { - setWaitingForMagicLink(true) - const duration = waitCounter * 1000 - - countdown = setInterval(() => { - setWaitCounter((prevCounter) => prevCounter - 1) - }, 1000) - - setTimeout(() => { - setWaitingForMagicLink(false) - clearInterval(countdown) - }, duration) - } - - return () => { - clearInterval(countdown) - } - }, [form.formState.isSubmitted, waitCounter]) - - return ( -
- - ( - - Email - - - - - - )} - /> - {signinError && ( - - - {signinError} - - )} - {waitingForMagicLink && ( - - - If an account with this email exists, you will receive a magic - link in your inbox. - - - )} - - - - ) -} - -export default SignInForm +'use client' + +import { useEffect, useState, useTransition } from 'react' +import { useForm } from 'react-hook-form' +import { AlertTriangleIcon } from 'lucide-react' +import { zodResolver } from '@hookform/resolvers/zod' +import { z } from 'zod' +import SubmitButton from '@/components/SubmitButton' +import { Alert, AlertDescription } from '@/components/ui/alert' +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from '@/components/ui/form' +import { Input } from '@/components/ui/input' +import { signinSchema } from '@/lib/form-validations' +import { signin } from './actions' + +export type SigninFields = z.infer + +const SignInForm: React.FC = () => { + const [pending, startTransition] = useTransition() + const [waitCounter, setWaitCounter] = useState(0) + const [waitingForMagicLink, setWaitingForMagicLink] = useState(false) + const [signinError, setSigninError] = useState(undefined) + const form = useForm({ + resolver: zodResolver(signinSchema), + mode: 'onChange', + }) + + const onSubmit = async (formData: SigninFields) => { + setSigninError(undefined) + setWaitingForMagicLink(false) + + startTransition(async () => { + const { success, message } = await signin(formData) + + if (!success) { + setSigninError(message) + } + + if (success) { + setWaitCounter(30) + } + }) + } + + useEffect(() => { + if (signinError) { + setWaitingForMagicLink(false) + setWaitCounter(0) + } + }, [signinError]) + + useEffect(() => { + let countdown: NodeJS.Timeout + + if (form.formState.isSubmitted && waitCounter > 0) { + setWaitingForMagicLink(true) + const duration = waitCounter * 1000 + + countdown = setInterval(() => { + setWaitCounter((prevCounter) => prevCounter - 1) + }, 1000) + + setTimeout(() => { + setWaitingForMagicLink(false) + clearInterval(countdown) + }, duration) + } + + return () => { + clearInterval(countdown) + } + }, [form.formState.isSubmitted, waitCounter]) + + return ( +
+ + ( + + Email + + + + + + )} + /> + {/* TODO: Move this logic over to the page */} + {signinError && ( + + + {signinError} + + )} + {waitingForMagicLink && ( + + + If an account with this email exists, you will receive a magic + link in your inbox. + + + )} + + + + ) +} + +export default SignInForm + diff --git a/src/app/globals.css b/src/app/globals.css index bbd4963..688ccf8 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -1,76 +1,59 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -@layer base { - :root { - --background: 0 0% 100%; - --foreground: 240 10% 3.9%; - - --card: 0 0% 100%; - --card-foreground: 240 10% 3.9%; - - --popover: 0 0% 100%; - --popover-foreground: 240 10% 3.9%; - - --primary: 240 5.9% 10%; - --primary-foreground: 0 0% 98%; - - --secondary: 240 4.8% 95.9%; - --secondary-foreground: 240 5.9% 10%; - - --muted: 240 4.8% 95.9%; - --muted-foreground: 240 3.8% 46.1%; - - --accent: 240 4.8% 95.9%; - --accent-foreground: 240 5.9% 10%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 0 0% 98%; - - --border: 240 5.9% 90%; - --input: 240 5.9% 90%; - --ring: 240 10% 3.9%; - - --radius: 0.5rem; - } - - .dark { - --background: 240 10% 3.9%; - --foreground: 0 0% 98%; - - --card: 240 10% 3.9%; - --card-foreground: 0 0% 98%; - - --popover: 240 10% 3.9%; - --popover-foreground: 0 0% 98%; - - --primary: 0 0% 98%; - --primary-foreground: 240 5.9% 10%; - - --secondary: 240 3.7% 15.9%; - --secondary-foreground: 0 0% 98%; - - --muted: 240 3.7% 15.9%; - --muted-foreground: 240 5% 64.9%; - - --accent: 240 3.7% 15.9%; - --accent-foreground: 0 0% 98%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 0 0% 98%; - - --border: 240 3.7% 15.9%; - --input: 240 3.7% 15.9%; - --ring: 240 4.9% 83.9%; - } -} - -@layer base { - * { - @apply border-border; - } - body { - @apply bg-background text-foreground; - } -} \ No newline at end of file +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 224 71.4% 4.1%; + --card: 0 0% 100%; + --card-foreground: 224 71.4% 4.1%; + --popover: 0 0% 100%; + --popover-foreground: 224 71.4% 4.1%; + --primary: 262.1 83.3% 57.8%; + --primary-foreground: 210 20% 98%; + --secondary: 220 14.3% 95.9%; + --secondary-foreground: 220.9 39.3% 11%; + --muted: 220 14.3% 95.9%; + --muted-foreground: 220 8.9% 46.1%; + --accent: 220 14.3% 95.9%; + --accent-foreground: 220.9 39.3% 11%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 20% 98%; + --border: 220 13% 91%; + --input: 220 13% 91%; + --ring: 262.1 83.3% 57.8%; + --radius: 0.5rem; + } + + .dark { + --background: 224 71.4% 4.1%; + --foreground: 210 20% 98%; + --card: 224 71.4% 4.1%; + --card-foreground: 210 20% 98%; + --popover: 224 71.4% 4.1%; + --popover-foreground: 210 20% 98%; + --primary: 263.4 70% 50.4%; + --primary-foreground: 210 20% 98%; + --secondary: 215 27.9% 16.9%; + --secondary-foreground: 210 20% 98%; + --muted: 215 27.9% 16.9%; + --muted-foreground: 217.9 10.6% 64.9%; + --accent: 215 27.9% 16.9%; + --accent-foreground: 210 20% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 20% 98%; + --border: 215 27.9% 16.9%; + --input: 215 27.9% 16.9%; + --ring: 263.4 70% 50.4%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 49bfeac..5c16717 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,27 +1,28 @@ -import type { Metadata } from 'next' -import { Inter } from 'next/font/google' -import { Toaster } from '@/components/ui/toaster' -import './globals.css' - -const inter = Inter({ subsets: ['latin'] }) - -export const metadata: Metadata = { - title: 'Cardia - Bloodpressure Tracker', - description: - 'Cardia is a bloodpressure tracker that helps you keep track of your bloodpressure over time. It is a simple and easy to use app that helps you keep track of your bloodpressure readings and helps you stay healthy.', -} - -export default function RootLayout({ - children, -}: Readonly<{ - children: React.ReactNode -}>) { - return ( - - - {children} - - - - ) -} +import type { Metadata } from 'next' +import { Inter } from 'next/font/google' +import { Toaster } from '@/components/ui/toaster' +import './globals.css' + +const inter = Inter({ subsets: ['latin'] }) + +export const metadata: Metadata = { + title: 'Cardia - Bloodpressure Tracker', + description: + 'Cardia is a bloodpressure tracker that helps you keep track of your bloodpressure over time. It is a simple and easy to use app that helps you keep track of your bloodpressure readings and helps you stay healthy.', +} + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode +}>) { + return ( + + + {children} + + + + ) +} + diff --git a/src/app/middleware.ts b/src/app/middleware.ts deleted file mode 100644 index 3867a2a..0000000 --- a/src/app/middleware.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { type NextRequest } from 'next/server' -import { updateSession } from '@/lib/supabase/middleware' - -export async function middleware(request: NextRequest) { - return await updateSession(request) -} - -export const config = { - matcher: [ - '/((?!_next/static|_next/image|favicon.ico|.*\\.(?:svg|png|jpg|jpeg|gif|webp)$).*)', - ], -} diff --git a/src/components/AddRecordCard.tsx b/src/components/AddRecordCard.tsx new file mode 100644 index 0000000..589c4d9 --- /dev/null +++ b/src/components/AddRecordCard.tsx @@ -0,0 +1,175 @@ +'use client' + +import React from 'react' +import { useForm } from 'react-hook-form' +import { LoaderCircle, Save, X } from 'lucide-react' +import { z } from 'zod' +import { zodResolver } from '@hookform/resolvers/zod' +import { format } from 'date-fns' +import { createRecord } from '@/actions/records' +import { recordSchema } from '@/lib/form-validations' +import { Button } from '@/components/ui/button' +import { + Form, + FormControl, + FormField, + FormItem, + FormMessage, +} from '@/components/ui/form' +import { Input } from '@/components/ui/input' + +export const AddRecordCard: React.FC<{ + userId: string + onCancel: () => void +}> = ({ userId, onCancel }) => { + const form = useForm>({ + resolver: zodResolver(recordSchema), + defaultValues: { + date: format(new Date(), 'yyyy-MM-dd'), + time: format(new Date(), 'HH:mm'), + systolic: '', + diastolic: '', + pulse: '', + }, + }) + + const onSubmit = async (data: z.infer) => { + try { + await createRecord(userId, data) + onCancel() + } catch (error) { + console.error('Something went wrong', error) + } + } + + return ( +
+ +
+ ( + + + + + + + )} + /> + ( + + + + + + + )} + /> +
+
+ ( + + + + + + + )} + /> +

Systolic

+
+
+ ( + + + + + + + )} + /> +

Diastolic

+
+
+ ( + + + + + + + )} + /> +

Pulse

+
+
+ + +
+
+ + ) +} diff --git a/src/components/DeleteRecordDialog.tsx b/src/components/DeleteRecordDialog.tsx index 2701203..59ec051 100644 --- a/src/components/DeleteRecordDialog.tsx +++ b/src/components/DeleteRecordDialog.tsx @@ -1,47 +1,55 @@ -import { Trash } from 'lucide-react' -import { - AlertDialog, - AlertDialogTrigger, - AlertDialogContent, - AlertDialogHeader, - AlertDialogTitle, - AlertDialogDescription, - AlertDialogCancel, - AlertDialogAction, - AlertDialogFooter, -} from './ui/alert-dialog' -import { deleteRecord } from '@/actions/records' - -interface Props { - recordId: string -} - -const DeleteRecordDialog: React.FC = ({ recordId }) => { - return ( - - - Delete record - - - - - - Are you sure you want to delete that record? - - - This action cannot be undone. This will permanently delete the - record from the database without any way to recover it. - - - - Cancel - deleteRecord(recordId)}> - Continue - - - - - ) -} - -export default DeleteRecordDialog +import { Trash } from 'lucide-react' +import { + AlertDialog, + AlertDialogTrigger, + AlertDialogContent, + AlertDialogHeader, + AlertDialogTitle, + AlertDialogDescription, + AlertDialogCancel, + AlertDialogAction, + AlertDialogFooter, +} from '@/components/ui/alert-dialog' +import { deleteRecord } from '@/actions/records' + +export interface DeleteRecordDialogProps { + recordId: string + isOpen: boolean + onClose: () => void +} + +const DeleteRecordDialog: React.FC = ({ + recordId, + isOpen, + onClose, +}) => { + const handleDelete = async () => { + try { + await deleteRecord(recordId) + onClose() + } catch (error) { + console.error('Something went wrong', error) + } + } + return ( + + + + + Are you sure you want to delete that record? + + + This action cannot be undone. This will permanently delete the + record without recovery. + + + + Cancel + Continue + + + + ) +} + +export default DeleteRecordDialog diff --git a/src/components/EmptyRecord.tsx b/src/components/EmptyRecord.tsx new file mode 100644 index 0000000..71a7ecb --- /dev/null +++ b/src/components/EmptyRecord.tsx @@ -0,0 +1,28 @@ +'use client' + +import { useState } from 'react' +import { SquarePlus } from 'lucide-react' +import { Button } from '@/components/ui/button' +import { AddRecordCard } from './AddRecordCard' + +export interface EmptyRecordProps { + userId: string +} + +export const EmptyRecord: React.FC = ({ userId }) => { + const [creating, setCreating] = useState(false) + + return !creating ? ( +
+

+ It seems like you don't have any recordings yet. +

+ +
+ ) : ( + setCreating(false)} /> + ) +} diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 7449339..71eb9fb 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -1,81 +1,81 @@ -'use client' - -import { HeartPulse, LogOut } from 'lucide-react' -import Link from 'next/link' -import { useRouter } from 'next/navigation' -import { Avatar, AvatarFallback, AvatarImage } from './ui/avatar' -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuLabel, - DropdownMenuSeparator, - DropdownMenuTrigger, -} from './ui/dropdown-menu' -import { createClient } from '@/lib/supabase/client' -import { User } from '@/types/user' - -interface Props { - user: User -} - -const Navbar: React.FC = ({ user }) => { - const supabase = createClient() - const router = useRouter() - - const getUserInitials = (): string => { - const name = user.username ?? '' - const initials = name - .split(' ') - .map((n) => n[0]) - .join('') - return initials.toUpperCase() - } - - const handleLogout = async () => { - const { error } = await supabase.auth.signOut() - - if (error) { - console.error('Error logging out:', error.message) - return - } - - router.push('/auth/signin') - } - - return ( -
- - - Cardia - - - - - {user.profilePicture && } - {getUserInitials()} - - - - My Account - - - Settings - - - - Logout - - - -
- ) -} - -export default Navbar +'use client' + +import { HeartPulse, LogOut } from 'lucide-react' +import Link from 'next/link' +import { useRouter } from 'next/navigation' +import { Avatar, AvatarFallback, AvatarImage } from './ui/avatar' +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from './ui/dropdown-menu' +import { createClient } from '@/lib/supabase/client' +import { User } from '@/types/user' + +interface Props { + user: Omit +} + +const Navbar: React.FC = ({ user }) => { + const supabase = createClient() + const router = useRouter() + + const getUserInitials = (): string => { + const name = user.username ?? '' + const initials = name + .split(' ') + .map((n) => n[0]) + .join('') + return initials.toUpperCase() + } + + const handleLogout = async () => { + const { error } = await supabase.auth.signOut() + + if (error) { + console.error('Error logging out:', error.message) + return + } + + router.push('/auth/signin') + } + + return ( +
+ + + Cardia + + + + + {user.avatar && } + {getUserInitials()} + + + + My Account + + + Settings + + + + Logout + + + +
+ ) +} + +export default Navbar diff --git a/src/components/NewRecordDialog.tsx b/src/components/NewRecordDialog.tsx deleted file mode 100644 index 31b404a..0000000 --- a/src/components/NewRecordDialog.tsx +++ /dev/null @@ -1,45 +0,0 @@ -'use client' - -import { useState } from 'react' -import { z } from 'zod' -import { Button } from '@/components/ui/button' -import { - Dialog, - DialogContent, - DialogDescription, - DialogHeader, - DialogTitle, - DialogTrigger, -} from '@/components/ui/dialog' -import NewRecordForm from './NewRecordForm' - -const formSchema = z.object({ - systolic: z.string().min(0), - diastolic: z.string().min(0), - pulse: z.string().min(0), -}) - -export type NewRecordFields = z.infer - -const NewRecordDialog: React.FC = () => { - const [isDialogOpen, setIsDialogOpen] = useState(false) - - return ( - - - - - - - Add new record - - {`Add a new record to your blood pressure history.`} - - - setIsDialogOpen(false)} /> - - - ) -} - -export default NewRecordDialog diff --git a/src/components/NewRecordForm.tsx b/src/components/NewRecordForm.tsx deleted file mode 100644 index a6d0de7..0000000 --- a/src/components/NewRecordForm.tsx +++ /dev/null @@ -1,125 +0,0 @@ -'use client' - -import { z } from 'zod' -import { useForm } from 'react-hook-form' -import { zodResolver } from '@hookform/resolvers/zod' -import { createRecord } from '@/actions/records' -import { useAuth } from '@/providers/SupabaseAuthProvider' -import { DialogFooter } from './ui/dialog' -import { - Form, - FormField, - FormItem, - FormLabel, - FormControl, - FormMessage, -} from './ui/form' -import { Input } from './ui/input' -import { Button } from './ui/button' -import { toast } from './ui/use-toast' -import { DateTimePicker } from './ui/date-time-picker' - -interface Props { - closeDialog: () => void -} - -export const newRecordSchema = z.object({ - recordedAt: z.date(), - systolic: z.string().min(0).max(3), - diastolic: z.string().min(0).max(2), - pulse: z.string().min(0).max(3), -}) - -export type NewRecordFields = z.infer - -const NewRecordForm: React.FC = ({ closeDialog }) => { - const { user } = useAuth() - const form = useForm({ - resolver: zodResolver(newRecordSchema), - }) - - const onSubmit = async (data: NewRecordFields) => { - try { - await createRecord(user?.id ?? '', data) - toast({ - title: 'Record created!', - description: 'The record has been successfully created.', - }) - closeDialog() - } catch (error) { - toast({ - title: 'Oops!', - description: 'Could not create the record. Please try again.', - }) - } - } - - return ( -
- - ( - - Systolic - - - - - - )} - /> - ( - - Diastolic - - - - - - )} - /> - ( - - Pulse - - - - - - )} - /> - ( - - Record date - - - - - - )} - /> - - - - - - - ) -} - -export default NewRecordForm diff --git a/src/components/RecordCard.tsx b/src/components/RecordCard.tsx new file mode 100644 index 0000000..cc147e3 --- /dev/null +++ b/src/components/RecordCard.tsx @@ -0,0 +1,136 @@ +'use client' + +import React, { useState } from 'react' +import { Edit3, Trash2 } from 'lucide-react' +import { Button } from '@/components/ui/button' +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu' +import DeleteRecordDialog from './DeleteRecordDialog' + +// TODO: Get the actual interface +export interface RecordCardProps { + id: string + systolic: number + diastolic: number + pulse: number + recordedAt: Date +} + +const Options: React.FC<{ onDelete: () => void }> = ({ onDelete }) => ( + + + + + + + + Edit + + + + Delete + + + +) + +export const RecordCard: React.FC = ({ + id, + systolic, + diastolic, + pulse, + recordedAt, +}) => { + const [deleteDialog, setDeleteDialog] = useState(false) + + const getSystolicStatus = (systolic: number) => { + switch (true) { + case systolic < 130: + return 'Elevated' + case systolic < 140: + return 'Stage 1' + case systolic < 160: + return 'Stage 2' + case systolic < 180: + return 'Stage 3' + default: + return false + } + } + + const getDiastolicStatus = (diastolic: number) => { + switch (true) { + case diastolic < 85: + return 'High' + case diastolic < 90: + return 'Stage 1' + case diastolic < 100: + return 'Stage 2' + case diastolic < 110: + return 'Stage 3' + default: + return false + } + } + + const formattedDate = new Date(recordedAt).toLocaleDateString() + const formattedTime = new Date(recordedAt).toLocaleTimeString() + const systolicStatus = getSystolicStatus(systolic) + const diastolicStatus = getDiastolicStatus(systolic) + + return ( + <> +
+
+

{formattedDate}

+

{formattedTime}

+
+
+

+ {systolic} + {systolicStatus && ( +

+ {systolicStatus} +
+ )} +

+

Systolic

+
+
+

+ {diastolic} + {diastolicStatus && ( +

+ {diastolicStatus} +
+ )} +

+

Diastolic

+
+
+

{pulse}

+

Pulse

+
+
+ setDeleteDialog(true)} /> +
+
+ + setDeleteDialog(false)} + /> + + ) +} diff --git a/src/components/Toolbar.tsx b/src/components/Toolbar.tsx new file mode 100644 index 0000000..77c7404 --- /dev/null +++ b/src/components/Toolbar.tsx @@ -0,0 +1,32 @@ +'use client' + +import { Button } from '@/components/ui/button' +import { Filter, SquarePlus } from 'lucide-react' +import { AddRecordCard } from './AddRecordCard' +import { useState } from 'react' + +export const Toolbar: React.FC<{ userId: string }> = ({ userId }) => { + const [addRecord, setAddRecord] = useState(false) + + return ( + <> +
+
+ + {/* */} +
+ +
+ + {addRecord && ( + setAddRecord(false)} /> + )} + + ) +} diff --git a/src/components/ui/date-range-picker.tsx b/src/components/ui/date-range-picker.tsx new file mode 100644 index 0000000..532c7c5 --- /dev/null +++ b/src/components/ui/date-range-picker.tsx @@ -0,0 +1,66 @@ +'use client' + +import * as React from 'react' +import { addDays, format } from 'date-fns' +import { Calendar as CalendarIcon } from 'lucide-react' +import { DateRange } from 'react-day-picker' + +import { cn } from '@/lib/utils' +import { Button } from '@/components/ui/button' +import { Calendar } from '@/components/ui/calendar' +import { + Popover, + PopoverContent, + PopoverTrigger, +} from '@/components/ui/popover' + +export function DatePickerWithRange({ + className, +}: React.HTMLAttributes) { + const [date, setDate] = React.useState({ + from: new Date(2022, 0, 20), + to: addDays(new Date(2022, 0, 20), 20), + }) + + return ( +
+ + + + + + console.log('yup')} + /> + + +
+ ) +} diff --git a/src/db/index.ts b/src/db/index.ts index 7a8fa84..9cd3174 100644 --- a/src/db/index.ts +++ b/src/db/index.ts @@ -1,20 +1,8 @@ -import 'dotenv/config' -import { Client } from 'pg' -import { drizzle } from 'drizzle-orm/node-postgres' -import * as schema from './schema' - -const connectionString = process.env.DB_URL! -const client = new Client({ - connectionString: connectionString, -}) - -const connectDatabase = async () => { - try { - await client.connect() - } catch (e) { - console.error('Failed to connect to the database', e) - } -} - -connectDatabase() -export const db = drizzle(client, { schema: schema, logger: true }) +import { drizzle } from 'drizzle-orm/postgres-js' +import postgres from 'postgres' +import * as schema from './schema' + +const connectionString = process.env.DB_URL! + +const client = postgres(connectionString) +export const db = drizzle(client, { schema: schema, logger: true }) diff --git a/src/db/schema.ts b/src/db/schema.ts index 2b5a4ba..d06d421 100644 --- a/src/db/schema.ts +++ b/src/db/schema.ts @@ -1,44 +1,60 @@ -import { relations, sql } from 'drizzle-orm' -import { integer, pgSchema, text, timestamp, uuid } from 'drizzle-orm/pg-core' - -export const authSchema = pgSchema('auth') - -export const authUsers = authSchema.table('users', { - id: uuid('id').primaryKey().notNull(), -}) - -export const cardiaSchema = pgSchema('cardia') - -export const users = cardiaSchema.table('users', { - id: uuid('id') - .primaryKey() - .notNull() - .references(() => authUsers.id, { onDelete: 'cascade' }), - username: text('username'), - profilePicture: text('profile_picture'), -}) - -export const usersRelations = relations(users, ({ many }) => ({ - records: many(records), -})) - -export const records = cardiaSchema.table('record', { - id: uuid('id') - .default(sql`gen_random_uuid()`) - .notNull() - .primaryKey(), - userId: uuid('user_id') - .references(() => users.id, { onDelete: 'cascade' }) - .notNull(), - systolic: integer('systolic').notNull(), - diastolic: integer('diastolic').notNull(), - pulse: integer('pulse').notNull(), - recordedAt: timestamp('recorded_at').defaultNow().notNull(), -}) - -export const recordsRelations = relations(records, ({ one }) => ({ - user: one(users, { - fields: [records.userId], - references: [users.id], - }), -})) +import { relations, sql } from 'drizzle-orm' +import { + boolean, + integer, + pgSchema, + text, + timestamp, + uuid, + varchar, +} from 'drizzle-orm/pg-core' + +// Supabase Auth Schema +export const authSchema = pgSchema('auth') + +// Users table in the auth schema +export const authUsers = authSchema.table('users', { + id: uuid('id').primaryKey().notNull(), +}) + +// Cardia Schema +export const cardiaSchema = pgSchema('cardia') + +export const profile = cardiaSchema.table('profile', { + id: uuid('id') + .primaryKey() + .notNull() + .references(() => authUsers.id, { onDelete: 'cascade' }), + username: text('username').unique(), + email: varchar('email').notNull(), + avatar: text('avatar'), + dob: timestamp('dob'), + weight: integer('weight'), + height: integer('height'), + onboardingCompleted: boolean('onboarding_completed').default(false).notNull(), +}) + +export const profileRelations = relations(profile, ({ many }) => ({ + records: many(records), +})) + +export const records = cardiaSchema.table('record', { + id: uuid('id') + .default(sql`gen_random_uuid()`) + .notNull() + .primaryKey(), + userId: uuid('user_id') + .references(() => profile.id, { onDelete: 'cascade' }) + .notNull(), + systolic: integer('systolic').notNull(), + diastolic: integer('diastolic').notNull(), + pulse: integer('pulse').notNull(), + recordedAt: timestamp('recorded_at').defaultNow().notNull(), +}) + +export const recordsRelations = relations(records, ({ one }) => ({ + user: one(profile, { + fields: [records.userId], + references: [profile.id], + }), +})) diff --git a/src/lib/form-validations.ts b/src/lib/form-validations.ts index 62bdaa2..0581bcc 100644 --- a/src/lib/form-validations.ts +++ b/src/lib/form-validations.ts @@ -1,5 +1,22 @@ -import { z } from 'zod' - -export const signinSchema = z.object({ - email: z.string().email(), -}) +import { z } from 'zod' + +export const signinSchema = z.object({ + email: z.string().email(), +}) + +export const recordSchema = z.object({ + date: z.string().min(1, { message: 'Date is required' }), + time: z.string().min(1, { message: 'Time is required' }), + systolic: z.string().min(1, { message: 'Systolic is required' }).max(3), + diastolic: z.string().min(1, { message: 'Diastolic is required' }).max(3), + pulse: z.string().min(1, { message: 'Pulse is required' }).max(3), +}) + +export const profileSchema = z.object({ + username: z.string().min(3).max(20), + email: z.string().email(), + avatar: z.string().url(), + dob: z.string(), + weight: z.string().optional(), + height: z.string().optional(), +}) diff --git a/src/lib/supabase/middleware.ts b/src/lib/supabase/middleware.ts deleted file mode 100644 index 2acc794..0000000 --- a/src/lib/supabase/middleware.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { createServerClient, type CookieOptions } from '@supabase/ssr' -import { NextResponse, type NextRequest } from 'next/server' - -export async function updateSession(request: NextRequest) { - let response = NextResponse.next({ - request: { - headers: request.headers, - }, - }) - - const supabase = createServerClient( - process.env.NEXT_PUBLIC_SUPABASE_URL!, - process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, - { - cookies: { - get(name: string) { - return request.cookies.get(name)?.value - }, - set(name: string, value: string, options: CookieOptions) { - request.cookies.set({ - name, - value, - ...options, - }) - response = NextResponse.next({ - request: { - headers: request.headers, - }, - }) - response.cookies.set({ - name, - value, - ...options, - }) - }, - remove(name: string, options: CookieOptions) { - request.cookies.set({ - name, - value: '', - ...options, - }) - response = NextResponse.next({ - request: { - headers: request.headers, - }, - }) - response.cookies.set({ - name, - value: '', - ...options, - }) - }, - }, - } - ) - - await supabase.auth.getUser() - - return response -} diff --git a/src/middleware.ts b/src/middleware.ts new file mode 100644 index 0000000..7721ad0 --- /dev/null +++ b/src/middleware.ts @@ -0,0 +1,79 @@ +import createMiddleware from 'next-easy-middlewares' +import { type NextRequest, NextResponse } from 'next/server' +import { createServerClient } from '@supabase/ssr' + +const middlewares = { + '/app/:path*': [ + async (request: NextRequest) => { + let response = NextResponse.next({ + request: { + headers: request.headers, + }, + }) + + const supabase = createServerClient( + process.env.NEXT_PUBLIC_SUPABASE_URL!, + process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, + { + cookies: { + get(name: string) { + return request.cookies.get(name)?.value + }, + set(name: string, value: string, options) { + request.cookies.set({ + name, + value, + ...options, + }) + response = NextResponse.next({ + request: { + headers: request.headers, + }, + }) + response.cookies.set({ + name, + value, + ...options, + }) + }, + remove(name: string, options) { + request.cookies.set({ + name, + value: '', + ...options, + }) + response = NextResponse.next({ + request: { + headers: request.headers, + }, + }) + response.cookies.set({ + name, + value: '', + ...options, + }) + }, + }, + } + ) + + await supabase.auth.getUser() + + return response + }, + ], +} + +export const middleware = createMiddleware(middlewares) + +export const config = { + matcher: [ + /* + * Match all request paths except for the ones starting with: + * - api (API routes) + * - _next/static (static files) + * - favicon.ico (favicon file) + */ + '/((?!api|_next/static|favicon.ico).*)', + ], +} diff --git a/src/types/user.ts b/src/types/user.ts index e322bbd..52d757f 100644 --- a/src/types/user.ts +++ b/src/types/user.ts @@ -1,5 +1,9 @@ -export interface User { - id: string - username: string | null - profilePicture: string | null -} +export interface User { + id: string + username: string + email: string + avatar?: string | null + dob?: Date | null + weight?: number | null + height?: number | null +} From cd87fa9defd446e9f7b52185c0a9a73ab8da20b6 Mon Sep 17 00:00:00 2001 From: Dean Hidri Date: Tue, 16 Jul 2024 21:09:09 +0200 Subject: [PATCH 02/10] feat: add onboarding and a couple of other things --- .env.example | 17 ++-- .../signin/actions.ts => actions/auth.ts} | 60 ++++++------ src/actions/profile.ts | 24 ++++- src/app/app/onboarding/onboarding-form.tsx | 94 +++++++++++++++++++ src/app/app/onboarding/page.tsx | 27 +++++- src/app/app/page.tsx | 17 +++- src/app/app/settings/profile-form.tsx | 6 +- src/app/auth/signin/signin-form.tsx | 3 +- src/components/AddRecordCard.tsx | 2 +- src/components/DeleteRecordDialog.tsx | 2 - src/components/Toolbar.tsx | 4 +- src/lib/form-validations.ts | 6 ++ src/middleware.ts | 63 +------------ src/middlewares/supabase-auth.ts | 61 ++++++++++++ 14 files changed, 273 insertions(+), 113 deletions(-) rename src/{app/auth/signin/actions.ts => actions/auth.ts} (86%) create mode 100644 src/app/app/onboarding/onboarding-form.tsx create mode 100644 src/middlewares/supabase-auth.ts diff --git a/.env.example b/.env.example index d67873f..c20bcfe 100644 --- a/.env.example +++ b/.env.example @@ -1,8 +1,9 @@ -NEXT_PUBLIC_BASE_URL= -AUTH_SECRET= - -# Supabase -NEXT_PUBLIC_SUPABASE_URL= -NEXT_PUBLIC_SUPABASE_ANON_KEY= - - +NEXT_PUBLIC_BASE_URL= +AUTH_SECRET= + +# Supabase +NEXT_PUBLIC_SUPABASE_URL= +NEXT_PUBLIC_SUPABASE_ANON_KEY= + +# Database +DB_URL= diff --git a/src/app/auth/signin/actions.ts b/src/actions/auth.ts similarity index 86% rename from src/app/auth/signin/actions.ts rename to src/actions/auth.ts index 7bc8687..c48c9df 100644 --- a/src/app/auth/signin/actions.ts +++ b/src/actions/auth.ts @@ -1,30 +1,30 @@ -'use server' - -import { SignInWithPasswordlessCredentials } from '@supabase/supabase-js' -import { createClient } from '@/lib/supabase/server' -import { SigninFields } from './signin-form' - -export async function signin(formData: SigninFields) { - const supabase = createClient() - - const data = { - email: formData.email, - options: { - emailRedirectTo: process.env.NEXT_PUBLIC_BASE_URL + '/auth/confirm', - }, - } satisfies SignInWithPasswordlessCredentials - - const { error } = await supabase.auth.signInWithOtp(data) - - if (error) { - return { - success: false, - message: error.code, - } - } - - return { - success: true, - message: 'A magic link has been sent to your email address.', - } -} +'use server' + +import { SignInWithPasswordlessCredentials } from '@supabase/supabase-js' +import { createClient } from '@/lib/supabase/server' + +export async function signin(formData: { email: string }) { + const supabase = createClient() + + const data = { + email: formData.email, + options: { + emailRedirectTo: process.env.NEXT_PUBLIC_BASE_URL + '/auth/confirm', + }, + } satisfies SignInWithPasswordlessCredentials + + const { error } = await supabase.auth.signInWithOtp(data) + + if (error) { + return { + success: false, + message: error.code, + } + } + + return { + success: true, + message: 'A magic link has been sent to your email address.', + } +} + diff --git a/src/actions/profile.ts b/src/actions/profile.ts index b32dec4..f680fbd 100644 --- a/src/actions/profile.ts +++ b/src/actions/profile.ts @@ -5,7 +5,7 @@ import { eq } from 'drizzle-orm' import { z } from 'zod' import { db } from '@/db' import { profile } from '@/db/schema' -import { profileSchema } from '@/lib/form-validations' +import { onboardingSchema, profileSchema } from '@/lib/form-validations' export async function updateProfile( userId: string, @@ -30,3 +30,25 @@ export async function updateProfile( revalidatePath('/app') } + +export async function setProfile( + userId: string, + data: z.infer +) { + const transformedData = { + ...data, + dob: data.dob ? new Date(data.dob) : null, + } + + const setProfile = await db + .update(profile) + .set(transformedData) + .where(eq(profile.id, userId)) + .returning() + + if (!setProfile) { + throw new Error('Could not set profile data') + } + + revalidatePath('/app') +} diff --git a/src/app/app/onboarding/onboarding-form.tsx b/src/app/app/onboarding/onboarding-form.tsx new file mode 100644 index 0000000..3c83887 --- /dev/null +++ b/src/app/app/onboarding/onboarding-form.tsx @@ -0,0 +1,94 @@ +'use client' + +import { useForm } from 'react-hook-form' +import { z } from 'zod' +import { zodResolver } from '@hookform/resolvers/zod' +import { setProfile } from '@/actions/profile' +import { onboardingSchema } from '@/lib/form-validations' +import SubmitButton from '@/components/SubmitButton' +import { + FormField, + FormItem, + FormControl, + FormMessage, + Form, + FormLabel, +} from '@/components/ui/form' +import { Input } from '@/components/ui/input' + +export interface OnboardingFormProps { + userId: string +} + +export const OnboardingForm: React.FC = ({ userId }) => { + const form = useForm>({ + resolver: zodResolver(onboardingSchema), + }) + + const onSubmit = async (values: z.infer) => { + try { + await setProfile(userId, values) + } catch (error) { + console.error('Something went wrong', error) + } + } + + return ( +
+ + ( + + Profile picture (URL) + + + + + + )} + /> +
+ ( + + Username + + + + + + )} + /> +
+ ( + + Date of birth + + + + + + )} + /> +
+ +
+ + + ) +} diff --git a/src/app/app/onboarding/page.tsx b/src/app/app/onboarding/page.tsx index 5066d4f..14a0cd9 100644 --- a/src/app/app/onboarding/page.tsx +++ b/src/app/app/onboarding/page.tsx @@ -1,7 +1,28 @@ -const OnboardingPage = () => { +import { redirect } from 'next/navigation' +import { createClient } from '@/lib/supabase/server' +import { OnboardingForm } from './onboarding-form' + +const OnboardingPage = async () => { + const supabase = createClient() + const { data, error } = await supabase.auth.getUser() + + if (error || !data?.user) { + redirect('/auth/signin') + } + return ( -
-

Onboarding Page

+
+
+

+ Set up your profile +

+

+ Complete the following steps to create your account. +

+
+
+ +
) } diff --git a/src/app/app/page.tsx b/src/app/app/page.tsx index 45b01df..0583a77 100644 --- a/src/app/app/page.tsx +++ b/src/app/app/page.tsx @@ -1,7 +1,7 @@ import { desc, eq } from 'drizzle-orm' import { redirect } from 'next/navigation' import { db } from '@/db' -import { records } from '@/db/schema' +import { profile, records } from '@/db/schema' import { createClient } from '@/lib/supabase/server' import { RecordCard } from '@/components/RecordCard' import { Toolbar } from '@/components/Toolbar' @@ -15,6 +15,21 @@ const AppMainPage = async () => { redirect('/auth/signin') } + // Check if the user has a profile, if not redirect to onboarding page + const hasUserProfile = await db.query.profile + .findFirst({ + where: eq(profile.id, data.user.id), + }) + .then((profile) => !!profile?.username) + .catch(() => false) + + console.debug('hasUserProfile', hasUserProfile) + + if (!hasUserProfile) { + redirect('/app/onboarding') + } + + // Fetch all records for the current user const dbRecords = await db.query.records.findMany({ where: eq(records.userId, data.user.id), orderBy: desc(records.recordedAt), diff --git a/src/app/app/settings/profile-form.tsx b/src/app/app/settings/profile-form.tsx index 714cbe7..2461a2f 100644 --- a/src/app/app/settings/profile-form.tsx +++ b/src/app/app/settings/profile-form.tsx @@ -52,8 +52,10 @@ export const ProfileForm: React.FC = ({ dob: profileData.dob ? new Date(profileData.dob).toISOString().split('T')[0] : '', - weight: profileData.weight ?? '', - height: profileData.height ?? '', + weight: + profileData.weight !== undefined ? String(profileData.weight) : '', + height: + profileData.height !== undefined ? String(profileData.height) : '', }) }, [profileData]) diff --git a/src/app/auth/signin/signin-form.tsx b/src/app/auth/signin/signin-form.tsx index 394c412..2e7fc50 100644 --- a/src/app/auth/signin/signin-form.tsx +++ b/src/app/auth/signin/signin-form.tsx @@ -17,7 +17,7 @@ import { } from '@/components/ui/form' import { Input } from '@/components/ui/input' import { signinSchema } from '@/lib/form-validations' -import { signin } from './actions' +import { signin } from '@/actions/auth' export type SigninFields = z.infer @@ -131,4 +131,3 @@ const SignInForm: React.FC = () => { } export default SignInForm - diff --git a/src/components/AddRecordCard.tsx b/src/components/AddRecordCard.tsx index 589c4d9..f0ff0c5 100644 --- a/src/components/AddRecordCard.tsx +++ b/src/components/AddRecordCard.tsx @@ -4,8 +4,8 @@ import React from 'react' import { useForm } from 'react-hook-form' import { LoaderCircle, Save, X } from 'lucide-react' import { z } from 'zod' -import { zodResolver } from '@hookform/resolvers/zod' import { format } from 'date-fns' +import { zodResolver } from '@hookform/resolvers/zod' import { createRecord } from '@/actions/records' import { recordSchema } from '@/lib/form-validations' import { Button } from '@/components/ui/button' diff --git a/src/components/DeleteRecordDialog.tsx b/src/components/DeleteRecordDialog.tsx index 59ec051..77560a2 100644 --- a/src/components/DeleteRecordDialog.tsx +++ b/src/components/DeleteRecordDialog.tsx @@ -1,7 +1,5 @@ -import { Trash } from 'lucide-react' import { AlertDialog, - AlertDialogTrigger, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, diff --git a/src/components/Toolbar.tsx b/src/components/Toolbar.tsx index 77c7404..f090f4b 100644 --- a/src/components/Toolbar.tsx +++ b/src/components/Toolbar.tsx @@ -1,9 +1,9 @@ 'use client' -import { Button } from '@/components/ui/button' +import { useState } from 'react' import { Filter, SquarePlus } from 'lucide-react' +import { Button } from '@/components/ui/button' import { AddRecordCard } from './AddRecordCard' -import { useState } from 'react' export const Toolbar: React.FC<{ userId: string }> = ({ userId }) => { const [addRecord, setAddRecord] = useState(false) diff --git a/src/lib/form-validations.ts b/src/lib/form-validations.ts index 0581bcc..6445015 100644 --- a/src/lib/form-validations.ts +++ b/src/lib/form-validations.ts @@ -20,3 +20,9 @@ export const profileSchema = z.object({ weight: z.string().optional(), height: z.string().optional(), }) + +export const onboardingSchema = z.object({ + username: z.string().min(3).max(20), + avatar: z.string().url(), + dob: z.string(), +}) diff --git a/src/middleware.ts b/src/middleware.ts index 7721ad0..76ad1a3 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -1,67 +1,8 @@ import createMiddleware from 'next-easy-middlewares' -import { type NextRequest, NextResponse } from 'next/server' -import { createServerClient } from '@supabase/ssr' +import supabaseAuth from './middlewares/supabase-auth' const middlewares = { - '/app/:path*': [ - async (request: NextRequest) => { - let response = NextResponse.next({ - request: { - headers: request.headers, - }, - }) - - const supabase = createServerClient( - process.env.NEXT_PUBLIC_SUPABASE_URL!, - process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, - { - cookies: { - get(name: string) { - return request.cookies.get(name)?.value - }, - set(name: string, value: string, options) { - request.cookies.set({ - name, - value, - ...options, - }) - response = NextResponse.next({ - request: { - headers: request.headers, - }, - }) - response.cookies.set({ - name, - value, - ...options, - }) - }, - remove(name: string, options) { - request.cookies.set({ - name, - value: '', - ...options, - }) - response = NextResponse.next({ - request: { - headers: request.headers, - }, - }) - response.cookies.set({ - name, - value: '', - ...options, - }) - }, - }, - } - ) - - await supabase.auth.getUser() - - return response - }, - ], + '/app/:path*': [supabaseAuth], } export const middleware = createMiddleware(middlewares) diff --git a/src/middlewares/supabase-auth.ts b/src/middlewares/supabase-auth.ts new file mode 100644 index 0000000..9cf47fd --- /dev/null +++ b/src/middlewares/supabase-auth.ts @@ -0,0 +1,61 @@ +import { createServerClient } from '@supabase/ssr' +import { NextRequest, NextResponse } from 'next/server' + +const supabaseAuth = async (request: NextRequest) => { + let response = NextResponse.next({ + request: { + headers: request.headers, + }, + }) + + const supabase = createServerClient( + process.env.NEXT_PUBLIC_SUPABASE_URL!, + process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, + { + cookies: { + get(name: string) { + return request.cookies.get(name)?.value + }, + set(name: string, value: string, options) { + request.cookies.set({ + name, + value, + ...options, + }) + response = NextResponse.next({ + request: { + headers: request.headers, + }, + }) + response.cookies.set({ + name, + value, + ...options, + }) + }, + remove(name: string, options) { + request.cookies.set({ + name, + value: '', + ...options, + }) + response = NextResponse.next({ + request: { + headers: request.headers, + }, + }) + response.cookies.set({ + name, + value: '', + ...options, + }) + }, + }, + } + ) + + await supabase.auth.getUser() + return response +} + +export default supabaseAuth From 5e244743788e9b0be6980aabf98026fc87aeb00d Mon Sep 17 00:00:00 2001 From: Dean Hidri Date: Tue, 16 Jul 2024 21:17:51 +0200 Subject: [PATCH 03/10] chore: Change the badge style for various statuses --- src/components/Badge.tsx | 37 +++++++++++++++++++++++++++++++++++ src/components/RecordCard.tsx | 14 +++++++------ 2 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 src/components/Badge.tsx diff --git a/src/components/Badge.tsx b/src/components/Badge.tsx new file mode 100644 index 0000000..5783ffa --- /dev/null +++ b/src/components/Badge.tsx @@ -0,0 +1,37 @@ +import React from 'react' + +interface BadgeProps extends React.PropsWithChildren { + color?: 'primary' | 'secondary' | 'success' | 'warning' | 'danger' + classNames?: string +} + +const Badge: React.FC = ({ + color = 'primary', + classNames = '', + children, +}) => { + const getColorClass = () => { + switch (color) { + case 'secondary': + return 'bg-gray-300 text-gray-700' + case 'success': + return 'bg-green-500 text-white' + case 'warning': + return 'bg-yellow-500 text-white' + case 'danger': + return 'bg-red-500 text-white' + default: + return 'bg-blue-500 text-white' + } + } + + return ( + + {children} + + ) +} + +export default Badge diff --git a/src/components/RecordCard.tsx b/src/components/RecordCard.tsx index cc147e3..a415206 100644 --- a/src/components/RecordCard.tsx +++ b/src/components/RecordCard.tsx @@ -10,8 +10,8 @@ import { DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' import DeleteRecordDialog from './DeleteRecordDialog' +import Badge from './Badge' -// TODO: Get the actual interface export interface RecordCardProps { id: string systolic: number @@ -52,7 +52,7 @@ export const RecordCard: React.FC = ({ const getSystolicStatus = (systolic: number) => { switch (true) { - case systolic < 130: + case systolic > 120: return 'Elevated' case systolic < 140: return 'Stage 1' @@ -99,9 +99,11 @@ export const RecordCard: React.FC = ({

{systolic} {systolicStatus && ( -

+ {systolicStatus} -
+ )}

Systolic

@@ -110,9 +112,9 @@ export const RecordCard: React.FC = ({

{diastolic} {diastolicStatus && ( -

+ {diastolicStatus} -
+ )}

Diastolic

From 3ecb995199ba0066d49e508c3cf6a4b066ecca58 Mon Sep 17 00:00:00 2001 From: Dean Hidri Date: Tue, 16 Jul 2024 21:35:46 +0200 Subject: [PATCH 04/10] fix: Actually check for `onboardingCompleted` value --- .gitignore | 73 +++++++++++++++++++++--------------------- src/actions/profile.ts | 4 ++- src/app/app/page.tsx | 5 +-- 3 files changed, 41 insertions(+), 41 deletions(-) diff --git a/.gitignore b/.gitignore index fd3dbb5..4c9ab13 100644 --- a/.gitignore +++ b/.gitignore @@ -1,36 +1,37 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js -.yarn/install-state.gz - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env*.local - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/src/actions/profile.ts b/src/actions/profile.ts index f680fbd..8b04e16 100644 --- a/src/actions/profile.ts +++ b/src/actions/profile.ts @@ -6,6 +6,7 @@ import { z } from 'zod' import { db } from '@/db' import { profile } from '@/db/schema' import { onboardingSchema, profileSchema } from '@/lib/form-validations' +import { redirect } from 'next/navigation' export async function updateProfile( userId: string, @@ -38,6 +39,7 @@ export async function setProfile( const transformedData = { ...data, dob: data.dob ? new Date(data.dob) : null, + onboardingCompleted: true, } const setProfile = await db @@ -50,5 +52,5 @@ export async function setProfile( throw new Error('Could not set profile data') } - revalidatePath('/app') + redirect('/app') } diff --git a/src/app/app/page.tsx b/src/app/app/page.tsx index 0583a77..5a3d85f 100644 --- a/src/app/app/page.tsx +++ b/src/app/app/page.tsx @@ -20,10 +20,7 @@ const AppMainPage = async () => { .findFirst({ where: eq(profile.id, data.user.id), }) - .then((profile) => !!profile?.username) - .catch(() => false) - - console.debug('hasUserProfile', hasUserProfile) + .then((profile) => profile?.onboardingCompleted) if (!hasUserProfile) { redirect('/app/onboarding') From 330448efde072ded7738123157412cc262c79c7a Mon Sep 17 00:00:00 2001 From: root Date: Sun, 6 Oct 2024 13:24:16 +0000 Subject: [PATCH 05/10] feat: Further upgrades to the UI --- .env.example | 18 +- .gitignore | 6 + bun.lockb | Bin 316773 -> 311169 bytes drizzle.config.ts | 2 +- drizzle/0000_talented_kinsey_walden.sql | 40 -- drizzle/meta/0000_snapshot.json | 366 ++++++++++++++---- drizzle/meta/_journal.json | 8 +- package.json | 131 ++++--- src/actions/auth.ts | 37 +- src/actions/profile.ts | 56 --- src/actions/records.ts | 41 +- src/actions/settings.ts | 66 ++++ src/app/api/auth/[...nextauth]/route.ts | 2 + src/app/api/records/export/route.ts | 69 ---- src/app/api/upload/route.ts | 62 +++ src/app/app/layout.tsx | 28 +- src/app/app/onboarding/onboarding-form.tsx | 94 ----- src/app/app/onboarding/page.tsx | 30 -- src/app/app/page.tsx | 75 +--- src/app/app/settings/navigation.tsx | 58 --- src/app/app/settings/page.tsx | 61 ++- src/app/app/settings/profile-form.tsx | 214 ---------- src/app/auth/confirm/route.tsx | 32 -- src/app/auth/signin/page.tsx | 1 - src/app/auth/signin/signin-form.tsx | 13 +- src/app/auth/verify-request/page.tsx | 29 ++ src/auth.ts | 20 + ...{AddRecordCard.tsx => add-record-card.tsx} | 47 ++- src/components/avatar-upload.tsx | 269 +++++++++++++ src/components/{Badge.tsx => badge.tsx} | 0 ...ordDialog.tsx => delete-record-dialog.tsx} | 4 +- .../{EmptyRecord.tsx => empty-record.tsx} | 11 +- .../{ExportRecords.tsx => export-records.tsx} | 0 src/components/{Navbar.tsx => navbar.tsx} | 33 +- .../{RecordCard.tsx => record-card.tsx} | 68 +--- src/components/settings-form.tsx | 127 ++++++ .../{SubmitButton.tsx => submit-button.tsx} | 49 +-- src/components/{Toolbar.tsx => toolbar.tsx} | 2 +- src/db/schema.ts | 60 --- src/{ => lib}/db/index.ts | 2 +- src/{ => lib}/db/migrate.ts | 53 +-- src/lib/db/queries.ts | 42 ++ src/lib/db/schema.ts | 112 ++++++ src/lib/form-validations.ts | 70 +++- src/lib/supabase/client.ts | 8 - src/lib/supabase/server.ts | 36 -- src/middleware.ts | 26 +- src/middlewares/supabase-auth.ts | 61 --- src/providers/SupabaseAuthProvider.tsx | 46 --- src/types/user.ts | 9 - 50 files changed, 1367 insertions(+), 1327 deletions(-) delete mode 100644 drizzle/0000_talented_kinsey_walden.sql delete mode 100644 src/actions/profile.ts create mode 100644 src/actions/settings.ts create mode 100644 src/app/api/auth/[...nextauth]/route.ts delete mode 100644 src/app/api/records/export/route.ts create mode 100644 src/app/api/upload/route.ts delete mode 100644 src/app/app/onboarding/onboarding-form.tsx delete mode 100644 src/app/app/onboarding/page.tsx delete mode 100644 src/app/app/settings/navigation.tsx delete mode 100644 src/app/app/settings/profile-form.tsx delete mode 100644 src/app/auth/confirm/route.tsx create mode 100644 src/app/auth/verify-request/page.tsx create mode 100644 src/auth.ts rename src/components/{AddRecordCard.tsx => add-record-card.tsx} (80%) create mode 100644 src/components/avatar-upload.tsx rename src/components/{Badge.tsx => badge.tsx} (100%) rename src/components/{DeleteRecordDialog.tsx => delete-record-dialog.tsx} (89%) rename src/components/{EmptyRecord.tsx => empty-record.tsx} (69%) rename src/components/{ExportRecords.tsx => export-records.tsx} (100%) rename src/components/{Navbar.tsx => navbar.tsx} (68%) rename src/components/{RecordCard.tsx => record-card.tsx} (58%) create mode 100644 src/components/settings-form.tsx rename src/components/{SubmitButton.tsx => submit-button.tsx} (81%) rename src/components/{Toolbar.tsx => toolbar.tsx} (91%) delete mode 100644 src/db/schema.ts rename src/{ => lib}/db/index.ts (79%) rename src/{ => lib}/db/migrate.ts (87%) create mode 100644 src/lib/db/queries.ts create mode 100644 src/lib/db/schema.ts delete mode 100644 src/lib/supabase/client.ts delete mode 100644 src/lib/supabase/server.ts delete mode 100644 src/middlewares/supabase-auth.ts delete mode 100644 src/providers/SupabaseAuthProvider.tsx delete mode 100644 src/types/user.ts diff --git a/.env.example b/.env.example index c20bcfe..f561b45 100644 --- a/.env.example +++ b/.env.example @@ -1,9 +1,15 @@ -NEXT_PUBLIC_BASE_URL= -AUTH_SECRET= +NEXT_PUBLIC_BASE_URL=http://localhost:3000 -# Supabase -NEXT_PUBLIC_SUPABASE_URL= -NEXT_PUBLIC_SUPABASE_ANON_KEY= +# next-auth +AUTH_SECRET= +AUTH_RESEND_KEY= # Database -DB_URL= +POSTGRES_URL= +POSTGRES_PRISMA_URL= +POSTGRES_URL_NO_SSL= +POSTGRES_URL_NON_POOLING= +POSTGRES_USER= +POSTGRES_HOST= +POSTGRES_PASSWORD= +POSTGRES_DATABASE= diff --git a/.gitignore b/.gitignore index 4c9ab13..4f750ae 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,9 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + +# nextjs public +public/uploads + +# drizzle +/drizzle diff --git a/bun.lockb b/bun.lockb index e2b9b38a18dde41f986d423909c800343aa65472..90a8533c49b45f90cff9937af59d6ee525c23a6b 100755 GIT binary patch delta 85626 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 delta 89231 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 z%0AXnM>ndmmcrfyb==2BFl<|<)0ZP4#QH~B8g+Y&?PUDhR66h&dq$T$fQAfV(ev6} zy>qK-Yk31+M&$1f!loLwsTjpwo?UC0R$MUEVJR%Iw`eUW%)#IBFgvDB*D#9;?T%b* z1UP`%S8IkXtXTe=ThQCFx;N#T4K$-s3Xjo{)%HBTqSI~=e+R#lV$wB4O#mQjH_!>+ zvkIL`rkflkxrSn!Rg|d7+C3<=8-u7Oxe-dt*_IqDs?ma(W}DqoNMrwy!uz&vE#Q*1 zZKQjdtams5u`Iy+g7D)*W|$_jiy?sHatERD<*x99V^)#bo>*efl7AFUFEkfeN<}3g zLL^9OK?lk&3@RlYcrbM<5#remcqtsqpm7aSRDZ1rVIo#w*~QbQnQg@mi?!G>&5&W3 ziRBmmGK<)u>8D0WqN_hSKNt7%bpf6BU@?7~v0dW?*sizm-V`f~iPB7=L>cguU)*o0 zwDyt|-Ce`NCKNF6Kdl+WdeiVk>^tcG#CipYk8J@GSDqQfLMVocCNUr9Z=={v56T+P ze4U5Kuu4A(uZYvfli8mnj2!1HQ`oQ|s+ht$I(=p`tBzhwW*IcQl=YzFud*=bzEU=V=3srTgSF~cnokZThCHFf@GT-rr8Sf z?S;j*sb)jIsffmvV@2M$0poe*ApDw;ie%7rBirMvLjpQjiQS>Jfdi?blI^30Di$3e x+#{Yqq$DLJC8t9(=41;QwzSgeH79$CFDIiYp_(OhPEE*2%HUB$GXiug{uej%LXZFe diff --git a/drizzle.config.ts b/drizzle.config.ts index f197315..c9a495d 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -4,7 +4,7 @@ import { defineConfig } from 'drizzle-kit' export default defineConfig({ dialect: 'postgresql', dbCredentials: { - url: process.env.DB_URL!, + url: process.env.POSTGRES_URL!, }, migrations: { table: 'migrations', diff --git a/drizzle/0000_talented_kinsey_walden.sql b/drizzle/0000_talented_kinsey_walden.sql deleted file mode 100644 index 0625f40..0000000 --- a/drizzle/0000_talented_kinsey_walden.sql +++ /dev/null @@ -1,40 +0,0 @@ -CREATE SCHEMA IF NOT EXISTS "auth"; ---> statement-breakpoint -CREATE SCHEMA IF NOT EXISTS "cardia"; ---> statement-breakpoint -CREATE TABLE IF NOT EXISTS "auth"."users" ( - "id" uuid PRIMARY KEY NOT NULL -); ---> statement-breakpoint -CREATE TABLE IF NOT EXISTS "cardia"."profile" ( - "id" uuid PRIMARY KEY NOT NULL, - "username" text, - "email" varchar NOT NULL, - "avatar" text, - "dob" timestamp, - "weight" integer, - "height" integer, - "onboarding_completed" boolean DEFAULT false NOT NULL, - CONSTRAINT "profile_username_unique" UNIQUE("username") -); ---> statement-breakpoint -CREATE TABLE IF NOT EXISTS "cardia"."record" ( - "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, - "user_id" uuid NOT NULL, - "systolic" integer NOT NULL, - "diastolic" integer NOT NULL, - "pulse" integer NOT NULL, - "recorded_at" timestamp DEFAULT now() NOT NULL -); ---> statement-breakpoint -DO $$ BEGIN - ALTER TABLE "cardia"."profile" ADD CONSTRAINT "profile_id_users_id_fk" FOREIGN KEY ("id") REFERENCES "auth"."users"("id") ON DELETE cascade ON UPDATE no action; -EXCEPTION - WHEN duplicate_object THEN null; -END $$; ---> statement-breakpoint -DO $$ BEGIN - ALTER TABLE "cardia"."record" ADD CONSTRAINT "record_user_id_profile_id_fk" FOREIGN KEY ("user_id") REFERENCES "cardia"."profile"("id") ON DELETE cascade ON UPDATE no action; -EXCEPTION - WHEN duplicate_object THEN null; -END $$; diff --git a/drizzle/meta/0000_snapshot.json b/drizzle/meta/0000_snapshot.json index e3cc535..5951040 100644 --- a/drizzle/meta/0000_snapshot.json +++ b/drizzle/meta/0000_snapshot.json @@ -1,89 +1,169 @@ { - "id": "5afdf2a3-b3c1-46f4-8339-b721ae181fda", + "id": "8bea0084-ed93-46d1-8f15-148c0cd68bde", "prevId": "00000000-0000-0000-0000-000000000000", "version": "7", "dialect": "postgresql", "tables": { - "auth.users": { - "name": "users", - "schema": "auth", + "public.account": { + "name": "account", + "schema": "", "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, + "userId": { + "name": "userId", + "type": "text", + "primaryKey": false, "notNull": true - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "cardia.profile": { - "name": "profile", - "schema": "cardia", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, "notNull": true }, - "username": { - "name": "username", + "provider": { + "name": "provider", "type": "text", "primaryKey": false, - "notNull": false + "notNull": true }, - "email": { - "name": "email", - "type": "varchar", + "providerAccountId": { + "name": "providerAccountId", + "type": "text", "primaryKey": false, "notNull": true }, - "avatar": { - "name": "avatar", + "refresh_token": { + "name": "refresh_token", "type": "text", "primaryKey": false, "notNull": false }, - "dob": { - "name": "dob", - "type": "timestamp", + "access_token": { + "name": "access_token", + "type": "text", "primaryKey": false, "notNull": false }, - "weight": { - "name": "weight", + "expires_at": { + "name": "expires_at", "type": "integer", "primaryKey": false, "notNull": false }, - "height": { - "name": "height", - "type": "integer", + "token_type": { + "name": "token_type", + "type": "text", "primaryKey": false, "notNull": false }, - "onboarding_completed": { - "name": "onboarding_completed", - "type": "boolean", + "scope": { + "name": "scope", + "type": "text", "primaryKey": false, - "notNull": true, - "default": false + "notNull": false + }, + "id_token": { + "name": "id_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "session_state": { + "name": "session_state", + "type": "text", + "primaryKey": false, + "notNull": false } }, "indexes": {}, "foreignKeys": { - "profile_id_users_id_fk": { - "name": "profile_id_users_id_fk", - "tableFrom": "profile", - "tableTo": "users", - "schemaTo": "auth", + "account_userId_user_id_fk": { + "name": "account_userId_user_id_fk", + "tableFrom": "account", + "tableTo": "user", "columnsFrom": [ + "userId" + ], + "columnsTo": [ "id" ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "account_provider_providerAccountId_pk": { + "name": "account_provider_providerAccountId_pk", + "columns": [ + "provider", + "providerAccountId" + ] + } + }, + "uniqueConstraints": {} + }, + "public.authenticator": { + "name": "authenticator", + "schema": "", + "columns": { + "credentialID": { + "name": "credentialID", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "userId": { + "name": "userId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "providerAccountId": { + "name": "providerAccountId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "credentialPublicKey": { + "name": "credentialPublicKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "counter": { + "name": "counter", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "credentialDeviceType": { + "name": "credentialDeviceType", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "credentialBackedUp": { + "name": "credentialBackedUp", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "transports": { + "name": "transports", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "authenticator_userId_user_id_fk": { + "name": "authenticator_userId_user_id_fk", + "tableFrom": "authenticator", + "tableTo": "user", + "columnsFrom": [ + "userId" + ], "columnsTo": [ "id" ], @@ -91,31 +171,38 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": {}, + "compositePrimaryKeys": { + "authenticator_userId_credentialID_pk": { + "name": "authenticator_userId_credentialID_pk", + "columns": [ + "userId", + "credentialID" + ] + } + }, "uniqueConstraints": { - "profile_username_unique": { - "name": "profile_username_unique", + "authenticator_credentialID_unique": { + "name": "authenticator_credentialID_unique", "nullsNotDistinct": false, "columns": [ - "username" + "credentialID" ] } } }, - "cardia.record": { - "name": "record", - "schema": "cardia", + "public.readings": { + "name": "readings", + "schema": "", "columns": { "id": { "name": "id", - "type": "uuid", + "type": "text", "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" + "notNull": true }, - "user_id": { - "name": "user_id", - "type": "uuid", + "userId": { + "name": "userId", + "type": "text", "primaryKey": false, "notNull": true }, @@ -137,23 +224,22 @@ "primaryKey": false, "notNull": true }, - "recorded_at": { - "name": "recorded_at", + "createdAt": { + "name": "createdAt", "type": "timestamp", "primaryKey": false, - "notNull": true, + "notNull": false, "default": "now()" } }, "indexes": {}, "foreignKeys": { - "record_user_id_profile_id_fk": { - "name": "record_user_id_profile_id_fk", - "tableFrom": "record", - "tableTo": "profile", - "schemaTo": "cardia", + "readings_userId_user_id_fk": { + "name": "readings_userId_user_id_fk", + "tableFrom": "readings", + "tableTo": "user", "columnsFrom": [ - "user_id" + "userId" ], "columnsTo": [ "id" @@ -164,13 +250,143 @@ }, "compositePrimaryKeys": {}, "uniqueConstraints": {} + }, + "public.session": { + "name": "session", + "schema": "", + "columns": { + "sessionToken": { + "name": "sessionToken", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "userId": { + "name": "userId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires": { + "name": "expires", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "session_userId_user_id_fk": { + "name": "session_userId_user_id_fk", + "tableFrom": "session", + "tableTo": "user", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.user": { + "name": "user", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "emailVerified": { + "name": "emailVerified", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_name_unique": { + "name": "user_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + }, + "user_email_unique": { + "name": "user_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + } + }, + "public.verificationToken": { + "name": "verificationToken", + "schema": "", + "columns": { + "identifier": { + "name": "identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires": { + "name": "expires", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "verificationToken_identifier_token_pk": { + "name": "verificationToken_identifier_token_pk", + "columns": [ + "identifier", + "token" + ] + } + }, + "uniqueConstraints": {} } }, "enums": {}, - "schemas": { - "auth": "auth", - "cardia": "cardia" - }, + "schemas": {}, "_meta": { "columns": {}, "schemas": {}, diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index a9024f3..f14c3e0 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -1,12 +1,12 @@ { - "version": "5", - "dialect": "pg", + "version": "7", + "dialect": "postgresql", "entries": [ { "idx": 0, "version": "7", - "when": 1718830410828, - "tag": "0000_talented_kinsey_walden", + "when": 1726144245393, + "tag": "0000_faithful_rictor", "breakpoints": true } ] diff --git a/package.json b/package.json index 970b484..1dfe61c 100644 --- a/package.json +++ b/package.json @@ -1,64 +1,67 @@ -{ - "name": "cardia", - "version": "0.2.0", - "private": true, - "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start", - "lint": "next lint", - "migrate": "drizzle-kit generate && node -r esbuild-register src/db/migrate.ts" - }, - "dependencies": { - "@hookform/resolvers": "^3.3.4", - "@radix-ui/react-alert-dialog": "^1.0.5", - "@radix-ui/react-avatar": "^1.0.4", - "@radix-ui/react-dialog": "^1.0.5", - "@radix-ui/react-dropdown-menu": "^2.0.6", - "@radix-ui/react-icons": "^1.3.0", - "@radix-ui/react-label": "^2.0.2", - "@radix-ui/react-popover": "^1.0.7", - "@radix-ui/react-select": "^2.0.0", - "@radix-ui/react-slot": "^1.0.2", - "@radix-ui/react-toast": "^1.1.5", - "@supabase/ssr": "^0.3.0", - "@supabase/supabase-js": "^2.43.5", - "@tanstack/react-table": "^8.15.3", - "class-variance-authority": "^0.7.0", - "clsx": "^2.1.0", - "date-fns": "^3.6.0", - "dayjs": "^1.11.10", - "dotenv": "^16.4.5", - "drizzle-orm": "^0.31.2", - "exceljs": "^4.4.0", - "lucide-react": "^0.395.0", - "next": "14.2.4", - "next-easy-middlewares": "^1.1.2", - "pg": "^8.12.0", - "postgres": "^3.4.4", - "react": "^18", - "react-aria": "^3.32.1", - "react-day-picker": "^8.10.0", - "react-dom": "^18", - "react-hook-form": "^7.51.2", - "react-stately": "^3.30.1", - "tailwind-merge": "^2.3.0", - "tailwindcss-animate": "^1.0.7", - "zod": "^3.23.8" - }, - "devDependencies": { - "@types/node": "^20", - "@types/pg": "^8.11.6", - "@types/react": "^18", - "@types/react-dom": "^18", - "autoprefixer": "^10.4.19", - "drizzle-kit": "^0.22.7", - "eslint": "^8", - "eslint-config-next": "14.2.4", - "eslint-config-prettier": "^9.1.0", - "postcss": "^8", - "tailwindcss": "^3.4.4", - "typescript": "^5" - } -} - +{ + "name": "cardia", + "version": "0.2.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint", + "migrate": "drizzle-kit generate && node -r esbuild-register src/db/migrate.ts" + }, + "dependencies": { + "@auth/drizzle-adapter": "^1.4.2", + "@hookform/resolvers": "^3.9.0", + "@radix-ui/react-alert-dialog": "^1.1.1", + "@radix-ui/react-avatar": "^1.1.0", + "@radix-ui/react-dialog": "^1.1.1", + "@radix-ui/react-dropdown-menu": "^2.1.1", + "@radix-ui/react-icons": "^1.3.0", + "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-popover": "^1.1.1", + "@radix-ui/react-select": "^2.1.1", + "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-toast": "^1.2.1", + "@rescale/nemo": "^1.2.2", + "@tanstack/react-table": "^8.20.5", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "date-fns": "^3.6.0", + "dayjs": "^1.11.13", + "dotenv": "^16.4.5", + "drizzle-orm": "^0.31.4", + "exceljs": "^4.4.0", + "lucide-react": "^0.395.0", + "multer": "^1.4.5-lts.1", + "next": "14.2.4", + "next-auth": "^5.0.0-beta.20", + "pg": "^8.12.0", + "postgres": "^3.4.4", + "react": "^18.3.1", + "react-aria": "^3.34.3", + "react-day-picker": "^8.10.1", + "react-dom": "^18.3.1", + "react-dropzone": "^14.2.3", + "react-easy-crop": "^5.0.8", + "react-hook-form": "^7.53.0", + "react-stately": "^3.32.2", + "tailwind-merge": "^2.5.2", + "tailwindcss-animate": "^1.0.7", + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/multer": "^1.4.12", + "@types/node": "^20.16.5", + "@types/pg": "^8.11.9", + "@types/react": "^18.3.5", + "@types/react-dom": "^18.3.0", + "autoprefixer": "^10.4.20", + "drizzle-kit": "^0.22.8", + "eslint": "^8.57.0", + "eslint-config-next": "14.2.4", + "eslint-config-prettier": "^9.1.0", + "postcss": "^8.4.45", + "tailwindcss": "^3.4.11", + "typescript": "^5.6.2" + } +} diff --git a/src/actions/auth.ts b/src/actions/auth.ts index c48c9df..dfe0445 100644 --- a/src/actions/auth.ts +++ b/src/actions/auth.ts @@ -1,30 +1,23 @@ 'use server' -import { SignInWithPasswordlessCredentials } from '@supabase/supabase-js' -import { createClient } from '@/lib/supabase/server' +import { AuthError } from 'next-auth' +import { signIn } from '@/auth' -export async function signin(formData: { email: string }) { - const supabase = createClient() - - const data = { - email: formData.email, - options: { - emailRedirectTo: process.env.NEXT_PUBLIC_BASE_URL + '/auth/confirm', - }, - } satisfies SignInWithPasswordlessCredentials - - const { error } = await supabase.auth.signInWithOtp(data) - - if (error) { +export async function signinAction(formData: { email: string }) { + try { + await signIn('resend', formData) return { - success: false, - message: error.code, + status: 'success', + message: `A magic link has been sent to ${formData.email}`, + } + } catch (error) { + if (error instanceof AuthError) { + return { + status: 'error', + message: error.message, + } } - } - return { - success: true, - message: 'A magic link has been sent to your email address.', + throw error } } - diff --git a/src/actions/profile.ts b/src/actions/profile.ts deleted file mode 100644 index 8b04e16..0000000 --- a/src/actions/profile.ts +++ /dev/null @@ -1,56 +0,0 @@ -'use server' - -import { revalidatePath } from 'next/cache' -import { eq } from 'drizzle-orm' -import { z } from 'zod' -import { db } from '@/db' -import { profile } from '@/db/schema' -import { onboardingSchema, profileSchema } from '@/lib/form-validations' -import { redirect } from 'next/navigation' - -export async function updateProfile( - userId: string, - data: z.infer -) { - const transformedData = { - ...data, - dob: data.dob ? new Date(data.dob) : null, - weight: data.weight ? Number(data.weight) : null, - height: data.height ? Number(data.height) : null, - } - - const updateProfile = await db - .update(profile) - .set(transformedData) - .where(eq(profile.id, userId)) - .returning() - - if (!updateProfile) { - throw new Error('Could not update profile') - } - - revalidatePath('/app') -} - -export async function setProfile( - userId: string, - data: z.infer -) { - const transformedData = { - ...data, - dob: data.dob ? new Date(data.dob) : null, - onboardingCompleted: true, - } - - const setProfile = await db - .update(profile) - .set(transformedData) - .where(eq(profile.id, userId)) - .returning() - - if (!setProfile) { - throw new Error('Could not set profile data') - } - - redirect('/app') -} diff --git a/src/actions/records.ts b/src/actions/records.ts index 0a5f8b8..2c4fb60 100644 --- a/src/actions/records.ts +++ b/src/actions/records.ts @@ -1,50 +1,27 @@ 'use server' import { revalidatePath } from 'next/cache' -import { eq } from 'drizzle-orm' import { z } from 'zod' -import { parse } from 'date-fns' -import { db } from '@/db' -import { records } from '@/db/schema' -import { recordSchema } from '@/lib/form-validations' +import { readingFormSchema } from '@/lib/form-validations' +import { addReading, deleteReadingById } from '@/lib/db/queries' -export async function createRecord( +export async function addUserReading( userId: string, - data: z.infer + data: z.infer ) { - const transformData = { - recordedAt: parse( - `${data.date} ${data.time}`, - 'yyyy-MM-dd HH:mm', - new Date() - ), - systolic: parseInt(data.systolic, 10), - diastolic: parseInt(data.diastolic, 10), - pulse: parseInt(data.pulse, 10), - } - - const createRecord = await db - .insert(records) - .values({ - ...transformData, - userId, - }) - .returning() + const reading = await addReading(userId, data) - if (!createRecord) { + if (!reading) { throw new Error('Could not create record') } revalidatePath('/app') } -export async function deleteRecord(recordId: string) { - const deleteRecord = await db - .delete(records) - .where(eq(records.id, recordId)) - .returning() +export async function deleteUserReading(recordId: string) { + const reading = await deleteReadingById(recordId) - if (!deleteRecord) { + if (!reading) { throw new Error('Could not delete record') } diff --git a/src/actions/settings.ts b/src/actions/settings.ts new file mode 100644 index 0000000..0f85e9b --- /dev/null +++ b/src/actions/settings.ts @@ -0,0 +1,66 @@ +'use server' + +import { revalidatePath } from 'next/cache' +import { eq } from 'drizzle-orm' +import { db } from '@/lib/db' +import { users } from '@/lib/db/schema' + +export async function updateUserSettings( + userId: string, + data: { + username?: string + email?: string + avatar?: string + } +) { + try { + await db + .update(users) + .set({ + name: data.username, + email: data.email, + image: data.avatar, + }) + .where(eq(users.id, userId)) + + revalidatePath('/settings') + return { success: true } + } catch (error) { + console.error('Failed to update user settings:', error) + return { success: false, error: 'Failed to update user settings' } + } +} + +export async function updateUserAvatar(userId: string, avatarUrl: string) { + try { + await db + .update(users) + .set({ + image: avatarUrl, + }) + .where(eq(users.id, userId)) + + revalidatePath('/settings') + return { success: true, avatarUrl } + } catch (error) { + console.error('Failed to update user avatar:', error) + return { success: false, error: 'Failed to update user avatar' } + } +} + +export async function deleteUserAvatar(userId: string) { + try { + await db + .update(users) + .set({ + image: null, + }) + .where(eq(users.id, userId)) + + revalidatePath('/settings') + return { success: true } + } catch (error) { + console.error('Failed to delete user avatar:', error) + return { success: false, error: 'Failed to delete user avatar' } + } +} diff --git a/src/app/api/auth/[...nextauth]/route.ts b/src/app/api/auth/[...nextauth]/route.ts new file mode 100644 index 0000000..5e24c51 --- /dev/null +++ b/src/app/api/auth/[...nextauth]/route.ts @@ -0,0 +1,2 @@ +import { handlers } from '@/auth' +export const { GET, POST } = handlers diff --git a/src/app/api/records/export/route.ts b/src/app/api/records/export/route.ts deleted file mode 100644 index 6b4ccfe..0000000 --- a/src/app/api/records/export/route.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { eq } from 'drizzle-orm' -import { Workbook } from 'exceljs' -import { db } from '@/db' -import { records } from '@/db/schema' -import { createClient } from '@/lib/supabase/server' - -enum StatusCodes { - UNAUTHORIZED = 'UNAUTHORIZED', - BAD_REQUEST = 'BAD_REQUEST', - EXPORT_FAILED = 'EXPORT_FAILED', - EXPORT_SUCCESS = 'EXPORT_SUCCESS', -} - -export async function POST(req: Request) { - const supabase = createClient() - const { - data: { user }, - error, - } = await supabase.auth.getUser() - - if (!user || error) { - return Response.json(StatusCodes.UNAUTHORIZED, { - status: 401, - }) - } - - const dbRecords = await db.query.records.findMany({ - where: eq(records.userId, user.id), - }) - - if (dbRecords.length === 0) { - return Response.json(StatusCodes.EXPORT_FAILED, { - status: 400, - }) - } - - const workbook = new Workbook() - const worksheet = workbook.addWorksheet(`Records`) - worksheet.columns = [ - { header: 'Recorded at', key: 'recordedAt', width: 20 }, - { header: 'Systolic', key: 'systolic', width: 10 }, - { header: 'Diastolic', key: 'diastolic', width: 10 }, - { header: 'Pulse', key: 'pulse', width: 10 }, - ] - - dbRecords.forEach((record) => { - worksheet.addRow(record) - }) - - worksheet.getRow(1).eachCell((cell) => { - cell.font = { bold: true } - }) - - const buffer = await workbook.xlsx.writeBuffer() - - if (buffer.byteLength === 0) { - return Response.json(StatusCodes.EXPORT_FAILED, { - status: 500, - }) - } - - return new Response(buffer, { - status: 200, - headers: { - 'Content-Type': 'application/vnd.ms-excel', - 'Content-Disposition': `attachment; filename=records.xlsx`, - }, - }) -} diff --git a/src/app/api/upload/route.ts b/src/app/api/upload/route.ts new file mode 100644 index 0000000..872adad --- /dev/null +++ b/src/app/api/upload/route.ts @@ -0,0 +1,62 @@ +import { NextRequest, NextResponse } from 'next/server' +import multer from 'multer' +import path from 'path' +import { writeFile } from 'fs/promises' + +const upload = multer({ + limits: { + fileSize: 5 * 1024 * 1024, // 5 MB + }, +}) + +function runMiddleware(req: NextRequest, middleware: any) { + return new Promise((resolve, reject) => { + middleware( + req, + { + end: (data: any) => { + resolve(data) + }, + setHeader: () => {}, + status: (code: number) => ({ end: (data: any) => reject(data) }), + }, + (result: any) => { + resolve(result) + } + ) + }) +} + +export async function POST(request: NextRequest) { + try { + await runMiddleware(request, upload.single('avatar')) + + const formData = await request.formData() + const file = formData.get('avatar') as File | null + + if (!file) { + return NextResponse.json({ error: 'No file uploaded' }, { status: 400 }) + } + + const buffer = await file.arrayBuffer() + const filename = Date.now() + '-' + file.name.replaceAll(' ', '_') + const filePath = path.join(process.cwd(), 'public', 'uploads', filename) + + await writeFile(filePath, Buffer.from(buffer)) + + const fileUrl = `/uploads/${filename}` + return NextResponse.json({ fileUrl }) + } catch (error) { + console.error('Upload error:', error) + if (error instanceof multer.MulterError) { + return NextResponse.json({ error: error.message }, { status: 400 }) + } + return NextResponse.json({ error: 'Upload failed' }, { status: 500 }) + } +} + +export const config = { + api: { + bodyParser: false, + }, +} diff --git a/src/app/app/layout.tsx b/src/app/app/layout.tsx index 6425e79..123abe1 100644 --- a/src/app/app/layout.tsx +++ b/src/app/app/layout.tsx @@ -1,30 +1,20 @@ +import { auth } from '@/auth' +import Navbar from '@/components/navbar' import { redirect } from 'next/navigation' -import { createClient } from '@/lib/supabase/server' -import { AuthProvider } from '@/providers/SupabaseAuthProvider' -import Navbar from '@/components/Navbar' -import { db } from '@/db' -import { eq } from 'drizzle-orm' -import { profile } from '@/db/schema' const AppLayout: React.FC<{ children: React.ReactNode }> = async ({ children, }) => { - const supabase = createClient() - const { data, error } = await supabase.auth.getUser() - - if (error || !data?.user) { - redirect('/auth/signin') - } + const session = await auth() + if (!session?.user) return redirect('/auth/signin') return ( - -
- -
-
{children}
-
+
+ +
+
{children}
- +
) } diff --git a/src/app/app/onboarding/onboarding-form.tsx b/src/app/app/onboarding/onboarding-form.tsx deleted file mode 100644 index 3c83887..0000000 --- a/src/app/app/onboarding/onboarding-form.tsx +++ /dev/null @@ -1,94 +0,0 @@ -'use client' - -import { useForm } from 'react-hook-form' -import { z } from 'zod' -import { zodResolver } from '@hookform/resolvers/zod' -import { setProfile } from '@/actions/profile' -import { onboardingSchema } from '@/lib/form-validations' -import SubmitButton from '@/components/SubmitButton' -import { - FormField, - FormItem, - FormControl, - FormMessage, - Form, - FormLabel, -} from '@/components/ui/form' -import { Input } from '@/components/ui/input' - -export interface OnboardingFormProps { - userId: string -} - -export const OnboardingForm: React.FC = ({ userId }) => { - const form = useForm>({ - resolver: zodResolver(onboardingSchema), - }) - - const onSubmit = async (values: z.infer) => { - try { - await setProfile(userId, values) - } catch (error) { - console.error('Something went wrong', error) - } - } - - return ( -
- - ( - - Profile picture (URL) - - - - - - )} - /> -
- ( - - Username - - - - - - )} - /> -
- ( - - Date of birth - - - - - - )} - /> -
- -
- - - ) -} diff --git a/src/app/app/onboarding/page.tsx b/src/app/app/onboarding/page.tsx deleted file mode 100644 index 14a0cd9..0000000 --- a/src/app/app/onboarding/page.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { redirect } from 'next/navigation' -import { createClient } from '@/lib/supabase/server' -import { OnboardingForm } from './onboarding-form' - -const OnboardingPage = async () => { - const supabase = createClient() - const { data, error } = await supabase.auth.getUser() - - if (error || !data?.user) { - redirect('/auth/signin') - } - - return ( -
-
-

- Set up your profile -

-

- Complete the following steps to create your account. -

-
-
- -
-
- ) -} - -export default OnboardingPage diff --git a/src/app/app/page.tsx b/src/app/app/page.tsx index 5a3d85f..2e514e6 100644 --- a/src/app/app/page.tsx +++ b/src/app/app/page.tsx @@ -1,72 +1,31 @@ -import { desc, eq } from 'drizzle-orm' -import { redirect } from 'next/navigation' -import { db } from '@/db' -import { profile, records } from '@/db/schema' -import { createClient } from '@/lib/supabase/server' -import { RecordCard } from '@/components/RecordCard' -import { Toolbar } from '@/components/Toolbar' -import { EmptyRecord } from '@/components/EmptyRecord' +import { auth } from '@/auth' +import { getAllReadingsByUser } from '@/lib/db/queries' +import { EmptyRecord } from '@/components/empty-record' +import { RecordCard } from '@/components/record-card' +import { Toolbar } from '@/components/toolbar' const AppMainPage = async () => { - const supabase = createClient() - const { data, error } = await supabase.auth.getUser() - - if (error || !data?.user) { - redirect('/auth/signin') - } - - // Check if the user has a profile, if not redirect to onboarding page - const hasUserProfile = await db.query.profile - .findFirst({ - where: eq(profile.id, data.user.id), - }) - .then((profile) => profile?.onboardingCompleted) - - if (!hasUserProfile) { - redirect('/app/onboarding') - } - - // Fetch all records for the current user - const dbRecords = await db.query.records.findMany({ - where: eq(records.userId, data.user.id), - orderBy: desc(records.recordedAt), - }) + const session = await auth() + const readings = await getAllReadingsByUser(session?.user?.id!) return (

Blood Pressure Records

- Here you can see all your blood pressure records. + Track and manage your blood pressure readings over time. Add new + records, view your history, and monitor your cardiovascular health.

- {dbRecords.length <= 0 && } - - {dbRecords.length > 0 && ( - <> - - - {dbRecords.map( - ({ id, systolic, diastolic, pulse, recordedAt }, index) => { - return ( - - ) - } - )} - - )} - - {/* TODO: Implement logic + hover for better visualisation */} - {/* */} + {readings.length <= 0 && } + {readings.length > 0 && } + {readings.map(({ id, systolic, diastolic, pulse, createdAt }) => ( + + ))}
) } diff --git a/src/app/app/settings/navigation.tsx b/src/app/app/settings/navigation.tsx deleted file mode 100644 index 7dd2b97..0000000 --- a/src/app/app/settings/navigation.tsx +++ /dev/null @@ -1,58 +0,0 @@ -'use client' - -import Link from 'next/link' -import { usePathname } from 'next/navigation' -import { Bell, User } from 'lucide-react' -import { cn } from '@/lib/utils' - -interface IProfileNavigation { - icon: React.FC - title: string - href: string - deactivate?: boolean - hidden?: boolean -} - -const profileNavigation: IProfileNavigation[] = [ - { - icon: User, - title: 'Profile', - href: 'settings', - }, - { - icon: Bell, - title: 'Reminders', - href: 'settings/reminders', - deactivate: true, - }, -] - -export const SettingsNavigation = () => { - const pathname = usePathname() - const isActive = (href: string) => pathname.includes(href) - return ( - - ) -} diff --git a/src/app/app/settings/page.tsx b/src/app/app/settings/page.tsx index b5a81a9..74fb9c6 100644 --- a/src/app/app/settings/page.tsx +++ b/src/app/app/settings/page.tsx @@ -1,45 +1,30 @@ -import { ProfileForm } from './profile-form' -import { db } from '@/db' -import { createClient } from '@/lib/supabase/server' -import { redirect } from 'next/navigation' -import { eq } from 'drizzle-orm' -import { SettingsNavigation } from './navigation' -import { profile } from '@/db/schema' +import { auth } from '@/auth' +import SettingsForm from '@/components/settings-form' +import { + Card, + CardHeader, + CardTitle, + CardDescription, + CardContent, +} from '@/components/ui/card' const SettingsPage = async () => { - const supabase = createClient() - const { data, error } = await supabase.auth.getUser() - - if (error || !data?.user) { - redirect('/auth/signin') - } - - const profileData = await db.query.profile.findFirst({ - where: eq(profile.id, data.user?.id), - }) + const session = await auth() return ( -
- -
-
-

Profile

-
-
- -
+
+ + + Your settings + + Manage your account settings, customize your profile, and set + communication preferences. + + + + + +
) } diff --git a/src/app/app/settings/profile-form.tsx b/src/app/app/settings/profile-form.tsx deleted file mode 100644 index 2461a2f..0000000 --- a/src/app/app/settings/profile-form.tsx +++ /dev/null @@ -1,214 +0,0 @@ -'use client' -import { useEffect, useState } from 'react' -import { useForm } from 'react-hook-form' -import { Check } from 'lucide-react' -import { z } from 'zod' -import { zodResolver } from '@hookform/resolvers/zod' -import { updateProfile } from '@/actions/profile' -import { profileSchema } from '@/lib/form-validations' -import SubmitButton from '@/components/SubmitButton' -import { Button } from '@/components/ui/button' -import { - FormField, - FormItem, - FormControl, - FormMessage, - Form, - FormLabel, - FormDescription, -} from '@/components/ui/form' -import { Input } from '@/components/ui/input' - -export interface ProfileFormProps { - profileData?: { - id: string - username: string | null - email: string | null - avatar: string | null - dob: string | Date | null - weight: string | number | null | undefined - height: string | number | null | undefined - } - userId: string -} - -export const ProfileForm: React.FC = ({ - profileData, - userId, -}) => { - const [success, setSuccess] = useState(false) - - const form = useForm>({ - resolver: zodResolver(profileSchema), - }) - - useEffect(() => { - if (!profileData) return - - form.reset({ - username: profileData.username ?? '', - email: profileData.email ?? '', - avatar: profileData.avatar ?? '', - dob: profileData.dob - ? new Date(profileData.dob).toISOString().split('T')[0] - : '', - weight: - profileData.weight !== undefined ? String(profileData.weight) : '', - height: - profileData.height !== undefined ? String(profileData.height) : '', - }) - }, [profileData]) - - useEffect(() => { - // auto-hide success message after 3 seconds - let timer: NodeJS.Timeout - - if (form.formState.isSubmitSuccessful) { - timer = setTimeout(() => { - setSuccess(false) - }, 5000) - } - - return () => clearTimeout(timer) - }, [form.formState.isSubmitSuccessful]) - - const onSubmit = async (values: z.infer) => { - try { - await updateProfile(userId, values) - setSuccess(true) - } catch (error) { - console.error('Something went wrong', error) - } - } - - return ( -
- - ( - - Profile picture (URL) - - - - - - )} - /> -
- ( - - Username - - - - - - )} - /> - ( - - Email - - - - - Your email address is not editable. - - - - )} - /> -
-

Personal information

- ( - - Date of birth - - - - - - )} - /> -
- ( - - - Weight (kg) - - optional - - - - - - - - )} - /> - ( - - - Height (cm) - - optional - - - - - - - - )} - /> -
-
-
- - -
- - {success && ( - - - Profile updated successfully - - )} -
- - - ) -} diff --git a/src/app/auth/confirm/route.tsx b/src/app/auth/confirm/route.tsx deleted file mode 100644 index ae0c1e4..0000000 --- a/src/app/auth/confirm/route.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { type EmailOtpType } from '@supabase/supabase-js' -import { type NextRequest, NextResponse } from 'next/server' -import { createClient } from '@/lib/supabase/server' - -export async function GET(request: NextRequest) { - const { searchParams } = new URL(request.url) - const token_hash = searchParams.get('token_hash') - const type = searchParams.get('type') as EmailOtpType | null - const next = searchParams.get('next') ?? '/' - - const redirectTo = request.nextUrl.clone() - redirectTo.pathname = next - redirectTo.searchParams.delete('token_hash') - redirectTo.searchParams.delete('type') - - if (token_hash && type) { - const supabase = createClient() - - const { error } = await supabase.auth.verifyOtp({ - type, - token_hash, - }) - if (!error) { - redirectTo.searchParams.delete('next') - return NextResponse.redirect(redirectTo) - } - } - - // return the user to an error page with some instructions - redirectTo.pathname = '/error' - return NextResponse.redirect(redirectTo) -} diff --git a/src/app/auth/signin/page.tsx b/src/app/auth/signin/page.tsx index 493f601..aa59d12 100644 --- a/src/app/auth/signin/page.tsx +++ b/src/app/auth/signin/page.tsx @@ -2,7 +2,6 @@ import { HeartPulseIcon } from 'lucide-react' import { Card, CardContent } from '@/components/ui/card' import SignInForm from './signin-form' -// FIXME: Styling const SignInPage = () => { return (
diff --git a/src/app/auth/signin/signin-form.tsx b/src/app/auth/signin/signin-form.tsx index 2e7fc50..3125b63 100644 --- a/src/app/auth/signin/signin-form.tsx +++ b/src/app/auth/signin/signin-form.tsx @@ -5,7 +5,9 @@ import { useForm } from 'react-hook-form' import { AlertTriangleIcon } from 'lucide-react' import { zodResolver } from '@hookform/resolvers/zod' import { z } from 'zod' -import SubmitButton from '@/components/SubmitButton' +import { signinSchema } from '@/lib/form-validations' +import { signinAction } from '@/actions/auth' +import SubmitButton from '@/components/submit-button' import { Alert, AlertDescription } from '@/components/ui/alert' import { Form, @@ -16,8 +18,6 @@ import { FormMessage, } from '@/components/ui/form' import { Input } from '@/components/ui/input' -import { signinSchema } from '@/lib/form-validations' -import { signin } from '@/actions/auth' export type SigninFields = z.infer @@ -36,13 +36,13 @@ const SignInForm: React.FC = () => { setWaitingForMagicLink(false) startTransition(async () => { - const { success, message } = await signin(formData) + const { status, message } = await signinAction(formData) - if (!success) { + if (status === 'error') { setSigninError(message) } - if (success) { + if (status === 'success') { setWaitCounter(30) } }) @@ -99,7 +99,6 @@ const SignInForm: React.FC = () => { )} /> - {/* TODO: Move this logic over to the page */} {signinError && ( diff --git a/src/app/auth/verify-request/page.tsx b/src/app/auth/verify-request/page.tsx new file mode 100644 index 0000000..4b7a9c3 --- /dev/null +++ b/src/app/auth/verify-request/page.tsx @@ -0,0 +1,29 @@ +import { HeartPulseIcon } from 'lucide-react' +import { Card, CardContent } from '@/components/ui/card' +import Link from 'next/link' + +const VerifyRequestPage = () => { + return ( +
+
+
+ +

+ Cardia +

+
+ + +

A sign in link has been sent to your email address.

+

+ If the email did not arrive,{' '} + click here to send again. +

+
+
+
+
+ ) +} + +export default VerifyRequestPage diff --git a/src/auth.ts b/src/auth.ts new file mode 100644 index 0000000..1672709 --- /dev/null +++ b/src/auth.ts @@ -0,0 +1,20 @@ +import NextAuth from 'next-auth' +import Resend from 'next-auth/providers/resend' +import { DrizzleAdapter } from '@auth/drizzle-adapter' +import { db } from './lib/db' + +export const { handlers, auth, signIn, signOut } = NextAuth({ + debug: process.env.NODE_ENV !== 'production' ? true : false, + pages: { + signIn: '/auth/signin', + verifyRequest: '/auth/verify-request', + // newUser: '', + }, + adapter: DrizzleAdapter(db), + providers: [Resend({ from: 'noreply@cardia.sloth.sh' })], + callbacks: { + authorized({ auth }) { + return !!auth + }, + }, +}) diff --git a/src/components/AddRecordCard.tsx b/src/components/add-record-card.tsx similarity index 80% rename from src/components/AddRecordCard.tsx rename to src/components/add-record-card.tsx index f0ff0c5..128efec 100644 --- a/src/components/AddRecordCard.tsx +++ b/src/components/add-record-card.tsx @@ -3,11 +3,10 @@ import React from 'react' import { useForm } from 'react-hook-form' import { LoaderCircle, Save, X } from 'lucide-react' -import { z } from 'zod' import { format } from 'date-fns' import { zodResolver } from '@hookform/resolvers/zod' -import { createRecord } from '@/actions/records' -import { recordSchema } from '@/lib/form-validations' +import { addUserReading } from '@/actions/records' +import { readingFormSchema, ReadingFormData } from '@/lib/form-validations' import { Button } from '@/components/ui/button' import { Form, @@ -22,20 +21,27 @@ export const AddRecordCard: React.FC<{ userId: string onCancel: () => void }> = ({ userId, onCancel }) => { - const form = useForm>({ - resolver: zodResolver(recordSchema), + const form = useForm({ + resolver: zodResolver(readingFormSchema), defaultValues: { date: format(new Date(), 'yyyy-MM-dd'), time: format(new Date(), 'HH:mm'), - systolic: '', - diastolic: '', - pulse: '', + systolic: undefined, + diastolic: undefined, + pulse: undefined, }, }) - const onSubmit = async (data: z.infer) => { + const onSubmit = async (data: ReadingFormData) => { try { - await createRecord(userId, data) + const transformedData = { + ...data, + systolic: data.systolic, + diastolic: data.diastolic, + pulse: data.pulse, + } + + await addUserReading(userId, transformedData) onCancel() } catch (error) { console.error('Something went wrong', error) @@ -82,13 +88,16 @@ export const AddRecordCard: React.FC<{ @@ -105,12 +114,16 @@ export const AddRecordCard: React.FC<{ @@ -127,12 +140,16 @@ export const AddRecordCard: React.FC<{ diff --git a/src/components/avatar-upload.tsx b/src/components/avatar-upload.tsx new file mode 100644 index 0000000..aeeb264 --- /dev/null +++ b/src/components/avatar-upload.tsx @@ -0,0 +1,269 @@ +'use client' + +import React, { useState, useCallback } from 'react' +import { useDropzone } from 'react-dropzone' +import Cropper from 'react-easy-crop' +import { CircleUserRound, UploadCloud } from 'lucide-react' +import { deleteUserAvatar, updateUserAvatar } from '@/actions/settings' +import { Avatar, AvatarFallback, AvatarImage } from './ui/avatar' +import { Button } from './ui/button' +import { Dialog, DialogContent, DialogHeader, DialogTitle } from './ui/dialog' +import { useToast } from './ui/use-toast' + +interface AvatarUploadProps { + userId: string + currentAvatarUrl?: string + onAvatarChange: (url: string | null | undefined) => void +} + +const AvatarUpload: React.FC = ({ + userId, + currentAvatarUrl, + onAvatarChange, +}) => { + const { toast } = useToast() + + const [isUploading, setIsUploading] = useState(false) + const [isCropping, setIsCropping] = useState(false) + const [crop, setCrop] = useState<{ x: number; y: number }>({ x: 0, y: 0 }) + const [zoom, setZoom] = useState(1) + const [croppedAreaPixels, setCroppedAreaPixels] = useState(null) + const [imageToCrop, setImageToCrop] = useState(null) + + const onCropComplete = useCallback((_: any, croppedAreaPixels: any) => { + setCroppedAreaPixels(croppedAreaPixels) + }, []) + + const handleUpload = useCallback( + async (croppedImage: Blob) => { + setIsUploading(true) + + const formData = new FormData() + const fileExtension = croppedImage.type.split('/')[1] + formData.append('avatar', croppedImage, `avatar.${fileExtension}`) + + try { + const response = await fetch('/api/upload', { + method: 'POST', + body: formData, + }) + + if (!response.ok) { + const errorData = await response.json() + throw new Error(errorData.error || 'Upload failed') + } + + const data = await response.json() + const newAvatarUrl = data.fileUrl + + const result = await updateUserAvatar(userId, newAvatarUrl) + + if (result.success) { + onAvatarChange(newAvatarUrl) + toast({ + title: 'Avatar uploaded', + description: 'Your new avatar has been successfully uploaded.', + }) + } else { + throw new Error(result.error || 'Failed to update avatar in database') + } + } catch (error) { + console.error('Upload error:', error) + toast({ + title: 'Upload failed', + description: + error instanceof Error + ? error.message + : 'There was an error uploading your avatar. Please try again.', + variant: 'destructive', + }) + } finally { + setIsUploading(false) + setIsCropping(false) + } + }, + [onAvatarChange, toast, userId] + ) + + const getCroppedImg = useCallback( + async ( + imageSrc: string, + pixelCrop: { width: number; height: number; x: number; y: number } + ) => { + const image = new Image() + image.src = imageSrc + await new Promise((resolve) => { + image.onload = resolve + }) + + const canvas = document.createElement('canvas') + canvas.width = pixelCrop.width + canvas.height = pixelCrop.height + const ctx = canvas.getContext('2d') + + if (!ctx) { + throw new Error('Could not get canvas context') + } + + ctx.drawImage( + image, + pixelCrop.x, + pixelCrop.y, + pixelCrop.width, + pixelCrop.height, + 0, + 0, + pixelCrop.width, + pixelCrop.height + ) + + const imageType = imageSrc.split(';')[0].split(':')[1] + + return new Promise((resolve) => { + canvas.toBlob((blob) => { + if (blob) { + resolve(blob) + } else { + throw new Error('Could not create blob') + } + }, imageType) + }) + }, + [] + ) + + const onDrop = useCallback((acceptedFiles: File[]) => { + if (acceptedFiles.length > 0) { + const file = acceptedFiles[0] + const reader = new FileReader() + reader.onload = () => { + setImageToCrop(reader.result as string) + setIsCropping(true) + } + reader.readAsDataURL(file) + } + }, []) + + const { getRootProps, getInputProps, isDragActive } = useDropzone({ + onDrop, + accept: { + 'image/*': ['.jpeg', '.png', '.gif'], + }, + multiple: false, + }) + + const handleCropSave = useCallback(async () => { + if (imageToCrop && croppedAreaPixels) { + const croppedImage = await getCroppedImg(imageToCrop, croppedAreaPixels) + await handleUpload(croppedImage) + } + }, [imageToCrop, croppedAreaPixels, getCroppedImg, handleUpload]) + + const handleRemove = useCallback(async () => { + try { + const result = await deleteUserAvatar(userId) + if (result.success) { + onAvatarChange(null) + toast({ + title: 'Avatar removed', + description: 'Your avatar has been successfully removed.', + }) + } else { + throw new Error(result.error || 'Failed to update avatar in database') + } + } catch (error) { + console.error('Error removing avatar:', error) + toast({ + title: 'Error removing avatar', + description: + error instanceof Error + ? error.message + : 'There was an error removing your avatar. Please try again.', + variant: 'destructive', + }) + } + }, [onAvatarChange, toast, userId]) + + return ( + <> +
+
+ + + + {isUploading ? ( + + ) : isDragActive ? ( + + ) : ( + + )} + + + + {isDragActive && ( +
+ Drop here +
+ )} +
+
+ + {currentAvatarUrl && ( + + )} +
+
+ + + + + Crop Avatar + +
+ {imageToCrop && ( + + )} +
+
+ + +
+
+
+ + ) +} + +export default AvatarUpload diff --git a/src/components/Badge.tsx b/src/components/badge.tsx similarity index 100% rename from src/components/Badge.tsx rename to src/components/badge.tsx diff --git a/src/components/DeleteRecordDialog.tsx b/src/components/delete-record-dialog.tsx similarity index 89% rename from src/components/DeleteRecordDialog.tsx rename to src/components/delete-record-dialog.tsx index 77560a2..2fe1dfb 100644 --- a/src/components/DeleteRecordDialog.tsx +++ b/src/components/delete-record-dialog.tsx @@ -8,7 +8,7 @@ import { AlertDialogAction, AlertDialogFooter, } from '@/components/ui/alert-dialog' -import { deleteRecord } from '@/actions/records' +import { deleteUserReading } from '@/actions/records' export interface DeleteRecordDialogProps { recordId: string @@ -23,7 +23,7 @@ const DeleteRecordDialog: React.FC = ({ }) => { const handleDelete = async () => { try { - await deleteRecord(recordId) + await deleteUserReading(recordId) onClose() } catch (error) { console.error('Something went wrong', error) diff --git a/src/components/EmptyRecord.tsx b/src/components/empty-record.tsx similarity index 69% rename from src/components/EmptyRecord.tsx rename to src/components/empty-record.tsx index 71a7ecb..291d840 100644 --- a/src/components/EmptyRecord.tsx +++ b/src/components/empty-record.tsx @@ -3,19 +3,16 @@ import { useState } from 'react' import { SquarePlus } from 'lucide-react' import { Button } from '@/components/ui/button' -import { AddRecordCard } from './AddRecordCard' +import { AddRecordCard } from './add-record-card' -export interface EmptyRecordProps { - userId: string -} - -export const EmptyRecord: React.FC = ({ userId }) => { +export const EmptyRecord: React.FC<{ userId: string }> = ({ userId }) => { const [creating, setCreating] = useState(false) return !creating ? (

- It seems like you don't have any recordings yet. + You haven't recorded any blood pressure readings yet. Start + tracking your cardiovascular health today!

- + Edit @@ -46,44 +48,11 @@ export const RecordCard: React.FC = ({ systolic, diastolic, pulse, - recordedAt, + createdAt, }) => { const [deleteDialog, setDeleteDialog] = useState(false) - - const getSystolicStatus = (systolic: number) => { - switch (true) { - case systolic > 120: - return 'Elevated' - case systolic < 140: - return 'Stage 1' - case systolic < 160: - return 'Stage 2' - case systolic < 180: - return 'Stage 3' - default: - return false - } - } - - const getDiastolicStatus = (diastolic: number) => { - switch (true) { - case diastolic < 85: - return 'High' - case diastolic < 90: - return 'Stage 1' - case diastolic < 100: - return 'Stage 2' - case diastolic < 110: - return 'Stage 3' - default: - return false - } - } - - const formattedDate = new Date(recordedAt).toLocaleDateString() - const formattedTime = new Date(recordedAt).toLocaleTimeString() - const systolicStatus = getSystolicStatus(systolic) - const diastolicStatus = getDiastolicStatus(systolic) + const formattedDate = new Date(createdAt!).toLocaleDateString() + const formattedTime = new Date(createdAt!).toLocaleTimeString() return ( <> @@ -98,24 +67,12 @@ export const RecordCard: React.FC = ({

{systolic} - {systolicStatus && ( - - {systolicStatus} - - )}

Systolic

{diastolic} - {diastolicStatus && ( - - {diastolicStatus} - - )}

Diastolic

@@ -124,7 +81,10 @@ export const RecordCard: React.FC = ({

Pulse

- setDeleteDialog(true)} /> + console.log('to be implemented')} + onDelete={() => setDeleteDialog(true)} + />
diff --git a/src/components/settings-form.tsx b/src/components/settings-form.tsx new file mode 100644 index 0000000..4559630 --- /dev/null +++ b/src/components/settings-form.tsx @@ -0,0 +1,127 @@ +'use client' + +import { User } from 'next-auth' +import { useForm } from 'react-hook-form' +import { useEffect, useState } from 'react' +import { zodResolver } from '@hookform/resolvers/zod' +import { userSettingsSchema } from '@/lib/form-validations' +import { updateUserSettings } from '@/actions/settings' +import { Input } from './ui/input' +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from './ui/form' +import SubmitButton from './submit-button' +import AvatarUpload from './avatar-upload' +import { useToast } from './ui/use-toast' + +interface SettingsFormProps { + user?: User +} + +const SettingsForm: React.FC = ({ user }) => { + const { toast } = useToast() + + const [isLoading, setIsLoading] = useState(true) + const [avatarUrl, setAvatarUrl] = useState(null) + + useEffect(() => { + if (user) { + setAvatarUrl(user.image) + setIsLoading(false) + } + }, [user]) + + const form = useForm({ + resolver: zodResolver(userSettingsSchema), + defaultValues: { + username: '', + email: '', + avatar: '', + }, + }) + + useEffect(() => { + if (user) { + form.reset({ + username: user.name ?? '', + email: user.email ?? '', + avatar: user.image ?? '', + }) + } + }, [user, form]) + + if (isLoading) return
Loading ...
+ if (!user) return null + + const onSubmit = async (data: FormData) => { + const updatedSettings = { ...data, avatar: avatarUrl ?? undefined } + const result = await updateUserSettings(user.id!, updatedSettings) + + if (!result.success) { + return toast({ + title: 'Update failed', + description: + result.error || 'An error occurred while updating your settings.', + variant: 'destructive', + }) + } + + return toast({ + title: 'Settings updated', + description: 'Your settings have been successfully updated.', + }) + } + + return ( +
+ + setAvatarUrl(url)} + /> + ( + + Username + + + + + + )} + /> + ( + + Email + + + + + + )} + /> + + + + ) +} + +export default SettingsForm diff --git a/src/components/SubmitButton.tsx b/src/components/submit-button.tsx similarity index 81% rename from src/components/SubmitButton.tsx rename to src/components/submit-button.tsx index 8d8524d..53d00f3 100644 --- a/src/components/SubmitButton.tsx +++ b/src/components/submit-button.tsx @@ -1,24 +1,25 @@ -'use client' - -import { LoaderCircle } from 'lucide-react' -import { Button, ButtonProps } from './ui/button' - -interface SubmitButtonProps extends ButtonProps { - label?: string - pending?: boolean -} - -const SubmitButton: React.FC = ({ - label = 'Submit', - pending = false, - ...restProps -}) => { - return ( - - ) -} - -export default SubmitButton +'use client' + +import { LoaderCircle } from 'lucide-react' +import { Button, ButtonProps } from './ui/button' + +interface SubmitButtonProps extends ButtonProps { + label?: string + pending?: boolean +} + +const SubmitButton: React.FC = ({ + label = 'Submit', + pending = false, + ...restProps +}) => { + return ( + + ) +} + +export default SubmitButton + diff --git a/src/components/Toolbar.tsx b/src/components/toolbar.tsx similarity index 91% rename from src/components/Toolbar.tsx rename to src/components/toolbar.tsx index f090f4b..ed79f90 100644 --- a/src/components/Toolbar.tsx +++ b/src/components/toolbar.tsx @@ -3,7 +3,7 @@ import { useState } from 'react' import { Filter, SquarePlus } from 'lucide-react' import { Button } from '@/components/ui/button' -import { AddRecordCard } from './AddRecordCard' +import { AddRecordCard } from './add-record-card' export const Toolbar: React.FC<{ userId: string }> = ({ userId }) => { const [addRecord, setAddRecord] = useState(false) diff --git a/src/db/schema.ts b/src/db/schema.ts deleted file mode 100644 index d06d421..0000000 --- a/src/db/schema.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { relations, sql } from 'drizzle-orm' -import { - boolean, - integer, - pgSchema, - text, - timestamp, - uuid, - varchar, -} from 'drizzle-orm/pg-core' - -// Supabase Auth Schema -export const authSchema = pgSchema('auth') - -// Users table in the auth schema -export const authUsers = authSchema.table('users', { - id: uuid('id').primaryKey().notNull(), -}) - -// Cardia Schema -export const cardiaSchema = pgSchema('cardia') - -export const profile = cardiaSchema.table('profile', { - id: uuid('id') - .primaryKey() - .notNull() - .references(() => authUsers.id, { onDelete: 'cascade' }), - username: text('username').unique(), - email: varchar('email').notNull(), - avatar: text('avatar'), - dob: timestamp('dob'), - weight: integer('weight'), - height: integer('height'), - onboardingCompleted: boolean('onboarding_completed').default(false).notNull(), -}) - -export const profileRelations = relations(profile, ({ many }) => ({ - records: many(records), -})) - -export const records = cardiaSchema.table('record', { - id: uuid('id') - .default(sql`gen_random_uuid()`) - .notNull() - .primaryKey(), - userId: uuid('user_id') - .references(() => profile.id, { onDelete: 'cascade' }) - .notNull(), - systolic: integer('systolic').notNull(), - diastolic: integer('diastolic').notNull(), - pulse: integer('pulse').notNull(), - recordedAt: timestamp('recorded_at').defaultNow().notNull(), -}) - -export const recordsRelations = relations(records, ({ one }) => ({ - user: one(profile, { - fields: [records.userId], - references: [profile.id], - }), -})) diff --git a/src/db/index.ts b/src/lib/db/index.ts similarity index 79% rename from src/db/index.ts rename to src/lib/db/index.ts index 9cd3174..e766e3a 100644 --- a/src/db/index.ts +++ b/src/lib/db/index.ts @@ -2,7 +2,7 @@ import { drizzle } from 'drizzle-orm/postgres-js' import postgres from 'postgres' import * as schema from './schema' -const connectionString = process.env.DB_URL! +const connectionString = process.env.POSTGRES_URL! const client = postgres(connectionString) export const db = drizzle(client, { schema: schema, logger: true }) diff --git a/src/db/migrate.ts b/src/lib/db/migrate.ts similarity index 87% rename from src/db/migrate.ts rename to src/lib/db/migrate.ts index e237410..012c1c8 100644 --- a/src/db/migrate.ts +++ b/src/lib/db/migrate.ts @@ -1,26 +1,27 @@ -import 'dotenv/config' -import { Pool } from 'pg' -import { drizzle } from 'drizzle-orm/node-postgres' -import { migrate } from 'drizzle-orm/node-postgres/migrator' - -const pool = new Pool({ - connectionString: process.env.DB_URL!, -}) - -const db = drizzle(pool) - -async function main() { - console.log('Migration started...') - await migrate(db, { migrationsFolder: 'drizzle' }) - console.log('Migration completed!') - - pool.end() - process.exit(0) -} - -main().catch((e) => { - console.error('Migration failed: ', e) - - pool.end() - process.exit(0) -}) +import 'dotenv/config' +import { Pool } from 'pg' +import { drizzle } from 'drizzle-orm/node-postgres' +import { migrate } from 'drizzle-orm/node-postgres/migrator' + +const pool = new Pool({ + connectionString: process.env.POSTGRES_URL!, +}) + +const db = drizzle(pool) + +async function main() { + console.log('Migration started...') + await migrate(db, { migrationsFolder: 'drizzle' }) + console.log('Migration completed!') + + pool.end() + process.exit(0) +} + +main().catch((e) => { + console.error('Migration failed: ', e) + + pool.end() + process.exit(0) +}) + diff --git a/src/lib/db/queries.ts b/src/lib/db/queries.ts new file mode 100644 index 0000000..29f0aa8 --- /dev/null +++ b/src/lib/db/queries.ts @@ -0,0 +1,42 @@ +import { desc, eq } from 'drizzle-orm' +import { z } from 'zod' +import { db } from '.' +import { readings } from './schema' +import { readingFormSchema } from '../form-validations' + +export const getAllReadingsByUser = async (userId: string) => { + const records = await db.query.readings.findMany({ + where: eq(readings.userId, userId), + orderBy: desc(readings.createdAt), + }) + + return records +} + +export const addReading = async ( + userId: string, + data: z.infer +) => { + const record = await db + .insert(readings) + .values({ + ...data, + userId, + }) + .returning() + + return record +} + +export const deleteReadingById = async (id: string) => { + const record = await db.query.readings.findFirst({ + where: eq(readings.id, id), + }) + + if (!record) { + return null + } + + await db.delete(readings).where(eq(readings.id, id)) + return record +} diff --git a/src/lib/db/schema.ts b/src/lib/db/schema.ts new file mode 100644 index 0000000..c3937be --- /dev/null +++ b/src/lib/db/schema.ts @@ -0,0 +1,112 @@ +import { relations } from 'drizzle-orm' +import { + boolean, + timestamp, + pgTable, + text, + primaryKey, + integer, +} from 'drizzle-orm/pg-core' +import type { AdapterAccountType } from 'next-auth/adapters' + +export const users = pgTable('user', { + id: text('id') + .primaryKey() + .$defaultFn(() => crypto.randomUUID()), + name: text('name').unique(), + email: text('email').unique(), + emailVerified: timestamp('emailVerified', { mode: 'date' }), + image: text('image'), +}) + +export const accounts = pgTable( + 'account', + { + userId: text('userId') + .notNull() + .references(() => users.id, { onDelete: 'cascade' }), + type: text('type').$type().notNull(), + provider: text('provider').notNull(), + providerAccountId: text('providerAccountId').notNull(), + refresh_token: text('refresh_token'), + access_token: text('access_token'), + expires_at: integer('expires_at'), + token_type: text('token_type'), + scope: text('scope'), + id_token: text('id_token'), + session_state: text('session_state'), + }, + (account) => ({ + compoundKey: primaryKey({ + columns: [account.provider, account.providerAccountId], + }), + }) +) + +export const sessions = pgTable('session', { + sessionToken: text('sessionToken').primaryKey(), + userId: text('userId') + .notNull() + .references(() => users.id, { onDelete: 'cascade' }), + expires: timestamp('expires', { mode: 'date' }).notNull(), +}) + +export const verificationTokens = pgTable( + 'verificationToken', + { + identifier: text('identifier').notNull(), + token: text('token').notNull(), + expires: timestamp('expires', { mode: 'date' }).notNull(), + }, + (verificationToken) => ({ + compositePk: primaryKey({ + columns: [verificationToken.identifier, verificationToken.token], + }), + }) +) + +export const authenticators = pgTable( + 'authenticator', + { + credentialID: text('credentialID').notNull().unique(), + userId: text('userId') + .notNull() + .references(() => users.id, { onDelete: 'cascade' }), + providerAccountId: text('providerAccountId').notNull(), + credentialPublicKey: text('credentialPublicKey').notNull(), + counter: integer('counter').notNull(), + credentialDeviceType: text('credentialDeviceType').notNull(), + credentialBackedUp: boolean('credentialBackedUp').notNull(), + transports: text('transports'), + }, + (authenticator) => ({ + compositePK: primaryKey({ + columns: [authenticator.userId, authenticator.credentialID], + }), + }) +) + +export const readings = pgTable('readings', { + id: text('id') + .primaryKey() + .$defaultFn(() => crypto.randomUUID()), + userId: text('userId') + .notNull() + .references(() => users.id, { onDelete: 'cascade' }), + systolic: integer('systolic').notNull(), + diastolic: integer('diastolic').notNull(), + pulse: integer('pulse').notNull(), + createdAt: timestamp('createdAt', { mode: 'date' }).defaultNow(), +}) + +// --- Relations +export const usersRelations = relations(users, ({ many }) => ({ + bpReadings: many(readings), +})) + +export const readingsRelations = relations(readings, ({ one }) => ({ + user: one(users, { + fields: [readings.userId], + references: [users.id], + }), +})) diff --git a/src/lib/form-validations.ts b/src/lib/form-validations.ts index 6445015..71d0475 100644 --- a/src/lib/form-validations.ts +++ b/src/lib/form-validations.ts @@ -4,25 +4,57 @@ export const signinSchema = z.object({ email: z.string().email(), }) -export const recordSchema = z.object({ - date: z.string().min(1, { message: 'Date is required' }), - time: z.string().min(1, { message: 'Time is required' }), - systolic: z.string().min(1, { message: 'Systolic is required' }).max(3), - diastolic: z.string().min(1, { message: 'Diastolic is required' }).max(3), - pulse: z.string().min(1, { message: 'Pulse is required' }).max(3), -}) - -export const profileSchema = z.object({ - username: z.string().min(3).max(20), +export const userSettingsSchema = z.object({ + username: z.string(), email: z.string().email(), - avatar: z.string().url(), - dob: z.string(), - weight: z.string().optional(), - height: z.string().optional(), }) -export const onboardingSchema = z.object({ - username: z.string().min(3).max(20), - avatar: z.string().url(), - dob: z.string(), -}) +export const readingFormSchema = z + .object({ + date: z + .string() + .regex(/^\d{4}-\d{2}-\d{2}$/, 'Invalid date format. Use YYYY-MM-DD'), + time: z + .string() + .regex(/^([01]\d|2[0-3]):([0-5]\d)$/, 'Invalid time format. Use HH:MM'), + systolic: z.string().refine( + (val) => { + const num = parseInt(val, 10) + return !isNaN(num) && num >= 70 && num <= 250 + }, + { message: 'Systolic must be a number between 70 and 250' } + ), + diastolic: z.string().refine( + (val) => { + const num = parseInt(val, 10) + return !isNaN(num) && num >= 40 && num <= 150 + }, + { message: 'Diastolic must be a number between 40 and 150' } + ), + pulse: z.string().refine( + (val) => { + const num = parseInt(val, 10) + return !isNaN(num) && num >= 40 && num <= 200 + }, + { message: 'Pulse must be a number between 40 and 200' } + ), + }) + .refine( + (data) => { + const dateTime = new Date(`${data.date}T${data.time}`) + return !isNaN(dateTime.getTime()) + }, + { + message: 'Invalid date and time combination', + path: ['date', 'time'], + } + ) + .transform((data) => ({ + ...data, + systolic: parseInt(data.systolic, 10), + diastolic: parseInt(data.diastolic, 10), + pulse: parseInt(data.pulse, 10), + createdAt: new Date(`${data.date}T${data.time}`), + })) + +export type ReadingFormData = z.infer diff --git a/src/lib/supabase/client.ts b/src/lib/supabase/client.ts deleted file mode 100644 index 792b457..0000000 --- a/src/lib/supabase/client.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { createBrowserClient } from '@supabase/ssr' - -export function createClient() { - return createBrowserClient( - process.env.NEXT_PUBLIC_SUPABASE_URL!, - process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY! - ) -} diff --git a/src/lib/supabase/server.ts b/src/lib/supabase/server.ts deleted file mode 100644 index ac91c77..0000000 --- a/src/lib/supabase/server.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { createServerClient, type CookieOptions } from '@supabase/ssr' -import { cookies } from 'next/headers' - -export function createClient() { - const cookieStore = cookies() - - return createServerClient( - process.env.NEXT_PUBLIC_SUPABASE_URL!, - process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, - { - cookies: { - get(name: string) { - return cookieStore.get(name)?.value - }, - set(name: string, value: string, options: CookieOptions) { - try { - cookieStore.set({ name, value, ...options }) - } catch (error) { - // The `set` method was called from a Server Component. - // This can be ignored if you have middleware refreshing - // user sessions. - } - }, - remove(name: string, options: CookieOptions) { - try { - cookieStore.set({ name, value: '', ...options }) - } catch (error) { - // The `delete` method was called from a Server Component. - // This can be ignored if you have middleware refreshing - // user sessions. - } - }, - }, - } - ) -} diff --git a/src/middleware.ts b/src/middleware.ts index 76ad1a3..2ae7ac0 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -1,20 +1,18 @@ -import createMiddleware from 'next-easy-middlewares' -import supabaseAuth from './middlewares/supabase-auth' +import { createMiddleware } from '@rescale/nemo' -const middlewares = { - '/app/:path*': [supabaseAuth], -} +const middlewares = {} +// Create middlewares helper export const middleware = createMiddleware(middlewares) export const config = { - matcher: [ - /* - * Match all request paths except for the ones starting with: - * - api (API routes) - * - _next/static (static files) - * - favicon.ico (favicon file) - */ - '/((?!api|_next/static|favicon.ico).*)', - ], + /* + * Match all paths except for: + * 1. /api/ routes + * 2. /_next/ (Next.js internals) + * 3. /_static (inside /public) + * 4. /_vercel (Vercel internals) + * 5. Static files (e.g. /favicon.ico, /sitemap.xml, /robots.txt, etc.) + */ + matcher: ['/((?!api/|_next/|_static|_vercel|[\\w-]+\\.\\w+).*)'], } diff --git a/src/middlewares/supabase-auth.ts b/src/middlewares/supabase-auth.ts deleted file mode 100644 index 9cf47fd..0000000 --- a/src/middlewares/supabase-auth.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { createServerClient } from '@supabase/ssr' -import { NextRequest, NextResponse } from 'next/server' - -const supabaseAuth = async (request: NextRequest) => { - let response = NextResponse.next({ - request: { - headers: request.headers, - }, - }) - - const supabase = createServerClient( - process.env.NEXT_PUBLIC_SUPABASE_URL!, - process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, - { - cookies: { - get(name: string) { - return request.cookies.get(name)?.value - }, - set(name: string, value: string, options) { - request.cookies.set({ - name, - value, - ...options, - }) - response = NextResponse.next({ - request: { - headers: request.headers, - }, - }) - response.cookies.set({ - name, - value, - ...options, - }) - }, - remove(name: string, options) { - request.cookies.set({ - name, - value: '', - ...options, - }) - response = NextResponse.next({ - request: { - headers: request.headers, - }, - }) - response.cookies.set({ - name, - value: '', - ...options, - }) - }, - }, - } - ) - - await supabase.auth.getUser() - return response -} - -export default supabaseAuth diff --git a/src/providers/SupabaseAuthProvider.tsx b/src/providers/SupabaseAuthProvider.tsx deleted file mode 100644 index 69aab30..0000000 --- a/src/providers/SupabaseAuthProvider.tsx +++ /dev/null @@ -1,46 +0,0 @@ -'use client' - -import { createContext, useContext, useEffect, useMemo, useState } from 'react' -import { User } from '@supabase/supabase-js' -import { redirect } from 'next/navigation' -import { createClient } from '@/lib/supabase/client' - -interface AuthContextProps { - user: User | null -} - -interface Props { - children: React.ReactNode -} - -const AuthContext = createContext({ - user: null, -}) - -export const useAuth = () => { - return useContext(AuthContext) -} - -export const AuthProvider: React.FC = ({ children }) => { - const [user, setUser] = useState(null) - const supabase = createClient() - - useEffect(() => { - ;(async () => { - const { data, error } = await supabase.auth.getUser() - setUser(data.user) - - if (error) { - redirect('/auth/signin') - } - })() - - return () => { - // this now gets called when the component unmounts - } - }, [supabase.auth]) - - const value = useMemo(() => ({ user }), [user]) - - return {children} -} diff --git a/src/types/user.ts b/src/types/user.ts deleted file mode 100644 index 52d757f..0000000 --- a/src/types/user.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface User { - id: string - username: string - email: string - avatar?: string | null - dob?: Date | null - weight?: number | null - height?: number | null -} From 5356e022c59fa367dd8443f8e64188e4ebc8751c Mon Sep 17 00:00:00 2001 From: root Date: Sun, 6 Oct 2024 13:28:30 +0000 Subject: [PATCH 06/10] chore: Removed non necessary directory --- drizzle/meta/0000_snapshot.json | 395 -------------------------------- drizzle/meta/_journal.json | 13 -- 2 files changed, 408 deletions(-) delete mode 100644 drizzle/meta/0000_snapshot.json delete mode 100644 drizzle/meta/_journal.json diff --git a/drizzle/meta/0000_snapshot.json b/drizzle/meta/0000_snapshot.json deleted file mode 100644 index 5951040..0000000 --- a/drizzle/meta/0000_snapshot.json +++ /dev/null @@ -1,395 +0,0 @@ -{ - "id": "8bea0084-ed93-46d1-8f15-148c0cd68bde", - "prevId": "00000000-0000-0000-0000-000000000000", - "version": "7", - "dialect": "postgresql", - "tables": { - "public.account": { - "name": "account", - "schema": "", - "columns": { - "userId": { - "name": "userId", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "type": { - "name": "type", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "provider": { - "name": "provider", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "providerAccountId": { - "name": "providerAccountId", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "refresh_token": { - "name": "refresh_token", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "access_token": { - "name": "access_token", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "expires_at": { - "name": "expires_at", - "type": "integer", - "primaryKey": false, - "notNull": false - }, - "token_type": { - "name": "token_type", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "scope": { - "name": "scope", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "id_token": { - "name": "id_token", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "session_state": { - "name": "session_state", - "type": "text", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "account_userId_user_id_fk": { - "name": "account_userId_user_id_fk", - "tableFrom": "account", - "tableTo": "user", - "columnsFrom": [ - "userId" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "account_provider_providerAccountId_pk": { - "name": "account_provider_providerAccountId_pk", - "columns": [ - "provider", - "providerAccountId" - ] - } - }, - "uniqueConstraints": {} - }, - "public.authenticator": { - "name": "authenticator", - "schema": "", - "columns": { - "credentialID": { - "name": "credentialID", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "userId": { - "name": "userId", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "providerAccountId": { - "name": "providerAccountId", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "credentialPublicKey": { - "name": "credentialPublicKey", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "counter": { - "name": "counter", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "credentialDeviceType": { - "name": "credentialDeviceType", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "credentialBackedUp": { - "name": "credentialBackedUp", - "type": "boolean", - "primaryKey": false, - "notNull": true - }, - "transports": { - "name": "transports", - "type": "text", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "authenticator_userId_user_id_fk": { - "name": "authenticator_userId_user_id_fk", - "tableFrom": "authenticator", - "tableTo": "user", - "columnsFrom": [ - "userId" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "authenticator_userId_credentialID_pk": { - "name": "authenticator_userId_credentialID_pk", - "columns": [ - "userId", - "credentialID" - ] - } - }, - "uniqueConstraints": { - "authenticator_credentialID_unique": { - "name": "authenticator_credentialID_unique", - "nullsNotDistinct": false, - "columns": [ - "credentialID" - ] - } - } - }, - "public.readings": { - "name": "readings", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "userId": { - "name": "userId", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "systolic": { - "name": "systolic", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "diastolic": { - "name": "diastolic", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "pulse": { - "name": "pulse", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "readings_userId_user_id_fk": { - "name": "readings_userId_user_id_fk", - "tableFrom": "readings", - "tableTo": "user", - "columnsFrom": [ - "userId" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "public.session": { - "name": "session", - "schema": "", - "columns": { - "sessionToken": { - "name": "sessionToken", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "userId": { - "name": "userId", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "expires": { - "name": "expires", - "type": "timestamp", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "session_userId_user_id_fk": { - "name": "session_userId_user_id_fk", - "tableFrom": "session", - "tableTo": "user", - "columnsFrom": [ - "userId" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "public.user": { - "name": "user", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "emailVerified": { - "name": "emailVerified", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "image": { - "name": "image", - "type": "text", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "user_name_unique": { - "name": "user_name_unique", - "nullsNotDistinct": false, - "columns": [ - "name" - ] - }, - "user_email_unique": { - "name": "user_email_unique", - "nullsNotDistinct": false, - "columns": [ - "email" - ] - } - } - }, - "public.verificationToken": { - "name": "verificationToken", - "schema": "", - "columns": { - "identifier": { - "name": "identifier", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "expires": { - "name": "expires", - "type": "timestamp", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": { - "verificationToken_identifier_token_pk": { - "name": "verificationToken_identifier_token_pk", - "columns": [ - "identifier", - "token" - ] - } - }, - "uniqueConstraints": {} - } - }, - "enums": {}, - "schemas": {}, - "_meta": { - "columns": {}, - "schemas": {}, - "tables": {} - } -} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json deleted file mode 100644 index f14c3e0..0000000 --- a/drizzle/meta/_journal.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "version": "7", - "dialect": "postgresql", - "entries": [ - { - "idx": 0, - "version": "7", - "when": 1726144245393, - "tag": "0000_faithful_rictor", - "breakpoints": true - } - ] -} \ No newline at end of file From cae684ec8cc28cb39101e1216d3f36bc6664ed49 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 6 Oct 2024 14:58:59 +0000 Subject: [PATCH 07/10] chore: Get rid of unused remote configuration --- next.config.mjs | 37 +++++++++++++++---------------------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/next.config.mjs b/next.config.mjs index 485ebc3..c0eb2c2 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -1,22 +1,15 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - redirects: async () => { - return [ - { - source: '/', - destination: '/app', - permanent: true, - }, - ] - }, - images: { - remotePatterns: [ - { - protocol: 'https', - hostname: 'static.vecteezy.com', - }, - ], - }, -} - -export default nextConfig +/** @type {import('next').NextConfig} */ +const nextConfig = { + redirects: async () => { + return [ + { + source: '/', + destination: '/app', + permanent: true, + }, + ] + }, +} + +export default nextConfig + From 94c488b0c5f4246bbfeb71898dedafe2a060784c Mon Sep 17 00:00:00 2001 From: root Date: Sun, 6 Oct 2024 15:05:27 +0000 Subject: [PATCH 08/10] chore: Remove unused components --- src/app/page.tsx | 113 ------------------------------ src/components/badge.tsx | 37 ---------- src/components/export-records.tsx | 46 ------------ 3 files changed, 196 deletions(-) delete mode 100644 src/app/page.tsx delete mode 100644 src/components/badge.tsx delete mode 100644 src/components/export-records.tsx diff --git a/src/app/page.tsx b/src/app/page.tsx deleted file mode 100644 index f120043..0000000 --- a/src/app/page.tsx +++ /dev/null @@ -1,113 +0,0 @@ -import Image from 'next/image' - -export default function Home() { - return ( -
- - -
- Next.js Logo -
- - -
- ) -} diff --git a/src/components/badge.tsx b/src/components/badge.tsx deleted file mode 100644 index 5783ffa..0000000 --- a/src/components/badge.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import React from 'react' - -interface BadgeProps extends React.PropsWithChildren { - color?: 'primary' | 'secondary' | 'success' | 'warning' | 'danger' - classNames?: string -} - -const Badge: React.FC = ({ - color = 'primary', - classNames = '', - children, -}) => { - const getColorClass = () => { - switch (color) { - case 'secondary': - return 'bg-gray-300 text-gray-700' - case 'success': - return 'bg-green-500 text-white' - case 'warning': - return 'bg-yellow-500 text-white' - case 'danger': - return 'bg-red-500 text-white' - default: - return 'bg-blue-500 text-white' - } - } - - return ( - - {children} - - ) -} - -export default Badge diff --git a/src/components/export-records.tsx b/src/components/export-records.tsx deleted file mode 100644 index 2d569a0..0000000 --- a/src/components/export-records.tsx +++ /dev/null @@ -1,46 +0,0 @@ -'use client' - -import { Button } from './ui/button' -import { toast } from './ui/use-toast' - -const ExportRecords: React.FC<{ userId: string }> = ({ userId }) => { - const handleExport = async (event: React.FormEvent) => { - event.preventDefault() - const response = await fetch( - `${process.env.NEXT_PUBLIC_BASE_URL}/api/records/export`, - { - method: 'POST', - body: new FormData(event.currentTarget), - } - ) - - if (response.status !== 200) { - return toast({ - title: 'Export failed', - description: 'An error occurred while exporting your records.', - }) - } - - toast({ - title: 'Export successful', - description: 'Your download should start shortly.', - }) - - response.blob().then((blob) => { - const url = window.URL.createObjectURL(blob) - const a = document.createElement('a') - a.href = url - a.download = `records-${Date.now()}.xlsx` - a.click() - }) - } - - return ( -
- - -
- ) -} - -export default ExportRecords From 1fa792c5197b714d06c9db0fc178d0b7fb6885c7 Mon Sep 17 00:00:00 2001 From: visualcookie Date: Wed, 23 Oct 2024 15:14:31 +0000 Subject: [PATCH 09/10] feat: Use to support requests in Middleware functions --- bun.lockb | Bin 311169 -> 313621 bytes package.json | 1 + src/app/app/new-user/page.tsx | 33 +++++++++++++++++++++++++++++++ src/auth.ts | 2 +- src/components/empty-record.tsx | 4 ++-- src/components/settings-form.tsx | 29 ++++++++++++++------------- src/lib/db/index.ts | 9 +++------ src/lib/db/schema.ts | 2 +- src/lib/form-validations.ts | 2 +- src/middleware.ts | 3 ++- 10 files changed, 59 insertions(+), 26 deletions(-) create mode 100644 src/app/app/new-user/page.tsx diff --git a/bun.lockb b/bun.lockb index 90a8533c49b45f90cff9937af59d6ee525c23a6b..8a64fea970224e0c8f16a54d53c59e72219aa9f5 100755 GIT binary patch delta 57486 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 delta 56097 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 z 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 diff --git a/package.json b/package.json index 1dfe61c..726d9f5 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "@radix-ui/react-toast": "^1.2.1", "@rescale/nemo": "^1.2.2", "@tanstack/react-table": "^8.20.5", + "@vercel/postgres": "^0.10.0", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "date-fns": "^3.6.0", diff --git a/src/app/app/new-user/page.tsx b/src/app/app/new-user/page.tsx new file mode 100644 index 0000000..92c613e --- /dev/null +++ b/src/app/app/new-user/page.tsx @@ -0,0 +1,33 @@ +import { auth } from '@/auth' +import SettingsForm from '@/components/settings-form' +import { + Card, + CardHeader, + CardTitle, + CardDescription, + CardContent, +} from '@/components/ui/card' + +const NewUserPage = async () => { + const session = await auth() + + return ( +
+ + + 👋 Welcome to Cardia + + To probably set you up, we need further informations about you. + Don't worry, we won't sell your data. + + + + {/* NOTE: can i reuse the settings form here? */} + + + +
+ ) +} + +export default NewUserPage diff --git a/src/auth.ts b/src/auth.ts index 1672709..6b4891c 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -8,7 +8,7 @@ export const { handlers, auth, signIn, signOut } = NextAuth({ pages: { signIn: '/auth/signin', verifyRequest: '/auth/verify-request', - // newUser: '', + newUser: '/app/new-user', }, adapter: DrizzleAdapter(db), providers: [Resend({ from: 'noreply@cardia.sloth.sh' })], diff --git a/src/components/empty-record.tsx b/src/components/empty-record.tsx index 291d840..006a890 100644 --- a/src/components/empty-record.tsx +++ b/src/components/empty-record.tsx @@ -9,12 +9,12 @@ export const EmptyRecord: React.FC<{ userId: string }> = ({ userId }) => { const [creating, setCreating] = useState(false) return !creating ? ( -
+

You haven't recorded any blood pressure readings yet. Start tracking your cardiovascular health today!

- diff --git a/src/components/settings-form.tsx b/src/components/settings-form.tsx index 4559630..594e795 100644 --- a/src/components/settings-form.tsx +++ b/src/components/settings-form.tsx @@ -21,34 +21,35 @@ import { useToast } from './ui/use-toast' interface SettingsFormProps { user?: User + isNewUser?: boolean } -const SettingsForm: React.FC = ({ user }) => { +const SettingsForm: React.FC = ({ user, isNewUser }) => { const { toast } = useToast() const [isLoading, setIsLoading] = useState(true) const [avatarUrl, setAvatarUrl] = useState(null) - useEffect(() => { - if (user) { - setAvatarUrl(user.image) - setIsLoading(false) - } - }, [user]) - const form = useForm({ resolver: zodResolver(userSettingsSchema), defaultValues: { - username: '', + name: '', email: '', avatar: '', }, }) + useEffect(() => { + if (user) { + setAvatarUrl(user.image) + setIsLoading(false) + } + }, [user]) + useEffect(() => { if (user) { form.reset({ - username: user.name ?? '', + name: user.name ?? '', email: user.email ?? '', avatar: user.image ?? '', }) @@ -87,10 +88,10 @@ const SettingsForm: React.FC = ({ user }) => { /> ( - Username + Your name @@ -103,7 +104,7 @@ const SettingsForm: React.FC = ({ user }) => { name="email" render={({ field }) => ( - Email + Your email @@ -112,7 +113,7 @@ const SettingsForm: React.FC = ({ user }) => { )} /> crypto.randomUUID()), - name: text('name').unique(), + name: text('name'), email: text('email').unique(), emailVerified: timestamp('emailVerified', { mode: 'date' }), image: text('image'), diff --git a/src/lib/form-validations.ts b/src/lib/form-validations.ts index 71d0475..233c350 100644 --- a/src/lib/form-validations.ts +++ b/src/lib/form-validations.ts @@ -5,7 +5,7 @@ export const signinSchema = z.object({ }) export const userSettingsSchema = z.object({ - username: z.string(), + name: z.string(), email: z.string().email(), }) diff --git a/src/middleware.ts b/src/middleware.ts index 2ae7ac0..588ddac 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -1,4 +1,5 @@ -import { createMiddleware } from '@rescale/nemo' +import { createMiddleware, MiddlewareFunctionProps } from '@rescale/nemo' +import { auth } from './auth' const middlewares = {} From 12668e590481ed0795ec824a289c1b3a23bc5590 Mon Sep 17 00:00:00 2001 From: visualcookie Date: Fri, 6 Dec 2024 22:39:03 +0000 Subject: [PATCH 10/10] feat: Add editing records --- bun.lockb | Bin 313621 -> 316556 bytes package.json | 1 + src/actions/records.ts | 21 +++- src/components/add-record-card.tsx | 188 +++++++++++++++-------------- src/components/record-card.tsx | 79 +++++++----- src/components/ui/tooltip.tsx | 30 +++++ src/lib/db/queries.ts | 12 ++ 7 files changed, 209 insertions(+), 122 deletions(-) create mode 100644 src/components/ui/tooltip.tsx diff --git a/bun.lockb b/bun.lockb index 8a64fea970224e0c8f16a54d53c59e72219aa9f5..b1af14f1d551e1d631377f7592f56a3a08e0f118 100755 GIT binary patch delta 58233 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 diff --git a/package.json b/package.json index 726d9f5..15f5241 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "@radix-ui/react-select": "^2.1.1", "@radix-ui/react-slot": "^1.1.0", "@radix-ui/react-toast": "^1.2.1", + "@radix-ui/react-tooltip": "^1.1.4", "@rescale/nemo": "^1.2.2", "@tanstack/react-table": "^8.20.5", "@vercel/postgres": "^0.10.0", diff --git a/src/actions/records.ts b/src/actions/records.ts index 2c4fb60..8b703d4 100644 --- a/src/actions/records.ts +++ b/src/actions/records.ts @@ -3,7 +3,11 @@ import { revalidatePath } from 'next/cache' import { z } from 'zod' import { readingFormSchema } from '@/lib/form-validations' -import { addReading, deleteReadingById } from '@/lib/db/queries' +import { + addReading, + deleteReadingById, + updateReadingById, +} from '@/lib/db/queries' export async function addUserReading( userId: string, @@ -18,11 +22,24 @@ export async function addUserReading( revalidatePath('/app') } +export async function updateUserReading( + id: string, + data: z.infer +) { + const reading = await updateReadingById(id, data) + + if (!reading) { + throw new Error(`Could not update record ${id}`) + } + + revalidatePath('/app') +} + export async function deleteUserReading(recordId: string) { const reading = await deleteReadingById(recordId) if (!reading) { - throw new Error('Could not delete record') + throw new Error(`Could not delete record ${recordId}`) } revalidatePath('/app') diff --git a/src/components/add-record-card.tsx b/src/components/add-record-card.tsx index 128efec..76c5770 100644 --- a/src/components/add-record-card.tsx +++ b/src/components/add-record-card.tsx @@ -2,11 +2,12 @@ import React from 'react' import { useForm } from 'react-hook-form' -import { LoaderCircle, Save, X } from 'lucide-react' +import { AlertCircle, LoaderCircle, Save, X } from 'lucide-react' import { format } from 'date-fns' import { zodResolver } from '@hookform/resolvers/zod' -import { addUserReading } from '@/actions/records' +import { addUserReading, updateUserReading } from '@/actions/records' import { readingFormSchema, ReadingFormData } from '@/lib/form-validations' +import { cn } from '@/lib/utils' import { Button } from '@/components/ui/button' import { Form, @@ -16,19 +17,44 @@ import { FormMessage, } from '@/components/ui/form' import { Input } from '@/components/ui/input' +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from '@/components/ui/tooltip' -export const AddRecordCard: React.FC<{ - userId: string - onCancel: () => void -}> = ({ userId, onCancel }) => { +type AddRecordCardProps = + | { + userId: string + valueId?: never + values?: ReadingFormData + onCancel: () => void + } + | { + userId?: never + valueId: string + values?: ReadingFormData + onCancel: () => void + } + +export const AddRecordCard: React.FC = ({ + userId, + valueId, + values, + onCancel, +}) => { const form = useForm({ resolver: zodResolver(readingFormSchema), defaultValues: { - date: format(new Date(), 'yyyy-MM-dd'), - time: format(new Date(), 'HH:mm'), - systolic: undefined, - diastolic: undefined, - pulse: undefined, + date: format(new Date(values?.createdAt || new Date()), 'yyyy-MM-dd'), + time: format(new Date(values?.createdAt || new Date()), 'HH:mm'), + // @ts-expect-error - TODO: fix this + systolic: values?.systolic?.toString() || undefined, + // @ts-expect-error - TODO: fix this + diastolic: values?.diastolic?.toString() || undefined, + // @ts-expect-error - TODO: fix this + pulse: values?.pulse?.toString() || undefined, }, }) @@ -41,7 +67,12 @@ export const AddRecordCard: React.FC<{ pulse: data.pulse, } - await addUserReading(userId, transformedData) + if (!!valueId) { + await updateUserReading(valueId, transformedData) + } else { + await addUserReading(userId!, transformedData) + } + onCancel() } catch (error) { console.error('Something went wrong', error) @@ -80,84 +111,61 @@ export const AddRecordCard: React.FC<{ )} />
-
- ( - - - - - - - )} - /> -

Systolic

-
-
- ( - - - - - - - )} - /> -

Diastolic

-
-
- ( - - - - - - - )} - /> -

Pulse

-
+ {['systolic', 'diastolic', 'pulse'].map((name) => ( +
+ ( + + +
+ + {form.formState.errors[name as keyof ReadingFormData] && ( + + + + + + +

+ { + form.formState.errors[ + name as keyof ReadingFormData + ]?.message + } +

+
+
+
+ )} +
+
+
+ )} + /> +

+ {name.charAt(0).toUpperCase() + name.slice(1)} +

+
+ ))}