From 5391040b0bbd0dc78d9d714250d2414d5cb36d50 Mon Sep 17 00:00:00 2001 From: rohit-kumar-fullstack Date: Mon, 12 Jan 2026 15:41:31 +0530 Subject: [PATCH] bug fix --- .scannerwork/.sonar_lock | 0 .scannerwork/report-task.txt | 6 + App.tsx | 14 +- android/app/proguard-rules.pro | 3 + index.js | 3 +- package-lock.json | 549 ++++++++++++++++- package.json | 4 + sonar-project.properties | 13 + src/Axios/Axios.ts | 7 +- src/Component/Card/Card.tsx | 9 +- src/Component/Counter/CountdownTimer.tsx | 4 +- src/Component/Header/Header.tsx | 9 +- src/Component/Header/InsideHeader.tsx | 11 +- .../InternetConnectivity.tsx | 4 +- .../InternetConnectivity/ServerDown.tsx | 56 +- src/Component/Loader/Loader.tsx | 1 + src/Component/MyInput.tsx | 106 ++++ src/Component/Serach/SeacrhInput.tsx | 18 +- src/Component/SideDrawer/SideDrawer.tsx | 2 - src/Component/list/AuctionItem.tsx | 54 -- src/Constant/Color.tsx | 4 + src/Helper/DateFormat.tsx | 26 + src/Navigation/Bottom.tsx | 3 + .../Auction/Modal/AuctionItemDetail.tsx | 54 +- src/Screens/Home/Home.tsx | 27 +- src/Screens/Login/Login.tsx | 7 +- .../Tender/Component/EditableExcel.tsx | 187 ++++++ src/Screens/Tender/LiveTender.tsx | 8 +- src/Screens/Tender/ProceedToBidDetail.tsx | 573 +++++------------- src/Screens/Tender/PurchaseTenderTile.tsx | 37 +- src/Services/BBPS/apis.ts | 4 +- src/assets/images/bharatbilllogo2.png | Bin 44515 -> 0 bytes 32 files changed, 1107 insertions(+), 696 deletions(-) create mode 100644 .scannerwork/.sonar_lock create mode 100644 .scannerwork/report-task.txt create mode 100644 sonar-project.properties create mode 100644 src/Component/MyInput.tsx delete mode 100644 src/Component/list/AuctionItem.tsx create mode 100644 src/Helper/DateFormat.tsx create mode 100644 src/Screens/Tender/Component/EditableExcel.tsx delete mode 100644 src/assets/images/bharatbilllogo2.png diff --git a/.scannerwork/.sonar_lock b/.scannerwork/.sonar_lock new file mode 100644 index 0000000..e69de29 diff --git a/.scannerwork/report-task.txt b/.scannerwork/report-task.txt new file mode 100644 index 0000000..7432013 --- /dev/null +++ b/.scannerwork/report-task.txt @@ -0,0 +1,6 @@ +projectKey=procurelinc +serverUrl=http://localhost:9000 +serverVersion=9.9.8.100196 +dashboardUrl=http://localhost:9000/dashboard?id=procurelinc +ceTaskId=AZui1_IJunY9vPNeE5RI +ceTaskUrl=http://localhost:9000/api/ce/task?id=AZui1_IJunY9vPNeE5RI diff --git a/App.tsx b/App.tsx index 7a44767..5e7da2f 100644 --- a/App.tsx +++ b/App.tsx @@ -1,6 +1,6 @@ -import React, { useEffect, useState } from 'react'; +import React from 'react'; import { GestureHandlerRootView } from 'react-native-gesture-handler'; -import { Alert, Linking, LogBox, StatusBar, View } from 'react-native'; +import { LogBox, StatusBar, View } from 'react-native'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { AlertNotificationRoot } from 'react-native-alert-notification'; import { PersistGate } from 'redux-persist/integration/react'; @@ -8,13 +8,14 @@ import { Provider } from 'react-redux'; import { persistor, store } from './src/Redux/Store.js'; import Routes from './src/Navigation/Routes.jsx'; import { NavigationContainer } from '@react-navigation/native'; -import { useSafeAreaInsets } from 'react-native-safe-area-context'; import colors from './src/Constant/Color'; import { TextEncoder } from 'text-encoding'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; LogBox.ignoreAllLogs(true); const App = () => { const queryClient = new QueryClient(); + const insets = useSafeAreaInsets() global.TextEncoder = TextEncoder; return ( @@ -23,11 +24,8 @@ const App = () => { - {/* paddingTop: inset.top + 10, */} - - + + diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro index 11b0257..bc4ff95 100644 --- a/android/app/proguard-rules.pro +++ b/android/app/proguard-rules.pro @@ -8,3 +8,6 @@ # http://developer.android.com/guide/developing/tools/proguard.html # Add any project specific keep options here: + +-keep class com.facebook.hermes.** { *; } +-keep class com.facebook.react.** { *; } \ No newline at end of file diff --git a/index.js b/index.js index 99e0871..86a0f72 100644 --- a/index.js +++ b/index.js @@ -6,7 +6,8 @@ import { AppRegistry } from 'react-native'; import App from './App'; import { name as appName } from './app.json'; import { SafeAreaProvider } from 'react-native-safe-area-context'; - +import { Buffer } from 'buffer'; +global.Buffer = Buffer; const Root = () => ( diff --git a/package-lock.json b/package-lock.json index c549611..33c425c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ "@stomp/stompjs": "^7.2.1", "@tanstack/react-query": "^5.90.12", "axios": "^1.13.2", + "buffer": "^6.0.3", "eslint-config-prettier": "^10.1.8", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-native": "^5.0.0", @@ -33,6 +34,7 @@ "react-native-blob-util": "^0.24.6", "react-native-bouncy-checkbox": "^4.1.2", "react-native-date-picker": "^5.0.13", + "react-native-file-viewer": "^2.1.5", "react-native-fs": "^2.20.0", "react-native-gesture-handler": "^2.30.0", "react-native-gifted-charts": "^1.4.70", @@ -51,6 +53,7 @@ "redux-persist": "^6.0.0", "sockjs-client": "^1.6.1", "text-encoding": "^0.7.0", + "xlsx": "^0.18.5", "yup": "^1.7.1" }, "devDependencies": { @@ -72,6 +75,7 @@ "eslint": "^8.19.0", "jest": "^29.6.3", "prettier": "2.8.8", + "react-native-bundle-visualizer": "^3.1.3", "react-test-renderer": "19.0.0", "typescript": "5.0.4" }, @@ -3041,9 +3045,9 @@ } }, "node_modules/@react-native-documents/picker": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@react-native-documents/picker/-/picker-11.0.3.tgz", - "integrity": "sha512-q+vQNT1NtZcFGwsDpTwMKNNcgOEq6foFDGlPQVt8H7KaEjCjC+wTGdXuVSe8JJr2uO9xZR6kJ7aRHReZ4XDRBw==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@react-native-documents/picker/-/picker-11.0.4.tgz", + "integrity": "sha512-lbwcBwXMwZ5eTvNI6j/HqPjyB87moRCA8k7EoLCXF4KsLNt2jYDBXkUONX/WcMRMyQEaJPWB77W2zMCcRdX4jw==", "license": "MIT", "peerDependencies": { "react": "*", @@ -3933,6 +3937,7 @@ "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.16.tgz", "integrity": "sha512-bpMGOmV4OPmif7TNMteU/Ehf/hoC0Kf98PDc0F4BZkFrEapRMEqI/V6YS0lyzwSV6PQpY1y4xxArUIfBW5LVxQ==", "license": "MIT", + "peer": true, "dependencies": { "@tanstack/query-core": "5.90.16" }, @@ -4403,9 +4408,9 @@ "license": "ISC" }, "node_modules/@vscode/sudo-prompt": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@vscode/sudo-prompt/-/sudo-prompt-9.3.1.tgz", - "integrity": "sha512-9ORTwwS74VaTn38tNbQhsA5U44zkJfcb0BdTSyyG6frP4e8KMtHuTXYmwefe5dpL8XB1aGSIVTaLjD3BbWb5iA==", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@vscode/sudo-prompt/-/sudo-prompt-9.3.2.tgz", + "integrity": "sha512-gcXoCN00METUNFeQOFJ+C9xUI0DKB+0EGMVg7wbVYRHBw2Eq3fKisDZOkRdOz3kqXRKOENMfShPOmypw1/8nOw==", "devOptional": true, "license": "MIT" }, @@ -4465,6 +4470,15 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/adler-32": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", + "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, "node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", @@ -4767,6 +4781,13 @@ "node": ">=4" } }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, "node_modules/async-function": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", @@ -5017,9 +5038,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.9.11", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz", - "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==", + "version": "2.9.13", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.13.tgz", + "integrity": "sha512-WhtvB2NG2wjr04+h77sg3klAIwrgOqnjS49GGudnUPGFFgg7G17y7Qecqp+2Dr5kUDxNRBca0SK7cG8JwzkWDQ==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.js" @@ -5037,6 +5058,31 @@ "readable-stream": "^3.4.0" } }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "devOptional": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/body-parser": { "version": "1.20.4", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", @@ -5150,11 +5196,23 @@ "node-int64": "^0.4.0" } }, + "node_modules/btoa": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "bin": { + "btoa": "bin/btoa.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "devOptional": true, + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -5172,7 +5230,7 @@ "license": "MIT", "dependencies": { "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "ieee754": "^1.2.1" } }, "node_modules/buffer-from": { @@ -5290,9 +5348,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001762", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001762.tgz", - "integrity": "sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==", + "version": "1.0.30001763", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001763.tgz", + "integrity": "sha512-mh/dGtq56uN98LlNX9qdbKnzINhX0QzhiWBFEkFfsFO4QyCvL8YegrJAazCwXIeqkIob8BlZPGM3xdnY+sgmvQ==", "funding": [ { "type": "opencollective", @@ -5309,6 +5367,19 @@ ], "license": "CC-BY-4.0" }, + "node_modules/cfb": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz", + "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", + "license": "Apache-2.0", + "dependencies": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -5474,6 +5545,15 @@ "node": ">= 0.12.0" } }, + "node_modules/codepage": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, "node_modules/collect-v8-coverage": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", @@ -5700,6 +5780,18 @@ } } }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", @@ -5970,6 +6062,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/define-properties": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", @@ -6139,12 +6241,35 @@ "node": ">= 0.4" } }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true, + "license": "MIT" + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/electron-to-chromium": { "version": "1.5.267", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", @@ -7197,6 +7322,29 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -7390,6 +7538,15 @@ "node": ">=0.10.0" } }, + "node_modules/frac": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -7717,6 +7874,22 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "license": "MIT" }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -7916,7 +8089,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "devOptional": true, "funding": [ { "type": "github", @@ -8645,6 +8817,24 @@ "node": ">= 0.4" } }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", @@ -10617,6 +10807,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -11710,12 +11910,100 @@ } }, "node_modules/react-native-bouncy-checkbox": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/react-native-bouncy-checkbox/-/react-native-bouncy-checkbox-4.1.2.tgz", - "integrity": "sha512-hB7YwCGTNoMpTPOPiP+RWyQH35S6vxUbc7IGEW/Rqyp7GonEyhtqtthmxiphneRXnywMh8CZwND7OnvppJZscg==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/react-native-bouncy-checkbox/-/react-native-bouncy-checkbox-4.1.4.tgz", + "integrity": "sha512-JK/ib8nICVhbi6RJpRQwozqEr6mHneAECSHYh6ZreMj8f27t95xiihZPrTF/rVPHWcC3FQm7+eSfgtihMXDncg==", "license": "MIT", "dependencies": { - "@freakycoder/react-native-bounceable": "^1.0.3" + "@freakycoder/react-native-bounceable": "^1.0.3", + "react-native-bouncy-checkbox": "^4.1.2" + } + }, + "node_modules/react-native-bundle-visualizer": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/react-native-bundle-visualizer/-/react-native-bundle-visualizer-3.1.3.tgz", + "integrity": "sha512-FPnrQS3t/WM67S3fBdaQ0pvkpk/ZJOC4nZpiQCHTpjNZTUmbO5vQ4QbAlOpSayHp5n3nu1Ml/KIJaC6R5cwVng==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "execa": "^5.1.1", + "fs-extra": "^10.0.0", + "minimist": "^1.2.5", + "open": "^8.4.0", + "source-map-explorer": "^2.5.3" + }, + "bin": { + "react-native-bundle-visualizer": "src/react-native-bundle-visualizer.js" + } + }, + "node_modules/react-native-bundle-visualizer/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/react-native-bundle-visualizer/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-native-bundle-visualizer/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/react-native-bundle-visualizer/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-native-bundle-visualizer/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" } }, "node_modules/react-native-date-picker": { @@ -11728,6 +12016,15 @@ "react-native": ">= 0.64.3" } }, + "node_modules/react-native-file-viewer": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/react-native-file-viewer/-/react-native-file-viewer-2.1.5.tgz", + "integrity": "sha512-MGC6sx9jsqHdefhVQ6o0akdsPGpkXgiIbpygb2Sg4g4bh7v6K1cardLV1NwGB9A6u1yICOSDT/MOC//9Ez6EUg==", + "license": "MIT", + "peerDependencies": { + "react-native": ">=0.47" + } + }, "node_modules/react-native-fs": { "version": "2.20.0", "resolved": "https://registry.npmjs.org/react-native-fs/-/react-native-fs-2.20.0.tgz", @@ -12870,6 +13167,122 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-explorer": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/source-map-explorer/-/source-map-explorer-2.5.3.tgz", + "integrity": "sha512-qfUGs7UHsOBE5p/lGfQdaAj/5U/GWYBw2imEpD6UQNkqElYonkow8t+HBL1qqIl3CuGZx7n8/CQo4x1HwSHhsg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "btoa": "^1.2.1", + "chalk": "^4.1.0", + "convert-source-map": "^1.7.0", + "ejs": "^3.1.5", + "escape-html": "^1.0.3", + "glob": "^7.1.6", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "open": "^7.3.1", + "source-map": "^0.7.4", + "temp": "^0.9.4", + "yargs": "^16.2.0" + }, + "bin": { + "sme": "bin/cli.js", + "source-map-explorer": "bin/cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/source-map-explorer/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/source-map-explorer/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map-explorer/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-explorer/node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map-explorer/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-explorer/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/source-map-explorer/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -12905,6 +13318,18 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "license": "BSD-3-Clause" }, + "node_modules/ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "license": "Apache-2.0", + "dependencies": { + "frac": "~1.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -13271,6 +13696,47 @@ "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", "license": "CC0-1.0" }, + "node_modules/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/terser": { "version": "5.44.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", @@ -13947,6 +14413,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wmf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/word": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -14001,6 +14485,27 @@ "async-limiter": "~1.0.0" } }, + "node_modules/xlsx": { + "version": "0.18.5", + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz", + "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", + "license": "Apache-2.0", + "dependencies": { + "adler-32": "~1.3.0", + "cfb": "~1.2.1", + "codepage": "~1.15.0", + "crc-32": "~1.2.1", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + }, + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index 9f384ec..bfa183d 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "@stomp/stompjs": "^7.2.1", "@tanstack/react-query": "^5.90.12", "axios": "^1.13.2", + "buffer": "^6.0.3", "eslint-config-prettier": "^10.1.8", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-native": "^5.0.0", @@ -35,6 +36,7 @@ "react-native-blob-util": "^0.24.6", "react-native-bouncy-checkbox": "^4.1.2", "react-native-date-picker": "^5.0.13", + "react-native-file-viewer": "^2.1.5", "react-native-fs": "^2.20.0", "react-native-gesture-handler": "^2.30.0", "react-native-gifted-charts": "^1.4.70", @@ -53,6 +55,7 @@ "redux-persist": "^6.0.0", "sockjs-client": "^1.6.1", "text-encoding": "^0.7.0", + "xlsx": "^0.18.5", "yup": "^1.7.1" }, "devDependencies": { @@ -74,6 +77,7 @@ "eslint": "^8.19.0", "jest": "^29.6.3", "prettier": "2.8.8", + "react-native-bundle-visualizer": "^3.1.3", "react-test-renderer": "19.0.0", "typescript": "5.0.4" }, diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 0000000..934b69d --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,13 @@ +# Required project identifiers +sonar.projectKey=procurelinc +sonar.projectName=ProcureLinc +sonar.projectVersion=1.0 + +# Source configuration +sonar.sources=. + +# SonarQube server +sonar.host.url=http://localhost:9000 + +# Authentication token +sonar.login=sqp_da89e447c964b6e91e142777097e25fa2f17a1cc diff --git a/src/Axios/Axios.ts b/src/Axios/Axios.ts index 67aa1be..e6285cb 100644 --- a/src/Axios/Axios.ts +++ b/src/Axios/Axios.ts @@ -1,5 +1,4 @@ import axios from 'axios'; -import { NavigationString, showErrorAlert, Variable } from '../Constant/AllImports'; import { setToken } from '../Redux/Slices/Token'; import { store } from '../Redux/Store'; @@ -12,24 +11,20 @@ export const apiCall = async ( ): Promise => { try { const token: any = store.getState().token.token; - const response = await axios({ method, url, data, params, - // withCredentials: true, - // baseURL: Variable.Main_Base, headers: { Authentication: `Bearer ${token?.token}`, 'Content-Type': contentType || 'application/json', }, }); - return response.data; } catch (error: any) { const errorMessage = error?.response?.data?.error; - { error?.response?.data?.error && showErrorAlert(error?.response?.data?.error || '') } + console.log(errorMessage, '---------------------------api error message'); if (error?.response?.status === 401) { store.dispatch(setToken({})); diff --git a/src/Component/Card/Card.tsx b/src/Component/Card/Card.tsx index 238a07c..8184491 100644 --- a/src/Component/Card/Card.tsx +++ b/src/Component/Card/Card.tsx @@ -1,12 +1,5 @@ import React, { FC, useRef, useEffect } from 'react'; -import { - StyleSheet, - Text, - View, - TouchableOpacity, - Animated, - Platform, -} from 'react-native'; +import { StyleSheet, Text, View, TouchableOpacity, Animated, Platform } from 'react-native'; import LinearGradient from 'react-native-linear-gradient'; import { BlurView } from '@react-native-community/blur'; import colors from '../../Constant/Color'; diff --git a/src/Component/Counter/CountdownTimer.tsx b/src/Component/Counter/CountdownTimer.tsx index 62eef69..e979451 100644 --- a/src/Component/Counter/CountdownTimer.tsx +++ b/src/Component/Counter/CountdownTimer.tsx @@ -7,10 +7,10 @@ import LottieView from 'lottie-react-native'; interface CountdownTimerProps { endDate: string; myStyle?: any - size?: number // Expected format: "DD-MM-YYYY HH:mm:ss" + size?: number } -const CountdownTimer: React.FC = React.memo(({ endDate, myStyle = {}, size = 20 }) => { +const CountdownTimer: React.FC = React.memo(({ endDate, myStyle = {}, size = 20 }) => { const calculateTimeLeft = useCallback(() => { if (!endDate) return null; diff --git a/src/Component/Header/Header.tsx b/src/Component/Header/Header.tsx index b427fba..1d663c5 100644 --- a/src/Component/Header/Header.tsx +++ b/src/Component/Header/Header.tsx @@ -1,12 +1,5 @@ import React, { useState } from 'react'; -import { - View, - Text, - TouchableOpacity, - Image, - StyleSheet, - Dimensions, -} from 'react-native'; +import { View, Text, TouchableOpacity, Image, StyleSheet, Dimensions } from 'react-native'; import LinearGradient from 'react-native-linear-gradient'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { Menu } from 'lucide-react-native'; diff --git a/src/Component/Header/InsideHeader.tsx b/src/Component/Header/InsideHeader.tsx index 5314581..8c75d86 100644 --- a/src/Component/Header/InsideHeader.tsx +++ b/src/Component/Header/InsideHeader.tsx @@ -1,12 +1,5 @@ import React from 'react'; -import { - View, - Text, - TouchableOpacity, - Image, - StyleSheet, - Dimensions, -} from 'react-native'; +import { View, Text, TouchableOpacity, Image, StyleSheet, Dimensions } from 'react-native'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { ArrowLeft } from 'lucide-react-native'; import colors from '../../Constant/Color'; @@ -23,7 +16,7 @@ interface HeaderProps { } const InsideHeader: React.FC = ({ title, showArrow = false }) => { - const navigation:any = useNavigation(); + const navigation: any = useNavigation(); const insets = useSafeAreaInsets(); return ( diff --git a/src/Component/InternetConnectivity/InternetConnectivity.tsx b/src/Component/InternetConnectivity/InternetConnectivity.tsx index f424b25..18ff903 100644 --- a/src/Component/InternetConnectivity/InternetConnectivity.tsx +++ b/src/Component/InternetConnectivity/InternetConnectivity.tsx @@ -1,10 +1,8 @@ import React from "react"; -import { View, Text, StyleSheet, TouchableOpacity, Dimensions } from "react-native"; +import { View, Text, StyleSheet, TouchableOpacity } from "react-native"; import LottieView from "lottie-react-native"; import LinearGradient from "react-native-linear-gradient"; -const { width } = Dimensions.get("window"); - const InternetConnectivity = () => { return ( diff --git a/src/Component/InternetConnectivity/ServerDown.tsx b/src/Component/InternetConnectivity/ServerDown.tsx index c382d76..40e0923 100644 --- a/src/Component/InternetConnectivity/ServerDown.tsx +++ b/src/Component/InternetConnectivity/ServerDown.tsx @@ -1,42 +1,16 @@ import React from 'react'; -import { - View, - Text, - StyleSheet, - TouchableOpacity, - Dimensions, - ScrollView, - StatusBar, -} from 'react-native'; +import { View, Text, StyleSheet, TouchableOpacity, Dimensions, ScrollView, StatusBar } from 'react-native'; import LottieView from 'lottie-react-native'; import LinearGradient from 'react-native-linear-gradient'; -import { - AlertCircle, - Clock, - Server, - Calendar, - RefreshCw, - MessageCircle, - Twitter, - Activity, - MessageSquare, - Bell, - WifiOff, -} from 'lucide-react-native'; -import Colors from '../../Styles/Color'; +import { AlertCircle, Clock, RefreshCw, Activity } from 'lucide-react-native'; +import colors from '../../Constant/Color'; import FontsFamily from '../../Constant/FontsFamily'; -const {width} = Dimensions.get('window'); const ServerDown = () => { return ( <> - - + @@ -81,12 +55,12 @@ const ServerDown = () => { {}} + onPress={() => { }} style={styles.touchable}> void; + isVarify?: boolean; + maxlength?: number; + onFocus?: () => void; + onBlur?: () => void; + focused?: boolean; + keyboardType?: TextInputProps['keyboardType']; + editable?: boolean; + autoCapitalize?: TextInputProps['autoCapitalize']; + rightIcon?: string, + rightIconPress?: () => void +} & TextInputProps; + +const MyInput: React.FC = ({ + icon, + placeholder, + value, + onChangeText, + isVarify, + maxlength, + onFocus, + onBlur, + focused, + keyboardType, + editable = true, + autoCapitalize, + rightIcon, + rightIconPress, + ...textInputProps +}) => { + return ( + + {/* */} + + { + rightIcon ? + + + + : null} + + ); +}; + +export default MyInput; +const styles = StyleSheet.create({ + inputWrapper: { + flex: 1, + flexDirection: 'row', + alignItems: 'center', + backgroundColor: '#fff', + borderRadius: 12, + borderWidth: 1, + borderColor: '#e0e0e0', + paddingHorizontal: 10, + marginVertical: 10, + height: 55, + + }, + icon: { + marginRight: 10, + }, + input: { + flex: 1, + fontSize: 15, + color: '#000', + paddingVertical: 0, + }, + inputFocused: { + borderColor: '#007BFF', + }, + inputDisabled: { + backgroundColor: '#f2f2f2', + }, +}); diff --git a/src/Component/Serach/SeacrhInput.tsx b/src/Component/Serach/SeacrhInput.tsx index da365c7..5f66aa0 100644 --- a/src/Component/Serach/SeacrhInput.tsx +++ b/src/Component/Serach/SeacrhInput.tsx @@ -1,12 +1,7 @@ import { Filter, Search } from "lucide-react-native"; import React from "react"; import { View, Text, TextInput, StyleSheet, TouchableOpacity, Platform } from "react-native"; -import Animated, { - useAnimatedStyle, - useSharedValue, - withTiming, - interpolateColor -} from "react-native-reanimated"; +import Animated, { useAnimatedStyle, useSharedValue, withTiming, interpolateColor } from "react-native-reanimated"; import colors from "../../Constant/Color"; export interface SearchType { @@ -19,21 +14,14 @@ export interface SearchType { const AnimatedView = Animated.createAnimatedComponent(View); -export const SearchInput: React.FC = ({ - placeholder, - onChange, - label, - filter = true, - filterPress -}) => { +export const SearchInput: React.FC = ({ placeholder, onChange, label, filter = true, filterPress }) => { const isFocused = useSharedValue(0); - // Animate border color and shadow based on focus const inputContainerStyle = useAnimatedStyle(() => { const borderColor = interpolateColor( isFocused.value, [0, 1], - [colors.grayText + '50', colors.grayText] // Assuming colors.primary exists + [colors.grayText + '50', colors.grayText] ); return { diff --git a/src/Component/SideDrawer/SideDrawer.tsx b/src/Component/SideDrawer/SideDrawer.tsx index 0771965..03bd8f4 100644 --- a/src/Component/SideDrawer/SideDrawer.tsx +++ b/src/Component/SideDrawer/SideDrawer.tsx @@ -143,8 +143,6 @@ const SideDrawer: React.FC = ({ visible, onClose }) => { export default SideDrawer; -/* ================= Styles ================= */ - const styles = StyleSheet.create({ modal: { margin: 0, diff --git a/src/Component/list/AuctionItem.tsx b/src/Component/list/AuctionItem.tsx deleted file mode 100644 index 34b53f4..0000000 --- a/src/Component/list/AuctionItem.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import React, { useEffect, useRef } from 'react'; -import { Animated, Text, StyleSheet } from 'react-native'; -import colors from '../../Constant/Color'; - -interface AuctionItemProps { - item: any; - index: number; -} - -const AuctionItem: React.FC = ({ item, index }) => { - const scale = useRef(new Animated.Value(0)).current; - - useEffect(() => { - Animated.spring(scale, { - toValue: 1, - friction: 8, - useNativeDriver: true, - delay: index * 50, - }).start(); - }, []); - - return ( - - {item.title || `${item.auctionNumber}`} - End Date: {item.purchaseEnd || 'N/A'} - - ); -}; - -export default AuctionItem; - -const styles = StyleSheet.create({ - itemCard: { - backgroundColor: '#fff', - padding: 18, - borderRadius: 16, - marginBottom: 14, - shadowColor: '#000', - shadowOffset: { width: 0, height: 4 }, - shadowOpacity: 0.12, - shadowRadius: 8, - elevation: 4, - }, - itemTitle: { - fontSize: 16, - fontWeight: '700', - marginBottom: 4, - color: '#020617', - }, - itemDate: { - fontSize: 13, - color: '#64748b', - }, -}); diff --git a/src/Constant/Color.tsx b/src/Constant/Color.tsx index 1e95689..7f2a093 100644 --- a/src/Constant/Color.tsx +++ b/src/Constant/Color.tsx @@ -34,6 +34,10 @@ const colors = { Orange: '#F97316', OrangeLight: '#FDBA74', OrangeSoft: '#FFF3E8', + + darkGray: '#5f6368', + lightestGray: '#f1f3f4', + successLight: '#e6f4ea', }; export default colors; diff --git a/src/Helper/DateFormat.tsx b/src/Helper/DateFormat.tsx new file mode 100644 index 0000000..248e00d --- /dev/null +++ b/src/Helper/DateFormat.tsx @@ -0,0 +1,26 @@ +import moment from 'moment'; + +export const format = { + // Internal helper to safely parse any input + parse: (date: string | Date) => { + if (!date) return null; + let d = date; + if (typeof date === 'string') { + // Replace IST or other known timezone abbreviations with UTC offset + d = date.replace('IST', '+0530'); + } + return moment(d); + }, + + date1: (date: string | Date) => format.parse(date)?.format('DD-MM-YYYY'), + date2: (date: string | Date) => format.parse(date)?.format('YYYY-MM-DD'), + date3: (date: string | Date) => format.parse(date)?.format('MMMM Do, YYYY'), + date4: (date: string | Date) => format.parse(date)?.format('dddd, MMMM Do YYYY'), + date5: (date: string | Date) => format.parse(date)?.format('MM/DD/YYYY'), + date6: (date: string | Date) => format.parse(date)?.format('YYYY/MM/DD HH:mm'), + time1: (date: string | Date) => format.parse(date)?.format('hh:mm A'), + time2: (date: string | Date) => format.parse(date)?.format('HH:mm:ss'), + iso: (date: string | Date) => format.parse(date)?.toISOString(), + fromNow: (date: string | Date) => format.parse(date)?.fromNow(), + custom: (date: string | Date, formatStr: string) => format.parse(date)?.format(formatStr), +}; diff --git a/src/Navigation/Bottom.tsx b/src/Navigation/Bottom.tsx index c1904ed..e413a66 100644 --- a/src/Navigation/Bottom.tsx +++ b/src/Navigation/Bottom.tsx @@ -12,6 +12,7 @@ import * as LucideIcons from 'lucide-react-native'; import Screens from '../Screens'; import colors from '../Constant/Color'; import NavigationString from '../Constant/NavigationString'; +import EditableExcel from '../Screens/Tender/Component/EditableExcel'; const { width } = Dimensions.get('window'); const TAB_BAR_HEIGHT = 60; @@ -24,6 +25,7 @@ const TabButton = ({ route, isFocused, onPress }: any) => { Home: { outline: "Home", filled: "Home" }, Auction: { outline: "Gavel", filled: "Gavel" }, Tender: { outline: "FileText", filled: "FileText" }, + EditableExcel: { outline: "FileText", filled: "FileText" }, }; const IconName = LucideIcons[isFocused ? icons[route.name].filled : icons[route.name].outline]; const scaleAnim = useRef(new Animated.Value(1)).current; @@ -146,6 +148,7 @@ export default function BottomTab() { + ); diff --git a/src/Screens/Auction/Modal/AuctionItemDetail.tsx b/src/Screens/Auction/Modal/AuctionItemDetail.tsx index af69b23..876b2c2 100644 --- a/src/Screens/Auction/Modal/AuctionItemDetail.tsx +++ b/src/Screens/Auction/Modal/AuctionItemDetail.tsx @@ -1,5 +1,5 @@ import React, { memo, useState } from 'react'; -import { View, Text, StyleSheet, TouchableOpacity, ScrollView, Platform, Dimensions } from 'react-native'; +import { View, Text, StyleSheet, TouchableOpacity, ScrollView, Platform } from 'react-native'; import Modal from 'react-native-modal'; import { Package, IndianRupee, FileText, Download, ArrowLeft, Info, } from 'lucide-react-native'; import colors from '../../../Constant/Color'; @@ -11,31 +11,30 @@ import { Loader } from '../../../Component/Index'; interface Props { visible: boolean; onClose: () => void; data?: any; } +const Section = ({ title, icon: Icon, children }: any) => ( + + + + + + {title} + + {children} + +); + +const PriceTile = ({ label, fig, words, full = false }: any) => ( + + {label} + ₹{Number(fig).toLocaleString('en-IN')} + {words} + +); const AuctionItemDetail: React.FC = ({ visible, onClose, data }) => { const inset = useSafeAreaInsets() const [allBoolean, setAllBoolean] = useState({ fileLoading: false }); const { data: itemData } = useAucitonItemDetail({ auctionItemId: data.id }); - const Section = ({ title, icon: Icon, children }: any) => ( - - - - - - {title} - - {children} - - ); - - const PriceTile = ({ label, fig, words, full = false }: any) => ( - - {label} - ₹{Number(fig).toLocaleString('en-IN')} - {words} - - ); - const handleDownload = async (id: number, fileName: string) => { try { setAllBoolean((prev: any) => ({ ...prev, fileLoading: true })); @@ -79,6 +78,7 @@ const AuctionItemDetail: React.FC = ({ visible, onClose, data }) => { setAllBoolean((prev: any) => ({ ...prev, fileLoading: false })); } }; + console.log(data, 'kkkkk---'); return ( = ({ visible, onClose, data }) => {
@@ -165,7 +165,7 @@ const AuctionItemDetail: React.FC = ({ visible, onClose, data }) => { {itemData?.map((doc: any, index: any) => ( - { handleDownload(doc.assetId, doc.fileName) }} key={index}> + { handleDownload(doc.assetId, doc.fileName) }} key={doc.assetId}> {index + 1} {doc.fileName} diff --git a/src/Screens/Home/Home.tsx b/src/Screens/Home/Home.tsx index 8b1cfe7..df9cdb6 100644 --- a/src/Screens/Home/Home.tsx +++ b/src/Screens/Home/Home.tsx @@ -1,30 +1,9 @@ import React, { useEffect } from 'react'; -import { - View, - Text, - StyleSheet, - Dimensions, - FlatList, - ActivityIndicator, -} from 'react-native'; -import Animated, { - useSharedValue, - useAnimatedStyle, - withDelay, - withTiming, -} from 'react-native-reanimated'; -import { - Layers, - Clock, - ShoppingCart, - X, - FileText, -} from 'lucide-react-native'; +import { View, Text, StyleSheet, Dimensions, FlatList, ActivityIndicator } from 'react-native'; +import Animated, { useSharedValue, useAnimatedStyle, withDelay, withTiming } from 'react-native-reanimated'; +import { Layers, Clock, ShoppingCart, X, FileText } from 'lucide-react-native'; import { Header } from '../../Component/Index'; import colors from '../../Constant/Color'; -import { useWebSocketService } from '../../socket/Socket'; -import Variables from '../../Constant/Variable'; -import { useFocusEffect } from '@react-navigation/native'; import { useDashboard } from '../../Services/BBPS/Hooks'; const { width } = Dimensions.get('window'); diff --git a/src/Screens/Login/Login.tsx b/src/Screens/Login/Login.tsx index 4bb4af1..cff662c 100644 --- a/src/Screens/Login/Login.tsx +++ b/src/Screens/Login/Login.tsx @@ -1,5 +1,5 @@ import React, { useState } from 'react'; -import { View, Text, Dimensions, TextInput, TouchableOpacity, StyleSheet, StatusBar, KeyboardAvoidingView, Platform, ScrollView } from 'react-native'; +import { View, Text, Dimensions, TextInput, TouchableOpacity, StyleSheet, KeyboardAvoidingView, Platform, ScrollView } from 'react-native'; import LinearGradient from 'react-native-linear-gradient'; import { Formik } from 'formik'; import * as Yup from 'yup'; @@ -31,14 +31,13 @@ const Login = () => { const Dispatch = useDispatch() const [passwordVisible, setPasswordVisible] = React.useState(false); const [loading, setLoading] = useState(false) - const { mutate, isPending } = useLogin() + const { mutate } = useLogin() const HandleLogin = async (values: any) => { setLoading(true) mutate({ password: values.password, emailAdd: values.email }, { onSuccess: (res) => { if (res.statusCode == 200) { - console.log("login token : ", res) Dispatch(setToken({ ...res.data, token: res.token })) Navigation.dispatch( CommonActions.reset({ @@ -153,7 +152,7 @@ const Login = () => { style={styles.button} > { - loading ? : <> + loading ? : <> Sign In } diff --git a/src/Screens/Tender/Component/EditableExcel.tsx b/src/Screens/Tender/Component/EditableExcel.tsx new file mode 100644 index 0000000..fd01fb3 --- /dev/null +++ b/src/Screens/Tender/Component/EditableExcel.tsx @@ -0,0 +1,187 @@ +import React, { useEffect, useState } from 'react'; +import { + View, + Text, + TextInput, + ScrollView, + TouchableOpacity, + StyleSheet, + ActivityIndicator, + Alert, +} from 'react-native'; +import RNFS from 'react-native-fs'; +import * as XLSX from 'xlsx'; +import axios from 'axios'; + +const EXCEL_API_URL = 'https://procurelinc.in/EProcurementSB/eTendering/getEnvelopeCTemplate/tenderId'; + +const EnvelopeCExcelPreview = () => { + const [data, setData] = useState([]); + const [columns, setColumns] = useState([]); + const [loading, setLoading] = useState(false); + + useEffect(() => { + loadExcelFromApi(); + }, []); + + // 📥 FETCH EXCEL BLOB + READ + const loadExcelFromApi = async () => { + try { + setLoading(true); + + const urlWithParams = `${EXCEL_API_URL}?tenderId=2479`; + + // ⬇️ Fetch Excel as blob + const response = await axios.get(urlWithParams, { + responseType: 'arraybuffer', + headers: { + Authorization: `Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJBQklOVE9QUE85NkBHTUFJTC5DT00iLCJpYXQiOjE3Njc5MzgzMDMsImV4cCI6MTc2Nzk3NDMwM30.NiT5iOIdQH0y8TutLfLVp9ApQIAI3NHbkmRjb1fl-JlGxeyX21n3oPGvU6sDw_uU9iTZHI183e2FH_IL2sZYpQ`, + }, + }); + console.log(response, '--------------------------------------'); + + // ⬇️ Save file locally + const filePath = `${RNFS.DocumentDirectoryPath}/envelopeC.xlsx`; + const buffer = Buffer.from(response.data, 'binary'); // convert arraybuffer to buffer + await RNFS.writeFile(filePath, buffer.toString('base64'), 'base64'); + + // 📖 Read Excel + const workbook = XLSX.readFile(filePath); + const sheet = workbook.Sheets[workbook.SheetNames[0]]; + const jsonData: any[] = XLSX.utils.sheet_to_json(sheet, { defval: '' }); + + setData(jsonData); + setColumns(Object.keys(jsonData[0] || {})); + } catch (error: any) { + console.log('Excel load error:', error); + Alert.alert('Error', error.message || 'Unable to load Excel'); + } finally { + setLoading(false); + } + }; + + // ✏️ UPDATE CELL + const updateCell = (rowIndex: number, key: string, value: string) => { + const updated = [...data]; + updated[rowIndex][key] = value; + setData(updated); + }; + + // 💾 SAVE UPDATED EXCEL (LOCAL) + const saveUpdatedExcel = async () => { + try { + setLoading(true); + + const worksheet = XLSX.utils.json_to_sheet(data); + const workbook = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); + + const base64Excel = XLSX.write(workbook, { bookType: 'xlsx', type: 'base64' }); + const updatedPath = `${RNFS.DocumentDirectoryPath}/envelopeC_updated.xlsx`; + + await RNFS.writeFile(updatedPath, base64Excel, 'base64'); + + Alert.alert('Success', 'Updated Excel saved successfully'); + console.log('Saved at:', updatedPath); + } catch (error) { + console.log('Save error:', error); + Alert.alert('Error', 'Failed to save Excel'); + } finally { + setLoading(false); + } + }; + + if (loading) { + return ( + + + + ); + } + + return ( + + Envelope-C Excel Preview + + + + {/* HEADER */} + + {columns.map(col => ( + + {col} + + ))} + + + {/* DATA */} + + {data.map((row, rowIndex) => ( + + {columns.map(key => ( + updateCell(rowIndex, key, text)} + /> + ))} + + ))} + + + + + + Save Updated Excel + + + ); +}; + +export default EnvelopeCExcelPreview; + +const styles = StyleSheet.create({ + container: { + flex: 1, + padding: 16, + backgroundColor: '#fff', + }, + loader: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + }, + title: { + fontSize: 18, + fontWeight: '700', + marginBottom: 10, + }, + row: { + flexDirection: 'row', + }, + headerCell: { + minWidth: 140, + padding: 10, + backgroundColor: '#f1f5f9', + borderWidth: 1, + fontWeight: '700', + }, + cell: { + minWidth: 140, + padding: 10, + borderWidth: 1, + borderColor: '#cbd5e1', + }, + button: { + marginTop: 15, + backgroundColor: '#2563eb', + padding: 14, + borderRadius: 8, + }, + buttonText: { + color: '#fff', + textAlign: 'center', + fontWeight: '600', + }, +}); diff --git a/src/Screens/Tender/LiveTender.tsx b/src/Screens/Tender/LiveTender.tsx index 3e48882..e851113 100644 --- a/src/Screens/Tender/LiveTender.tsx +++ b/src/Screens/Tender/LiveTender.tsx @@ -57,8 +57,8 @@ const LiveTender = () => { tenderOfWork={item.departmentName} tenderFees={item.documentFees} tenderNumber={item.tenderNumber} - // onPurchasePress={() => { Dispatch(togglePurchaseTender(item)) }} - // onDetailsPress={() => navigation.navigate('LiveTenderDetail', {item})} + onPurchasePress={() => { Dispatch(togglePurchaseTender(item)) }} + onDetailsPress={() => navigation.navigate('LiveTenderDetail', { item })} /> }, [SelectedPurchaseList] @@ -104,7 +104,7 @@ const LiveTender = () => { fontWeight: '500', }} > - Refreshing auctions + Refreshing Tender )} @@ -122,7 +122,7 @@ const LiveTender = () => { } diff --git a/src/Screens/Tender/ProceedToBidDetail.tsx b/src/Screens/Tender/ProceedToBidDetail.tsx index 086ef56..3fdc842 100644 --- a/src/Screens/Tender/ProceedToBidDetail.tsx +++ b/src/Screens/Tender/ProceedToBidDetail.tsx @@ -1,97 +1,94 @@ -import { StyleSheet, Text, View, ScrollView, StatusBar, TouchableOpacity } from 'react-native' -import React from 'react' -import { InsideHeader } from '../../Component/Index' -import colors from '../../Constant/Color' -import { useNavigation, useRoute } from '@react-navigation/native' -import { useProceedToBid } from '../../Services/BBPS/Hooks' +import { StyleSheet, Text, View, ScrollView, TouchableOpacity } from 'react-native'; +import React from 'react'; +import { InsideHeader } from '../../Component/Index'; +import colors from '../../Constant/Color'; +import { useNavigation, useRoute } from '@react-navigation/native'; +import { useProceedToBid } from '../../Services/BBPS/Hooks'; +import { format } from '../../Helper/DateFormat'; +import FontsFamily from '../../Constant/FontsFamily'; const ProceedToBidDetail = () => { - // Sample data based on your JSON - const route = useRoute() + const route: any = useRoute(); const tenderData = route.params?.tender; - const {data, refetch} = useProceedToBid(tenderData?.tenderId); - - const navigation = useNavigation() - // Format date from array + const navigation = useNavigation(); + const { data, refetch } = useProceedToBid(tenderData?.tenderId); const handleStartBidding = () => { refetch(); if (data) { - navigation.navigate('TenderBidding', { tenderData: tenderData , bidData: data.data }); + navigation.navigate('TenderBidding', { tenderData: tenderData, bidData: data.data }); } - } - const formatDate = (dateArray: any[]) => { - if (!dateArray || dateArray.length < 3) return "N/A"; - const [year, month, day, hour = 0, minute = 0] = dateArray; - return `${day.toString().padStart(2, '0')}/${month.toString().padStart(2, '0')}/${year} ${hour.toString().padStart(2, '0')}:${minute.toString().padStart(2, '0')}`; }; // Status indicator component - const StatusIndicator = ({ status, label }) => ( + const StatusIndicator = ({ status, label }: { status: any, label: string }) => ( - + {label}: {status ? "Submitted" : "Not Submitted"} ); // Envelope log card component - const EnvelopeLogCard = ({ log, title }) => ( - - - {title} - - {log?.envelope} + const EnvelopeLogCard = ({ log, title }: { log: any, title: string }) => { + + return ( + + + {title} + + {log?.envelope} + - - - Activity: - {log?.activity} - - - - Date & Time: - {log?.dateTime} - - - - System Info: - {log?.osName} / {log?.browserName} - - - - IP Address: - {log?.ipAddress} - - - - Status Message: - {log?.logMessage} - - - {log?.headingMsg && ( - Heading: - {log?.headingMsg} + Activity: + {log?.activity} - )} - - ); + + + Date & Time: + {format.date6(log?.dateTime)} + + + + System Info: + {log?.osName} / {log?.browserName} + + + + IP Address: + {log?.ipAddress} + + + + Status Message: + {log?.logMessage} + + + {log?.headingMsg && ( + + Heading: + {log?.headingMsg} + + )} + + ) + } // Information row component - const InfoRow = ({ label, value, isHighlighted = false }) => ( + const InfoRow = ({ label, value, isHighlighted = false }: { label: string, value: string, isHighlighted?: boolean }) => ( - {label}: - {value} + {label}: + {value} ); // Feature chip component - const FeatureChip = ({ label, enabled }) => ( + const FeatureChip = ({ label, enabled }: { label: string, enabled: boolean }) => ( - + {label} {enabled ? '✓' : '✗'} @@ -99,42 +96,41 @@ const ProceedToBidDetail = () => { return ( - - - {/* Tender Header Section */} + + {/* Tender Header */} - {tenderData.tenderNumber} - ID: {tenderData.tenderId} + {tenderData.tenderNumber} + ID: {tenderData.tenderId} - + {tenderData.biddingStatus ? "Active" : "Inactive"} - {tenderData.nameofWork} + {tenderData.nameofWork} - NIT No. - {tenderData.nitNo} + NIT No. + {tenderData.nitNo} - EMD Amount - ₹{tenderData.emdInFig} + EMD Amount + ₹{tenderData.emdInFig} - {/* Envelope Submission Status */} + {/* Envelope Status */} - Envelope Submission Status + {`Envelope Submission Status`} @@ -142,10 +138,10 @@ const ProceedToBidDetail = () => { - {/* Envelope Logs */} + {/* Logs */} {tenderData.envelopeA_Logs && ( - Submission Logs + Submission Logs @@ -154,7 +150,7 @@ const ProceedToBidDetail = () => { {/* Tender Details */} - Tender Details + Tender Details @@ -164,24 +160,24 @@ const ProceedToBidDetail = () => { - {/* Time Period */} + {/* Submission Time */} - Submission Time Period + Submission Time Period - Starts On: - {formatDate(tenderData.submittedStartDate)} + Starts On: + {format.date6(tenderData.submittedStartDate)} - Ends On: - {formatDate(tenderData.submittedEndDate)} + Ends On: + {format.date6(tenderData.submittedEndDate)} - {/* Feature Flags */} + {/* Feature Chips */} - Available Features + Available Features @@ -192,362 +188,93 @@ const ProceedToBidDetail = () => { - {/* Final Status */} + {/* Overall Status */} - Overall Status + Overall Status - All Envelopes Submitted: - All Envelopes Submitted: + - {tenderData.envelopeASubmittStatus && tenderData.envelopeBSubmittStatus && tenderData.envelopeCSubmittStatus - ? "COMPLETED" : "PENDING"} + {tenderData.envelopeASubmittStatus && tenderData.envelopeBSubmittStatus && tenderData.envelopeCSubmittStatus ? "COMPLETED" : "PENDING"} - Bidding Status: - + Bidding Status: + {tenderData.biddingStatus ? "ACTIVE" : "CLOSED"} - - - + {/* Footer */} { tenderData?.proceedtoBid && !tenderData?.viewBid && tenderData?.biddingStatus && tenderData?.bidWithdrawStatus === false ? ( - - Start Bidding + Start Bidding - - ) : One time bidding is completed - } + ) : One time bidding is completed + } + + ); +}; - ) -} - -export default ProceedToBidDetail +export default ProceedToBidDetail; +// Styles remain mostly unchanged but improved shadows, spacing, and rounded corners const styles = StyleSheet.create({ - container: { - flex: 1, - padding: 16, - marginBottom: 60, - }, - headerCard: { - backgroundColor: colors.primaryLight, - borderRadius: 12, - padding: 20, - marginBottom: 20, - borderLeftWidth: 4, - borderLeftColor: colors.primary, - }, - tenderHeader: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - marginBottom: 12, - }, - tenderNumber: { - fontSize: 22, - fontWeight: 'bold', - color: colors.primary, - }, - tenderId: { - fontSize: 14, - color: colors.darkGray, - marginTop: 4, - }, - statusBadge: { - paddingHorizontal: 12, - paddingVertical: 6, - borderRadius: 20, - }, - statusBadgeText: { - color: colors.white, - fontWeight: '600', - fontSize: 12, - }, - workDescription: { - fontSize: 16, - color: colors.darkText, - lineHeight: 22, - marginBottom: 16, - }, - headerInfoRow: { - flexDirection: 'row', - alignItems: 'center', - backgroundColor: colors.white, - borderRadius: 8, - padding: 12, - }, - headerInfoItem: { - flex: 1, - alignItems: 'center', - }, - headerInfoLabel: { - fontSize: 12, - color: colors.darkGray, - marginBottom: 4, - }, - headerInfoValue: { - fontSize: 16, - fontWeight: '600', - color: colors.primary, - }, - separator: { - width: 1, - height: 30, - backgroundColor: colors.lightGray, - }, - section: { - marginBottom: 20, - }, - sectionTitle: { - fontSize: 18, - fontWeight: '600', - color: colors.primary, - marginBottom: 12, - paddingLeft: 4, - }, - statusGrid: { - backgroundColor: colors.white, - borderRadius: 12, - padding: 16, - shadowColor: '#000', - shadowOffset: { width: 0, height: 2 }, - shadowOpacity: 0.1, - shadowRadius: 4, - elevation: 3, - }, - statusContainer: { - flexDirection: 'row', - alignItems: 'center', - marginBottom: 12, - }, - statusDot: { - width: 12, - height: 12, - borderRadius: 6, - marginRight: 10, - }, - statusText: { - fontSize: 15, - fontWeight: '500', - }, - envelopeCard: { - backgroundColor: colors.white, - borderRadius: 12, - padding: 16, - marginBottom: 12, - borderWidth: 1, - borderColor: colors.lightGray, - }, - cardHeader: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - marginBottom: 12, - }, - cardTitle: { - fontSize: 16, - fontWeight: '600', - color: colors.primary, - }, - envelopeBadge: { - paddingHorizontal: 10, - paddingVertical: 4, - borderRadius: 12, - }, - envelopeBadgeText: { - color: colors.white, - fontWeight: 'bold', - fontSize: 12, - }, - logDetailRow: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - marginBottom: 8, - }, - label: { - fontSize: 14, - color: colors.darkGray, - flex: 1, - }, - value: { - fontSize: 14, - color: colors.darkText, - fontWeight: '500', - flex: 2, - textAlign: 'right', - }, - successText: { - color: colors.success, - fontWeight: '600', - }, - detailsCard: { - backgroundColor: colors.white, - borderRadius: 12, - padding: 16, - shadowColor: '#000', - shadowOffset: { width: 0, height: 2 }, - shadowOpacity: 0.1, - shadowRadius: 4, - elevation: 3, - }, - infoRow: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - paddingVertical: 10, - borderBottomWidth: 1, - borderBottomColor: colors.lightestGray, - }, - infoLabel: { - fontSize: 14, - color: colors.darkGray, - }, - infoValue: { - fontSize: 15, - fontWeight: '500', - color: colors.darkText, - }, - highlightedValue: { - color: colors.success, - fontWeight: '600', - }, - timeCard: { - backgroundColor: colors.white, - borderRadius: 12, - padding: 16, - shadowColor: '#000', - shadowOffset: { width: 0, height: 2 }, - shadowOpacity: 0.1, - shadowRadius: 4, - elevation: 3, - }, - timeRow: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - paddingVertical: 12, - borderBottomWidth: 1, - borderBottomColor: colors.lightestGray, - }, - timeLabel: { - fontSize: 15, - color: colors.darkGray, - fontWeight: '500', - }, - timeValue: { - fontSize: 15, - color: colors.primary, - fontWeight: '600', - }, - chipsContainer: { - flexDirection: 'row', - flexWrap: 'wrap', - gap: 10, - }, - chip: { - paddingHorizontal: 16, - paddingVertical: 8, - borderRadius: 20, - marginBottom: 8, - }, - chipText: { - fontSize: 14, - fontWeight: '500', - }, - finalStatusCard: { - backgroundColor: colors.primaryLight, - borderRadius: 12, - padding: 20, - marginTop: 10, - borderWidth: 2, - borderColor: colors.primary, - }, - finalStatusTitle: { - fontSize: 18, - fontWeight: 'bold', - color: colors.primary, - marginBottom: 16, - textAlign: 'center', - }, - finalStatusRow: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - marginBottom: 12, - paddingVertical: 8, - borderBottomWidth: 1, - borderBottomColor: 'rgba(0, 0, 0, 0.1)', - }, - finalStatusLabel: { - fontSize: 16, - color: colors.darkText, - fontWeight: '500', - }, - finalStatusValue: { - fontSize: 16, - fontWeight: 'bold', - }, - footerSpace: { - height: 30, - }, - success: { - color: colors.success, - }, - error: { - color: colors.error, - }, - primary: { - color: colors.primary, - }, - warning: { - color: colors.warning, - }, - successLight: { - backgroundColor: colors.successLight, - }, - lightGray: { - backgroundColor: colors.lightGray, - }, - footer: { - position: 'absolute', - bottom: 0, - left: 0, - right: 0, - backgroundColor: colors.white, - padding: 16, - borderTopWidth: 1, - borderTopColor: colors.lightGray, - elevation: 10, - }, - proceedButton: { - backgroundColor: colors.primary, - paddingVertical: 14, - borderRadius: 30, - alignItems: 'center', - }, - proceedButtonText: { - color: colors.white, - fontSize: 16, - fontWeight: '600', - }, - footerText: { - textAlign: 'center', - color: colors.darkGray, - fontSize: 14, - }, -}); \ No newline at end of file + container: { flex: 1, padding: 16 }, + headerCard: { backgroundColor: colors.white, borderRadius: 14, padding: 20, marginBottom: 20, borderLeftWidth: 4, borderLeftColor: colors.primary, shadowColor: '#000', shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.1, shadowRadius: 5, elevation: 5 }, + tenderHeader: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'flex-start', marginBottom: 12 }, + tenderNumber: { fontSize: 22, fontWeight: 'bold', color: colors.primary }, + tenderId: { fontSize: 14, color: colors.darkGray, marginTop: 4 }, + statusBadge: { paddingHorizontal: 12, paddingVertical: 6, borderRadius: 20 }, + statusBadgeText: { color: colors.white, fontWeight: '600', fontSize: 12 }, + workDescription: { fontSize: 13, color: colors.black, marginBottom: 16, fontFamily: FontsFamily.poppinsMedium }, + headerInfoRow: { flexDirection: 'row', alignItems: 'center', backgroundColor: colors.lightestGray, borderRadius: 8, padding: 12 }, + headerInfoItem: { flex: 1, alignItems: 'center' }, + headerInfoLabel: { fontSize: 12, color: colors.darkGray, marginBottom: 4 }, + headerInfoValue: { fontSize: 16, fontWeight: '600', color: colors.primary }, + separator: { width: 1, height: 30, backgroundColor: colors.lightGray }, + section: { marginBottom: 20 }, + sectionTitle: { fontSize: 18, fontWeight: '600', marginBottom: 12, paddingLeft: 4 }, + statusGrid: { backgroundColor: colors.white, borderRadius: 14, padding: 16, shadowColor: '#000', shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.1, shadowRadius: 5, elevation: 3 }, + statusContainer: { flexDirection: 'row', alignItems: 'center', marginBottom: 12 }, + statusDot: { width: 12, height: 12, borderRadius: 6, marginRight: 10 }, + statusText: { fontSize: 15, fontWeight: '500' }, + envelopeCard: { backgroundColor: colors.white, borderRadius: 14, padding: 16, marginBottom: 12, shadowColor: '#000', shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.05, shadowRadius: 4, elevation: 2 }, + cardHeader: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', marginBottom: 12 }, + cardTitle: { fontSize: 16, fontWeight: '600', color: colors.black }, + envelopeBadge: { paddingHorizontal: 10, paddingVertical: 4, borderRadius: 12 }, + envelopeBadgeText: { color: colors.white, fontWeight: 'bold', fontSize: 12 }, + logDetailRow: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8 }, + label: { fontSize: 14, color: colors.black, flex: 1, fontFamily: FontsFamily.poppinsSemiBold }, + value: { fontSize: 14, color: colors.darkText, flex: 2, textAlign: 'right' }, + successText: { color: colors.success, fontWeight: '600' }, + detailsCard: { backgroundColor: colors.white, borderRadius: 14, padding: 16, shadowColor: '#000', shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.05, shadowRadius: 4, elevation: 3 }, + infoRow: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', paddingVertical: 10, borderBottomWidth: 1, borderBottomColor: colors.lightestGray }, + infoLabel: { fontSize: 14, color: colors.black, fontFamily: FontsFamily.poppinsSemiBold }, + infoValue: { fontSize: 15, fontWeight: '500', color: colors.darkText }, + highlightedValue: { color: colors.success, fontWeight: '600' }, + timeCard: { backgroundColor: colors.white, borderRadius: 14, padding: 16, shadowColor: '#000', shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.05, shadowRadius: 4, elevation: 3 }, + timeRow: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', paddingVertical: 12, borderBottomWidth: 1, borderBottomColor: colors.lightestGray }, + timeLabel: { fontSize: 15, color: colors.black, }, + timeValue: { fontSize: 15, color: colors.grayText, }, + chipsContainer: { flexDirection: 'row', flexWrap: 'wrap', gap: 10 }, + chip: { paddingHorizontal: 16, paddingVertical: 8, borderRadius: 20, marginBottom: 8 }, + chipText: { fontSize: 14, fontWeight: '500' }, + finalStatusCard: { backgroundColor: colors.white, borderRadius: 14, padding: 20, marginTop: 10, borderWidth: 2, borderColor: colors.primary, shadowColor: '#000', shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.1, shadowRadius: 5, elevation: 5 }, + finalStatusTitle: { fontSize: 18, fontWeight: 'bold', marginBottom: 16, textAlign: 'center' }, + finalStatusRow: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', marginBottom: 12, paddingVertical: 8, borderBottomWidth: 1, borderBottomColor: 'rgba(0,0,0,0.1)' }, + finalStatusLabel: { fontSize: 14, color: colors.black, fontFamily: FontsFamily.poppinsSemiBold }, + finalStatusValue: { fontSize: 13, }, + footer: { position: 'absolute', bottom: 0, left: 0, right: 0, backgroundColor: colors.white, padding: 16, borderTopWidth: 1, borderTopColor: colors.lightGray, elevation: 10 }, + proceedButton: { backgroundColor: colors.primary, paddingVertical: 14, borderRadius: 30, alignItems: 'center' }, + proceedButtonText: { color: colors.white, fontSize: 16, fontWeight: '600' }, + footerText: { textAlign: 'center', color: colors.darkGray, fontSize: 14 }, +}); diff --git a/src/Screens/Tender/PurchaseTenderTile.tsx b/src/Screens/Tender/PurchaseTenderTile.tsx index 30b79db..6a57b41 100644 --- a/src/Screens/Tender/PurchaseTenderTile.tsx +++ b/src/Screens/Tender/PurchaseTenderTile.tsx @@ -1,29 +1,14 @@ import React, { use, useEffect } from 'react'; -import { - View, - Text, - StyleSheet, - TouchableOpacity, - Platform, - Alert, -} from 'react-native'; -import Animated, { - FadeInUp, - useAnimatedStyle, - useSharedValue, - withTiming, -} from 'react-native-reanimated'; +import { View, Text, StyleSheet, TouchableOpacity, Platform } from 'react-native'; +import Animated, { FadeInUp, useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated'; import moment from 'moment'; import CountdownTimer from '../../Component/Counter/CountdownTimer'; import colors from '../../Constant/Color'; -import { useFetchTenderById, useProceedToBid } from '../../Services/BBPS/Hooks'; +import { useFetchTenderById } from '../../Services/BBPS/Hooks'; import { useNavigation } from '@react-navigation/native'; import TenderFullDetail from './Modal/TenderFullDetail'; -const PurchaseTenderTile = ({ - item, - onPressDetails, -}: any) => { +const PurchaseTenderTile = ({ item, onPressDetails }: any) => { const scale = useSharedValue(1); const elevation = useSharedValue(8); const navigation = useNavigation(); @@ -36,15 +21,6 @@ const PurchaseTenderTile = ({ const { data: tenderResponse, }: any = useFetchTenderById(item?.tenderId); const tender = tenderResponse?.data; - // console.log("item my : ", item) - - { - if (item?.nitNumber == 'TN/111') { - console.log("tender item : ", item?.nitNumber) - - } - } - const handlePressIn = () => { scale.value = withTiming(0.97, { duration: 120 }); elevation.value = withTiming(3, { duration: 120 }); @@ -61,11 +37,6 @@ const PurchaseTenderTile = ({ const lightStatusBg = isLive ? '#EFF6FF' : '#F8FAFC'; const [showDetail, setShowDetail] = React.useState(false); - useEffect(() => { - if(item?.tenderNumber == 'TN/210'){ - console.log("tender item : ", item) - } - }, [item]); return ( => { try { - // const response = await axios.post(LOG_IN_URL, { ...payload, divice: "mobileApp" }); - const response = await axios.post(TENDER_LOGIN, { ...payload, device: "mobileApp" }); + const response = await axios.post(LOG_IN_URL, { ...payload, divice: "mobileApp" }); + // const response = await axios.post(TENDER_LOGIN, { ...payload, device: "mobileApp" }); return response.data; } catch (error: any) { throw error.response?.data || error.message; diff --git a/src/assets/images/bharatbilllogo2.png b/src/assets/images/bharatbilllogo2.png deleted file mode 100644 index 1737a8bd300a2a6a59eb4342ee1782564dacff39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44515 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 Kxs~iWdHHYV`{a25