added backend

This commit is contained in:
Sridhar260802 2025-05-07 17:43:20 +05:30
parent 5901f56eac
commit cf888f3853
7 changed files with 819 additions and 319 deletions

356
package-lock.json generated
View File

@ -14,6 +14,7 @@
"@mui/material": "^6.1.10",
"@mui/styles": "^6.1.10",
"@radix-ui/react-slot": "^1.1.2",
"axios": "^1.9.0",
"bootstrap": "^5.3.3",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
@ -1997,6 +1998,11 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"node_modules/autoprefixer": {
"version": "10.4.21",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
@ -2049,6 +2055,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/axios": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz",
"integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==",
"dependencies": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
},
"node_modules/babel-plugin-macros": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
@ -2164,6 +2180,18 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"dependencies": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@ -2250,6 +2278,17 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dependencies": {
"delayed-stream": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@ -2428,6 +2467,14 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/dequal": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
@ -2457,6 +2504,19 @@
"csstype": "^3.0.2"
}
},
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
"es-errors": "^1.3.0",
"gopd": "^1.2.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/electron-to-chromium": {
"version": "1.5.128",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.128.tgz",
@ -2532,13 +2592,9 @@
}
},
"node_modules/es-define-property": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
"dev": true,
"dependencies": {
"get-intrinsic": "^1.2.4"
},
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"engines": {
"node": ">= 0.4"
}
@ -2547,7 +2603,6 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"dev": true,
"engines": {
"node": ">= 0.4"
}
@ -2579,10 +2634,9 @@
}
},
"node_modules/es-object-atoms": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
"integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
"dev": true,
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"dependencies": {
"es-errors": "^1.3.0"
},
@ -2591,14 +2645,14 @@
}
},
"node_modules/es-set-tostringtag": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
"integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
"dev": true,
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"dependencies": {
"get-intrinsic": "^1.2.4",
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.6",
"has-tostringtag": "^1.0.2",
"hasown": "^2.0.1"
"hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
@ -2958,6 +3012,25 @@
"integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==",
"dev": true
},
"node_modules/follow-redirects": {
"version": "1.15.9",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
"integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
"engines": {
"node": ">=4.0"
},
"peerDependenciesMeta": {
"debug": {
"optional": true
}
}
},
"node_modules/for-each": {
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
@ -2967,6 +3040,20 @@
"is-callable": "^1.1.3"
}
},
"node_modules/form-data": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
"integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/fraction.js": {
"version": "4.3.7",
"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
@ -3039,16 +3126,20 @@
}
},
"node_modules/get-intrinsic": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
"dev": true,
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
"es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
"es-object-atoms": "^1.1.1",
"function-bind": "^1.1.2",
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3",
"hasown": "^2.0.0"
"get-proto": "^1.0.1",
"gopd": "^1.2.0",
"has-symbols": "^1.1.0",
"hasown": "^2.0.2",
"math-intrinsics": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@ -3057,6 +3148,18 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"dependencies": {
"dunder-proto": "^1.0.1",
"es-object-atoms": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/get-symbol-description": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
@ -3115,13 +3218,9 @@
}
},
"node_modules/gopd": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.1.0.tgz",
"integrity": "sha512-FQoVQnqcdk4hVM4JN1eromaun4iuS34oStkdlLENLdpULsuQcTyXj8w7ayhuUfPwEYZ1ZOooOTT6fdA9Vmx/RA==",
"dev": true,
"dependencies": {
"get-intrinsic": "^1.2.4"
},
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"engines": {
"node": ">= 0.4"
},
@ -3178,7 +3277,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"dev": true,
"engines": {
"node": ">= 0.4"
},
@ -3190,7 +3288,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"dev": true,
"dependencies": {
"has-symbols": "^1.0.3"
},
@ -3896,6 +3993,33 @@
"react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"dependencies": {
"mime-db": "1.52.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@ -4233,6 +4357,11 @@
"react": ">=0.14.0"
}
},
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@ -6395,6 +6524,11 @@
"is-shared-array-buffer": "^1.0.2"
}
},
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"autoprefixer": {
"version": "10.4.21",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
@ -6418,6 +6552,16 @@
"possible-typed-array-names": "^1.0.0"
}
},
"axios": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz",
"integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==",
"requires": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
},
"babel-plugin-macros": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
@ -6487,6 +6631,15 @@
"set-function-length": "^1.2.1"
}
},
"call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"requires": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2"
}
},
"callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@ -6541,6 +6694,14 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"requires": {
"delayed-stream": "~1.0.0"
}
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@ -6671,6 +6832,11 @@
"object-keys": "^1.1.1"
}
},
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
},
"dequal": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
@ -6694,6 +6860,16 @@
"csstype": "^3.0.2"
}
},
"dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"requires": {
"call-bind-apply-helpers": "^1.0.1",
"es-errors": "^1.3.0",
"gopd": "^1.2.0"
}
},
"electron-to-chromium": {
"version": "1.5.128",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.128.tgz",
@ -6763,19 +6939,14 @@
}
},
"es-define-property": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
"dev": true,
"requires": {
"get-intrinsic": "^1.2.4"
}
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="
},
"es-errors": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"dev": true
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="
},
"es-iterator-helpers": {
"version": "1.2.0",
@ -6801,23 +6972,22 @@
}
},
"es-object-atoms": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
"integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
"dev": true,
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"requires": {
"es-errors": "^1.3.0"
}
},
"es-set-tostringtag": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
"integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
"dev": true,
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"requires": {
"get-intrinsic": "^1.2.4",
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.6",
"has-tostringtag": "^1.0.2",
"hasown": "^2.0.1"
"hasown": "^2.0.2"
}
},
"es-shim-unscopables": {
@ -7080,6 +7250,11 @@
"integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==",
"dev": true
},
"follow-redirects": {
"version": "1.15.9",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
"integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="
},
"for-each": {
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
@ -7089,6 +7264,17 @@
"is-callable": "^1.1.3"
}
},
"form-data": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
"integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
"mime-types": "^2.1.12"
}
},
"fraction.js": {
"version": "4.3.7",
"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
@ -7132,16 +7318,29 @@
"dev": true
},
"get-intrinsic": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
"dev": true,
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"requires": {
"call-bind-apply-helpers": "^1.0.2",
"es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
"es-object-atoms": "^1.1.1",
"function-bind": "^1.1.2",
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3",
"hasown": "^2.0.0"
"get-proto": "^1.0.1",
"gopd": "^1.2.0",
"has-symbols": "^1.1.0",
"hasown": "^2.0.2",
"math-intrinsics": "^1.1.0"
}
},
"get-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"requires": {
"dunder-proto": "^1.0.1",
"es-object-atoms": "^1.0.0"
}
},
"get-symbol-description": {
@ -7181,13 +7380,9 @@
}
},
"gopd": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.1.0.tgz",
"integrity": "sha512-FQoVQnqcdk4hVM4JN1eromaun4iuS34oStkdlLENLdpULsuQcTyXj8w7ayhuUfPwEYZ1ZOooOTT6fdA9Vmx/RA==",
"dev": true,
"requires": {
"get-intrinsic": "^1.2.4"
}
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="
},
"has-bigints": {
"version": "1.0.2",
@ -7222,14 +7417,12 @@
"has-symbols": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"dev": true
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="
},
"has-tostringtag": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"dev": true,
"requires": {
"has-symbols": "^1.0.3"
}
@ -7737,6 +7930,24 @@
"integrity": "sha512-oZy8coK9kZzvqhSgfbGkPtTgyjpBvs3ukLgDPv14dSOZtBtboryWF5o8i3qen7QbGg7JhiJBz5mK1p8YoMZTLQ==",
"requires": {}
},
"math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="
},
"mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
},
"mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"requires": {
"mime-db": "1.52.0"
}
},
"minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@ -7964,6 +8175,11 @@
"warning": "^4.0.0"
}
},
"proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",

View File

@ -16,6 +16,7 @@
"@mui/material": "^6.1.10",
"@mui/styles": "^6.1.10",
"@radix-ui/react-slot": "^1.1.2",
"axios": "^1.9.0",
"bootstrap": "^5.3.3",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",

View File

@ -1,205 +1,207 @@
/* Centering the form container */
.form-container {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background: linear-gradient(135deg, #f3f4f6, #e0e0e0);
display: flex;
justify-content: center;
align-items: center;
padding: 20px;
box-sizing: border-box;
overflow: auto;
/* FundDrive.css */
}
/* Styling for labels */
label {
font-size: 20px; /* Increased label font size */
font-weight: bold;
}
/* Container for each radio button */
.radio-box {
display: flex;
align-items: center;
justify-content: flex-start;
width: 380px; /* Reduced width */
height: 35px; /* Smaller height */
padding: 6px;
border: 1.5px solid #ccc;
border-radius: auto;
border: none;
box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.2);
background-color: #f9f9f9;
transition: 0.3s ease-in-out;
font-size: 14px; /* Increased font size */
}
.radio-box:hover {
background-color: #e0e0e0;
}
.radio-label {
font-size: 14px; /* Reduce label font size */
}
/* Bigger radio buttons */
.radio-input {
width: 14px;
height: 14px;
margin-right: 6px;
cursor: pointer;
}
/* Buttons container */
.button-group {
body {
font-family: 'Segoe UI', 'Helvetica Neue', sans-serif;
background-color: #fefcfb;
margin: 0;
padding: 0;
}
.container {
display: flex;
justify-content: center;
gap: 10px;
margin-top: 10px;
}
/* Bigger buttons for Next, Back, and Submit */
.form-button {
padding: 8px 20px;
font-size: 18px; /* Increased font size */
font-weight: bold;
background-color: #2563eb;
color: white;
border: none;
border-radius: auto;
cursor: pointer;
transition: background 0.3s ease-in-out;
width: 150px;
text-align: center;
}
.form-button:hover {
background-color: #1e40af;
}
.form-button:disabled {
background-color: #a1a1aa;
cursor: not-allowed;
}
/* Upload section adjustments */
.upload-section {
text-align: center;
}
.upload-title {
font-size: 20px; /* Increased font size */
margin-bottom: 8px;
}
.file-input {
margin: 8px 0;
font-size: 18px; /* Increased font size */
}
/* Image preview styling */
.image-preview {
display: flex;
flex-wrap: wrap;
gap: 8px;
justify-content: center;
margin-top: 8px;
}
.uploaded-image {
width: 70px;
height: 70px;
object-fit: cover;
border-radius: 5px;
border: 1px solid #ddd;
}
.upload-box {
border: 2px dashed #ccc;
padding: 20px;
text-align: center;
padding: 40px 16px;
}
.container-box {
background: #ffffff;
border-radius: 16px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.08);
padding: 40px;
width: 100%;
max-width: 400px;
margin: 10px auto;
background-color: #f9f9f9;
cursor: pointer;
font-size: 18px; /* Increased font size */
}
.upload-box:hover {
border-color: #007bff;
}
.upload-placeholder {
color: #888;
font-size: 18px; /* Increased font size */
}
/* Grey color for Next and Back buttons */
.form-button.next-button,
.form-button.back-button {
background-color: #4b5563;
width: 100px;
height: 35px;
font-size: 18px; /* Increased font size */
}
.form-button.next-button:hover,
.form-button.back-button:hover {
background-color: #4b5563; /* Darker Grey on hover */
}
/* Blue color for Submit button */
.form-button.submit-button {
background-color: #2563eb; /* Blue */
width: 100px;
height: 35px;
font-size: 18px; /* Increased font size */
}
.form-button.submit-button:hover {
background-color: #1e40af; /* Darker Blue on hover */
}
/* Input Fields */
.input-small {
font-size: 14px;
margin-top: 5px;
background-color: #f5f5f5;
border: 1px solid #ccc;
border-radius: 5px;
border: none;
box-shadow: inset 0px 1px 3px rgba(0, 0, 0, 0.1);
transition: all 0.2s ease-in-out;
width: 380px; /* Reduced width */
height: 30px; /* Smaller height */
padding: 8px;
max-width: 720px;
}
.container-box{
border: 3px solid #eeeeee;
padding: 20px;
margin: 15px auto 0 auto;
width: 33%;
background-color: #eeeeee; /* Lighter Grey Background */
border-radius: 10px;
color: black;
form h4 {
font-size: 24px;
color: #2c3e50;
margin-bottom: 24px;
font-weight: 600;
border-left: 5px solid #f39c12;
padding-left: 12px;
}
.center-wrapper {
label {
font-weight: 600;
display: block;
margin-bottom: 8px;
color: #34495e;
}
.form-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 20px;
margin-bottom: 20px;
}
.form-field {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
background-color: #ffffff; /* or any background you like */
flex-direction: column;
}
.full-width {
grid-column: 1 / -1;
}
input[type="text"],
input[type="email"],
input[type="tel"],
input[type="number"],
input[type="date"],
input[type="pan"] {
padding: 12px 14px;
border: 1px solid #ddd;
border-radius: 8px;
font-size: 15px;
background-color: #fefefe;
margin-top: 6px;
transition: border-color 0.2s ease;
}
input:focus {
border-color: #f39c12;
outline: none;
}
.radio-box {
display: flex;
align-items: center;
margin-bottom: 12px;
}
.radio-input {
margin-right: 10px;
accent-color: #e67e22;
}
.radio-label {
font-size: 15px;
color: #555;
}
.input-small {
padding: 8px;
width: 100%;
border-radius: 6px;
border: 1px solid #ccc;
font-size: 14px;
}
.file-input {
margin-top: 20px;
width: 100%;
padding: 14px;
border: 2px dashed #ccc;
border-radius: 12px;
text-align: center;
background-color: #fffdf9;
cursor: pointer;
transition: 0.3s;
}
.file-input:hover {
border-color: #f39c12;
background-color: #fff8eb;
}
.upload-placeholder {
color: #999;
margin-top: 10px;
font-size: 14px;
}
.upload-title {
font-size: 20px;
color: #2c3e50;
margin: 20px 0;
font-weight: 600;
}
.image-preview {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-top: 16px;
}
.uploaded-image {
width: 90px;
height: 90px;
object-fit: cover;
border-radius: 8px;
border: 2px solid #ffe3b3;
}
.button-group {
display: flex;
justify-content: space-between;
margin-top: 30px;
flex-wrap: wrap;
gap: 16px;
}
.form-button {
background-color: #4a90e2;
color: #fff;
padding: 10px 24px;
border: none;
border-radius: 6px;
font-size: 16px;
font-weight: 600;
cursor: pointer;
display: inline-flex;
align-items: center;
justify-content: center;
text-align: center;
height: 44px; /* same height for all buttons */
line-height: 1.2;
}
.next-button {
background-color: #f39c12;
color: white;
}
.back-button {
background-color: #dcdcdc;
color: #333;
}
.submit-button {
background-color: #27ae60;
color: white;
}
.form-button:disabled {
background-color: #ccc;
cursor: not-allowed;
}
.form-button:hover:not(:disabled) {
opacity: 0.9;
}
@media (max-width: 600px) {
.container-box {
padding: 24px;
}
.form-button {
width: 100%;
}
.button-group {
flex-direction: column;
gap: 12px;
}
}

View File

@ -1,5 +1,10 @@
import React, { useState } from "react";
import { useState } from "react";
import "./FundDrive.css";
// Inside src/Components/FundDrive.jsx
import { submitVvvetForm } from "../vvvetApi";
import axios from "axios";
const FundDrive = () => {
const [step, setStep] = useState(1);
@ -10,9 +15,13 @@ const FundDrive = () => {
age: "",
dob: "",
category: "",
pan: "",
customCategory: "",
images: []
});
const [isPanVerified, setIsPanVerified] = useState(false); // To track PAN verification status
const [verificationError, setVerificationError] = useState("");
const [panImage, setPanImage] = useState(null); // Define panImage state
const categories = [
"Medical Fundraising",
@ -28,7 +37,11 @@ const FundDrive = () => {
];
const handleInputChange = (e) => {
setFormData({ ...formData, [e.target.name]: e.target.value });
const { name, value } = e.target;
setFormData({
...formData,
[name]: value,
});
};
const handleImageUpload = (event) => {
@ -44,78 +57,316 @@ const FundDrive = () => {
if (step > 1) setStep(step - 1);
};
const handleSubmit = () => {
alert("Fundraising submission successful!");
// const handleSubmit = () => {
// alert("Fundraising submission successful!");
// };
const handlePanImageUpload = (e) => {
const file = e.target.files[0];
setPanImage(file); // Store PAN image in state
};
// const verifyPan = async () => {
// try {
// const formDataForPan = new FormData();
// formDataForPan.append("pan", formData.pan);
// formDataForPan.append("panImage", panImage); // panImage must be a File object
// const response = await axios.post(
// "http://localhost:5002/api/verify-pan",
// formDataForPan,
// {
// headers: {
// "Content-Type": "multipart/form-data",
// },
// withCredentials: true, // Ensures credentials (cookies) are sent
// }
// );
// console.log("vathuten da punda",response.data); // Check the backend response
// const isValid = response.data.verified;
// setIsPanVerified(isValid);
// if (!isValid) {
// setVerificationError("PAN number and uploaded image do not match.");
// }
// return isValid;
// } catch (error) {
// setVerificationError("An error occurred during PAN verification.");
// console.error(error);
// return false;
// }
// };
//demoooooooooooooooooooooooooooooooooo//
// const verifyPan = async () => {
// try {
// const formDataForPan = new FormData();
// formDataForPan.append("pan", formData.pan);
// formDataForPan.append("panImage", panImage);
// // Using the proxy path - note we removed the full URL
// const response = await axios.post(
// "/api/verify-pan", // Just use the relative path when using a proxy
// formDataForPan,
// {
// headers: {
// "Content-Type": "multipart/form-data",
// },
// }
// );
// console.log("PAN verification response:", response.data);
// const isValid = response.data.verified;
// setIsPanVerified(isValid);
// if (!isValid) {
// setVerificationError("PAN number and uploaded image do not match.");
// }
// return isValid;
// } catch (error) {
// console.error("Error verifying PAN:", error);
// setVerificationError("An error occurred during PAN verification.");
// return false;
// }
// };
const verifyPan = async () => {
try {
// Validate PAN format client-side first
const panRegex = /^[A-Z]{5}[0-9]{4}[A-Z]{1}$/;
if (!panRegex.test(formData.pan)) {
setVerificationError("Invalid PAN format. It should be in the format ABCDE1234F.");
setIsPanVerified(false);
return false;
}
if (!panImage) {
setVerificationError("Please upload a PAN card image.");
setIsPanVerified(false);
return false;
}
const formDataForPan = new FormData();
formDataForPan.append("pan", formData.pan);
formDataForPan.append("panImage", panImage);
// Show loading state if needed
// setIsLoading(true);
const response = await axios.post(
"http://localhost:5002/api/verify-pan",
formDataForPan,
{
headers: {
"Content-Type": "multipart/form-data",
},
}
);
// Hide loading state
// setIsLoading(false);
console.log("PAN verification response:", response.data);
if (response.data.verified) {
setIsPanVerified(true);
setVerificationError(""); // Clear any previous errors
return true;
} else {
setIsPanVerified(false);
setVerificationError(response.data.message || "PAN verification failed.");
return false;
}
} catch (error) {
// Hide loading state
// setIsLoading(false);
console.error("Error verifying PAN:", error);
// Handle specific error cases
if (error.response) {
// The server responded with an error status
setVerificationError(error.response.data.message || "PAN verification failed. Server returned an error.");
} else if (error.request) {
// The request was made but no response was received
setVerificationError("Cannot connect to the verification service. Please try again later.");
} else {
// Something else caused the error
setVerificationError("An error occurred during PAN verification.");
}
setIsPanVerified(false);
return false;
}
};
// const handleSubmit = async (e) => {
// e.preventDefault();
// if (!isPanVerified) {
// const verified = await verifyPan();
// if (!verified) {
// alert("PAN not verified. Please verify before submitting.");
// return;
// }
// }
// try {
// await submitVvvetForm(formData);
// alert('Form submitted successfully');
// } catch (error) {
// console.error("Error submitting form:", error);
// alert('Error submitting form');
// }
// };
const handleSubmit = async (e) => {
e.preventDefault();
if (!isPanVerified) {
const verified = await verifyPan();
if (!verified) {
alert("PAN not verified. Please verify before submitting.");
return;
}
}
// Proceed with form submission (assuming `submitVvvetForm` is defined)
try {
await submitVvvetForm(formData); // Make sure this function is defined elsewhere
alert("Form submitted successfully!");
} catch (error) {
console.error("Error submitting form:", error);
alert("Error submitting form");
}
};
return (
<div className="container">
<div className="container-box">
<form>
{step === 1 && (
<div className="step-box">
<h4>Step 1:Personal Details</h4>
<label>Name:</label>
{step === 1 && (
<div className="step-box">
<h4>Step 1: Personal Details</h4>
<div className="form-grid">
<div className="form-field">
<label>Name</label>
<input
type="text"
name="name"
value={formData.name}
onChange={handleInputChange}
required
placeholder="Full Name"
/>
</div>
<div className="form-field">
<label>Email</label>
<input
type="email"
name="email"
value={formData.email}
onChange={handleInputChange}
required
placeholder="example@domain.com"
/>
</div>
<div className="form-field">
<label>Age</label>
<input
type="number"
name="age"
value={formData.age}
onChange={handleInputChange}
required
placeholder="e.g. 25"
/>
</div>
<div className="form-field">
<label>Date of Birth</label>
<input
type="date"
name="dob"
value={formData.date}
onChange={handleInputChange}
required
placeholder="e.g. 25"
/>
</div>
</div>
<div className="form-field">
<label>Phone Number</label>
<input
type="tel"
name="phone"
value={formData.phone}
onChange={handleInputChange}
required
placeholder="10-digit number"
/>
</div>
<div className="form-field">
<label>PAN Number</label>
<input
type="text"
name="name"
value={formData.name}
name="pan"
value={formData.pan}
onChange={handleInputChange}
required
maxLength={10}
placeholder="e.g. ABCDE1234F"
className="input-small"
placeholder="Enter your name"
pattern="[A-Z]{5}[0-9]{4}[A-Z]{1}"
title="Enter valid 10-character PAN (e.g. ABCDE1234F)"
/>
<label>Email:</label>
<input
type="email"
name="email"
value={formData.email}
onChange={handleInputChange}
required
className="input-small"
placeholder="Enter your email"
/>
<label>Phone Number:</label>
<input
type="tel"
name="phone"
value={formData.phone}
onChange={handleInputChange}
required
className="input-small"
placeholder="Enter phone number"
/>
<label>Age:</label>
<input
type="number"
name="age"
value={formData.age}
onChange={handleInputChange}
required
className="input-small"
placeholder="Enter your age"
/>
<label>Date of Birth:</label>
<input
type="date"
name="dob"
value={formData.dob}
onChange={handleInputChange}
required
className="input-small"
/>
<br /><br />
</div>
<div className="form-field">
<label>Upload PAN Image</label>
<input
type="file"
accept="image/*"
onChange={handlePanImageUpload}
required
/>
{panImage && <p>{panImage.name}</p>} {/* Display image file name */}
</div>
{verificationError && <p style={{ color: 'red' }}>{verificationError}</p>}
<div className="form-field">
<button
type="button"
className="form-button verify-button"
onClick={verifyPan}
disabled={!formData.pan || !panImage}
>
Verify PAN
</button>
{isPanVerified && <p style={{ color: 'green' }}>PAN verified successfully!</p>}
</div>
<div className="button-group">
<button
type="button"
onClick={handleNext}
className="form-button next-button"
disabled={!formData.name || !formData.email || !formData.phone || !formData.age || !formData.dob}
disabled={!formData.name || !formData.email || !formData.phone || !formData.age || !formData.dob || !formData.pan}
>
Next
</button>
</div>
)}
</div>
)}
{step === 2 && (

View File

@ -1,4 +1,4 @@
import React, { useState } from "react";
import { useState } from "react";
import "./Supporter.css";
const Supporter = () => {

12
src/vvvetApi.js Normal file
View File

@ -0,0 +1,12 @@
// vvvetApi.js
import axios from 'axios';
export const submitVvvetForm = async (formData) => {
try {
const response = await axios.post('http://localhost:5002/api/vvet/add', formData);
return response.data;
} catch (error) {
console.error('Error submitting form:', error);
throw error;
}
};

View File

@ -1,7 +1,25 @@
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
// import { defineConfig } from 'vite'
// import react from '@vitejs/plugin-react'
// // https://vite.dev/config/
// export default defineConfig({
// plugins: [react()],
// })
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
// https://vite.dev/config/
export default defineConfig({
plugins: [react()],
})
server: {
port: 5174,
proxy: {
'/api': {
target: 'http://localhost:5002',
changeOrigin: true,
secure: false,
},
},
},
});