+ setOldPassword(e.currentTarget.value)}
+ withAsterisk
+ mb="xs"
+ readOnly={step !== "form"}
+ />
setNewPassword(e.currentTarget.value)}
withAsterisk
+ minLength={8}
+ maxLength={15}
mb="xs"
readOnly={step !== "form"}
/>
@@ -187,11 +216,8 @@ export default function ChangePassword() {
onPaste={(e) => e.preventDefault()}
onCut={(e) => e.preventDefault()}
/>
-
-
{/* CAPTCHA */}
-
-
- {/* Buttons */}
-
-
-
-
+
+ Note: Your new password must be 8–15 characters long and contain at least one number and one special character.
+
);
}
diff --git a/src/app/(main)/settings/change_txn_password/page.tsx b/src/app/(main)/settings/change_txn_password/page.tsx
index 6b325d0..3ba3932 100644
--- a/src/app/(main)/settings/change_txn_password/page.tsx
+++ b/src/app/(main)/settings/change_txn_password/page.tsx
@@ -5,20 +5,27 @@ import { TextInput, PasswordInput, Button, Title, Paper, Group, Box } from "@man
import { notifications } from "@mantine/notifications";
import { IconLock } from "@tabler/icons-react";
import { generateCaptcha } from "@/app/captcha";
+import { useRouter } from "next/navigation";
export default function ChangePassword() {
+ const router = useRouter();
const [oldPassword, setOldPassword] = useState("");
const [newPassword, setNewPassword] = useState("");
const [confirmPassword, setConfirmPassword] = useState("");
const [captcha, setCaptcha] = useState("");
const [captchaInput, setCaptchaInput] = useState("");
const [otp, setOtp] = useState("");
+ const [generatedOtp, setGeneratedOtp] = useState('');
const [otpValidated, setOtpValidated] = useState(false);
-
- const [step, setStep] = useState<"form" | "otp" | "final">("form"); // ✅ steps control
- const [passwordHistory] = useState(["Pass@1234", "OldPass@123", "MyPass#2023"]);
+ const [step, setStep] = useState<"form" | "otp" | "final">("form");
const icon =
;
+ const handleGenerateOtp = async () => {
+ const value = "123456"; // Or generate a random OTP
+ setGeneratedOtp(value);
+ return value;
+ };
+
useEffect(() => {
regenerateCaptcha();
}, []);
@@ -33,7 +40,7 @@ export default function ChangePassword() {
return /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[!@#$%^&*])[A-Za-z\d!@#$%^&*]{8,}$/.test(password);
};
- const handleSubmit = () => {
+ const handleSubmit = async () => {
// Step 1 → validate form
if (step === "form") {
if (!oldPassword || !newPassword || !confirmPassword || !captchaInput) {
@@ -44,36 +51,15 @@ export default function ChangePassword() {
});
return;
}
-
- const actualOldPassword = "Pass@123";
- if (oldPassword !== actualOldPassword) {
- notifications.show({
- title: "Old Password Incorrect",
- message: "Entered old password does not match.",
- color: "red",
- });
- return;
- }
-
if (!validatePasswordPolicy(newPassword)) {
notifications.show({
title: "Invalid Password",
message:
- "Password must be at least 8 characters and contain alphanumeric and special characters.",
+ "Your new password must be 8–15 characters long and contain at least one number and one special character.",
color: "red",
});
return;
}
-
- if (passwordHistory.includes(newPassword)) {
- notifications.show({
- title: "Password Reused",
- message: "New password must be different from the last 3 passwords.",
- color: "red",
- });
- return;
- }
-
if (newPassword !== confirmPassword) {
notifications.show({
title: "Password Mismatch",
@@ -94,6 +80,7 @@ export default function ChangePassword() {
}
// ✅ Passed → move to OTP
+ await handleGenerateOtp();
setStep("otp");
notifications.show({
title: "OTP Sent",
@@ -105,7 +92,7 @@ export default function ChangePassword() {
// Step 2 → validate OTP
if (step === "otp") {
- if (otp !== "123456") {
+ if (otp !== generatedOtp) {
notifications.show({
title: "Invalid OTP",
message: "Please enter the correct OTP.",
@@ -126,12 +113,55 @@ export default function ChangePassword() {
// Step 3 → Final Change Password
if (step === "final") {
- notifications.show({
- title: "Password Changed",
- message: "Your password has been successfully updated.",
- color: "green",
- });
- resetForm();
+ const token = localStorage.getItem("access_token");
+ if (!token) {
+ router.push("/login");
+ return;
+ }
+ try {
+ const response = await fetch("/api/auth/change/transaction_password", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ Authorization: `Bearer ${token}`,
+ },
+ body: JSON.stringify({
+ OldTPsw: oldPassword,
+ newTPsw: newPassword,
+ confirmTPsw: confirmPassword
+ }),
+ });
+
+ if (response.status === 401) {
+ localStorage.removeItem("access_token");
+ router.push("/login");
+ return;
+ }
+ const result = await response.json();
+ console.log(result);
+ if (!response.ok) {
+ notifications.show({
+ title: "Failed",
+ message: result.error || "Failed to set transaction password",
+ color: "Red",
+ autoClose: false,
+ });
+ }
+ if (response.ok) {
+ notifications.show({
+ title: "Success",
+ message: "Transaction password change successfully.",
+ color: "green",
+ });
+ }
+ resetForm();
+ } catch (err: any) {
+ notifications.show({
+ title: "Error",
+ message: err.message || "Server error, please try again later",
+ color: "red",
+ });
+ }
}
};
@@ -148,7 +178,6 @@ export default function ChangePassword() {
return (
- More Updates comming soon .....
Change Transaction Password
diff --git a/src/app/(main)/settings/set_txn_password/page.tsx b/src/app/(main)/settings/set_txn_password/page.tsx
index c4fc3ae..991aef5 100644
--- a/src/app/(main)/settings/set_txn_password/page.tsx
+++ b/src/app/(main)/settings/set_txn_password/page.tsx
@@ -135,7 +135,6 @@ export default function ChangePassword() {
router.push("/login");
return;
}
-
try {
const response = await fetch("/api/auth/transaction_password", {
method: "POST",
@@ -196,8 +195,8 @@ export default function ChangePassword() {
setNewPassword(e.currentTarget.value)}
withAsterisk
diff --git a/src/app/_util/getBankLogo.ts b/src/app/_util/getBankLogo.ts
index 60e11ea..f118ea8 100644
--- a/src/app/_util/getBankLogo.ts
+++ b/src/app/_util/getBankLogo.ts
@@ -7,17 +7,20 @@ import pnb from "@/app/image/bank_logo/pnb.jpg";
import axis from "@/app/image/bank_logo/axis.jpg";
import kccb from "@/app/image/bank_logo/kccb.jpg";
import logo from "@/app/image/bank_logo/bank.jpg";
-
+
export function getBankLogo(bankName: string): StaticImageData {
- const logos: Record = {
- "STATE BANK": sbi,
- "PUNJAB NATIONAL": pnb,
- "HDFC": hdfc,
- "ICICI": icici,
- "AXIS": axis,
- "BANK OF INDIA": BOI,
- "KANGRA": kccb,
- };
-
- return logos[bankName.toUpperCase()] ?? logo;
-}
\ No newline at end of file
+ if (!bankName) return logo;
+
+ const upperName = bankName.toUpperCase();
+
+ if (upperName.startsWith("HDFC")) return hdfc;
+ if (upperName.startsWith("SBI") || upperName.startsWith("STATE BANK")) return sbi;
+ if (upperName.startsWith("ICICI")) return icici;
+ if (upperName.startsWith("PNB") || upperName.startsWith("PUNJAB NATIONAL")) return pnb;
+ if (upperName.startsWith("AXIS")) return axis;
+ if (upperName.startsWith("THE KANGRA CENTRAL")) return kccb;
+ if (upperName.startsWith("BANK OF INDIA") || upperName.startsWith("BOI")) return BOI;
+
+ return logo;
+}
+
\ No newline at end of file
diff --git a/src/app/administrator/home/UserConfiguration.tsx b/src/app/administrator/home/UserConfiguration.tsx
index f09a2e6..1a47d42 100644
--- a/src/app/administrator/home/UserConfiguration.tsx
+++ b/src/app/administrator/home/UserConfiguration.tsx
@@ -86,8 +86,6 @@ export default function UserConfiguration() {
else {
const rightsData = {
CIF,
- // internetBanking,
- // mobileBanking,
};
console.log('Submitting rights:', rightsData);
notifications.show({
diff --git a/src/app/image/ib_front_1.jpg b/src/app/image/ib_front_1.jpg
new file mode 100644
index 0000000..32d4d9a
Binary files /dev/null and b/src/app/image/ib_front_1.jpg differ
diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx
index 4a8caf4..c1dce71 100644
--- a/src/app/login/page.tsx
+++ b/src/app/login/page.tsx
@@ -6,7 +6,7 @@ import { Providers } from "@/app/providers";
import { useRouter } from "next/navigation";
import NextImage from "next/image";
import logo from '@/app/image/logo1.jpg';
-import frontPage from '@/app/image/ib_front.jpg';
+import frontPage from '@/app/image/ib_front_1.jpg';
import dynamic from 'next/dynamic';
import { generateCaptcha } from '@/app/captcha';
import { IconShieldLockFilled } from "@tabler/icons-react";
@@ -95,20 +95,20 @@ export default function Login() {
password: psw,
}),
});
+ const data = await response.json();
+ console.log(data);
if (!response.ok) {
notifications.show({
withBorder: true,
color: "red",
title: "Error",
- message: "Internal Server Error",
+ message: data?.error || "Internal Server Error",
autoClose: 5000,
});
localStorage.removeItem("access_token");
localStorage.removeItem("remitter_name");
return;
}
- const data = await response.json();
- console.log(data);
setIsLogging(true);
if (response.ok) {
console.log(data);