-
Notifications
You must be signed in to change notification settings - Fork 0
/
f12094cb109340e0002c89998991ff95dce21642-948656917f76288a31cd.js.map
1 lines (1 loc) · 129 KB
/
f12094cb109340e0002c89998991ff95dce21642-948656917f76288a31cd.js.map
1
{"version":3,"file":"f12094cb109340e0002c89998991ff95dce21642-948656917f76288a31cd.js","mappings":"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","sources":["webpack://kaagzi/./src/app/codeSharedAcrossBrokers/components/BrokerSelector/brokerSelector.module.css","webpack://kaagzi/./src/app/codeSharedAcrossBrokers/components/BrokerSelector/index.js","webpack://kaagzi/./src/app/codeSharedAcrossBrokers/components/ColoredNumberDisplay/coloredNumberDisplay.module.css","webpack://kaagzi/./src/app/codeSharedAcrossBrokers/components/ColoredNumberDisplay/index.js","webpack://kaagzi/./src/app/codeSharedAcrossBrokers/components/EmptyGfx/emptyGfx.module.css","webpack://kaagzi/./src/app/codeSharedAcrossBrokers/components/EmptyGfx/index.js","webpack://kaagzi/./src/app/codeSharedAcrossBrokers/providers/AppIndexedDb/index.js","webpack://kaagzi/./src/components/BrowserOnly/index.js","webpack://kaagzi/./src/components/Pagination/pagination.module.css","webpack://kaagzi/./src/components/Pagination/index.js","webpack://kaagzi/./src/components/ConfirmationDialog/confirmationDialog.module.css","webpack://kaagzi/./src/components/ConfirmationDialog/index.js","webpack://kaagzi/./src/app/codeSharedAcrossBrokers/components/TradeHistory/tradeHistory.module.css","webpack://kaagzi/./src/app/codeSharedAcrossBrokers/components/TradeHistory/index.js","webpack://kaagzi/./src/components/Header/header.module.css","webpack://kaagzi/./src/components/Header/index.js","webpack://kaagzi/./src/hooks/UseSiteMetadata/index.js","webpack://kaagzi/./src/components/Seo/index.js","webpack://kaagzi/./src/containers/BottomSheet/bottomSheet.module.css","webpack://kaagzi/./src/containers/BottomSheet/index.js"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport var brokerDtls = \"brokerSelector-module--brokerDtls--bb90b\";\nexport var brokerLoginStatus = \"brokerSelector-module--brokerLoginStatus--7c7fc\";\nexport var brokerLoginUser = \"brokerSelector-module--brokerLoginUser--a326b\";\nexport var brokerSelectorBtn = \"brokerSelector-module--brokerSelectorBtn--7ebf9\";\nexport var brokerSelectorHdr = \"brokerSelector-module--brokerSelectorHdr--0f766\";\nexport var brokerSelectorListC = \"brokerSelector-module--brokerSelectorListC--116c4\";","import React, { useContext, useEffect, useState } from 'react';\n// import { createPortal } from 'react-dom';\n\n// import { StockMarketBrokerContext } from '@providers/StockMarketBroker';\n// import { UserAdminNavbarContext } from '@components/UserAdminNavbar';\nimport Icon from '@components/ui/Icon';\nimport Button, { LinkButton } from '@components/ui/Button';\nimport { Link } from 'gatsby';\nimport BottomSheet from '@containers/BottomSheet';\nimport { formatName } from '@utils';\n\nimport * as styles from './brokerSelector.module.css';\n\n/**\n * Displays button to select broker to switch to\n * @param {Object} prop Prop passed to this component\n * @param {('Zerodha'| 'Angel One'| 'Upstox'| 'Alice Blue')} prop.broker Stock Broker\n * @param {?string} prop.brokerLoggedInUserName Name of user logged in with broker\n * @param {?()=>{}} [prop.brokerLogOut] Logout function in case we login user with broker with API\n */\nexport default function BrokerSelector({ broker, brokerLoggedInUserName, brokerLogOut }) {\n\tconst [isSelectionMenuViz, setIsSelectionMenuViz] = useState(false);\n\t// const { currentBroker } = useContext(StockMarketBrokerContext);\n\t// const { portalOpeningCntnrElm } = useContext(UserAdminNavbarContext);\n\n\tconst brokersAry = ['Zerodha', 'Angel One', 'Upstox', 'Alice Blue'];\n\n\treturn (\n\t\t<>\n\t\t\t<div>\n\t\t\t\t<button\n\t\t\t\t\tclassName={styles.brokerSelectorBtn}\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tsetIsSelectionMenuViz(!isSelectionMenuViz);\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{/* <img src=\"https://lh3.googleusercontent.com/a/ACg8ocIf-pZASZUnKasjXtdmY8Occ35eKXWldFUJV_hHEm5D=s96-c\" alt=\"broker\" /> */}\n\t\t\t\t\t{broker === 'Zerodha' && <img src=\"/img/logo-kite.png\" alt=\"Zerodha Kite\" />}\n\t\t\t\t\t{broker === 'Angel One' && <img src=\"/img/logo-angelOne.webp\" alt=\"Angel One\" />}\n\t\t\t\t\t{broker === 'Upstox' && <img src=\"/img/logo-upstox.webp\" alt=\"Upstox\" />}\n\t\t\t\t\t<div>{brokersAry.includes(broker) ? broker : 'Choose Broker'}</div>\n\t\t\t\t\t<Icon icon=\"chevron-down\" />\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t{isSelectionMenuViz && (\n\t\t\t\t<BottomSheet\n\t\t\t\t\t// title=\"Switch Broker\"\n\t\t\t\t\t// desc=\"Choose your preferred broker\"\n\t\t\t\t\tdoOnClose={() => {\n\t\t\t\t\t\tsetIsSelectionMenuViz(false);\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{brokerLoggedInUserName && (\n\t\t\t\t\t\t<div className={styles.brokerLoginStatus}>\n\t\t\t\t\t\t\t<div className={styles.brokerDtls}>\n\t\t\t\t\t\t\t\t{broker === 'Zerodha' && <img src=\"/img/logo-kite.png\" alt=\"Zerodha Kite\" />}\n\t\t\t\t\t\t\t\t{broker === 'Angel One' && <img src=\"/img/logo-angelOne.webp\" alt=\"Angel One\" />}\n\t\t\t\t\t\t\t\t{broker === 'Upstox' && <img src=\"/img/logo-upstox.webp\" alt=\"Upstox\" />}\n\t\t\t\t\t\t\t\t<div className={styles.brokerLoginUser}>\n\t\t\t\t\t\t\t\t\t<span>Logged into {broker} as</span>\n\t\t\t\t\t\t\t\t\t<span>{formatName(brokerLoggedInUserName)}</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{brokerLogOut && typeof brokerLogOut === 'function' && (\n\t\t\t\t\t\t\t\t<Button variant=\"primary\" size=\"small\" isDark={true} onClick={brokerLogOut}>\n\t\t\t\t\t\t\t\t\tSign Out\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<header className={styles.brokerSelectorHdr}>\n\t\t\t\t\t\t<h1>Switch Broker</h1>\n\t\t\t\t\t\t<p>Choose your preferred broker</p>\n\t\t\t\t\t\t{/* <LinkButton variant=\"secondary\" isDark={true} to=\"/app\">\n\t\t\t\t\t\t\tChoose different broker\n\t\t\t\t\t\t</LinkButton> */}\n\t\t\t\t\t</header>\n\t\t\t\t\t<div className={styles.brokerSelectorListC}>\n\t\t\t\t\t\t{broker !== 'Upstox' && (\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<Link to=\"/app/upstox\">\n\t\t\t\t\t\t\t\t\t<img src=\"/img/logo-upstox.webp\" alt=\"Upstox\" />\n\t\t\t\t\t\t\t\t\t<span>Upstox</span>\n\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{broker !== 'Angel One' && (\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<Link to=\"/app/angelOne\">\n\t\t\t\t\t\t\t\t\t<img src=\"/img/logo-angelOne.webp\" alt=\"Angel One\" />\n\t\t\t\t\t\t\t\t\t<span>Angel One</span>\n\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</BottomSheet>\n\t\t\t)}\n\t\t</>\n\t);\n}\n","// extracted by mini-css-extract-plugin\nexport var isGreen = \"coloredNumberDisplay-module--isGreen--7185e\";\nexport var isRed = \"coloredNumberDisplay-module--isRed--bc675\";","import React, { memo } from 'react';\n// import { formatPriceInIndianStyle } from '@utils';\nimport { formatPriceInIndianStyle } from '@utils';\nimport * as styles from './coloredNumberDisplay.module.css';\n\n//since React may disrespect the 'shouldComponentUpdate' lifecycle method, we use functional component to achieve same thing leveraging React.memo()\n//https://beta.reactjs.org/reference/react/memo#specifying-a-custom-comparison-function\n//https://stackoverflow.com/questions/63470738/stop-re-rendering-the-react-functional-component\n// const ColoredNumberDisplay = memo(\n// \tfunction ColoredNumberDisplay({ currentVal, baseVal, additionalClassWhenGreen, additionalClassWhenRed }) {\n// \t\treturn (\n// \t\t\t<span\n// \t\t\t\tclassName={\n// \t\t\t\t\tcurrentVal !== null && baseVal !== null\n// \t\t\t\t\t\t? Number(currentVal) >= Number(baseVal) //if currentVal greater than baseVal\n// \t\t\t\t\t\t\t? `${styles.isGreen}${additionalClassWhenGreen ? ' ' + additionalClassWhenGreen : ''}` //+' positive' //'positive' class can be used to further style the value, for eg, prefixing '+' or rupee symbol to this via css\n// \t\t\t\t\t\t\t: `${styles.isRed}${additionalClassWhenRed ? ' ' + additionalClassWhenRed : ''}` //+ ' negative'\n// \t\t\t\t\t\t: '' //if value is not present, then default to no specific color\n// \t\t\t\t}\n// \t\t\t>\n// \t\t\t\t{/* {currentVal ? Number.parseFloat(currentVal).toFixed(2) : '0.00'} */}\n// \t\t\t\t{currentVal ? formatPriceInIndianStyle(Number(currentVal)) : '0.00'}\n// \t\t\t</span>\n// \t\t);\n// \t},\n// \t(oldProps, newProps) => {\n// \t\t//arePropsEqual()\n// \t\tif (!newProps.currentVal) return true;\n// \t\tif (oldProps.currentVal == newProps.currentVal) return true;\n// \t\treturn false;\n// \t},\n// );\n// export default ColoredNumberDisplay;\n\nexport default function ColoredNumberDisplay({ currentVal, baseVal, additionalClassWhenGreen, additionalClassWhenRed }) {\n\treturn (\n\t\t<span\n\t\t\tclassName={\n\t\t\t\tcurrentVal !== null && baseVal !== null\n\t\t\t\t\t? Number(currentVal) >= Number(baseVal) //if currentVal greater than baseVal\n\t\t\t\t\t\t? `${styles.isGreen}${additionalClassWhenGreen ? ' ' + additionalClassWhenGreen : ''}` //+' positive' //'positive' class can be used to further style the value, for eg, prefixing '+' or rupee symbol to this via css\n\t\t\t\t\t\t: `${styles.isRed}${additionalClassWhenRed ? ' ' + additionalClassWhenRed : ''}` //+ ' negative'\n\t\t\t\t\t: '' //if value is not present, then default to no specific color\n\t\t\t}\n\t\t>\n\t\t\t{/* {currentVal ? Number.parseFloat(currentVal).toFixed(2) : '-.--'} */}\n\t\t\t{currentVal !== null ? formatPriceInIndianStyle(Number(currentVal)) : '-.--'}\n\t\t\t{/* {currentVal == 0 ? '0.00' : currentVal !== null ? formatPriceInIndianStyle(Number(currentVal)) : '-.--'} */}\n\t\t</span>\n\t);\n}\n","// extracted by mini-css-extract-plugin\nexport var emptyGfxC = \"emptyGfx-module--emptyGfxC--cd3c3\";","import React from 'react';\n\nimport Button from '@components/ui/Button';\nimport Icon from '@components/ui/Icon';\nimport * as styles from './emptyGfx.module.css';\n\n/**\n * Displays Graphics centered vertically and horizontally. Mostly used when displaying empty lists\n * @param {Object} prop Prop passed to this component\n * @param {string} prop.icon Icon graphics\n * @param {?string} [prop.note] Note to display\n * @param {?()=>{}} [prop.ctaFn] Callback fn to execute once user clicks the 'Call-To-Action' button\n * @param {?string} [prop.ctaBtnText='Load'] Text to display on the CTA button\n */\nexport default function EmptyGfx({ icon, note, ctaFn, ctaBtnText }) {\n\treturn (\n\t\t<div className={styles.emptyGfxC}>\n\t\t\t<div>\n\t\t\t\t<Icon icon={icon} />\n\t\t\t\t{note && <div>{note}</div>}\n\t\t\t\t{ctaFn && typeof ctaFn === 'function' && (\n\t\t\t\t\t<Button variant=\"primary\" size=\"big\" isDark={true} onClick={ctaFn}>\n\t\t\t\t\t\t{ctaBtnText || 'Load'}\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import React, { createContext, useRef, useEffect, useContext, useState } from 'react';\n\nimport { UserContext } from '@providers/User';\n\n//==================+\n//\t\tTYPES\t\t|\n//==================+\n/** @typedef {import('@types_appShared').TableName} TableName Names of tables used to store broker agnostic data */\n/** @typedef {import('@types_appShared').Position} Position Broker agnostic active-position data stored in 'positions' table */\n/** @typedef {import('@types_appShared').ClosedPosition} ClosedPosition Broker agnostic closed-position data stored in 'trade-history' objectStore / table */\n/** @typedef {import('@types_appShared').WatchlistInstrument} WatchlistInstrument Instrument data stored in 'watchlist-#' table */\n\n//==================+\n//\t\tCONTEXT\t\t|\n//==================+\n\n/** React context for downloaded CSV master data */\nexport const AppDataIndexedDbContext = createContext({\n\t/** Reads a position or all positions from IndexedDB for the given userId\n\t * @param {?string} [tradingSymbol] - Trading Symbol. If not specified, fn returns all items\n\t * @param {?('NSE'|'BSE'|'NFO'|'CDS'|'MCX')} [exchange] - Exchange where this instrument is listed\n\t * @param {?Boolean} [isSellTrade=false] - Whether the position we are trying to get for the specified tradingSymbol is a SELL trade. Defaults to FALSE\n\t * @returns {Promise<?(Position|Position[])>} Array in case tradingSymbol not specified OR Object in case tradingSymbol specified OR null\n\t */\n\tgetPosition: async (tradingSymbol, exchange, isSellTrade) => {}, //eslint-disable-line\n\n\t/** Sets a position given by symbol, exchange and direction in IndexedDB for the given userId\n\t * @param {!Position} posData - Position data to store\n\t * @returns {Promise<?Position>} Position Object written to IndexedDB OR null\n\t */\n\tsetPosition: async (posData) => {}, //eslint-disable-line\n\n\t/** Exits a position (either fully or partially) from IndexedDB active positions table and writes an entry into trade-history table\n\t * @param {!string} tradingSymbol - Instrument token (Trading Symbol)\n\t * @param {('NSE'|'BSE'|'NFO'|'CDS'|'MCX')} exchange - Exchange where this instrument is listed\n\t * @param {?Boolean} [isSellTrade=false] - Whether the position we are trying to close is a SELL trade. Defaults to FALSE. We use this to prepend either 'B:' or 'S:' to the tradingSymbol to use as PK\n\t * @param {number} exitPrice - Close price\n\t * @param {number} exitQty - Quantity to exit in case user intends to exit partially (If not set, entire position is closed)\n\t * @returns {Promise<?ClosedPosition>} Closed position trade-history object\n\t */\n\texitPosition: async (tradingSymbol, exchange, isSellTrade, exitPrice, exitQty) => {}, //eslint-disable-line\n\n\t/** Reads all instruments from specified watchlist for the particular user\n\t * @param {?string} [watchlistId=1] The watchlist ID\n\t * @returns {Promise<?WatchlistInstrument[]>} Array of instruments stored in watchlist\n\t */\n\tgetWatchlistInstruments: async (watchlistId) => {}, //eslint-disable-line\n\n\t/** Writes an instrument to specified watchlist for the particular user\n\t * @param {?string} [watchlistId=1] The watchlist ID\n\t * @param {!string} tradingSymbol Instrument token (Trading Symbol)\n\t * @param {('NSE'|'BSE'|'NFO'|'CDS'|'MCX')} exchange Exchange where this instrument is listed\n\t * @param {!number} expiry Expiry in ms\n\t * @returns {Promise<?Boolean>} TRUE if write successfull, FALSE otherwise\n\t */\n\tsetWatchlistInstrument: async (watchlistId, tradingSymbol, exchange, expiry) => {}, //eslint-disable-line\n\n\t/** Writes multiple instruments to specified watchlist for the particular user\n\t * @param {?string} [watchlistId=1] The watchlist ID\n\t * @param {!WatchlistInstrument[]} instrumentsAry Array of instruments to add to watchlist\n\t * @returns {Promise<Boolean>} TRUE if write successfull, FALSE otherwise\n\t */\n\tsetWatchlistMultipleInstruments: async (watchlistId, instrumentsAry) => {}, //eslint-disable-line\n\n\t/** Deletes an instrument from specified watchlist for the particular user\n\t * @param {?string} [watchlistId=1] The watchlist ID\n\t * @param {!string} tradingSymbol Instrument token (Trading Symbol)\n\t * @param {('NSE'|'BSE'|'NFO'|'CDS'|'MCX')} exchange Exchange where this instrument is listed\n\t * @returns {Promise<?Boolean>} TRUE if delete successfull, FALSE otherwise\n\t */\n\tdeleteWatchlistInstrument: async (watchlistId, tradingSymbol, exchange) => {}, //eslint-disable-line\n\n\t/** Deletes all instruments from specified watchlist for the particular user\n\t * @param {?string} [watchlistId=1] The watchlist ID\n\t * @returns {Promise<?Boolean>} TRUE if clear successfull, FALSE otherwise\n\t */\n\tclearWatchlist: async (watchlistId) => {}, //eslint-disable-line\n\n\t/** Reads trade-history records for the requested page for the given userId\n\t * @param {?number} [page = 1] Page number to retrieve records for\n\t * @param {?number} [showPerPage = 20] Number of records to display per page\n\t * @returns {Promise<?{records:ClosedPosition[],totalRecords:number,totalPages:number}>} Records, total number of records and total number of pages\n\t */\n\tgetTradeHistory: async (page, showPerPage) => {}, //eslint-disable-line\n\n\t/** Clears all trade-history records for the given userId\n\t * @returns {Promise<boolean>} TRUE if clear-op successful, FALSE otherwise\n\t */\n\tclearEntireTradeHistory: async () => {},\n});\n\n//======================+\n//\t\tCOMPONENT\t\t|\n//======================+\n\n/** Provider component for app data stored in Indexed DB as broker agnostic data */\nexport default function AppDataIndexedDb_ContextProvider({ children }) {\n\tconst { id: userId } = useContext(UserContext);\n\tconst dbRef = useRef(null);\n\tconst currentDbStoreVer = 1; //if there are any changes to the DB structure, we can increment this\n\tconst maxNumberOfItemsAllowedInTable = {\n\t\t'watchlist-1': 20,\n\t\t'watchlist-2': 20,\n\t\t'watchlist-3': 20,\n\t\t'watchlist-4': 20,\n\t\tpositions: 10, //allow only max 10 positions to be open at a time\n\t\t// 'trade-history':null\t//unlimited for now\n\t};\n\n\t/**\n\t * Sets up & initializes IndexedDB client and saves it as static for reuse later\n\t * @returns {Promise<?IDBDatabase>} IndexedDB handle or DOMException error.\n\t */\n\tasync function __setupIfNotAlreadyAndGetDbHandle() {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (!userId || typeof userId !== 'string' || userId.trim() === '') reject();\n\n\t\t\tconst dbName = 'Kaagzi_' + userId;\n\t\t\t// if (dbRef.current?.constructor.name == 'IDBDatabase' && dbRef.current?.name === dbName) return resolve(dbRef.current); //if the req DB is already setup, we return it\n\t\t\t//check if a DB handle is already stored\n\t\t\tif (dbRef.current?.constructor.name == 'IDBDatabase') {\n\t\t\t\tif (dbRef.current?.name === dbName) {\n\t\t\t\t\treturn resolve(dbRef.current); //if the stored DB is the one that we req, then return it\n\t\t\t\t} else {\n\t\t\t\t\t//close any other open DB connections (Mostly this could be of different user logged-in before the current user has just loggen-in)\n\t\t\t\t\tdbRef.current?.close?.(); //since anyhow we shall be only allowing one single user logged-in at any given time, and that user shall have one single DB\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//setup DB if not already\n\t\t\tconst openRequest = indexedDB.open(dbName, currentDbStoreVer); //openRequest.construstor.name == IDBOpenDBRequest\n\n\t\t\t//EVENTS\n\t\t\topenRequest.onupgradeneeded = (event) => {\n\t\t\t\t//only fired when an attempt was made to open a database with a version number higher than its current version, or if no database existed before\n\t\t\t\tdbRef.current = openRequest.result; //same as 'event.target.result'\t//had we not required it below to get 'dbRef.current.objectStoreNames' we need not have required to assign it here since we do it in the 'onsuccess' event\n\n\t\t\t\t// check existing db version\n\t\t\t\tif (event.oldVersion === 0) {\n\t\t\t\t\t// version 0 means that the client had no database\n\t\t\t\t\t// perform initialization\n\n\t\t\t\t\t// if (!dbRef.current.objectStoreNames.contains('zerodhaKite-positions')) {\n\t\t\t\t\t// \t// dbRef.current.createObjectStore('zerodhaKite-positions', { keyPath: 'symbol' }); // here we specify the column-name to tell what it should use as primary-key\n\t\t\t\t\t// \t//so now, when adding or updating items, we need not specify the 'key' explicitely\n\t\t\t\t\t// \tdbRef.current.createObjectStore('zerodhaKite-positions');\n\t\t\t\t\t// }\n\t\t\t\t\tif (!dbRef.current.objectStoreNames.contains('watchlist-1')) dbRef.current.createObjectStore('watchlist-1');\n\t\t\t\t\tif (!dbRef.current.objectStoreNames.contains('watchlist-2')) dbRef.current.createObjectStore('watchlist-2');\n\t\t\t\t\tif (!dbRef.current.objectStoreNames.contains('watchlist-3')) dbRef.current.createObjectStore('watchlist-3');\n\t\t\t\t\tif (!dbRef.current.objectStoreNames.contains('watchlist-4')) dbRef.current.createObjectStore('watchlist-4');\n\t\t\t\t\t// if (!dbRef.current.objectStoreNames.contains('watchlist-5')) dbRef.current.createObjectStore('watchlist-5');\n\t\t\t\t\tif (!dbRef.current.objectStoreNames.contains('positions')) dbRef.current.createObjectStore('positions');\n\t\t\t\t\tif (!dbRef.current.objectStoreNames.contains('trade-history')) dbRef.current.createObjectStore('trade-history');\n\n\t\t\t\t\t// //trade history pk cud be a combination of broker-symbol-timestamp\n\t\t\t\t\t// if (!dbRef.current.objectStoreNames.contains('trade-history')) {\n\t\t\t\t\t// \tdbRef.current.createObjectStore('trade-history', { keyPath: 'id' }); // here we specify the column-name to tell what it should use as primary-key\n\t\t\t\t\t// \t//so now, when adding or updating items, we need not specify the 'key' explicitely\n\t\t\t\t\t// }\n\t\t\t\t} else if (event.oldVersion > 0 && event.oldVersion < currentDbStoreVer) {\n\t\t\t\t\t// client had old version\n\t\t\t\t\t// update\n\t\t\t\t\tdbRef.current.createObjectStore('watchlist-1');\n\t\t\t\t\tdbRef.current.createObjectStore('watchlist-2');\n\t\t\t\t\tdbRef.current.createObjectStore('watchlist-3');\n\t\t\t\t\tdbRef.current.createObjectStore('watchlist-4');\n\t\t\t\t\t// dbRef.current.createObjectStore('watchlist-5');\n\t\t\t\t\tdbRef.current.createObjectStore('positions');\n\t\t\t\t\tdbRef.current.createObjectStore('trade-history');\n\t\t\t\t}\n\t\t\t};\n\n\t\t\topenRequest.onerror = () => {\n\t\t\t\treject(openRequest.error);\n\t\t\t};\n\n\t\t\topenRequest.onsuccess = (event) => {\n\t\t\t\t//fired after 'onupgradeneeded()' and if no errors while opening\n\t\t\t\tdbRef.current = openRequest.result; //event.target.result;\n\t\t\t\tdbRef.current.onversionchange = () => {\n\t\t\t\t\t//installs the onversionchange handler, that triggers if the current database connection becomes outdated (db version is updated elsewhere) and closes the connection\n\t\t\t\t\tdbRef.current.close();\n\t\t\t\t\tdbRef.current = null;\n\t\t\t\t\tconsole.warn('Database is outdated, please reload the page');\n\t\t\t\t};\n\t\t\t\tdbRef.current.onclose = () => {\n\t\t\t\t\t//fires only if the DB connection is unexpectedly closed\n\t\t\t\t\tdbRef.current = null; // console.log(\"Database connection closed\");\n\t\t\t\t};\n\t\t\t\t// console.log('typeof dbRef.current:', typeof dbRef.current);\t\t\t\t\t//object\n\t\t\t\t// console.log('dbRef.current.constructor.name:', dbRef.current.constructor.name);\t\t//IDBDatabase\n\t\t\t\t// the db is ready, continue working with database using dbRef.current object\n\n\t\t\t\t// resolve(openRequest.result);\n\t\t\t\tresolve(dbRef.current);\n\t\t\t};\n\t\t});\n\t}\n\n\t/**\n\t * Initiates a transaction after getting handle to DB\n\t * @param {(string|string[])} tableOrTablesAry ObjectStore or array of ObjectStores\n\t * @param {IDBTransactionMode} mode Mode of transaction\n\t * @returns {Promise<?IDBTransaction>} IndexedDb Transaction\n\t */\n\tconst _withDbTransaction = async (tableOrTablesAry, mode) => {\n\t\tif (!tableOrTablesAry) return null;\n\t\tif (typeof tableOrTablesAry === 'string' && tableOrTablesAry.trim() === '') return null;\n\t\tif (!['readonly', 'readwrite', 'versionchange'].includes(mode)) return null;\n\t\ttry {\n\t\t\tconst db = await __setupIfNotAlreadyAndGetDbHandle();\n\t\t\tif (!db) return null;\n\n\t\t\t//check if table exists in DB\n\t\t\tconst tables = db.objectStoreNames; //https://developer.mozilla.org/en-US/docs/Web/API/IDBDatabase/objectStoreNames\n\t\t\tif (tables.length < 1) return null; //since we do not have any tables configured in this DB\n\t\t\tconst tablesAry = Array.from(tables); //since, db.objectStoreNames return DOMStringList and not Array, we convert it to array\n\t\t\tif (Array.isArray(tableOrTablesAry)) {\n\t\t\t\tfor (var i = 0; i < tableOrTablesAry.length; i++) {\n\t\t\t\t\tif (!tablesAry.includes(tableOrTablesAry[i])) throw new Error('The ' + tableOrTablesAry[i] + ' table does not exist in database');\n\t\t\t\t}\n\t\t\t} else if (typeof tableOrTablesAry === 'string') {\n\t\t\t\tif (!tablesAry.includes(tableOrTablesAry)) throw new Error('The ' + tableOrTablesAry + ' table does not exist in database');\n\t\t\t}\n\t\t\treturn db.transaction(tableOrTablesAry, mode);\n\t\t} catch (err) {\n\t\t\tconsole.error(err);\n\t\t\treturn null;\n\t\t}\n\t};\n\n\t/**\n\t * Checks if max item storage limit has reached\n\t * @param {IDBObjectStore} objStore\n\t * @param {string} tableName of the objectStore\n\t * @returns {Promise<boolean|number>} FALSE if no space available, TRUE if unlimited space available. Number representing remaining slots if limited sapce available\n\t */\n\tconst _isSpaceAvailableInTable = async (objStore, table) => {\n\t\tif (!Object.prototype.hasOwnProperty.call(maxNumberOfItemsAllowedInTable, table)) return true; //table has no limit on max items\n\t\tconst maxAllowed = maxNumberOfItemsAllowedInTable[table];\n\n\t\tconst numItemsAlreadyStored = await new Promise((resolve, reject) => {\n\t\t\tconst countRequest = objStore.count();\n\t\t\tcountRequest.onsuccess = () => {\n\t\t\t\tresolve(countRequest.result);\n\t\t\t};\n\t\t\tcountRequest.onerror = () => {\n\t\t\t\treject(null);\n\t\t\t};\n\t\t});\n\t\tif (numItemsAlreadyStored === null || numItemsAlreadyStored === undefined) throw new Error('Error reading stored item count');\n\t\tconst availableSlots = maxAllowed - numItemsAlreadyStored;\n\t\tif (availableSlots <= 0) return false;\n\t\treturn availableSlots;\n\t};\n\n\t//------------------------------+\n\t//\t\tINTERNAL METHODS\t\t|\n\t//------------------------------+\n\n\t/**\n\t * Reads data cached in IndexedDB. If no 'pkVal' argument is provided, then it reads all items\n\t * @param {!TableName} table - Object-store (ie' Table) name\n\t * @param {?string} pk - Primary Key value. If this is not specified, fn returns all items\n\t * @returns {Promise<?({}|[])>} Cached-data object or array of objects in case of all items or null\n\t */\n\tconst get = async (table, pk) => {\n\t\tif (!table) return null;\n\n\t\tconst transaction = await _withDbTransaction(table, 'readonly');\n\t\tif (!transaction) return null;\n\t\treturn new Promise((resolve, reject) => {\n\t\t\ttry {\n\t\t\t\ttransaction.onabort = () => {\n\t\t\t\t\t// console.log('Cache transaction aborted:', transaction.error);\n\t\t\t\t\treject(transaction.error);\n\t\t\t\t};\n\t\t\t\t// transaction.oncomplete = () => {\n\t\t\t\t// \tconsole.log(\"Transaction is complete\");\n\t\t\t\t// };\n\t\t\t\tlet request;\n\t\t\t\tif (pk) {\n\t\t\t\t\trequest = transaction.objectStore(table).get(pk); //.get(IDBKeyRange.only(key));\n\t\t\t\t} else {\n\t\t\t\t\trequest = transaction.objectStore(table).getAll(); //returns an array\n\t\t\t\t}\n\n\t\t\t\t// request.onerror = (event) => {\n\t\t\t\t// \tconsole.error(request.error)\n\t\t\t\t// };\n\t\t\t\trequest.onsuccess = () => {\n\t\t\t\t\tif (request.result !== undefined) {\n\t\t\t\t\t\t// return request.result;\n\t\t\t\t\t\tresolve(request.result);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// throw new Error('No data in Cache');\n\t\t\t\t\t\t// return;\n\t\t\t\t\t\treject();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t} catch (err) {\n\t\t\t\t// return null;\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t};\n\n\t/**\n\t * Retrieves paginated records\n\t * @param {!TableName} table Object-store (ie' Table) name\n\t * @param {?number} [pageIndex=0] Index of page to retrieve\n\t * @param {?number} [recordsPerPage=20] Number of records to list per page\n\t * @returns {Promise<?{records:ClosedPosition[],totalRecords:number,totalPages:number}>} Records, total number of records and total number of pages\n\t */\n\tconst getPaginatedRecords = async (table, pageIndex, recordsPerPage) => {\n\t\tif (!table || typeof table !== 'string' || table.trim() === '') return null;\n\t\tif (isNaN(Number(pageIndex))) pageIndex = 0; //default to first-page\n\t\tif (!recordsPerPage || isNaN(Number(recordsPerPage))) recordsPerPage = 20; //default to 20 per page\n\n\t\tconst skipToPageOffset = pageIndex * recordsPerPage; // Helpful to advance the cursor to skip records to the start of the desired page\n\t\ttry {\n\t\t\tconst transaction = await _withDbTransaction(table, 'readonly');\n\t\t\tif (!transaction) return null;\n\n\t\t\tconst records = await new Promise((resolve, reject) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst cursorRequest = transaction.objectStore(table).openCursor(null, 'prev');\n\t\t\t\t\tconst recordsAry = [];\n\t\t\t\t\tlet hasAdvancedToOffset = false; // Flag to check if we've already advanced the cursor to the required offset in the list for the requested pageIndex\n\n\t\t\t\t\tcursorRequest.onsuccess = (e) => {\n\t\t\t\t\t\tconst cursor = e.target.result;\n\t\t\t\t\t\tif (cursor) {\n\t\t\t\t\t\t\tif (!hasAdvancedToOffset && skipToPageOffset > 0) {\n\t\t\t\t\t\t\t\tcursor.advance(skipToPageOffset); // Advance the cursor to skip records to the start of the desired page\n\t\t\t\t\t\t\t\thasAdvancedToOffset = true;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Add records to the array until we have enough for the page\n\t\t\t\t\t\t\t\trecordsAry.push(cursor.value);\n\t\t\t\t\t\t\t\tif (recordsAry.length < recordsPerPage) {\n\t\t\t\t\t\t\t\t\tcursor.continue(); //continue to next item\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// We have retrieved all records for the page\n\t\t\t\t\t\t\t\t\tresolve(recordsAry);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// No more matching records or limit reached\n\t\t\t\t\t\t\tresolve(recordsAry);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tcursorRequest.onerror = (e) => {\n\t\t\t\t\t\treject(e);\n\t\t\t\t\t};\n\t\t\t\t} catch (err) {\n\t\t\t\t\treject(err.message);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (!records || !Array.isArray(records) || records.length < 1) return null;\n\n\t\t\tconst totalRecords = await new Promise((resolve, reject) => {\n\t\t\t\tconst countRequest = transaction.objectStore(table).count();\n\t\t\t\tcountRequest.onsuccess = () => {\n\t\t\t\t\tresolve(countRequest.result);\n\t\t\t\t};\n\t\t\t\tcountRequest.onerror = () => {\n\t\t\t\t\treject(null);\n\t\t\t\t};\n\t\t\t});\n\t\t\treturn { records, totalRecords, totalPages: Math.ceil(totalRecords / recordsPerPage) };\n\t\t} catch (err) {\n\t\t\tconsole.error(err);\n\t\t\treturn null;\n\t\t}\n\t};\n\n\t/**\n\t * Cache an item or array of items to IndexedDB\n\t * @param {!TableName} table - Object-store (ie' Table) name\n\t * @param {?string} pk - Primary Key value. Required if Object-store (ie' Table) does not have keyPath specified while creating it\n\t * @param {!{}|[]} data - Data to store. If data is of type array, 'pk' is ignored and can be omitted but object-store must have keyPath specified\n\t * @returns {Promise<boolean>} TRUE if write successful. FALSE otherwise.\n\t */\n\tconst set = async (table, pk, data) => {\n\t\tif (!table || !data) return false;\n\n\t\tconst transaction = await _withDbTransaction(table, 'readwrite');\n\t\tif (!transaction) return false;\n\n\t\tconst objStore = transaction.objectStore(table);\n\n\t\t//here we can chk the max num items limit we've set for the particular table\n\t\t// if (Object.prototype.hasOwnProperty.call(maxNumberOfItemsAllowedInTable, table)) {\n\t\t// \tconst maxAllowed = maxNumberOfItemsAllowedInTable[table];\n\n\t\t// \tconst numItemsAlreadyStored = await new Promise((resolve, reject) => {\n\t\t// \t\tconst countRequest = objStore.count();\n\t\t// \t\tcountRequest.onsuccess = () => {\n\t\t// \t\t\tresolve(countRequest.result);\n\t\t// \t\t};\n\t\t// \t\tcountRequest.onerror = () => {\n\t\t// \t\t\treject(null);\n\t\t// \t\t};\n\t\t// \t});\n\t\t// \tif (!numItemsAlreadyStored) throw new Error('Error reading stored item count');\n\t\t// }\n\t\tconst availableSpace = await _isSpaceAvailableInTable(objStore, table);\n\t\tif (!availableSpace) throw new Error('No more items can be saved to DB');\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\ttry {\n\t\t\t\ttransaction.onabort = () => {\n\t\t\t\t\t// console.log('Cache transaction aborted:', transaction.error);\n\t\t\t\t\treject(transaction.error);\n\t\t\t\t};\n\t\t\t\ttransaction.oncomplete = () => {\n\t\t\t\t\t// console.log(\"Transaction is complete\");\n\t\t\t\t\tresolve(true);\n\t\t\t\t};\n\n\t\t\t\tlet request;\n\t\t\t\tif (Array.isArray(data)) {\n\t\t\t\t\t// console.log('writing array of items');\n\t\t\t\t\t//check if 'keyPath' is configured for this objectStore (ie table) since the PK would be derived from that name for each of the itemswe are writing in bulk\n\t\t\t\t\tif (!objStore.keyPath) {\n\t\t\t\t\t\ttransaction.abort();\n\t\t\t\t\t\tthrow new Error('Error inferring primary key name while writing to cache');\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (let i = 0; i < data.length; i++) {\n\t\t\t\t\t\tif (!Object.prototype.hasOwnProperty.call(data[i], objStore.keyPath)) continue; // break;\t//since the row data object does not have any property that of the primary-key column-name\n\t\t\t\t\t\trequest = objStore.put(data[i]); //since while setting up the table, in '_setupIfNotAlreadyAndGetDbHandle()' we have already specified 'keyPath' as the primary key property, we need not explicitely specify it here\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// console.log('writing one item');\n\t\t\t\t\tif (objStore.keyPath) {\n\t\t\t\t\t\t//if 'objectStore' has 'keyPath' configured, we check if data object has the property with that name\n\t\t\t\t\t\tif (!Object.prototype.hasOwnProperty.call(data, objStore.keyPath)) {\n\t\t\t\t\t\t\ttransaction.abort();\n\t\t\t\t\t\t\tthrow new Error('Error inferring primary key value from data while writing to cache');\n\t\t\t\t\t\t}\n\t\t\t\t\t\trequest = objStore.put(data); //we need not explicitely provide 'pk' since that will b inferred from the 'keyPath' property we configured when creating objectStore\n\t\t\t\t\t} else {\n\t\t\t\t\t\t//else if 'objectStore' does not have keyPath configured, we rely on 'pk' provided\n\t\t\t\t\t\tif (!pk) {\n\t\t\t\t\t\t\ttransaction.abort();\n\t\t\t\t\t\t\tthrow new Error('Primary key value not provided');\n\t\t\t\t\t\t}\n\t\t\t\t\t\trequest = objStore.put(data, pk);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t//we could append a timestamp to the data if need be, before storing it! It'll just help us know how old it is when reading it\n\t\t\t\trequest.onerror = (event) => {\n\t\t\t\t\treject(event.target.error);\n\t\t\t\t};\n\t\t\t\trequest.onsuccess = () => {\n\t\t\t\t\tresolve(true);\n\t\t\t\t};\n\t\t\t} catch (err) {\n\t\t\t\t// return false;\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t};\n\n\t/**\n\t * Cache an item or array of items to IndexedDB\n\t * @param {!TableName} table - Object-store (ie' Table) name\n\t * @param {!Object.<string, *>} dataByPk_obj - Data to store. Object with each property as the primary-key and the value of it is the data to be inserted\n\t * @returns {Promise<boolean>} TRUE if write successful. FALSE otherwise.\n\t */\n\tconst setMultiple = async (table, dataByPk_obj) => {\n\t\tif (!userId || typeof userId !== 'string' || userId.trim() === '') return false;\n\t\tif (!table || !dataByPk_obj || typeof dataByPk_obj !== 'object') return false;\n\t\tconst pkAry = Object.keys(dataByPk_obj);\n\t\tif (pkAry.length < 1) return false;\n\n\t\tconst transaction = await _withDbTransaction(table, 'readwrite');\n\t\tif (!transaction) return false;\n\n\t\tconst objStore = transaction.objectStore(table);\n\n\t\t//here we can chk the max num items limit we've set for the particular table\n\t\tconst availableSpace = await _isSpaceAvailableInTable(objStore, table);\n\t\tif (!availableSpace) throw new Error('No more items can be saved to DB');\n\t\tif (Number.isInteger(availableSpace)) {\n\t\t\tif (pkAry.length > availableSpace) throw new Error('Only ' + availableSpace + ' more itmes can be stored');\n\t\t}\n\n\t\tawait Promise.all(\n\t\t\tpkAry.map((pk) => {\n\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\tconst request = objStore.put(dataByPk_obj[pk], pk);\n\t\t\t\t\trequest.onerror = (event) => {\n\t\t\t\t\t\treject(event.target.error);\n\t\t\t\t\t};\n\t\t\t\t\trequest.onsuccess = () => {\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t}),\n\t\t);\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\ttransaction.onabort = () => reject(transaction.error);\n\t\t\ttransaction.oncomplete = () => resolve(true);\n\t\t});\n\t};\n\n\t/**\n\t * Deletes an item specified by key from specified IndexedDB table or clears entire table\n\t * @param {!TableName} table - Object-store (ie' Table) name\n\t * @param {?string} key - Primary Key value. If omitted, the entire table is cleared\n\t * @returns {Promise<Boolean>} TRUE if delete successful. FALSE otherwise.\n\t */\n\tconst remove = async (table, key) => {\n\t\tif (!userId || typeof userId !== 'string' || userId.trim() === '') return false;\n\t\tif (!table || typeof table !== 'string' || table.trim() === '') return false;\n\n\t\tconst transaction = await _withDbTransaction(table, 'readwrite');\n\t\tif (!transaction) return null;\n\t\treturn new Promise((resolve, reject) => {\n\t\t\ttry {\n\t\t\t\ttransaction.onabort = () => {\n\t\t\t\t\treject(transaction.error);\n\t\t\t\t};\n\t\t\t\ttransaction.oncomplete = () => {\n\t\t\t\t\tresolve(true);\n\t\t\t\t};\n\n\t\t\t\tlet request;\n\t\t\t\tif (key && typeof key === 'string' && key.trim !== '') {\n\t\t\t\t\trequest = transaction.objectStore(table).delete(key);\n\t\t\t\t} else {\n\t\t\t\t\trequest = transaction.objectStore(table).clear();\n\t\t\t\t}\n\n\t\t\t\trequest.onerror = (event) => {\n\t\t\t\t\treject();\n\t\t\t\t};\n\t\t\t\trequest.onsuccess = () => {\n\t\t\t\t\tresolve(true);\n\t\t\t\t};\n\t\t\t\t// resolve(true);\n\t\t\t} catch (err) {\n\t\t\t\t// return false;\n\t\t\t\treject();\n\t\t\t}\n\t\t});\n\t};\n\n\t/**\n\t * Clears all tables cached in IndexedDB for the logged-in user\n\t * @returns {Promise<boolean>} TRUE if clearing successful. FALSE otherwise.\n\t */\n\tconst clearAllTables = async () => {\n\t\tif (!userId || typeof userId !== 'string' || userId.trim() === '') return false;\n\t\tconst db = await __setupIfNotAlreadyAndGetDbHandle();\n\t\tif (!db) return false;\n\t\treturn new Promise((resolve, reject) => {\n\t\t\ttry {\n\t\t\t\tconst tables = db.objectStoreNames; //https://developer.mozilla.org/en-US/docs/Web/API/IDBDatabase/objectStoreNames\n\t\t\t\tif (tables.length < 1) return resolve(true); //since we do not have any tables to clear\n\n\t\t\t\tconst tablesAry = Array.from(tables); //since, db.objectStoreNames return DOMStringList and not Array, we convert it to array\n\n\t\t\t\tconst transaction = db.transaction(tablesAry, 'readwrite'); //https://developer.chrome.com/blog/defining-scope-In-indexeddb-transactions/\n\n\t\t\t\ttransaction.onabort = () => {\n\t\t\t\t\treject(transaction.error);\n\t\t\t\t};\n\t\t\t\ttransaction.oncomplete = () => {\n\t\t\t\t\tresolve(true);\n\t\t\t\t};\n\n\t\t\t\ttablesAry.forEach((table) => {\n\t\t\t\t\t// let clearRequest = transaction.objectStore(table).clear();\t// clear the storage\n\t\t\t\t\t// clearRequest.onerror = (event) => { reject(`Error clearing '${table}' cache`); };\n\t\t\t\t\t// clearRequest.onsuccess = () => {resolve();};\t//this may prematurely resolve promise\n\t\t\t\t\ttransaction.objectStore(table).clear();\n\t\t\t\t\t// console.log(`Cleared ${table} cache`);\n\t\t\t\t});\n\t\t\t\t// resolve(true);\n\t\t\t} catch (err) {\n\t\t\t\treject();\n\t\t\t}\n\t\t});\n\t};\n\n\t//------------------------------+\n\t//\t\tEXPORTED METHODS\t\t|\n\t//------------------------------+\n\t/**\n\t * Reads a position or all positions from IndexedDB for the given userId\n\t * @param {?string} [tradingSymbol] - Trading Symbol. If not specified, fn returns all items\n\t * @param {?('NSE'|'BSE'|'NFO'|'CDS'|'MCX')} [exchange] - Exchange where this instrument is listed\n\t * @param {?Boolean} [isSellTrade=false] - Whether the position we are trying to get for the specified tradingSymbol is a SELL trade. Defaults to FALSE\n\t * @returns {Promise<?(Position|Position[])>} Array in case tradingSymbol not specified OR Object in case tradingSymbol specified OR null\n\t */\n\tconst getPosition = async (tradingSymbol, exchange, isSellTrade) => {\n\t\t// if (!brokerApp || typeof brokerApp !== 'string') return null;\n\t\t// if (!['zerodhaKite', 'aliceBlueAnt'].includes(brokerApp)) return null;\n\n\t\ttry {\n\t\t\t//if tradingSymbol is specified, return that one position\n\t\t\tif (tradingSymbol !== null && tradingSymbol !== undefined && exchange !== null && exchange !== undefined) {\n\t\t\t\t/** @type {Position} */\n\t\t\t\tconst position = await get('positions', `${tradingSymbol}:${exchange}:${isSellTrade ? 'S' : 'B'}`);\n\t\t\t\tif (!position) return null;\n\t\t\t\treturn position;\n\t\t\t}\n\t\t\t//else return all positions\n\t\t\t/** @type {Position[]} */\n\t\t\tconst positions = await get('positions', null);\n\t\t\tif (!positions || !Array.isArray(positions)) return null;\n\t\t\tif (positions.length < 1) return null;\n\t\t\t//here close expired positions since we need not keep em\n\t\t\tconst nonExpiredPositions = positions.map((pos) => {\n\t\t\t\tif (!pos.x) return pos;\n\t\t\t\tif (pos.x < Date.now()) return pos; //if pos is not expired yet, collect it\n\t\t\t\t//here close the position\n\t\t\t\texitPosition(pos.sbl, pos.xh, pos.dir === 'S', 0, pos.qty);\n\t\t\t});\n\t\t\tif (nonExpiredPositions.length < 1) return null;\n\t\t\treturn nonExpiredPositions;\n\t\t} catch (err) {\n\t\t\t// console.error(err);\n\t\t\treturn null;\n\t\t}\n\t};\n\n\t/**\n\t * Sets a position given by symbol, exchange and direction in IndexedDB for the given userId\n\t * @param {!Position} posData - Position data to store\n\t * @returns {Promise<?Position>} Position Object written to IndexedDB OR null\n\t */\n\tconst setPosition = async (posData) => {\n\t\tif (!posData || typeof posData !== 'object') return null;\n\t\t//check for mandatory properties\t//check if 'tradingSymbol', 'exchange', 'avg price' and 'qty' are specified\n\t\tif (\n\t\t\t!Object.prototype.hasOwnProperty.call(posData, 'sbl') ||\n\t\t\t!Object.prototype.hasOwnProperty.call(posData, 'xh') ||\n\t\t\t!Object.prototype.hasOwnProperty.call(posData, 'avg') ||\n\t\t\t!Object.prototype.hasOwnProperty.call(posData, 'qty')\n\t\t)\n\t\t\treturn null;\n\n\t\tif (!Object.prototype.hasOwnProperty.call(posData, 'dir') || (posData.dir !== 'B' && posData.dir !== 'S')) posData.dir = 'B';\n\n\t\t// const pk = `${tradingSymbol}:${isSellTrade ? 'S' : 'B'}`; // generate the PK. It'll be in the form 'INFY:B' for buy trades or 'NIFTY24MAR25000CE:S' for sell trades\n\t\ttry {\n\t\t\t//here check DB if position with same PK alread exists\n\t\t\tconst storedPos = await getPosition(posData.sbl, posData.xh, posData.dir === 'S');\n\t\t\tif (storedPos) {\n\t\t\t\t//calculate the new average entry price\n\t\t\t\t//https://www.motilaloswal.com/blog-details/how-is-average-buy-price-calculated/21242\n\t\t\t\tconst totalPurchaseCost_old = storedPos.avg * storedPos.qty; //calculate total cost of earlier (already averagified) pos entry\n\t\t\t\tconst totalPurchaseCost_new = posData.avg * posData.qty; //calculate total cost of current pos entry avg\n\t\t\t\tconst totalCost = totalPurchaseCost_old + totalPurchaseCost_new;\n\t\t\t\tconst totalQtyPurchased = storedPos.qty + posData.qty;\n\t\t\t\t//modify the object to be stored\n\t\t\t\tposData.qty = totalQtyPurchased;\n\t\t\t\tposData.avg = totalCost / totalQtyPurchased; //new avg\n\t\t\t\tposData.t = Date.now(); //update timestamp\n\t\t\t}\n\t\t\t// } else {\n\t\t\t// \t//since there is no previous entry in the DB, we append the ID to the data as well for it becomes easier from front-end to reference this entry without having to reconstruct from adjacent position properties\n\t\t\t// \tposData.id = `${tradingSymbol}:${isSellTrade ? 'S' : 'B'}`;\n\t\t\t// }\n\t\t\tconst isWriteOpSuccessfull = await set('positions', `${posData.sbl}:${posData.xh}:${posData.dir}`, posData);\n\t\t\tif (!isWriteOpSuccessfull) return null;\n\t\t\treturn posData; //return the data that was added or modified and updated\n\t\t} catch (err) {\n\t\t\tconsole.error(err);\n\t\t\treturn null;\n\t\t}\n\t};\n\n\t/**\n\t * Exits a position (either fully or partially) from IndexedDB active positions table and writes an entry into trade-history table\n\t * @param {!string} tradingSymbol - Instrument token (Trading Symbol)\n\t * @param {('NSE'|'BSE'|'NFO'|'CDS'|'MCX')} exchange - Exchange where this instrument is listed\n\t * @param {?Boolean} [isSellTrade=false] - Whether the position we are trying to close is a SELL trade. Defaults to FALSE. We use this to prepend either 'B:' or 'S:' to the tradingSymbol to use as PK\n\t * @param {number} exitPrice - Close price\n\t * @param {number} exitQty - Quantity to exit in case user intends to exit partially (If not set, entire position is closed)\n\t * @returns {Promise<?ClosedPosition>} Closed position trade-history object\n\t */\n\tconst exitPosition = async (tradingSymbol, exchange, isSellTrade, exitPrice, exitQty) => {\n\t\tif (!tradingSymbol || typeof tradingSymbol !== 'string' || tradingSymbol.trim() === '') return null;\n\n\t\ttry {\n\t\t\t//here read stored position data before deleting it cause we shall need the data to write an entry into order-history table\n\t\t\t/** @type {Position} */\n\t\t\tconst storedPos = await getPosition(tradingSymbol, exchange, isSellTrade);\n\t\t\tif (!storedPos) return null;\n\n\t\t\t//here construct a order-history object or modify the object we read above\n\t\t\tlet closeTimestamp = Date.now();\n\t\t\tif (Object.prototype.hasOwnProperty.call(storedPos, 'x') && storedPos.x < Date.now()) closeTimestamp = storedPos.x; //prefer expiry time for close if it has elapsed\n\t\t\t// storedPos.x = closeTimestamp;\n\n\t\t\tif (!exitQty || exitQty > storedPos.qty) exitQty = storedPos.qty; //if exitQty is either 0 or undefined, by default we exit all units\n\n\t\t\t/** @type {ClosedPosition} */\n\t\t\tconst closedPos = {\n\t\t\t\t//id: `${closeTimestamp}:${tradingSymbol}:${exchange}:${isSellTrade ? 'S' : 'B'}`, //we store ID as part of data object as well for easier referencing from frontend\n\t\t\t\tsbl: storedPos.sbl,\n\t\t\t\txh: storedPos.xh,\n\t\t\t\tavg: storedPos.avg,\n\t\t\t\tcp: exitPrice,\n\t\t\t\tqty: exitQty, //storedPos.qty,\n\t\t\t\tt: storedPos.t,\n\t\t\t\tx: closeTimestamp,\n\t\t\t\tdir: storedPos.dir,\n\t\t\t};\n\t\t\tif (storedPos.sl) closedPos.sl = storedPos.sl;\n\t\t\tif (storedPos.tp) closedPos.tp = storedPos.tp;\n\n\t\t\t//here write to order-history table\n\t\t\tconst isWriteOpSuccessfull = await set(\n\t\t\t\t'trade-history',\n\t\t\t\t`${closeTimestamp}:${tradingSymbol}:${exchange}:${isSellTrade ? 'S' : 'B'}`,\n\t\t\t\t// storedPos,\n\t\t\t\tclosedPos,\n\t\t\t);\n\t\t\tif (!isWriteOpSuccessfull) return null;\n\n\t\t\tif (exitQty === storedPos.qty) {\n\t\t\t\t//we close all units\n\t\t\t\t//here delete entry from positions table\n\t\t\t\tconst isDeleteOpSuccessful = await remove('positions', `${tradingSymbol}:${exchange}:${isSellTrade ? 'S' : 'B'}`);\n\t\t\t} else {\n\t\t\t\t//else if user intends to only close partially\n\t\t\t\t//we update the open position with units that remain to be exited\n\t\t\t\tstoredPos.qty = storedPos.qty - exitQty;\n\t\t\t\tconst isUpdateOpSuccessfull = await set('positions', `${storedPos.sbl}:${storedPos.xh}:${storedPos.dir}`, storedPos);\n\t\t\t}\n\n\t\t\t//we return order-history object irrespective of the positions entry getting deleted or not\n\t\t\t// return { closedPosition: closedPos, closedPositionToken: Number(storedPos.tkn) }; //return order-history object and token of the position (since order-history object doesn't have token)\n\t\t\treturn closedPos;\n\t\t} catch (err) {\n\t\t\tconsole.error(err);\n\t\t\treturn null;\n\t\t}\n\t};\n\n\t//========= WATCHLIST METHODS ========\n\n\t/**\n\t * Reads all instruments from specified watchlist for the particular user\n\t * @param {?string} [watchlistId=1] The watchlist ID\n\t * @returns {Promise<?WatchlistInstrument[]>} Array of instruments stored in watchlist\n\t */\n\tconst getWatchlistInstruments = async (watchlistId) => {\n\t\tif (!watchlistId || !Number.isInteger(watchlistId) || watchlistId < 1 || watchlistId > 4) watchlistId = 1;\n\n\t\ttry {\n\t\t\t/** @type {WatchlistInstrument[]} */\n\t\t\tconst watchlistInstrumentsAry = await get('watchlist-' + watchlistId, null);\n\t\t\tif (!watchlistInstrumentsAry || !Array.isArray(watchlistInstrumentsAry)) return null;\n\t\t\tif (watchlistInstrumentsAry.length < 1) return null;\n\t\t\t// return watchlistInstrumentsAry;\n\t\t\t//here parse csv into object\n\t\t\tconst watchlistInstruments_csvToObj_Ary = watchlistInstrumentsAry.map((csvLine) => {\n\t\t\t\tconst data = csvLine.split(',');\n\t\t\t\t//here read expiry and if expired, delete from DB\n\t\t\t\tif (data[2] !== '' && Number(data[2]) > 1 && Number(data[2]) <= Date.now()) {\n\t\t\t\t\tremove('watchlist-' + watchlistId, `${data[0]}:${data[1]}`);\n\t\t\t\t} else {\n\t\t\t\t\tif (data.length === 3) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tsbl: data[0],\n\t\t\t\t\t\t\txh: data[1],\n\t\t\t\t\t\t\tx: data[2] === '' ? null : data[2],\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (watchlistInstruments_csvToObj_Ary.length < 1) return null;\n\t\t\t// console.log('watchlistInstruments_csvToObj_Ary:', watchlistInstruments_csvToObj_Ary);\n\t\t\treturn watchlistInstruments_csvToObj_Ary;\n\t\t} catch (err) {\n\t\t\tconsole.error(err);\n\t\t\treturn null;\n\t\t}\n\t};\n\n\t/**\n\t * Writes an instrument to specified watchlist for the particular user\n\t * @param {?string} [watchlistId=1] The watchlist ID\n\t * @param {!string} tradingSymbol Instrument token (Trading Symbol)\n\t * @param {('NSE'|'BSE'|'NFO'|'CDS'|'MCX')} exchange Exchange where this instrument is listed\n\t * @param {!number} expiry Expiry in ms\n\t * @returns {Promise<?Boolean>} TRUE if write successfull, FALSE otherwise\n\t */\n\tconst setWatchlistInstrument = async (watchlistId, tradingSymbol, exchange, expiry) => {\n\t\t// if (!userId || typeof userId !== 'string' || userId.trim() === '') return false;\n\t\tif (!watchlistId || !Number.isInteger(watchlistId) || watchlistId < 1 || watchlistId > 4) watchlistId = 1;\n\t\tif (!tradingSymbol || typeof tradingSymbol !== 'string' || tradingSymbol.trim() === '') return false;\n\t\tif (!exchange || typeof exchange !== 'string' || exchange.trim() === '') return false;\n\t\tif (!expiry || !Number.isInteger(expiry)) expiry = '';\n\n\t\ttry {\n\t\t\t// return await AppDataIndexedDb.set(userId, 'watchlist-' + watchlistId, `${tradingSymbol}:${exchange}`, {\n\t\t\t// \ttradingSymbol,\n\t\t\t// \texchange,\n\t\t\t// });\n\t\t\treturn await set('watchlist-' + watchlistId, `${tradingSymbol}:${exchange}`, `${tradingSymbol},${exchange},${expiry}`);\n\t\t} catch (err) {\n\t\t\tconsole.error(err);\n\t\t\treturn false;\n\t\t}\n\t};\n\n\t/**\n\t * Writes multiple instruments to specified watchlist for the particular user\n\t * @param {?string} [watchlistId=1] The watchlist ID\n\t * @param {!WatchlistInstrument[]} instrumentsAry Array of instruments to add to watchlist\n\t * @returns {Promise<Boolean>} TRUE if write successfull, FALSE otherwise\n\t */\n\tconst setWatchlistMultipleInstruments = async (watchlistId, instrumentsAry) => {\n\t\t// if (!userId || typeof userId !== 'string' || userId.trim() === '') return false;\n\t\tif (!watchlistId || !Number.isInteger(watchlistId) || watchlistId < 1 || watchlistId > 4) watchlistId = 1;\n\t\tif (!instrumentsAry || !Array.isArray(instrumentsAry) || instrumentsAry.length < 1) return false;\n\n\t\tconst mappedObj = instrumentsAry.reduce((acc, instrument) => {\n\t\t\t//map each instrument from array to object where the key is the PK for IndexedDB entry\n\t\t\t// acc[`${instrument.sbl}:${instrument.xh}`] = instrument;\t//instead, we save as CSV\n\t\t\tacc[`${instrument.sbl}:${instrument.xh}`] = `${instrument.sbl},${instrument.xh},${\n\t\t\t\tObject.prototype.hasOwnProperty.call(instrument, 'x') && instrument.x && Number.isInteger(instrument.x) ? instrument.x : ''\n\t\t\t}`;\n\t\t\treturn acc;\n\t\t}, {});\n\n\t\ttry {\n\t\t\treturn await setMultiple('watchlist-' + watchlistId, mappedObj);\n\t\t} catch (err) {\n\t\t\tconsole.error(err);\n\t\t\treturn false;\n\t\t}\n\t};\n\n\t/**\n\t * Deletes an instrument from specified watchlist for the particular user\n\t * @param {?string} [watchlistId=1] The watchlist ID\n\t * @param {!string} tradingSymbol Instrument token (Trading Symbol)\n\t * @param {('NSE'|'BSE'|'NFO'|'CDS'|'MCX')} exchange Exchange where this instrument is listed\n\t * @returns {Promise<?Boolean>} TRUE if delete successfull, FALSE otherwise\n\t */\n\tconst deleteWatchlistInstrument = async (watchlistId, tradingSymbol, exchange) => {\n\t\t// if (!userId || typeof userId !== 'string' || userId.trim() === '') return false;\n\t\tif (!watchlistId || !Number.isInteger(watchlistId) || watchlistId < 1 || watchlistId > 4) watchlistId = 1;\n\t\tif (!tradingSymbol || typeof tradingSymbol !== 'string' || tradingSymbol.trim() === '') return false;\n\t\tif (!exchange || typeof exchange !== 'string' || exchange.trim() === '') return false;\n\n\t\ttry {\n\t\t\treturn await remove('watchlist-' + watchlistId, `${tradingSymbol}:${exchange}`);\n\t\t} catch (err) {\n\t\t\tconsole.error(err);\n\t\t\treturn false;\n\t\t}\n\t};\n\n\t/**\n\t * Deletes all instruments from specified watchlist for the particular user\n\t * @param {?string} [watchlistId=1] The watchlist ID\n\t * @returns {Promise<?Boolean>} TRUE if clear successfull, FALSE otherwise\n\t */\n\tconst clearWatchlist = async (watchlistId) => {\n\t\t// if (!userId || typeof userId !== 'string' || userId.trim() === '') return false;\n\t\tif (!watchlistId || !Number.isInteger(watchlistId) || watchlistId < 1 || watchlistId > 4) watchlistId = 1;\n\n\t\ttry {\n\t\t\treturn await remove('watchlist-' + watchlistId, null);\n\t\t} catch (err) {\n\t\t\tconsole.error(err);\n\t\t\treturn false;\n\t\t}\n\t};\n\n\t//========= TRADE-HISTORY METHODS ========\n\n\t/**\n\t * Reads trade-history records for the requested page for the given userId\n\t * @param {?number} [page = 1] Page number to retrieve records for\n\t * @param {?number} [showPerPage = 20] Number of records to display per page\n\t * @returns {Promise<?{records:ClosedPosition[],totalRecords:number,totalPages:number}>} Records, total number of records and total number of pages\n\t */\n\tconst getTradeHistory = async (page, showPerPage) => {\n\t\tif (page === undefined || isNaN(Number(page))) page = 1; //default to page 1\n\t\ttry {\n\t\t\treturn await getPaginatedRecords('trade-history', page - 1, showPerPage || 20);\n\t\t} catch (err) {\n\t\t\tconsole.error(err);\n\t\t\treturn null;\n\t\t}\n\t};\n\n\t/**\n\t * Clears all trade-history records for the given userId\n\t * @returns {Promise<boolean>} TRUE if clear-op successful, FALSE otherwise\n\t */\n\tconst clearEntireTradeHistory = async () => {\n\t\t// if (!userId || typeof userId !== 'string' || userId.trim() === '') return false;\n\t\ttry {\n\t\t\treturn await remove('trade-history', null);\n\t\t} catch (err) {\n\t\t\tconsole.error(err);\n\t\t\treturn false;\n\t\t}\n\t};\n\n\t//==========================+\n\t//\t\t\t\t\t\t\t|\n\t//\t\tEFFECT-HOOKS\t\t|\n\t//\t\t\t\t\t\t\t|\n\t//==========================+\n\n\t// useEffect(() => {\n\t// \tif (!isOnline) return;\n\t// \tif (!kaagziUserId && !angelOneUserId) return; //proceed to chk and download master-data only if user is logged into both, Kaagzi and Zerodha Kite\n\t// \t(async () => {\n\t// \t\tawait _checkValidityAndReFetchIfNecessary();\n\t// \t})();\n\t// }, [isOnline, kaagziUserId, angelOneUserId]); //runs on first mount and then when either isOnline, kaagziUserId or angelOneUserId changes\n\n\treturn (\n\t\t<AppDataIndexedDbContext.Provider\n\t\t\tvalue={{\n\t\t\t\tgetPosition,\n\t\t\t\tsetPosition,\n\t\t\t\texitPosition,\n\t\t\t\tgetWatchlistInstruments,\n\t\t\t\tsetWatchlistInstrument,\n\t\t\t\tsetWatchlistMultipleInstruments,\n\t\t\t\tdeleteWatchlistInstrument,\n\t\t\t\tclearWatchlist,\n\t\t\t\tgetTradeHistory,\n\t\t\t\tclearEntireTradeHistory,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</AppDataIndexedDbContext.Provider>\n\t);\n}\n","//BrowserContextProvider -- https://github.com/facebook/docusaurus/blob/main/packages/docusaurus/src/client/browserContext.tsx\n//BrowserOnly component -- https://github.com/facebook/docusaurus/blob/main/packages/docusaurus/src/client/exports/BrowserOnly.tsx\n//useIsBrowser hook -- https://github.com/facebook/docusaurus/blob/main/packages/docusaurus/src/client/exports/useIsBrowser.ts\n//The perils of rehydration -- https://www.joshwcomeau.com/react/the-perils-of-rehydration/#abstractions\n\n/*global process*/\n\nimport React, { useEffect, useState } from 'react';\n\nexport default function BrowserOnly({ children, fallback }) {\n\tconst [isBrowser, setIsBrowser] = useState(false);\n\n\tuseEffect(() => {\n\t\tsetIsBrowser(true);\n\t}, []);\n\n\tif (isBrowser) {\n\t\t// if (typeof children !== 'function') {\n\t\tif (typeof children !== 'function' && process.env.NODE_ENV === 'development') {\n\t\t\t//https://www.gatsbyjs.com/docs/how-to/local-development/environment-variables/\n\n\t\t\tthrow new Error(\n\t\t\t\t'The children of <BrowserOnly> must be a \"render function\", e.g. <BrowserOnly>{() => <span>{window.location.href}</span>}</BrowserOnly>',\n\t\t\t);\n\t\t}\n\t\treturn <>{children?.()}</>;\n\t}\n\n\t// return null\n\treturn fallback ?? null;\n}\n","// extracted by mini-css-extract-plugin\nexport var current = \"pagination-module--current--d9faf\";\nexport var paginationLinks = \"pagination-module--paginationLinks--01e48\";\nexport var separator = \"pagination-module--separator--0056b\";","import React from 'react';\r\n\r\nimport * as styles from './pagination.module.css';\r\n\r\n/**\r\n * Displays pagination\r\n * @param {Object} props props passed to this component\r\n * @param {number} props.totalPages Total number of pages\r\n * @param {number} props.currentPage Page that is currently active\r\n * @param {(number)=>{}} props.goToPage Callback function that fires on page-button click. Argument is the page-number to activate\r\n */\r\nexport default function Pagination({ totalPages, currentPage, goToPage }) {\r\n\t//'totalPages' is same as the last page\r\n\t// basePath = basePath || ''; //eg -- 'projects'\r\n\t// pageNumPrefix = pageNumPrefix || ''; //eg' -- 'page-' would yield a url like 'projects/page-2'\r\n\treturn (\r\n\t\t1 < totalPages && (\r\n\t\t\t<div className={styles.paginationLinks}>\r\n\t\t\t\t{\r\n\t\t\t\t\t//1 separator 3 4 '5' 6 7 separator 9\t//thus we can see that if there are 9 or less pages, we do not need separators\r\n\t\t\t\t\t9 < totalPages ? ( //if num pages are more than 9, we only render links to first page, last page and 2 pages before and after current page\r\n\t\t\t\t\t\t//1 .... 5 6 '7' 8 9 .... 24\r\n\t\t\t\t\t\tcurrentPage < 6 ? ( //if current page is less than 6 (ie within first 5 pages), render the first page-links in series and then render the link to last page\r\n\t\t\t\t\t\t\t//1 2 '3' 4 5 .... 12\t\t\t\t//handles this scenario\r\n\t\t\t\t\t\t\t//1 2 3 4 '5' 6 7 .... 12\t\t\t//handles this scenario\r\n\r\n\t\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t\t<PaginationSeries seriesStart={1} seriesEnd={currentPage + 2} currentPage={currentPage} />\r\n\t\t\t\t\t\t\t\t<span className={styles.separator}>...</span>\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\tgoToPage(totalPages);\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{totalPages}\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</>\r\n\t\t\t\t\t\t) : currentPage > totalPages - 5 ? ( //else if current page is within the last 5 pages, render the link to first page and then render last page-links in series\r\n\t\t\t\t\t\t\t//1 .... 6 7 '8' 9 10 11 12\t\t\t//handles this scenario\r\n\t\t\t\t\t\t\t//1 .... 9 10 '11' 12\t\t\t\t//handles this scenario\r\n\t\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\tgoToPage(1);\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t1\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t<span className={styles.separator}>...</span>\r\n\t\t\t\t\t\t\t\t<PaginationSeries seriesStart={currentPage - 2} seriesEnd={totalPages} currentPage={currentPage} />\r\n\t\t\t\t\t\t\t</>\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t//else if current page is more than 6 and less than last-page - 5\r\n\t\t\t\t\t\t\t//1 .... 4 5 '6' 7 8 .... 11\t//handles this scenario\r\n\t\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\tgoToPage(1);\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t1\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t<span className={styles.separator}>...</span>\r\n\t\t\t\t\t\t\t\t<PaginationSeries seriesStart={currentPage - 2} seriesEnd={currentPage + 2} currentPage={currentPage} />\r\n\t\t\t\t\t\t\t\t<span className={styles.separator}>...</span>\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\tgoToPage(totalPages);\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{totalPages}\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</>\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t//else if num pages are 9 or less\r\n\t\t\t\t\t\t//1 2 3 4 5 6 '7' 8 9\r\n\t\t\t\t\t\t<PaginationSeries seriesStart={1} seriesEnd={totalPages} currentPage={currentPage} goToPage={goToPage} />\r\n\t\t\t\t\t)\r\n\t\t\t\t}\r\n\t\t\t</div>\r\n\t\t)\r\n\t);\r\n}\r\n\r\nfunction PaginationSeries({ seriesStart, seriesEnd, currentPage, goToPage }) {\r\n\treturn (\r\n\t\t//for(let i = seriesStart; i <= seriesEnd; i++){}\r\n\t\tArray.from({ length: seriesEnd - seriesStart + 1 }, (_, i) =>\r\n\t\t\t//i + seriesStart gives us the page # currently being looped\r\n\t\t\tcurrentPage === i + seriesStart ? (\r\n\t\t\t\t<span key={`pn${i + seriesStart}`} className={styles.current}>\r\n\t\t\t\t\t{currentPage}\r\n\t\t\t\t</span>\r\n\t\t\t) : (\r\n\t\t\t\t<button\r\n\t\t\t\t\tkey={`pn${i + seriesStart}`}\r\n\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\tgoToPage(i + seriesStart);\r\n\t\t\t\t\t}}\r\n\t\t\t\t>\r\n\t\t\t\t\t{i + seriesStart}\r\n\t\t\t\t</button>\r\n\t\t\t),\r\n\t\t)\r\n\t);\r\n}\r\n","// extracted by mini-css-extract-plugin\nexport var cnfrmDlgC = \"confirmationDialog-module--cnfrmDlgC--ff573\";","import React from 'react';\n// import { createPortal } from 'react-dom';\n// import clsx from 'clsx';\nimport Modal from '@containers/Modal';\nimport Button, { ButtonListContainer } from '@components/ui/Button';\n\nimport * as styles from './confirmationDialog.module.css';\n\n/**\n * Confirmation dialog presented inside a modal\n * @param {Object} prop - prop passed to this component\n * @param {()=>{}} [prop.doOnShow] - Callback fn to execute when dialog is shown\n * @param {()=>{}} [prop.doOnClose] - Callback fn to execute on dialog close\n * @param {string} [prop.confirmationNote='Do you confirm?'] - confirmation note\n * @param {()=>{}} [prop.doOnCancel] - Callback fn to execute when user does not give confirmation\n * @param {()=>{}} prop.doOnConfirm - Callback fn to execute when user confirms action\n * @param {string} prop.confirmBtnText - Text to be shown on confirm button\n */\nexport default function ConfirmationDialog({ doOnShow, doOnClose, confirmationNote, doOnCancel, doOnConfirm, confirmBtnText, ...restProps }) {\n\treturn (\n\t\t<Modal useCloseBtn={false} disallowManualClosing={true} doOnOpen={doOnShow} doOnClose={doOnClose}>\n\t\t\t{(close) => (\n\t\t\t\t<div className={styles.cnfrmDlgC} {...restProps}>\n\t\t\t\t\t<p>{confirmationNote || 'Do you confirm?'}</p>\n\t\t\t\t\t<ButtonListContainer>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\t\tisDark={true}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tdoOnConfirm && typeof doOnConfirm === 'function' && doOnConfirm();\n\t\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{confirmBtnText || 'Confirm'}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\tisDark={true}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tdoOnCancel && typeof doOnCancel === 'function' && doOnCancel();\n\t\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</ButtonListContainer>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</Modal>\n\t);\n}\n\n/* export default function ConfirmationDialog({ children, useCloseBtn, doOnShow, doOnClose, disallowManualClosing, ...restProps }) {\n\tconst [isViz, setIsViz] = useState(false);\n\n\tconst _open = () => {\n\t\tdocument && document.body && (document.body.style.overflow = 'hidden');\n\t\tsetTimeout(() => {\n\t\t\tsetIsViz(true);\n\t\t\tdoOnShow &&\n\t\t\t\ttypeof doOnShow == 'function' &&\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tdoOnShow();\n\t\t\t\t}, 200);\n\t\t}, 10); //a slight delay of 10ms jst for CSS transition state-change to take effect\n\t};\n\tconst close = () => {\n\t\tsetIsViz(false); //this.setState({ isVisible: false });\n\t\tsetTimeout(() => {\n\t\t\tdocument && document.body && (document.body.style.overflow = 'visible');\n\t\t\tdoOnClose && typeof doOnClose == 'function' && doOnClose();\n\t\t}, 200);\n\t};\n\n\tuseEffect(() => {\n\t\t_open();\n\n\t\treturn () => {\n\t\t\tdocument && document.body && (document.body.style.overflow = 'visible');\n\t\t};\n\t}, []);\n\n\treturn createPortal(\n\t\t<div className={clsx(styles.wrap, isViz && styles.isViz)} {...restProps}>\n\t\t\t{useCloseBtn || disallowManualClosing ? <div className={styles.bg}></div> : <div className={styles.bg} onClick={close}></div>}\n\t\t\t<div className={styles.modal}>\n\t\t\t\t<main>{typeof children == 'function' ? children(close) : children}</main>\n\t\t\t\t{useCloseBtn && <span className={styles.xBtn} onClick={close} />}\n\t\t\t</div>\n\t\t</div>,\n\t\tdocument.body,\n\t);\n} */\n","// extracted by mini-css-extract-plugin\nexport var dataRow = \"tradeHistory-module--dataRow--011ac\";\nexport var entry = \"tradeHistory-module--entry--bebad\";\nexport var exit = \"tradeHistory-module--exit--7a095\";\nexport var infoDataRow = \"tradeHistory-module--infoDataRow--95817\";\nexport var isBuy = \"tradeHistory-module--isBuy--9676f\";\nexport var isSell = \"tradeHistory-module--isSell--03502\";\nexport var metaDataRow = \"tradeHistory-module--metaDataRow--214c1\";\nexport var noTradesEmptyC = \"tradeHistory-module--noTradesEmptyC--a4e51\";\nexport var qty = \"tradeHistory-module--qty--b6104\";\nexport var tradeHistC = \"tradeHistory-module--tradeHistC--cc1b2\";\nexport var tradeHistFtr = \"tradeHistory-module--tradeHistFtr--71fe9\";\nexport var tradeHistHdr = \"tradeHistory-module--tradeHistHdr--6744a\";\nexport var tradeHistMain = \"tradeHistory-module--tradeHistMain--0437b\";\nexport var tradeHistUl = \"tradeHistory-module--tradeHistUl--407ee\";","import React, { useContext, useEffect, useState } from 'react';\n\n// import { chromeWebExtension_UUID, firefoxWebExtension_UUID } from '@webextensionConfig';\n\nimport ColoredNumberDisplay from '@appSharedComponents/ColoredNumberDisplay';\n// import PreventRerenderIfValueInvalid from '@components/PreventRerenderIfValueInvalid';\nimport Button from '@components/ui/Button';\n// import Pagination from '@components/Pagination';\nimport Pagination from '@components/Pagination';\nimport Loading from '@components/ui/Loading';\nimport EmptyGfx from '@appSharedComponents/EmptyGfx';\nimport ConfirmationDialog from '@components/ConfirmationDialog';\n\nimport { ToastNotificationContext } from '@providers/ToastNotification';\n// import { NetworkCheckContext } from '@providers/NetworkAvailabilityCheck';\nimport { UserContext } from '@providers/User';\n// import { KiteWebSocketContext } from '@kiteProviders/KiteWebSocket';\n// import { TabsSwitcherContext } from '@containers/Tabs';\n\nimport { AppDataIndexedDbContext } from '@appSharedProviders/AppIndexedDb';\n\nimport * as styles from './tradeHistory.module.css';\n\n//==========================+\n//\t\tTYPE DEFINITIONS\t|\n//==========================+\n\n/** @typedef {import('@types_appShared').ClosedPosition} ClosedPosition Broker agnostic closed-position data stored in 'trade-history' objectStore / table */\n\n//======================+\n//\t\tCOMPONENT\t\t|\n//======================+\n\n/**\n * Displays Trade History\n * @param {Object} prop Prop object passed to this component\n * @param {?()=>{}} [prop.closeTradeHistory] Callback fn that can be used to close this trade-history (For eg, useful to close the bottom sheet)\n */\nexport default function TradeHistory({ closeTradeHistory }) {\n\tconst [isWip, setIsWip] = useState(true); //we start with true & then shall set this to false once first-read from DB is done\n\tconst [tradesAry, setTradesAry] = useState(/** @type {ClosedPosition[]} */ ([]));\n\tconst [totalTrades, setTotalTrades] = useState(0);\n\tconst [totalPages, setTotalPages] = useState(0);\n\tconst [currentPage, setCurrentPage] = useState(1);\n\tconst [showClearHistoryDelConfrmtnDlg, setShowClearHistoryDelConfrmtnDlg] = useState(false);\n\n\tconst { notify } = useContext(ToastNotificationContext);\n\tconst { checkIfPlanActive } = useContext(UserContext);\n\tconst { getTradeHistory, clearEntireTradeHistory } = useContext(AppDataIndexedDbContext);\n\n\t/**\n\t * Gets trades from trade-history IndexedDB for the currently active page\n\t * @returns {Promise<boolean>} TRUE if read successful, FALSE otherwise\n\t */\n\tconst getTradeHistoryForCurrentlyActivePageNum_n_loadIntoState = async () => {\n\t\ttry {\n\t\t\tconst isPlanActive = await checkIfPlanActive(); //this shall cause the 'PlaneExpiryGateway' component to not render this component and display plan expired dialog\n\t\t\tif (!isPlanActive) throw new Error('Plan Expired!');\n\t\t\tsetIsWip(true);\n\t\t\tconst dataObj = await getTradeHistory(currentPage, 20);\n\t\t\t// console.log(dataObj);\n\t\t\tif (!dataObj) throw new Error('Trade history is empty');\n\t\t\tif (!Object.prototype.hasOwnProperty.call(dataObj, 'records') || dataObj.records.length < 1) throw new Error('No trades found');\n\t\t\tif (!Object.prototype.hasOwnProperty.call(dataObj, 'totalPages')) throw new Error('Error inferring number of trades');\n\t\t\tsetTradesAry(dataObj.records);\n\t\t\tsetTotalPages(dataObj.totalPages);\n\t\t\tsetTotalTrades(dataObj.totalRecords);\n\t\t\treturn true;\n\t\t} catch (err) {\n\t\t\t// console.error(err);\n\t\t\tnotify(err.message || 'Error reading trade-history records', 'err');\n\t\t\tsetTradesAry([]);\n\t\t\treturn false;\n\t\t} finally {\n\t\t\tsetIsWip(false);\n\t\t}\n\t};\n\n\t// const removeTrade = () => {};\n\n\t/** Clears trade history\n\t * @returns {Boolean} TRUE if history cleared successfully, FALSE otherwise\n\t */\n\tconst clearTradeHistory = async () => {\n\t\ttry {\n\t\t\tconst isPlanActive = await checkIfPlanActive(); //this shall cause the 'PlaneExpiryGateway' component to not render this component and display plan expired dialog\n\t\t\tif (!isPlanActive) throw new Error('Plan Expired!');\n\t\t\tsetIsWip(true);\n\t\t\tconst opSts = await clearEntireTradeHistory();\n\t\t\tif (!opSts) throw new Error();\n\t\t\tsetTradesAry([]);\n\t\t\tsetTotalPages(0);\n\t\t\tsetTotalTrades(0);\n\t\t\tsetCurrentPage(1);\n\t\t\treturn true;\n\t\t} catch (err) {\n\t\t\tnotify(err.message || 'Error clearing trade-history', 'err');\n\t\t\treturn false;\n\t\t} finally {\n\t\t\tsetIsWip(false);\n\t\t}\n\t};\n\n\tuseEffect(() => {\n\t\t(async () => {\n\t\t\tawait getTradeHistoryForCurrentlyActivePageNum_n_loadIntoState();\n\t\t})();\n\t}, [currentPage]); //runs on first mount and then whenever currentPage changes\n\n\treturn (\n\t\t<>\n\t\t\t<div className={styles.tradeHistC}>\n\t\t\t\t{tradesAry.length > 0 && (\n\t\t\t\t\t<div className={styles.tradeHistHdr}>\n\t\t\t\t\t\t{/* <Button variant=\"tertiary\" icon=\"trash-2\" isDark={true} onClick={clearTradeHistory}>Clear All</Button> */}\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\ticon=\"trash-2\"\n\t\t\t\t\t\t\tisDark={true}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tsetShowClearHistoryDelConfrmtnDlg(true);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tClear All\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<span>Total trades: {Intl.NumberFormat('en-IN').format(totalTrades)}</span>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t<div className={styles.tradeHistMain}>\n\t\t\t\t\t{tradesAry.length < 1 ? (\n\t\t\t\t\t\t// <div className={styles.noTradesEmptyC}>No trades to display</div>\n\t\t\t\t\t\t<EmptyGfx icon=\"trade-history\" note=\"No Trades to display\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ul className={styles.tradeHistUl}>\n\t\t\t\t\t\t\t{tradesAry.map((trade, i) => {\n\t\t\t\t\t\t\t\t//here check if position is expired\n\t\t\t\t\t\t\t\tconst { sbl, xh, avg, cp, qty, dir, t, x } = trade;\n\n\t\t\t\t\t\t\t\t//here calculate pnl\n\t\t\t\t\t\t\t\tconst tradePnl = (dir === 'S' ? avg - cp : cp - avg) * qty;\n\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<li key={`${i}:${t}:${xh}:${sbl}:${dir}`} className={dir === 'S' ? styles.isSell : styles.isBuy}>\n\t\t\t\t\t\t\t\t\t\t<div className={styles.dataRow}>\n\t\t\t\t\t\t\t\t\t\t\t<span>{sbl}</span>\n\t\t\t\t\t\t\t\t\t\t\t<ColoredNumberDisplay currentVal={tradePnl} baseVal={0} />\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div className={styles.metaDataRow}>\n\t\t\t\t\t\t\t\t\t\t\t<span className={styles.qty}>{qty}</span>\n\t\t\t\t\t\t\t\t\t\t\t<span className={styles.entry}>{avg}</span>\n\t\t\t\t\t\t\t\t\t\t\t<span className={styles.exit}>{cp}</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t)}\n\t\t\t\t\t{totalPages > 1 && (\n\t\t\t\t\t\t<div className={styles.tradeHistFtr}>\n\t\t\t\t\t\t\t{/* <Button variant=\"tertiary\" onClick={() => {}} icon=\"chevron-left\" isDark={true} />\n\t\t\t\t\t<Button variant=\"tertiary\" onClick={() => {}} icon=\"chevron-right\" isDark={true} /> */}\n\t\t\t\t\t\t\t<Pagination totalPages={totalPages} currentPage={currentPage} goToPage={setCurrentPage} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t{isWip && <Loading />}\n\t\t\t</div>\n\t\t\t{showClearHistoryDelConfrmtnDlg && (\n\t\t\t\t<ConfirmationDialog\n\t\t\t\t\tconfirmationNote=\"Confirm deleting entire trade history?\"\n\t\t\t\t\tdoOnClose={() => {\n\t\t\t\t\t\tsetShowClearHistoryDelConfrmtnDlg(false);\n\t\t\t\t\t}}\n\t\t\t\t\t// doOnConfirm={clearTradeHistory}\n\t\t\t\t\tdoOnConfirm={() => {\n\t\t\t\t\t\tclearTradeHistory().then((isClearedSuccessfully) => {\n\t\t\t\t\t\t\tisClearedSuccessfully && closeTradeHistory();\n\t\t\t\t\t\t});\n\t\t\t\t\t}}\n\t\t\t\t\tconfirmBtnText=\"Delete\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t</>\n\t);\n}\n","// extracted by mini-css-extract-plugin\nexport var active = \"header-module--active--0b6dd\";\nexport var hdr = \"header-module--hdr--ed9b0\";\nexport var logoC = \"header-module--logoC--2127a\";\nexport var navMenu = \"header-module--navMenu--ff5f0\";","/*global require*/\r\nimport React, { Children, createContext, useContext, useEffect, useRef, useState } from 'react';\r\nimport { Link } from 'gatsby';\r\nimport Icon from '@components/ui/Icon';\r\nimport BrowserOnly from '@components/BrowserOnly';\r\nimport BottomSheet from '@containers/BottomSheet';\r\n// import BrokerSelector from '@appSharedComponents/BrokerSelector';\r\nimport TradeHistory from '@appSharedComponents/TradeHistory';\r\n// import UserDropDown from '@components/User/UserDropdown';\r\nimport { hdr as hdrId, logoC as logoId, navMenu as navMenuId, active as activeClass } from './header.module.css';\r\n// import logo from '../../images/logo.png';\r\n\r\n/** Website header navbar */\r\nexport default function Header() {\r\n\treturn (\r\n\t\t<header id={hdrId}>\r\n\t\t\t<div id={logoId}>\r\n\t\t\t\t<Link to=\"/\">\r\n\t\t\t\t\t<img src=\"/img/logo.svg\" alt=\"Kaagzi\" />\r\n\t\t\t\t</Link>\r\n\t\t\t</div>\r\n\r\n\t\t\t<nav id={navMenuId}>\r\n\t\t\t\t<ul>\r\n\t\t\t\t\t<li>\r\n\t\t\t\t\t\t<Link activeClassName={activeClass} to=\"/\">\r\n\t\t\t\t\t\t\t<Icon icon=\"home2\" />\r\n\t\t\t\t\t\t\t<span>Home</span>\r\n\t\t\t\t\t\t</Link>\r\n\t\t\t\t\t</li>\r\n\t\t\t\t\t<li>\r\n\t\t\t\t\t\t<Link activeClassName={activeClass} to=\"/app\">\r\n\t\t\t\t\t\t\t<Icon icon=\"smartphone\" />\r\n\t\t\t\t\t\t\t<span>App</span>\r\n\t\t\t\t\t\t</Link>\r\n\t\t\t\t\t</li>\r\n\t\t\t\t\t<li>\r\n\t\t\t\t\t\t<Link activeClassName={activeClass} to=\"/pricing\">\r\n\t\t\t\t\t\t\t<Icon icon=\"rupee-sign\" />\r\n\t\t\t\t\t\t\t<span>Pricing</span>\r\n\t\t\t\t\t\t</Link>\r\n\t\t\t\t\t</li>\r\n\t\t\t\t\t<li>\r\n\t\t\t\t\t\t<Link activeClassName={activeClass} partiallyActive={true} to=\"/guide\">\r\n\t\t\t\t\t\t\t<Icon icon=\"book-open\" />\r\n\t\t\t\t\t\t\t<span>Guide</span>\r\n\t\t\t\t\t\t</Link>\r\n\t\t\t\t\t</li>\r\n\t\t\t\t\t<li>\r\n\t\t\t\t\t\t{/* <UserDropDown /> */}\r\n\t\t\t\t\t\t{/* <BrowserOnly>{() => <UserDropDown />}</BrowserOnly> */}\r\n\t\t\t\t\t\t<BrowserOnly>\r\n\t\t\t\t\t\t\t{() => {\r\n\t\t\t\t\t\t\t\tconst UserDropDown = require('@components/userControlPanel/UserDropdown').default;\r\n\t\t\t\t\t\t\t\treturn <UserDropDown />;\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t</BrowserOnly>\r\n\t\t\t\t\t</li>\r\n\t\t\t\t</ul>\r\n\t\t\t</nav>\r\n\t\t\t{/*<span>Search</span>*/}\r\n\t\t</header>\r\n\t);\r\n}\r\n\r\n/**\r\n * Header navbar to be used in app screens.\r\n * Note that the TradeHistory component relies on AppDataIndexedDb proider and thus this component should be imported in the ositions component or any component which is a child of the mentioned provider\r\n * @param {Object} props React props passed to this component\r\n * @param {('Zerodha'| 'Angel One'| 'Upstox'| 'Alice Blue')} props.broker Stock Broker\r\n * @param {string} props.brokerLoggedInUserName Name of user logged in with broker\r\n * @param {?()=>{}} [props.brokerLogOut] Logout function in case we login user with broker with API\r\n * @param {?()=>{}} [props.doOnWatchListBtnClick] Callback fn to execute on watchlist button click\r\n */\r\nexport function AppHeader({ broker, brokerLoggedInUserName, brokerLogOut, doOnWatchListBtnClick }) {\r\n\tconst [isTradeHistoryViz, setIsTradeHistoryViz] = useState(false);\r\n\treturn (\r\n\t\t<>\r\n\t\t\t<header id={hdrId}>\r\n\t\t\t\t<div id={logoId}>\r\n\t\t\t\t\t<Link to=\"/\">\r\n\t\t\t\t\t\t<img src=\"/img/logo.svg\" alt=\"Kaagzi\" />\r\n\t\t\t\t\t</Link>\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t<nav id={navMenuId}>\r\n\t\t\t\t\t<ul>\r\n\t\t\t\t\t\t<li>\r\n\t\t\t\t\t\t\t<BrowserOnly>\r\n\t\t\t\t\t\t\t\t{() => {\r\n\t\t\t\t\t\t\t\t\tconst BrokerSelector = require('@appSharedComponents/BrokerSelector').default;\r\n\t\t\t\t\t\t\t\t\treturn <BrokerSelector broker={broker} brokerLoggedInUserName={brokerLoggedInUserName} brokerLogOut={brokerLogOut} />;\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t</BrowserOnly>\r\n\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t{doOnWatchListBtnClick && typeof doOnWatchListBtnClick === 'function' && (\r\n\t\t\t\t\t\t\t<li>\r\n\t\t\t\t\t\t\t\t<button onClick={doOnWatchListBtnClick}>\r\n\t\t\t\t\t\t\t\t\t<Icon icon=\"binocular\" />\r\n\t\t\t\t\t\t\t\t\t<span>Watchlist</span>\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t{/* {doOnTradeHistoryBtnClick && typeof doOnTradeHistoryBtnClick === 'function' && (\r\n\t\t\t\t\t\t<li>\r\n\t\t\t\t\t\t\t<button onClick={doOnTradeHistoryBtnClick}>\r\n\t\t\t\t\t\t\t\t<Icon icon=\"rupee-sign\" />\r\n\t\t\t\t\t\t\t\t<span>Trade History</span>\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</li>\r\n\t\t\t\t\t)} */}\r\n\t\t\t\t\t\t<li>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetIsTradeHistoryViz(true);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<Icon icon=\"trade-history\" />\r\n\t\t\t\t\t\t\t\t<span>Trade History</span>\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t{/* <li>\r\n\t\t\t\t\t\t<Link activeClassName={activeClass} partiallyActive={true} to=\"/guide\">\r\n\t\t\t\t\t\t\t<Icon icon=\"book-open\" />\r\n\t\t\t\t\t\t\t<span>Guide</span>\r\n\t\t\t\t\t\t</Link>\r\n\t\t\t\t\t</li> */}\r\n\t\t\t\t\t\t<li>\r\n\t\t\t\t\t\t\t{/* <UserDropDown /> */}\r\n\t\t\t\t\t\t\t{/* <BrowserOnly>{() => <UserDropDown />}</BrowserOnly> */}\r\n\t\t\t\t\t\t\t<BrowserOnly>\r\n\t\t\t\t\t\t\t\t{() => {\r\n\t\t\t\t\t\t\t\t\tconst UserDropDown = require('@components/userControlPanel/UserDropdown').default;\r\n\t\t\t\t\t\t\t\t\treturn <UserDropDown />;\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t</BrowserOnly>\r\n\t\t\t\t\t\t</li>\r\n\t\t\t\t\t</ul>\r\n\t\t\t\t</nav>\r\n\t\t\t\t{/*<span>Search</span>*/}\r\n\t\t\t</header>\r\n\t\t\t{isTradeHistoryViz && (\r\n\t\t\t\t<BottomSheet\r\n\t\t\t\t\ttitle=\"Trade History\"\r\n\t\t\t\t\tdoOnClose={() => {\r\n\t\t\t\t\t\tsetIsTradeHistoryViz(false);\r\n\t\t\t\t\t}}\r\n\t\t\t\t>\r\n\t\t\t\t\t{(close) => <TradeHistory closeTradeHistory={close} />}\r\n\t\t\t\t</BottomSheet>\r\n\t\t\t)}\r\n\t\t</>\r\n\t);\r\n}\r\n\r\n// export const AppHeaderContext = createContext({\r\n// \t/** @type {('Zerodha'| 'Angel One'| 'Upstox'| 'Alice Blue')} Stock broker*/\r\n// \t// broker: '',\r\n\r\n// \t/** Sets broker name\r\n// \t * @param {('Zerodha'| 'Angel One'| 'Upstox'| 'Alice Blue')} broker Stock broker\r\n// \t */\r\n// \tsetBroker: (broker) => {}, //eslint-disable-line\r\n\r\n// \t// brokerLoggedInUserName: '',\r\n\r\n// \t/** Sets name of user logged into broker\r\n// \t * @param {string} name Name of user logged into stock broker\r\n// \t */\r\n// \tsetBrokerLoggedInUserName: (name) => {}, //eslint-disable-line\r\n\r\n// \t/** Logout function */\r\n// \tsetDoOnBrokerLogout: () => {},\r\n\r\n// \t/** Fn to execute when clicked on watchlist btn */\r\n// \tsetDoOnWatchListBtnClick: () => {},\r\n// \tisTradeHistoryViz: false,\r\n// \tsetIsTradeHistoryViz: () => {},\r\n// });\r\n\r\n// /** Header navbar to be used in app screens */\r\n// export function AppHeader_contextProvider_n_UI({ children }) {\r\n// \tconst [broker, setBroker] = useState(null);\r\n// \tconst [brokerLoggedInUserName, setBrokerLoggedInUserName] = useState(null);\r\n// \tconst [doOnBrokerLogout, setDoOnBrokerLogout] = useState(null);\r\n// \tconst [doOnWatchListBtnClick, setDoOnWatchListBtnClick] = useState(() => {});\r\n// \tconst [isTradeHistoryViz, setIsTradeHistoryViz] = useState(false);\r\n\r\n// \treturn (\r\n// \t\t<>\r\n// \t\t\t<header id={hdrId}>\r\n// \t\t\t\t<div id={logoId}>\r\n// \t\t\t\t\t<Link to=\"/\">\r\n// \t\t\t\t\t\t<img src=\"/img/logo.svg\" alt=\"Kaagzi\" />\r\n// \t\t\t\t\t</Link>\r\n// \t\t\t\t</div>\r\n\r\n// \t\t\t\t<nav id={navMenuId}>\r\n// \t\t\t\t\t<ul>\r\n// \t\t\t\t\t\t<li>\r\n// \t\t\t\t\t\t\t<BrowserOnly>\r\n// \t\t\t\t\t\t\t\t{() => {\r\n// \t\t\t\t\t\t\t\t\tconst BrokerSelector = require('@appSharedComponents/BrokerSelector').default;\r\n// \t\t\t\t\t\t\t\t\treturn <BrokerSelector broker={broker} brokerLoggedInUserName={brokerLoggedInUserName} brokerLogOut={doOnBrokerLogout} />;\r\n// \t\t\t\t\t\t\t\t}}\r\n// \t\t\t\t\t\t\t</BrowserOnly>\r\n// \t\t\t\t\t\t</li>\r\n// \t\t\t\t\t\t{doOnWatchListBtnClick && typeof doOnWatchListBtnClick === 'function' && (\r\n// \t\t\t\t\t\t\t<li>\r\n// \t\t\t\t\t\t\t\t<button onClick={doOnWatchListBtnClick}>\r\n// \t\t\t\t\t\t\t\t\t<Icon icon=\"smartphone\" />\r\n// \t\t\t\t\t\t\t\t\t<span>Watchlist</span>\r\n// \t\t\t\t\t\t\t\t</button>\r\n// \t\t\t\t\t\t\t</li>\r\n// \t\t\t\t\t\t)}\r\n// \t\t\t\t\t\t{/* {doOnTradeHistoryBtnClick && typeof doOnTradeHistoryBtnClick === 'function' && (\r\n// \t\t\t\t\t\t<li>\r\n// \t\t\t\t\t\t\t<button onClick={doOnTradeHistoryBtnClick}>\r\n// \t\t\t\t\t\t\t\t<Icon icon=\"rupee-sign\" />\r\n// \t\t\t\t\t\t\t\t<span>Trade History</span>\r\n// \t\t\t\t\t\t\t</button>\r\n// \t\t\t\t\t\t</li>\r\n// \t\t\t\t\t)} */}\r\n// \t\t\t\t\t\t<li>\r\n// \t\t\t\t\t\t\t<button\r\n// \t\t\t\t\t\t\t\tonClick={() => {\r\n// \t\t\t\t\t\t\t\t\tsetIsTradeHistoryViz(true);\r\n// \t\t\t\t\t\t\t\t}}\r\n// \t\t\t\t\t\t\t>\r\n// \t\t\t\t\t\t\t\t<Icon icon=\"rupee-sign\" />\r\n// \t\t\t\t\t\t\t\t<span>Trade History</span>\r\n// \t\t\t\t\t\t\t</button>\r\n// \t\t\t\t\t\t</li>\r\n// \t\t\t\t\t\t{/* <li>\r\n// \t\t\t\t\t\t<Link activeClassName={activeClass} partiallyActive={true} to=\"/guide\">\r\n// \t\t\t\t\t\t\t<Icon icon=\"book-open\" />\r\n// \t\t\t\t\t\t\t<span>Guide</span>\r\n// \t\t\t\t\t\t</Link>\r\n// \t\t\t\t\t</li> */}\r\n// \t\t\t\t\t\t<li>\r\n// \t\t\t\t\t\t\t{/* <UserDropDown /> */}\r\n// \t\t\t\t\t\t\t{/* <BrowserOnly>{() => <UserDropDown />}</BrowserOnly> */}\r\n// \t\t\t\t\t\t\t<BrowserOnly>\r\n// \t\t\t\t\t\t\t\t{() => {\r\n// \t\t\t\t\t\t\t\t\tconst UserDropDown = require('@components/userControlPanel/UserDropdown').default;\r\n// \t\t\t\t\t\t\t\t\treturn <UserDropDown />;\r\n// \t\t\t\t\t\t\t\t}}\r\n// \t\t\t\t\t\t\t</BrowserOnly>\r\n// \t\t\t\t\t\t</li>\r\n// \t\t\t\t\t</ul>\r\n// \t\t\t\t</nav>\r\n// \t\t\t\t{/*<span>Search</span>*/}\r\n// \t\t\t</header>\r\n// \t\t\t<AppHeaderContext.Provider\r\n// \t\t\t\tvalue={{ setBroker, setBrokerLoggedInUserName, setDoOnBrokerLogout, setDoOnWatchListBtnClick, isTradeHistoryViz, setIsTradeHistoryViz }}\r\n// \t\t\t>\r\n// \t\t\t\t{children}\r\n// \t\t\t</AppHeaderContext.Provider>\r\n// \t\t</>\r\n// \t);\r\n// }\r\n","import React from 'react';\n\nimport { graphql, useStaticQuery } from 'gatsby';\n\n/** @returns {{siteName,title,description,favicon,featuredImage,themeColor,siteUrl,googleClientId,awsRegion,awsCognitoIdentityPoolId,awsCognitoIdentityPoolAuthRole}} Meta Data */\nexport default function useSiteMetadata(props) {\n\tconst data = useStaticQuery(graphql`\n\t\tquery {\n\t\t\tsite {\n\t\t\t\tsiteMetadata {\n\t\t\t\t\tsiteName\n\t\t\t\t\ttitle\n\t\t\t\t\tdescription\n\t\t\t\t\tfavicon\n\t\t\t\t\tfeaturedImage\n\t\t\t\t\tthemeColor\n\t\t\t\t\tsiteUrl\n\t\t\t\t\tgoogleClientId\n\t\t\t\t\tawsRegion\n\t\t\t\t\tawsCognitoIdentityPoolId\n\t\t\t\t\tawsCognitoIdentityPoolAuthRole\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t`);\n\n\treturn data.site.siteMetadata;\n}\n","//https://www.danielkcheung.com/how-to-describe-saas-product-with-schema/\n//https://salt.agency/blog/schema-for-saas-companies-salt-agency/\n//https://www.danielkcheung.com/how-to-use-organization-schema-correctly/\n//https://www.danielkcheung.com/what-schema-should-a-homepage-have/\n//https://www.danielkcheung.com/how-to-nest-faqpage-schema-to-article-or-webpage/\n//https://www.20i.com/blog/schema-markup-for-your-website-hierarchy/\n//https://www.danielkcheung.com/how-to-implement-semantic-seo/\n//https://inlinks.com/help/webpage-schema/\n//https://inlinks.com/schema/using-the-sameas-schema-org-markup-tag-in-seo/\n\nimport React from 'react';\n\nimport useSiteMetadata from '@hooks/UseSiteMetadata';\n\n/**\n * React component to output SEO related meta / link HTML tags.\n * This component is imported in each of the pages.\n * @param {Object} prop - prop object passed to this component\n * @param {?string} [prop.title] - Page title\n * @param {?string} [prop.description] - Page description\n * @param {?string} [prop.featuredImage] - Path to featured image\n * @param {?string} [prop.urlPath] - URL path of the page\n */\nexport default function Seo({ title, description, featuredImage, urlPath, children }) {\n\tconst {\n\t\tsiteName,\n\t\ttitle: defaultTitle,\n\t\tdescription: defaultDescription,\n\t\tfeaturedImage: defaultFeaturedImage,\n\t\tsiteUrl,\n\t\tfavicon,\n\t\tthemeColor,\n\t} = useSiteMetadata();\n\n\tconst url = `${siteUrl}${urlPath || ''}`,\n\t\tseoTitle = title ? siteName + ' - ' + title : defaultTitle,\n\t\tseoDesc = description || defaultDescription,\n\t\tseoImg = `${siteUrl}${featuredImage || defaultFeaturedImage}`;\n\t//const theFavicon = `${siteUrl}${favicon}`;\n\n\treturn (\n\t\t<>\n\t\t\t<title>{seoTitle}</title>\n\t\t\t<meta name=\"description\" content={seoDesc} />\n\t\t\t<meta name=\"image\" content={seoImg} />\n\t\t\t<link rel=\"icon\" href={favicon} type=\"image/x-icon\" />\n\t\t\t<link rel=\"canonical\" href={url} />\n\t\t\t<meta name=\"theme-color\" content={themeColor}></meta>\n\t\t\t<meta property=\"og:title\" content={seoTitle} />\n\t\t\t<meta property=\"og:description\" content={seoDesc} />\n\t\t\t<meta property=\"og:image\" content={seoImg} />\n\t\t\t<meta property=\"og:url\" content={url} />\n\t\t\t{/* <script type=\"application/ld+json\">{`{\n\"@context\": \"https://schema.org\",\n\"@type\": \"OnlineBusiness\",\n\"@id\":\"https://kaagzi.in#org\",\n\"image\": \"${siteUrl}${defaultFeaturedImage}\",\n\"url\": \"https://kaagzi.in\",\n\"sameAs\": [\"https://www.instagram.com/_kaagzi/\"],\n\"logo\": \"https://kaagzi.in/img/kaagzi-logo.webp\",\n\"name\": \"Kaagzi\",\n\"description\": \"${defaultDescription}\",\n\"email\": \"[email protected]\",\n\"telephone\": \"+91-9920066694\",\n\"contactPoint\": {\n\t\"contactType\": \"Customer Service\",\n\t\"email\": \"[email protected]\",\n\t\"telephone\": \"+91-9920066694\"\n},\n\"address\": {\n\t\"@type\": \"PostalAddress\",\n\t\"streetAddress\": \"A/1, Milap, Navagaon\",\n\t\"addressLocality\": \"Mumbai\",\n\t\"addressCountry\": \"IN\",\n\t\"addressRegion\": \"Dahisar West\",\n\t\"postalCode\": \"400068\"\n},\n\"founder\":{\n\t\"@type\": \"Person\",\n\t\"name\": \"Nimish Rajwade\",\n\t\"sameAs\": [\"https://www.instagram.com/nimish.rajwade/\",\"https://www.facebook.com/nimish.rajwade/\"]\n}\n}`}</script>\n\t\t\t<script type=\"application/ld+json\">{`{\n\"@context\": \"https://schema.org/\",\n\"@type\": \"WebSite\",\n\"@id\": \"https://kaagzi.in#website\",\n\"name\": \"Kaagzi\",\n\"url\": \"https://kaagzi.in/\",\n\"publisher\":{\"@id\":\"https://kaagzi.in#org\"}\n}`}</script>\n\t\t\t<script type=\"application/ld+json\">{`{\n\"@context\": \"https://schema.org/\",\n\"@type\": \"WebPage\",\n\"name\": \"${seoTitle}\",\n\"headline\": \"${seoTitle}\",\n\"description\": \"${seoDesc}\",\n\"url\": \"${url}\",\n\"isPartOf\":{\"@id\":\"https://kaagzi.in#website\"},\n\"publisher\":{\"@id\":\"https://kaagzi.in#org\"}\n}`}</script>\n\t\t\t<script type=\"application/ld+json\">{`{\n\"@context\": \"https://schema.org\",\n\"@type\": [\"WebApplication\",\"MobileApplication\"],\n\"name\": \"Kaagzi\",\n\"operatingSystem\": [\"Android\", \"iOS\", \"Windows\"],\n\"applicationCategory\": \"FinanceApplication\",\n\"installUrl\": \"https://kaagzi.in/app\",\n\"aggregateRating\": {\n\t\"@type\": \"AggregateRating\",\n\t\"ratingValue\": \"4.9\",\n\t\"ratingCount\": \"369\"\n},\n\"offers\": {\n\t\"@type\": \"Offer\",\n\t\"price\": \"75.00\",\n\t\"priceCurrency\": \"INR\",\n\t\"eligibleRegion\": {\n\t\t\"@type\": \"Country\",\n\t\t\"name\": \"IN\"\n\t}\n},\n\"copyrightHolder\":{\n\t\"@type\": \"Person\",\n\t\"name\": \"Nimish Rajwade\",\n\t\"sameAs\": [\"https://www.instagram.com/nimish.rajwade/\",\"https://www.facebook.com/nimish.rajwade/\"]\n},\n\"creator\":{\"@id\":\"https://kaagzi.in#org\"},\n\"publisher\":{\"@id\":\"https://kaagzi.in#org\"}\n}`}</script> */}\n\t\t\t<script type=\"application/ld+json\">\n\t\t\t\t{JSON.stringify({\n\t\t\t\t\t'@context': 'https://schema.org',\n\t\t\t\t\t'@type': 'OnlineBusiness',\n\t\t\t\t\t'@id': 'https://kaagzi.in#org',\n\t\t\t\t\timage: `${siteUrl}${defaultFeaturedImage}`,\n\t\t\t\t\turl: 'https://kaagzi.in',\n\t\t\t\t\tsameAs: ['https://www.instagram.com/_kaagzi/'],\n\t\t\t\t\tlogo: 'https://kaagzi.in/img/kaagzi-logo.webp',\n\t\t\t\t\tname: 'Kaagzi',\n\t\t\t\t\tdescription: defaultDescription,\n\t\t\t\t\temail: '[email protected]',\n\t\t\t\t\ttelephone: '+91-9920066694',\n\t\t\t\t\tcontactPoint: {\n\t\t\t\t\t\tcontactType: 'Customer Service',\n\t\t\t\t\t\temail: '[email protected]',\n\t\t\t\t\t\ttelephone: '+91-9920066694',\n\t\t\t\t\t},\n\t\t\t\t\taddress: {\n\t\t\t\t\t\t'@type': 'PostalAddress',\n\t\t\t\t\t\tstreetAddress: 'A/1, Milap, Navagaon',\n\t\t\t\t\t\taddressLocality: 'Mumbai',\n\t\t\t\t\t\taddressCountry: 'IN',\n\t\t\t\t\t\taddressRegion: 'Dahisar West',\n\t\t\t\t\t\tpostalCode: '400068',\n\t\t\t\t\t},\n\t\t\t\t\tfounder: {\n\t\t\t\t\t\t'@type': 'Person',\n\t\t\t\t\t\tname: 'Nimish Rajwade',\n\t\t\t\t\t\tsameAs: ['https://www.instagram.com/nimish.rajwade/', 'https://www.facebook.com/nimish.rajwade/'],\n\t\t\t\t\t},\n\t\t\t\t})}\n\t\t\t</script>\n\t\t\t<script type=\"application/ld+json\">\n\t\t\t\t{JSON.stringify({\n\t\t\t\t\t'@context': 'https://schema.org/',\n\t\t\t\t\t'@type': 'WebSite',\n\t\t\t\t\t'@id': 'https://kaagzi.in#website',\n\t\t\t\t\tname: 'Kaagzi',\n\t\t\t\t\turl: 'https://kaagzi.in/',\n\t\t\t\t\tpublisher: { '@id': 'https://kaagzi.in#org' },\n\t\t\t\t})}\n\t\t\t</script>\n\t\t\t<script type=\"application/ld+json\">\n\t\t\t\t{JSON.stringify({\n\t\t\t\t\t'@context': 'https://schema.org/',\n\t\t\t\t\t'@type': 'WebPage',\n\t\t\t\t\tname: seoTitle,\n\t\t\t\t\theadline: seoTitle,\n\t\t\t\t\tdescription: seoDesc,\n\t\t\t\t\turl: url,\n\t\t\t\t\tisPartOf: { '@id': 'https://kaagzi.in#website' },\n\t\t\t\t\tpublisher: { '@id': 'https://kaagzi.in#org' },\n\t\t\t\t})}\n\t\t\t</script>\n\t\t\t<script type=\"application/ld+json\">\n\t\t\t\t{JSON.stringify({\n\t\t\t\t\t'@context': 'https://schema.org',\n\t\t\t\t\t'@type': ['WebApplication', 'MobileApplication'],\n\t\t\t\t\tname: 'Kaagzi',\n\t\t\t\t\toperatingSystem: ['Android', 'iOS', 'Windows'],\n\t\t\t\t\tapplicationCategory: 'FinanceApplication',\n\t\t\t\t\tinstallUrl: 'https://kaagzi.in/app',\n\t\t\t\t\taggregateRating: {\n\t\t\t\t\t\t'@type': 'AggregateRating',\n\t\t\t\t\t\tratingValue: '4.9',\n\t\t\t\t\t\tratingCount: '369',\n\t\t\t\t\t},\n\t\t\t\t\toffers: {\n\t\t\t\t\t\t'@type': 'Offer',\n\t\t\t\t\t\tprice: '75.00',\n\t\t\t\t\t\tpriceCurrency: 'INR',\n\t\t\t\t\t\teligibleRegion: {\n\t\t\t\t\t\t\t'@type': 'Country',\n\t\t\t\t\t\t\tname: 'IN',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tcopyrightHolder: {\n\t\t\t\t\t\t'@type': 'Person',\n\t\t\t\t\t\tname: 'Nimish Rajwade',\n\t\t\t\t\t\tsameAs: ['https://www.instagram.com/nimish.rajwade/', 'https://www.facebook.com/nimish.rajwade/'],\n\t\t\t\t\t},\n\t\t\t\t\tcreator: { '@id': 'https://kaagzi.in#org' },\n\t\t\t\t\tpublisher: { '@id': 'https://kaagzi.in#org' },\n\t\t\t\t})}\n\t\t\t</script>\n\t\t\t{children}\n\t\t</>\n\t);\n}\n\nexport function Seo_noIndex({ title, description, children }) {\n\tconst {\n\t\tsiteName,\n\t\ttitle: defaultTitle,\n\t\tdescription: defaultDescription,\n\t\t// featuredImage: defaultFeaturedImage,\n\t\tfavicon,\n\t\tthemeColor,\n\t} = useSiteMetadata();\n\n\tconst seoTitle = title ? siteName + ' | ' + title : defaultTitle,\n\t\tseoDesc = description || defaultDescription;\n\treturn (\n\t\t<>\n\t\t\t<title>{seoTitle}</title>\n\t\t\t<meta name=\"description\" content={seoDesc} />\n\t\t\t{/* <meta name=\"image\" content={seoImg} /> */}\n\t\t\t<link rel=\"icon\" href={favicon} type=\"image/x-icon\" />\n\t\t\t{/* <link rel=\"canonical\" href={url} /> */}\n\t\t\t<meta name=\"theme-color\" content={themeColor}></meta>\n\t\t\t<meta property=\"og:title\" content={seoTitle} />\n\t\t\t<meta property=\"og:description\" content={seoDesc} />\n\t\t\t{/* <meta property=\"og:image\" content={seoImg} />\n\t\t\t<meta property=\"og:url\" content={url} /> */}\n\t\t\t<meta name=\"robots\" content=\"noindex\" />\n\t\t\t{children}\n\t\t</>\n\t);\n}\n","// extracted by mini-css-extract-plugin\nexport var bg = \"bottomSheet-module--bg--03bd7\";\nexport var bottomSheetHide = \"bottomSheet-module--bottomSheetHide--26d65\";\nexport var bottomSheetShow = \"bottomSheet-module--bottomSheetShow--286ce\";\nexport var isViz = \"bottomSheet-module--isViz--5e820\";\nexport var sheet = \"bottomSheet-module--sheet--61b70\";\nexport var wrap = \"bottomSheet-module--wrap--ff172\";\nexport var xBtn = \"bottomSheet-module--xBtn--b7c80\";","import React, { useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport clsx from 'clsx';\n\nimport * as styles from './bottomSheet.module.css';\n\n/**\n * React component that displays content inside a bottomsheet\n * Bottomsheet is rendered inside the body tag using createPortal() react-dom API\n * @param {Object} prop - React prop\n * @param {string} [prop.title] - Bottom sheet title\n * @param {string} [prop.desc] - Short description\n * @param {Boolean} [prop.useCloseBtn=false] - Whether to show the close button\n * @param {()=>{}} [prop.doOnOpen] - Callback function to execute once bottom sheet is opened\n * @param {()=>{}} [prop.doOnClose] - Callback function to execute once bottom sheet is closed\n * @param {(close:Function)=>{}|JSX.Element} prop.children - (close)=>{} or React element\n */\nexport default function BottomSheet({ title, desc, useCloseBtn, doOnOpen, doOnClose, children }) {\n\tconst [isVisible, setIsVisible] = useState(false);\n\tconst [sheetTitle, setSheetTitle] = useState(title || '');\n\tconst [sheetDesc, setSheetDesc] = useState(desc || '');\n\n\tconst _openBtmSheet = () => {\n\t\tdocument && document.body && (document.body.style.overflow = 'hidden');\n\t\tsetTimeout(() => {\n\t\t\tsetIsVisible(true);\n\t\t\tdoOnOpen &&\n\t\t\t\ttypeof doOnOpen == 'function' &&\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tdoOnOpen();\n\t\t\t\t}, 200);\n\t\t}, 10); //a slight delay of 10ms jst for CSS transition state-change to take effect\n\t};\n\tconst close = () => {\n\t\tsetIsVisible(false);\n\t\tsetTimeout(() => {\n\t\t\tdocument && document.body && (document.body.style.overflow = 'visible');\n\t\t\tdoOnClose && typeof doOnClose == 'function' && doOnClose();\n\t\t}, 200);\n\t};\n\n\tuseEffect(() => {\n\t\t_openBtmSheet();\n\n\t\t// document && document.body && (document.body.style.overflow = 'hidden');\n\t\t//in case the user navigates to new page using gatsby Link, the close() fn shall never be run and thus we need to to make sure to reset overflow\n\t\treturn () => {\n\t\t\tdocument && document.body && (document.body.style.overflow = 'visible');\n\t\t};\n\t}, []);\n\n\t// return (\n\t// \t<div className={clsx(styles.wrap, isVisible && styles.isViz)}>\n\t// \t\t{useCloseBtn ? <div className={styles.bg}></div> : <div className={styles.bg} onClick={close}></div>}\n\t// \t\t<div className={styles.sheet}>\n\t// \t\t\t{(title || desc) && (\n\t// \t\t\t\t<header>\n\t// \t\t\t\t\t{title && <div>{title}</div>}\n\t// \t\t\t\t\t{desc && <div>{desc}</div>}\n\t// \t\t\t\t</header>\n\t// \t\t\t)}\n\t// \t\t\t<main>{typeof children == 'function' ? children(close) : children}</main>\n\t// \t\t\t{useCloseBtn && (\n\t// \t\t\t\t<button className={styles.xBtn} onClick={close}>\n\t// \t\t\t\t\t✖\n\t// \t\t\t\t</button>\n\t// \t\t\t)}\n\t// \t\t</div>\n\t// \t</div>\n\t// );\n\treturn createPortal(\n\t\t<div className={clsx(styles.wrap, isVisible && styles.isViz)}>\n\t\t\t{useCloseBtn ? <div className={styles.bg}></div> : <div className={styles.bg} onClick={close}></div>}\n\t\t\t<div className={styles.sheet}>\n\t\t\t\t{(sheetTitle || desc) && (\n\t\t\t\t\t<header>\n\t\t\t\t\t\t{sheetTitle && <div>{sheetTitle}</div>}\n\t\t\t\t\t\t{sheetDesc && sheetDesc.trim() !== '' && <div>{sheetDesc}</div>}\n\t\t\t\t\t</header>\n\t\t\t\t)}\n\t\t\t\t<main>{typeof children == 'function' ? children(close, setSheetTitle, setSheetDesc) : children}</main>\n\t\t\t\t{useCloseBtn && (\n\t\t\t\t\t<button className={styles.xBtn} onClick={close}>\n\t\t\t\t\t\t✖\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>,\n\t\tdocument.body,\n\t);\n}\n\n/* export default function BottomSheet({ title, desc, useCloseBtn, doOnClose, children }) {\n\tconst [isVisible, setIsVisible] = useState(false);\n\n\tconst _openBtmSheet = () => {\n\t\treturn new Promise((resolve) => {\n\t\t\t//https://docusaurus.io/docs/docusaurus-core#useIsBrowser\n\t\t\tdocument && document.body && (document.body.style.overflow = 'hidden');\n\t\t\tsetTimeout(() => {\n\t\t\t\tsetIsVisible(true);\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tresolve();\n\t\t\t\t}, 200);\n\t\t\t}, 10); //a slight delay of 10ms jst for CSS transition state-change to take effect\n\t\t});\n\t};\n\tconst close = () => {\n\t\treturn new Promise((resolve) => {\n\t\t\tsetIsVisible(false);\n\t\t\tsetTimeout(() => {\n\t\t\t\tdocument && document.body && (document.body.style.overflow = 'visible');\n\t\t\t\tresolve();\n\t\t\t}, 200);\n\t\t});\n\t};\n\tconst closeAndDo = () => {\n\t\t//handleCloseClick = ()=>{\t//(e)=>{\n\t\t//e.stopPropagation();e.preventDefault();\n\t\tclose().then(() => {\n\t\t\tdoOnClose && typeof doOnClose == 'function' && doOnClose();\n\t\t});\n\t};\n\n\tuseEffect(() => {\n\t\t_openBtmSheet();\n\n\t\t// document && document.body && (document.body.style.overflow = 'hidden');\n\t\t// return () => {\n\t\t// \tdocument && document.body && (document.body.style.overflow = 'visible');\n\t\t// };\n\t}, []);\n\n\treturn (\n\t\t<div className={clsx(styles.wrap, isVisible && styles.isViz)}>\n\t\t\t{useCloseBtn ? <div className={styles.bg}></div> : <div className={styles.bg} onClick={closeAndDo}></div>}\n\t\t\t<div className={styles.sheet}>\n\t\t\t\t{(title || desc) && (\n\t\t\t\t\t<header>\n\t\t\t\t\t\t{title && <div>{title}</div>}\n\t\t\t\t\t\t{desc && <div>{desc}</div>}\n\t\t\t\t\t</header>\n\t\t\t\t)}\n\t\t\t\t<main>\n\t\t\t\t\t{typeof children == 'function' ? children(close) : children}\n\t\t\t\t</main>\n\t\t\t\t{useCloseBtn && <span className={styles.xBtn} onClick={closeAndDo} />}\n\t\t\t</div>\n\t\t</div>\n\t);\n} */\n\n/* export function withBottomSheet(ComponentToBeWrappedInBtmSheet) {\n\treturn class BottomSheet extends React.Component {\n\t\tconstructor(props) {\n\t\t\tsuper(props);\n\t\t\tthis.state = {\n\t\t\t\tisVisible: false,\n\t\t\t\t//isWIP: false,\n\t\t\t};\n\t\t}\n\t\t_openBtmSheet = () => {\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\t//https://docusaurus.io/docs/docusaurus-core#useIsBrowser\n\t\t\t\tdocument && document.body && (document.body.style.overflow = 'hidden');\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.setState({ isVisible: true });\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t}, 200);\n\t\t\t\t}, 10); //a slight delay of 10ms jst for CSS transition state-change to take effect\n\t\t\t});\n\t\t};\n\t\tclose = () => {\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tthis.setState({ isVisible: false });\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tdocument && document.body && (document.body.style.overflow = 'visible');\n\t\t\t\t\tresolve();\n\t\t\t\t}, 200);\n\t\t\t});\n\t\t};\n\t\tcloseAndDo = () => {\n\t\t\t//handleCloseClick = ()=>{\t//(e)=>{\n\t\t\t//e.stopPropagation();e.preventDefault();\n\t\t\tthis.close().then(() => {\n\t\t\t\tthis.props.doOnClose && typeof this.props.doOnClose == 'function' && this.props.doOnClose();\n\t\t\t});\n\t\t};\n\t\tcomponentDidMount() {\n\t\t\tthis._openBtmSheet();\n\t\t}\n\t\trender() {\n\t\t\tconst {\n\t\t\t\ttitle,\n\t\t\t\tdesc,\n\t\t\t\tuseCloseBtn,\n\t\t\t\t//children\n\t\t\t} = this.props;\n\t\t\treturn (\n\t\t\t\t<div className={clsx(styles.wrap, this.state.isVisible && styles.isViz)}>\n\t\t\t\t\t{useCloseBtn ? <div className={styles.bg}></div> : <div className={styles.bg} onClick={this.closeAndDo}></div>}\n\t\t\t\t\t<div className={styles.sheet}>\n\t\t\t\t\t\t{(title || desc) && (\n\t\t\t\t\t\t\t<header>\n\t\t\t\t\t\t\t\t{title && <div>{title}</div>}\n\t\t\t\t\t\t\t\t{desc && <div>{desc}</div>}\n\t\t\t\t\t\t\t</header>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<main>\n\t\t\t\t\t\t\t<ComponentToBeWrappedInBtmSheet closeBottomSheet={this.closeAndDo} {...this.props} />\n\t\t\t\t\t\t</main>\n\t\t\t\t\t\t{useCloseBtn && <span className={styles.xBtn} onClick={this.closeAndDo} />}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\t};\n} */\n\nexport function withBottomSheet(ComponentToBeWrappedInBtmSheet) {\n\t// return (\n\t// \t<BottomSheet>\n\t// \t\t<ComponentToBeWrappedInBtmSheet />\n\t// \t</BottomSheet>\n\t// );\n\treturn function BottomSheetHoc({ title, desc, useCloseBtn, doOnClose }) {\n\t\treturn (\n\t\t\t<BottomSheet title={title} desc={desc} useCloseBtn={useCloseBtn} doOnClose={doOnClose}>\n\t\t\t\t<ComponentToBeWrappedInBtmSheet />\n\t\t\t</BottomSheet>\n\t\t);\n\t};\n}\n"],"names":["brokerDtls","brokerLoginStatus","brokerLoginUser","brokerSelectorBtn","brokerSelectorHdr","brokerSelectorListC","BrokerSelector","_ref","broker","brokerLoggedInUserName","brokerLogOut","isSelectionMenuViz","setIsSelectionMenuViz","useState","React","className","styles","onClick","src","alt","includes","Icon","icon","BottomSheet","doOnClose","formatName","Button","variant","size","isDark","Link","to","isGreen","isRed","ColoredNumberDisplay","currentVal","baseVal","additionalClassWhenGreen","additionalClassWhenRed","Number","formatPriceInIndianStyle","emptyGfxC","EmptyGfx","note","ctaFn","ctaBtnText","AppDataIndexedDbContext","createContext","getPosition","async","tradingSymbol","exchange","isSellTrade","setPosition","exitPosition","exitPrice","exitQty","getWatchlistInstruments","setWatchlistInstrument","watchlistId","expiry","setWatchlistMultipleInstruments","instrumentsAry","deleteWatchlistInstrument","clearWatchlist","getTradeHistory","page","showPerPage","clearEntireTradeHistory","AppDataIndexedDb_ContextProvider","children","id","userId","useContext","UserContext","dbRef","useRef","maxNumberOfItemsAllowedInTable","positions","__setupIfNotAlreadyAndGetDbHandle","Promise","resolve","reject","_dbRef$current","trim","dbName","current","constructor","name","_dbRef$current2","_dbRef$current3","_dbRef$current3$close","close","call","openRequest","indexedDB","open","onupgradeneeded","event","result","oldVersion","objectStoreNames","contains","createObjectStore","onerror","error","onsuccess","onversionchange","console","warn","onclose","_withDbTransaction","tableOrTablesAry","mode","db","tables","length","tablesAry","Array","from","isArray","i","Error","transaction","err","_isSpaceAvailableInTable","objStore","table","Object","prototype","hasOwnProperty","maxAllowed","numItemsAlreadyStored","countRequest","count","availableSlots","get","pk","request","onabort","objectStore","getAll","undefined","set","data","oncomplete","keyPath","abort","put","target","remove","key","delete","clear","position","nonExpiredPositions","map","pos","x","Date","now","sbl","xh","dir","qty","storedPos","closeTimestamp","closedPos","avg","cp","t","sl","tp","Provider","value","posData","totalPurchaseCost_old","totalCost","totalQtyPurchased","isInteger","watchlistInstrumentsAry","watchlistInstruments_csvToObj_Ary","csvLine","split","mappedObj","reduce","acc","instrument","dataByPk_obj","pkAry","keys","availableSpace","all","setMultiple","isNaN","pageIndex","recordsPerPage","skipToPageOffset","records","cursorRequest","openCursor","recordsAry","hasAdvancedToOffset","e","cursor","advance","push","continue","message","totalRecords","totalPages","Math","ceil","getPaginatedRecords","BrowserOnly","fallback","isBrowser","setIsBrowser","useEffect","paginationLinks","separator","Pagination","currentPage","goToPage","PaginationSeries","seriesStart","seriesEnd","_ref2","_","cnfrmDlgC","ConfirmationDialog","doOnShow","confirmationNote","doOnCancel","doOnConfirm","confirmBtnText","restProps","Modal","useCloseBtn","disallowManualClosing","doOnOpen","assign","ButtonListContainer","dataRow","entry","exit","isBuy","isSell","metaDataRow","tradeHistC","tradeHistFtr","tradeHistHdr","tradeHistMain","tradeHistUl","TradeHistory","closeTradeHistory","isWip","setIsWip","tradesAry","setTradesAry","totalTrades","setTotalTrades","setTotalPages","setCurrentPage","showClearHistoryDelConfrmtnDlg","setShowClearHistoryDelConfrmtnDlg","notify","ToastNotificationContext","checkIfPlanActive","dataObj","getTradeHistoryForCurrentlyActivePageNum_n_loadIntoState","Intl","NumberFormat","format","trade","tradePnl","Loading","clearTradeHistory","then","isClearedSuccessfully","active","hdr","logoC","navMenu","Header","hdrId","logoId","navMenuId","activeClassName","activeClass","partiallyActive","UserDropDown","require","AppHeader","doOnWatchListBtnClick","isTradeHistoryViz","setIsTradeHistoryViz","title","useSiteMetadata","props","useStaticQuery","site","siteMetadata","Seo","description","featuredImage","urlPath","siteName","defaultTitle","defaultDescription","defaultFeaturedImage","siteUrl","favicon","themeColor","url","seoTitle","seoDesc","seoImg","content","rel","href","type","property","JSON","stringify","image","sameAs","logo","email","telephone","contactPoint","contactType","address","streetAddress","addressLocality","addressCountry","addressRegion","postalCode","founder","publisher","headline","isPartOf","operatingSystem","applicationCategory","installUrl","aggregateRating","ratingValue","ratingCount","offers","price","priceCurrency","eligibleRegion","copyrightHolder","creator","Seo_noIndex","bg","isViz","sheet","wrap","xBtn","desc","isVisible","setIsVisible","sheetTitle","setSheetTitle","sheetDesc","setSheetDesc","setTimeout","document","body","style","overflow","createPortal","clsx"],"sourceRoot":""}