From 4fe8213139a9b6d77c432a1b4558e7f60f64bccc Mon Sep 17 00:00:00 2001 From: Anton Bezborody Date: Wed, 18 Dec 2024 01:03:47 +0300 Subject: [PATCH] minor changes --- bun.lockb | Bin 60204 -> 60629 bytes drizzle/0002_smooth_lorna_dane.sql | 1 + drizzle/meta/0002_snapshot.json | 85 ++++++++++++++++++ drizzle/meta/_journal.json | 7 ++ frontend/bun.lockb | Bin 157928 -> 163823 bytes frontend/package.json | 5 +- frontend/src/components/ui/calendar.tsx | 74 +++++++++++++++ frontend/src/components/ui/switch.tsx | 27 ++++++ frontend/src/lib/api.ts | 29 +++--- frontend/src/routes/__root.tsx | 46 ++++++---- frontend/src/routes/_authenticated.tsx | 2 +- .../routes/_authenticated/create-expense.tsx | 43 ++++++++- .../src/routes/_authenticated/expenses.tsx | 31 ++++--- frontend/src/routes/_authenticated/index.tsx | 24 ++--- .../src/routes/_authenticated/profile.tsx | 2 +- frontend/src/routes/about.tsx | 2 +- package.json | 1 + server/db/index.ts | 1 - server/db/schema/expenses.ts | 18 +++- server/kinde.ts | 2 +- server/routes/expenses.ts | 53 ++++------- server/sharedTypes.ts | 15 ++++ 22 files changed, 367 insertions(+), 101 deletions(-) create mode 100644 drizzle/0002_smooth_lorna_dane.sql create mode 100644 drizzle/meta/0002_snapshot.json create mode 100644 frontend/src/components/ui/calendar.tsx create mode 100644 frontend/src/components/ui/switch.tsx create mode 100644 server/sharedTypes.ts diff --git a/bun.lockb b/bun.lockb index 6c8a8c8c2a7753bff316314959cbdc2455140afd..00b135e8d6af10a250b19c2ddc2f284b3fa33716 100755 GIT binary patch delta 9579 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 H6@&j9fM`5v diff --git a/drizzle/0002_smooth_lorna_dane.sql b/drizzle/0002_smooth_lorna_dane.sql new file mode 100644 index 0000000..9cb5cc2 --- /dev/null +++ b/drizzle/0002_smooth_lorna_dane.sql @@ -0,0 +1 @@ +ALTER TABLE "expenses" ADD COLUMN "date" date NOT NULL; \ No newline at end of file diff --git a/drizzle/meta/0002_snapshot.json b/drizzle/meta/0002_snapshot.json new file mode 100644 index 0000000..c662ea8 --- /dev/null +++ b/drizzle/meta/0002_snapshot.json @@ -0,0 +1,85 @@ +{ + "id": "7cee59cc-c4be-42c9-9c6f-4e6697f49794", + "prevId": "fcfb6571-fb90-404c-9e3b-259fc5781c22", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.expenses": { + "name": "expenses", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "amount": { + "name": "amount", + "type": "numeric(12, 2)", + "primaryKey": false, + "notNull": true + }, + "date": { + "name": "date", + "type": "date", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": { + "name_idx": { + "name": "name_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index f8e7a32..7c9ee58 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -15,6 +15,13 @@ "when": 1734443913822, "tag": "0001_bitter_boomerang", "breakpoints": true + }, + { + "idx": 2, + "version": "7", + "when": 1734469972730, + "tag": "0002_smooth_lorna_dane", + "breakpoints": true } ] } \ No newline at end of file diff --git a/frontend/bun.lockb b/frontend/bun.lockb index 257bcdf8d243cc1b6b2dae9737806f158d5aeee8..c2b0e9e85c365779f25fcbdfbd09d938ad7ab1be 100755 GIT binary patch delta 30549 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 delta 27416 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 + +function Calendar({ + className, + classNames, + showOutsideDays = true, + ...props +}: CalendarProps) { + return ( + .day-range-end)]:rounded-r-md [&:has(>.day-range-start)]:rounded-l-md first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md" + : "[&:has([aria-selected])]:rounded-md" + ), + day: cn( + buttonVariants({ variant: "ghost" }), + "h-8 w-8 p-0 font-normal aria-selected:opacity-100" + ), + day_range_start: "day-range-start", + day_range_end: "day-range-end", + day_selected: + "bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground", + day_today: "bg-accent text-accent-foreground", + day_outside: + "day-outside text-muted-foreground aria-selected:bg-accent/50 aria-selected:text-muted-foreground", + day_disabled: "text-muted-foreground opacity-50", + day_range_middle: + "aria-selected:bg-accent aria-selected:text-accent-foreground", + day_hidden: "invisible", + ...classNames, + }} + components={{ + IconLeft: ({ className, ...props }) => ( + + ), + IconRight: ({ className, ...props }) => ( + + ), + }} + {...props} + /> + ) +} +Calendar.displayName = "Calendar" + +export { Calendar } diff --git a/frontend/src/components/ui/switch.tsx b/frontend/src/components/ui/switch.tsx new file mode 100644 index 0000000..455c23b --- /dev/null +++ b/frontend/src/components/ui/switch.tsx @@ -0,0 +1,27 @@ +import * as React from "react" +import * as SwitchPrimitives from "@radix-ui/react-switch" + +import { cn } from "@/lib/utils" + +const Switch = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)) +Switch.displayName = SwitchPrimitives.Root.displayName + +export { Switch } diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api.ts index 7a849fd..9b76362 100644 --- a/frontend/src/lib/api.ts +++ b/frontend/src/lib/api.ts @@ -7,16 +7,25 @@ const client = hc("/") export const api = client.api async function getCurrentUser() { - const result = await api.me.$get() - if (!result.ok) { - throw new Error('error') - } - const data = await result.json() - return data + const result = await api.me.$get() + if (!result.ok) { + throw new Error("error") } + const data = await result.json() + return data +} export const userQueryOptions = queryOptions({ - queryKey: ['getCurrentUser'], - queryFn: getCurrentUser, - staleTime: Infinity - }) \ No newline at end of file + queryKey: ["getCurrentUser"], + queryFn: getCurrentUser, + staleTime: Infinity, +}) + +export async function getTotalSpent() { + const result = await api.expenses["getTotalSpent"].$get() + if (!result.ok) { + throw new Error("error") + } + const data = await result.json() + return data +} diff --git a/frontend/src/routes/__root.tsx b/frontend/src/routes/__root.tsx index 1157be1..00a1627 100644 --- a/frontend/src/routes/__root.tsx +++ b/frontend/src/routes/__root.tsx @@ -4,6 +4,8 @@ import { Outlet, createRootRouteWithContext, } from "@tanstack/react-router" +import { Switch } from "@/components/ui/switch" +import { useState } from "react" interface MyRouterContext { queryClient: QueryClient @@ -14,23 +16,36 @@ export const Route = createRootRouteWithContext()({ }) function NavBar() { + const [isLight, setIsLight] = useState(false) + const toggleTheme = () => { + document.documentElement.classList.toggle("dark") + setIsLight(!isLight) + } + return ( -
- - Home - - - About - - - Expenses - - - Create - - - Profile +
+ +

Expenses App

+
+ {/* + About + */} + + Expenses + + + Create + + + Profile + + +
) } @@ -39,7 +54,6 @@ function Root() { return ( <> -
) diff --git a/frontend/src/routes/_authenticated.tsx b/frontend/src/routes/_authenticated.tsx index fe9730b..1a0a341 100644 --- a/frontend/src/routes/_authenticated.tsx +++ b/frontend/src/routes/_authenticated.tsx @@ -4,7 +4,7 @@ import { createFileRoute, Outlet } from "@tanstack/react-router" const Login = () => { return ( -
+

You have to login