From d1ed8f803b2cc28177a10efe2eca379db262ba56 Mon Sep 17 00:00:00 2001
From: Firman Ramdhani <33869609+firmanramdhani@users.noreply.github.com>
Date: Fri, 11 Sep 2026 11:39:43 +0700
Subject: [PATCH] feat: implement Sonner notifications, add Setting model, and
reorganize user management into settings navigation.
---
package.json | 3 +
prisma/schema.prisma | 43 +++---
src/app/(app)/my-orders/[id]/page.tsx | 1 +
src/app/(app)/settings/integrations/page.tsx | 132 +++++++++++++++++++
src/app/(app)/settings/layout.tsx | 49 +++++++
src/app/(app)/{ => settings}/users/page.tsx | 16 +--
src/app/actions.ts | 61 +++++++++
src/app/layout.tsx | 2 +
src/components/Header.tsx | 11 +-
src/components/OrderCard.tsx | 1 +
src/components/ShareButton.tsx | 115 ++++++++++++----
src/components/Sidebar.tsx | 5 +-
src/components/ui/sonner.tsx | 53 ++++++++
src/components/ui/textarea.tsx | 17 +++
yarn.lock | 15 +++
15 files changed, 460 insertions(+), 64 deletions(-)
create mode 100644 src/app/(app)/settings/integrations/page.tsx
create mode 100644 src/app/(app)/settings/layout.tsx
rename src/app/(app)/{ => settings}/users/page.tsx (96%)
create mode 100644 src/components/ui/sonner.tsx
create mode 100644 src/components/ui/textarea.tsx
diff --git a/package.json b/package.json
index b1bec53..9e8beda 100644
--- a/package.json
+++ b/package.json
@@ -17,10 +17,12 @@
"bcryptjs": "^3.0.3",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
+ "cn": "^0.2.6",
"date-fns": "^4.4.0",
"jose": "^6.2.10",
"lucide-react": "^1.34.0",
"next": "16.3.3",
+ "next-themes": "^0.4.6",
"prisma": "^5.22.0",
"react": "19.2.8",
"react-day-picker": "^10.0.1",
@@ -28,6 +30,7 @@
"react-hook-form": "^7.86.0",
"recharts": "^3.10.1",
"shadcn": "^4.19.0",
+ "sonner": "^2.0.8",
"tailwind-merge": "^3.6.0",
"tw-animate-css": "^1.4.0",
"uuid": "^14.0.2",
diff --git a/prisma/schema.prisma b/prisma/schema.prisma
index fc469bb..2148637 100644
--- a/prisma/schema.prisma
+++ b/prisma/schema.prisma
@@ -1,6 +1,3 @@
-// This is your Prisma schema file,
-// learn more about it in the docs: https://pris.ly/d/prisma-schema
-
generator client {
provider = "prisma-client-js"
}
@@ -25,28 +22,28 @@ model User {
}
model Order {
- id String @id @default(uuid())
- title String
- description String?
- date DateTime
- allow_custom Boolean @default(false)
- status String @default("DRAFT")
- creator_id String
- creator User @relation("CreatedOrders", fields: [creator_id], references: [id])
+ id String @id @default(uuid())
+ title String
+ date DateTime
+ allow_custom Boolean @default(false)
+ status String @default("DRAFT")
+ creator_id String
+ created_at DateTime @default(now())
+ updated_at DateTime @updatedAt
+ description String?
available_items AvailableItem[]
- submissions Submission[]
- created_at DateTime @default(now())
- updated_at DateTime @updatedAt
+ creator User @relation("CreatedOrders", fields: [creator_id], references: [id])
+ submissions Submission[]
}
model AvailableItem {
id String @id @default(uuid())
order_id String
name String
+ created_at DateTime @default(now())
+ updated_at DateTime @updatedAt
is_sold_out Boolean @default(false)
order Order @relation(fields: [order_id], references: [id], onDelete: Cascade)
- created_at DateTime @default(now())
- updated_at DateTime @updatedAt
}
model Submission {
@@ -54,13 +51,13 @@ model Submission {
order_id String
user_id String
bill Int?
- paid_amount Int?
payment_status String @default("BELUM_BAYAR")
+ created_at DateTime @default(now())
+ updated_at DateTime @updatedAt
+ paid_amount Int?
order Order @relation(fields: [order_id], references: [id], onDelete: Cascade)
user User @relation(fields: [user_id], references: [id], onDelete: Cascade)
items SubmissionItem[]
- created_at DateTime @default(now())
- updated_at DateTime @updatedAt
}
model SubmissionItem {
@@ -69,7 +66,13 @@ model SubmissionItem {
name String
qty Int @default(1)
is_custom Boolean @default(false)
- submission Submission @relation(fields: [submission_id], references: [id], onDelete: Cascade)
created_at DateTime @default(now())
updated_at DateTime @updatedAt
+ submission Submission @relation(fields: [submission_id], references: [id], onDelete: Cascade)
+}
+
+model Setting {
+ key String @id
+ value String
+ updated_at DateTime @updatedAt
}
diff --git a/src/app/(app)/my-orders/[id]/page.tsx b/src/app/(app)/my-orders/[id]/page.tsx
index f31c1b9..767dfec 100644
--- a/src/app/(app)/my-orders/[id]/page.tsx
+++ b/src/app/(app)/my-orders/[id]/page.tsx
@@ -283,6 +283,7 @@ export default function OrderDetailPage() {
{order.status === 'OPEN' && (
Konfigurasi endpoint API dan template pesan otomatis.
+Gunakan URL Incoming Webhook dari Mattermost untuk mengirim broadcast PO baru secara otomatis.
+ +Atur template teks default saat user menekan tombol share ke WhatsApp.
+ +Kelola data seluruh pengguna TitipIn.
+Kelola data seluruh pengguna TitipIn.