Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions Backend1/logs/combined.log
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,3 @@
{"level":"info","message":"🚀 Server running on port 5001 in development mode","timestamp":"2026-03-27 00:47:20"}
>>>>>>> Stashed changes
{"clientVersion":"5.22.0","errorCode":"P1000","level":"error","message":"Failed to start server: Authentication failed against database server at `localhost`, the provided database credentials for `virendrakala` are not valid.\n\nPlease make sure to provide valid database credentials for the database server at `localhost`.","name":"PrismaClientInitializationError","stack":"PrismaClientInitializationError: Authentication failed against database server at `localhost`, the provided database credentials for `virendrakala` are not valid.\n\nPlease make sure to provide valid database credentials for the database server at `localhost`.\n at t (C:\\Users\\code\\Demo\\Backend1\\node_modules\\@prisma\\client\\runtime\\library.js:112:2488)\n at main (C:\\Users\\code\\Demo\\Backend1\\src\\server.ts:29:5)","timestamp":"2026-03-27 01:05:12"}
{"level":"info","message":"✅ Database connected successfully","timestamp":"2026-03-27 09:57:20"}
{"level":"info","message":"🔑 Super Admin account guaranteed (admin@iitk.ac.in / admin@123)","timestamp":"2026-03-27 09:57:21"}
{"level":"info","message":"🚀 Server running on port 5001 in development mode","timestamp":"2026-03-27 09:57:21"}
1 change: 0 additions & 1 deletion Backend1/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 1 addition & 11 deletions frontend/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 1 addition & 2 deletions frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,7 @@
"sonner": "2.0.3",
"tailwind-merge": "3.2.0",
"tw-animate-css": "1.3.8",
"vaul": "1.1.2",
"zod": "^4.3.6"
"vaul": "1.1.2"
},
"devDependencies": {
"@tailwindcss/vite": "4.1.12",
Expand Down
22 changes: 2 additions & 20 deletions frontend/src/app/components/AuthPage.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import React, { useState } from 'react';
import { useNavigate } from 'react-router-dom';
import { z } from 'zod';
import { useApp } from '@/app/contexts/AppContext';
import { Input } from '@/app/components/ui/input';
import { Label } from '@/app/components/ui/label';
Expand All @@ -22,8 +21,6 @@ import { ForgotPassword } from './ForgotPassword';

type AppRole = 'CUSTOMER' | 'VENDOR' | 'RIDER' | 'ADMIN';

const phoneSchema = z.string().length(10, "Phone number must be 10 digits").regex(/^\d+$/, "Phone number must be numeric");

export function AuthPage() {
const navigate = useNavigate();
const { login, register } = useApp();
Expand All @@ -34,7 +31,6 @@ export function AuthPage() {
const [showPassword, setShowPassword] = useState(false);
const [showConfirm, setShowConfirm] = useState(false);
const [loading, setLoading] = useState(false);
const [phoneError, setPhoneError] = useState<string | null>(null);

const [loginData, setLoginData] = useState({ email: '', password: '' });

Expand Down Expand Up @@ -93,13 +89,6 @@ export function AuthPage() {
const handleRegister = async (e: React.FormEvent) => {
e.preventDefault();

const validation = phoneSchema.safeParse(registerData.phone);
if (!validation.success) {
setPhoneError(validation.error.issues[0].message);
return;
}
setPhoneError(null);

if (registerData.password !== registerData.confirmPassword) {
toast.error('Passwords do not match');
return;
Expand Down Expand Up @@ -383,16 +372,9 @@ export function AuthPage() {
type="tel"
placeholder="10-digit number"
value={registerData.phone}
onChange={(e) => {
const val = e.target.value;
if (val && !/^\d+$/.test(val)) return;
if (val.length > 10) return;
setRegisterData({ ...registerData, phone: val });
setPhoneError(null);
}}
className={`pl-10 h-11 bg-white dark:bg-[#0F1E3A] border-blue-100 dark:border-blue-900/40 focus:border-[#1E3A8A] rounded-xl ${phoneError ? 'border-red-500' : ''}`}
onChange={(e) => setRegisterData({ ...registerData, phone: e.target.value })}
className="pl-10 h-11 bg-white dark:bg-[#0F1E3A] border-blue-100 dark:border-blue-900/40 focus:border-[#1E3A8A] rounded-xl"
/>
{phoneError && <p className="text-[10px] text-red-500 mt-1 font-semibold">{phoneError}</p>}
</div>
</div>

Expand Down
25 changes: 2 additions & 23 deletions frontend/src/app/components/CourierInterface.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import React, { useState, useEffect, useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { z } from 'zod';
import { useApp } from '@/app/contexts/AppContext';
import api from '@/api/axios';
import { Header } from '@/app/components/Header';
Expand All @@ -26,8 +25,6 @@ function MetricCard({ label, value, icon: Icon, colorClass }: { label: string; v
);
}

const phoneSchema = z.string().length(10, "Phone number must be 10 digits").regex(/^\d+$/, "Phone number must be numeric");

export function CourierInterface() {
const navigate = useNavigate();
const { currentUser, authLoading, logout, setCurrentUser, updateUser } = useApp();
Expand Down Expand Up @@ -108,18 +105,9 @@ export function CourierInterface() {
phone: currentUser?.phone || ''
});
const [isSavingSettings, setIsSavingSettings] = useState(false);
const [phoneError, setPhoneError] = useState<string | null>(null);

const handleSaveSettings = async () => {
if (!currentUser) return;

const validation = phoneSchema.safeParse(settingsData.phone);
if (!validation.success) {
setPhoneError(validation.error.issues[0].message);
return;
}
setPhoneError(null);

setIsSavingSettings(true);
try {
await updateUser(currentUser.id, {
Expand Down Expand Up @@ -395,18 +383,9 @@ export function CourierInterface() {
<div key={f.field} className="space-y-1">
<Label className="text-xs font-bold text-slate-500 uppercase tracking-wider flex items-center gap-1.5"><Icon className="w-3.5 h-3.5" />{f.label}</Label>
<input type={f.type} value={(settingsData as any)[f.field]}
onChange={(e) => {
const val = e.target.value;
if (f.field === 'phone') {
if (val && !/^\d+$/.test(val)) return;
if (val.length > 10) return;
setPhoneError(null);
}
setSettingsData({ ...settingsData, [f.field]: val });
}}
onChange={(e) => setSettingsData({ ...settingsData, [f.field]: e.target.value })}
disabled={f.field === 'email'}
className={`w-full h-11 bg-[#F0F4FF] dark:bg-[#0A1628] border rounded-xl px-3.5 text-sm focus:outline-none focus:border-[#1E3A8A] disabled:opacity-60 disabled:cursor-not-allowed ${f.field === 'phone' && phoneError ? 'border-red-500' : 'border-blue-100 dark:border-blue-900/30'}`} />
{f.field === 'phone' && phoneError && <p className="text-[10px] text-red-500 mt-1 font-semibold">{phoneError}</p>}
className="w-full h-11 bg-[#F0F4FF] dark:bg-[#0A1628] border border-blue-100 dark:border-blue-900/30 rounded-xl px-3.5 text-sm focus:outline-none focus:border-[#1E3A8A] disabled:opacity-60 disabled:cursor-not-allowed" />
</div>
);
})}
Expand Down
24 changes: 2 additions & 22 deletions frontend/src/app/components/UserInterfaceNew.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import React, { useState, useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { z } from 'zod';
import { useApp } from '@/app/contexts/AppContext';
import { Header } from '@/app/components/Header';
import { Sidebar, SidebarItem } from '@/app/components/Sidebar';
Expand Down Expand Up @@ -34,8 +33,6 @@ function StatusBadge({ status }: { status: string }) {
);
}

const phoneSchema = z.string().length(10, "Phone number must be 10 digits").regex(/^\d+$/, "Phone number must be numeric");

const NAV_ITEMS: SidebarItem[] = [
{ id: 'browse', label: 'Browse', icon: Search },
{ id: 'orders', label: 'My Orders', icon: Package },
Expand Down Expand Up @@ -65,7 +62,6 @@ export function UserInterface() {
name: currentUser?.name || '', email: currentUser?.email || '',
phone: currentUser?.phone || '', address: currentUser?.address || '', photo: currentUser?.photo || ''
});
const [phoneError, setPhoneError] = useState<string | null>(null);

const [feedbackDialog, setFeedbackDialog] = useState<{ open: boolean; orderId: string; type: 'product' | 'courier' | 'vendor' }>({ open: false, orderId: '', type: 'product' });
const [rating, setRating] = useState(5);
Expand Down Expand Up @@ -616,30 +612,14 @@ export function UserInterface() {
<div key={f.field} className="space-y-1">
<Label className="text-xs font-bold text-slate-500 uppercase tracking-wider flex items-center gap-1.5"><Icon className="w-3.5 h-3.5" />{f.label}</Label>
<Input type={f.type} placeholder={f.placeholder} value={(settingsData as any)[f.field]}
onChange={e => {
const val = e.target.value;
if (f.field === 'phone') {
if (val && !/^\d+$/.test(val)) return;
if (val.length > 10) return;
setPhoneError(null);
}
setSettingsData({ ...settingsData, [f.field]: val });
}}
className={`h-11 bg-[#F0F4FF] dark:bg-[#0A1628] border rounded-xl focus:border-[#1E3A8A] ${f.field === 'phone' && phoneError ? 'border-red-500' : 'border-blue-100 dark:border-blue-900/30'}`} />
{f.field === 'phone' && phoneError && <p className="text-[10px] text-red-500 mt-1 font-semibold">{phoneError}</p>}
onChange={e => setSettingsData({ ...settingsData, [f.field]: e.target.value })}
className="h-11 bg-[#F0F4FF] dark:bg-[#0A1628] border-blue-100 dark:border-blue-900/30 rounded-xl focus:border-[#1E3A8A]" />
</div>
);
})}
<div className="flex gap-3 pt-2">
<button onClick={async () => {
try {
const validation = phoneSchema.safeParse(settingsData.phone);
if (!validation.success) {
setPhoneError(validation.error.issues[0].message);
return;
}
setPhoneError(null);

let photoRef = settingsData.photo;
// Handle FormData if file was selected
if ((settingsData as any).photoFile) {
Expand Down
Loading
Loading