{"version":3,"sources":["pages/Message.tsx","utils/get-initials.ts","client.service.ts","icons/Search.tsx","http.ts","account.service.ts","Store.ts","components/MainNavbar.tsx","components/MainSidebar.tsx","theme/base-theme-options.ts","theme/light-theme-options.ts","theme/dark-theme-options.ts","theme/index.ts","components/Footer.tsx","components/MainLayout.tsx","components/PublicLayout.tsx","components/profile/ProfileNavbar.tsx","icons/ChevronDown.tsx","icons/ChevronRight.tsx","components/NavItem.tsx","components/NavSection.tsx","components/profile/ProfileSidebar.tsx","components/profile/ProfileLayout.tsx","data.ts","Styles.ts","components/Question.tsx","components/QuestionList.tsx","components/CategoryCard.tsx","components/CategoryList.tsx","components/SearchButton.tsx","images/search-bg.png","pages/Home.tsx","pages/Category.tsx","pages/Search.tsx","pages/Question.tsx","utils/credit-cards.js","images/credit-cards.png","images/paypal.svg","utils/cart.ts","pages/reseller/QuoteCheckout.tsx","cart.service.ts","pages/cart/CartCheckout.tsx","components/dashboard/DashboardNavbar.tsx","components/dashboard/DashboardSidebar.tsx","components/dashboard/DashboardLayout.tsx","icons/Plus.tsx","icons/Lock.tsx","components/Label.tsx","components/dashboard/QuestionListTable.tsx","pages/dashboard/AdmQuestionList.tsx","components/dashboard/CategoryListTable.tsx","pages/dashboard/AdmCategoryList.tsx","pages/dashboard/CategoryDetails.tsx","pages/dashboard/QuestionDetails.tsx","pages/dashboard/Settings.tsx","components/LoadingScreen.tsx","pages/profile/Checkout.tsx","pages/reseller/ResellerCheckout.tsx","routes.js","components/GlobalStyles.tsx","App.tsx","ScrollToTop.ts","reportWebVitals.ts","index.tsx","components/PropertyListItem.tsx","components/Title.tsx","settings.tsx","components/Scrollbar.tsx","components/Logo.tsx","reseller.service.ts","hooks/use-mounted.ts","components/ToastState.ts","AppSettings.ts","components/PropertyList.tsx"],"names":["Message","title","message","linkText","linkUrl","homeText","homeUrl","sx","backgroundColor","display","flexDirection","minHeight","maxWidth","py","elevation","p","justifyContent","alignItems","pb","to","size","variant","pt","minWidth","component","RouterLink","getInitials","name","replace","split","slice","map","v","toUpperCase","join","clientService","emptyProfile","email","firstName","lastName","company","address","city","state","country","zip","phone","fax","notify","getProfile","updateProfile","updatePassword","getOrders","getInvoice","getExtraSupport","deactivateLicense","getUpgrades","getUpgradeInfo","getCheckoutInfo","getDownloads","getDiscountInfo","generateToken","checkout","unsubscribe","clientId","a","http","path","result","data","method","body","mapOrderData","order","dateTime","Date","expiryDate","undefined","ok","orderId","mapExtraSupport","productId","productName","reason","accountService","getAccount","id","clientName","clientEmail","token","quantity","license","isUpgrade","upgradeFromProduct","params","formData","mapDownloads","download","mapDiscountToken","mapDiscountInfo","discountInfo","volumeDiscounts","discountTokens","eligibleDiscount","mapGenerateTokenResponse","response","tokens","Search","createSvgIcon","xmlns","viewBox","fill","fillRule","d","clipRule","getBody","config","file","FormData","key","append","String","JSON","stringify","getContentType","headers","contentType","request","Request","startsWith","webAPIUrl","authHeader","account","set","jwtToken","fetch","status","json","logout","console","error","url","UserRole","login","item","localStorage","getItem","parse","checkEmail","addClientProfile","verifyEmail","register","forgotPassword","setAccount","setItem","removeAccount","removeItem","parseJwt","base64","jsonPayload","decodeURIComponent","window","atob","c","charCodeAt","toString","getRole","roleAsString","Admin","Reseller","Client","password","Id","Email","FirstName","LastName","role","initialQuestionState","loading","categories","category","recentlyAdded","browsed","searched","filtered","viewing","GETTING_CATEGORIES","gettingCategoriesAction","type","GOT_CATEGORIES","gotCategoriesAction","GETTING_CATEGORY","GOT_CATEGORY","GETTING_RECENTLY_ADDED","GOT_RECENTLY_ADDED","gotRecentlyAddedAction","questions","GETTING_BROWSED","GOT_BROWSED","gotBrowsedAction","SEARCHING_QUESTIONS","SEARCHED_QUESTIONS","searchedQuestionsAction","FILTERING_QUESTIONS","FILTERED_QUESTIONS","filteredQuestionsAction","GETTING_QUESTION","GOT_QUESTION","gotQuestionAction","question","initialAccountState","user","GETTING_ACCOUNT","GOT_ACCOUNT","rootReducer","combineReducers","action","useStyles","makeStyles","theme","createStyles","homeLink","textDecoration","MainNavbar","onSidebarMobileOpen","showMenu","customTitle","classes","navigate","useNavigate","AppBar","color","Toolbar","Hidden","mdUp","IconButton","onClick","fontSize","className","Stack","direction","spacing","Logo","Typography","caretColor","whiteSpace","lineHeight","fontWeight","xs","md","Box","flexGrow","mdDown","Button","marginLeft","open","Divider","orientation","height","mx","startIcon","MainSidebar","onMobileClose","openMobile","location","useLocation","useEffect","pathname","Drawer","anchor","onClose","PaperProps","width","pl","pr","baseThemeOptions","components","MuiTableHead","styleOverrides","root","borderBottom","letterSpacing","textTransform","paddingTop","paddingBottom","MuiLinearProgress","borderRadius","overflow","MuiCardHeader","defaultProps","titleTypographyProps","subheaderTypographyProps","typography","subtitle2","h4","lightThemeOptions","palette","background","default","paper","primary","main","contrastText","secondary","success","neutral","100","200","300","400","500","600","700","800","900","darkThemeOptions","active","hover","selected","disabledBackground","disabled","divider","light","dark","info","mode","text","warning","shadows","footerStyle","Footer","fontFamily","padding","Container","Grid","container","sm","css","settings","phone1","phone2","hours","href","socials","facebook","twitter","youtube","line","idx","year","MainLayoutRoot","experimentalStyled","MainLayout","children","useState","isSidebarMobileOpen","setIsSidebarMobileOpen","PublicLayoutRoot","PublicLayout","ProfileNavbar","isReseller","useTheme","lgUp","lgDown","Avatar","mr","bgcolor","ChevronDown","ChevronRight","NavItem","props","depth","icon","openProp","other","setOpen","paddingLeft","ListItem","disableGutters","endIcon","prevOpen","textAlign","Collapse","in","renderNavItems","items","List","disablePadding","reduce","acc","reduceChildRoutes","exactMatch","matchPath","end","partialMatch","push","NavSection","subheader","ListSubheader","disableSticky","clientSections","resellerSections","ProfileSidebar","sections","content","Scrollbar","options","suppressScrollX","section","mt","lg","top","ProfileLayoutRoot","ProfileLayoutWrapper","flex","breakpoints","up","ProfileLayoutContainer","ProfileLayoutContent","position","WebkitOverflowScrolling","ProfileLayout","getCategories","getCategoriesWithCounters","getCategory","categoryId","postCategory","putCategory","deleteCategory","mapQuestionData","updated","getRecentQuestions","getCategoryQuestions","getQuestion","questionId","getQuestionForEdit","searchQuestions","query","getQuestionsWithFilter","published","archived","search","postQuestion","putQuestion","deleteQuestion","uploadAttachment","responseData","axios","post","onUploadProgress","progress","then","catch","log","gray2","Question","showCategory","showLabels","labels","trim","length","label","Chip","categoryName","toLocaleDateString","toLocaleTimeString","QuestionList","CategoryCard","Card","CardActionArea","Link","CardMedia","alt","src","margin","CardContent","gutterBottom","align","description","CategoryList","SearchButton","useForm","handleSubmit","control","useSearchParams","get","Paper","onSubmit","defaultValue","rules","required","render","field","onChange","value","fieldState","TextField","helperText","Home","dispatch","useDispatch","useSelector","doGetCategories","doGetRecentQuestions","Title","backgroundImage","searchBackground","backgroundPosition","backgroundSize","link","cursor","marginRight","Category","useParams","parseInt","filter","fetchQuestions","fetchedQuestions","fetchCategories","fetchedCategories","Breadcrumbs","aria-label","foundResults","doSearch","foundQuestion","doGetQuestion","Number","dangerouslySetInnerHTML","__html","clearNumber","formatCreditCardNumber","nextValue","issuer","Payment","fns","cardType","clearValue","formatCVC","cardNumber","maxLength","formatExpirationDate","prevValue","month","currYear","getFullYear","usaStatesAndTerritories","long","short","canadaProvinces","checkZip","test","shortProvinceOrStateName","longName","province","CountryNameToCode","tabs","PaypalButton","styled","PaypalImg","backgroundRepeat","translateCardType","QuoteCheckout","useMediaQuery","down","isMounted","useMounted","currentTab","setCurrentTab","setInfo","memo","setMemo","isAnnualSupport","setIsAnnualSupport","openDialog","setOpenDialog","dialogTitle","setDialogTitle","openBlacklistedDialog","setOpenBlacklistedDialog","openMonerisDialog","setOpenMonerisDialog","dialogMessage","setDialogMessage","dialogFollowLink","setDialogFollowLink","defaultToastState","toastState","setToastState","phone_a","phone_b","phone_c","paypalData","setPaypalData","refPaypalSubmitButton","useRef","handleSubmitPayPal","setCardNumber","expiry","setExpiry","cvc","setCvc","focused","setFocused","setIssuer","inProgress","setInProgress","loadError","setLoadError","loadData","useCallback","resellerService","getQuoteCheckoutInfo","billingFax","handleInputFocus","target","handleInputChange","order_id","bill_first_name","billingFirstName","bill_last_name","billingLastName","bill_company","billingCompany","bill_address_one","billingAddress","bill_city","billingCity","bill_state_or_province","billingState","bill_country","billingCountry","bill_postal_code","billingZip","bill_email","billingEmail","bill_phone","billingPhone","bill_fax","bill_po","credit_card_brand","credit_card_number","replaceAll","expire_month","substr","expire_year","cvv","bill_amount","total","discount_amount","discount","bill_gst","gst","bill_pst","pst","comments","forEach","licenseId","qty","amount","triggerPaypalSubmit","current","click","onSubmitPaypal","substring","updatedPaypalData","handleCloseSnackbar","event","Dialog","aria-labelledby","aria-describedby","DialogTitle","DialogContent","DialogContentText","DialogActions","autoFocus","Snackbar","autoHideDuration","anchorOrigin","vertical","horizontal","Alert","severity","CardHeader","Table","TableHead","TableRow","TableCell","TableBody","product","licenseName","numeral","price","format","style","tax","Tabs","indicatorColor","scrollButtons","textColor","tab","Tab","mb","px","PropertyList","PropertyListItem","shippingFirstName","shippingLastName","shippingCompany","shippingAddress","shippingCity","shippingState","shippingZip","shippingCountry","shippingPhone","shippingEmail","onFocus","creditCards","acceptedCards","number","callback","isValid","columnSpacing","fullWidth","m","paypalProductName","paypalAmount","hidden","ref","cartService","getProduct","getDiscount","getPaypalInfo","isBlackListed","pid","lic","subtotal","discountCode","products","PromoCard","PromoLink","PromoDialogLink","PromoTitle","div","PromoSubtitle","PromoProduct","PromoName","h3","PromoDescr","PromoMore","VertDivider","CartCheckout","openInvoiceDialog","setOpenInvoiceDialog","openPaypalDialog","setOpenPaypalDialog","openPromoDialog","setOpenPromoDialog","acceptedTerms","setAcceptedTerms","invoiceDisabled","setInvoiceDisabled","failMessage","setFailMessage","searchParams","productInfo","setProductInfo","setProducts","upgraded","setUpgraded","setTotal","setSubtotal","setPid","setDiscount","mainDiscount","setMainDiscount","setDiscountCode","reseller","setReseller","taxes","setTaxes","setGst","setPst","paypalInfo","setPaypalInfo","billing","countries","setCountries","setCountry","canadaProvince","setCanadaProvince","usaState","setUsaState","gotoHome","setGotoHome","watch","paypalWatch","registerForm1","handleSubmitForm1","errorsForm1","formState","errors","onPromoInfoClick","showError","onSubmitDiscountForm","fetchedDiscount","resellerId","calcTax","calcTotal","paypalTag","setPaypalTag","paypalName","setPaypalName","setPaypalAmount","refSubmitButtom","isNaN","fetchedProductInfo","getCountries","fetchedCountries","newProducts","calculatedSupport","str","prefix","supportQty","supportPrice","promoQty","handleSupportChange","supportIdx","findIndex","newSubtotal","triggerSubmit","fetchedPaypalInfo","exchangeRate","ipAddress","productShort","toFixed","cartStr","itemName","tag","handleUpgrade","mainProduct","promoDiscount","promoProduct","promoProductId","promoProductName","promoLicenseId","promoLicenseName","promoPrice","promoAmount","onSubmitInvoice","onSubmitCreditCard","isInvoice","discount_code","handleCloseDialog","beforeTaxes","newCountry","newProvince","totalTax","_gst","_pst","parseFloat","includedInDataStudio","my","promoSavings","fontStyle","rel","Checkbox","checked","FormControl","Select","MenuItem","index","alignContent","visibility","showPromo","areaProduct","pattern","select","code","newProv","prov","nextOrderId","DashboardNavbar","DashboardSidebar","DashboardLayoutRoot","DashboardLayoutWrapper","DashboardLayoutContainer","DashboardLayoutContent","DashboardLayout","Plus","Lock","LabelRoot","styleprops","shape","flexShrink","pxToRem","fontWeightMedium","paddingRight","Label","styleProps","getStatusLabel","draft","QuestionListTable","selectedQuestions","setSelectedQuestions","page","setPage","limit","setLimit","setQuery","drafts","filters","setFilters","filteredQuestions","toLowerCase","matches","containsQuery","includes","isPublished","isArchived","applyFilters","paginatedQuestions","applyPagination","selectedSomeQuestions","selectedAllQuestions","updatedFilters","flexWrap","InputProps","startAdornment","InputAdornment","placeholder","indeterminate","isQuestionSelected","prevSelected","isPublic","TablePagination","count","onPageChange","newPage","onRowsPerPageChange","rowsPerPage","rowsPerPageOptions","AdmQuestionList","doGetQuestions","CategoryListTable","selectedCategories","setSelectedCategories","paginatedCategories","selectedSomeCategories","selectedAllCategories","isCategorySelected","questionCount","AdmCategoryList","setCategories","cancelled","CategoryDetails","setCategory","fetchedCategory","doGetCategory","handleDelete","xl","QuestionDetails","setQuestion","setUpdated","editorRef","attachments","setAttachments","fetchedQuestion","isPromoted","submitHandler","getContent","userId","attachmentsToAdd","i","add","hiddenFileInput","React","onInit","evt","editor","apiKey","tinymceKey","initialValue","init","menubar","plugins","toolbar","onEditorChange","FormControlLabel","Switch","defaultChecked","InputLabel","htmlFor","attach","underline","attachmentsUrl","fileName","files","attachment","attachmentId","remove","doUpload","Settings","LoadingScreen","NProgress","start","done","Checkout","pid_from","client_id","product_id","product_amount","subtotalAfterDiscount","invoice","ResellerCheckout","cart","original_order","every","element","po","shipping","reseller_id","Loadable","Component","fallback","Login","lazy","CreateAccount","ForgotPassword","Register","Orders","Profile","Upgrades","Discounts","Support","Invoice","SoftwareDownload","AddSupport","Deactivate","Upgrade","Unsubscribe","Unsubscribed","ResellerProfile","ResellerOrders","ResellerNewOrder","SubmitRequest","AuthorizationRequired","NotFound","ServerError","routes","html","GlobalStyles","App","useRoutes","createMuiTheme","responsiveFontSizes","createTheme","StyledEngineProvider","injectFirst","ThemeProvider","ScrollToTop","scrollTo","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","store","createStore","ReactDOM","LocalizationProvider","dateAdapter","AdapterDateFns","document","getElementById","disableTypography","supportEmail","mapUrl","website","domainName","secureWebOrderUrl","hstNumber","forwardRef","navigator","userAgent","overflowX","resellerEmail","getOrdersCount","getProducts","getProductPrice","getExtraSupportInfo","profile","mapResellerOrder","from","prevDate","prevOrder","rows","toISOString","server"],"mappings":"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","file":"static/js/main.f562c7a7.chunk.js","sourcesContent":["import { FC } from 'react';\r\nimport { Link as RouterLink } from 'react-router-dom';\r\nimport { Box, Card, CardContent, Container, Typography, Link } from '@mui/material';\r\nimport { Logo } from '../components/Logo';\r\nimport { Title } from '../components/Title';\r\n\r\ninterface MessageProps {\r\n title: string;\r\n message: string;\r\n linkText?: string;\r\n linkUrl?: string;\r\n homeText?: string;\r\n homeUrl?: string;\r\n}\r\n\r\nconst Message: FC<MessageProps> = ({ title, message, linkText, linkUrl, homeText, homeUrl }) => {\r\n if (!homeText) {\r\n homeText = 'Home';\r\n }\r\n if (!homeUrl) {\r\n homeUrl = '/';\r\n }\r\n\r\n return (\r\n <>\r\n <Title title={title} />\r\n <Box\r\n sx={{\r\n backgroundColor: 'background.default',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n minHeight: '100vh',\r\n }}\r\n >\r\n <Container maxWidth=\"sm\" sx={{ py: '60px' }}>\r\n <Card elevation={6} sx={{ p: 4 }}>\r\n <CardContent\r\n sx={{\r\n display: 'flex',\r\n flexDirection: 'column',\r\n p: 4,\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n flexDirection: 'column',\r\n }}\r\n >\r\n <Box sx={{ pb: 2 }}>\r\n <RouterLink to=\"/\">\r\n <Logo size={64} />\r\n </RouterLink>\r\n </Box>\r\n <Typography variant=\"h4\">{title}</Typography>\r\n <Typography sx={{ pt: 5 }}>{message}</Typography>\r\n <Box\r\n sx={{\r\n pt: 3,\r\n display: 'flex',\r\n justifyContent: 'space-evenly',\r\n minWidth: '100%',\r\n }}\r\n >\r\n <Link component={RouterLink} to={homeUrl}>\r\n {homeText}\r\n </Link>\r\n {linkText && (\r\n <Link component={RouterLink} to={linkUrl}>\r\n {linkText}\r\n </Link>\r\n )}\r\n </Box>\r\n </Box>\r\n </CardContent>\r\n </Card>\r\n </Container>\r\n </Box>\r\n </>\r\n );\r\n};\r\nexport default Message;\r\n","export const getInitials = (name = ''): string =>\r\n name\r\n .replace(/\\s+/, ' ')\r\n .split(' ')\r\n .slice(0, 2)\r\n .map((v) => v && v[0].toUpperCase())\r\n .join('');\r\n","import { http } from './http';\r\nimport type { HttpResponse } from './http';\r\nimport type { ProfileData, UnsubscribeRequest } from './types/profile';\r\nimport type { Invoice } from './types/invoice';\r\nimport type { ExtraSupport, ExtraSupportResponse, DeactivateRequest } from './types/order';\r\nimport type { Upgrade, ProductUpgradeInfo } from './types/upgrade';\r\nimport type { CheckoutInfoResponse, CheckoutRequest, CheckoutResponse } from './types/checkout';\r\nimport type { DownloadResponse, Download } from './types/download';\r\nimport type {\r\n DiscountInfo,\r\n DiscountInfoResponse,\r\n DiscountToken,\r\n DiscountTokenResponse,\r\n GenerateTokenResponse,\r\n GenerateTokenInfo,\r\n} from './types/discount';\r\nimport { accountService } from './account.service';\r\n\r\nexport const clientService = {\r\n emptyProfile,\r\n getProfile,\r\n updateProfile,\r\n updatePassword,\r\n getOrders,\r\n getInvoice,\r\n getExtraSupport,\r\n deactivateLicense,\r\n getUpgrades,\r\n getUpgradeInfo,\r\n getCheckoutInfo,\r\n getDownloads,\r\n getDiscountInfo,\r\n generateToken,\r\n checkout,\r\n unsubscribe,\r\n};\r\n\r\n// const sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay));\r\n\r\nfunction emptyProfile(): ProfileData {\r\n return {\r\n email: '',\r\n firstName: '',\r\n lastName: '',\r\n company: '',\r\n address: '',\r\n city: '',\r\n state: '',\r\n country: '',\r\n zip: '',\r\n phone: '',\r\n fax: '',\r\n notify: false,\r\n };\r\n}\r\n\r\nasync function getProfile(clientId: number): Promise<HttpResponse<ProfileData>> {\r\n const result = await http<ProfileData>({\r\n path: `/clients/${clientId}/profile`,\r\n });\r\n return result;\r\n}\r\n\r\nasync function updateProfile(clientId: number, data: ProfileData): Promise<HttpResponse<any>> {\r\n const result = await http<any, ProfileData>({\r\n path: `/clients/${clientId}/profile`,\r\n method: 'PUT',\r\n body: data,\r\n });\r\n return result;\r\n}\r\n\r\nexport interface UpdatePasswordRequest {\r\n oldPassword: string;\r\n newPassword: string;\r\n}\r\n\r\nasync function updatePassword(clientId: number, data: UpdatePasswordRequest): Promise<HttpResponse<any>> {\r\n const result = await http<any, UpdatePasswordRequest>({\r\n path: `/clients/${clientId}/password`,\r\n method: 'POST',\r\n body: data,\r\n });\r\n return result;\r\n}\r\n\r\ninterface OrderDataResponse {\r\n orderId: string;\r\n dateTime: string;\r\n type: string;\r\n amount: number;\r\n amountCAD: number;\r\n refundStatus: string;\r\n productName: string;\r\n product: string;\r\n curVer: string;\r\n productId: number;\r\n expiryDate: string;\r\n lifetimeSupport: boolean;\r\n}\r\n\r\nexport interface OrderData {\r\n orderId: string;\r\n dateTime: Date;\r\n type: string;\r\n amount: number;\r\n amountCAD: number;\r\n refundStatus: string;\r\n productName: string;\r\n product: string;\r\n curVer: string;\r\n productId: number;\r\n expiryDate?: Date;\r\n lifetimeSupport: boolean;\r\n}\r\n\r\nconst mapOrderData = (order: OrderDataResponse): OrderData => ({\r\n ...order,\r\n dateTime: new Date(order.dateTime),\r\n expiryDate: order['expiryDate'] === undefined ? null : new Date(order.expiryDate),\r\n});\r\n\r\nasync function getOrders(clientId: number): Promise<HttpResponse<OrderData[]>> {\r\n const result = await http<OrderDataResponse[]>({\r\n path: `/clients/${clientId}/orders`,\r\n });\r\n if (result.ok && result.body) {\r\n return { ok: result.ok, body: result.body.map(mapOrderData) };\r\n } else {\r\n return { ok: false, message: result.message, body: null };\r\n }\r\n}\r\n\r\nasync function getInvoice(orderId: string): Promise<Invoice | null> {\r\n const result = await http<Invoice>({\r\n path: `/clients/invoices/${orderId}`,\r\n });\r\n if (result.ok && result.body) {\r\n return result.body;\r\n } else {\r\n return null;\r\n }\r\n}\r\n\r\nconst mapExtraSupport = (data: ExtraSupportResponse): ExtraSupport => ({\r\n ...data,\r\n dateTime: new Date(data.dateTime),\r\n expiryDate: new Date(data.expiryDate),\r\n});\r\n\r\nasync function getExtraSupport(orderId: string): Promise<HttpResponse<ExtraSupport>> {\r\n const result = await http<ExtraSupportResponse>({\r\n path: `/clients/extra-support/${orderId}`,\r\n });\r\n\r\n if (result.ok && result.body) {\r\n return { ok: result.ok, message: result.message, body: mapExtraSupport(result.body) };\r\n } else {\r\n return { ok: false, message: result.message, body: null };\r\n }\r\n}\r\n\r\nasync function deactivateLicense(\r\n orderId: string,\r\n productId: number,\r\n productName: string,\r\n reason: string\r\n): Promise<boolean> {\r\n const result = await http<any, DeactivateRequest>({\r\n path: `/clients/${accountService.getAccount().id}/deactivate`,\r\n method: 'POST',\r\n body: {\r\n clientName: accountService.getAccount().name,\r\n clientEmail: accountService.getAccount().email,\r\n orderId: orderId,\r\n productId: productId,\r\n productName: productName,\r\n reason: reason,\r\n },\r\n });\r\n return result.ok;\r\n}\r\n\r\nasync function unsubscribe(email: string): Promise<HttpResponse<any>> {\r\n const result = await http<any, UnsubscribeRequest>({\r\n path: `/clients/unsubscribe`,\r\n method: 'POST',\r\n body: {\r\n email: email,\r\n },\r\n });\r\n return result;\r\n}\r\n\r\nasync function getUpgrades(): Promise<Upgrade[]> {\r\n const result = await http<Upgrade[]>({\r\n path: `/clients/${accountService.getAccount().id}/upgrades`,\r\n });\r\n if (result.ok && result.body) {\r\n return result.body;\r\n } else {\r\n return [];\r\n }\r\n}\r\n\r\nasync function getUpgradeInfo(token: string): Promise<HttpResponse<ProductUpgradeInfo>> {\r\n const result = await http<ProductUpgradeInfo>({\r\n path: `/clients/upgrade/${token}`,\r\n });\r\n return result;\r\n}\r\n\r\nasync function getCheckoutInfo(\r\n productId: number,\r\n quantity: number,\r\n license: number,\r\n orderId: number,\r\n isUpgrade: boolean,\r\n upgradeFromProduct: number\r\n): Promise<HttpResponse<CheckoutInfoResponse>> {\r\n const result = await http<CheckoutInfoResponse>({\r\n path: `/clients/checkout?productId=${productId}&quantity=${quantity}&license=${license}&orderId=${orderId}&isUpgrade=${isUpgrade}&upgradeFromProduct=${upgradeFromProduct}`,\r\n });\r\n return result;\r\n}\r\n\r\nasync function checkout(params: CheckoutRequest): Promise<CheckoutResponse | null> {\r\n const result = await http<CheckoutResponse, CheckoutRequest>({\r\n path: 'https://secure.lsoft.net/OrderProcessBackend.aspx',\r\n method: 'POST',\r\n body: params,\r\n formData: true,\r\n });\r\n if (result.ok && result.body) {\r\n return result.body;\r\n } else {\r\n return null;\r\n }\r\n}\r\n\r\nconst mapDownloads = (download: DownloadResponse): Download => ({\r\n ...download,\r\n dateTime: new Date(download.dateTime),\r\n});\r\n\r\nasync function getDownloads(orderId: string): Promise<HttpResponse<Download>> {\r\n const result = await http<DownloadResponse>({\r\n path: `/clients/downloads/${orderId}`,\r\n });\r\n\r\n if (result.ok && result.body) {\r\n return { ok: result.ok, message: result.message, body: mapDownloads(result.body) };\r\n } else {\r\n return { ok: false, message: result.message, body: null };\r\n }\r\n}\r\n\r\nconst mapDiscountToken = (token: DiscountTokenResponse): DiscountToken => ({\r\n ...token,\r\n dateTime: new Date(token.dateTime),\r\n});\r\n\r\nconst mapDiscountInfo = (discountInfo: DiscountInfoResponse): DiscountInfo => ({\r\n volumeDiscounts: discountInfo.volumeDiscounts,\r\n discountTokens: discountInfo.discountTokens.map(mapDiscountToken),\r\n eligibleDiscount: discountInfo.eligibleDiscount,\r\n});\r\n\r\nasync function getDiscountInfo(): Promise<DiscountInfo | null> {\r\n const result = await http<DiscountInfoResponse>({\r\n path: `/clients/${accountService.getAccount().id}/discounts`,\r\n });\r\n if (result.ok && result.body) {\r\n return mapDiscountInfo(result.body);\r\n } else {\r\n return null;\r\n }\r\n}\r\n\r\nconst mapGenerateTokenResponse = (response: GenerateTokenResponse): GenerateTokenInfo => ({\r\n ...response,\r\n tokens: response.tokens.map(mapDiscountToken),\r\n});\r\n\r\nasync function generateToken(): Promise<GenerateTokenInfo | null> {\r\n const result = await http<GenerateTokenResponse>({\r\n path: `/clients/${accountService.getAccount().id}/discounts/generate`,\r\n });\r\n if (result.ok && result.body) {\r\n return mapGenerateTokenResponse(result.body);\r\n } else {\r\n return null;\r\n }\r\n}\r\n","import { createSvgIcon } from '@mui/material/utils';\r\n\r\nconst Search = createSvgIcon(\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\r\n <path\r\n fillRule=\"evenodd\"\r\n d=\"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z\"\r\n clipRule=\"evenodd\"\r\n />\r\n </svg>,\r\n 'Search'\r\n);\r\n\r\nexport default Search;\r\n","import { webAPIUrl } from './AppSettings';\r\nimport { accountService } from './account.service';\r\n\r\nexport interface HttpRequest<REQB> {\r\n path: string;\r\n method?: string;\r\n body?: REQB;\r\n accessToken?: string;\r\n file?: File;\r\n authHeader?: any;\r\n formData?: boolean;\r\n}\r\n\r\nexport interface HttpResponse<RESB> {\r\n ok: boolean;\r\n body?: RESB;\r\n message?: string;\r\n}\r\n\r\nfunction getBody(config) {\r\n if (config.file) {\r\n return config.file;\r\n } else if (config.formData) {\r\n const formData = new FormData();\r\n for (const key in config.body) {\r\n formData.append(String(key), String(config.body[key]));\r\n }\r\n return formData;\r\n } else if (config.body) {\r\n return JSON.stringify(config.body);\r\n } else {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction getContentType(config): string | null {\r\n if (config.formData) {\r\n return null;\r\n }\r\n if (config.file) {\r\n return 'multipart/form-data';\r\n } else {\r\n return 'application/json';\r\n }\r\n}\r\n\r\nexport const http = async <RESB, REQB = undefined>(config: HttpRequest<REQB>): Promise<HttpResponse<RESB>> => {\r\n const headers = {};\r\n const contentType = getContentType(config);\r\n if (contentType) {\r\n headers['Content-Type'] = contentType;\r\n }\r\n\r\n const request = new Request(config.path.startsWith('http') ? config.path : `${webAPIUrl}${config.path}`, {\r\n method: config.method || 'GET',\r\n headers: {\r\n ...headers,\r\n ...config.authHeader,\r\n },\r\n body: getBody(config),\r\n });\r\n\r\n var account = accountService.getAccount();\r\n if (account) {\r\n request.headers.set('authorization', `bearer ${account.jwtToken}`);\r\n }\r\n\r\n try {\r\n const response = await fetch(request);\r\n if (response.ok) {\r\n if (response.status === 204) {\r\n return { ok: response.ok };\r\n } else {\r\n const body = await response.json();\r\n return { ok: response.ok, body };\r\n }\r\n } else {\r\n if (response.status === 401 || response.status === 403) {\r\n accountService.logout();\r\n return { ok: false, message: 'Unauthorized' };\r\n }\r\n const body = await response.json();\r\n console.error(`Error requesting ${request.method} ${request.url}`, body.message);\r\n return { ok: response.ok, message: body.message };\r\n }\r\n } catch (e) {\r\n return { ok: false, message: 'Connection error' };\r\n }\r\n};\r\n\r\n// const logError = async (request: Request, response: Response) => {\r\n// const contentType = response.headers.get('content-type');\r\n// let body: any;\r\n// if (contentType && contentType.indexOf('application/json') !== -1) {\r\n// body = await response.json();\r\n// } else {\r\n// body = await response.text();\r\n// }\r\n// console.error(`Error requesting ${request.method} ${request.url}`, body);\r\n// };\r\n","import { http } from './http';\r\nimport type {\r\n EmailCheckRequest,\r\n EmailCheckResponse,\r\n AddProfileRequest,\r\n VerifyEmailResponse,\r\n VerifyEmailRequest,\r\n RegisterRequest,\r\n ForgotPasswordRequest,\r\n ForgotPasswordResponse,\r\n} from './types/account';\r\n\r\nexport const accountService = {\r\n login,\r\n logout,\r\n getAccount,\r\n checkEmail,\r\n addClientProfile,\r\n verifyEmail,\r\n register,\r\n forgotPassword,\r\n};\r\n\r\ninterface LoginRequest {\r\n login: string;\r\n password: string;\r\n}\r\n\r\nexport enum UserRole {\r\n Client = 0,\r\n Reseller = 1,\r\n Admin = 2,\r\n}\r\n\r\nexport interface UserAccount {\r\n id: number;\r\n email: string;\r\n name: string;\r\n role: UserRole; // undefined for now\r\n jwtToken: string;\r\n}\r\n\r\nlet account: UserAccount = null;\r\n\r\nfunction getAccount(): UserAccount | null {\r\n // if account does not exist, try to get it from local storage\r\n if (!account) {\r\n const item = localStorage.getItem('account');\r\n if (item) {\r\n account = JSON.parse(item);\r\n }\r\n }\r\n return account;\r\n}\r\n\r\nfunction setAccount(data: UserAccount) {\r\n account = data;\r\n localStorage.setItem('account', JSON.stringify(data));\r\n}\r\n\r\nfunction removeAccount() {\r\n account = null;\r\n localStorage.removeItem('account');\r\n}\r\n\r\nfunction parseJwt(token) {\r\n var base64Url = token.split('.')[1];\r\n var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\r\n var jsonPayload = decodeURIComponent(\r\n window\r\n .atob(base64)\r\n .split('')\r\n .map(function (c) {\r\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\r\n })\r\n .join('')\r\n );\r\n\r\n return JSON.parse(jsonPayload);\r\n}\r\n\r\nfunction getRole(roleAsString: string): UserRole {\r\n if (roleAsString === 'Admin') {\r\n return UserRole.Admin;\r\n } else if (roleAsString === 'Reseller') {\r\n return UserRole.Reseller;\r\n } else if (roleAsString === 'Client') {\r\n return UserRole.Client;\r\n } else {\r\n return undefined;\r\n }\r\n}\r\n\r\nasync function login(login: string, password: string): Promise<boolean> {\r\n const result = await http<UserAccount, LoginRequest>({\r\n path: '/accounts/authenticate',\r\n method: 'POST',\r\n body: { login, password },\r\n });\r\n if (result.ok) {\r\n var jwtToken = parseJwt(result.body.jwtToken);\r\n setAccount({\r\n id: jwtToken.Id,\r\n email: jwtToken.Email,\r\n name: jwtToken.FirstName + ' ' + jwtToken.LastName,\r\n role: getRole(jwtToken['http://schemas.microsoft.com/ws/2008/06/identity/claims/role']),\r\n jwtToken: result.body.jwtToken,\r\n });\r\n // startRefreshTokenTimer();\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n}\r\n\r\nasync function logout() {\r\n // revoke token, stop refresh timer, publish null to user subscribers and redirect to login page\r\n // await http({\r\n // path: '/accounts/revoke-token',\r\n // method: 'POST',\r\n // });\r\n // stopRefreshTokenTimer();\r\n removeAccount();\r\n}\r\n\r\nasync function refreshToken() {\r\n const result = await http({\r\n path: '/accounts/refresh-token',\r\n method: 'POST',\r\n });\r\n if (result.ok) {\r\n // const user = result.body;\r\n\r\n // account = user;\r\n startRefreshTokenTimer();\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n}\r\n\r\n// helper functions\r\n\r\nlet refreshTokenTimeout;\r\n\r\nfunction startRefreshTokenTimer() {\r\n // parse json object from base64 encoded jwt token\r\n const jwtToken = JSON.parse(atob(account.jwtToken.split('.')[1]));\r\n\r\n // set a timeout to refresh the token a minute before it expires\r\n const expires = new Date(jwtToken.exp * 1000);\r\n const timeout = expires.getTime() - Date.now() - 60 * 1000;\r\n\r\n // eslint-disable-next-line\r\n refreshTokenTimeout = setTimeout(refreshToken, timeout);\r\n}\r\n\r\n// function stopRefreshTokenTimer() {\r\n// clearTimeout(refreshTokenTimeout);\r\n// }\r\n\r\nasync function checkEmail(email: string): Promise<EmailCheckResponse | null> {\r\n const result = await http<EmailCheckResponse, EmailCheckRequest>({\r\n path: `/accounts/check-email`,\r\n method: 'POST',\r\n body: { email },\r\n });\r\n\r\n if (result.ok) {\r\n return result.body;\r\n } else {\r\n return null;\r\n }\r\n}\r\n\r\nasync function addClientProfile(email: string): Promise<boolean> {\r\n const result = await http<any, AddProfileRequest>({\r\n path: `/accounts/add-profile`,\r\n method: 'POST',\r\n body: { email },\r\n });\r\n return result.ok;\r\n}\r\n\r\nasync function verifyEmail(token: string): Promise<string | undefined> {\r\n const result = await http<VerifyEmailResponse, VerifyEmailRequest>({\r\n path: '/accounts/verify-email',\r\n method: 'POST',\r\n body: { token },\r\n });\r\n if (result.ok) {\r\n return result.body.email;\r\n } else {\r\n return undefined;\r\n }\r\n}\r\n\r\nasync function register(data: RegisterRequest): Promise<boolean> {\r\n const result = await http<any, RegisterRequest>({\r\n path: `/accounts/register`,\r\n method: 'POST',\r\n body: data,\r\n });\r\n return result.ok;\r\n}\r\n\r\nasync function forgotPassword(email: string): Promise<ForgotPasswordResponse | null> {\r\n const result = await http<ForgotPasswordResponse, ForgotPasswordRequest>({\r\n path: `/accounts/forgot-password`,\r\n method: 'POST',\r\n body: { email },\r\n });\r\n\r\n if (result.ok) {\r\n return result.body;\r\n } else {\r\n return null;\r\n }\r\n}\r\n","import { Store, createStore, combineReducers } from 'redux';\r\nimport { QuestionData, CategoryData } from './data';\r\nimport { UserAccount } from './account.service';\r\n\r\ninterface QuestionState {\r\n readonly loading: boolean;\r\n readonly categories: CategoryData[];\r\n readonly category: CategoryData | null;\r\n readonly recentlyAdded: QuestionData[];\r\n readonly browsed: QuestionData[];\r\n readonly searched: QuestionData[];\r\n readonly filtered: QuestionData[];\r\n readonly viewing: QuestionData | null;\r\n}\r\n\r\nconst initialQuestionState: QuestionState = {\r\n loading: false,\r\n categories: [],\r\n category: null,\r\n recentlyAdded: [],\r\n browsed: [],\r\n searched: [],\r\n filtered: [],\r\n viewing: null,\r\n};\r\n\r\nexport const GETTING_CATEGORIES = 'GettingCategories';\r\nexport const gettingCategoriesAction = () =>\r\n ({\r\n type: GETTING_CATEGORIES,\r\n } as const);\r\n\r\nexport const GOT_CATEGORIES = 'GotCategories';\r\nexport const gotCategoriesAction = (categories: CategoryData[]) =>\r\n ({\r\n type: GOT_CATEGORIES,\r\n categories,\r\n } as const);\r\n\r\nexport const GETTING_CATEGORY = 'GettingCategory';\r\nexport const gettingCategoryAction = () =>\r\n ({\r\n type: GETTING_CATEGORY,\r\n } as const);\r\n\r\nexport const GOT_CATEGORY = 'GotCategory';\r\nexport const gotCategoryAction = (category: CategoryData | null) =>\r\n ({\r\n type: GOT_CATEGORY,\r\n category,\r\n } as const);\r\n\r\nexport const GETTING_RECENTLY_ADDED = 'GettingRecentlyAdded';\r\nexport const gettingRecentlyAddedAction = () =>\r\n ({\r\n type: GETTING_RECENTLY_ADDED,\r\n } as const);\r\n\r\nexport const GOT_RECENTLY_ADDED = 'GotRecentlyAdded';\r\nexport const gotRecentlyAddedAction = (questions: QuestionData[]) =>\r\n ({\r\n type: GOT_RECENTLY_ADDED,\r\n questions,\r\n } as const);\r\n\r\nexport const GETTING_BROWSED = 'GettingBrowsed';\r\nexport const gettingBrowsedAction = () =>\r\n ({\r\n type: GETTING_BROWSED,\r\n } as const);\r\n\r\nexport const GOT_BROWSED = 'GotBrowsed';\r\nexport const gotBrowsedAction = (questions: QuestionData[]) =>\r\n ({\r\n type: GOT_BROWSED,\r\n questions,\r\n } as const);\r\n\r\nexport const SEARCHING_QUESTIONS = 'SearchingQuestions';\r\nexport const searchingQuestionsAction = () => ({ type: SEARCHING_QUESTIONS } as const);\r\n\r\nexport const SEARCHED_QUESTIONS = 'SearchedQuestions';\r\nexport const searchedQuestionsAction = (questions: QuestionData[]) =>\r\n ({\r\n type: SEARCHED_QUESTIONS,\r\n questions: questions,\r\n } as const);\r\n\r\nexport const FILTERING_QUESTIONS = 'FilteringQuestions';\r\nexport const filteringQuestionsAction = () => ({ type: FILTERING_QUESTIONS } as const);\r\n\r\nexport const FILTERED_QUESTIONS = 'FilteredQuestions';\r\nexport const filteredQuestionsAction = (questions: QuestionData[]) =>\r\n ({\r\n type: FILTERED_QUESTIONS,\r\n questions: questions,\r\n } as const);\r\n\r\nexport const GETTING_QUESTION = 'GettingQuestion';\r\nexport const gettingQuestionAction = () => ({ type: GETTING_QUESTION } as const);\r\n\r\nexport const GOT_QUESTION = 'GotQuestion';\r\nexport const gotQuestionAction = (question: QuestionData | null) =>\r\n ({\r\n type: GOT_QUESTION,\r\n question: question,\r\n } as const);\r\n\r\ntype QuestionsActions =\r\n | ReturnType<typeof gettingCategoriesAction>\r\n | ReturnType<typeof gotCategoriesAction>\r\n | ReturnType<typeof gettingCategoryAction>\r\n | ReturnType<typeof gotCategoryAction>\r\n | ReturnType<typeof gettingRecentlyAddedAction>\r\n | ReturnType<typeof gotRecentlyAddedAction>\r\n | ReturnType<typeof gettingBrowsedAction>\r\n | ReturnType<typeof gotBrowsedAction>\r\n | ReturnType<typeof searchingQuestionsAction>\r\n | ReturnType<typeof searchedQuestionsAction>\r\n | ReturnType<typeof filteringQuestionsAction>\r\n | ReturnType<typeof filteredQuestionsAction>\r\n | ReturnType<typeof gettingQuestionAction>\r\n | ReturnType<typeof gotQuestionAction>\r\n | ReturnType<typeof gettingAccountAction>\r\n | ReturnType<typeof gotAccountAction>;\r\n\r\nconst questionsReducer = (state = initialQuestionState, action: QuestionsActions) => {\r\n switch (action.type) {\r\n case GETTING_CATEGORIES: {\r\n return {\r\n ...state,\r\n categories: [],\r\n loading: true,\r\n };\r\n }\r\n case GOT_CATEGORIES: {\r\n return {\r\n ...state,\r\n categories: action.categories,\r\n loading: false,\r\n };\r\n }\r\n case GETTING_CATEGORY: {\r\n return {\r\n ...state,\r\n category: null,\r\n loading: true,\r\n };\r\n }\r\n case GOT_CATEGORY: {\r\n return {\r\n ...state,\r\n category: action.category,\r\n loading: false,\r\n };\r\n }\r\n case GETTING_RECENTLY_ADDED: {\r\n return {\r\n ...state,\r\n recentlyAdded: [],\r\n loading: true,\r\n };\r\n }\r\n case GOT_RECENTLY_ADDED: {\r\n return {\r\n ...state,\r\n recentlyAdded: action.questions,\r\n loading: false,\r\n };\r\n }\r\n case GETTING_BROWSED: {\r\n return {\r\n ...state,\r\n browsed: [],\r\n loading: true,\r\n };\r\n }\r\n case GOT_BROWSED: {\r\n return {\r\n ...state,\r\n browsed: action.questions,\r\n loading: false,\r\n };\r\n }\r\n case SEARCHING_QUESTIONS: {\r\n return {\r\n ...state,\r\n searched: [],\r\n loading: true,\r\n };\r\n }\r\n case SEARCHED_QUESTIONS: {\r\n return {\r\n ...state,\r\n searched: action.questions,\r\n loading: false,\r\n };\r\n }\r\n case FILTERING_QUESTIONS: {\r\n return {\r\n ...state,\r\n filtered: [],\r\n loading: true,\r\n };\r\n }\r\n case FILTERED_QUESTIONS: {\r\n return {\r\n ...state,\r\n filtered: action.questions,\r\n loading: false,\r\n };\r\n }\r\n case GETTING_QUESTION: {\r\n return {\r\n ...state,\r\n loading: true,\r\n viewing: null,\r\n };\r\n }\r\n case GOT_QUESTION: {\r\n return {\r\n ...state,\r\n loading: false,\r\n viewing: action.question,\r\n };\r\n }\r\n }\r\n return state;\r\n};\r\n\r\n////////////////////\r\n// account\r\n\r\ninterface AccountState {\r\n readonly loading: boolean;\r\n readonly user: UserAccount | null;\r\n}\r\n\r\nconst initialAccountState: AccountState = {\r\n loading: false,\r\n user: null,\r\n};\r\n\r\nexport const GETTING_ACCOUNT = 'GettingAccount';\r\nexport const gettingAccountAction = () => ({ type: GETTING_ACCOUNT } as const);\r\n\r\nexport const GOT_ACCOUNT = 'GotAccount';\r\nexport const gotAccountAction = (user: UserAccount | null) =>\r\n ({\r\n type: GOT_ACCOUNT,\r\n user: user,\r\n } as const);\r\n\r\ntype AccountActions = ReturnType<typeof gettingAccountAction> | ReturnType<typeof gotAccountAction>;\r\n\r\nconst accountReducer = (state = initialAccountState, action: AccountActions) => {\r\n switch (action.type) {\r\n case GETTING_ACCOUNT: {\r\n return {\r\n ...state,\r\n loading: true,\r\n user: null,\r\n };\r\n }\r\n case GOT_ACCOUNT: {\r\n return {\r\n ...state,\r\n loading: false,\r\n user: action.user,\r\n };\r\n }\r\n }\r\n return state;\r\n};\r\n\r\nexport interface AppState {\r\n readonly questions: QuestionState;\r\n readonly account: AccountState;\r\n}\r\n\r\nconst rootReducer = combineReducers<AppState>({ questions: questionsReducer, account: accountReducer });\r\nexport const configureStore = (): Store<AppState> => {\r\n const store = createStore(rootReducer, undefined);\r\n return store;\r\n};\r\n","import type { FC } from 'react';\r\nimport { Link as RouterLink, useNavigate } from 'react-router-dom';\r\nimport { AppBar, Box, Button, Divider, Hidden, IconButton, Toolbar, Typography, Stack } from '@mui/material';\r\nimport MenuIcon from '@mui/icons-material/Menu';\r\nimport PersonIcon from '@mui/icons-material/Person';\r\nimport { Theme } from '@mui/material/styles';\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { Logo } from './Logo';\r\nimport { accountService, UserRole } from '../account.service';\r\n\r\ninterface MainNavbarProps {\r\n onSidebarMobileOpen?: () => void;\r\n showMenu: boolean;\r\n customTitle?: string;\r\n}\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n homeLink: {\r\n textDecoration: 'none',\r\n },\r\n })\r\n);\r\n\r\nexport const MainNavbar: FC<MainNavbarProps> = ({ onSidebarMobileOpen, showMenu, customTitle }) => {\r\n const classes = useStyles();\r\n const navigate = useNavigate();\r\n const account = accountService.getAccount();\r\n\r\n const onSignIn = () => {\r\n if (account) {\r\n accountService.logout();\r\n navigate('/');\r\n } else {\r\n navigate('/account/login');\r\n }\r\n };\r\n\r\n const onProfile = () => {\r\n if (account) {\r\n switch (account.role) {\r\n case UserRole.Reseller:\r\n navigate('/reseller/orders');\r\n break;\r\n case UserRole.Admin:\r\n navigate('/kb/');\r\n break;\r\n default:\r\n navigate('/client/orders');\r\n break;\r\n }\r\n } else {\r\n window.open('https://lsoft.zendesk.com/hc/en-us/requests/new', '_blank');\r\n }\r\n };\r\n\r\n return (\r\n <AppBar\r\n elevation={0}\r\n sx={{\r\n color: 'text.secondary',\r\n }}\r\n >\r\n <Toolbar sx={{ minHeight: 64 }}>\r\n {showMenu && (\r\n <Hidden mdUp>\r\n <IconButton sx={{ color: 'white' }} onClick={onSidebarMobileOpen} size=\"large\">\r\n <MenuIcon fontSize=\"small\" />\r\n </IconButton>\r\n </Hidden>\r\n )}\r\n <RouterLink to=\"/\" className={classes.homeLink}>\r\n <Stack direction=\"row\" spacing={1} sx={{ textDecoration: 'none' }}>\r\n <Logo />\r\n <Typography\r\n sx={{\r\n caretColor: 'rgba(0,0,0,0)',\r\n color: 'white',\r\n whiteSpace: 'nowrap',\r\n textDecoration: 'none',\r\n lineHeight: '40px',\r\n }}\r\n variant=\"h6\"\r\n >\r\n LSoft Technologies\r\n </Typography>\r\n <Typography\r\n id=\"page-title\"\r\n sx={{\r\n color: 'white',\r\n whiteSpace: 'nowrap',\r\n fontWeight: 100,\r\n lineHeight: '40px',\r\n display: { xs: 'none', md: 'block' },\r\n }}\r\n variant=\"h6\"\r\n >\r\n | {customTitle ? customTitle : 'Customer Support'}\r\n </Typography>\r\n </Stack>\r\n </RouterLink>\r\n <Box sx={{ flexGrow: 1 }} />\r\n {showMenu && (\r\n <Hidden mdDown>\r\n <Button\r\n sx={{\r\n color: 'white',\r\n marginLeft: 1,\r\n }}\r\n onClick={onProfile}\r\n >\r\n {account ? (account.role === UserRole.Admin ? 'Dashboard' : 'Profile') : 'Submit request'}\r\n </Button>\r\n\r\n <Divider\r\n orientation=\"vertical\"\r\n sx={{\r\n height: 32,\r\n mx: 2,\r\n backgroundColor: 'white',\r\n }}\r\n />\r\n <Button\r\n sx={{\r\n color: 'white',\r\n marginLeft: 1,\r\n }}\r\n startIcon={<PersonIcon />}\r\n onClick={onSignIn}\r\n >\r\n {account ? 'Sign Out' : 'Sign In'}\r\n </Button>\r\n </Hidden>\r\n )}\r\n </Toolbar>\r\n </AppBar>\r\n );\r\n};\r\n","import { useEffect } from 'react';\r\nimport type { FC } from 'react';\r\nimport { Link as RouterLink, useLocation, useNavigate } from 'react-router-dom';\r\nimport { Button, Box, Drawer, Hidden } from '@mui/material';\r\nimport { Logo } from './Logo';\r\nimport { accountService, UserRole } from '../account.service';\r\n\r\ninterface MainSidebarProps {\r\n onMobileClose: () => void;\r\n openMobile: boolean;\r\n}\r\n\r\nexport const MainSidebar: FC<MainSidebarProps> = ({ onMobileClose, openMobile }) => {\r\n const location = useLocation();\r\n const navigate = useNavigate();\r\n const account = accountService.getAccount();\r\n\r\n useEffect(() => {\r\n if (openMobile && onMobileClose) {\r\n onMobileClose();\r\n }\r\n //READ: https://stackoverflow.com/questions/55840294/how-to-fix-missing-dependency-warning-when-using-useeffect-react-hook\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [location.pathname]);\r\n\r\n const onSignIn = () => {\r\n if (account) {\r\n accountService.logout();\r\n navigate('/');\r\n } else {\r\n navigate('/account/login');\r\n }\r\n };\r\n\r\n const onProfile = () => {\r\n if (account) {\r\n switch (account.role) {\r\n case UserRole.Reseller:\r\n navigate('/reseller/orders');\r\n break;\r\n case UserRole.Admin:\r\n navigate('/kb/');\r\n break;\r\n default:\r\n navigate('/client/orders');\r\n break;\r\n }\r\n } else {\r\n window.open('https://lsoft.zendesk.com/hc/en-us/requests/new', '_blank');\r\n }\r\n };\r\n\r\n return (\r\n <Hidden mdUp>\r\n <Drawer\r\n anchor=\"left\"\r\n onClose={onMobileClose}\r\n open={openMobile}\r\n variant=\"temporary\"\r\n PaperProps={{\r\n sx: {\r\n backgroundColor: 'background.default',\r\n width: 256,\r\n },\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: '100%',\r\n p: 2,\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n justifyContent: 'center',\r\n p: 2,\r\n }}\r\n >\r\n <RouterLink to=\"/\">\r\n <Logo />\r\n </RouterLink>\r\n </Box>\r\n\r\n <Button\r\n sx={{\r\n justifyContent: 'flex-start',\r\n pl: `16px`,\r\n pr: '8px',\r\n py: '12px',\r\n width: '100%',\r\n }}\r\n variant=\"text\"\r\n onClick={onProfile}\r\n >\r\n {account ? (account.role === UserRole.Admin ? 'Dashboard' : 'Profile') : 'Submit request'}\r\n </Button>\r\n\r\n <Button\r\n variant=\"text\"\r\n sx={{\r\n justifyContent: 'flex-start',\r\n pl: `16px`,\r\n pr: '8px',\r\n py: '12px',\r\n width: '100%',\r\n }}\r\n onClick={onSignIn}\r\n >\r\n {account ? 'Sign Out' : 'Sign In'}\r\n </Button>\r\n </Box>\r\n </Drawer>\r\n </Hidden>\r\n );\r\n};\r\n","import { ThemeOptions } from '@mui/material';\r\n\r\nexport const baseThemeOptions: ThemeOptions = {\r\n components: {\r\n MuiTableHead: {\r\n styleOverrides: {\r\n root: {\r\n borderBottom: 'none',\r\n '& .MuiTableCell-root': {\r\n borderBottom: 'none',\r\n fontSize: '12px',\r\n fontWeight: 600,\r\n lineHeight: 1,\r\n letterSpacing: 0.5,\r\n textTransform: 'uppercase',\r\n },\r\n '& .MuiTableCell-paddingCheckbox': {\r\n paddingTop: 4,\r\n paddingBottom: 4,\r\n },\r\n },\r\n },\r\n },\r\n MuiLinearProgress: {\r\n styleOverrides: {\r\n root: {\r\n borderRadius: 3,\r\n overflow: 'hidden',\r\n },\r\n },\r\n },\r\n MuiCardHeader: {\r\n defaultProps: {\r\n titleTypographyProps: {\r\n variant: 'h6',\r\n },\r\n subheaderTypographyProps: {\r\n variant: 'body2',\r\n },\r\n },\r\n },\r\n },\r\n typography: {\r\n subtitle2: {\r\n fontSize: '0.875rem',\r\n fontWeight: 500,\r\n lineHeight: 1.57,\r\n },\r\n h4: {\r\n fontWeight: 700,\r\n fontSize: '2rem',\r\n lineHeight: 1.375,\r\n },\r\n },\r\n};\r\n","import { ThemeOptions } from '@mui/material';\r\n\r\n// Colors\r\n\r\nconst neutral = {\r\n 100: '#F3F4F6',\r\n 200: '#E5E7EB',\r\n 300: '#D1D5DB',\r\n 400: '#9CA3AF',\r\n 500: '#6B7280',\r\n 600: '#4B5563',\r\n 700: '#374151',\r\n 800: '#1F2937',\r\n 900: '#111827',\r\n};\r\n\r\nconst background = {\r\n default: '#F4F6F8',\r\n paper: '#FFFFFF',\r\n};\r\n\r\n// const divider = '#E6E8F0';\r\n\r\nconst primary = {\r\n main: '#1875d1',\r\n contrastText: '#FFFFFF',\r\n};\r\n\r\nconst secondary = {\r\n main: '#f50057',\r\n contrastText: '#FFFFFF',\r\n};\r\n\r\n// const success = {\r\n// main: '#4caf50',\r\n// contrastText: '#FFFFFF',\r\n// };\r\n\r\nconst success = {\r\n main: '#8bc34a',\r\n contrastText: '#FFFFFF',\r\n};\r\n\r\n// const info = {\r\n// main: '#2196F3',\r\n// light: '#64B6F7',\r\n// dark: '#0B79D0',\r\n// contrastText: '#FFFFFF',\r\n// };\r\n\r\n// const warning = {\r\n// main: '#ff9800',\r\n// contrastText: '#FFFFFF',\r\n// };\r\n\r\nconst error = {\r\n main: '#f44336',\r\n contrastText: '#FFFFFF',\r\n};\r\n\r\n// const text = {\r\n// primary: '#121828',\r\n// secondary: '#65748B',\r\n// disabled: 'rgba(55, 65, 81, 0.48)',\r\n// };\r\n\r\nexport const lightThemeOptions: ThemeOptions = {\r\n components: {\r\n MuiTableHead: {\r\n styleOverrides: {\r\n root: {\r\n backgroundColor: neutral[100],\r\n '.MuiTableCell-root': {\r\n color: neutral[700],\r\n },\r\n },\r\n },\r\n },\r\n },\r\n\r\n palette: { background, primary, secondary, success, error },\r\n};\r\n","import { ThemeOptions } from '@mui/material';\r\n\r\n// Colors\r\n\r\nconst neutral = {\r\n 100: '#F3F4F6',\r\n 200: '#E5E7EB',\r\n 300: '#D1D5DB',\r\n 400: '#9CA3AF',\r\n 500: '#6B7280',\r\n 600: '#4B5563',\r\n 700: '#374151',\r\n 800: '#1F2937',\r\n 900: '#111827',\r\n};\r\n\r\nconst background = {\r\n default: '#0B0F19',\r\n paper: neutral[900],\r\n};\r\n\r\nconst divider = '#2D3748';\r\n\r\nconst primary = {\r\n main: '#7582EB',\r\n light: '#909BEF',\r\n dark: '#515BA4',\r\n contrastText: neutral[900],\r\n};\r\n\r\nconst secondary = {\r\n main: '#10B981',\r\n light: '#3FC79A',\r\n dark: '#0B815A',\r\n contrastText: neutral[900],\r\n};\r\n\r\nconst success = {\r\n main: '#14B8A6',\r\n light: '#43C6B7',\r\n dark: '#0E8074',\r\n contrastText: neutral[900],\r\n};\r\n\r\nconst info = {\r\n main: '#2196F3',\r\n light: '#64B6F7',\r\n dark: '#0B79D0',\r\n contrastText: neutral[900],\r\n};\r\n\r\nconst warning = {\r\n main: '#FFB020',\r\n light: '#FFBF4C',\r\n dark: '#B27B16',\r\n contrastText: neutral[900],\r\n};\r\n\r\nconst error = {\r\n main: '#D14343',\r\n light: '#DA6868',\r\n dark: '#922E2E',\r\n contrastText: neutral[900],\r\n};\r\n\r\nconst text = {\r\n primary: '#EDF2F7',\r\n secondary: '#A0AEC0',\r\n disabled: 'rgba(255, 255, 255, 0.48)',\r\n};\r\n\r\nexport const darkThemeOptions: ThemeOptions = {\r\n components: {\r\n MuiTableHead: {\r\n styleOverrides: {\r\n root: {\r\n backgroundColor: neutral[800],\r\n '.MuiTableCell-root': {\r\n color: neutral[300],\r\n },\r\n },\r\n },\r\n },\r\n },\r\n\r\n palette: {\r\n action: {\r\n active: neutral[400],\r\n hover: 'rgba(255, 255, 255, 0.04)',\r\n selected: 'rgba(255, 255, 255, 0.08)',\r\n disabledBackground: 'rgba(255, 255, 255, 0.12)',\r\n disabled: 'rgba(255, 255, 255, 0.26)',\r\n },\r\n background,\r\n divider,\r\n error,\r\n info,\r\n mode: 'dark',\r\n neutral,\r\n primary,\r\n secondary,\r\n success,\r\n text,\r\n warning,\r\n },\r\n\r\n shadows: [\r\n 'none',\r\n '0px 1px 2px rgba(0, 0, 0, 0.24)',\r\n '0px 1px 2px rgba(0, 0, 0, 0.24)',\r\n '0px 1px 4px rgba(0, 0, 0, 0.24)',\r\n '0px 1px 5px rgba(0, 0, 0, 0.24)',\r\n '0px 1px 6px rgba(0, 0, 0, 0.24)',\r\n '0px 2px 6px rgba(0, 0, 0, 0.24)',\r\n '0px 3px 6px rgba(0, 0, 0, 0.24)',\r\n '0px 4px 6px rgba(0, 0, 0, 0.24)',\r\n '0px 5px 12px rgba(0, 0, 0, 0.24)',\r\n '0px 5px 14px rgba(0, 0, 0, 0.24)',\r\n '0px 5px 15px rgba(0, 0, 0, 0.24)',\r\n '0px 6px 15px rgba(0, 0, 0, 0.24)',\r\n '0px 7px 15px rgba(0, 0, 0, 0.24)',\r\n '0px 8px 15px rgba(0, 0, 0, 0.24)',\r\n '0px 9px 15px rgba(0, 0, 0, 0.24)',\r\n '0px 10px 15px rgba(0, 0, 0, 0.24)',\r\n '0px 12px 22px -8px rgba(0, 0, 0, 0.24)',\r\n '0px 13px 22px -8px rgba(0, 0, 0, 0.24)',\r\n '0px 14px 24px -8px rgba(0, 0, 0, 0.24)',\r\n '0px 20px 25px rgba(0, 0, 0, 0.24)',\r\n '0px 25px 50px rgba(0, 0, 0, 0.24)',\r\n '0px 25px 50px rgba(0, 0, 0, 0.24)',\r\n '0px 25px 50px rgba(0, 0, 0, 0.24)',\r\n '0px 25px 50px rgba(0, 0, 0, 0.24)',\r\n ],\r\n};\r\n","import type { Theme } from '@mui/material';\r\nimport { createTheme as createMuiTheme, responsiveFontSizes } from '@mui/material/styles';\r\nimport { baseThemeOptions } from './base-theme-options';\r\nimport { lightThemeOptions } from './light-theme-options';\r\nimport { darkThemeOptions } from './dark-theme-options';\r\n\r\ninterface Neutral {\r\n 100: string;\r\n 200: string;\r\n 300: string;\r\n 400: string;\r\n 500: string;\r\n 600: string;\r\n 700: string;\r\n 800: string;\r\n 900: string;\r\n}\r\n\r\ndeclare module '@mui/material/styles' {\r\n interface Palette {\r\n neutral?: Neutral;\r\n }\r\n\r\n interface PaletteOptions {\r\n neutral?: Neutral;\r\n }\r\n}\r\n\r\ninterface ThemeConfig {\r\n responsiveFontSizes?: boolean;\r\n mode: 'light' | 'dark';\r\n}\r\n\r\nexport const createTheme = (config: ThemeConfig): Theme => {\r\n let theme = createMuiTheme(baseThemeOptions, config.mode === 'dark' ? darkThemeOptions : lightThemeOptions);\r\n\r\n if (config.responsiveFontSizes) {\r\n theme = responsiveFontSizes(theme);\r\n }\r\n\r\n return theme;\r\n};\r\n\r\nexport const footerStyle = {\r\n background: '#272938',\r\n text: '#7286a0',\r\n bottomBackground: '#1f2131',\r\n};\r\n","/** @jsxImportSource @emotion/react */\r\nimport { css } from '@emotion/react';\r\nimport { Box, Container, Grid } from '@mui/material';\r\nimport FacebookIcon from '@mui/icons-material/Facebook';\r\nimport TwitterIcon from '@mui/icons-material/Twitter';\r\nimport YouTubeIcon from '@mui/icons-material/YouTube';\r\nimport { footerStyle } from '../theme';\r\nimport { settings } from '../settings';\r\n\r\nexport const Footer = () => (\r\n <>\r\n <Box\r\n sx={{\r\n backgroundColor: footerStyle.background,\r\n color: footerStyle.text,\r\n fontFamily: 'Roboto',\r\n lineHeight: '24px',\r\n padding: '40px 0',\r\n a: {\r\n textDecoration: 'none',\r\n color: '#7286a0',\r\n },\r\n }}\r\n >\r\n <Container maxWidth=\"lg\">\r\n <Grid container spacing={5}>\r\n <Grid item xs={12} sm={4} md={4} sx={{}}>\r\n <h3\r\n css={css`\r\n padding-bottom: 0.5em;\r\n `}\r\n >\r\n About\r\n </h3>\r\n <p>\r\n LSoft Technologies Inc. is a privately owned North American software company. Our goal is to\r\n create world’s leading data recovery, security and backup solutions by providing rock solid\r\n performance, innovation, and unparalleled customer service.\r\n </p>\r\n </Grid>\r\n <Grid item xs={12} sm={4} md={4} sx={{}}>\r\n <h3\r\n css={css`\r\n padding-bottom: 0.5em;\r\n `}\r\n >\r\n Contact Us\r\n </h3>\r\n <h4>{settings.email}</h4>\r\n <p>\r\n {settings.phone1}\r\n <br />\r\n {settings.phone2}\r\n <br />\r\n {settings.hours}\r\n </p>\r\n <p>Fax: {settings.fax}</p>\r\n <div\r\n css={css`\r\n a {\r\n padding-right: 20px;\r\n }\r\n `}\r\n >\r\n <a href={settings.socials.facebook}>\r\n <FacebookIcon />\r\n </a>\r\n <a href={settings.socials.twitter}>\r\n <TwitterIcon />\r\n </a>\r\n <a href={settings.socials.youtube}>\r\n <YouTubeIcon />\r\n </a>\r\n </div>\r\n </Grid>\r\n <Grid item>\r\n <h3\r\n css={css`\r\n padding-bottom: 0.5em;\r\n `}\r\n >\r\n Address\r\n </h3>\r\n <h4>LSoft Technologies Inc.</h4>\r\n <p>\r\n {settings.address.map((line, idx) => (\r\n <span key={idx}>\r\n {line}\r\n <br />\r\n </span>\r\n ))}\r\n </p>\r\n </Grid>\r\n </Grid>\r\n </Container>\r\n </Box>\r\n <Box\r\n sx={{\r\n backgroundColor: footerStyle.bottomBackground,\r\n color: footerStyle.text,\r\n }}\r\n >\r\n <Container maxWidth=\"lg\">\r\n <p\r\n css={css`\r\n margin: 0;\r\n padding: 16px;\r\n `}\r\n >\r\n © {settings.year} LSoft Technologies Inc. All Rights Reserved.\r\n </p>\r\n </Container>\r\n </Box>\r\n </>\r\n);\r\n","import { useState } from 'react';\r\nimport type { FC, ReactNode } from 'react';\r\nimport { Outlet } from 'react-router-dom';\r\nimport { Box } from '@mui/material';\r\nimport { experimentalStyled } from '@mui/material/styles';\r\nimport { MainNavbar } from './MainNavbar';\r\nimport { MainSidebar } from './MainSidebar';\r\nimport { Footer } from './Footer';\r\n\r\ninterface MainLayoutProps {\r\n children?: ReactNode;\r\n}\r\n\r\nconst MainLayoutRoot = experimentalStyled('div')(({ theme }) => ({\r\n backgroundColor: theme.palette.background.default,\r\n paddingTop: 64,\r\n}));\r\n\r\nexport const MainLayout: FC<MainLayoutProps> = ({ children }) => {\r\n const [isSidebarMobileOpen, setIsSidebarMobileOpen] = useState<boolean>(false);\r\n\r\n return (\r\n <MainLayoutRoot>\r\n <MainNavbar showMenu={true} onSidebarMobileOpen={(): void => setIsSidebarMobileOpen(true)} />\r\n <MainSidebar onMobileClose={(): void => setIsSidebarMobileOpen(false)} openMobile={isSidebarMobileOpen} />\r\n <Box sx={{ minHeight: '80vh' }}>{children || <Outlet />}</Box>\r\n <Footer />\r\n </MainLayoutRoot>\r\n );\r\n};\r\n","import type { FC, ReactNode } from 'react';\r\nimport { Outlet } from 'react-router-dom';\r\nimport { Box } from '@mui/material';\r\nimport { experimentalStyled } from '@mui/material/styles';\r\nimport { MainNavbar } from './MainNavbar';\r\nimport { Footer } from './Footer';\r\n\r\ninterface PublicLayoutProps {\r\n children?: ReactNode;\r\n customTitle?: string;\r\n}\r\n\r\nconst PublicLayoutRoot = experimentalStyled('div')(({ theme }) => ({\r\n backgroundColor: theme.palette.background.default,\r\n paddingTop: 64,\r\n}));\r\n\r\nexport const PublicLayout: FC<PublicLayoutProps> = ({ children, customTitle }) => {\r\n return (\r\n <PublicLayoutRoot>\r\n <MainNavbar showMenu={false} customTitle={customTitle} />\r\n <Box sx={{ minHeight: '80vh' }}>{children || <Outlet />}</Box>\r\n <Footer />\r\n </PublicLayoutRoot>\r\n );\r\n};\r\n","import type { FC } from 'react';\r\nimport { Link as RouterLink, useNavigate } from 'react-router-dom';\r\nimport { AppBar, Box, Button, Divider, Hidden, IconButton, Toolbar, Typography, Stack, Avatar } from '@mui/material';\r\nimport MenuIcon from '@mui/icons-material/Menu';\r\nimport PersonIcon from '@mui/icons-material/Person';\r\nimport { Theme } from '@mui/material/styles';\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { Logo } from '../Logo';\r\nimport { accountService } from '../../account.service';\r\nimport { getInitials } from '../../utils/get-initials';\r\nimport { useTheme } from '@mui/styles';\r\n\r\ninterface ProfileNavbarProps {\r\n onSidebarMobileOpen?: () => void;\r\n isReseller: boolean;\r\n}\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n homeLink: {\r\n textDecoration: 'none',\r\n },\r\n })\r\n);\r\n\r\nexport const ProfileNavbar: FC<ProfileNavbarProps> = ({ onSidebarMobileOpen, isReseller }) => {\r\n const classes = useStyles();\r\n const navigate = useNavigate();\r\n const theme = useTheme();\r\n const account = accountService.getAccount();\r\n\r\n const logout = () => {\r\n accountService.logout();\r\n navigate('/');\r\n };\r\n\r\n return (\r\n <AppBar\r\n elevation={0}\r\n sx={{\r\n backgroundColor: 'primary',\r\n color: 'text.secondary',\r\n }}\r\n >\r\n <Toolbar sx={{ minHeight: 64 }}>\r\n <Hidden lgUp>\r\n <IconButton\r\n sx={{ color: theme.palette.primary.contrastText }}\r\n onClick={onSidebarMobileOpen}\r\n size=\"large\"\r\n >\r\n <MenuIcon fontSize=\"small\" />\r\n </IconButton>\r\n </Hidden>\r\n <Hidden lgDown>\r\n <RouterLink to=\"/\" className={classes.homeLink}>\r\n <Stack direction=\"row\" spacing={1} sx={{ textDecoration: 'none' }}>\r\n <Logo />\r\n <Typography\r\n sx={{\r\n caretColor: 'rgba(0,0,0,0)',\r\n color: theme.palette.primary.contrastText,\r\n whiteSpace: 'nowrap',\r\n textDecoration: 'none',\r\n lineHeight: '40px',\r\n }}\r\n variant=\"h6\"\r\n >\r\n LSoft Technologies\r\n </Typography>\r\n <Typography\r\n sx={{\r\n color: 'white',\r\n whiteSpace: 'nowrap',\r\n fontWeight: 100,\r\n lineHeight: '40px',\r\n }}\r\n variant=\"h6\"\r\n >\r\n | Customer Support\r\n </Typography>\r\n </Stack>\r\n </RouterLink>\r\n </Hidden>\r\n <Box sx={{ flexGrow: 1 }} />\r\n {account && (\r\n <Avatar\r\n sx={{\r\n height: 42,\r\n mr: 2,\r\n width: 42,\r\n color: theme.palette.primary.main,\r\n bgcolor: 'white',\r\n }}\r\n >\r\n {getInitials(`${account.name}`)}\r\n </Avatar>\r\n )}\r\n {account && (\r\n <Typography sx={{ color: theme.palette.primary.contrastText, fontWeight: 300 }}>\r\n {isReseller ? 'Reseller ID' : 'Client ID'}: {account.id}\r\n </Typography>\r\n )}\r\n <Divider\r\n orientation=\"vertical\"\r\n sx={{\r\n height: 32,\r\n mx: 2,\r\n backgroundColor: theme.palette.primary.contrastText,\r\n }}\r\n />\r\n <Button\r\n sx={{\r\n color: theme.palette.primary.contrastText,\r\n marginLeft: 1,\r\n }}\r\n startIcon={<PersonIcon />}\r\n onClick={logout}\r\n >\r\n Sign Out\r\n </Button>\r\n </Toolbar>\r\n </AppBar>\r\n );\r\n};\r\n","import { createSvgIcon } from '@mui/material/utils';\r\n\r\nconst ChevronDown = createSvgIcon(\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\r\n <path\r\n fillRule=\"evenodd\"\r\n d=\"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z\"\r\n clipRule=\"evenodd\"\r\n />\r\n </svg>,\r\n 'ChevronDown'\r\n);\r\n\r\nexport default ChevronDown;\r\n","import { createSvgIcon } from '@mui/material/utils';\r\n\r\nconst ChevronRight = createSvgIcon(\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\r\n <path\r\n fillRule=\"evenodd\"\r\n d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"\r\n clipRule=\"evenodd\"\r\n />\r\n </svg>,\r\n 'ChevronRight'\r\n);\r\n\r\nexport default ChevronRight;\r\n","import { useState } from 'react';\r\nimport type { FC, ReactNode } from 'react';\r\nimport { NavLink as RouterLink } from 'react-router-dom';\r\nimport PropTypes from 'prop-types';\r\nimport { Box, Button, Collapse, ListItem } from '@mui/material';\r\nimport type { ListItemProps } from '@mui/material';\r\nimport ChevronDownIcon from '../icons/ChevronDown';\r\nimport ChevronRightIcon from '../icons/ChevronRight';\r\n\r\ninterface NavItemProps extends ListItemProps {\r\n active?: boolean;\r\n children?: ReactNode;\r\n depth: number;\r\n icon?: ReactNode;\r\n info?: ReactNode;\r\n open?: boolean;\r\n path?: string;\r\n title: string;\r\n}\r\n\r\nconst NavItem: FC<NavItemProps> = (props) => {\r\n const { active, children, depth, icon, info, open: openProp, path, title, ...other } = props;\r\n const [open, setOpen] = useState<boolean>(openProp);\r\n\r\n const handleToggle = (): void => {\r\n setOpen((prevOpen) => !prevOpen);\r\n };\r\n\r\n let paddingLeft = 16;\r\n\r\n if (depth > 0) {\r\n paddingLeft = 32 + 8 * depth;\r\n }\r\n\r\n // Branch\r\n if (children) {\r\n return (\r\n <ListItem\r\n disableGutters\r\n sx={{\r\n display: 'block',\r\n py: 0,\r\n }}\r\n {...other}\r\n >\r\n <Button\r\n endIcon={!open ? <ChevronRightIcon fontSize=\"small\" /> : <ChevronDownIcon fontSize=\"small\" />}\r\n onClick={handleToggle}\r\n startIcon={icon}\r\n sx={{\r\n color: 'text.secondary',\r\n fontWeight: 'fontWeightMedium',\r\n justifyContent: 'flex-start',\r\n pl: `${paddingLeft}px`,\r\n pr: '8px',\r\n py: '12px',\r\n textAlign: 'left',\r\n textTransform: 'none',\r\n width: '100%',\r\n }}\r\n variant=\"text\"\r\n >\r\n <Box sx={{ flexGrow: 1 }}>{title}</Box>\r\n {info}\r\n </Button>\r\n <Collapse in={open}>{children}</Collapse>\r\n </ListItem>\r\n );\r\n }\r\n\r\n // Leaf\r\n return (\r\n <ListItem\r\n disableGutters\r\n sx={{\r\n display: 'flex',\r\n py: 0,\r\n }}\r\n >\r\n <Button\r\n component={path && RouterLink}\r\n startIcon={icon}\r\n sx={{\r\n color: 'text.secondary',\r\n fontWeight: 'fontWeightMedium',\r\n justifyContent: 'flex-start',\r\n textAlign: 'left',\r\n pl: `${paddingLeft}px`,\r\n pr: '8px',\r\n py: '12px',\r\n textTransform: 'none',\r\n width: '100%',\r\n ...(active && {\r\n color: 'primary.main',\r\n fontWeight: 'fontWeightBold',\r\n '& svg': {\r\n color: 'primary.main',\r\n },\r\n }),\r\n }}\r\n variant=\"text\"\r\n to={path}\r\n >\r\n <Box sx={{ flexGrow: 1 }}>{title}</Box>\r\n {info}\r\n </Button>\r\n </ListItem>\r\n );\r\n};\r\n\r\nNavItem.propTypes = {\r\n active: PropTypes.bool,\r\n children: PropTypes.node,\r\n depth: PropTypes.number.isRequired,\r\n icon: PropTypes.node,\r\n info: PropTypes.node,\r\n open: PropTypes.bool,\r\n path: PropTypes.string,\r\n title: PropTypes.string.isRequired,\r\n};\r\n\r\nNavItem.defaultProps = {\r\n active: false,\r\n open: false,\r\n};\r\n\r\nexport default NavItem;\r\n","import type { FC, ReactNode } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { matchPath } from 'react-router-dom';\r\nimport { List, ListSubheader } from '@mui/material';\r\nimport type { ListProps } from '@mui/material';\r\nimport NavItem from './NavItem';\r\n\r\ninterface Item {\r\n path?: string;\r\n icon?: ReactNode;\r\n info?: ReactNode;\r\n children?: Item[];\r\n title: string;\r\n}\r\n\r\ninterface NavSectionProps extends ListProps {\r\n items: Item[];\r\n pathname: string;\r\n title: string;\r\n}\r\n\r\nconst renderNavItems = ({\r\n depth = 0,\r\n items,\r\n pathname,\r\n}: {\r\n items: Item[];\r\n pathname: string;\r\n depth?: number;\r\n}): JSX.Element => (\r\n <List disablePadding>\r\n {items.reduce(\r\n // eslint-disable-next-line @typescript-eslint/no-use-before-define, no-use-before-define\r\n (acc, item) =>\r\n reduceChildRoutes({\r\n acc,\r\n item,\r\n pathname,\r\n depth,\r\n }),\r\n []\r\n )}\r\n </List>\r\n);\r\n\r\nconst reduceChildRoutes = ({\r\n acc,\r\n pathname,\r\n item,\r\n depth,\r\n}: {\r\n acc: JSX.Element[];\r\n pathname: string;\r\n item: Item;\r\n depth: number;\r\n}): Array<JSX.Element> => {\r\n const key = `${item.title}-${depth}`;\r\n const exactMatch = item.path\r\n ? !!matchPath(\r\n {\r\n path: item.path,\r\n end: true,\r\n },\r\n pathname\r\n )\r\n : false;\r\n\r\n if (item.children) {\r\n const partialMatch = item.path\r\n ? !!matchPath(\r\n {\r\n path: item.path,\r\n end: false,\r\n },\r\n pathname\r\n )\r\n : false;\r\n\r\n acc.push(\r\n <NavItem\r\n active={partialMatch}\r\n depth={depth}\r\n icon={item.icon}\r\n info={item.info}\r\n key={key}\r\n open={partialMatch}\r\n path={item.path}\r\n title={item.title}\r\n >\r\n {renderNavItems({\r\n depth: depth + 1,\r\n items: item.children,\r\n pathname,\r\n })}\r\n </NavItem>\r\n );\r\n } else {\r\n acc.push(\r\n <NavItem\r\n active={exactMatch}\r\n depth={depth}\r\n icon={item.icon}\r\n info={item.info}\r\n key={key}\r\n path={item.path}\r\n title={item.title}\r\n />\r\n );\r\n }\r\n\r\n return acc;\r\n};\r\n\r\nconst NavSection: FC<NavSectionProps> = (props) => {\r\n const { items, pathname, title, ...other } = props;\r\n\r\n return (\r\n <List\r\n subheader={\r\n <ListSubheader\r\n disableGutters\r\n disableSticky\r\n sx={{\r\n color: 'text.primary',\r\n fontSize: '0.75rem',\r\n lineHeight: 2.5,\r\n fontWeight: 700,\r\n textTransform: 'uppercase',\r\n }}\r\n >\r\n {title}\r\n </ListSubheader>\r\n }\r\n {...other}\r\n >\r\n {renderNavItems({\r\n items,\r\n pathname,\r\n })}\r\n </List>\r\n );\r\n};\r\n\r\nNavSection.propTypes = {\r\n items: PropTypes.array,\r\n pathname: PropTypes.string,\r\n title: PropTypes.string,\r\n};\r\n\r\nexport default NavSection;\r\n","import { useEffect } from 'react';\r\nimport type { FC } from 'react';\r\nimport { Link as RouterLink, useLocation } from 'react-router-dom';\r\nimport { Box, Drawer, Hidden } from '@mui/material';\r\nimport Scrollbar from '../Scrollbar';\r\nimport NavSection from '../NavSection';\r\nimport { Logo } from '../Logo';\r\nimport ReceiptIcon from '@mui/icons-material/Receipt';\r\nimport AccountCircleIcon from '@mui/icons-material/AccountCircle';\r\nimport UpgradeIcon from '@mui/icons-material/Upgrade';\r\nimport LocalOfferIcon from '@mui/icons-material/LocalOffer';\r\nimport HelpCenterIcon from '@mui/icons-material/HelpCenter';\r\nimport AddCircleIcon from '@mui/icons-material/AddCircle';\r\n\r\ninterface ProfileSidebarProps {\r\n onMobileClose: () => void;\r\n openMobile: boolean;\r\n isReseller: boolean;\r\n}\r\n\r\nconst clientSections = [\r\n {\r\n title: 'Client Profile',\r\n items: [\r\n {\r\n title: 'Orders',\r\n path: '/client/orders',\r\n icon: <ReceiptIcon fontSize=\"small\" />,\r\n },\r\n {\r\n title: 'Profile',\r\n path: '/client/profile',\r\n icon: <AccountCircleIcon fontSize=\"small\" />,\r\n },\r\n {\r\n title: 'Upgrades',\r\n path: '/client/upgrades',\r\n icon: <UpgradeIcon fontSize=\"small\" />,\r\n },\r\n {\r\n title: 'Discounts',\r\n path: '/client/discounts',\r\n icon: <LocalOfferIcon fontSize=\"small\" />,\r\n },\r\n {\r\n title: 'Support',\r\n path: '/client/support',\r\n icon: <HelpCenterIcon fontSize=\"small\" />,\r\n },\r\n ],\r\n },\r\n];\r\n\r\nconst resellerSections = [\r\n {\r\n title: 'Reseller Profile',\r\n items: [\r\n {\r\n title: 'New Order',\r\n path: '/reseller/orders/new',\r\n icon: <AddCircleIcon fontSize=\"small\" />,\r\n },\r\n {\r\n title: 'Orders',\r\n path: '/reseller/orders',\r\n icon: <ReceiptIcon fontSize=\"small\" />,\r\n },\r\n {\r\n title: 'Profile',\r\n path: '/reseller/profile',\r\n icon: <AccountCircleIcon fontSize=\"small\" />,\r\n },\r\n {\r\n title: 'Support',\r\n path: '/reseller/support',\r\n icon: <HelpCenterIcon fontSize=\"small\" />,\r\n },\r\n ],\r\n },\r\n];\r\n\r\nexport const ProfileSidebar: FC<ProfileSidebarProps> = (props) => {\r\n const { onMobileClose, openMobile, isReseller } = props;\r\n const location = useLocation();\r\n const sections = isReseller ? resellerSections : clientSections;\r\n\r\n useEffect(() => {\r\n if (openMobile && onMobileClose) {\r\n onMobileClose();\r\n }\r\n }, [location.pathname]);\r\n\r\n const content = (\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: '100%',\r\n }}\r\n >\r\n <Scrollbar options={{ suppressScrollX: true }}>\r\n <Hidden lgUp>\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n justifyContent: 'center',\r\n p: 2,\r\n }}\r\n >\r\n <RouterLink to=\"/\">\r\n <Logo />\r\n </RouterLink>\r\n </Box>\r\n </Hidden>\r\n <Box sx={{ p: 2 }}>\r\n {sections.map((section) => (\r\n <NavSection\r\n key={section.title}\r\n pathname={location.pathname}\r\n sx={{\r\n '& + &': {\r\n mt: 3,\r\n },\r\n }}\r\n {...section}\r\n />\r\n ))}\r\n </Box>\r\n </Scrollbar>\r\n </Box>\r\n );\r\n\r\n return (\r\n <>\r\n <Drawer\r\n anchor=\"left\"\r\n onClose={onMobileClose}\r\n open={openMobile}\r\n PaperProps={{\r\n sx: {\r\n backgroundColor: 'background.paper',\r\n width: 280,\r\n display: { xs: 'block', lg: 'none' },\r\n },\r\n }}\r\n variant=\"temporary\"\r\n >\r\n {content}\r\n </Drawer>\r\n <Drawer\r\n anchor=\"left\"\r\n open\r\n PaperProps={{\r\n sx: {\r\n backgroundColor: 'background.paper',\r\n height: 'calc(100% - 64px) !important',\r\n top: '64px !Important',\r\n width: 280,\r\n display: { xs: 'none', lg: 'block' },\r\n },\r\n }}\r\n variant=\"persistent\"\r\n >\r\n {content}\r\n </Drawer>\r\n </>\r\n );\r\n};\r\n","import { useState } from 'react';\r\nimport type { FC, ReactNode } from 'react';\r\nimport { Outlet } from 'react-router-dom';\r\nimport { experimentalStyled } from '@mui/material/styles';\r\nimport { ProfileNavbar } from './ProfileNavbar';\r\nimport { ProfileSidebar } from './ProfileSidebar';\r\n\r\ninterface ProfileLayoutProps {\r\n children?: ReactNode;\r\n isReseller: boolean;\r\n}\r\n\r\nconst ProfileLayoutRoot = experimentalStyled('div')(({ theme }) => ({\r\n backgroundColor: theme.palette.background.default,\r\n display: 'flex',\r\n height: '100%',\r\n overflow: 'hidden',\r\n width: '100%',\r\n}));\r\n\r\nconst ProfileLayoutWrapper = experimentalStyled('div')(({ theme }) => ({\r\n display: 'flex',\r\n flex: '1 1 auto',\r\n overflow: 'hidden',\r\n paddingTop: '64px',\r\n [theme.breakpoints.up('lg')]: {\r\n paddingLeft: '280px',\r\n },\r\n}));\r\n\r\nconst ProfileLayoutContainer = experimentalStyled('div')({\r\n display: 'flex',\r\n flex: '1 1 auto',\r\n overflow: 'hidden',\r\n});\r\n\r\nconst ProfileLayoutContent = experimentalStyled('div')({\r\n flex: '1 1 auto',\r\n height: '100%',\r\n overflow: 'auto',\r\n position: 'relative',\r\n WebkitOverflowScrolling: 'touch',\r\n});\r\n\r\nexport const ProfileLayout: FC<ProfileLayoutProps> = (props) => {\r\n const [isSidebarMobileOpen, setIsSidebarMobileOpen] = useState<boolean>(false);\r\n const { isReseller } = props;\r\n\r\n return (\r\n <ProfileLayoutRoot>\r\n <ProfileNavbar onSidebarMobileOpen={(): void => setIsSidebarMobileOpen(true)} isReseller={isReseller} />\r\n <ProfileSidebar\r\n onMobileClose={(): void => setIsSidebarMobileOpen(false)}\r\n openMobile={isSidebarMobileOpen}\r\n isReseller={isReseller}\r\n />\r\n <ProfileLayoutWrapper>\r\n <ProfileLayoutContainer>\r\n <ProfileLayoutContent>\r\n <Outlet />\r\n </ProfileLayoutContent>\r\n </ProfileLayoutContainer>\r\n </ProfileLayoutWrapper>\r\n </ProfileLayoutRoot>\r\n );\r\n};\r\n","import { http } from './http';\r\nimport axios from 'axios';\r\nimport { webAPIUrl } from './AppSettings';\r\n\r\n// #region Category\r\nexport interface CategoryData {\r\n categoryId: number;\r\n name: string;\r\n icon: string;\r\n description: string;\r\n questionCount: number;\r\n}\r\n\r\nexport interface CategoryPostRequest {\r\n name: string;\r\n icon: string;\r\n description: string;\r\n}\r\n\r\nexport const getCategories = async (): Promise<CategoryData[]> => {\r\n const result = await http<CategoryData[]>({\r\n path: '/categories',\r\n });\r\n if (result.ok && result.body) {\r\n return result.body;\r\n } else {\r\n return [];\r\n }\r\n};\r\n\r\nexport const getCategoriesWithCounters = async (): Promise<CategoryData[]> => {\r\n const result = await http<CategoryData[]>({\r\n path: '/categories?counters=1',\r\n });\r\n if (result.ok && result.body) {\r\n return result.body;\r\n } else {\r\n return [];\r\n }\r\n};\r\n\r\nexport const getCategory = async (categoryId: number): Promise<CategoryData | null> => {\r\n const result = await http<CategoryData>({\r\n path: `/categories/${categoryId}`,\r\n });\r\n if (result.ok && result.body) {\r\n return result.body;\r\n } else {\r\n return null;\r\n }\r\n};\r\n\r\nexport const postCategory = async (category: CategoryPostRequest): Promise<CategoryData | undefined> => {\r\n const result = await http<CategoryData, CategoryPostRequest>({\r\n path: `/categories`,\r\n method: 'POST',\r\n body: category,\r\n });\r\n if (result.ok && result.body) {\r\n return result.body;\r\n } else {\r\n return undefined;\r\n }\r\n};\r\n\r\nexport const putCategory = async (\r\n categoryId: number,\r\n category: CategoryPostRequest\r\n): Promise<CategoryData | undefined> => {\r\n const result = await http<CategoryData, CategoryPostRequest>({\r\n path: `/categories/${categoryId}`,\r\n method: 'PUT',\r\n body: category,\r\n });\r\n if (result.ok && result.body) {\r\n return result.body;\r\n } else {\r\n return undefined;\r\n }\r\n};\r\n\r\nexport const deleteCategory = async (categoryId: number): Promise<boolean> => {\r\n const result = await http<any>({\r\n path: `/categories/${categoryId}`,\r\n method: 'DELETE',\r\n });\r\n return result.ok;\r\n};\r\n\r\n// #endregion\r\n\r\n//#region Question\r\n\r\nexport interface QuestionPostRequest {\r\n categoryId: number;\r\n title: string;\r\n content: string;\r\n labels: string;\r\n isPromoted: boolean;\r\n isPublic: boolean;\r\n isPublished: boolean;\r\n isArchived: boolean;\r\n userId: number;\r\n}\r\n\r\nexport interface QuestionDataResponse {\r\n questionId: number;\r\n categoryId: number;\r\n categoryName: string;\r\n title: string;\r\n labels: string;\r\n updated: string;\r\n content: string;\r\n isPublic: boolean;\r\n isPublished: boolean;\r\n isArchived: boolean;\r\n isPromoted: boolean;\r\n}\r\n\r\nexport interface QuestionData {\r\n questionId: number;\r\n categoryId: number;\r\n categoryName: string;\r\n title: string;\r\n labels: string;\r\n updated: Date;\r\n content: string;\r\n isPublic: boolean;\r\n isPublished: boolean;\r\n isArchived: boolean;\r\n isPromoted: boolean;\r\n}\r\n\r\nconst mapQuestionData = (question: QuestionDataResponse): QuestionData => ({\r\n ...question,\r\n updated: new Date(question.updated),\r\n});\r\n\r\nexport const getRecentQuestions = async (): Promise<QuestionData[]> => {\r\n const result = await http<QuestionDataResponse[]>({\r\n path: '/questions/recent',\r\n });\r\n if (result.ok && result.body) {\r\n return result.body.map(mapQuestionData);\r\n } else {\r\n return [];\r\n }\r\n};\r\n\r\nexport const getCategoryQuestions = async (categoryId: number): Promise<QuestionData[]> => {\r\n const result = await http<QuestionDataResponse[]>({\r\n path: `/questions?category=${categoryId}`,\r\n });\r\n if (result.ok && result.body) {\r\n return result.body.map(mapQuestionData);\r\n } else {\r\n return [];\r\n }\r\n};\r\n\r\nexport const getQuestion = async (questionId: number): Promise<QuestionData | null> => {\r\n const result = await http<QuestionDataResponse>({\r\n path: `/questions/${questionId}`,\r\n });\r\n if (result.ok && result.body) {\r\n return mapQuestionData(result.body);\r\n } else {\r\n return null;\r\n }\r\n};\r\n\r\nexport const getQuestionForEdit = async (questionId: number): Promise<QuestionData | null> => {\r\n const result = await http<QuestionDataResponse>({\r\n path: `/questions/${questionId}/edit`,\r\n });\r\n if (result.ok && result.body) {\r\n return mapQuestionData(result.body);\r\n } else {\r\n return null;\r\n }\r\n};\r\n\r\nexport const searchQuestions = async (query: string): Promise<QuestionData[]> => {\r\n const result = await http<QuestionDataResponse[]>({\r\n path: `/questions?search=${query}`,\r\n });\r\n if (result.ok && result.body) {\r\n return result.body.map(mapQuestionData);\r\n } else {\r\n return [];\r\n }\r\n};\r\n\r\nexport const getQuestionsWithFilter = async ({ published = null, archived = null, search = null } = {}): Promise<\r\n QuestionData[]\r\n> => {\r\n const result = await http<QuestionDataResponse[]>({\r\n path: `/questions/filter?published=${published != null ? (published ? 1 : 0) : ''}&archived=${\r\n archived != null ? (archived ? 1 : 0) : ''\r\n }&search=${search != null ? search : ''}`,\r\n });\r\n if (result.ok && result.body) {\r\n return result.body.map(mapQuestionData);\r\n } else {\r\n return [];\r\n }\r\n};\r\n\r\nexport const postQuestion = async (question: QuestionPostRequest): Promise<QuestionData | undefined> => {\r\n const result = await http<QuestionDataResponse, QuestionPostRequest>({\r\n path: `/questions`,\r\n method: 'POST',\r\n body: question,\r\n });\r\n if (result.ok && result.body) {\r\n return mapQuestionData(result.body);\r\n } else {\r\n return undefined;\r\n }\r\n};\r\n\r\nexport const putQuestion = async (\r\n questionId: number,\r\n question: QuestionPostRequest\r\n): Promise<QuestionData | undefined> => {\r\n const result = await http<QuestionDataResponse, QuestionPostRequest>({\r\n path: `/questions/${questionId}`,\r\n method: 'PUT',\r\n body: question,\r\n });\r\n if (result.ok && result.body) {\r\n return mapQuestionData(result.body);\r\n } else {\r\n return undefined;\r\n }\r\n};\r\n\r\nexport const deleteQuestion = async (questionId: number): Promise<boolean> => {\r\n const result = await http<any>({\r\n path: `/questions/${questionId}`,\r\n method: 'DELETE',\r\n });\r\n return result.ok;\r\n};\r\n\r\n//#endregion\r\n\r\n//#region Login\r\n\r\nexport interface LoginRequest {\r\n email: string;\r\n password: string;\r\n}\r\nexport interface LoginResponse {\r\n token: string;\r\n}\r\n\r\nexport const login = async (credentials: LoginRequest): Promise<boolean> => {\r\n const result = await http<LoginResponse, LoginRequest>({\r\n path: '/accounts/login',\r\n method: 'POST',\r\n body: credentials,\r\n });\r\n if (result.ok) {\r\n const { token } = result.body;\r\n localStorage.setItem('jwt', token);\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n};\r\n\r\n//#endregion\r\n\r\n//#region Attachment\r\n\r\nexport interface AttachmentData {\r\n attachmentId: number;\r\n fileName: string;\r\n}\r\n\r\nexport interface AttachmentList {\r\n attachments: string;\r\n}\r\n\r\nexport const getAttachments = async (questionId: number): Promise<AttachmentData[]> => {\r\n const result = await http<AttachmentData[]>({\r\n path: `/attachments?question=${questionId}`,\r\n });\r\n if (result.ok && result.body) {\r\n return result.body;\r\n } else {\r\n return [];\r\n }\r\n};\r\n\r\nexport const addAttachments = async (questionId: number, attachments: AttachmentList): Promise<boolean> => {\r\n const result = await http<any, AttachmentList>({\r\n path: `/attachments/${questionId}/add`,\r\n method: 'POST',\r\n body: attachments,\r\n });\r\n return result.ok;\r\n};\r\n\r\nexport const removeAttachments = async (attachments: AttachmentList): Promise<boolean> => {\r\n const result = await http<any, AttachmentList>({\r\n path: `/attachments`,\r\n method: 'POST',\r\n body: attachments,\r\n });\r\n return result.ok;\r\n};\r\n\r\nexport const uploadAttachment = async (file: File): Promise<AttachmentData | undefined> => {\r\n const formData = new FormData();\r\n formData.append('File', file);\r\n\r\n let responseData: AttachmentData = undefined;\r\n await axios\r\n .post(`${webAPIUrl}/attachments`, formData, {\r\n headers: { 'Content-Type': 'multipart/form-data' },\r\n onUploadProgress: (progress) => {\r\n // let completed = Math.round((progress.loaded * 100) / progress.total);\r\n },\r\n })\r\n .then((response) => {\r\n responseData = response.data;\r\n })\r\n .catch((error) => {\r\n console.log(error);\r\n });\r\n\r\n return responseData;\r\n};\r\n\r\n//#endregion\r\n","export const gray1 = '#383737';\r\nexport const gray2 = '#5c5a5a';\r\nexport const gray3 = '#857c81';\r\nexport const gray4 = '#b9b9b9';\r\nexport const gray5 = '#e3e2e2';\r\nexport const gray6 = '#f7f8fa';\r\n\r\nexport const accent1 = '#dbb365';\r\nexport const accent2 = '#efd197';\r\n","/** @jsxImportSource @emotion/react */\r\nimport { css } from '@emotion/react';\r\nimport { gray2, gray3 } from '../Styles';\r\nimport { QuestionData } from '../data';\r\nimport { Link } from 'react-router-dom';\r\nimport Chip from '@mui/material/Chip';\r\nimport Stack from '@mui/material/Stack';\r\n\r\ninterface Props {\r\n data: QuestionData;\r\n showCategory: boolean;\r\n showLabels: boolean;\r\n}\r\nexport const Question = ({ data, showCategory, showLabels }: Props) => (\r\n <div\r\n css={css`\r\n padding: 10px 0px;\r\n `}\r\n >\r\n <div\r\n css={css`\r\n padding: 10px 0px;\r\n font-size: 19px;\r\n `}\r\n >\r\n <Link\r\n css={css`\r\n text-decoration: none;\r\n color: ${gray2};\r\n `}\r\n to={`/questions/${data.questionId}`}\r\n >\r\n {data.title}\r\n </Link>\r\n </div>\r\n {showLabels && data.labels.trim().length > 0 && (\r\n <div\r\n css={css`\r\n padding-bottom: 10px;\r\n font-size: 15px;\r\n color: ${gray2};\r\n `}\r\n >\r\n <Stack direction=\"row\" spacing={1}>\r\n {data.labels.split(',').map((label, idx) => {\r\n return <Chip key={idx} label={label.trim()} />;\r\n })}\r\n </Stack>\r\n </div>\r\n )}\r\n {showCategory && (\r\n <div\r\n css={css`\r\n padding-bottom: 10px;\r\n font-size: 15px;\r\n color: ${gray2};\r\n `}\r\n >\r\n <Link\r\n css={css`\r\n text-decoration: none;\r\n color: ${gray2};\r\n font-size: 16px;\r\n font-weight: 300;\r\n `}\r\n to={`/categories/${data.categoryId}`}\r\n >\r\n [ {data.categoryName} ]\r\n </Link>\r\n </div>\r\n )}\r\n <div\r\n css={css`\r\n font-size: 12px;\r\n font-style: italic;\r\n color: ${gray3};\r\n `}\r\n >\r\n {`Updated on ${data.updated.toLocaleDateString()} ${data.updated.toLocaleTimeString()}`}\r\n </div>\r\n </div>\r\n);\r\n","/** @jsxImportSource @emotion/react */\r\nimport { css } from '@emotion/react';\r\nimport { QuestionData } from '../data';\r\nimport { accent2, gray5 } from '../Styles';\r\nimport { Question } from './Question';\r\n\r\ninterface Props {\r\n data: QuestionData[];\r\n showCategory: boolean;\r\n showLabels: boolean;\r\n}\r\n\r\nexport const QuestionList = ({ data, showCategory, showLabels }: Props) => (\r\n <ul\r\n css={css`\r\n list-style: none;\r\n margin: 10px 10px 50px 10px;\r\n padding: 0 20px;\r\n background-color: #fff;\r\n border-bottom-left-radius: 4px;\r\n border-bottom-right-radius: 4px;\r\n border-top: 3px solid ${accent2};\r\n box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.16);\r\n `}\r\n >\r\n {data.map((question) => (\r\n <li\r\n key={question.questionId}\r\n css={css`\r\n border-top: 1px solid ${gray5};\r\n :first-of-type {\r\n border-top: none;\r\n }\r\n `}\r\n >\r\n <Question\r\n key={question.questionId}\r\n data={question}\r\n showCategory={showCategory}\r\n showLabels={showLabels}\r\n />\r\n </li>\r\n ))}\r\n </ul>\r\n);\r\n","import { Link } from 'react-router-dom';\r\nimport { CategoryData } from '../data';\r\n\r\nimport Card from '@mui/material/Card';\r\nimport CardActionArea from '@mui/material/CardActionArea';\r\nimport CardContent from '@mui/material/CardContent';\r\nimport CardMedia from '@mui/material/CardMedia';\r\nimport Typography from '@mui/material/Typography';\r\n\r\ninterface Props {\r\n data: CategoryData;\r\n}\r\n\r\nexport const CategoryCard = ({ data }: Props) => {\r\n return (\r\n <Card\r\n sx={{\r\n height: '100%',\r\n }}\r\n >\r\n <CardActionArea\r\n component={Link}\r\n to={`/categories/${data.categoryId}`}\r\n sx={{\r\n height: '100%',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n }}\r\n >\r\n <CardMedia\r\n component=\"img\"\r\n alt={data.name}\r\n src={`/static/categories/${data.icon}`}\r\n sx={{\r\n width: 60,\r\n height: 60,\r\n margin: '0 auto',\r\n pt: 1.5,\r\n }}\r\n />\r\n <CardContent sx={{ flex: 1 }}>\r\n <Typography gutterBottom variant=\"h5\" component=\"h2\" align=\"center\">\r\n {data.name}\r\n </Typography>\r\n <Typography variant=\"body2\" color=\"textSecondary\" component=\"p\" align=\"center\">\r\n {data.description}\r\n </Typography>\r\n </CardContent>\r\n </CardActionArea>\r\n </Card>\r\n );\r\n};\r\n","/** @jsxImportSource @emotion/react */\r\nimport { css } from '@emotion/react';\r\nimport Grid from '@mui/material/Grid';\r\nimport { CategoryData } from '../data';\r\nimport { CategoryCard } from './CategoryCard';\r\n\r\ninterface Props {\r\n data: CategoryData[];\r\n}\r\n\r\nexport const CategoryList = ({ data }: Props) => {\r\n return (\r\n <div\r\n css={css`\r\n margin: 30px;\r\n `}\r\n >\r\n <Grid container spacing={2}>\r\n {data.map((category) => (\r\n <Grid key={category.categoryId} item xs={6} sm={4}>\r\n <CategoryCard data={category} />\r\n </Grid>\r\n ))}\r\n </Grid>\r\n </div>\r\n );\r\n};\r\n","/** @jsxImportSource @emotion/react */\r\nimport { css } from '@emotion/react';\r\nimport React from 'react';\r\nimport { useSearchParams, useNavigate } from 'react-router-dom';\r\nimport { useForm, Controller } from 'react-hook-form';\r\nimport { Paper, TextField } from '@mui/material';\r\nimport SearchIcon from '@mui/icons-material/Search';\r\n// import CloseIcon from '@mui/icons-material/Close';\r\n\r\ntype FormData = {\r\n search: string;\r\n};\r\n\r\nexport const SearchButton = () => {\r\n const { handleSubmit, control } = useForm<FormData>();\r\n const [searchParams] = useSearchParams();\r\n const query = searchParams.get('query') || '';\r\n const navigate = useNavigate();\r\n\r\n const submitForm = ({ search }: FormData) => {\r\n navigate(`/search?query=${search}`);\r\n };\r\n\r\n return (\r\n <Paper\r\n css={css`\r\n position: relative;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n margin: 0 auto;\r\n padding: 2px 4px;\r\n display: flex;\r\n align-items: center;\r\n max-width: 500px;\r\n `}\r\n >\r\n <SearchIcon\r\n css={css`\r\n color: rgba(0, 0, 0, 0.54);\r\n padding: 0 10px;\r\n `}\r\n />\r\n <form onSubmit={handleSubmit(submitForm)}>\r\n <Controller\r\n name=\"search\"\r\n control={control}\r\n defaultValue={query}\r\n rules={{ required: 'Search criteria required' }}\r\n render={({ field: { onChange, value }, fieldState: { error } }) => (\r\n <TextField\r\n variant=\"standard\"\r\n value={value}\r\n onChange={onChange}\r\n error={!!error}\r\n helperText={error ? error.message : null}\r\n css={css`\r\n padding: 10px 0;\r\n width: 420px;\r\n `}\r\n />\r\n )}\r\n />\r\n </form>\r\n </Paper>\r\n );\r\n};\r\n","export default __webpack_public_path__ + \"static/media/search-bg.3c86ef97.png\";","import { useEffect } from 'react';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport { getRecentQuestions, getCategories } from '../data';\r\nimport {\r\n gettingCategoriesAction,\r\n gotCategoriesAction,\r\n gettingRecentlyAddedAction,\r\n gotRecentlyAddedAction,\r\n AppState,\r\n} from '../Store';\r\n\r\nimport { QuestionList } from '../components/QuestionList';\r\nimport { CategoryList } from '../components/CategoryList';\r\nimport { SearchButton } from '../components/SearchButton';\r\nimport { Title } from '../components/Title';\r\n\r\nimport searchBackground from '../images/search-bg.png';\r\nimport Container from '@mui/material/Container';\r\nimport Box from '@mui/material/Box';\r\nimport Typography from '@mui/material/Typography';\r\n\r\nexport const Home = () => {\r\n const dispatch = useDispatch();\r\n const loading = useSelector((state: AppState) => state.questions.loading);\r\n const categories = useSelector((state: AppState) => state.questions.categories);\r\n const questions = useSelector((state: AppState) => state.questions.recentlyAdded);\r\n\r\n useEffect(() => {\r\n const doGetCategories = async () => {\r\n dispatch(gettingCategoriesAction());\r\n const categories = await getCategories();\r\n dispatch(gotCategoriesAction(categories));\r\n };\r\n doGetCategories();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n const doGetRecentQuestions = async () => {\r\n dispatch(gettingRecentlyAddedAction());\r\n const questions = await getRecentQuestions();\r\n dispatch(gotRecentlyAddedAction(questions));\r\n };\r\n doGetRecentQuestions();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <>\r\n <Title title=\"Customer Support\" />\r\n <Box\r\n sx={{\r\n backgroundImage: `url(${searchBackground})`,\r\n backgroundPosition: 'center',\r\n backgroundSize: 'cover',\r\n height: 300,\r\n }}\r\n >\r\n <SearchButton />\r\n </Box>\r\n <Container maxWidth=\"lg\">\r\n {!loading && <CategoryList data={categories} />}\r\n <Typography variant=\"h5\" align=\"center\" sx={{ pt: 2 }}>\r\n Recent articles\r\n </Typography>\r\n {!loading && <QuestionList data={questions} showCategory={true} showLabels={false} />}\r\n </Container>\r\n </>\r\n );\r\n};\r\n","import { useEffect } from 'react';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport { useParams, useNavigate } from 'react-router-dom';\r\nimport { getCategories, getCategoryQuestions } from '../data';\r\nimport {\r\n gettingBrowsedAction,\r\n gotBrowsedAction,\r\n AppState,\r\n gettingCategoriesAction,\r\n gotCategoriesAction,\r\n} from '../Store';\r\n\r\nimport { Title } from '../components/Title';\r\nimport { QuestionList } from '../components/QuestionList';\r\n\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport { Container, Typography, Breadcrumbs, Link } from '@mui/material';\r\nimport HomeIcon from '@mui/icons-material/Home';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n link: {\r\n display: 'flex',\r\n cursor: 'pointer',\r\n },\r\n icon: {\r\n marginRight: theme.spacing(0.5),\r\n width: 20,\r\n height: 20,\r\n },\r\n })\r\n);\r\n\r\nexport const Category = () => {\r\n const classes = useStyles();\r\n\r\n const dispatch = useDispatch();\r\n const loading = useSelector((state: AppState) => state.questions.loading);\r\n const categories = useSelector((state: AppState) => state.questions.categories);\r\n const questions = useSelector((state: AppState) => state.questions.browsed);\r\n\r\n const { id } = useParams();\r\n const categoryId = parseInt(id);\r\n const category = categories.filter((category) => category.categoryId === categoryId)[0];\r\n\r\n const fetchQuestions = async () => {\r\n dispatch(gettingBrowsedAction());\r\n const fetchedQuestions = await getCategoryQuestions(categoryId);\r\n dispatch(gotBrowsedAction(fetchedQuestions));\r\n };\r\n\r\n const fetchCategories = async () => {\r\n dispatch(gettingCategoriesAction());\r\n const fetchedCategories = await getCategories();\r\n dispatch(gotCategoriesAction(fetchedCategories));\r\n };\r\n\r\n useEffect(() => {\r\n fetchQuestions();\r\n fetchCategories();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const navigate = useNavigate();\r\n\r\n return (\r\n <>\r\n {category && <Title title={category.name} />}\r\n\r\n <Container maxWidth=\"lg\">\r\n <Breadcrumbs\r\n aria-label=\"breadcrumb\"\r\n sx={{\r\n paddingTop: '20px',\r\n }}\r\n >\r\n <Link\r\n color=\"inherit\"\r\n onClick={() => {\r\n navigate('/');\r\n }}\r\n className={classes.link}\r\n >\r\n <HomeIcon className={classes.icon} />\r\n Home\r\n </Link>\r\n <Typography>{category && category.name}</Typography>\r\n </Breadcrumbs>\r\n\r\n <Typography variant=\"h5\" align=\"center\" sx={{ padding: 2 }}>\r\n {category && category.name}\r\n </Typography>\r\n {!loading && <QuestionList data={questions} showCategory={false} showLabels={true} />}\r\n </Container>\r\n </>\r\n );\r\n};\r\n","/** @jsxImportSource @emotion/react */\r\nimport { css } from '@emotion/react';\r\nimport { useEffect } from 'react';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport { useNavigate, useSearchParams } from 'react-router-dom';\r\nimport { searchQuestions } from '../data';\r\nimport { searchingQuestionsAction, searchedQuestionsAction, AppState } from '../Store';\r\n\r\nimport { Title } from '../components/Title';\r\nimport { QuestionList } from '../components/QuestionList';\r\nimport { Container, Typography, Breadcrumbs, Link } from '@mui/material';\r\nimport HomeIcon from '@mui/icons-material/Home';\r\n\r\nexport const Search = () => {\r\n const dispatch = useDispatch();\r\n const questions = useSelector((state: AppState) => state.questions.searched);\r\n const loading = useSelector((state: AppState) => state.questions.loading);\r\n const [searchParams] = useSearchParams();\r\n const search = searchParams.get('query') || '';\r\n const navigate = useNavigate();\r\n\r\n useEffect(() => {\r\n const doSearch = async (query: string) => {\r\n dispatch(searchingQuestionsAction());\r\n const foundResults = await searchQuestions(query);\r\n dispatch(searchedQuestionsAction(foundResults));\r\n };\r\n\r\n doSearch(search);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [search]);\r\n\r\n return (\r\n <>\r\n {<Title title=\"Seach results\" />}\r\n\r\n <Container maxWidth=\"lg\">\r\n <Breadcrumbs\r\n aria-label=\"breadcrumb\"\r\n css={css`\r\n padding-top: 20px;\r\n `}\r\n >\r\n <Link\r\n color=\"inherit\"\r\n onClick={() => {\r\n navigate('/');\r\n }}\r\n css={css`\r\n display: flex;\r\n cursor: pointer;\r\n `}\r\n >\r\n <HomeIcon\r\n css={css`\r\n margin-right: 5px;\r\n width: 20px;\r\n height: 20px;\r\n `}\r\n />\r\n Home\r\n </Link>\r\n <Typography>Search results</Typography>\r\n </Breadcrumbs>\r\n\r\n <Typography variant=\"h5\" align=\"center\" sx={{ padding: 2 }}>\r\n Search results\r\n </Typography>\r\n {search && (\r\n <p\r\n css={css`\r\n font-size: 16px;\r\n font-weight: bold;\r\n font-style: italic;\r\n margin-top: 0;\r\n margin-left: 2em;\r\n `}\r\n >\r\n {questions.length} results for \"{search}\"\r\n </p>\r\n )}\r\n {!loading && <QuestionList data={questions} showCategory={true} showLabels={true} />}\r\n </Container>\r\n </>\r\n );\r\n};\r\n","/** @jsxImportSource @emotion/react */\r\nimport { css } from '@emotion/react';\r\nimport { useEffect } from 'react';\r\nimport { useParams } from 'react-router';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport { gettingQuestionAction, gotQuestionAction, AppState } from '../Store';\r\nimport { getQuestion } from '../data';\r\n\r\nimport { Title } from '../components/Title';\r\nimport { Container, Typography, Breadcrumbs, Link, Chip, Stack } from '@mui/material';\r\nimport HomeIcon from '@mui/icons-material/Home';\r\n\r\nexport const Question = () => {\r\n const dispatch = useDispatch();\r\n const question = useSelector((state: AppState) => state.questions.viewing);\r\n\r\n const { id } = useParams();\r\n const questionId = parseInt(id);\r\n const navigate = useNavigate();\r\n\r\n useEffect(() => {\r\n const doGetQuestion = async (questionId: number) => {\r\n dispatch(gettingQuestionAction());\r\n const foundQuestion = await getQuestion(questionId);\r\n dispatch(gotQuestionAction(foundQuestion));\r\n };\r\n if (questionId) {\r\n doGetQuestion(Number(questionId));\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [questionId]);\r\n\r\n return (\r\n <>\r\n {question && <Title title={question.title} />}\r\n\r\n <Container maxWidth=\"md\" css={css``}>\r\n <Breadcrumbs\r\n aria-label=\"breadcrumb\"\r\n css={css`\r\n padding: 20px 0;\r\n `}\r\n >\r\n <Link\r\n color=\"inherit\"\r\n onClick={() => {\r\n navigate('/');\r\n }}\r\n css={css`\r\n display: flex;\r\n cursor: pointer;\r\n `}\r\n >\r\n <HomeIcon\r\n css={css`\r\n margin-right: 5px;\r\n width: 20px;\r\n height: 20px;\r\n `}\r\n />\r\n Home\r\n </Link>\r\n <Typography>{question && question.categoryName}</Typography>\r\n </Breadcrumbs>\r\n\r\n <Typography variant=\"h4\">{question && question.title}</Typography>\r\n\r\n {question && (\r\n <>\r\n {question.labels.trim().length > 0 && (\r\n <Stack\r\n direction=\"row\"\r\n spacing={1}\r\n css={css`\r\n padding: 20px 0;\r\n `}\r\n >\r\n {question.labels.split(',').map((label, idx) => {\r\n return <Chip key={idx} label={label.trim()} />;\r\n })}\r\n </Stack>\r\n )}\r\n <Typography variant=\"overline\">Updated on {question.updated.toLocaleDateString()}</Typography>\r\n <div\r\n css={css`\r\n padding: 5px 0;\r\n margin-bottom: 30px;\r\n border-bottom: 1px solid rgb(217, 233, 255);\r\n `}\r\n />\r\n <div\r\n css={css`\r\n img {\r\n max-width: 100%;\r\n }\r\n pre {\r\n white-space: pre-wrap;\r\n word-wrap: break-word;\r\n text-align: justify;\r\n }\r\n padding-bottom: 2em;\r\n a {\r\n color: #007bff;\r\n text-decoration: none;\r\n background-color: transparent;\r\n }\r\n `}\r\n dangerouslySetInnerHTML={{ __html: question.content }}\r\n ></div>\r\n </>\r\n )}\r\n </Container>\r\n </>\r\n );\r\n};\r\n","import Payment from 'payment';\r\n\r\nfunction clearNumber(value = '') {\r\n return value.replace(/\\D+/g, '');\r\n}\r\n\r\n///////////////////////////////////////////\r\n// Credit card numbers for testing\r\n/*\r\n\r\nVisa 4111 1111 4555 1142\r\nVisa Debit 4002 6900 0000 0008\r\nMastercard 5555 4444 3333 1111\r\nMastercard Debit 2223 5204 4356 0010\r\nAmerican Express 3714 4963 5398 431\r\nDiners Club 3056 9309 0259 04\r\nDiscover 6011 1111 1111 1117\r\n\r\n--- DISABLED:\r\nVisa Electron 4917300800000000\r\nMaestro 5000 5500 0000 0029\r\nJCB 3569 9900 1009 5841\r\nHipercard 6062 8288 8866 6688\r\nUnionPay 6243 0300 0000 0001\r\nElo 5066 9911 1111 1118\r\n\r\n*/\r\nexport function formatCreditCardNumber(value) {\r\n if (!value) {\r\n return value;\r\n }\r\n\r\n const issuer = Payment.fns.cardType(value);\r\n const clearValue = clearNumber(value);\r\n let nextValue;\r\n\r\n switch (issuer) {\r\n case 'amex':\r\n nextValue = `${clearValue.slice(0, 4)} ${clearValue.slice(4, 10)} ${clearValue.slice(10, 15)}`;\r\n break;\r\n case 'dinersclub':\r\n nextValue = `${clearValue.slice(0, 4)} ${clearValue.slice(4, 10)} ${clearValue.slice(10, 14)}`;\r\n break;\r\n default:\r\n nextValue = `${clearValue.slice(0, 4)} ${clearValue.slice(4, 8)} ${clearValue.slice(\r\n 8,\r\n 12\r\n )} ${clearValue.slice(12, 19)}`;\r\n break;\r\n }\r\n\r\n return nextValue.trim();\r\n}\r\n\r\nexport function formatCVC(value, cardNumber) {\r\n const clearValue = clearNumber(value);\r\n let maxLength = 4;\r\n\r\n const issuer = Payment.fns.cardType(cardNumber);\r\n maxLength = issuer === 'amex' ? 4 : 3;\r\n\r\n return clearValue.slice(0, maxLength);\r\n}\r\n\r\nexport function formatExpirationDate(prevValue, value) {\r\n const clearValue = clearNumber(value);\r\n\r\n if (clearValue.length === 2) {\r\n const month = Number(clearValue);\r\n if (!(month >= 1 && month <= 12)) {\r\n return prevValue;\r\n }\r\n }\r\n\r\n if (clearValue.length === 4) {\r\n const year = Number(clearValue.slice(2, 4));\r\n const currYear = new Date().getFullYear() - 2000;\r\n if (year < currYear || year > currYear + 15) {\r\n return prevValue;\r\n }\r\n }\r\n\r\n if (clearValue.length >= 3) {\r\n return `${clearValue.slice(0, 2)}/${clearValue.slice(2, 4)}`;\r\n }\r\n\r\n return clearValue;\r\n}\r\n","export default __webpack_public_path__ + \"static/media/credit-cards.d5c5c727.png\";","export default __webpack_public_path__ + \"static/media/paypal.52593b00.svg\";","export const usaStatesAndTerritories = [\r\n { long: 'Alabama', short: 'AL' },\r\n { long: 'Alaska', short: 'AK' },\r\n { long: 'Arizona', short: 'AZ' },\r\n { long: 'Arkansas', short: 'AR' },\r\n { long: 'California', short: 'CA' },\r\n { long: 'Colorado', short: 'CO' },\r\n { long: 'Connecticut', short: 'CT' },\r\n { long: 'Delaware', short: 'DE' },\r\n { long: 'Florida', short: 'FL' },\r\n { long: 'Georgia', short: 'GA' },\r\n { long: 'Hawaii', short: 'HI' },\r\n { long: 'Idaho', short: 'ID' },\r\n { long: 'Illinois', short: 'IL' },\r\n { long: 'Indiana', short: 'IN' },\r\n { long: 'Iowa', short: 'IA' },\r\n { long: 'Kansas', short: 'KS' },\r\n { long: 'Kentucky', short: 'KY' },\r\n { long: 'Louisiana', short: 'LA' },\r\n { long: 'Maine', short: 'ME' },\r\n { long: 'Maryland', short: 'MD' },\r\n { long: 'Massachusetts', short: 'MA' },\r\n { long: 'Michigan', short: 'MI' },\r\n { long: 'Minnesota', short: 'MN' },\r\n { long: 'Mississippi', short: 'MS' },\r\n { long: 'Missouri', short: 'MO' },\r\n { long: 'Montana', short: 'MT' },\r\n { long: 'Nebraska', short: 'NE' },\r\n { long: 'Nevada', short: 'NV' },\r\n { long: 'New Hampshire', short: 'NH' },\r\n { long: 'New Jersey', short: 'NJ' },\r\n { long: 'New Mexico', short: 'NM' },\r\n { long: 'New York', short: 'NY' },\r\n { long: 'North Carolina', short: 'NC' },\r\n { long: 'North Dakota', short: 'ND' },\r\n { long: 'Ohio', short: 'OH' },\r\n { long: 'Oklahoma', short: 'OK' },\r\n { long: 'Oregon', short: 'OR' },\r\n { long: 'Pennsylvania', short: 'PA' },\r\n { long: 'Rhode Island', short: 'RI' },\r\n { long: 'South Carolina', short: 'SC' },\r\n { long: 'South Dakota', short: 'SD' },\r\n { long: 'Tennessee', short: 'TN' },\r\n { long: 'Texas', short: 'TX' },\r\n { long: 'Utah', short: 'UT' },\r\n { long: 'Vermont', short: 'VT' },\r\n { long: 'Virginia', short: 'VA' },\r\n { long: 'Washington', short: 'WA' },\r\n { long: 'West Virginia', short: 'WV' },\r\n { long: 'Wisconsin', short: 'WI' },\r\n { long: 'Wyoming', short: 'WY' },\r\n { long: 'American Samoa', short: 'AS' },\r\n { long: 'Guam', short: 'GU' },\r\n { long: 'Northern Mariana Islands', short: 'MP' },\r\n { long: 'Puerto Rico', short: 'PR' },\r\n { long: 'United States Virgin Islands', short: 'VI' },\r\n { long: 'District of Columbia', short: 'DC' },\r\n];\r\n\r\nexport const canadaProvinces = [\r\n { long: 'Alberta', short: 'AB' },\r\n { long: 'British Columbia', short: 'BC' },\r\n { long: 'Manitoba', short: 'MB' },\r\n { long: 'New Brunswick', short: 'NB' },\r\n { long: 'Newfoundland and Labrador', short: 'NL' },\r\n { long: 'Nova Scotia', short: 'NS' },\r\n { long: 'Ontario', short: 'ON' },\r\n { long: 'Prince Edward Island', short: 'PE' },\r\n { long: 'Quebec', short: 'QC' },\r\n { long: 'Saskatchewan', short: 'SK' },\r\n { long: 'Northwest Territories', short: 'NT' },\r\n { long: 'Nunavut', short: 'NU' },\r\n { long: 'Yukon', short: 'YT' },\r\n];\r\n\r\nexport function checkZip(value) {\r\n return /(^\\d{5}$)|(^\\d{5}-\\d{4}$)/.test(value);\r\n}\r\n\r\n// This function is used to convert the full name of a province or state to its abbreviation.\r\n// for example, 'British Columbia' -> 'BC'\r\n// If country is not US or Canada, it will return the original name.\r\nexport function shortProvinceOrStateName(longName: string) {\r\n for (const state of usaStatesAndTerritories) {\r\n if (state.long === longName) {\r\n return state.short;\r\n }\r\n }\r\n for (const province of canadaProvinces) {\r\n if (province.long === longName) {\r\n return province.short;\r\n }\r\n }\r\n return longName;\r\n}\r\n\r\n// get country code from country name for most common countries\r\nexport function CountryNameToCode(country: string) {\r\n switch (country) {\r\n case 'United States':\r\n case 'USA':\r\n case 'U.S.A.':\r\n return 'US';\r\n\r\n case 'Canada':\r\n return 'CA';\r\n\r\n case 'United Kingdom':\r\n return 'GB';\r\n\r\n default:\r\n return country;\r\n }\r\n}\r\n","import { useEffect, useState, useCallback, useRef } from 'react';\r\nimport { useParams } from 'react-router';\r\nimport type { ChangeEvent } from 'react';\r\nimport { Title } from '../../components/Title';\r\nimport {\r\n Box,\r\n Card,\r\n CardContent,\r\n Typography,\r\n Grid,\r\n Container,\r\n Divider,\r\n CardHeader,\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TableRow,\r\n useMediaQuery,\r\n Theme,\r\n Button,\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogContentText,\r\n DialogTitle,\r\n Snackbar,\r\n Alert,\r\n Tabs,\r\n Tab,\r\n TextField,\r\n} from '@mui/material';\r\nimport { useForm } from 'react-hook-form';\r\nimport type { QuoteCheckoutInfo } from '../../types/reseller';\r\nimport { resellerService } from '../../reseller.service';\r\nimport { useMounted } from '../../hooks/use-mounted';\r\nimport { Scrollbar } from '../../components/Scrollbar';\r\nimport { PropertyList } from '../../components/PropertyList';\r\nimport { PropertyListItem } from '../../components/PropertyListItem';\r\nimport numeral from 'numeral';\r\nimport CreditCard from 'react-credit-cards';\r\nimport { formatCreditCardNumber, formatExpirationDate, formatCVC } from '../../utils/credit-cards';\r\nimport 'react-credit-cards/es/styles-compiled.css';\r\nimport creditCards from '../../images/credit-cards.png';\r\nimport { IToastState, defaultToastState } from '../../components/ToastState';\r\nimport Message from '../Message';\r\nimport PaypalImg from '../../images/paypal.svg';\r\nimport { styled } from '@mui/material/styles';\r\nimport { settings } from '../../settings';\r\nimport { checkZip } from '../../utils/cart';\r\nimport { CountryNameToCode, shortProvinceOrStateName } from '../../utils/cart';\r\n\r\nconst tabs = [\r\n { label: 'Billing', value: 'billing' },\r\n { label: 'Shipping', value: 'shipping' },\r\n];\r\n\r\nconst PaypalButton = styled(Button)(({ theme }) => ({\r\n backgroundColor: '#ffc439',\r\n backgroundImage: `url(${PaypalImg})`,\r\n backgroundRepeat: 'no-repeat',\r\n backgroundPosition: 'center',\r\n}));\r\n\r\nconst translateCardType = (issuer: string): string => {\r\n switch (issuer) {\r\n case 'visa':\r\n return 'VISA';\r\n case 'mastercard':\r\n return 'MC';\r\n case 'amex':\r\n return 'AMEX';\r\n case 'dinersclub':\r\n return 'DINE';\r\n case 'discover':\r\n return 'DISC';\r\n default:\r\n return '';\r\n }\r\n};\r\n\r\ninterface PaypalData {\r\n firstName: string;\r\n lastName: string;\r\n address: string;\r\n city: string;\r\n zip: string;\r\n country: string;\r\n state: string;\r\n email: string;\r\n phone_a: string;\r\n phone_b: string;\r\n phone_c: string;\r\n}\r\nfunction emptyPaypalData(): PaypalData {\r\n return {\r\n firstName: '',\r\n lastName: '',\r\n address: '',\r\n city: '',\r\n zip: '',\r\n country: '',\r\n state: '',\r\n email: '',\r\n phone_a: '',\r\n phone_b: '',\r\n phone_c: '',\r\n };\r\n}\r\n\r\nconst ANNUAL_SUPPORT_ID = 36;\r\n\r\nexport const QuoteCheckout = () => {\r\n const { orderId } = useParams();\r\n const smDown = useMediaQuery((theme: Theme) => theme.breakpoints.down('sm'));\r\n const align = smDown ? 'vertical' : 'horizontal';\r\n\r\n const isMounted = useMounted();\r\n const [currentTab, setCurrentTab] = useState<string>('billing');\r\n const [info, setInfo] = useState<QuoteCheckoutInfo | null>(null);\r\n const [memo, setMemo] = useState<string>('');\r\n const [isAnnualSupport, setIsAnnualSupport] = useState<boolean>(false);\r\n\r\n const [openDialog, setOpenDialog] = useState(false);\r\n const [dialogTitle, setDialogTitle] = useState('');\r\n const [openBlacklistedDialog, setOpenBlacklistedDialog] = useState(false);\r\n const [openMonerisDialog, setOpenMonerisDialog] = useState(false);\r\n const [dialogMessage, setDialogMessage] = useState('');\r\n const [dialogFollowLink, setDialogFollowLink] = useState('');\r\n const [toastState, setToastState] = useState<IToastState>(defaultToastState);\r\n const { handleSubmit } = useForm<QuoteCheckoutInfo>();\r\n\r\n const [paypalData, setPaypalData] = useState<PaypalData>(emptyPaypalData());\r\n const refPaypalSubmitButton = useRef<HTMLButtonElement>(null);\r\n const { handleSubmit: handleSubmitPayPal } = useForm<PaypalData>();\r\n\r\n const [cardNumber, setCardNumber] = useState<string>('');\r\n const [expiry, setExpiry] = useState<string>('');\r\n const [cvc, setCvc] = useState<string>('');\r\n const [focused, setFocused] = useState<string>('');\r\n const [issuer, setIssuer] = useState<string>('');\r\n const [inProgress, setInProgress] = useState<boolean>(false);\r\n const [loadError, setLoadError] = useState<string>(undefined);\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n const data = await resellerService.getQuoteCheckoutInfo(orderId);\r\n if (isMounted()) {\r\n if (data.ok) {\r\n setInfo(data.body);\r\n setMemo(data.body.billingFax);\r\n if (data.body.items.length === 1 && data.body.items[0].productId === ANNUAL_SUPPORT_ID) {\r\n setIsAnnualSupport(true);\r\n }\r\n } else {\r\n setLoadError(data.message);\r\n }\r\n }\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n }, [isMounted]);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, []);\r\n\r\n const handleTabsChange = (event: ChangeEvent<{}>, value: string): void => {\r\n setCurrentTab(value);\r\n };\r\n\r\n const handleCallback = ({ issuer }, isValid) => {\r\n if (isValid) {\r\n setIssuer(issuer);\r\n } else {\r\n setIssuer('');\r\n }\r\n };\r\n\r\n const handleInputFocus = ({ target }) => {\r\n setFocused(target.name);\r\n };\r\n\r\n const handleInputChange = ({ target }) => {\r\n if (target.name === 'number') {\r\n target.value = formatCreditCardNumber(target.value);\r\n setCardNumber(target.value);\r\n } else if (target.name === 'expiry') {\r\n target.value = formatExpirationDate(expiry, target.value);\r\n setExpiry(target.value);\r\n } else if (target.name === 'cvc') {\r\n target.value = formatCVC(target.value, cardNumber);\r\n setCvc(target.value);\r\n } else if (target.name === 'memo') {\r\n setMemo(target.value);\r\n }\r\n };\r\n\r\n const handleCloseBlacklistedDialog = () => {};\r\n const handleCancelBlacklistedDialog = () => {\r\n setOpenBlacklistedDialog(false);\r\n };\r\n\r\n const handleCloseMonerisDialog = () => {};\r\n const handleCancelMonerisDialog = () => {\r\n setOpenMonerisDialog(false);\r\n };\r\n\r\n const onSubmit = async (data: QuoteCheckoutInfo) => {\r\n setInProgress(true);\r\n let request: any = {\r\n order_id: orderId,\r\n bill_first_name: info.billingFirstName,\r\n bill_last_name: info.billingLastName,\r\n bill_company: info.billingCompany,\r\n bill_address_one: info.billingAddress,\r\n bill_city: info.billingCity,\r\n bill_state_or_province: info.billingState,\r\n bill_country: info.billingCountry,\r\n bill_postal_code: info.billingZip,\r\n bill_email: info.billingEmail,\r\n bill_phone: info.billingPhone,\r\n bill_fax: memo,\r\n bill_po: '',\r\n credit_card_brand: translateCardType(issuer),\r\n credit_card_number: cardNumber.replaceAll(' ', ''),\r\n expire_month: expiry.substr(0, 2),\r\n expire_year: '20' + expiry.substr(3, 2),\r\n cvv: cvc,\r\n bill_amount: info.total,\r\n discount_amount: info.discount,\r\n bill_gst: info.gst,\r\n bill_pst: info.pst,\r\n comments: isAnnualSupport ? memo : '',\r\n };\r\n info.items.forEach((item, idx) => {\r\n request[`product_id${idx > 0 ? idx : ''}`] = item.productId;\r\n request[`product${idx > 0 ? idx : ''}`] = item.productName;\r\n request[`license${idx > 0 ? idx : ''}`] = item.licenseId;\r\n request[`quantity${idx > 0 ? idx : ''}`] = item.qty;\r\n request[`product_amount${idx > 0 ? idx : ''}`] = item.amount;\r\n });\r\n\r\n const response = await resellerService.checkout(request);\r\n\r\n if (response == null) {\r\n setDialogTitle('Transaction Failed');\r\n setDialogMessage('Server communication error');\r\n setDialogFollowLink('');\r\n setOpenDialog(true);\r\n setInProgress(false);\r\n } else if (!response.status) {\r\n if (response.message === 'Blacklisted') {\r\n setOpenBlacklistedDialog(true);\r\n setInProgress(false);\r\n } else if (response.message === 'moneris problem') {\r\n setOpenMonerisDialog(true);\r\n setInProgress(false);\r\n } else {\r\n setDialogTitle('Transaction Failed');\r\n setDialogMessage(response.message);\r\n setDialogFollowLink('');\r\n setOpenDialog(true);\r\n setInProgress(false);\r\n }\r\n } else {\r\n setIssuer('');\r\n setCardNumber('');\r\n setExpiry('');\r\n setCvc('');\r\n setInProgress(false);\r\n setDialogTitle('Success');\r\n setDialogMessage('Payment was successfully processed');\r\n setDialogFollowLink(`https://secure.lsoft.net/invoices/${response.order}?`);\r\n setOpenDialog(true);\r\n }\r\n };\r\n\r\n const triggerPaypalSubmit = () => {\r\n refPaypalSubmitButton?.current?.click();\r\n };\r\n const onSubmitPaypal = async (data) => {\r\n setOpenBlacklistedDialog(false);\r\n setOpenMonerisDialog(false);\r\n\r\n // check if zip code is valid for US, because Paypal freezes if US zip code is invalid; for other countries it's not a problem\r\n // if zip is missing, address, city etc are ignored by Paypal\r\n const country: string = CountryNameToCode(info.billingCountry);\r\n const zip: string = country === 'US' && !checkZip(info.billingZip) ? '' : info.billingZip;\r\n const state: string =\r\n country === 'CA' || country === 'US' ? shortProvinceOrStateName(info.billingState) : info.billingState;\r\n\r\n // phone number is split into 3 parts for US; other countries have only one part but area codes are checked by Paypal\r\n let phone_a = '';\r\n let phone_b = '';\r\n let phone_c = '';\r\n\r\n if (country === 'US' && info.billingPhone.length === 10) {\r\n phone_a = info.billingPhone.substring(0, 3);\r\n phone_b = info.billingPhone.substring(3, 6);\r\n phone_c = info.billingPhone.substring(6, 10);\r\n } else {\r\n phone_a = info.billingPhone;\r\n }\r\n\r\n const updatedPaypalData: PaypalData = {\r\n firstName: info.billingFirstName,\r\n lastName: info.billingLastName,\r\n address: info.billingAddress,\r\n city: info.billingCity,\r\n zip: zip,\r\n country: country,\r\n state: state,\r\n email: info.billingEmail,\r\n phone_a: phone_a,\r\n phone_b: phone_b,\r\n phone_c: phone_c,\r\n };\r\n setPaypalData(updatedPaypalData);\r\n\r\n triggerPaypalSubmit();\r\n };\r\n\r\n const onDialogOk = () => {\r\n setOpenDialog(false);\r\n if (dialogFollowLink.length > 0) {\r\n window.open(dialogFollowLink, '_blank');\r\n }\r\n };\r\n\r\n const handleCloseSnackbar = (event?: React.SyntheticEvent, reason?: string) => {\r\n if (reason === 'clickaway') {\r\n return;\r\n }\r\n setToastState({ ...toastState, open: false });\r\n };\r\n\r\n if (loadError) {\r\n return <Message title=\"Invalid Request\" message={loadError} />;\r\n }\r\n\r\n return (\r\n <>\r\n <Title title=\"Checkout\" />\r\n <Box\r\n component=\"main\"\r\n sx={{\r\n flexGrow: 1,\r\n py: 3,\r\n }}\r\n >\r\n <Container maxWidth=\"lg\">\r\n <Dialog\r\n open={openDialog}\r\n onClose={() => setOpenDialog(false)}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n >\r\n <DialogTitle id=\"alert-dialog-title\">{dialogTitle}</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText id=\"alert-dialog-description\">{dialogMessage}</DialogContentText>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button onClick={() => onDialogOk()} autoFocus>\r\n OK\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n\r\n <Dialog\r\n open={openBlacklistedDialog}\r\n onClose={handleCloseBlacklistedDialog}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n >\r\n <DialogTitle id=\"alert-dialog-title\">Payment pre-processing validation failed</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText id=\"alert-dialog-description\">\r\n To process payment with Credit or Debit Card you will be <b>redirected to PayPal</b>{' '}\r\n where you can select option to pay with Credit/Debit Card as a guest. After successful\r\n payment you will be redirected back here to get an invoice and registration key.\r\n </DialogContentText>\r\n <DialogContentText sx={{ mt: 2 }}>\r\n You can also contact our sales department {settings.phone1} for order processing over\r\n the phone.\r\n </DialogContentText>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button sx={{ mr: 2 }} onClick={handleCancelBlacklistedDialog} autoFocus>\r\n Cancel\r\n </Button>\r\n <form id=\"payment\" onSubmit={handleSubmitPayPal(onSubmitPaypal)}>\r\n <Button sx={{ mr: 2 }} color=\"primary\" variant=\"contained\" type=\"submit\">\r\n OK\r\n </Button>\r\n </form>\r\n </DialogActions>\r\n </Dialog>\r\n\r\n <Dialog\r\n open={openMonerisDialog}\r\n onClose={handleCloseMonerisDialog}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n >\r\n <DialogTitle id=\"alert-dialog-title\">Payment processing failed</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText id=\"alert-dialog-description\">\r\n We experience payment processing issues with our provider. You can try again to process\r\n payment later on, or use PayPal as a credit card payment processor.\r\n </DialogContentText>\r\n <DialogContentText sx={{ mt: 2 }}>\r\n To process payment with Credit or Debit Card you will be <b>redirected to PayPal</b>{' '}\r\n where you can select option to pay with Credit/Debit Card as a guest. After successful\r\n payment you will be redirected back here to get an invoice and registration key.\r\n </DialogContentText>\r\n <DialogContentText sx={{ mt: 2 }}>\r\n You can also contact our sales department {settings.phone1} for order processing over\r\n the phone.\r\n </DialogContentText>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button sx={{ mr: 2 }} onClick={handleCancelMonerisDialog} autoFocus>\r\n Cancel\r\n </Button>\r\n <form id=\"payment\" onSubmit={handleSubmitPayPal(onSubmitPaypal)}>\r\n <Button sx={{ mr: 2 }} color=\"primary\" variant=\"contained\" type=\"submit\">\r\n Use PayPal\r\n </Button>\r\n </form>\r\n </DialogActions>\r\n </Dialog>\r\n\r\n <Snackbar\r\n open={toastState.open}\r\n autoHideDuration={6000}\r\n onClose={handleCloseSnackbar}\r\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\r\n >\r\n <Alert onClose={handleCloseSnackbar} severity={toastState.status}>\r\n {toastState.message}\r\n </Alert>\r\n </Snackbar>\r\n\r\n <Grid container spacing={3}>\r\n <Grid item xs={12}>\r\n <Card>\r\n <CardHeader title=\"Order Summary\" />\r\n <CardContent sx={{ py: 0 }}>\r\n <Scrollbar>\r\n <Box sx={{ minWidth: 700 }}>\r\n <Table>\r\n <TableHead>\r\n <TableRow>\r\n <TableCell>Product</TableCell>\r\n <TableCell>License</TableCell>\r\n <TableCell align=\"right\">Price</TableCell>\r\n <TableCell align=\"right\">Quantity</TableCell>\r\n <TableCell align=\"right\">Amount</TableCell>\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {info &&\r\n info.items.map((product, idx) => (\r\n <TableRow key={idx}>\r\n <TableCell>{product.productName}</TableCell>\r\n <TableCell>{product.licenseName}</TableCell>\r\n <TableCell align=\"right\">\r\n {numeral(product.price).format('0,0.00')}\r\n </TableCell>\r\n <TableCell align=\"right\">{product.qty}</TableCell>\r\n <TableCell align=\"right\">\r\n {numeral(product.amount).format('0,0.00')}\r\n </TableCell>\r\n </TableRow>\r\n ))}\r\n {info && info.discount > 0 && (\r\n <TableRow>\r\n <TableCell />\r\n <TableCell />\r\n <TableCell />\r\n <TableCell align=\"right\">\r\n <Typography style={{ fontWeight: 600 }}>\r\n Discount\r\n </Typography>\r\n </TableCell>\r\n <TableCell align=\"right\">\r\n <Typography style={{ fontWeight: 600 }}>\r\n {numeral(info.discount).format('0,0.00')}\r\n </Typography>\r\n </TableCell>\r\n </TableRow>\r\n )}\r\n\r\n {info && info.tax > 0 && (\r\n <TableRow>\r\n <TableCell />\r\n <TableCell />\r\n <TableCell />\r\n <TableCell align=\"right\">Tax</TableCell>\r\n <TableCell align=\"right\">\r\n {numeral(info.tax).format('0,0.00')}\r\n </TableCell>\r\n </TableRow>\r\n )}\r\n\r\n {info && (\r\n <TableRow>\r\n <TableCell />\r\n <TableCell />\r\n <TableCell />\r\n <TableCell align=\"right\">\r\n <Typography style={{ fontWeight: 600 }}>\r\n Order Total\r\n </Typography>\r\n </TableCell>\r\n <TableCell align=\"right\">\r\n <Typography style={{ fontWeight: 600 }}>\r\n US$ {numeral(info.total).format('0,0.00')}\r\n </Typography>\r\n </TableCell>\r\n </TableRow>\r\n )}\r\n </TableBody>\r\n </Table>\r\n </Box>\r\n </Scrollbar>\r\n </CardContent>\r\n </Card>\r\n </Grid>\r\n <Grid item md={6} xs={12}>\r\n <Tabs\r\n indicatorColor=\"primary\"\r\n onChange={handleTabsChange}\r\n scrollButtons=\"auto\"\r\n textColor=\"primary\"\r\n value={currentTab}\r\n variant=\"scrollable\"\r\n >\r\n {tabs.map((tab) => (\r\n <Tab key={tab.value} label={tab.label} value={tab.value} />\r\n ))}\r\n </Tabs>\r\n <Divider sx={{ mb: 3 }} />\r\n {currentTab === 'shipping' && (\r\n <Box>\r\n <Card>\r\n <Box sx={{ px: 3 }}>\r\n <PropertyList>\r\n <PropertyListItem align={align} label=\"Name\">\r\n <Typography color=\"primary\" variant=\"body1\">\r\n {info && `${info.shippingFirstName} ${info.shippingLastName}`}\r\n </Typography>\r\n </PropertyListItem>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Company\">\r\n <Typography variant=\"body1\">\r\n {info && info.shippingCompany}\r\n </Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Address\">\r\n <Typography variant=\"body1\">\r\n {info && info.shippingAddress}\r\n </Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"City\">\r\n <Typography variant=\"body1\">\r\n {info && info.shippingCity}\r\n </Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"State / Province\">\r\n <Typography variant=\"body1\">\r\n {info && info.shippingState}\r\n </Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Zip / Postal code\">\r\n <Typography variant=\"body1\">\r\n {info && info.shippingZip}\r\n </Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Country\">\r\n <Typography variant=\"body1\">\r\n {info && info.shippingCountry}\r\n </Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Phone\">\r\n <Typography variant=\"body1\">\r\n {info && info.shippingPhone}\r\n </Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Email\">\r\n <Typography variant=\"body1\" color=\"primary\">\r\n {info && info.shippingEmail}\r\n </Typography>\r\n </PropertyListItem>\r\n </Box>\r\n </PropertyList>\r\n </Box>\r\n </Card>\r\n </Box>\r\n )}\r\n {currentTab === 'billing' && (\r\n <Box>\r\n <Card>\r\n <Box sx={{ px: 3 }}>\r\n <PropertyList>\r\n <PropertyListItem align={align} label=\"Name\">\r\n <Typography color=\"primary\" variant=\"body1\">\r\n {info && `${info.billingFirstName} ${info.billingLastName}`}\r\n </Typography>\r\n </PropertyListItem>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Company\">\r\n <Typography variant=\"body1\">\r\n {info && info.billingCompany}\r\n </Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Address\">\r\n <Typography variant=\"body1\">\r\n {info && info.billingAddress}\r\n </Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"City\">\r\n <Typography variant=\"body1\">\r\n {info && info.billingCity}\r\n </Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"State / Province\">\r\n <Typography variant=\"body1\">\r\n {info && info.billingState}\r\n </Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Zip / Postal code\">\r\n <Typography variant=\"body1\">\r\n {info && info.billingZip}\r\n </Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Country\">\r\n <Typography variant=\"body1\">\r\n {info && info.billingCountry}\r\n </Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Phone\">\r\n <Typography variant=\"body1\">\r\n {info && info.billingPhone}\r\n </Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Email\">\r\n <Typography variant=\"body1\" color=\"primary\">\r\n {info && info.billingEmail}\r\n </Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n\r\n <Box>\r\n <PropertyListItem\r\n align={align}\r\n label={isAnnualSupport ? 'Original Order ID' : 'Memo *'}\r\n >\r\n {isAnnualSupport && (\r\n <Typography color=\"primary\" variant=\"body1\">\r\n {info && `${info.comments}`}\r\n </Typography>\r\n )}\r\n {!isAnnualSupport && (\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n }}\r\n >\r\n {info && (\r\n <TextField\r\n name=\"memo\"\r\n size=\"small\"\r\n required\r\n value={memo}\r\n onChange={handleInputChange}\r\n onFocus={handleInputFocus}\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n />\r\n )}\r\n </Box>\r\n )}\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n </PropertyList>\r\n </Box>\r\n </Card>\r\n </Box>\r\n )}\r\n </Grid>\r\n\r\n <Grid item md={6} xs={12}>\r\n <Box sx={{ height: '100%' }}>\r\n <Card sx={{ height: '100%' }}>\r\n <CardContent sx={{ px: 3 }}>\r\n <Box\r\n sx={{\r\n mt: 0,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Box>\r\n <Box sx={{ display: 'flex', alignItems: 'center', mb: 2 }}>\r\n <Typography variant=\"h6\">Pay with </Typography>\r\n <img alt=\"credit cards\" style={{ width: 340 }} src={creditCards} />\r\n </Box>\r\n\r\n <CreditCard\r\n acceptedCards={[\r\n 'visa',\r\n 'mastercard',\r\n 'amex',\r\n 'dinersclub',\r\n 'discover',\r\n ]}\r\n number={cardNumber}\r\n name=\"\"\r\n expiry={expiry}\r\n cvc={cvc}\r\n focused={focused}\r\n callback={handleCallback}\r\n />\r\n </Box>\r\n <Box>\r\n <Grid container columnSpacing={3}>\r\n <Grid item xs={12}>\r\n <TextField\r\n name=\"number\"\r\n value={cardNumber}\r\n required\r\n label=\"Card Number\"\r\n fullWidth\r\n onChange={handleInputChange}\r\n onFocus={handleInputFocus}\r\n sx={{\r\n flexGrow: 1,\r\n mr: 3,\r\n mt: 3,\r\n }}\r\n />\r\n </Grid>\r\n <Grid item md={6} xs={12}>\r\n <TextField\r\n name=\"expiry\"\r\n value={expiry}\r\n required\r\n label=\"Valid Thru (MM/YY)\"\r\n fullWidth\r\n onChange={handleInputChange}\r\n onFocus={handleInputFocus}\r\n sx={{\r\n flexGrow: 1,\r\n mr: 3,\r\n mt: 3,\r\n }}\r\n />\r\n </Grid>\r\n <Grid item md={6} xs={12}>\r\n <TextField\r\n name=\"cvc\"\r\n value={cvc}\r\n label=\"CVC\"\r\n fullWidth\r\n onChange={handleInputChange}\r\n onFocus={handleInputFocus}\r\n sx={{\r\n flexGrow: 1,\r\n mr: 3,\r\n mt: 3,\r\n }}\r\n />\r\n </Grid>\r\n\r\n <Grid item xs={12}>\r\n <form id=\"payment\" onSubmit={handleSubmit(onSubmit)}>\r\n <Button\r\n color=\"primary\"\r\n variant=\"contained\"\r\n type=\"submit\"\r\n fullWidth\r\n disabled={!issuer || expiry.length !== 5 || inProgress}\r\n sx={{ mt: 3 }}\r\n >\r\n Pay\r\n </Button>\r\n </form>\r\n\r\n <Divider sx={{ m: 3 }} variant=\"middle\">\r\n OR\r\n </Divider>\r\n\r\n <form\r\n action=\"https://www.paypal.com/cgi-bin/webscr\"\r\n method=\"post\"\r\n target=\"_new\"\r\n >\r\n {info && (\r\n <>\r\n <input type=\"hidden\" name=\"cmd\" value=\"_xclick\" />\r\n <input\r\n type=\"hidden\"\r\n name=\"business\"\r\n value=\"company@lsoft.net\"\r\n />\r\n <input\r\n type=\"hidden\"\r\n name=\"currency_code\"\r\n value=\"USD\"\r\n />\r\n <input type=\"hidden\" name=\"lc\" value=\"US\" />\r\n <input\r\n name=\"item_name\"\r\n type=\"hidden\"\r\n id=\"item_name\"\r\n value={info.paypalProductName}\r\n />\r\n <input\r\n name=\"amount\"\r\n type=\"hidden\"\r\n id=\"amount\"\r\n value={info.paypalAmount}\r\n />\r\n <input\r\n name=\"custom\"\r\n type=\"hidden\"\r\n id=\"custom\"\r\n value={`MEMO: ${memo}`}\r\n />\r\n <input\r\n name=\"invoice\"\r\n type=\"hidden\"\r\n id=\"invoice\"\r\n value={orderId}\r\n />\r\n\r\n <input\r\n name=\"first_name\"\r\n type=\"hidden\"\r\n id=\"first_name\"\r\n value={paypalData.firstName}\r\n />\r\n <input\r\n name=\"last_name\"\r\n type=\"hidden\"\r\n id=\"last_name\"\r\n value={paypalData.lastName}\r\n />\r\n <input\r\n name=\"address1\"\r\n type=\"hidden\"\r\n value={paypalData.address}\r\n />\r\n <input name=\"address2\" type=\"hidden\" value=\"\" />\r\n <input\r\n name=\"city\"\r\n type=\"hidden\"\r\n value={paypalData.city}\r\n />\r\n <input\r\n name=\"country\"\r\n type=\"hidden\"\r\n value={paypalData.country}\r\n />\r\n <input\r\n name=\"state\"\r\n type=\"hidden\"\r\n value={paypalData.state}\r\n />\r\n <input\r\n name=\"zip\"\r\n type=\"hidden\"\r\n value={paypalData.zip}\r\n />\r\n <input\r\n name=\"night_phone_a\"\r\n type=\"hidden\"\r\n value={paypalData.phone_a}\r\n />\r\n <input\r\n name=\"night_phone_b\"\r\n type=\"hidden\"\r\n value={paypalData.phone_b}\r\n />\r\n <input\r\n name=\"night_phone_c\"\r\n type=\"hidden\"\r\n value={paypalData.phone_c}\r\n />\r\n </>\r\n )}\r\n <button\r\n hidden={true}\r\n ref={refPaypalSubmitButton}\r\n type={'submit'}\r\n />\r\n </form>\r\n\r\n <form\r\n id=\"payment\"\r\n onSubmit={handleSubmitPayPal(onSubmitPaypal)}\r\n >\r\n <PaypalButton variant=\"contained\" fullWidth type=\"submit\">\r\n \r\n </PaypalButton>\r\n </form>\r\n </Grid>\r\n </Grid>\r\n </Box>\r\n </Box>\r\n </CardContent>\r\n </Card>\r\n </Box>\r\n </Grid>\r\n <Grid item xs={12} sx={{}}>\r\n <Divider />\r\n <Box sx={{ mt: 3, display: 'flex', justifyContent: 'center' }}>\r\n <Typography variant=\"subtitle2\">\r\n Secure payment services provided by{' '}\r\n <Box component=\"span\" fontWeight=\"fontWeightBold\">\r\n Royal Bank of Canada\r\n </Box>{' '}\r\n and{' '}\r\n <Box component=\"span\" fontWeight=\"fontWeightBold\">\r\n LSoft Technologies\r\n </Box>\r\n </Typography>\r\n </Box>\r\n </Grid>\r\n </Grid>\r\n </Container>\r\n </Box>\r\n </>\r\n );\r\n};\r\n","import { http } from './http';\r\nimport type { HttpResponse } from './http';\r\n\r\nexport const cartService = {\r\n getProduct,\r\n getDiscount,\r\n getPaypalInfo,\r\n checkout,\r\n isBlackListed,\r\n};\r\n\r\nexport interface CartProduct {\r\n productId: number;\r\n productName: string;\r\n licenseId: number;\r\n licenseName: string;\r\n price: number;\r\n qty: number;\r\n amount: number;\r\n}\r\n\r\nexport interface CartProductResponse {\r\n productId: number;\r\n productName: string;\r\n areaProduct: string;\r\n licenseId: number;\r\n licenseName: string;\r\n price: number;\r\n qty: number;\r\n amount: number;\r\n includedInDataStudio: boolean;\r\n productShort: string;\r\n showPromo: boolean;\r\n promoProductId: number;\r\n promoProductName: string;\r\n promoLicenseId: number;\r\n promoLicenseName: string;\r\n promoPrice: number;\r\n promoQty: number;\r\n promoAmount: number;\r\n promoDiscount: number;\r\n promoSavings: number;\r\n}\r\n\r\nexport interface OrderTax {\r\n name: string;\r\n amount: number;\r\n}\r\n\r\nexport interface CartInfo {\r\n products: CartProduct[];\r\n discountCode: string;\r\n taxes: Array<OrderTax>;\r\n discount: number;\r\n total: number;\r\n}\r\n\r\nexport interface CartUpdateResponse {\r\n pid: number;\r\n lic: number;\r\n qty: number;\r\n}\r\n\r\nexport interface CartDiscount {\r\n discount: number;\r\n resellerId: number;\r\n}\r\n\r\nexport interface CartCheckoutRequest {\r\n bill_first_name: string;\r\n bill_last_name: string;\r\n bill_company: string;\r\n bill_address_one: string;\r\n bill_city: string;\r\n bill_state_or_province: string;\r\n bill_country: string;\r\n bill_postal_code: string;\r\n bill_email: string;\r\n bill_phone: string;\r\n bill_fax?: string;\r\n bill_po?: string;\r\n credit_card_brand: string;\r\n credit_card_number: string;\r\n expire_month: string;\r\n expire_year: string;\r\n cvv: string;\r\n bill_amount: number;\r\n discount_amount: number;\r\n discount_code?: string;\r\n bill_gst: number;\r\n bill_pst: number;\r\n comments: string;\r\n reseller_id?: number;\r\n [key: string]: string | number;\r\n}\r\n\r\nexport interface CartCheckoutResponse {\r\n status: boolean;\r\n order: string;\r\n message: string;\r\n}\r\n\r\nexport interface CartPaypalInfo {\r\n nextOrderId: string;\r\n ipAddress: string;\r\n exchangeRate: number;\r\n}\r\n\r\nexport interface BlackListedRequest {\r\n name: string;\r\n email: string;\r\n creditCard: string;\r\n}\r\n\r\nexport interface BlackListedResponse {\r\n status: boolean;\r\n message: string;\r\n}\r\n\r\nasync function getProduct(pid: number, lic: number, qty: number): Promise<HttpResponse<CartProductResponse>> {\r\n const path = `/cart/product?pid=${pid}&lic=${lic}&qty=${qty}`;\r\n const result = await http<CartProductResponse>({\r\n path: path,\r\n });\r\n return result;\r\n}\r\n\r\nasync function getDiscount(\r\n subtotal: number,\r\n discountCode: string,\r\n pid: number,\r\n lic: number,\r\n qty: number\r\n): Promise<CartDiscount | null> {\r\n const path = `/cart/discount?subtotal=${subtotal}&discountCode=${discountCode}&pid=${pid}&lic=${lic}&qty=${qty}`;\r\n const result = await http<CartDiscount>({\r\n path: path,\r\n });\r\n if (result.ok && result.body) {\r\n return result.body;\r\n } else {\r\n return null;\r\n }\r\n}\r\n\r\nasync function getPaypalInfo(products: string): Promise<CartPaypalInfo | null> {\r\n const path = `/cart/paypal?products=${products}`;\r\n const result = await http<CartPaypalInfo>({\r\n path: path,\r\n });\r\n if (result.ok && result.body) {\r\n return result.body;\r\n } else {\r\n return null;\r\n }\r\n}\r\n\r\nasync function checkout(params: CartCheckoutRequest): Promise<CartCheckoutResponse | null> {\r\n const result = await http<CartCheckoutResponse, any>({\r\n path: 'https://secure.lsoft.net/OrderProcessBackend.aspx',\r\n method: 'POST',\r\n body: params,\r\n formData: true,\r\n });\r\n if (result.ok && result.body) {\r\n return result.body;\r\n } else {\r\n return null;\r\n }\r\n}\r\n\r\nasync function isBlackListed(request: BlackListedRequest): Promise<BlackListedResponse | null> {\r\n const result = await http<BlackListedResponse, BlackListedRequest>({\r\n path: `/cart/blacklisted`,\r\n method: 'POST',\r\n body: request,\r\n });\r\n\r\n if (result.ok) {\r\n return result.body;\r\n } else {\r\n return null;\r\n }\r\n}\r\n","// #region imports\r\nimport { useEffect, useState, useCallback, useRef } from 'react';\r\nimport { useSearchParams, useNavigate } from 'react-router-dom';\r\nimport { Title } from '../../components/Title';\r\nimport {\r\n Box,\r\n Card,\r\n CardContent,\r\n Typography,\r\n Grid,\r\n Container,\r\n Divider,\r\n CardHeader,\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TableRow,\r\n Button,\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogContentText,\r\n DialogTitle,\r\n Snackbar,\r\n Alert,\r\n TextField,\r\n Select,\r\n Checkbox,\r\n IconButton,\r\n} from '@mui/material';\r\nimport FormControl from '@mui/material/FormControl';\r\nimport MenuItem from '@mui/material/MenuItem';\r\n\r\nimport { useForm, Controller } from 'react-hook-form';\r\nimport type { Tax } from '../../types/reseller';\r\nimport { resellerService } from '../../reseller.service';\r\nimport {\r\n CartProduct,\r\n CartProductResponse,\r\n CartDiscount,\r\n cartService,\r\n CartPaypalInfo,\r\n CartCheckoutRequest,\r\n} from '../../cart.service';\r\nimport { useMounted } from '../../hooks/use-mounted';\r\nimport { Scrollbar } from '../../components/Scrollbar';\r\nimport numeral from 'numeral';\r\nimport CreditCard from 'react-credit-cards';\r\nimport { formatCreditCardNumber, formatExpirationDate, formatCVC } from '../../utils/credit-cards';\r\nimport 'react-credit-cards/es/styles-compiled.css';\r\nimport creditCards from '../../images/credit-cards.png';\r\nimport { IToastState, defaultToastState } from '../../components/ToastState';\r\nimport type { Country } from '../../types/helper';\r\nimport PaypalImg from '../../images/paypal.svg';\r\nimport { usaStatesAndTerritories } from '../../utils/cart';\r\nimport { canadaProvinces } from '../../utils/cart';\r\nimport { checkZip } from '../../utils/cart';\r\nimport { settings } from '../../settings';\r\nimport styled from '@emotion/styled';\r\nimport HelpOutlineIcon from '@mui/icons-material/HelpOutline';\r\n// #endregion\r\n\r\n// #region styles\r\nconst PaypalButton = styled(Button)(({ theme }) => ({\r\n backgroundColor: '#ffc439',\r\n backgroundImage: `url(${PaypalImg})`,\r\n backgroundRepeat: 'no-repeat',\r\n backgroundPosition: 'center',\r\n}));\r\n\r\nconst PromoCard = styled(Card)(() => ({\r\n height: '100%',\r\n}));\r\n\r\nconst PromoLink = styled.a`\r\n color: #007bff;\r\n text-decoration: underline;\r\n cursor: pointer;\r\n`;\r\n\r\nconst PromoDialogLink = styled.a`\r\n text-decoration: none;\r\n cursor: pointer;\r\n`;\r\n\r\nconst PromoTitle = styled.div`\r\n font-size: 24px;\r\n text-align: center;\r\n`;\r\nconst PromoSubtitle = styled.div`\r\n font-size: 16px;\r\n font-style: italic;\r\n text-align: center;\r\n margin-bottom: 20px;\r\n`;\r\n\r\nconst PromoProduct = styled.div`\r\n padding: 15px;\r\n height: 100%;\r\n text-align: center;\r\n img {\r\n display: block;\r\n margin: 0 auto;\r\n }\r\n`;\r\n\r\nconst PromoName = styled.h3`\r\n font-family: 'Segoe UI', 'Roboto', 'Geneva', 'Verdana', 'sans-serif';\r\n font-weight: 700;\r\n font-size: 14px;\r\n margin-bottom: 8px;\r\n margin-top: 10px;\r\n color: #0d2366;\r\n line-height: 20px;\r\n letter-spacing: 0.6px;\r\n`;\r\nconst PromoDescr = styled.p`\r\n font-family: 'Segoe UI', Roboto, Geneva, Verdana, sans-serif;\r\n font-size: 12px;\r\n font-weight: 400;\r\n text-align: left;\r\n line-height: 20px;\r\n color: #5b6070;\r\n margin-top: 10px;\r\n`;\r\nconst PromoMore = styled.p`\r\n text-align: center;\r\n color: #007bff;\r\n a,\r\n a:visited {\r\n text-decoration: none;\r\n color: rgb(24, 117, 209);\r\n }\r\n`;\r\n\r\nconst VertDivider = styled.div`\r\n border-left: 1px solid #e0e0e0;\r\n height: 100px;\r\n margin-left: 20px;\r\n margin-right: 20px;\r\n`;\r\n\r\n// #endregion\r\n\r\nconst translateCardType = (issuer: string): string => {\r\n switch (issuer) {\r\n case 'visa':\r\n return 'VISA';\r\n case 'mastercard':\r\n return 'MC';\r\n case 'amex':\r\n return 'AMEX';\r\n case 'dinersclub':\r\n return 'DINE';\r\n case 'discover':\r\n return 'DISC';\r\n default:\r\n return '';\r\n }\r\n};\r\n\r\nconst ANNUAL_SUPPORT_ID = 36;\r\nconst ANNUAL_SUPPORT_NAME = 'Annual Support and Updates';\r\nconst SITE_LICENSE = -1;\r\nconst ENTERPRISE_LICENSE = -2;\r\nconst UNLIMITED_LICENSE = -5;\r\nconst ANNUAL_SUPPORT_GENERAL = 15.0;\r\nconst ANNUAL_SUPPORT_SITE = 399.0;\r\nconst ANNUAL_SUPPORT_ENTERPRISE = 799.0;\r\nconst ANNUAL_SUPPORT_UNLIMITED = 499.0;\r\n\r\ninterface FormData {\r\n email: string;\r\n firstName: string;\r\n lastName: string;\r\n company: string;\r\n address: string;\r\n city: string;\r\n state: string;\r\n zip: string;\r\n phone: string;\r\n}\r\nfunction emptyFormData(): FormData {\r\n return {\r\n email: '',\r\n firstName: '',\r\n lastName: '',\r\n company: '',\r\n address: '',\r\n city: '',\r\n state: '',\r\n zip: '',\r\n phone: '',\r\n };\r\n}\r\nfunction emptyPaypalData(): PaypalData {\r\n return {\r\n firstName: '',\r\n lastName: '',\r\n address: '',\r\n city: '',\r\n zip: '',\r\n country: '',\r\n state: '',\r\n email: '',\r\n phone: '',\r\n phone_a: '',\r\n phone_b: '',\r\n phone_c: '',\r\n };\r\n}\r\n\r\nfunction removePrefix(str, prefix) {\r\n if (str.startsWith(prefix)) {\r\n return str.slice(prefix.length);\r\n }\r\n return str;\r\n}\r\ninterface DiscountFormData {\r\n discountCode: string;\r\n}\r\n\r\ninterface PaypalData {\r\n firstName: string;\r\n lastName: string;\r\n address: string;\r\n city: string;\r\n zip: string;\r\n country: string;\r\n state: string;\r\n email: string;\r\n phone: string;\r\n phone_a: string;\r\n phone_b: string;\r\n phone_c: string;\r\n}\r\n\r\nexport const CartCheckout = () => {\r\n const [openDialog, setOpenDialog] = useState(false);\r\n const [dialogTitle, setDialogTitle] = useState('');\r\n const [openInvoiceDialog, setOpenInvoiceDialog] = useState(false);\r\n const [openBlacklistedDialog, setOpenBlacklistedDialog] = useState(false);\r\n const [openMonerisDialog, setOpenMonerisDialog] = useState(false);\r\n const [openPaypalDialog, setOpenPaypalDialog] = useState(false);\r\n const [openPromoDialog, setOpenPromoDialog] = useState(false);\r\n const [acceptedTerms, setAcceptedTerms] = useState(false);\r\n const [invoiceDisabled, setInvoiceDisabled] = useState(false);\r\n const [failMessage, setFailMessage] = useState('');\r\n const [toastState, setToastState] = useState<IToastState>(defaultToastState);\r\n const [inProgress, setInProgress] = useState<boolean>(false);\r\n\r\n const [searchParams] = useSearchParams();\r\n const navigate = useNavigate();\r\n const isMounted = useMounted();\r\n\r\n const [productInfo, setProductInfo] = useState<CartProductResponse | null>(null);\r\n const [products, setProducts] = useState<CartProduct[]>([]);\r\n const [upgraded, setUpgraded] = useState<boolean>(false);\r\n const [total, setTotal] = useState<number>(0);\r\n const [subtotal, setSubtotal] = useState<number>(0);\r\n const [pid, setPid] = useState<number>(0);\r\n const [discount, setDiscount] = useState<number>(0); // current discount (main or promo product)\r\n const [mainDiscount, setMainDiscount] = useState<number>(0); // main product discount saved (if discount code applied)\r\n const [discountCode, setDiscountCode] = useState<string>('');\r\n const [reseller, setReseller] = useState<number>(0);\r\n const [taxes, setTaxes] = useState<Tax[]>([]);\r\n const [gst, setGst] = useState<number>(0);\r\n const [pst, setPst] = useState<number>(0);\r\n\r\n const [paypalInfo, setPaypalInfo] = useState<CartPaypalInfo | null>(null);\r\n const [billing] = useState<FormData | null>(emptyFormData());\r\n const [countries, setCountries] = useState<Country[]>([]);\r\n const [country, setCountry] = useState<string>('');\r\n const [canadaProvince, setCanadaProvince] = useState<number>(0);\r\n const [usaState, setUsaState] = useState<number>(0);\r\n\r\n const [paypalData, setPaypalData] = useState<PaypalData>(emptyPaypalData());\r\n const [gotoHome, setGotoHome] = useState<boolean>(false);\r\n\r\n const { handleSubmit, control, watch } = useForm<FormData>();\r\n const paypalWatch = {\r\n firstName: watch('firstName'),\r\n lastName: watch('lastName'),\r\n address: watch('address'),\r\n city: watch('city'),\r\n zip: watch('zip'),\r\n state: watch('state'),\r\n email: watch('email'),\r\n phone: watch('phone'),\r\n };\r\n\r\n const { handleSubmit: handleSubmitPayPal } = useForm<PaypalData>();\r\n const {\r\n register: registerForm1,\r\n handleSubmit: handleSubmitForm1,\r\n formState: { errors: errorsForm1 },\r\n } = useForm<DiscountFormData>();\r\n\r\n const onPromoInfoClick = () => {\r\n setOpenPromoDialog(true);\r\n };\r\n\r\n const showError = (message: string) => {\r\n setFailMessage(message);\r\n setOpenDialog(true);\r\n setInProgress(false);\r\n setGotoHome(true);\r\n };\r\n\r\n const onSubmitDiscountForm = async (data) => {\r\n if (data.discountCode) {\r\n // apply discount code not only to main product but also to promo product whatever is currently in the cart\r\n const fetchedDiscount: CartDiscount = await cartService.getDiscount(\r\n subtotal,\r\n data.discountCode,\r\n products[0].productId,\r\n products[0].licenseId,\r\n products[0].qty\r\n );\r\n if (fetchedDiscount.discount === 0) {\r\n setToastState({ open: true, status: 'error', message: 'Failed to apply discount code' });\r\n } else {\r\n setToastState({ open: true, status: 'success', message: 'Discount code applied' });\r\n }\r\n setDiscount(fetchedDiscount.discount);\r\n setDiscountCode(data.discountCode);\r\n setMainDiscount(fetchedDiscount.discount); // save main product discount for later\r\n setReseller(fetchedDiscount.resellerId);\r\n const tax = calcTax(subtotal - fetchedDiscount.discount, country, canadaProvinces[canadaProvince].short);\r\n calcTotal(products, fetchedDiscount.discount, tax);\r\n }\r\n };\r\n const [cardNumber, setCardNumber] = useState<string>('');\r\n const [expiry, setExpiry] = useState<string>('');\r\n const [cvc, setCvc] = useState<string>('');\r\n const [focused, setFocused] = useState<string>('');\r\n const [issuer, setIssuer] = useState<string>('');\r\n\r\n const [paypalTag, setPaypalTag] = useState<string>('');\r\n const [paypalName, setPaypalName] = useState<string>('');\r\n const [paypalAmount, setPaypalAmount] = useState<string>('');\r\n const refSubmitButtom = useRef<HTMLButtonElement>(null);\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n const pid = parseInt(searchParams.get('pid'), 10);\r\n const lic = parseInt(searchParams.get('lic'), 10);\r\n const qty = parseInt(searchParams.get('qty'), 10);\r\n if (isNaN(pid) || isNaN(lic) || isNaN(qty) || (lic < 0 && qty > 1)) {\r\n showError('Invalid product parameters');\r\n }\r\n setPid(pid);\r\n\r\n const response = await cartService.getProduct(pid, lic, qty);\r\n if (!response.ok) {\r\n showError(response.message);\r\n }\r\n const fetchedProductInfo = response.body;\r\n setProductInfo(fetchedProductInfo);\r\n const fetchedCountries: Country[] = await resellerService.getCountries();\r\n if (isMounted()) {\r\n const DEFAULT_SUPPORT_QTY = 0;\r\n const newProducts = [\r\n fetchedProductInfo,\r\n calculatedSupport(fetchedProductInfo, DEFAULT_SUPPORT_QTY, false),\r\n ];\r\n calcTotal(newProducts, discount, gst + pst);\r\n setProducts(newProducts);\r\n setCountries(fetchedCountries);\r\n setCountry('US');\r\n }\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n }, [isMounted]);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, []);\r\n\r\n // supportQty - 0: 1 year, 1: 2 years, 2: 3 years, 4: 5 years, 9: 10 years, 15: lifetime\r\n // supportQty - how many EXTRA years of support to add\r\n // price depends on the license type and qty of product (as well as promo product)\r\n const calculatedSupport = (\r\n productInfo: CartProductResponse,\r\n supportQty: number,\r\n upgraded: boolean\r\n ): CartProduct => {\r\n let supportPrice = 0;\r\n switch (productInfo.licenseId) {\r\n case SITE_LICENSE:\r\n supportPrice = ANNUAL_SUPPORT_SITE;\r\n break;\r\n case ENTERPRISE_LICENSE:\r\n supportPrice = ANNUAL_SUPPORT_ENTERPRISE;\r\n break;\r\n case UNLIMITED_LICENSE:\r\n supportPrice = ANNUAL_SUPPORT_UNLIMITED;\r\n break;\r\n default:\r\n supportPrice = ANNUAL_SUPPORT_GENERAL;\r\n break;\r\n }\r\n if (upgraded) {\r\n supportPrice = supportPrice * productInfo.promoQty;\r\n } else {\r\n supportPrice = supportPrice * productInfo.qty;\r\n }\r\n const supportProduct: CartProduct = {\r\n productId: ANNUAL_SUPPORT_ID,\r\n productName: ANNUAL_SUPPORT_NAME,\r\n licenseId: productInfo.licenseId,\r\n licenseName: productInfo.licenseName,\r\n price: supportPrice,\r\n qty: supportQty,\r\n amount: supportPrice * supportQty,\r\n };\r\n return supportProduct;\r\n };\r\n\r\n const calcTotal = (products: CartProduct[], discount: number, tax: number): void => {\r\n let total = 0;\r\n let subtotal = 0;\r\n products.forEach((product) => {\r\n subtotal += product.amount;\r\n });\r\n const beforeTaxes = subtotal - discount;\r\n total = beforeTaxes + tax;\r\n setTotal(total);\r\n setSubtotal(subtotal);\r\n };\r\n\r\n // #region handlers\r\n const handleSupportChange = (event) => {\r\n const newProducts = [...products];\r\n const supportIdx = newProducts.findIndex((item) => item.productId === ANNUAL_SUPPORT_ID);\r\n newProducts[supportIdx].qty = event.target.value;\r\n newProducts[supportIdx].amount = newProducts[supportIdx].price * newProducts[supportIdx].qty;\r\n setProducts(newProducts);\r\n const newSubtotal = newProducts.reduce((acc, item) => acc + item.amount, 0);\r\n const tax = calcTax(newSubtotal - discount, country, canadaProvinces[canadaProvince].short);\r\n calcTotal(newProducts, discount, tax);\r\n };\r\n\r\n const handleCallback = ({ issuer }, isValid) => {\r\n if (isValid) {\r\n setIssuer(issuer);\r\n } else {\r\n setIssuer('');\r\n }\r\n };\r\n\r\n const handleInputFocus = ({ target }) => {\r\n setFocused(target.name);\r\n };\r\n\r\n const handleInputChange = ({ target }) => {\r\n if (target.name === 'number') {\r\n target.value = formatCreditCardNumber(target.value);\r\n setCardNumber(target.value);\r\n } else if (target.name === 'expiry') {\r\n target.value = formatExpirationDate(expiry, target.value);\r\n setExpiry(target.value);\r\n } else if (target.name === 'cvc') {\r\n target.value = formatCVC(target.value, cardNumber);\r\n setCvc(target.value);\r\n } else if (target.name === 'memo') {\r\n }\r\n };\r\n\r\n const triggerSubmit = () => {\r\n refSubmitButtom?.current?.click();\r\n };\r\n\r\n const onSubmitPaypal = async (data) => {\r\n // can be called from PayPal dialog or from Blacklist dialog\r\n setOpenPaypalDialog(false);\r\n setOpenBlacklistedDialog(false);\r\n setOpenMonerisDialog(false);\r\n\r\n const fetchedPaypalInfo: CartPaypalInfo = await cartService.getPaypalInfo(`${pid},${ANNUAL_SUPPORT_ID}`);\r\n setPaypalInfo(fetchedPaypalInfo);\r\n\r\n // check if zip code is valid for US, because Paypal freezes if US zip code is invalid; for other countries it's not a problem\r\n // if zip is missing, address, city etc are ignored by Paypal\r\n const zip: string = country === 'US' && !checkZip(paypalWatch.zip) ? '' : paypalWatch.zip;\r\n const state: string =\r\n country === 'CA'\r\n ? canadaProvinces[canadaProvince].short\r\n : country === 'US'\r\n ? usaStatesAndTerritories[usaState].short\r\n : paypalData.state;\r\n\r\n // phone number is split into 3 parts for US; other countries have only one part but area codes are checked by Paypal\r\n let phone_a = '';\r\n let phone_b = '';\r\n let phone_c = '';\r\n\r\n if (country === 'US' && paypalWatch.phone.length === 10) {\r\n phone_a = paypalWatch.phone.substring(0, 3);\r\n phone_b = paypalWatch.phone.substring(3, 6);\r\n phone_c = paypalWatch.phone.substring(6, 10);\r\n } else {\r\n phone_a = paypalWatch.phone;\r\n }\r\n const updatedPaypalData = {\r\n ...paypalWatch,\r\n country: country,\r\n phone_a: phone_a,\r\n phone_b: phone_b,\r\n phone_c: phone_c,\r\n state: state,\r\n zip: zip,\r\n };\r\n setPaypalData(updatedPaypalData);\r\n\r\n let prefix = `${fetchedPaypalInfo.exchangeRate},${fetchedPaypalInfo.ipAddress}`;\r\n if (discount > 0) {\r\n prefix += `,${upgraded ? `UP-${productInfo.productShort}` : discountCode},-${discount.toFixed(2)}`;\r\n } else {\r\n prefix += ',,0.00';\r\n }\r\n let cartStr = '';\r\n let itemName = '';\r\n products.forEach((item, idx) => {\r\n if (item.qty > 0) {\r\n cartStr += `${idx > 0 ? ';' : ''}${item.productId},${item.licenseId},${item.qty},${item.price.toFixed(\r\n 2\r\n )},${item.amount.toFixed(2)},${item.productName}`;\r\n itemName += `${idx > 0 ? ',' : ''}${item.productName}`;\r\n }\r\n });\r\n\r\n const amount = subtotal - discount;\r\n let tag = `${prefix};${cartStr}`;\r\n\r\n setPaypalName(itemName);\r\n setPaypalTag(tag);\r\n setPaypalAmount(amount.toFixed(2));\r\n triggerSubmit();\r\n };\r\n\r\n const onInvoice = () => {\r\n setAcceptedTerms(false);\r\n setInvoiceDisabled(true);\r\n setOpenInvoiceDialog(true);\r\n };\r\n\r\n const onPayPal = () => {\r\n setOpenPaypalDialog(true);\r\n };\r\n\r\n const handleAcceptTerms = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n if (event.target.checked) {\r\n setAcceptedTerms(true);\r\n setInvoiceDisabled(false);\r\n } else {\r\n setAcceptedTerms(false);\r\n setInvoiceDisabled(true);\r\n }\r\n };\r\n\r\n const handleCloseBlacklistedDialog = () => {};\r\n const handleCancelBlacklistedDialog = () => {\r\n setOpenBlacklistedDialog(false);\r\n };\r\n\r\n const handleCloseMonerisDialog = () => {};\r\n const handleCancelMonerisDialog = () => {\r\n setOpenMonerisDialog(false);\r\n };\r\n\r\n const handleCloseInvoiceDialog = () => {};\r\n const handleCancelInvoiceDialog = () => {\r\n setOpenInvoiceDialog(false);\r\n };\r\n\r\n const handleClosePromoDialog = () => {};\r\n const handleCancelPromoDialog = () => {\r\n setOpenPromoDialog(false);\r\n };\r\n\r\n const handleUpgrade = async () => {\r\n setOpenPromoDialog(false);\r\n\r\n // check if product is already in the cart\r\n // const promoExists = products.find((item) => item.productId === productInfo.promoProductId);\r\n if (upgraded) {\r\n setUpgraded(false);\r\n // revert back to original product\r\n const mainProduct: CartProduct = {\r\n productId: productInfo.productId,\r\n productName: productInfo.productName,\r\n licenseId: productInfo.licenseId,\r\n licenseName: productInfo.licenseName,\r\n price: productInfo.price,\r\n qty: productInfo.qty,\r\n amount: productInfo.amount,\r\n };\r\n const newProducts = [...products];\r\n newProducts[0] = mainProduct;\r\n setProducts(newProducts);\r\n const newSubtotal = newProducts.reduce((acc, item) => acc + item.amount, 0);\r\n setSubtotal(newSubtotal);\r\n setDiscount(mainDiscount);\r\n const tax = calcTax(newSubtotal - mainDiscount, country, canadaProvinces[canadaProvince].short);\r\n calcTotal(newProducts, mainDiscount, tax);\r\n } else {\r\n setUpgraded(true);\r\n setDiscount(productInfo.promoDiscount); // replace main product discount (if any) with promo discount\r\n\r\n const promoProduct: CartProduct = {\r\n productId: productInfo.promoProductId,\r\n productName: productInfo.promoProductName,\r\n licenseId: productInfo.promoLicenseId,\r\n licenseName: productInfo.promoLicenseName,\r\n price: productInfo.promoPrice,\r\n qty: productInfo.promoQty,\r\n amount: productInfo.promoAmount,\r\n };\r\n const newProducts = [...products];\r\n // replace main product with promo product\r\n newProducts[0] = promoProduct;\r\n setProducts(newProducts);\r\n const newSubtotal = newProducts.reduce((acc, item) => acc + item.amount, 0);\r\n setSubtotal(newSubtotal);\r\n const tax = calcTax(\r\n newSubtotal - productInfo.promoDiscount,\r\n country,\r\n canadaProvinces[canadaProvince].short\r\n );\r\n calcTotal(newProducts, productInfo.promoDiscount, tax);\r\n }\r\n };\r\n\r\n const onSubmitInvoice = async (data: FormData) => {\r\n setOpenInvoiceDialog(false);\r\n onSubmit(data, true);\r\n };\r\n\r\n const handleCancelPaypalDialog = () => {\r\n setOpenPaypalDialog(false);\r\n };\r\n\r\n const onSubmitCreditCard = async (data: FormData) => {\r\n onSubmit(data, false);\r\n };\r\n\r\n const onSubmit = async (data: FormData, isInvoice: boolean) => {\r\n setInProgress(true);\r\n\r\n let request: CartCheckoutRequest = {\r\n bill_first_name: data.firstName,\r\n bill_last_name: data.lastName,\r\n bill_company: data.company,\r\n bill_address_one: data.address,\r\n bill_city: data.city,\r\n bill_state_or_province:\r\n country === 'CA'\r\n ? canadaProvinces[canadaProvince].long\r\n : country === 'US'\r\n ? usaStatesAndTerritories[usaState].long\r\n : data.state,\r\n bill_country: country,\r\n bill_postal_code: data.zip,\r\n bill_email: data.email,\r\n bill_phone: data.phone,\r\n\r\n credit_card_brand: '',\r\n credit_card_number: '',\r\n expire_month: '',\r\n expire_year: '',\r\n cvv: '',\r\n\r\n bill_amount: total,\r\n discount_amount: discount,\r\n discount_code: upgraded ? 'UP' : discount > 0 ? discountCode : '',\r\n bill_gst: gst,\r\n bill_pst: pst,\r\n comments: upgraded ? productInfo.productShort : '', // used for memo\r\n };\r\n if (reseller > 0) {\r\n request['reseller_id'] = reseller;\r\n }\r\n if (isInvoice) {\r\n request['order_type'] = 'INV';\r\n } else {\r\n request['credit_card_brand'] = translateCardType(issuer);\r\n request['credit_card_number'] = cardNumber.replaceAll(' ', '');\r\n request['expire_month'] = expiry.substr(0, 2);\r\n request['expire_year'] = '20' + expiry.substr(3, 2);\r\n request['cvv'] = cvc;\r\n }\r\n\r\n products.forEach((item, idx) => {\r\n if (item.qty > 0) {\r\n request[`product_id${idx > 0 ? idx : ''}`] = item.productId;\r\n request[`product${idx > 0 ? idx : ''}`] = item.productName;\r\n request[`license${idx > 0 ? idx : ''}`] = item.licenseId;\r\n request[`quantity${idx > 0 ? idx : ''}`] = item.qty;\r\n request[`product_amount${idx > 0 ? idx : ''}`] = item.amount;\r\n }\r\n });\r\n\r\n const response = await cartService.checkout(request);\r\n\r\n if (response == null) {\r\n setDialogTitle('Transaction Failed');\r\n setFailMessage('Server communication error');\r\n setOpenDialog(true);\r\n setInProgress(false);\r\n } else if (!response.status) {\r\n if (response.message === 'Blacklisted') {\r\n setOpenBlacklistedDialog(true);\r\n setInProgress(false);\r\n } else if (response.message === 'moneris problem') {\r\n setOpenMonerisDialog(true);\r\n setInProgress(false);\r\n } else {\r\n setDialogTitle('Transaction Failed');\r\n setFailMessage(response.message);\r\n setOpenDialog(true);\r\n setInProgress(false);\r\n }\r\n } else {\r\n const toast_message = isInvoice ? 'Invoice was successfully created' : 'Payment was successfully processed';\r\n setToastState({ open: true, status: 'success', message: toast_message });\r\n setIssuer('');\r\n setCardNumber('');\r\n setExpiry('');\r\n setCvc('');\r\n setInProgress(false);\r\n window.open(`https://secure.lsoft.net/invoices/${response.order}`, '_blank');\r\n }\r\n };\r\n\r\n const handleCloseSnackbar = (event?: React.SyntheticEvent, reason?: string) => {\r\n if (reason === 'clickaway') {\r\n return;\r\n }\r\n setToastState({ ...toastState, open: false });\r\n };\r\n\r\n const onCountryChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const newCountry = event.target.value;\r\n const tax = calcTax(subtotal - discount, newCountry, canadaProvinces[canadaProvince].short);\r\n calcTotal(products, discount, tax);\r\n setCountry(newCountry);\r\n };\r\n\r\n const onProvinceChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const newProv = event.target.value;\r\n const tax = calcTax(subtotal - discount, country, canadaProvinces[newProv].short);\r\n calcTotal(products, discount, tax);\r\n setCanadaProvince(Number.parseInt(newProv));\r\n };\r\n\r\n const onStateChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setUsaState(Number.parseInt(event.target.value));\r\n };\r\n\r\n const handleCloseDialog = () => {\r\n setOpenDialog(false);\r\n if (gotoHome) {\r\n navigate('/');\r\n }\r\n };\r\n\r\n const calcTax = (beforeTaxes: number, newCountry: string, newProvince: string): number => {\r\n let totalTax = 0;\r\n\r\n if (newCountry === 'CA') {\r\n let _gst = 0;\r\n let _pst = 0;\r\n switch (newProvince) {\r\n case 'AB':\r\n case 'NT':\r\n case 'NU':\r\n case 'YT':\r\n _gst = parseFloat((beforeTaxes * 0.05).toFixed(2));\r\n setTaxes([{ name: 'GST (5%)', amount: _gst }]);\r\n break;\r\n case 'BC':\r\n case 'MB':\r\n _gst = parseFloat((beforeTaxes * 0.05).toFixed(2));\r\n _pst = parseFloat((beforeTaxes * 0.07).toFixed(2));\r\n setTaxes([\r\n { name: 'GST (5%)', amount: _gst },\r\n { name: 'PST (7%)', amount: _pst },\r\n ]);\r\n break;\r\n case 'NB':\r\n case 'NL':\r\n case 'NS':\r\n case 'PE':\r\n _gst = parseFloat((beforeTaxes * 0.05).toFixed(2));\r\n _pst = parseFloat((beforeTaxes * 0.1).toFixed(2));\r\n setTaxes([{ name: 'HST (15%)', amount: _gst + _pst }]);\r\n break;\r\n case 'ON':\r\n _gst = parseFloat((beforeTaxes * 0.05).toFixed(2));\r\n _pst = parseFloat((beforeTaxes * 0.08).toFixed(2));\r\n setTaxes([{ name: 'HST (13%)', amount: _gst + _pst }]);\r\n break;\r\n case 'QC':\r\n _gst = parseFloat((beforeTaxes * 0.05).toFixed(2));\r\n _pst = parseFloat((beforeTaxes * 0.09975).toFixed(2));\r\n setTaxes([\r\n { name: 'GST (5%)', amount: _gst },\r\n { name: 'QST (9.975%)', amount: _pst },\r\n ]);\r\n break;\r\n case 'SK':\r\n _gst = parseFloat((beforeTaxes * 0.05).toFixed(2));\r\n _pst = parseFloat((beforeTaxes * 0.06).toFixed(2));\r\n setTaxes([\r\n { name: 'GST (5%)', amount: _gst },\r\n { name: 'PST (6%)', amount: _pst },\r\n ]);\r\n break;\r\n default:\r\n _gst = parseFloat((beforeTaxes * 0.05).toFixed(2));\r\n setTaxes([{ name: 'GST (5%)', amount: _gst }]);\r\n break;\r\n }\r\n setGst(_gst);\r\n setPst(_pst);\r\n totalTax = _gst + _pst;\r\n } else {\r\n setGst(0);\r\n setPst(0);\r\n setTaxes([]);\r\n totalTax = 0;\r\n }\r\n return totalTax;\r\n };\r\n // #endregion\r\n\r\n return (\r\n <>\r\n <Title title=\"Checkout\" />\r\n <Box\r\n component=\"main\"\r\n sx={{\r\n flexGrow: 1,\r\n py: 3,\r\n }}\r\n >\r\n <Container maxWidth=\"lg\">\r\n <Dialog\r\n open={openDialog}\r\n onClose={handleCloseDialog}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n >\r\n <DialogTitle id=\"alert-dialog-title\">{dialogTitle}</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText id=\"alert-dialog-description\">{failMessage}</DialogContentText>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button onClick={handleCloseDialog} autoFocus>\r\n OK\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n\r\n <Dialog\r\n open={openPromoDialog}\r\n onClose={handleClosePromoDialog}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n >\r\n <DialogContent>\r\n <PromoTitle>Active@ Data Studio</PromoTitle>\r\n <PromoSubtitle>12 disk tools in one package</PromoSubtitle>\r\n <Box sx={{ mt: 2 }}>\r\n {productInfo && productInfo.includedInDataStudio && (\r\n <Typography sx={{ my: 2, mx: 3, fontSize: 12 }}>\r\n <span style={{ fontWeight: 'bold' }}>\r\n Save ${numeral(productInfo.promoSavings).format('0,0.00')}\r\n </span>{' '}\r\n (cost of {productInfo.productName} (included) plus extra $\r\n {numeral(productInfo.promoDiscount).format('0,0.00')} discount off the regular\r\n Data Studio price) by{' '}\r\n <span style={{ fontWeight: 'bold' }}>\r\n upgrading to Active@ Data Studio for $\r\n {numeral(productInfo.promoAmount - productInfo.promoDiscount).format(\r\n '0,0.00'\r\n )}\r\n </span>\r\n .\r\n </Typography>\r\n )}\r\n {productInfo && !productInfo.includedInDataStudio && (\r\n <Typography sx={{ my: 1, fontSize: 13 }}>\r\n <span style={{ fontWeight: 'bold' }}>\r\n Save ${numeral(productInfo.promoSavings).format('0,0.00')}\r\n </span>{' '}\r\n (discount off the regular Data Studio price) by{' '}\r\n <span style={{ fontWeight: 'bold' }}>\r\n upgrading to Active@ Data Studio for $\r\n {numeral(productInfo.promoAmount - productInfo.promoDiscount).format(\r\n '0,0.00'\r\n )}\r\n </span>\r\n .\r\n </Typography>\r\n )}\r\n </Box>\r\n\r\n <Grid container spacing={2} sx={{ padding: '0px' }}>\r\n <Grid item xs={12} sm={6}>\r\n <PromoCard sx={{ backgroundColor: '#f8f9fa' }}>\r\n <PromoProduct>\r\n <img src=\"/static/icons/boot-disk.png\" width=\"40\" alt=\"boot disk\" />\r\n <PromoName>Active@ Boot Disk</PromoName>\r\n <PromoDescr>\r\n Operating system on CD/USB disk. Gives full access to even non-bootable\r\n PC and provides a platform for data recovery tools.\r\n </PromoDescr>\r\n </PromoProduct>\r\n </PromoCard>\r\n </Grid>\r\n\r\n <Grid item xs={12} sm={6}>\r\n <PromoCard sx={{ backgroundColor: '#f8f9fa' }}>\r\n <PromoProduct>\r\n <img src=\"/static/icons/killdisk.png\" width=\"40\" alt=\"killdisk\" />\r\n <PromoName>Active@ KillDisk</PromoName>\r\n <PromoDescr>\r\n Destroy all data on hard disks, excluding any possibility of deleted\r\n files and folders data recovery. Supports more than 20 international\r\n data sanitizing standards.\r\n </PromoDescr>\r\n </PromoProduct>\r\n </PromoCard>\r\n </Grid>\r\n <Grid item xs={12} sm={6}>\r\n <PromoCard sx={{ backgroundColor: '#f8f9fa' }}>\r\n <PromoProduct>\r\n <img src=\"/static/icons/disk-image.png\" width=\"40\" alt=\"backup\" />\r\n <PromoName>Active@ Disk Image</PromoName>\r\n <PromoDescr>\r\n Disk image software that makes an exact copy of any PC disk for backup\r\n purposes.\r\n </PromoDescr>\r\n </PromoProduct>\r\n </PromoCard>\r\n </Grid>\r\n\r\n <Grid item xs={12} sm={6}>\r\n <PromoCard sx={{ backgroundColor: '#f8f9fa' }}>\r\n <PromoProduct>\r\n <img src=\"/static/icons/file-recovery.png\" width=\"40\" alt=\"file recovery\" />\r\n <PromoName>Active@ File Recovery</PromoName>\r\n <PromoDescr>\r\n Restore deleted or lost files, damaged or re-formatted volumes, even if\r\n your PC doesn't boot. Includes advanced disk editor and Virtual RAID\r\n re-constructor.\r\n </PromoDescr>\r\n </PromoProduct>\r\n </PromoCard>\r\n </Grid>\r\n </Grid>\r\n <Typography variant=\"body2\" sx={{ fontSize: 12, fontStyle: 'italic', mt: 2, mb: 2, mx: 3 }}>\r\n Includes{' '}\r\n <PromoLink href=\"https://www.lsoft.net/bootdisk/\" target=\"_blank\">\r\n Active@ Boot Disk\r\n </PromoLink>\r\n ,{' '}\r\n <PromoLink href=\"https://www.lsoft.net/killdisk/\" target=\"_blank\">\r\n Active@ KillDisk\r\n </PromoLink>\r\n ,{' '}\r\n <PromoLink href=\"https://www.lsoft.net/disk-image/\" target=\"_blank\">\r\n Active@ Disk Image\r\n </PromoLink>\r\n ,{' '}\r\n <PromoLink href=\"https://www.lsoft.net/file-recovery/\" target=\"_blank\">\r\n Active@ File Recovery\r\n </PromoLink>\r\n ,{' '}\r\n <PromoLink href=\"https://www.lsoft.net/partition-recovery/\" target=\"_blank\">\r\n Active@ Partition Recovery\r\n </PromoLink>\r\n ,{' '}\r\n <PromoLink href=\"https://www.lsoft.net/undelete/\" target=\"_blank\">\r\n Active@ UNDELETE\r\n </PromoLink>\r\n {', '}\r\n <PromoLink href=\"https://www.lsoft.net/password-changer/\" target=\"_blank\">\r\n Active@ Password Changer\r\n </PromoLink>{' '}\r\n and more...\r\n </Typography>\r\n\r\n <PromoMore>\r\n <a href=\"https://www.lsoft.net/data-studio/\" target=\"_blank\" rel=\"noreferrer\">\r\n Learn more about Data Studio »\r\n </a>\r\n </PromoMore>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button sx={{ mr: 2 }} onClick={handleCancelPromoDialog}>\r\n Cancel\r\n </Button>\r\n <Button sx={{ mr: 2 }} color=\"primary\" variant=\"contained\" onClick={handleUpgrade}>\r\n Upgrade\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n\r\n <Dialog\r\n open={openBlacklistedDialog}\r\n onClose={handleCloseBlacklistedDialog}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n >\r\n <DialogTitle id=\"alert-dialog-title\">Payment pre-processing validation failed</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText id=\"alert-dialog-description\">\r\n To process payment with Credit or Debit Card you will be <b>redirected to PayPal</b>{' '}\r\n where you can select option to pay with Credit/Debit Card as a guest. After successful\r\n payment you will be redirected back here to get an invoice and registration key.\r\n </DialogContentText>\r\n <DialogContentText sx={{ mt: 2 }}>\r\n You can also contact our sales department {settings.phone1} for order processing over\r\n the phone.\r\n </DialogContentText>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button sx={{ mr: 2 }} onClick={handleCancelBlacklistedDialog} autoFocus>\r\n Cancel\r\n </Button>\r\n <form id=\"payment\" onSubmit={handleSubmitPayPal(onSubmitPaypal)}>\r\n <Button sx={{ mr: 2 }} color=\"primary\" variant=\"contained\" type=\"submit\">\r\n OK\r\n </Button>\r\n </form>\r\n </DialogActions>\r\n </Dialog>\r\n\r\n <Dialog\r\n open={openMonerisDialog}\r\n onClose={handleCloseMonerisDialog}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n >\r\n <DialogTitle id=\"alert-dialog-title\">Payment processing failed</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText id=\"alert-dialog-description\">\r\n We experience payment processing issues with our provider. You can try again to process\r\n payment later on, or use PayPal as a credit card payment processor.\r\n </DialogContentText>\r\n <DialogContentText sx={{ mt: 2 }}>\r\n To process payment with Credit or Debit Card you will be <b>redirected to PayPal</b>{' '}\r\n where you can select option to pay with Credit/Debit Card as a guest. After successful\r\n payment you will be redirected back here to get an invoice and registration key.\r\n </DialogContentText>\r\n <DialogContentText sx={{ mt: 2 }}>\r\n You can also contact our sales department {settings.phone1} for order processing over\r\n the phone.\r\n </DialogContentText>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button sx={{ mr: 2 }} onClick={handleCancelMonerisDialog} autoFocus>\r\n Cancel\r\n </Button>\r\n <form id=\"payment\" onSubmit={handleSubmitPayPal(onSubmitPaypal)}>\r\n <Button sx={{ mr: 2 }} color=\"primary\" variant=\"contained\" type=\"submit\">\r\n Use PayPal\r\n </Button>\r\n </form>\r\n </DialogActions>\r\n </Dialog>\r\n\r\n <Dialog\r\n open={openInvoiceDialog}\r\n onClose={handleCloseInvoiceDialog}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n >\r\n <DialogTitle id=\"alert-dialog-title\">Software delivery terms</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText id=\"alert-dialog-description\">\r\n Software download will only be available after invoice has been paid.\r\n </DialogContentText>\r\n <Box sx={{ mt: 2 }}>\r\n <Checkbox\r\n checked={acceptedTerms}\r\n value={acceptedTerms}\r\n color=\"primary\"\r\n onChange={handleAcceptTerms}\r\n />\r\n I agree to software delivery terms\r\n </Box>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button sx={{ mr: 2 }} onClick={handleCancelInvoiceDialog} autoFocus>\r\n Cancel\r\n </Button>\r\n <form id=\"payment\" onSubmit={handleSubmit(onSubmitInvoice)}>\r\n <Button\r\n sx={{ mr: 2 }}\r\n color=\"primary\"\r\n variant=\"contained\"\r\n type=\"submit\"\r\n disabled={invoiceDisabled}\r\n >\r\n OK\r\n </Button>\r\n </form>\r\n </DialogActions>\r\n </Dialog>\r\n\r\n <Dialog\r\n open={openPaypalDialog}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n >\r\n <DialogTitle id=\"alert-dialog-title\">PayPal Payment</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText id=\"alert-dialog-description\">\r\n You will be redirected to PayPal website to process a payment.\r\n </DialogContentText>\r\n <DialogContentText sx={{ mt: 1 }}>\r\n You’ll have options to pay either through your PayPal account or using credit card as a\r\n guest.\r\n </DialogContentText>\r\n <DialogContentText sx={{ mt: 1 }}>\r\n After successful payment you will be redirected back to LSoft’s web site to get an\r\n invoice and software download with registration key.\r\n </DialogContentText>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button sx={{ mr: 2 }} onClick={handleCancelPaypalDialog} autoFocus>\r\n Cancel\r\n </Button>\r\n <form id=\"payment\" onSubmit={handleSubmitPayPal(onSubmitPaypal)}>\r\n <Button sx={{ mr: 2 }} color=\"primary\" variant=\"contained\" type=\"submit\">\r\n OK\r\n </Button>\r\n </form>\r\n </DialogActions>\r\n </Dialog>\r\n\r\n <Snackbar\r\n open={toastState.open}\r\n autoHideDuration={6000}\r\n onClose={handleCloseSnackbar}\r\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\r\n >\r\n <Alert onClose={handleCloseSnackbar} severity={toastState.status}>\r\n {toastState.message}\r\n </Alert>\r\n </Snackbar>\r\n\r\n <Grid container spacing={2}>\r\n <Grid item xs={12}>\r\n <Card>\r\n <CardHeader title=\"Order Summary\" />\r\n <CardContent sx={{ py: 0 }}>\r\n <Scrollbar>\r\n <Box sx={{ minWidth: 700 }}>\r\n <Table>\r\n <TableHead>\r\n <TableRow>\r\n <TableCell>Product</TableCell>\r\n <TableCell>License</TableCell>\r\n <TableCell align=\"right\">Price</TableCell>\r\n <TableCell align=\"right\">Quantity</TableCell>\r\n <TableCell align=\"right\">Amount</TableCell>\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {products.map((product, idx) => (\r\n <TableRow key={idx}>\r\n <TableCell>\r\n {product.productId === ANNUAL_SUPPORT_ID ? (\r\n <FormControl\r\n variant=\"standard\"\r\n sx={{ m: 0, minWidth: 120 }}\r\n >\r\n <Select\r\n id=\"support-select-standard\"\r\n value={product.qty}\r\n onChange={handleSupportChange}\r\n sx={{ fontSize: 14 }}\r\n >\r\n <MenuItem value={0}>\r\n <em>\r\n Annual Support and Updates - 1 year\r\n (INCLUDED)\r\n </em>\r\n </MenuItem>\r\n <MenuItem value={1}>\r\n Annual Support and Updates - 2 years\r\n </MenuItem>\r\n <MenuItem value={2}>\r\n Annual Support and Updates - 3 years\r\n </MenuItem>\r\n <MenuItem value={4}>\r\n Annual Support and Updates - 5 years\r\n </MenuItem>\r\n <MenuItem value={9}>\r\n Annual Support and Updates - 10 years\r\n </MenuItem>\r\n <MenuItem value={15}>\r\n Annual Support and Updates - Lifetime\r\n </MenuItem>\r\n </Select>\r\n </FormControl>\r\n ) : (\r\n product.productName\r\n )}\r\n </TableCell>\r\n <TableCell>\r\n {product.qty > 0 ? product.licenseName : ''}\r\n </TableCell>\r\n <TableCell align=\"right\">\r\n {product.qty > 0\r\n ? '$' + numeral(product.price).format('0,0.00')\r\n : ''}\r\n </TableCell>\r\n <TableCell align=\"right\">\r\n {product.qty > 0 ? product.qty : ''}\r\n </TableCell>\r\n <TableCell align=\"right\">\r\n {product.qty > 0\r\n ? '$' + numeral(product.amount).format('0,0.00')\r\n : ''}\r\n </TableCell>\r\n </TableRow>\r\n ))}\r\n\r\n <TableRow>\r\n <TableCell />\r\n <TableCell />\r\n <TableCell />\r\n <TableCell align=\"right\">\r\n <Typography style={{ fontWeight: 600 }}>\r\n Subtotal\r\n </Typography>\r\n </TableCell>\r\n <TableCell align=\"right\">\r\n <Typography style={{ fontWeight: 600 }}>\r\n ${numeral(subtotal).format('0,0.00')}\r\n </Typography>\r\n </TableCell>\r\n </TableRow>\r\n\r\n {discount > 0 && (\r\n <TableRow>\r\n <TableCell />\r\n <TableCell />\r\n <TableCell />\r\n <TableCell align=\"right\">\r\n <Typography style={{ fontWeight: 600 }}>\r\n Discount\r\n </Typography>\r\n </TableCell>\r\n <TableCell align=\"right\">\r\n <Typography style={{ fontWeight: 600 }}>\r\n -$\r\n {numeral(discount).format('0,0.00')}\r\n </Typography>\r\n </TableCell>\r\n </TableRow>\r\n )}\r\n\r\n {taxes.map((tax, index) => {\r\n return (\r\n <TableRow key={index}>\r\n <TableCell />\r\n <TableCell />\r\n <TableCell />\r\n <TableCell align=\"right\">{tax.name}</TableCell>\r\n <TableCell align=\"right\">\r\n ${numeral(tax.amount).format('0,0.00')}\r\n </TableCell>\r\n </TableRow>\r\n );\r\n })}\r\n\r\n <TableRow>\r\n <TableCell />\r\n <TableCell />\r\n <TableCell />\r\n <TableCell align=\"right\">\r\n <Typography style={{ fontWeight: 600 }}>\r\n Order Total\r\n </Typography>\r\n </TableCell>\r\n <TableCell align=\"right\">\r\n <Typography style={{ fontWeight: 600 }}>\r\n ${numeral(total).format('0,0.00')}\r\n </Typography>\r\n </TableCell>\r\n </TableRow>\r\n </TableBody>\r\n </Table>\r\n\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n alignContent: 'center',\r\n justifyContent: 'space-between',\r\n pt: 2,\r\n }}\r\n >\r\n {true && (\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n alignContent: 'center',\r\n visibility: `${\r\n productInfo && productInfo.showPromo ? '' : 'hidden'\r\n }`,\r\n }}\r\n >\r\n {' '}\r\n <a\r\n href=\"https://www.disktools.com/\"\r\n target=\"_blank\"\r\n rel=\"noreferrer\"\r\n >\r\n <img\r\n src=\"/static/images/datastudio.png\"\r\n width=\"150\"\r\n alt=\"data studio\"\r\n />\r\n </a>\r\n <Box>\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n alignContent: 'center',\r\n }}\r\n >\r\n <PromoDialogLink onClick={onPromoInfoClick}>\r\n <Typography sx={{ fontSize: 20 }}>\r\n Consider Active@ Data Studio Toolkit{' '}\r\n </Typography>{' '}\r\n </PromoDialogLink>\r\n <IconButton\r\n color=\"primary\"\r\n aria-label=\"more info\"\r\n onClick={onPromoInfoClick}\r\n >\r\n <HelpOutlineIcon />\r\n </IconButton>\r\n </Box>\r\n <PromoDialogLink onClick={onPromoInfoClick}>\r\n <Typography\r\n variant=\"overline\"\r\n gutterBottom\r\n sx={{\r\n fontSize: 12,\r\n display: 'block',\r\n lineHeight: '15px',\r\n }}\r\n >\r\n {productInfo && productInfo.includedInDataStudio\r\n ? `${removePrefix(\r\n productInfo.areaProduct,\r\n 'Active@ '\r\n )} plus 11 Disk Tools in One Package!`\r\n : '12 Disk Tools in One Package!'}\r\n </Typography>{' '}\r\n </PromoDialogLink>\r\n </Box>\r\n <Button\r\n variant=\"contained\"\r\n sx={{ m: 5, px: 4 }}\r\n onClick={handleUpgrade}\r\n size=\"large\"\r\n >\r\n {upgraded ? 'UNDO' : 'UPGRADE'}\r\n </Button>\r\n </Box>\r\n )}\r\n\r\n <>\r\n <form onSubmit={handleSubmitForm1(onSubmitDiscountForm)}>\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n alignContent: 'center',\r\n visibility: `${upgraded ? 'hidden' : ''}`,\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n visibility: `${\r\n productInfo && productInfo.showPromo\r\n ? ''\r\n : 'hidden'\r\n }`,\r\n }}\r\n >\r\n <VertDivider> </VertDivider>\r\n </Box>\r\n <TextField\r\n size=\"small\"\r\n label=\"Discount\"\r\n sx={{ width: 150 }}\r\n {...registerForm1('discountCode')}\r\n />\r\n {errorsForm1.discountCode && (\r\n <p>{errorsForm1.discountCode.message}</p>\r\n )}\r\n <Button\r\n sx={{ m: 1 }}\r\n type=\"submit\"\r\n variant=\"contained\"\r\n onClick={onSubmitDiscountForm}\r\n >\r\n Apply\r\n </Button>\r\n </Box>\r\n </form>\r\n </>\r\n </Box>\r\n </Box>\r\n </Scrollbar>\r\n </CardContent>\r\n </Card>\r\n </Grid>\r\n <Grid item md={6} xs={12}>\r\n <Box sx={{ height: '100%' }}>\r\n <Card sx={{ p: 0, height: '100%' }}>\r\n <Box sx={{ p: 3 }}>\r\n <Box sx={{ display: 'flex', alignItems: 'center', mb: 2 }}>\r\n <Typography variant=\"h6\">Billing Information</Typography>\r\n </Box>\r\n\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Controller\r\n name=\"firstName\"\r\n control={control}\r\n defaultValue={billing.firstName}\r\n rules={{\r\n required: 'First Name is required',\r\n maxLength: {\r\n value: 150,\r\n message: 'First Name cannot exceed 150 characters',\r\n },\r\n pattern: {\r\n value: /^[A-Za-zÀ-ž0-9\\s.,:/\\-&()#]+$/,\r\n message: 'Invalid character entered',\r\n },\r\n }}\r\n render={({ field, fieldState: { error } }) => (\r\n <TextField\r\n {...field}\r\n required\r\n label=\"First Name\"\r\n size=\"small\"\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n error={!!error}\r\n helperText={error ? error.message : null}\r\n />\r\n )}\r\n />\r\n </Box>\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n mt: 2,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Controller\r\n name=\"lastName\"\r\n control={control}\r\n defaultValue={billing.lastName}\r\n rules={{\r\n required: 'Last Name is required',\r\n maxLength: {\r\n value: 150,\r\n message: 'Last Name cannot exceed 150 characters',\r\n },\r\n pattern: {\r\n value: /^[A-Za-zÀ-ž0-9\\s.,:/\\-&()#]+$/,\r\n message: 'Invalid character entered',\r\n },\r\n }}\r\n render={({ field, fieldState: { error } }) => (\r\n <TextField\r\n {...field}\r\n required\r\n label=\"Last Name\"\r\n size=\"small\"\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n error={!!error}\r\n helperText={error ? error.message : null}\r\n />\r\n )}\r\n />\r\n </Box>\r\n\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n mt: 2,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Controller\r\n name=\"company\"\r\n control={control}\r\n defaultValue={billing.company}\r\n rules={{\r\n maxLength: {\r\n value: 150,\r\n message: 'Company name cannot exceed 150 characters',\r\n },\r\n pattern: {\r\n value: /^[A-Za-zÀ-ž0-9\\s.,:/\\-&()#]+$/,\r\n message: 'Invalid character entered',\r\n },\r\n }}\r\n render={({ field, fieldState: { error } }) => (\r\n <TextField\r\n {...field}\r\n label=\"Company\"\r\n size=\"small\"\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n error={!!error}\r\n helperText={error ? error.message : null}\r\n />\r\n )}\r\n />\r\n </Box>\r\n\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n mt: 2,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Controller\r\n name=\"address\"\r\n control={control}\r\n defaultValue={billing.address}\r\n rules={{\r\n maxLength: {\r\n value: 150,\r\n message: 'Address cannot exceed 150 characters',\r\n },\r\n pattern: {\r\n value: /^[A-Za-zÀ-ž0-9\\s.,:/\\-&()#]+$/,\r\n message: 'Invalid character entered',\r\n },\r\n }}\r\n render={({ field, fieldState: { error } }) => (\r\n <TextField\r\n {...field}\r\n label=\"Address\"\r\n size=\"small\"\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n error={!!error}\r\n helperText={error ? error.message : null}\r\n />\r\n )}\r\n />\r\n </Box>\r\n\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n mt: 2,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Controller\r\n name=\"city\"\r\n control={control}\r\n defaultValue={billing.city}\r\n rules={{\r\n maxLength: {\r\n value: 150,\r\n message: 'City name cannot exceed 150 characters',\r\n },\r\n pattern: {\r\n value: /^[A-Za-zÀ-ž0-9\\s.,:/\\-&()#]+$/,\r\n message: 'Invalid character entered',\r\n },\r\n }}\r\n render={({ field, fieldState: { error } }) => (\r\n <TextField\r\n {...field}\r\n label=\"City\"\r\n size=\"small\"\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n error={!!error}\r\n helperText={error ? error.message : null}\r\n />\r\n )}\r\n />\r\n </Box>\r\n\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n mt: 2,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Controller\r\n name=\"zip\"\r\n control={control}\r\n defaultValue={billing.zip}\r\n rules={{\r\n maxLength: {\r\n value: 150,\r\n message: 'Zip/postal code cannot exceed 150 characters',\r\n },\r\n pattern: {\r\n value: /^[A-Za-zÀ-ž0-9\\s.,:/\\-&()#]+$/,\r\n message: 'Invalid character entered',\r\n },\r\n }}\r\n render={({ field, fieldState: { error } }) => (\r\n <TextField\r\n {...field}\r\n label=\"Zip / Postal Code\"\r\n size=\"small\"\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n error={!!error}\r\n helperText={error ? error.message : null}\r\n />\r\n )}\r\n />\r\n </Box>\r\n\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n mt: 2,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <TextField\r\n label=\"Country\"\r\n size=\"small\"\r\n select\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n value={country}\r\n onChange={onCountryChange}\r\n >\r\n {countries.map((country, idx) => (\r\n <MenuItem key={idx} value={country.code}>\r\n {country.name}\r\n </MenuItem>\r\n ))}\r\n </TextField>\r\n </Box>\r\n\r\n {country === 'US' && (\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n mt: 2,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <TextField\r\n label=\"State\"\r\n size=\"small\"\r\n select\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n value={usaState}\r\n onChange={onStateChange}\r\n >\r\n {usaStatesAndTerritories.map((state, idx) => (\r\n <MenuItem key={idx} value={idx}>\r\n {state.long}\r\n </MenuItem>\r\n ))}\r\n </TextField>\r\n </Box>\r\n )}\r\n\r\n {country === 'CA' && (\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n mt: 2,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <TextField\r\n label=\"Province\"\r\n size=\"small\"\r\n select\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n value={canadaProvince}\r\n onChange={onProvinceChange}\r\n >\r\n {canadaProvinces.map((prov, idx) => (\r\n <MenuItem key={idx} value={idx}>\r\n {prov.long}\r\n </MenuItem>\r\n ))}\r\n </TextField>\r\n </Box>\r\n )}\r\n\r\n {country !== 'CA' && country !== 'US' && (\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n mt: 2,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Controller\r\n name=\"state\"\r\n control={control}\r\n defaultValue={billing.state}\r\n rules={{\r\n maxLength: {\r\n value: 150,\r\n message:\r\n 'State / Province / Region cannot exceed 150 characters',\r\n },\r\n pattern: {\r\n value: /^[A-Za-zÀ-ž0-9\\s.,:/\\-&()#]+$/,\r\n message: 'Invalid character entered',\r\n },\r\n }}\r\n render={({ field, fieldState: { error } }) => (\r\n <TextField\r\n {...field}\r\n label=\"State / Province / Region\"\r\n size=\"small\"\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n error={!!error}\r\n helperText={error ? error.message : null}\r\n />\r\n )}\r\n />\r\n </Box>\r\n )}\r\n\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n mt: 2,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Controller\r\n name=\"phone\"\r\n control={control}\r\n defaultValue={billing.phone}\r\n rules={{\r\n required: 'Phone is required',\r\n maxLength: {\r\n value: 150,\r\n message: 'Phone cannot exceed 150 characters',\r\n },\r\n pattern: {\r\n value: /^[A-Za-zÀ-ž0-9\\s.,:/\\-&()#]+$/,\r\n message: 'Invalid character entered',\r\n },\r\n }}\r\n render={({ field, fieldState: { error } }) => (\r\n <TextField\r\n {...field}\r\n label=\"Phone\"\r\n size=\"small\"\r\n required\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n error={!!error}\r\n helperText={error ? error.message : null}\r\n />\r\n )}\r\n />\r\n </Box>\r\n\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n mt: 2,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Controller\r\n name=\"email\"\r\n control={control}\r\n defaultValue={billing.email}\r\n rules={{\r\n required: 'Email is required',\r\n maxLength: {\r\n value: 150,\r\n message: 'Email cannot exceed 150 characters',\r\n },\r\n pattern: {\r\n value: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/,\r\n message: 'Invalid email address',\r\n },\r\n }}\r\n render={({ field, fieldState: { error } }) => (\r\n <TextField\r\n {...field}\r\n label=\"Email\"\r\n size=\"small\"\r\n required\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n error={!!error}\r\n helperText={error ? error.message : null}\r\n />\r\n )}\r\n />\r\n </Box>\r\n </Box>\r\n </Card>\r\n </Box>\r\n </Grid>\r\n <Grid item md={6} xs={12}>\r\n <Box sx={{ height: '100%' }}>\r\n <Card sx={{ height: '100%' }}>\r\n <CardContent sx={{ px: 3 }}>\r\n <Box\r\n sx={{\r\n mt: 0,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Box>\r\n <Box sx={{ display: 'flex', alignItems: 'center', mb: 2 }}>\r\n <Typography variant=\"h6\">Pay with </Typography>\r\n <img alt=\"credit cards\" style={{ width: 340 }} src={creditCards} />\r\n </Box>\r\n\r\n <CreditCard\r\n acceptedCards={[\r\n 'visa',\r\n 'mastercard',\r\n 'amex',\r\n 'dinersclub',\r\n 'discover',\r\n ]}\r\n number={cardNumber}\r\n name=\"\"\r\n expiry={expiry}\r\n cvc={cvc}\r\n focused={focused}\r\n callback={handleCallback}\r\n />\r\n </Box>\r\n <Box>\r\n <Grid container columnSpacing={3}>\r\n <Grid item xs={12}>\r\n <TextField\r\n name=\"number\"\r\n value={cardNumber}\r\n required\r\n label=\"Card Number\"\r\n fullWidth\r\n onChange={handleInputChange}\r\n onFocus={handleInputFocus}\r\n sx={{\r\n flexGrow: 1,\r\n mr: 3,\r\n mt: 3,\r\n }}\r\n />\r\n </Grid>\r\n <Grid item md={6} xs={12}>\r\n <TextField\r\n name=\"expiry\"\r\n value={expiry}\r\n required\r\n label=\"Valid Thru (MM/YY)\"\r\n fullWidth\r\n onChange={handleInputChange}\r\n onFocus={handleInputFocus}\r\n sx={{\r\n flexGrow: 1,\r\n mr: 3,\r\n mt: 3,\r\n }}\r\n />\r\n </Grid>\r\n <Grid item md={6} xs={12}>\r\n <TextField\r\n name=\"cvc\"\r\n value={cvc}\r\n label=\"CVC\"\r\n fullWidth\r\n onChange={handleInputChange}\r\n onFocus={handleInputFocus}\r\n sx={{\r\n flexGrow: 1,\r\n mr: 3,\r\n mt: 3,\r\n }}\r\n />\r\n </Grid>\r\n\r\n <Grid item xs={12}>\r\n <form id=\"payment\" onSubmit={handleSubmit(onSubmitCreditCard)}>\r\n <Button\r\n color=\"primary\"\r\n variant=\"contained\"\r\n type=\"submit\"\r\n fullWidth\r\n disabled={!issuer || expiry.length !== 5 || inProgress}\r\n sx={{ mt: 3 }}\r\n >\r\n Pay\r\n </Button>\r\n </form>\r\n\r\n <Divider sx={{ m: 2 }} variant=\"middle\">\r\n OR\r\n </Divider>\r\n\r\n <form\r\n id=\"paypal\"\r\n action=\"https://www.paypal.com/cgi-bin/webscr\"\r\n method=\"post\"\r\n target=\"_new\"\r\n >\r\n {paypalInfo && (\r\n <>\r\n <input type=\"hidden\" name=\"cmd\" value=\"_xclick\" />\r\n <input type=\"hidden\" name=\"charset\" value=\"utf-8\" />\r\n <input\r\n type=\"hidden\"\r\n name=\"business\"\r\n value=\"company@lsoft.net\"\r\n />\r\n <input\r\n type=\"hidden\"\r\n name=\"currency_code\"\r\n value=\"USD\"\r\n />\r\n <input type=\"hidden\" name=\"lc\" value=\"US\" />\r\n <input\r\n name=\"item_name\"\r\n type=\"hidden\"\r\n id=\"item_name\"\r\n value={paypalName}\r\n />\r\n <input\r\n name=\"amount\"\r\n type=\"hidden\"\r\n id=\"amount\"\r\n value={paypalAmount}\r\n />\r\n <input\r\n name=\"custom\"\r\n type=\"hidden\"\r\n id=\"custom\"\r\n value={paypalTag}\r\n />\r\n <input\r\n name=\"invoice\"\r\n type=\"hidden\"\r\n id=\"invoice\"\r\n value={paypalInfo.nextOrderId}\r\n />\r\n <input\r\n type=\"hidden\"\r\n name=\"image_url\"\r\n value=\"https://secure.lsoft.net/images/shop_logo.png\"\r\n />\r\n\r\n <input type=\"hidden\" name=\"no_shipping\" value=\"1\" />\r\n\r\n <input\r\n name=\"first_name\"\r\n type=\"hidden\"\r\n id=\"first_name\"\r\n value={paypalData.firstName}\r\n />\r\n <input\r\n name=\"last_name\"\r\n type=\"hidden\"\r\n id=\"last_name\"\r\n value={paypalData.lastName}\r\n />\r\n <input\r\n name=\"address1\"\r\n type=\"hidden\"\r\n value={paypalData.address}\r\n />\r\n <input name=\"address2\" type=\"hidden\" value=\"\" />\r\n <input\r\n name=\"city\"\r\n type=\"hidden\"\r\n value={paypalData.city}\r\n />\r\n <input\r\n name=\"country\"\r\n type=\"hidden\"\r\n value={paypalData.country}\r\n />\r\n <input\r\n name=\"state\"\r\n type=\"hidden\"\r\n value={paypalData.state}\r\n />\r\n <input\r\n name=\"zip\"\r\n type=\"hidden\"\r\n value={paypalData.zip}\r\n />\r\n <input\r\n name=\"night_phone_a\"\r\n type=\"hidden\"\r\n value={paypalData.phone_a}\r\n />\r\n <input\r\n name=\"night_phone_b\"\r\n type=\"hidden\"\r\n value={paypalData.phone_b}\r\n />\r\n <input\r\n name=\"night_phone_c\"\r\n type=\"hidden\"\r\n value={paypalData.phone_c}\r\n />\r\n </>\r\n )}\r\n <button\r\n hidden={true}\r\n ref={refSubmitButtom}\r\n type={'submit'}\r\n />\r\n </form>\r\n\r\n <form id=\"payment\" onSubmit={handleSubmitPayPal(onPayPal)}>\r\n <PaypalButton variant=\"contained\" fullWidth type=\"submit\">\r\n \r\n </PaypalButton>\r\n </form>\r\n\r\n <Divider sx={{ m: 2 }} variant=\"middle\">\r\n OR\r\n </Divider>\r\n <form id=\"invoice\" onSubmit={handleSubmit(onInvoice)}>\r\n <Button\r\n color=\"primary\"\r\n variant=\"contained\"\r\n type=\"submit\"\r\n fullWidth\r\n disabled={inProgress}\r\n >\r\n Invoice\r\n </Button>\r\n </form>\r\n </Grid>\r\n </Grid>\r\n </Box>\r\n </Box>\r\n </CardContent>\r\n </Card>\r\n </Box>\r\n </Grid>\r\n <Grid item xs={12} sx={{}}>\r\n <Divider />\r\n <Box sx={{ mt: 3, display: 'flex', justifyContent: 'center' }}>\r\n <Typography variant=\"subtitle2\">\r\n Secure payment services provided by{' '}\r\n <Box component=\"span\" fontWeight=\"fontWeightBold\">\r\n Royal Bank of Canada\r\n </Box>{' '}\r\n and{' '}\r\n <Box component=\"span\" fontWeight=\"fontWeightBold\">\r\n LSoft Technologies\r\n </Box>\r\n </Typography>\r\n </Box>\r\n </Grid>\r\n </Grid>\r\n </Container>\r\n </Box>\r\n </>\r\n );\r\n};\r\n","import type { FC } from 'react';\r\nimport { Link as RouterLink, useNavigate } from 'react-router-dom';\r\nimport { AppBar, Box, Button, Divider, Hidden, IconButton, Toolbar, Typography, Stack, Avatar } from '@mui/material';\r\nimport MenuIcon from '@mui/icons-material/Menu';\r\nimport PersonIcon from '@mui/icons-material/Person';\r\nimport { Theme } from '@mui/material/styles';\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { Logo } from '../Logo';\r\nimport { accountService } from '../../account.service';\r\nimport { getInitials } from '../../utils/get-initials';\r\nimport { useTheme } from '@mui/styles';\r\n\r\ninterface DashboardNavbarProps {\r\n onSidebarMobileOpen?: () => void;\r\n}\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n homeLink: {\r\n textDecoration: 'none',\r\n },\r\n })\r\n);\r\n\r\nexport const DashboardNavbar: FC<DashboardNavbarProps> = ({ onSidebarMobileOpen }) => {\r\n const classes = useStyles();\r\n const navigate = useNavigate();\r\n const theme = useTheme();\r\n const account = accountService.getAccount();\r\n\r\n const logout = () => {\r\n accountService.logout();\r\n navigate('/');\r\n };\r\n\r\n return (\r\n <AppBar\r\n elevation={0}\r\n sx={{\r\n backgroundColor: 'primary',\r\n color: 'text.secondary',\r\n }}\r\n >\r\n <Toolbar sx={{ minHeight: 64 }}>\r\n <Hidden lgUp>\r\n <IconButton sx={{ color: 'white' }} onClick={onSidebarMobileOpen} size=\"large\">\r\n <MenuIcon fontSize=\"small\" />\r\n </IconButton>\r\n </Hidden>\r\n <Hidden lgDown>\r\n <RouterLink to=\"/\" className={classes.homeLink}>\r\n <Stack direction=\"row\" spacing={1} sx={{ textDecoration: 'none' }}>\r\n <Logo />\r\n <Typography\r\n sx={{\r\n caretColor: 'rgba(0,0,0,0)',\r\n color: 'white',\r\n whiteSpace: 'nowrap',\r\n textDecoration: 'none',\r\n lineHeight: '40px',\r\n }}\r\n variant=\"h6\"\r\n >\r\n LSoft Technologies\r\n </Typography>\r\n <Typography\r\n sx={{\r\n color: 'white',\r\n whiteSpace: 'nowrap',\r\n fontWeight: 100,\r\n lineHeight: '40px',\r\n }}\r\n variant=\"h6\"\r\n >\r\n | Customer Support\r\n </Typography>\r\n </Stack>\r\n </RouterLink>\r\n </Hidden>\r\n <Box sx={{ flexGrow: 1 }} />\r\n <Avatar\r\n sx={{\r\n height: 42,\r\n mr: 2,\r\n width: 42,\r\n color: theme.palette.primary.main,\r\n bgcolor: 'white',\r\n }}\r\n >\r\n {getInitials(`${account.name}`)}\r\n </Avatar>\r\n <Typography sx={{ color: theme.palette.primary.contrastText, fontWeight: 300 }}>ADMIN</Typography>\r\n\r\n <Divider\r\n orientation=\"vertical\"\r\n sx={{\r\n height: 32,\r\n mx: 2,\r\n backgroundColor: 'white',\r\n }}\r\n />\r\n <Button\r\n sx={{\r\n color: 'white',\r\n marginLeft: 1,\r\n }}\r\n startIcon={<PersonIcon />}\r\n onClick={logout}\r\n >\r\n Sign Out\r\n </Button>\r\n </Toolbar>\r\n </AppBar>\r\n );\r\n};\r\n","import { useEffect } from 'react';\r\nimport type { FC } from 'react';\r\nimport { Link as RouterLink, useLocation } from 'react-router-dom';\r\nimport { Box, Drawer, Hidden } from '@mui/material';\r\nimport ArticleIcon from '@mui/icons-material/Article';\r\nimport CategoryIcon from '@mui/icons-material/Category';\r\nimport SettingsIcon from '@mui/icons-material/Settings';\r\nimport Scrollbar from '../Scrollbar';\r\nimport NavSection from '../NavSection';\r\nimport { Logo } from '../Logo';\r\n\r\ninterface DashboardSidebarProps {\r\n onMobileClose: () => void;\r\n openMobile: boolean;\r\n}\r\n\r\nconst sections = [\r\n {\r\n title: 'Knowledge Base',\r\n items: [\r\n {\r\n title: 'Articles',\r\n path: '/kb/',\r\n icon: <ArticleIcon fontSize=\"small\" />,\r\n },\r\n {\r\n title: 'Categories',\r\n path: '/kb/categories',\r\n icon: <CategoryIcon fontSize=\"small\" />,\r\n },\r\n ],\r\n },\r\n {\r\n title: 'General',\r\n items: [\r\n {\r\n title: 'Settings',\r\n path: '/kb/settings',\r\n icon: <SettingsIcon fontSize=\"small\" />,\r\n },\r\n ],\r\n },\r\n];\r\n\r\nexport const DashboardSidebar: FC<DashboardSidebarProps> = (props) => {\r\n const { onMobileClose, openMobile } = props;\r\n const location = useLocation();\r\n\r\n useEffect(() => {\r\n if (openMobile && onMobileClose) {\r\n onMobileClose();\r\n }\r\n }, [location.pathname]);\r\n\r\n const content = (\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: '100%',\r\n }}\r\n >\r\n <Scrollbar options={{ suppressScrollX: true }}>\r\n <Hidden lgUp>\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n justifyContent: 'center',\r\n p: 2,\r\n }}\r\n >\r\n <RouterLink to=\"/\">\r\n <Logo />\r\n </RouterLink>\r\n </Box>\r\n </Hidden>\r\n <Box sx={{ p: 2 }}>\r\n {sections.map((section) => (\r\n <NavSection\r\n key={section.title}\r\n pathname={location.pathname}\r\n sx={{\r\n '& + &': {\r\n mt: 3,\r\n },\r\n }}\r\n {...section}\r\n />\r\n ))}\r\n </Box>\r\n </Scrollbar>\r\n </Box>\r\n );\r\n\r\n return (\r\n <>\r\n <Drawer\r\n anchor=\"left\"\r\n onClose={onMobileClose}\r\n open={openMobile}\r\n PaperProps={{\r\n sx: {\r\n backgroundColor: 'background.paper',\r\n width: 280,\r\n display: { xs: 'block', lg: 'none' },\r\n },\r\n }}\r\n variant=\"temporary\"\r\n >\r\n {content}\r\n </Drawer>\r\n <Drawer\r\n anchor=\"left\"\r\n open\r\n PaperProps={{\r\n sx: {\r\n backgroundColor: 'background.paper',\r\n height: 'calc(100% - 64px) !important',\r\n top: '64px !Important',\r\n width: 280,\r\n display: { xs: 'none', lg: 'block' },\r\n },\r\n }}\r\n variant=\"persistent\"\r\n >\r\n {content}\r\n </Drawer>\r\n </>\r\n );\r\n};\r\n","import { useState } from 'react';\r\nimport type { FC, ReactNode } from 'react';\r\nimport { Outlet } from 'react-router-dom';\r\nimport { experimentalStyled } from '@mui/material/styles';\r\nimport { DashboardNavbar } from './DashboardNavbar';\r\nimport { DashboardSidebar } from './DashboardSidebar';\r\n\r\ninterface DashboardLayoutProps {\r\n children?: ReactNode;\r\n}\r\n\r\nconst DashboardLayoutRoot = experimentalStyled('div')(({ theme }) => ({\r\n backgroundColor: theme.palette.background.default,\r\n display: 'flex',\r\n height: '100%',\r\n overflow: 'hidden',\r\n width: '100%',\r\n}));\r\n\r\nconst DashboardLayoutWrapper = experimentalStyled('div')(({ theme }) => ({\r\n display: 'flex',\r\n flex: '1 1 auto',\r\n overflow: 'hidden',\r\n paddingTop: '64px',\r\n [theme.breakpoints.up('lg')]: {\r\n paddingLeft: '280px',\r\n },\r\n}));\r\n\r\nconst DashboardLayoutContainer = experimentalStyled('div')({\r\n display: 'flex',\r\n flex: '1 1 auto',\r\n overflow: 'hidden',\r\n});\r\n\r\nconst DashboardLayoutContent = experimentalStyled('div')({\r\n flex: '1 1 auto',\r\n height: '100%',\r\n overflow: 'auto',\r\n position: 'relative',\r\n WebkitOverflowScrolling: 'touch',\r\n});\r\n\r\nexport const DashboardLayout: FC<DashboardLayoutProps> = () => {\r\n const [isSidebarMobileOpen, setIsSidebarMobileOpen] = useState<boolean>(false);\r\n\r\n return (\r\n <DashboardLayoutRoot>\r\n <DashboardNavbar onSidebarMobileOpen={(): void => setIsSidebarMobileOpen(true)} />\r\n <DashboardSidebar\r\n onMobileClose={(): void => setIsSidebarMobileOpen(false)}\r\n openMobile={isSidebarMobileOpen}\r\n />\r\n <DashboardLayoutWrapper>\r\n <DashboardLayoutContainer>\r\n <DashboardLayoutContent>\r\n <Outlet />\r\n </DashboardLayoutContent>\r\n </DashboardLayoutContainer>\r\n </DashboardLayoutWrapper>\r\n </DashboardLayoutRoot>\r\n );\r\n};\r\n","import { createSvgIcon } from '@mui/material/utils';\r\n\r\nconst Plus = createSvgIcon(\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\r\n <path\r\n fillRule=\"evenodd\"\r\n d=\"M10 5a1 1 0 011 1v3h3a1 1 0 110 2h-3v3a1 1 0 11-2 0v-3H6a1 1 0 110-2h3V6a1 1 0 011-1z\"\r\n clipRule=\"evenodd\"\r\n />\r\n </svg>,\r\n 'Plus'\r\n);\r\n\r\nexport default Plus;\r\n","import { createSvgIcon } from '@mui/material/utils';\r\n\r\nconst Lock = createSvgIcon(\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\r\n <path\r\n fillRule=\"evenodd\"\r\n d=\"M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z\"\r\n clipRule=\"evenodd\"\r\n />\r\n </svg>,\r\n 'Lock'\r\n);\r\n\r\nexport default Lock;\r\n","import type { FC, ReactNode } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport type { Theme } from '@mui/material';\r\nimport { experimentalStyled } from '@mui/material/styles';\r\nimport type { SxProps } from '@mui/system';\r\n\r\nexport type LabelColor = 'primary' | 'secondary' | 'error' | 'warning' | 'success';\r\n\r\ninterface LabelProps {\r\n children?: ReactNode;\r\n color?: LabelColor;\r\n style?: {};\r\n sx?: SxProps<Theme>;\r\n}\r\n\r\ninterface LabelRootProps {\r\n styleprops: {\r\n color: string;\r\n };\r\n}\r\n\r\nconst LabelRoot = experimentalStyled('span')<LabelRootProps>(({ theme, styleprops }) => {\r\n const backgroundColor = theme.palette[styleprops.color].main;\r\n const color = theme.palette[styleprops.color].contrastText;\r\n\r\n return {\r\n alignItems: 'center',\r\n backgroundColor,\r\n borderRadius: theme.shape.borderRadius,\r\n color,\r\n cursor: 'default',\r\n display: 'inline-flex',\r\n flexGrow: 0,\r\n flexShrink: 0,\r\n fontFamily:\r\n '-apple-system,BlinkMacSystemFont,\"Segoe UI\",Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"',\r\n fontSize: theme.typography.pxToRem(11),\r\n fontWeight: theme.typography.fontWeightMedium,\r\n justifyContent: 'center',\r\n letterSpacing: 0.5,\r\n minWidth: 20,\r\n paddingBottom: theme.spacing(0.5),\r\n paddingLeft: theme.spacing(1),\r\n paddingRight: theme.spacing(1),\r\n paddingTop: theme.spacing(0.5),\r\n textTransform: 'uppercase',\r\n whiteSpace: 'nowrap',\r\n };\r\n});\r\n\r\nconst Label: FC<LabelProps> = (props) => {\r\n const { color = 'primary', children, ...other } = props;\r\n\r\n const styleProps = { color };\r\n\r\n return (\r\n <LabelRoot styleprops={styleProps} {...other}>\r\n {children}\r\n </LabelRoot>\r\n );\r\n};\r\n\r\nLabel.propTypes = {\r\n children: PropTypes.node,\r\n color: PropTypes.oneOf(['primary', 'secondary', 'error', 'warning', 'success']),\r\n};\r\n\r\nexport default Label;\r\n","import { useState } from 'react';\r\nimport type { ChangeEvent } from 'react';\r\nimport { Link as RouterLink } from 'react-router-dom';\r\nimport { QuestionData } from '../../data';\r\nimport {\r\n Box,\r\n Card,\r\n Checkbox,\r\n Divider,\r\n InputAdornment,\r\n Link,\r\n Tab,\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TablePagination,\r\n TableRow,\r\n Tabs,\r\n TextField,\r\n} from '@mui/material';\r\nimport SearchIcon from '../../icons/Search';\r\nimport LockIcon from '../../icons/Lock';\r\nimport Scrollbar from '../Scrollbar';\r\nimport Label from '../Label';\r\n\r\ntype Status = 'published' | 'draft' | 'archived';\r\n\r\nconst getStatusLabel = (status: Status): JSX.Element => {\r\n const map = {\r\n published: {\r\n color: 'success',\r\n text: 'Published',\r\n },\r\n draft: {\r\n color: 'warning',\r\n text: 'Draft',\r\n },\r\n archived: {\r\n color: 'error',\r\n text: 'Archived',\r\n },\r\n };\r\n\r\n const { text, color }: any = map[status];\r\n\r\n return <Label color={color}>{text}</Label>;\r\n};\r\n\r\ninterface QuestionListTableProps {\r\n questions: QuestionData[];\r\n}\r\n\r\nconst tabs = [\r\n {\r\n label: 'All',\r\n value: 'all',\r\n },\r\n {\r\n label: 'Published',\r\n value: 'published',\r\n },\r\n {\r\n label: 'Drafts',\r\n value: 'drafts',\r\n },\r\n {\r\n label: 'Archived',\r\n value: 'archived',\r\n },\r\n];\r\n\r\nconst applyFilters = (questions: QuestionData[], query: string, filters: any): QuestionData[] => {\r\n query = query.toLowerCase();\r\n return questions.filter((question) => {\r\n let matches = true;\r\n\r\n if (query) {\r\n let containsQuery = false;\r\n if (question.title.toLowerCase().includes(query) || question.labels.toLowerCase().includes(query)) {\r\n containsQuery = true;\r\n }\r\n\r\n if (!containsQuery) {\r\n matches = false;\r\n }\r\n }\r\n\r\n if (filters['published']) {\r\n if (!question.isPublished || question.isArchived) {\r\n matches = false;\r\n }\r\n } else if (filters['drafts']) {\r\n if (question.isPublished || question.isArchived) {\r\n matches = false;\r\n }\r\n } else if (filters['archived']) {\r\n if (!question.isArchived) {\r\n matches = false;\r\n }\r\n }\r\n\r\n return matches;\r\n });\r\n};\r\n\r\nconst applyPagination = (questions: QuestionData[], page: number, limit: number): QuestionData[] =>\r\n questions.slice(page * limit, page * limit + limit);\r\n\r\nexport const QuestionListTable = (props: QuestionListTableProps) => {\r\n const { questions, ...other } = props;\r\n const [currentTab, setCurrentTab] = useState<string>('all');\r\n const [selectedQuestions, setSelectedQuestions] = useState<number[]>([]);\r\n const [page, setPage] = useState<number>(0);\r\n const [limit, setLimit] = useState<number>(5);\r\n const [query, setQuery] = useState<string>('');\r\n const [filters, setFilters] = useState<any>({\r\n published: null,\r\n drafts: null,\r\n archived: null,\r\n });\r\n\r\n const handleTabsChange = (event: ChangeEvent<{}>, value: string): void => {\r\n const updatedFilters = {\r\n published: null,\r\n drafts: null,\r\n archived: null,\r\n };\r\n\r\n if (value !== 'all') {\r\n updatedFilters[value] = true;\r\n }\r\n\r\n setFilters(updatedFilters);\r\n setSelectedQuestions([]);\r\n setCurrentTab(value);\r\n setPage(0);\r\n };\r\n\r\n const handleQueryChange = (event: ChangeEvent<HTMLInputElement>): void => {\r\n setQuery(event.target.value);\r\n setPage(0);\r\n };\r\n\r\n const handleSelectAllQuestions = (event: ChangeEvent<HTMLInputElement>): void => {\r\n setSelectedQuestions(event.target.checked ? questions.map((question) => question.questionId) : []);\r\n };\r\n\r\n const handleSelectOneQuestion = (event: ChangeEvent<HTMLInputElement>, questionId: number): void => {\r\n if (!selectedQuestions.includes(questionId)) {\r\n setSelectedQuestions((prevSelected) => [...prevSelected, questionId]);\r\n } else {\r\n setSelectedQuestions((prevSelected) => prevSelected.filter((id) => id !== questionId));\r\n }\r\n };\r\n\r\n const handlePageChange = (event: any, newPage: number): void => {\r\n setPage(newPage);\r\n };\r\n\r\n const handleLimitChange = (event: ChangeEvent<HTMLInputElement>): void => {\r\n setLimit(parseInt(event.target.value, 10));\r\n setPage(0);\r\n };\r\n\r\n const filteredQuestions = applyFilters(questions, query, filters);\r\n const paginatedQuestions = applyPagination(filteredQuestions, page, limit);\r\n const selectedSomeQuestions = selectedQuestions.length > 0 && selectedQuestions.length < questions.length;\r\n const selectedAllQuestions = selectedQuestions.length === questions.length;\r\n\r\n return (\r\n <Card {...other}>\r\n <Tabs\r\n indicatorColor=\"primary\"\r\n onChange={handleTabsChange}\r\n scrollButtons=\"auto\"\r\n textColor=\"primary\"\r\n value={currentTab}\r\n variant=\"scrollable\"\r\n >\r\n {tabs.map((tab) => (\r\n <Tab key={tab.value} label={tab.label} value={tab.value} />\r\n ))}\r\n </Tabs>\r\n <Divider />\r\n <Box\r\n sx={{\r\n alignItems: 'center',\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n m: -1,\r\n p: 2,\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n m: 1,\r\n maxWidth: '100%',\r\n width: 500,\r\n }}\r\n >\r\n <TextField\r\n fullWidth\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <SearchIcon fontSize=\"small\" />\r\n </InputAdornment>\r\n ),\r\n }}\r\n onChange={handleQueryChange}\r\n placeholder=\"Search articles\"\r\n value={query}\r\n variant=\"outlined\"\r\n />\r\n </Box>\r\n </Box>\r\n <Scrollbar>\r\n <Box sx={{ minWidth: 700 }}>\r\n <Table>\r\n <TableHead>\r\n <TableRow>\r\n <TableCell padding=\"checkbox\">\r\n <Checkbox\r\n checked={selectedAllQuestions}\r\n color=\"primary\"\r\n indeterminate={selectedSomeQuestions}\r\n onChange={handleSelectAllQuestions}\r\n />\r\n </TableCell>\r\n <TableCell>Title</TableCell>\r\n <TableCell>Category</TableCell>\r\n <TableCell>Status</TableCell>\r\n <TableCell>Private</TableCell>\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {paginatedQuestions.map((question) => {\r\n const isQuestionSelected = selectedQuestions.includes(question.questionId);\r\n\r\n return (\r\n <TableRow hover key={question.questionId} selected={isQuestionSelected}>\r\n <TableCell padding=\"checkbox\">\r\n <Checkbox\r\n checked={isQuestionSelected}\r\n color=\"primary\"\r\n onChange={(event) =>\r\n handleSelectOneQuestion(event, question.questionId)\r\n }\r\n value={isQuestionSelected}\r\n />\r\n </TableCell>\r\n <TableCell>\r\n <Box\r\n sx={{\r\n alignItems: 'center',\r\n display: 'flex',\r\n }}\r\n >\r\n <Box>\r\n <Link\r\n color=\"inherit\"\r\n component={RouterLink}\r\n to={`/kb/questions/${question.questionId}`}\r\n >\r\n {question.title}\r\n </Link>\r\n </Box>\r\n </Box>\r\n </TableCell>\r\n <TableCell>{`${question.categoryName ?? ''}`}</TableCell>\r\n <TableCell>\r\n {getStatusLabel(\r\n question.isArchived\r\n ? 'archived'\r\n : question.isPublished\r\n ? 'published'\r\n : 'draft'\r\n )}\r\n </TableCell>\r\n <TableCell>{question.isPublic ? '' : <LockIcon color=\"disabled\" />}</TableCell>\r\n </TableRow>\r\n );\r\n })}\r\n </TableBody>\r\n </Table>\r\n </Box>\r\n </Scrollbar>\r\n <TablePagination\r\n component=\"div\"\r\n count={filteredQuestions.length}\r\n onPageChange={handlePageChange}\r\n onRowsPerPageChange={handleLimitChange}\r\n page={page}\r\n rowsPerPage={limit}\r\n rowsPerPageOptions={[5, 10, 25]}\r\n />\r\n </Card>\r\n );\r\n};\r\n","/** @jsxImportSource @emotion/react */\r\nimport { useEffect } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport { getQuestionsWithFilter } from '../../data';\r\nimport { filteringQuestionsAction, filteredQuestionsAction, AppState } from '../../Store';\r\nimport { Box, Button, Container, Grid, Typography } from '@mui/material';\r\nimport PlusIcon from '../../icons/Plus';\r\nimport { Title } from '../../components/Title';\r\nimport { QuestionListTable } from '../../components/dashboard/QuestionListTable';\r\nimport { accountService, UserRole } from '../../account.service';\r\nimport { Navigate } from 'react-router-dom';\r\n\r\nexport const AdmQuestionList = () => {\r\n const navigate = useNavigate();\r\n const account = accountService.getAccount();\r\n const dispatch = useDispatch();\r\n const questions = useSelector((state: AppState) => state.questions.filtered);\r\n\r\n useEffect(() => {\r\n const doGetQuestions = async () => {\r\n dispatch(filteringQuestionsAction());\r\n const questions = await getQuestionsWithFilter({ search: '' });\r\n dispatch(filteredQuestionsAction(questions));\r\n };\r\n doGetQuestions();\r\n }, []);\r\n\r\n const handleAdd = () => {\r\n navigate('/kb/questions/new');\r\n };\r\n\r\n return (\r\n <>\r\n {(!account || account.role !== UserRole.Admin) && <Navigate to=\"/account/login\" />}\r\n <Title title=\"Articles\" />\r\n <Box\r\n sx={{\r\n backgroundColor: 'background.default',\r\n minHeight: '100%',\r\n py: 8,\r\n }}\r\n >\r\n <Container maxWidth={false}>\r\n <Grid container justifyContent=\"space-between\" spacing={3}>\r\n <Grid item>\r\n <Typography color=\"textPrimary\" variant=\"h5\">\r\n Article List\r\n </Typography>\r\n </Grid>\r\n <Grid item>\r\n <Box sx={{ m: -1 }}>\r\n <Button\r\n color=\"primary\"\r\n startIcon={<PlusIcon fontSize=\"small\" />}\r\n sx={{ m: 1 }}\r\n variant=\"contained\"\r\n onClick={handleAdd}\r\n >\r\n Add Article\r\n </Button>\r\n </Box>\r\n </Grid>\r\n </Grid>\r\n <Box sx={{ mt: 3 }}>\r\n <QuestionListTable questions={questions} />\r\n </Box>\r\n </Container>\r\n </Box>\r\n </>\r\n );\r\n};\r\n","import { useState } from 'react';\r\nimport type { ChangeEvent } from 'react';\r\nimport { Link as RouterLink } from 'react-router-dom';\r\nimport { CategoryData } from '../../data';\r\nimport {\r\n Box,\r\n Card,\r\n Checkbox,\r\n Link,\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TablePagination,\r\n TableRow,\r\n} from '@mui/material';\r\nimport Scrollbar from '../Scrollbar';\r\n\r\ninterface CategoryListTableProps {\r\n categories: CategoryData[];\r\n}\r\n\r\nconst applyPagination = (categories: CategoryData[], page: number, limit: number): CategoryData[] =>\r\n categories.slice(page * limit, page * limit + limit);\r\n\r\nexport const CategoryListTable = (props: CategoryListTableProps) => {\r\n const { categories, ...other } = props;\r\n const [selectedCategories, setSelectedCategories] = useState<number[]>([]);\r\n const [page, setPage] = useState<number>(0);\r\n const [limit, setLimit] = useState<number>(10);\r\n\r\n const handleSelectAllCategories = (event: ChangeEvent<HTMLInputElement>): void => {\r\n setSelectedCategories(event.target.checked ? categories.map((category) => category.categoryId) : []);\r\n };\r\n\r\n const handleSelectOneCategory = (event: ChangeEvent<HTMLInputElement>, categoryId: number): void => {\r\n if (!selectedCategories.includes(categoryId)) {\r\n setSelectedCategories((prevSelected) => [...prevSelected, categoryId]);\r\n } else {\r\n setSelectedCategories((prevSelected) => prevSelected.filter((id) => id !== categoryId));\r\n }\r\n };\r\n\r\n const handlePageChange = (event: any, newPage: number): void => {\r\n setPage(newPage);\r\n };\r\n\r\n const handleLimitChange = (event: ChangeEvent<HTMLInputElement>): void => {\r\n setLimit(parseInt(event.target.value, 10));\r\n setPage(0);\r\n };\r\n\r\n const paginatedCategories = applyPagination(categories, page, limit);\r\n const selectedSomeCategories = selectedCategories.length > 0 && selectedCategories.length < categories.length;\r\n const selectedAllCategories = selectedCategories.length === categories.length;\r\n\r\n return (\r\n <Card {...other}>\r\n <Box\r\n sx={{\r\n alignItems: 'center',\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n m: -1,\r\n p: 2,\r\n }}\r\n ></Box>\r\n <Scrollbar>\r\n <Box sx={{ minWidth: 700 }}>\r\n <Table>\r\n <TableHead>\r\n <TableRow>\r\n <TableCell padding=\"checkbox\">\r\n <Checkbox\r\n checked={selectedAllCategories}\r\n color=\"primary\"\r\n indeterminate={selectedSomeCategories}\r\n onChange={handleSelectAllCategories}\r\n />\r\n </TableCell>\r\n <TableCell>Title</TableCell>\r\n <TableCell>Articles</TableCell>\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {paginatedCategories.map((category) => {\r\n const isCategorySelected = selectedCategories.includes(category.categoryId);\r\n\r\n return (\r\n <TableRow hover key={category.categoryId} selected={isCategorySelected}>\r\n <TableCell padding=\"checkbox\">\r\n <Checkbox\r\n checked={isCategorySelected}\r\n color=\"primary\"\r\n onChange={(event) =>\r\n handleSelectOneCategory(event, category.categoryId)\r\n }\r\n value={isCategorySelected}\r\n />\r\n </TableCell>\r\n <TableCell>\r\n <Box\r\n sx={{\r\n alignItems: 'center',\r\n display: 'flex',\r\n }}\r\n >\r\n <Box>\r\n <Link\r\n color=\"inherit\"\r\n component={RouterLink}\r\n to={`/kb/categories/${category.categoryId}`}\r\n >\r\n {category.name}\r\n </Link>\r\n </Box>\r\n </Box>\r\n </TableCell>\r\n <TableCell>{category.questionCount}</TableCell>\r\n </TableRow>\r\n );\r\n })}\r\n </TableBody>\r\n </Table>\r\n </Box>\r\n </Scrollbar>\r\n <TablePagination\r\n component=\"div\"\r\n count={categories.length}\r\n onPageChange={handlePageChange}\r\n onRowsPerPageChange={handleLimitChange}\r\n page={page}\r\n rowsPerPage={limit}\r\n rowsPerPageOptions={[5, 10, 25]}\r\n />\r\n </Card>\r\n );\r\n};\r\n","/** @jsxImportSource @emotion/react */\r\n// import { css } from '@emotion/react';\r\nimport { useEffect, useState } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { CategoryData, getCategoriesWithCounters } from '../../data';\r\nimport { Box, Button, Container, Grid, Typography } from '@mui/material';\r\nimport PlusIcon from '../../icons/Plus';\r\nimport { Title } from '../../components/Title';\r\nimport { CategoryListTable } from '../../components/dashboard/CategoryListTable';\r\nimport { Navigate } from 'react-router-dom';\r\nimport { accountService, UserRole } from '../../account.service';\r\n\r\nexport const AdmCategoryList = () => {\r\n const navigate = useNavigate();\r\n const account = accountService.getAccount();\r\n const [categories, setCategories] = useState<CategoryData[]>([]);\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n const doGetCategories = async () => {\r\n const fetchedCategories = await getCategoriesWithCounters();\r\n if (!cancelled) {\r\n setCategories(fetchedCategories);\r\n }\r\n };\r\n doGetCategories();\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, []);\r\n\r\n const handleAdd = () => {\r\n navigate('/kb/categories/new');\r\n };\r\n\r\n return (\r\n <>\r\n {(!account || account.role !== UserRole.Admin) && <Navigate to=\"/account/login\" />}\r\n <Title title=\"Categories\" />\r\n <Box\r\n sx={{\r\n backgroundColor: 'background.default',\r\n minHeight: '100%',\r\n py: 8,\r\n }}\r\n >\r\n <Container maxWidth={false}>\r\n <Grid container justifyContent=\"space-between\" spacing={3}>\r\n <Grid item>\r\n <Typography color=\"textPrimary\" variant=\"h5\">\r\n Category List\r\n </Typography>\r\n </Grid>\r\n <Grid item>\r\n <Box sx={{ m: -1 }}>\r\n <Button\r\n color=\"primary\"\r\n startIcon={<PlusIcon fontSize=\"small\" />}\r\n sx={{ m: 1 }}\r\n variant=\"contained\"\r\n onClick={handleAdd}\r\n >\r\n Add Category\r\n </Button>\r\n </Box>\r\n </Grid>\r\n </Grid>\r\n <Box sx={{ mt: 3 }}>\r\n <CategoryListTable categories={categories} />\r\n </Box>\r\n </Container>\r\n </Box>\r\n </>\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { useEffect, useState } from 'react';\r\nimport { useParams } from 'react-router';\r\nimport {\r\n Box,\r\n Card,\r\n Button,\r\n Container,\r\n Grid,\r\n Typography,\r\n FormControl,\r\n TextField,\r\n Snackbar,\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogContentText,\r\n DialogTitle,\r\n Alert,\r\n} from '@mui/material';\r\nimport { Title } from '../../components/Title';\r\nimport { CategoryData, getCategory, postCategory, putCategory, deleteCategory } from '../../data';\r\nimport { useForm, Controller, SubmitHandler } from 'react-hook-form';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { IToastState } from '../../components/ToastState';\r\nimport { accountService, UserRole } from '../../account.service';\r\nimport { Navigate } from 'react-router-dom';\r\n\r\ninterface IFormData {\r\n name: string;\r\n icon: string;\r\n description: string;\r\n}\r\n\r\nexport const CategoryDetails = () => {\r\n const { categoryId } = useParams();\r\n const navigate = useNavigate();\r\n const account = accountService.getAccount();\r\n const [category, setCategory] = useState<CategoryData | null>(null);\r\n const [openDialog, setOpenDialog] = useState(false);\r\n\r\n const [toastState, setToastState] = useState<IToastState>({\r\n open: false,\r\n status: 'success',\r\n message: '',\r\n });\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n const doGetCategory = async (categoryId: number) => {\r\n const fetchedCategory = await getCategory(categoryId);\r\n if (!cancelled) {\r\n setCategory(fetchedCategory);\r\n }\r\n };\r\n if (categoryId) {\r\n doGetCategory(Number(categoryId));\r\n } else {\r\n setCategory({\r\n categoryId: 0,\r\n name: '',\r\n icon: '',\r\n description: '',\r\n questionCount: 0,\r\n });\r\n }\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, []);\r\n\r\n const { handleSubmit, control } = useForm<IFormData>();\r\n const onSubmit: SubmitHandler<IFormData> = async (data) => {\r\n let state: IToastState;\r\n\r\n if (category.categoryId === 0) {\r\n const result = await postCategory({\r\n name: data.name,\r\n icon: data.icon,\r\n description: data.description,\r\n });\r\n\r\n if (result) {\r\n state = { open: true, status: 'success', message: 'Category was successfully created' };\r\n } else {\r\n state = { open: true, status: 'error', message: 'Failed to create category' };\r\n }\r\n } else {\r\n const result = await putCategory(Number(categoryId), {\r\n name: data.name,\r\n icon: data.icon,\r\n description: data.description,\r\n });\r\n\r\n if (result) {\r\n state = { open: true, status: 'success', message: 'Category was successfully updated' };\r\n } else {\r\n state = { open: true, status: 'error', message: 'Failed to save category' };\r\n }\r\n }\r\n setToastState(state);\r\n };\r\n\r\n const handleCloseSnackbar = (event?: React.SyntheticEvent, reason?: string) => {\r\n if (reason === 'clickaway') {\r\n return;\r\n }\r\n setToastState({ ...toastState, open: false });\r\n };\r\n\r\n const handleDelete = async () => {\r\n setOpenDialog(false);\r\n const result = await deleteCategory(Number(categoryId));\r\n\r\n if (!result) {\r\n let state: IToastState;\r\n state = { open: true, status: 'error', message: 'Failed to delete category' };\r\n setToastState(state);\r\n } else {\r\n navigate('/kb/categories');\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n {(!account || account.role !== UserRole.Admin) && <Navigate to=\"/account/login\" />}\r\n {category && <Title title={category.name} />}\r\n <Box\r\n sx={{\r\n backgroundColor: 'background.default',\r\n minHeight: '100%',\r\n py: 8,\r\n }}\r\n >\r\n <Dialog\r\n open={openDialog}\r\n onClose={() => setOpenDialog(false)}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n >\r\n <DialogTitle id=\"alert-dialog-title\">{'Delete this category?'}</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText id=\"alert-dialog-description\">\r\n Deleting this category will make all its articles not assigned to a category. Do you want to\r\n continue?\r\n </DialogContentText>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button onClick={() => setOpenDialog(false)}>Cancel</Button>\r\n <Button onClick={handleDelete} autoFocus>\r\n ОК\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n {category && (\r\n <form onSubmit={handleSubmit(onSubmit)}>\r\n <Container maxWidth={false}>\r\n <Snackbar\r\n open={toastState.open}\r\n autoHideDuration={6000}\r\n onClose={handleCloseSnackbar}\r\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\r\n >\r\n <Alert onClose={handleCloseSnackbar} severity={toastState.status}>\r\n {toastState.message}\r\n </Alert>\r\n </Snackbar>\r\n\r\n <Grid container justifyContent=\"space-between\" spacing={3}>\r\n <Grid item lg={8} xl={10} xs={12}>\r\n <Typography color=\"textPrimary\" variant=\"h5\">\r\n {category.categoryId === 0 ? 'Create' : 'Edit'} category\r\n </Typography>\r\n </Grid>\r\n <Grid item lg={4} xl={2} xs={12}>\r\n <FormControl fullWidth>\r\n <Button color=\"primary\" variant=\"contained\" type=\"submit\">\r\n Save\r\n </Button>\r\n </FormControl>\r\n </Grid>\r\n </Grid>\r\n <Card sx={{ mt: 5 }}>\r\n <Box sx={{ p: 3 }}>\r\n <Grid container justifyContent=\"space-between\" spacing={5}>\r\n <Grid item xs={12}>\r\n <Controller\r\n name=\"name\"\r\n control={control}\r\n defaultValue={category.name}\r\n rules={{\r\n required: 'Name is required',\r\n maxLength: {\r\n value: 100,\r\n message: 'Name cannot exceed 100 characters',\r\n },\r\n }}\r\n render={({ field, fieldState: { error } }) => (\r\n <TextField\r\n {...field}\r\n fullWidth\r\n label=\"Name\"\r\n error={!!error}\r\n helperText={error ? error.message : null}\r\n />\r\n )}\r\n />\r\n </Grid>\r\n <Grid item xs={12}>\r\n <Controller\r\n name=\"icon\"\r\n control={control}\r\n defaultValue={category.icon}\r\n rules={{\r\n required: 'Icon is required',\r\n maxLength: {\r\n value: 100,\r\n message: 'Icon cannot exceed 100 characters',\r\n },\r\n }}\r\n render={({ field, fieldState: { error } }) => (\r\n <TextField\r\n {...field}\r\n fullWidth\r\n label=\"Icon\"\r\n error={!!error}\r\n helperText={error ? error.message : null}\r\n />\r\n )}\r\n />\r\n </Grid>\r\n <Grid item xs={12}>\r\n <Controller\r\n name=\"description\"\r\n control={control}\r\n defaultValue={category.description}\r\n rules={{\r\n required: 'Description is required',\r\n maxLength: {\r\n value: 250,\r\n message: 'Description cannot exceed 250 characters',\r\n },\r\n }}\r\n render={({ field, fieldState: { error } }) => (\r\n <TextField\r\n {...field}\r\n fullWidth\r\n label=\"Description\"\r\n error={!!error}\r\n helperText={error ? error.message : null}\r\n />\r\n )}\r\n />\r\n </Grid>\r\n {category.categoryId !== 0 && (\r\n <Grid item>\r\n <Button color=\"secondary\" onClick={() => setOpenDialog(true)}>\r\n Delete category\r\n </Button>\r\n </Grid>\r\n )}\r\n </Grid>\r\n </Box>\r\n </Card>\r\n </Container>\r\n </form>\r\n )}\r\n </Box>\r\n </>\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { useEffect, useState, useRef } from 'react';\r\nimport { useParams } from 'react-router';\r\nimport { attachmentsUrl } from '../../AppSettings';\r\nimport {\r\n Box,\r\n Card,\r\n Button,\r\n Container,\r\n Divider,\r\n Grid,\r\n Typography,\r\n InputLabel,\r\n MenuItem,\r\n Select,\r\n FormControl,\r\n FormControlLabel,\r\n Switch,\r\n TextField,\r\n Snackbar,\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogContentText,\r\n DialogTitle,\r\n Link,\r\n Alert,\r\n} from '@mui/material';\r\nimport DeleteForeverIcon from '@mui/icons-material/DeleteForever';\r\nimport { Title } from '../../components/Title';\r\nimport {\r\n CategoryData,\r\n QuestionData,\r\n getQuestionForEdit,\r\n getCategories,\r\n putQuestion,\r\n postQuestion,\r\n deleteQuestion,\r\n uploadAttachment,\r\n} from '../../data';\r\nimport { Editor } from '@tinymce/tinymce-react';\r\nimport { useForm, Controller, SubmitHandler } from 'react-hook-form';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { tinymceKey } from '../../AppSettings';\r\nimport { accountService, UserRole } from '../../account.service';\r\nimport { Navigate } from 'react-router-dom';\r\n\r\ntype IFormData = {\r\n categoryId: number;\r\n title: string;\r\n labels: string;\r\n content: string;\r\n isPublic: boolean;\r\n isPublished: boolean;\r\n isArchived: boolean;\r\n isPromoted: boolean;\r\n};\r\n\r\ninterface IToastState {\r\n open: boolean;\r\n status: 'error' | 'info' | 'success' | 'warning';\r\n message: string;\r\n}\r\n\r\ninterface IAttachment {\r\n id: number;\r\n fileName: string;\r\n add: boolean;\r\n remove: boolean;\r\n}\r\n\r\nexport const QuestionDetails = () => {\r\n const { questionId } = useParams();\r\n const navigate = useNavigate();\r\n const account = accountService.getAccount();\r\n const [categories, setCategories] = useState<CategoryData[]>([]);\r\n const [question, setQuestion] = useState<QuestionData | null>(null);\r\n const [openDialog, setOpenDialog] = useState(false);\r\n const [updated, setUpdated] = useState<Date>(null);\r\n const editorRef = useRef(null);\r\n const [toastState, setToastState] = useState<IToastState>({\r\n open: false,\r\n status: 'success',\r\n message: '',\r\n });\r\n const [attachments, setAttachments] = useState<IAttachment[]>([]);\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n const doGetCategories = async () => {\r\n const fetchedCategories = await getCategories();\r\n if (!cancelled) {\r\n setCategories(fetchedCategories);\r\n }\r\n };\r\n doGetCategories();\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n const doGetQuestion = async (questionId: number) => {\r\n const fetchedQuestion = await getQuestionForEdit(questionId);\r\n if (!cancelled) {\r\n setQuestion(fetchedQuestion);\r\n setUpdated(fetchedQuestion.updated);\r\n }\r\n };\r\n if (questionId) {\r\n doGetQuestion(Number(questionId));\r\n } else {\r\n setQuestion({\r\n questionId: 0,\r\n categoryId: 0,\r\n categoryName: '',\r\n title: '',\r\n labels: '',\r\n updated: new Date(),\r\n content: '',\r\n isPublic: true,\r\n isPublished: false,\r\n isArchived: false,\r\n isPromoted: false,\r\n });\r\n }\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, [questionId]);\r\n\r\n const { handleSubmit, control } = useForm<IFormData>();\r\n const submitHandler: SubmitHandler<IFormData> = async (data) => {\r\n let state: IToastState;\r\n let content = '';\r\n if (editorRef.current) {\r\n content = editorRef.current.getContent();\r\n if (content.length === 0) {\r\n state = { open: true, status: 'error', message: 'Article content cannot be empty' };\r\n setToastState(state);\r\n return;\r\n }\r\n }\r\n if (question.questionId === 0) {\r\n const result = await postQuestion({\r\n categoryId: Number(data.categoryId),\r\n title: data.title,\r\n content: content,\r\n labels: data.labels,\r\n isPublic: data.isPublic,\r\n isPublished: data.isPublished,\r\n isArchived: data.isArchived,\r\n isPromoted: data.isPromoted,\r\n userId: 1,\r\n });\r\n if (result) {\r\n let attachmentsToAdd = '';\r\n for (let i = 0; i < attachments.length; i++) {\r\n if (attachments[i].add) {\r\n if (attachmentsToAdd.length > 0) {\r\n attachmentsToAdd += ',';\r\n }\r\n attachmentsToAdd += attachments[i].id.toString();\r\n }\r\n }\r\n\r\n // await addAttachments(result.questionId, { attachments: attachmentsToAdd });\r\n\r\n state = { open: true, status: 'success', message: 'Article was successfully created' };\r\n setUpdated(result.updated);\r\n } else {\r\n state = { open: true, status: 'error', message: 'Failed to create article' };\r\n }\r\n } else {\r\n const result = await putQuestion(Number(questionId), {\r\n categoryId: Number(data.categoryId),\r\n title: data.title,\r\n content: content,\r\n labels: data.labels,\r\n isPublic: data.isPublic,\r\n isPublished: data.isPublished,\r\n isArchived: data.isArchived,\r\n isPromoted: data.isPromoted,\r\n userId: 1,\r\n });\r\n if (result) {\r\n state = { open: true, status: 'success', message: 'Article was successfully updated' };\r\n setUpdated(result.updated);\r\n } else {\r\n state = { open: true, status: 'error', message: 'Failed to save article' };\r\n }\r\n }\r\n setToastState(state);\r\n };\r\n\r\n const handleCloseSnackbar = (event?: React.SyntheticEvent, reason?: string) => {\r\n if (reason === 'clickaway') {\r\n return;\r\n }\r\n setToastState({ ...toastState, open: false });\r\n };\r\n\r\n const handleDelete = async () => {\r\n setOpenDialog(false);\r\n const result = await deleteQuestion(Number(questionId));\r\n\r\n if (!result) {\r\n let state: IToastState;\r\n state = { open: true, status: 'error', message: 'Failed to delete article' };\r\n setToastState(state);\r\n } else {\r\n navigate('/kb');\r\n }\r\n };\r\n\r\n // file upload\r\n const hiddenFileInput = React.useRef(null);\r\n const handleUploadClick = (event) => {\r\n hiddenFileInput.current.click();\r\n };\r\n const handleUploadChange = (event) => {\r\n const file = event.target.files[0];\r\n if (file !== undefined) {\r\n const doUpload = async () => {\r\n const attachment = await uploadAttachment(file);\r\n if (attachment === undefined) {\r\n let state: IToastState;\r\n state = { open: true, status: 'error', message: `Failed to upload ${file.name}` };\r\n setToastState(state);\r\n } else {\r\n setAttachments([\r\n ...attachments,\r\n { id: attachment.attachmentId, fileName: attachment.fileName, add: true, remove: false },\r\n ]);\r\n }\r\n };\r\n doUpload();\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n {(!account || account.role !== UserRole.Admin) && <Navigate to=\"/account/login\" />}\r\n {question && <Title title={question.title} />}\r\n <Box\r\n sx={{\r\n backgroundColor: 'background.default',\r\n minHeight: '100%',\r\n py: 3,\r\n }}\r\n >\r\n <Dialog\r\n open={openDialog}\r\n onClose={() => setOpenDialog(false)}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n >\r\n <DialogTitle id=\"alert-dialog-title\">{'Delete this article?'}</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText id=\"alert-dialog-description\">\r\n Are you sure you want to delete this article?\r\n </DialogContentText>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button onClick={() => setOpenDialog(false)}>Cancel</Button>\r\n <Button onClick={handleDelete} autoFocus>\r\n ОК\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n {question && (\r\n <Container maxWidth={false}>\r\n <Snackbar\r\n open={toastState.open}\r\n autoHideDuration={6000}\r\n onClose={handleCloseSnackbar}\r\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\r\n >\r\n <Alert onClose={handleCloseSnackbar} severity={toastState.status}>\r\n {toastState.message}\r\n </Alert>\r\n </Snackbar>\r\n\r\n <Grid container justifyContent=\"space-between\" spacing={3}>\r\n <Grid item lg={8} xl={9} xs={12}>\r\n <Card sx={{ p: 3 }}>\r\n <Box\r\n sx={{\r\n m: 0,\r\n mb: 4,\r\n maxWidth: '100%',\r\n fontSize: 20,\r\n }}\r\n >\r\n <Controller\r\n name=\"title\"\r\n control={control}\r\n defaultValue={question.title}\r\n rules={{\r\n required: 'Title is required',\r\n maxLength: {\r\n value: 4000,\r\n message: 'Title cannot exceed 4000 characters',\r\n },\r\n }}\r\n render={({ field, fieldState: { error } }) => (\r\n <TextField\r\n {...field}\r\n fullWidth\r\n label=\"Title\"\r\n error={!!error}\r\n helperText={error ? error.message : null}\r\n />\r\n )}\r\n />\r\n\r\n <Typography variant=\"overline\">\r\n Last Updated {updated && updated.toLocaleDateString()}{' '}\r\n {updated && updated.toLocaleTimeString()}\r\n </Typography>\r\n </Box>\r\n <Editor\r\n onInit={(evt, editor) => (editorRef.current = editor)}\r\n apiKey={tinymceKey}\r\n initialValue={question.content}\r\n init={{\r\n height: 500,\r\n menubar: false,\r\n plugins: [\r\n 'advlist autolink lists link image charmap print preview anchor',\r\n 'searchreplace visualblocks code fullscreen',\r\n 'insertdatetime media table paste code help wordcount',\r\n 'imagetools code link',\r\n ],\r\n toolbar:\r\n 'undo redo | formatselect | bold italic forecolor | alignleft aligncenter | bullist numlist outdent indent | fullscreen removeformat | link image | code | table tabledelete | tableprops tablerowprops tablecellprops | tableinsertrowbefore tableinsertrowafter tabledeleterow | tableinsertcolbefore tableinsertcolafter tabledeletecol',\r\n }}\r\n onEditorChange={(content, editor) => {}}\r\n />\r\n </Card>\r\n </Grid>\r\n <Grid item lg={4} xl={3} xs={12}>\r\n <Box\r\n sx={{\r\n backgroundColor: 'background.default',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n flexGrow: 1,\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n flexGrow: 1,\r\n overflow: 'auto',\r\n }}\r\n >\r\n <Grid container direction=\"column\" spacing=\"\" sx={{ p: 3 }}>\r\n <Grid item>\r\n <form onSubmit={handleSubmit(submitHandler)}>\r\n <FormControl fullWidth>\r\n <Button color=\"primary\" variant=\"contained\" type=\"submit\">\r\n Save\r\n </Button>\r\n </FormControl>\r\n </form>\r\n </Grid>\r\n <Grid item sx={{ mt: 3 }}>\r\n <Controller\r\n name=\"isPublished\"\r\n control={control}\r\n defaultValue={question.isPublished}\r\n render={({ field }) => (\r\n <FormControlLabel\r\n control={\r\n <Switch\r\n {...field}\r\n color=\"primary\"\r\n defaultChecked={question.isPublished}\r\n />\r\n }\r\n label=\"Published\"\r\n />\r\n )}\r\n />\r\n </Grid>\r\n <Grid item sx={{ mt: 0 }}>\r\n <Controller\r\n name=\"isPublic\"\r\n control={control}\r\n defaultValue={question.isPublic}\r\n render={({ field }) => (\r\n <FormControlLabel\r\n control={\r\n <Switch\r\n {...field}\r\n color=\"primary\"\r\n defaultChecked={question.isPublic}\r\n />\r\n }\r\n label=\"Public\"\r\n />\r\n )}\r\n />\r\n </Grid>\r\n <Grid item sx={{ mt: 2 }}>\r\n <FormControl fullWidth>\r\n <InputLabel htmlFor=\"category-select\">Category</InputLabel>\r\n <Controller\r\n control={control}\r\n name=\"categoryId\"\r\n defaultValue={question.categoryId ?? 0}\r\n render={({ field }) => (\r\n <Select {...field} id=\"category-select\">\r\n <MenuItem key={0} value={0} disabled>\r\n NO CATEGORY\r\n </MenuItem>\r\n {categories.map((category) => (\r\n <MenuItem\r\n key={category.categoryId}\r\n value={category.categoryId}\r\n >\r\n {category.name}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n )}\r\n />\r\n </FormControl>\r\n </Grid>\r\n <Grid item sx={{ mt: 4 }}>\r\n <Controller\r\n name=\"labels\"\r\n control={control}\r\n defaultValue={question.labels}\r\n rules={{\r\n maxLength: {\r\n value: 1000,\r\n message: 'Labels cannot exceed 1000 characters',\r\n },\r\n }}\r\n render={({ field, fieldState: { error } }) => (\r\n <TextField\r\n {...field}\r\n fullWidth\r\n label=\"Labels\"\r\n variant=\"outlined\"\r\n error={!!error}\r\n helperText={error ? error.message : null}\r\n />\r\n )}\r\n />\r\n </Grid>\r\n\r\n <Grid item sx={{ mt: 2 }}>\r\n <Controller\r\n name=\"isPromoted\"\r\n control={control}\r\n defaultValue={question.isPromoted}\r\n render={({ field }) => (\r\n <FormControlLabel\r\n control={\r\n <Switch\r\n {...field}\r\n color=\"primary\"\r\n defaultChecked={question.isPromoted}\r\n />\r\n }\r\n label=\"Promoted\"\r\n />\r\n )}\r\n />\r\n </Grid>\r\n\r\n <Grid item sx={{ mt: 2 }}>\r\n <Typography color=\"textSecondary\" variant=\"subtitle2\" sx={{ mb: 1 }}>\r\n Attachments\r\n </Typography>\r\n {attachments.map((attach) => (\r\n <div key={attach.id}>\r\n <Link\r\n variant=\"body2\"\r\n underline=\"hover\"\r\n href={attachmentsUrl + attach.id + '_' + attach.fileName}\r\n target=\"_blank\"\r\n >\r\n {attach.fileName}\r\n </Link>\r\n <Link\r\n component=\"button\"\r\n variant=\"body2\"\r\n color=\"secondary\"\r\n onClick={() => {}}\r\n >\r\n <DeleteForeverIcon />\r\n </Link>\r\n </div>\r\n ))}\r\n <FormControl>\r\n <Button\r\n color=\"primary\"\r\n variant=\"text\"\r\n onClick={handleUploadClick}\r\n sx={{ mt: 1 }}\r\n >\r\n Upload attachment\r\n </Button>\r\n <input\r\n type=\"file\"\r\n ref={hiddenFileInput}\r\n onChange={handleUploadChange}\r\n style={{ display: 'none' }}\r\n />\r\n </FormControl>\r\n </Grid>\r\n\r\n <Grid item sx={{ mt: 2, pt: 1 }}>\r\n <Divider />\r\n <Controller\r\n name=\"isArchived\"\r\n control={control}\r\n defaultValue={question.isArchived}\r\n render={({ field }) => (\r\n <FormControlLabel\r\n sx={{ my: 2 }}\r\n control={\r\n <Switch\r\n {...field}\r\n color=\"secondary\"\r\n defaultChecked={question.isArchived}\r\n />\r\n }\r\n label=\"Archived\"\r\n />\r\n )}\r\n />\r\n </Grid>\r\n\r\n {question.questionId !== 0 && (\r\n <Grid item>\r\n <Button color=\"secondary\" onClick={() => setOpenDialog(true)}>\r\n Delete article\r\n </Button>\r\n </Grid>\r\n )}\r\n </Grid>\r\n </Box>\r\n </Box>\r\n </Grid>\r\n </Grid>\r\n </Container>\r\n // </form>\r\n )}\r\n </Box>\r\n </>\r\n );\r\n};\r\n","import { Box, Container, Grid, Typography } from '@mui/material';\r\nimport { Title } from '../../components/Title';\r\nimport { accountService, UserRole } from '../../account.service';\r\nimport { Navigate } from 'react-router-dom';\r\n\r\nexport const Settings = () => {\r\n const account = accountService.getAccount();\r\n\r\n return (\r\n <>\r\n {(!account || account.role !== UserRole.Admin) && <Navigate to=\"/account/login\" />}\r\n <Title title=\"Settings\" />\r\n <Box\r\n sx={{\r\n backgroundColor: 'background.default',\r\n minHeight: '100%',\r\n py: 8,\r\n }}\r\n >\r\n <Container maxWidth={false}>\r\n <Grid container justifyContent=\"space-between\" spacing={3}>\r\n <Grid item>\r\n <Typography color=\"textPrimary\" variant=\"h5\">\r\n Settings\r\n </Typography>\r\n </Grid>\r\n </Grid>\r\n <Box sx={{ mt: 3 }}>\r\n <Typography color=\"textSecondary\" variant=\"body2\">\r\n Dashboard settings\r\n </Typography>\r\n </Box>\r\n </Container>\r\n </Box>\r\n </>\r\n );\r\n};\r\n","import { useEffect } from 'react';\r\nimport NProgress from 'nprogress';\r\nimport { Box } from '@mui/material';\r\n\r\nexport const LoadingScreen = () => {\r\n useEffect(() => {\r\n NProgress.start();\r\n return (): void => {\r\n NProgress.done();\r\n };\r\n }, []);\r\n\r\n return (\r\n <Box\r\n sx={{\r\n backgroundColor: 'background.paper',\r\n minHeight: '100%',\r\n }}\r\n />\r\n );\r\n};\r\n","import { FC, useEffect, useState, useCallback, useRef } from 'react';\r\nimport { useLocation, Navigate } from 'react-router';\r\nimport { Title } from '../../components/Title';\r\nimport {\r\n Box,\r\n Card,\r\n CardContent,\r\n Typography,\r\n Grid,\r\n Container,\r\n Divider,\r\n CardHeader,\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TableRow,\r\n useMediaQuery,\r\n Theme,\r\n Button,\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogContentText,\r\n DialogTitle,\r\n TextField,\r\n Snackbar,\r\n Alert,\r\n} from '@mui/material';\r\nimport { useForm } from 'react-hook-form';\r\nimport type { CheckoutInfoResponse } from '../../types/checkout';\r\nimport { accountService, UserRole } from '../../account.service';\r\nimport { clientService } from '../../client.service';\r\nimport { useMounted } from '../../hooks/use-mounted';\r\nimport { Scrollbar } from '../../components/Scrollbar';\r\nimport { PropertyList } from '../../components/PropertyList';\r\nimport { PropertyListItem } from '../../components/PropertyListItem';\r\nimport numeral from 'numeral';\r\nimport CreditCard from 'react-credit-cards';\r\nimport { formatCreditCardNumber, formatExpirationDate, formatCVC } from '../../utils/credit-cards';\r\nimport 'react-credit-cards/es/styles-compiled.css';\r\nimport creditCards from '../../images/credit-cards.png';\r\nimport type { CheckoutRequest } from '../../types/checkout';\r\nimport { styled } from '@mui/material/styles';\r\nimport PaypalImg from '../../images/paypal.svg';\r\nimport { IToastState, defaultToastState } from '../../components/ToastState';\r\nimport Message from '../Message';\r\nimport { settings } from '../../settings';\r\nimport { checkZip } from '../../utils/cart';\r\nimport { CountryNameToCode, shortProvinceOrStateName } from '../../utils/cart';\r\n\r\nconst PaypalButton = styled(Button)(({ theme }) => ({\r\n backgroundColor: '#ffc439',\r\n backgroundImage: `url(${PaypalImg})`,\r\n backgroundRepeat: 'no-repeat',\r\n backgroundPosition: 'center',\r\n}));\r\n\r\nconst translateCardType = (issuer: string): string => {\r\n switch (issuer) {\r\n case 'visa':\r\n return 'VISA';\r\n case 'mastercard':\r\n return 'MC';\r\n case 'amex':\r\n return 'AMEX';\r\n case 'dinersclub':\r\n return 'DINE';\r\n case 'discover':\r\n return 'DISC';\r\n default:\r\n return '';\r\n }\r\n};\r\n\r\ninterface CheckoutProps {\r\n isPublic: boolean;\r\n}\r\n\r\ninterface PaypalData {\r\n firstName: string;\r\n lastName: string;\r\n address: string;\r\n city: string;\r\n zip: string;\r\n country: string;\r\n state: string;\r\n email: string;\r\n phone_a: string;\r\n phone_b: string;\r\n phone_c: string;\r\n}\r\nfunction emptyPaypalData(): PaypalData {\r\n return {\r\n firstName: '',\r\n lastName: '',\r\n address: '',\r\n city: '',\r\n zip: '',\r\n country: '',\r\n state: '',\r\n email: '',\r\n phone_a: '',\r\n phone_b: '',\r\n phone_c: '',\r\n };\r\n}\r\n\r\nconst ANNUAL_SUPPORT_ID = 36;\r\n\r\nexport const Checkout: FC<CheckoutProps> = ({ isPublic }) => {\r\n const location = useLocation();\r\n const account = accountService.getAccount();\r\n const { pid, qty, lic, order, pid_from } = location.state || {};\r\n const isUpgrade = pid_from > 0;\r\n\r\n const smDown = useMediaQuery((theme: Theme) => theme.breakpoints.down('sm'));\r\n const align = smDown ? 'vertical' : 'horizontal';\r\n\r\n const isMounted = useMounted();\r\n const [info, setInfo] = useState<CheckoutInfoResponse | null>(null);\r\n const [openDialog, setOpenDialog] = useState(false);\r\n const [openBlacklistedDialog, setOpenBlacklistedDialog] = useState(false);\r\n const [openMonerisDialog, setOpenMonerisDialog] = useState(false);\r\n const [dialogTitle, setDialogTitle] = useState('');\r\n const [dialogMessage, setDialogMessage] = useState('');\r\n const [dialogFollowLink, setDialogFollowLink] = useState('');\r\n const [toastState, setToastState] = useState<IToastState>(defaultToastState);\r\n const [loadError, setLoadError] = useState<string>(undefined);\r\n\r\n const [cardNumber, setCardNumber] = useState<string>('');\r\n const [expiry, setExpiry] = useState<string>('');\r\n const [cvc, setCvc] = useState<string>('');\r\n const [focused, setFocused] = useState<string>('');\r\n const [issuer, setIssuer] = useState<string>('');\r\n const [inProgress, setInProgress] = useState<boolean>(false);\r\n const { handleSubmit } = useForm<FormData>();\r\n\r\n const [paypalData, setPaypalData] = useState<PaypalData>(emptyPaypalData());\r\n const refPaypalSubmitButton = useRef<HTMLButtonElement>(null);\r\n const { handleSubmit: handleSubmitPayPal } = useForm<PaypalData>();\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n const data = await clientService.getCheckoutInfo(pid, qty, lic, order, isUpgrade, pid_from);\r\n if (isMounted()) {\r\n if (data.ok) {\r\n setInfo(data.body);\r\n } else {\r\n setLoadError(data.message);\r\n }\r\n }\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n }, [isMounted]);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, []);\r\n\r\n const handleCallback = ({ issuer }, isValid) => {\r\n if (isValid) {\r\n setIssuer(issuer);\r\n } else {\r\n setIssuer('');\r\n }\r\n };\r\n\r\n const handleInputFocus = ({ target }) => {\r\n setFocused(target.name);\r\n };\r\n\r\n const handleInputChange = ({ target }) => {\r\n if (target.name === 'number') {\r\n target.value = formatCreditCardNumber(target.value);\r\n setCardNumber(target.value);\r\n } else if (target.name === 'expiry') {\r\n target.value = formatExpirationDate(expiry, target.value);\r\n setExpiry(target.value);\r\n } else if (target.name === 'cvc') {\r\n target.value = formatCVC(target.value, cardNumber);\r\n setCvc(target.value);\r\n }\r\n };\r\n\r\n const onSubmit = async (data) => {\r\n setInProgress(true);\r\n\r\n const request: CheckoutRequest = {\r\n client_id: info.clientId,\r\n credit_card_brand: translateCardType(issuer),\r\n credit_card_number: cardNumber.replaceAll(' ', ''),\r\n expire_month: expiry.substr(0, 2),\r\n expire_year: '20' + expiry.substr(3, 2),\r\n cvv: cvc,\r\n bill_amount: info.total,\r\n bill_gst: info.gst,\r\n bill_pst: info.pst,\r\n discount_code: info.productId === ANNUAL_SUPPORT_ID ? '' : info.orderId,\r\n discount_amount: info.discount,\r\n comments: info.productId === ANNUAL_SUPPORT_ID ? info.orderId : '',\r\n product_id: info.productId,\r\n product: info.productName,\r\n license: info.licenseId,\r\n quantity: info.quantity,\r\n product_amount: info.subtotal,\r\n };\r\n\r\n const response = await clientService.checkout(request);\r\n\r\n if (response == null) {\r\n setDialogTitle('Transaction Failed');\r\n setDialogMessage('Server communication error');\r\n setDialogFollowLink('');\r\n setOpenDialog(true);\r\n setInProgress(false);\r\n } else if (!response.status) {\r\n if (response.message === 'Blacklisted') {\r\n setOpenBlacklistedDialog(true);\r\n setInProgress(false);\r\n } else if (response.message === 'moneris problem') {\r\n setOpenMonerisDialog(true);\r\n setInProgress(false);\r\n } else {\r\n setDialogTitle('Transaction Failed');\r\n setDialogMessage(response.message);\r\n setDialogFollowLink('');\r\n setOpenDialog(true);\r\n setInProgress(false);\r\n }\r\n } else {\r\n setIssuer('');\r\n setCardNumber('');\r\n setExpiry('');\r\n setCvc('');\r\n setInProgress(false);\r\n setDialogTitle('Success');\r\n setDialogMessage('Payment was successfully processed');\r\n setDialogFollowLink(`https://secure.lsoft.net/invoices/${response.order}`);\r\n setOpenDialog(true);\r\n }\r\n };\r\n\r\n const triggerPaypalSubmit = () => {\r\n refPaypalSubmitButton?.current?.click();\r\n };\r\n const onSubmitPaypal = async (data) => {\r\n setOpenBlacklistedDialog(false);\r\n setOpenMonerisDialog(false);\r\n\r\n // check if zip code is valid for US, because Paypal freezes if US zip code is invalid; for other countries it's not a problem\r\n // if zip is missing, address, city etc are ignored by Paypal\r\n const country: string = CountryNameToCode(info.country);\r\n const zip: string = country === 'US' && !checkZip(info.zip) ? '' : info.zip;\r\n const state: string = country === 'CA' || country === 'US' ? shortProvinceOrStateName(info.state) : info.state;\r\n\r\n // phone number is split into 3 parts for US; other countries have only one part but area codes are checked by Paypal\r\n let phone_a = '';\r\n let phone_b = '';\r\n let phone_c = '';\r\n\r\n if (country === 'US' && info.phone.length === 10) {\r\n phone_a = info.phone.substring(0, 3);\r\n phone_b = info.phone.substring(3, 6);\r\n phone_c = info.phone.substring(6, 10);\r\n } else {\r\n phone_a = info.phone;\r\n }\r\n\r\n const updatedPaypalData: PaypalData = {\r\n firstName: info.firstName,\r\n lastName: info.lastName,\r\n address: info.address,\r\n city: info.city,\r\n zip: zip,\r\n country: country,\r\n state: state,\r\n email: info.email,\r\n phone_a: phone_a,\r\n phone_b: phone_b,\r\n phone_c: phone_c,\r\n };\r\n setPaypalData(updatedPaypalData);\r\n\r\n triggerPaypalSubmit();\r\n };\r\n\r\n const onDialogOk = () => {\r\n setOpenDialog(false);\r\n if (dialogFollowLink.length > 0) {\r\n window.open(dialogFollowLink, '_blank');\r\n }\r\n };\r\n\r\n const handleCloseBlacklistedDialog = () => {};\r\n const handleCancelBlacklistedDialog = () => {\r\n setOpenBlacklistedDialog(false);\r\n };\r\n\r\n const handleCloseMonerisDialog = () => {};\r\n const handleCancelMonerisDialog = () => {\r\n setOpenMonerisDialog(false);\r\n };\r\n\r\n const handleCloseSnackbar = (event?: React.SyntheticEvent, reason?: string) => {\r\n if (reason === 'clickaway') {\r\n return;\r\n }\r\n setToastState({ ...toastState, open: false });\r\n };\r\n\r\n if (loadError) {\r\n return <Message title=\"Invalid Request\" message={loadError} />;\r\n }\r\n\r\n return (\r\n <>\r\n {!isPublic && (!account || account.role !== UserRole.Client) && <Navigate to=\"/account/login\" />}\r\n <Title title=\"Checkout\" />\r\n <Box\r\n component=\"main\"\r\n sx={{\r\n flexGrow: 1,\r\n py: 3,\r\n }}\r\n >\r\n <Container maxWidth=\"lg\">\r\n <Dialog\r\n open={openDialog}\r\n onClose={() => setOpenDialog(false)}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n >\r\n <DialogTitle id=\"alert-dialog-title\">{dialogTitle}</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText id=\"alert-dialog-description\">{dialogMessage}</DialogContentText>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button onClick={() => onDialogOk()} autoFocus>\r\n OK\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n\r\n <Dialog\r\n open={openBlacklistedDialog}\r\n onClose={handleCloseBlacklistedDialog}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n >\r\n <DialogTitle id=\"alert-dialog-title\">Payment pre-processing validation failed</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText id=\"alert-dialog-description\">\r\n To process payment with Credit or Debit Card you will be <b>redirected to PayPal</b>{' '}\r\n where you can select option to pay with Credit/Debit Card as a guest. After successful\r\n payment you will be redirected back here to get an invoice and registration key.\r\n </DialogContentText>\r\n <DialogContentText sx={{ mt: 2 }}>\r\n You can also contact our sales department {settings.phone1} for order processing over\r\n the phone.\r\n </DialogContentText>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button sx={{ mr: 2 }} onClick={handleCancelBlacklistedDialog} autoFocus>\r\n Cancel\r\n </Button>\r\n <form id=\"payment\" onSubmit={handleSubmitPayPal(onSubmitPaypal)}>\r\n <Button sx={{ mr: 2 }} color=\"primary\" variant=\"contained\" type=\"submit\">\r\n OK\r\n </Button>\r\n </form>\r\n </DialogActions>\r\n </Dialog>\r\n\r\n <Dialog\r\n open={openMonerisDialog}\r\n onClose={handleCloseMonerisDialog}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n >\r\n <DialogTitle id=\"alert-dialog-title\">Payment processing failed</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText id=\"alert-dialog-description\">\r\n We experience payment processing issues with our provider. You can try again to process\r\n payment later on, or use PayPal as a credit card payment processor.\r\n </DialogContentText>\r\n <DialogContentText sx={{ mt: 2 }}>\r\n To process payment with Credit or Debit Card you will be <b>redirected to PayPal</b>{' '}\r\n where you can select option to pay with Credit/Debit Card as a guest. After successful\r\n payment you will be redirected back here to get an invoice and registration key.\r\n </DialogContentText>\r\n <DialogContentText sx={{ mt: 2 }}>\r\n You can also contact our sales department {settings.phone1} for order processing over\r\n the phone.\r\n </DialogContentText>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button sx={{ mr: 2 }} onClick={handleCancelMonerisDialog} autoFocus>\r\n Cancel\r\n </Button>\r\n <form id=\"payment\" onSubmit={handleSubmitPayPal(onSubmitPaypal)}>\r\n <Button sx={{ mr: 2 }} color=\"primary\" variant=\"contained\" type=\"submit\">\r\n Use PayPal\r\n </Button>\r\n </form>\r\n </DialogActions>\r\n </Dialog>\r\n\r\n <Snackbar\r\n open={toastState.open}\r\n autoHideDuration={6000}\r\n onClose={handleCloseSnackbar}\r\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\r\n >\r\n <Alert onClose={handleCloseSnackbar} severity={toastState.status}>\r\n {toastState.message}\r\n </Alert>\r\n </Snackbar>\r\n\r\n <Grid container spacing={3}>\r\n <Grid item xs={12}>\r\n <Card>\r\n <CardHeader title=\"Order Summary\" />\r\n <CardContent sx={{ py: 0 }}>\r\n <Scrollbar>\r\n <Box sx={{ minWidth: 700 }}>\r\n <Table>\r\n <TableHead>\r\n <TableRow>\r\n <TableCell>Product</TableCell>\r\n <TableCell>License</TableCell>\r\n <TableCell align=\"right\">Price</TableCell>\r\n <TableCell align=\"right\">Quantity</TableCell>\r\n <TableCell align=\"right\">Amount</TableCell>\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n <TableRow>\r\n <TableCell>{info && info.productName}</TableCell>\r\n <TableCell>{info && info.licenseName}</TableCell>\r\n <TableCell align=\"right\">\r\n {info && `$${numeral(info.price).format('0,0.00')}`}\r\n </TableCell>\r\n <TableCell align=\"right\">\r\n {info &&\r\n (info.productId === 36 && info.quantity === 15\r\n ? 'Lifetime'\r\n : info.quantity)}\r\n </TableCell>\r\n <TableCell align=\"right\">\r\n {info && `$${numeral(info.subtotal).format('0,0.00')}`}\r\n </TableCell>\r\n </TableRow>\r\n\r\n {info && info.discount > 0 && (\r\n <>\r\n <TableRow>\r\n <TableCell />\r\n <TableCell />\r\n <TableCell />\r\n <TableCell align=\"right\">Discount</TableCell>\r\n <TableCell align=\"right\">\r\n {info &&\r\n `-$${numeral(info.discount).format('0,0.00')}`}\r\n </TableCell>\r\n </TableRow>\r\n\r\n <TableRow>\r\n <TableCell />\r\n <TableCell />\r\n <TableCell />\r\n <TableCell align=\"right\">Subtotal</TableCell>\r\n <TableCell align=\"right\">\r\n {info &&\r\n `$${numeral(info.subtotalAfterDiscount).format(\r\n '0,0.00'\r\n )}`}\r\n </TableCell>\r\n </TableRow>\r\n </>\r\n )}\r\n\r\n {info &&\r\n info.taxes &&\r\n info.taxes.map((tax, index) => {\r\n return (\r\n <TableRow key={index}>\r\n <TableCell />\r\n <TableCell />\r\n <TableCell />\r\n <TableCell align=\"right\">{tax.name}</TableCell>\r\n <TableCell align=\"right\">\r\n {`$${numeral(tax.amount).format('0,0.00')}`}\r\n </TableCell>\r\n </TableRow>\r\n );\r\n })}\r\n\r\n {info && (\r\n <TableRow>\r\n <TableCell />\r\n <TableCell />\r\n <TableCell />\r\n <TableCell align=\"right\">\r\n <Typography style={{ fontWeight: 600 }}>\r\n Order Total\r\n </Typography>\r\n </TableCell>\r\n <TableCell align=\"right\">\r\n <Typography style={{ fontWeight: 600 }}>\r\n {`US$ ${numeral(info.total).format('0,0.00')}`}{' '}\r\n </Typography>\r\n </TableCell>\r\n </TableRow>\r\n )}\r\n </TableBody>\r\n </Table>\r\n </Box>\r\n </Scrollbar>\r\n </CardContent>\r\n </Card>\r\n </Grid>\r\n <Grid item md={6} xs={12}>\r\n <Box sx={{ height: '100%' }}>\r\n <Card sx={{ height: '100%' }}>\r\n <CardHeader title=\"Billing information\" />\r\n <Divider />\r\n <Box sx={{ px: 3 }}>\r\n <PropertyList>\r\n <PropertyListItem align={align} label=\"Name\">\r\n <Typography color=\"primary\" variant=\"body1\">\r\n {info && `${info.firstName} ${info.lastName}`}\r\n </Typography>\r\n </PropertyListItem>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Company\">\r\n <Typography variant=\"body1\">{info && info.company}</Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Address\">\r\n <Typography variant=\"body1\">{info && info.address}</Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"City\">\r\n <Typography variant=\"body1\">{info && info.city}</Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"State / Province\">\r\n <Typography variant=\"body1\">{info && info.state}</Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Zip / Postal code\">\r\n <Typography variant=\"body1\">{info && info.zip}</Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Country\">\r\n <Typography variant=\"body1\">{info && info.country}</Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Phone\">\r\n <Typography variant=\"body1\">{info && info.phone}</Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Fax\">\r\n <Typography variant=\"body1\">{info && info.fax}</Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Email\">\r\n <Typography variant=\"body1\" color=\"primary\">\r\n {info && info.email}\r\n </Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Original Order ID\">\r\n <Typography variant=\"body1\" color=\"primary\">\r\n {info && info.orderId}\r\n </Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n </PropertyList>\r\n </Box>\r\n </Card>\r\n </Box>\r\n </Grid>\r\n <Grid item md={6} xs={12}>\r\n <Box sx={{ height: '100%' }}>\r\n <Card sx={{ height: '100%' }}>\r\n <CardContent sx={{ px: 3 }}>\r\n <Box\r\n sx={{\r\n mt: 0,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Box>\r\n <Box sx={{ display: 'flex', alignItems: 'center', mb: 2 }}>\r\n <Typography variant=\"h6\">Pay with </Typography>\r\n <img alt=\"credit cards\" style={{ width: 340 }} src={creditCards} />\r\n </Box>\r\n\r\n <CreditCard\r\n acceptedCards={[\r\n 'visa',\r\n 'mastercard',\r\n 'amex',\r\n 'dinersclub',\r\n 'discover',\r\n ]}\r\n number={cardNumber}\r\n name=\"\"\r\n expiry={expiry}\r\n cvc={cvc}\r\n focused={focused}\r\n callback={handleCallback}\r\n />\r\n </Box>\r\n <Box>\r\n <Grid container columnSpacing={3}>\r\n <Grid item xs={12}>\r\n <TextField\r\n name=\"number\"\r\n value={cardNumber}\r\n required\r\n label=\"Card Number\"\r\n fullWidth\r\n onChange={handleInputChange}\r\n onFocus={handleInputFocus}\r\n sx={{\r\n flexGrow: 1,\r\n mr: 3,\r\n mt: 3,\r\n }}\r\n />\r\n </Grid>\r\n <Grid item md={6} xs={12}>\r\n <TextField\r\n name=\"expiry\"\r\n value={expiry}\r\n required\r\n label=\"Valid Thru (MM/YY)\"\r\n fullWidth\r\n onChange={handleInputChange}\r\n onFocus={handleInputFocus}\r\n sx={{\r\n flexGrow: 1,\r\n mr: 3,\r\n mt: 3,\r\n }}\r\n />\r\n </Grid>\r\n <Grid item md={6} xs={12}>\r\n <TextField\r\n name=\"cvc\"\r\n value={cvc}\r\n label=\"CVC\"\r\n fullWidth\r\n onChange={handleInputChange}\r\n onFocus={handleInputFocus}\r\n sx={{\r\n flexGrow: 1,\r\n mr: 3,\r\n mt: 3,\r\n }}\r\n />\r\n </Grid>\r\n\r\n <Grid item xs={12}>\r\n <form id=\"payment\" onSubmit={handleSubmit(onSubmit)}>\r\n <Button\r\n color=\"primary\"\r\n variant=\"contained\"\r\n type=\"submit\"\r\n fullWidth\r\n disabled={!issuer || expiry.length !== 5 || inProgress}\r\n sx={{ mt: 3 }}\r\n >\r\n Pay\r\n </Button>\r\n </form>\r\n <Divider sx={{ m: 3 }} variant=\"middle\">\r\n OR\r\n </Divider>\r\n\r\n <form\r\n action=\"https://www.paypal.com/cgi-bin/webscr\"\r\n method=\"post\"\r\n target=\"_new\"\r\n >\r\n {info && (\r\n <>\r\n <input type=\"hidden\" name=\"cmd\" value=\"_xclick\" />\r\n <input\r\n type=\"hidden\"\r\n name=\"business\"\r\n value=\"company@lsoft.net\"\r\n />\r\n <input\r\n type=\"hidden\"\r\n name=\"currency_code\"\r\n value=\"USD\"\r\n />\r\n <input type=\"hidden\" name=\"lc\" value=\"US\" />\r\n <input\r\n name=\"item_name\"\r\n type=\"hidden\"\r\n id=\"item_name\"\r\n value={info.productName}\r\n />\r\n <input\r\n name=\"amount\"\r\n type=\"hidden\"\r\n id=\"amount\"\r\n value={info.paypalAmount}\r\n />\r\n <input\r\n name=\"custom\"\r\n type=\"hidden\"\r\n id=\"custom\"\r\n value={info.paypalTag}\r\n />\r\n <input\r\n name=\"invoice\"\r\n type=\"hidden\"\r\n id=\"invoice\"\r\n value={info.invoice}\r\n />\r\n\r\n <input\r\n name=\"first_name\"\r\n type=\"hidden\"\r\n id=\"first_name\"\r\n value={paypalData.firstName}\r\n />\r\n <input\r\n name=\"last_name\"\r\n type=\"hidden\"\r\n id=\"last_name\"\r\n value={paypalData.lastName}\r\n />\r\n <input\r\n name=\"address1\"\r\n type=\"hidden\"\r\n value={paypalData.address}\r\n />\r\n <input name=\"address2\" type=\"hidden\" value=\"\" />\r\n <input\r\n name=\"city\"\r\n type=\"hidden\"\r\n value={paypalData.city}\r\n />\r\n <input\r\n name=\"country\"\r\n type=\"hidden\"\r\n value={paypalData.country}\r\n />\r\n <input\r\n name=\"state\"\r\n type=\"hidden\"\r\n value={paypalData.state}\r\n />\r\n <input\r\n name=\"zip\"\r\n type=\"hidden\"\r\n value={paypalData.zip}\r\n />\r\n <input\r\n name=\"night_phone_a\"\r\n type=\"hidden\"\r\n value={paypalData.phone_a}\r\n />\r\n <input\r\n name=\"night_phone_b\"\r\n type=\"hidden\"\r\n value={paypalData.phone_b}\r\n />\r\n <input\r\n name=\"night_phone_c\"\r\n type=\"hidden\"\r\n value={paypalData.phone_c}\r\n />\r\n </>\r\n )}\r\n <button\r\n hidden={true}\r\n ref={refPaypalSubmitButton}\r\n type={'submit'}\r\n />\r\n </form>\r\n\r\n <form\r\n id=\"payment\"\r\n onSubmit={handleSubmitPayPal(onSubmitPaypal)}\r\n >\r\n <PaypalButton variant=\"contained\" fullWidth type=\"submit\">\r\n \r\n </PaypalButton>\r\n </form>\r\n </Grid>\r\n </Grid>\r\n </Box>\r\n </Box>\r\n </CardContent>\r\n </Card>\r\n </Box>\r\n </Grid>\r\n <Grid item xs={12} sx={{}}>\r\n <Divider />\r\n <Box sx={{ mt: 3, display: 'flex', justifyContent: 'center' }}>\r\n <Typography variant=\"subtitle2\">\r\n Secure payment services provided by{' '}\r\n <Box component=\"span\" fontWeight=\"fontWeightBold\">\r\n Royal Bank of Canada\r\n </Box>{' '}\r\n and{' '}\r\n <Box component=\"span\" fontWeight=\"fontWeightBold\">\r\n LSoft Technologies\r\n </Box>\r\n </Typography>\r\n </Box>\r\n </Grid>\r\n </Grid>\r\n </Container>\r\n </Box>\r\n </>\r\n );\r\n};\r\n","import { useEffect, useState, useCallback } from 'react';\r\nimport { useLocation, Navigate } from 'react-router';\r\nimport type { ChangeEvent } from 'react';\r\nimport { Title } from '../../components/Title';\r\nimport {\r\n Box,\r\n Card,\r\n CardContent,\r\n Typography,\r\n Grid,\r\n Container,\r\n Divider,\r\n CardHeader,\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TableRow,\r\n useMediaQuery,\r\n Theme,\r\n Button,\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogContentText,\r\n DialogTitle,\r\n Snackbar,\r\n Alert,\r\n Tabs,\r\n Tab,\r\n TextField,\r\n MenuItem,\r\n Checkbox,\r\n} from '@mui/material';\r\nimport { useForm, Controller } from 'react-hook-form';\r\nimport type { ResellerCheckoutInfo } from '../../types/reseller';\r\nimport { accountService, UserRole } from '../../account.service';\r\nimport { resellerService } from '../../reseller.service';\r\nimport { useMounted } from '../../hooks/use-mounted';\r\nimport { Scrollbar } from '../../components/Scrollbar';\r\nimport { PropertyList } from '../../components/PropertyList';\r\nimport { PropertyListItem } from '../../components/PropertyListItem';\r\nimport numeral from 'numeral';\r\nimport CreditCard from 'react-credit-cards';\r\nimport { formatCreditCardNumber, formatExpirationDate, formatCVC } from '../../utils/credit-cards';\r\nimport 'react-credit-cards/es/styles-compiled.css';\r\nimport creditCards from '../../images/credit-cards.png';\r\nimport { IToastState, defaultToastState } from '../../components/ToastState';\r\nimport type { Country } from '../../types/helper';\r\nimport { usaStatesAndTerritories } from '../../utils/cart';\r\nimport { canadaProvinces } from '../../utils/cart';\r\nimport { CartCheckoutRequest } from '../../cart.service';\r\nimport { settings } from '../../settings';\r\n\r\nconst tabs = [\r\n { label: 'Shipping', value: 'shipping' },\r\n { label: 'Billing', value: 'billing' },\r\n];\r\n\r\nconst translateCardType = (issuer: string): string => {\r\n switch (issuer) {\r\n case 'visa':\r\n return 'VISA';\r\n case 'mastercard':\r\n return 'MC';\r\n case 'amex':\r\n return 'AMEX';\r\n case 'dinersclub':\r\n return 'DINE';\r\n case 'discover':\r\n return 'DISC';\r\n default:\r\n return '';\r\n }\r\n};\r\n\r\nconst ANNUAL_SUPPORT_ID = 36;\r\n\r\ninterface ShippingData {\r\n firstName: string;\r\n lastName: string;\r\n company: string;\r\n address: string;\r\n city: string;\r\n zip: string;\r\n state: string;\r\n phone: string;\r\n email: string;\r\n po: string;\r\n memo: string;\r\n}\r\nfunction emptyShipping(): ShippingData {\r\n return {\r\n firstName: '',\r\n lastName: '',\r\n company: '',\r\n address: '',\r\n city: '',\r\n zip: '',\r\n state: '',\r\n phone: '',\r\n email: '',\r\n po: '',\r\n memo: '',\r\n };\r\n}\r\n\r\nexport const ResellerCheckout = () => {\r\n const location = useLocation();\r\n const account = accountService.getAccount();\r\n const { cart, discount, subtotal, original_order } = location.state || {};\r\n\r\n const products: string = cart.map((item) => item.productId).join(',');\r\n\r\n // determine if the cart contains only the annual support product\r\n let isAnnualSupport = cart.every((element) => element.productId === ANNUAL_SUPPORT_ID);\r\n\r\n const smDown = useMediaQuery((theme: Theme) => theme.breakpoints.down('sm'));\r\n const align = smDown ? 'vertical' : 'horizontal';\r\n\r\n const isMounted = useMounted();\r\n const [currentTab, setCurrentTab] = useState<string>('shipping');\r\n const [info, setInfo] = useState<ResellerCheckoutInfo | null>(null);\r\n const [shipping] = useState<ShippingData | null>(emptyShipping());\r\n\r\n const [countries, setCountries] = useState<Country[]>([]);\r\n const [country, setCountry] = useState<string>('');\r\n const [canadaProvince, setCanadaProvince] = useState<number>(0);\r\n const [usaState, setUsaState] = useState<number>(0);\r\n\r\n const [openDialog, setOpenDialog] = useState(false);\r\n const [failMessage, setFailMessage] = useState('');\r\n const [openMonerisDialog, setOpenMonerisDialog] = useState(false);\r\n const [toastState, setToastState] = useState<IToastState>(defaultToastState);\r\n const [acceptedTerms, setAcceptedTerms] = useState(false);\r\n const [invoiceDisabled, setInvoiceDisabled] = useState(false);\r\n const [openInvoiceDialog, setOpenInvoiceDialog] = useState(false);\r\n\r\n const { handleSubmit, control } = useForm<ShippingData>();\r\n\r\n const [cardNumber, setCardNumber] = useState<string>('');\r\n const [expiry, setExpiry] = useState<string>('');\r\n const [cvc, setCvc] = useState<string>('');\r\n const [focused, setFocused] = useState<string>('');\r\n const [issuer, setIssuer] = useState<string>('');\r\n const [inProgress, setInProgress] = useState<boolean>(false);\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n const resellerId = accountService.getAccount().id;\r\n const data = await resellerService.getCheckoutInfo(resellerId, subtotal / 100, products);\r\n const fetchedCountries = await resellerService.getCountries();\r\n if (isMounted()) {\r\n setInfo(data);\r\n setCountries(fetchedCountries);\r\n setCountry('US');\r\n }\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n }, [isMounted]);\r\n\r\n useEffect(() => {\r\n if (account) {\r\n loadData();\r\n }\r\n }, []);\r\n\r\n const handleTabsChange = (event: ChangeEvent<{}>, value: string): void => {\r\n setCurrentTab(value);\r\n };\r\n\r\n const handleCallback = ({ issuer }, isValid) => {\r\n if (isValid) {\r\n setIssuer(issuer);\r\n } else {\r\n setIssuer('');\r\n }\r\n };\r\n\r\n const handleInputFocus = ({ target }) => {\r\n setFocused(target.name);\r\n };\r\n\r\n const handleInputChange = ({ target }) => {\r\n if (target.name === 'number') {\r\n target.value = formatCreditCardNumber(target.value);\r\n setCardNumber(target.value);\r\n } else if (target.name === 'expiry') {\r\n target.value = formatExpirationDate(expiry, target.value);\r\n setExpiry(target.value);\r\n } else if (target.name === 'cvc') {\r\n target.value = formatCVC(target.value, cardNumber);\r\n setCvc(target.value);\r\n }\r\n };\r\n\r\n const onSubmit = async (data: ShippingData, isInvoice: boolean) => {\r\n setInProgress(true);\r\n\r\n let request: CartCheckoutRequest = {\r\n reseller_id: accountService.getAccount().id,\r\n bill_first_name: data.firstName,\r\n bill_last_name: data.lastName,\r\n bill_company: data.company,\r\n bill_address_one: data.address,\r\n bill_city: data.city,\r\n bill_state_or_province:\r\n country === 'CA'\r\n ? canadaProvinces[canadaProvince].long\r\n : country === 'US'\r\n ? usaStatesAndTerritories[usaState].long\r\n : data.state,\r\n bill_country: country,\r\n bill_postal_code: data.zip,\r\n bill_email: data.email,\r\n bill_phone: data.phone,\r\n bill_fax: data.memo,\r\n bill_po: data.po,\r\n\r\n credit_card_brand: '',\r\n credit_card_number: '',\r\n expire_month: '',\r\n expire_year: '',\r\n cvv: '',\r\n\r\n bill_amount: info.total,\r\n discount_amount: discount / 100.0,\r\n bill_gst: info.gst,\r\n bill_pst: info.pst,\r\n comments: isAnnualSupport ? data.memo : '',\r\n };\r\n if (isInvoice) {\r\n request['order_type'] = 'INV';\r\n } else {\r\n request['credit_card_brand'] = translateCardType(issuer);\r\n request['credit_card_number'] = cardNumber.replaceAll(' ', '');\r\n request['expire_month'] = expiry.substr(0, 2);\r\n request['expire_year'] = '20' + expiry.substr(3, 2);\r\n request['cvv'] = cvc;\r\n }\r\n\r\n cart.forEach((item, idx) => {\r\n request[`product_id${idx > 0 ? idx : ''}`] = item.productId;\r\n request[`product${idx > 0 ? idx : ''}`] = item.productName;\r\n request[`license${idx > 0 ? idx : ''}`] = item.licenseId;\r\n request[`quantity${idx > 0 ? idx : ''}`] = item.qty;\r\n request[`product_amount${idx > 0 ? idx : ''}`] = item.amount / 100.0;\r\n });\r\n\r\n const response = await resellerService.checkout(request);\r\n\r\n if (response == null) {\r\n setFailMessage('Server communication error');\r\n setOpenDialog(true);\r\n setInProgress(false);\r\n } else if (!response.status) {\r\n if (response.message === 'moneris problem') {\r\n setOpenMonerisDialog(true);\r\n setInProgress(false);\r\n } else {\r\n setFailMessage(response.message);\r\n setOpenDialog(true);\r\n setInProgress(false);\r\n }\r\n } else {\r\n const toast_message = isInvoice ? 'Invoice was successfully created' : 'Payment was successfully processed';\r\n setToastState({ open: true, status: 'success', message: toast_message });\r\n setIssuer('');\r\n setCardNumber('');\r\n setExpiry('');\r\n setCvc('');\r\n setInProgress(false);\r\n window.open(`https://secure.lsoft.net/invoices/${response.order}`, '_blank');\r\n }\r\n };\r\n\r\n const onInvoice = () => {\r\n setAcceptedTerms(false);\r\n setInvoiceDisabled(true);\r\n setOpenInvoiceDialog(true);\r\n };\r\n\r\n const onSubmitCreditCard = async (data: ShippingData) => {\r\n onSubmit(data, false);\r\n };\r\n const onSubmitInvoice = async (data: ShippingData) => {\r\n setOpenInvoiceDialog(false);\r\n onSubmit(data, true);\r\n };\r\n\r\n const handleCancelInvoiceDialog = () => {\r\n setOpenInvoiceDialog(false);\r\n };\r\n\r\n const handleCloseMonerisDialog = () => {};\r\n const handleCancelMonerisDialog = () => {\r\n setOpenMonerisDialog(false);\r\n };\r\n\r\n const handleAcceptTerms = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n if (event.target.checked) {\r\n setAcceptedTerms(true);\r\n setInvoiceDisabled(false);\r\n } else {\r\n setAcceptedTerms(false);\r\n setInvoiceDisabled(true);\r\n }\r\n };\r\n\r\n const handleCloseSnackbar = (event?: React.SyntheticEvent, reason?: string) => {\r\n if (reason === 'clickaway') {\r\n return;\r\n }\r\n setToastState({ ...toastState, open: false });\r\n };\r\n\r\n const onCountryChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const newCountry = event.target.value;\r\n setCountry(newCountry);\r\n };\r\n\r\n const onProvinceChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const newProv = event.target.value;\r\n setCanadaProvince(Number.parseInt(newProv));\r\n };\r\n\r\n const onStateChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setUsaState(Number.parseInt(event.target.value));\r\n };\r\n\r\n return (\r\n <>\r\n {(!account || account.role !== UserRole.Reseller) && <Navigate to=\"/account/login\" />}\r\n <Title title=\"Checkout\" />\r\n <Box\r\n component=\"main\"\r\n sx={{\r\n flexGrow: 1,\r\n py: 3,\r\n }}\r\n >\r\n {account && (\r\n <Container maxWidth=\"lg\">\r\n <Dialog\r\n open={openDialog}\r\n onClose={() => setOpenDialog(false)}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n >\r\n <DialogTitle id=\"alert-dialog-title\">Transaction Failed</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText id=\"alert-dialog-description\">{failMessage}</DialogContentText>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button onClick={() => setOpenDialog(false)} autoFocus>\r\n OK\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n\r\n <Dialog\r\n open={openInvoiceDialog}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n >\r\n <DialogTitle id=\"alert-dialog-title\">Software delivery terms</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText id=\"alert-dialog-description\">\r\n Software download will only be available after invoice has been paid.\r\n </DialogContentText>\r\n <Box sx={{ mt: 2 }}>\r\n <Checkbox\r\n checked={acceptedTerms}\r\n value={acceptedTerms}\r\n color=\"primary\"\r\n onChange={handleAcceptTerms}\r\n />\r\n I agree to software delivery terms\r\n </Box>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button sx={{ mr: 2 }} onClick={handleCancelInvoiceDialog} autoFocus>\r\n Cancel\r\n </Button>\r\n <form id=\"payment\" onSubmit={handleSubmit(onSubmitInvoice)}>\r\n <Button\r\n sx={{ mr: 2 }}\r\n color=\"primary\"\r\n variant=\"contained\"\r\n type=\"submit\"\r\n disabled={invoiceDisabled}\r\n >\r\n OK\r\n </Button>\r\n </form>\r\n </DialogActions>\r\n </Dialog>\r\n\r\n <Dialog\r\n open={openMonerisDialog}\r\n onClose={handleCloseMonerisDialog}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n >\r\n <DialogTitle id=\"alert-dialog-title\">Payment processing failed</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText id=\"alert-dialog-description\">\r\n We experience payment processing issues with our provider. You can try again to\r\n process payment later on, or use PayPal as a credit card payment processor.\r\n </DialogContentText>\r\n <DialogContentText sx={{ mt: 2 }}>\r\n If you wish to use PayPal, you need to create an invoice first. You can use PayPal\r\n payment method once invoice is created.\r\n </DialogContentText>\r\n <DialogContentText sx={{ mt: 2 }}>\r\n You can also contact our sales department {settings.phone1} for order processing\r\n over the phone.\r\n </DialogContentText>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button sx={{ mr: 2 }} onClick={handleCancelMonerisDialog} autoFocus>\r\n OK\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n\r\n <Snackbar\r\n open={toastState.open}\r\n autoHideDuration={6000}\r\n onClose={handleCloseSnackbar}\r\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\r\n >\r\n <Alert onClose={handleCloseSnackbar} severity={toastState.status}>\r\n {toastState.message}\r\n </Alert>\r\n </Snackbar>\r\n\r\n <Grid container spacing={3}>\r\n <Grid item xs={12}>\r\n <Card>\r\n <CardHeader title=\"Order Summary\" />\r\n <CardContent sx={{ py: 0 }}>\r\n <Scrollbar>\r\n <Box sx={{ minWidth: 700 }}>\r\n <Table>\r\n <TableHead>\r\n <TableRow>\r\n <TableCell>Product</TableCell>\r\n <TableCell>License</TableCell>\r\n <TableCell align=\"right\">Price</TableCell>\r\n <TableCell align=\"right\">Qty</TableCell>\r\n <TableCell align=\"right\">Amount</TableCell>\r\n <TableCell align=\"right\">Discount</TableCell>\r\n <TableCell align=\"right\">Total</TableCell>\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {cart.map((product, idx) => (\r\n <TableRow key={idx}>\r\n <TableCell>{product.productName}</TableCell>\r\n <TableCell>{product.licenseName}</TableCell>\r\n <TableCell align=\"right\">\r\n ${numeral(product.price / 100).format('0,0.00')}\r\n </TableCell>\r\n <TableCell align=\"right\">{product.qty}</TableCell>\r\n <TableCell align=\"right\">\r\n ${numeral(product.amount / 100).format('0,0.00')}\r\n </TableCell>\r\n <TableCell align=\"right\">\r\n ${numeral(product.discount / 100).format('0,0.00')}\r\n </TableCell>\r\n <TableCell align=\"right\">\r\n {' '}\r\n ${numeral(product.total / 100).format('0,0.00')}\r\n </TableCell>\r\n </TableRow>\r\n ))}\r\n {info && info.taxes && (\r\n <TableRow>\r\n <TableCell />\r\n <TableCell />\r\n <TableCell />\r\n <TableCell />\r\n <TableCell />\r\n <TableCell align=\"right\">\r\n <Typography style={{ fontWeight: 600 }}>\r\n Subtotal\r\n </Typography>\r\n </TableCell>\r\n <TableCell align=\"right\">\r\n <Typography style={{ fontWeight: 600 }}>\r\n ${numeral(subtotal / 100).format('0,0.00')}{' '}\r\n </Typography>\r\n </TableCell>\r\n </TableRow>\r\n )}\r\n\r\n {info &&\r\n info.taxes &&\r\n info.taxes.map((tax, index) => {\r\n return (\r\n <TableRow key={index}>\r\n <TableCell />\r\n <TableCell />\r\n <TableCell />\r\n <TableCell />\r\n <TableCell />\r\n <TableCell align=\"right\">{tax.name}</TableCell>\r\n <TableCell align=\"right\">\r\n ${numeral(tax.amount).format('0,0.00')}\r\n </TableCell>\r\n </TableRow>\r\n );\r\n })}\r\n\r\n {info && (\r\n <TableRow>\r\n <TableCell />\r\n <TableCell />\r\n <TableCell />\r\n <TableCell />\r\n <TableCell />\r\n <TableCell align=\"right\">\r\n <Typography style={{ fontWeight: 600 }}>\r\n Order Total\r\n </Typography>\r\n </TableCell>\r\n <TableCell align=\"right\">\r\n <Typography style={{ fontWeight: 600 }}>\r\n ${numeral(info.total).format('0,0.00')}\r\n </Typography>\r\n </TableCell>\r\n </TableRow>\r\n )}\r\n </TableBody>\r\n </Table>\r\n </Box>\r\n </Scrollbar>\r\n </CardContent>\r\n </Card>\r\n </Grid>\r\n <Grid item md={6} xs={12}>\r\n <Tabs\r\n indicatorColor=\"primary\"\r\n onChange={handleTabsChange}\r\n scrollButtons=\"auto\"\r\n textColor=\"primary\"\r\n value={currentTab}\r\n variant=\"scrollable\"\r\n >\r\n {tabs.map((tab) => (\r\n <Tab key={tab.value} label={tab.label} value={tab.value} />\r\n ))}\r\n </Tabs>\r\n <Divider sx={{ mb: 3 }} />\r\n {currentTab === 'shipping' && (\r\n <Card sx={{ p: 3 }}>\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Controller\r\n name=\"firstName\"\r\n control={control}\r\n defaultValue={shipping.firstName}\r\n rules={{\r\n required: 'First Name is required',\r\n maxLength: {\r\n value: 150,\r\n message: 'First Name cannot exceed 150 characters',\r\n },\r\n }}\r\n render={({ field, fieldState: { error } }) => (\r\n <TextField\r\n {...field}\r\n required\r\n label=\"First Name\"\r\n size=\"small\"\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n error={!!error}\r\n helperText={error ? error.message : null}\r\n />\r\n )}\r\n />\r\n </Box>\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n mt: 2,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Controller\r\n name=\"lastName\"\r\n control={control}\r\n defaultValue={shipping.lastName}\r\n rules={{\r\n required: 'Last Name is required',\r\n maxLength: {\r\n value: 150,\r\n message: 'Last Name cannot exceed 150 characters',\r\n },\r\n }}\r\n render={({ field, fieldState: { error } }) => (\r\n <TextField\r\n {...field}\r\n required\r\n label=\"Last Name\"\r\n size=\"small\"\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n error={!!error}\r\n helperText={error ? error.message : null}\r\n />\r\n )}\r\n />\r\n </Box>\r\n\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n mt: 2,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Controller\r\n name=\"company\"\r\n control={control}\r\n defaultValue={shipping.company}\r\n rules={{\r\n maxLength: {\r\n value: 150,\r\n message: 'Company name cannot exceed 150 characters',\r\n },\r\n }}\r\n render={({ field, fieldState: { error } }) => (\r\n <TextField\r\n {...field}\r\n label=\"Company\"\r\n size=\"small\"\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n error={!!error}\r\n helperText={error ? error.message : null}\r\n />\r\n )}\r\n />\r\n </Box>\r\n\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n mt: 2,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Controller\r\n name=\"address\"\r\n control={control}\r\n defaultValue={shipping.address}\r\n rules={{\r\n maxLength: {\r\n value: 150,\r\n message: 'Address cannot exceed 150 characters',\r\n },\r\n }}\r\n render={({ field, fieldState: { error } }) => (\r\n <TextField\r\n {...field}\r\n label=\"Address\"\r\n size=\"small\"\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n error={!!error}\r\n helperText={error ? error.message : null}\r\n />\r\n )}\r\n />\r\n </Box>\r\n\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n mt: 2,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Controller\r\n name=\"city\"\r\n control={control}\r\n defaultValue={shipping.city}\r\n rules={{\r\n maxLength: {\r\n value: 150,\r\n message: 'City name cannot exceed 150 characters',\r\n },\r\n }}\r\n render={({ field, fieldState: { error } }) => (\r\n <TextField\r\n {...field}\r\n label=\"City\"\r\n size=\"small\"\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n error={!!error}\r\n helperText={error ? error.message : null}\r\n />\r\n )}\r\n />\r\n </Box>\r\n\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n mt: 2,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Controller\r\n name=\"zip\"\r\n control={control}\r\n defaultValue={shipping.zip}\r\n rules={{\r\n maxLength: {\r\n value: 150,\r\n message: 'Zip/postal code cannot exceed 150 characters',\r\n },\r\n }}\r\n render={({ field, fieldState: { error } }) => (\r\n <TextField\r\n {...field}\r\n label=\"Zip / Postal Code\"\r\n size=\"small\"\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n error={!!error}\r\n helperText={error ? error.message : null}\r\n />\r\n )}\r\n />\r\n </Box>\r\n\r\n {countries.length > 0 && (\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n mt: 2,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <TextField\r\n label=\"Country\"\r\n size=\"small\"\r\n select\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n value={country}\r\n onChange={onCountryChange}\r\n >\r\n {countries.map((country, idx) => (\r\n <MenuItem key={idx} value={country.code}>\r\n {country.name}\r\n </MenuItem>\r\n ))}\r\n </TextField>\r\n </Box>\r\n )}\r\n\r\n {country === 'US' && (\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n mt: 2,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <TextField\r\n label=\"State\"\r\n size=\"small\"\r\n select\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n value={usaState}\r\n onChange={onStateChange}\r\n >\r\n {usaStatesAndTerritories.map((state, idx) => (\r\n <MenuItem key={idx} value={idx}>\r\n {state.long}\r\n </MenuItem>\r\n ))}\r\n </TextField>\r\n </Box>\r\n )}\r\n\r\n {country === 'CA' && (\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n mt: 2,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <TextField\r\n label=\"Province\"\r\n size=\"small\"\r\n select\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n value={canadaProvince}\r\n onChange={onProvinceChange}\r\n >\r\n {canadaProvinces.map((prov, idx) => (\r\n <MenuItem key={idx} value={idx}>\r\n {prov.long}\r\n </MenuItem>\r\n ))}\r\n </TextField>\r\n </Box>\r\n )}\r\n\r\n {country !== 'CA' && country !== 'US' && (\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n mt: 2,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Controller\r\n name=\"state\"\r\n control={control}\r\n defaultValue={shipping.state}\r\n rules={{\r\n maxLength: {\r\n value: 150,\r\n message:\r\n 'State / Province / Region cannot exceed 150 characters',\r\n },\r\n }}\r\n render={({ field, fieldState: { error } }) => (\r\n <TextField\r\n {...field}\r\n label=\"State / Province / Region\"\r\n size=\"small\"\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n error={!!error}\r\n helperText={error ? error.message : null}\r\n />\r\n )}\r\n />\r\n </Box>\r\n )}\r\n\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n mt: 2,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Controller\r\n name=\"phone\"\r\n control={control}\r\n defaultValue={shipping.phone}\r\n rules={{\r\n required: 'Phone is required',\r\n maxLength: {\r\n value: 150,\r\n message: 'Phone cannot exceed 150 characters',\r\n },\r\n }}\r\n render={({ field, fieldState: { error } }) => (\r\n <TextField\r\n {...field}\r\n label=\"Phone\"\r\n size=\"small\"\r\n required\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n error={!!error}\r\n helperText={error ? error.message : null}\r\n />\r\n )}\r\n />\r\n </Box>\r\n\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n mt: 2,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Controller\r\n name=\"email\"\r\n control={control}\r\n defaultValue={shipping.email}\r\n rules={{\r\n required: 'Email is required',\r\n maxLength: {\r\n value: 150,\r\n message: 'Email cannot exceed 150 characters',\r\n },\r\n }}\r\n render={({ field, fieldState: { error } }) => (\r\n <TextField\r\n {...field}\r\n label=\"Email\"\r\n size=\"small\"\r\n required\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n error={!!error}\r\n helperText={error ? error.message : null}\r\n />\r\n )}\r\n />\r\n </Box>\r\n\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n mt: 2,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Controller\r\n name=\"po\"\r\n control={control}\r\n defaultValue={shipping.po}\r\n rules={{\r\n maxLength: {\r\n value: 150,\r\n message: 'PO# cannot exceed 150 characters',\r\n },\r\n }}\r\n render={({ field, fieldState: { error } }) => (\r\n <TextField\r\n {...field}\r\n label=\"PO #\"\r\n size=\"small\"\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n error={!!error}\r\n helperText={error ? error.message : null}\r\n />\r\n )}\r\n />\r\n </Box>\r\n\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n mt: 2,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Controller\r\n name=\"memo\"\r\n control={control}\r\n defaultValue={original_order}\r\n rules={{\r\n required: `${\r\n isAnnualSupport ? 'Original Order ID is required' : ''\r\n }`,\r\n maxLength: {\r\n value: 150,\r\n message: `${\r\n isAnnualSupport ? 'Original Order ID' : 'Memo'\r\n } cannot exceed 150 characters`,\r\n },\r\n }}\r\n render={({ field, fieldState: { error } }) => (\r\n <TextField\r\n {...field}\r\n label={isAnnualSupport ? 'Original Order ID' : 'Memo'}\r\n size=\"small\"\r\n required={isAnnualSupport}\r\n sx={{\r\n flexGrow: 1,\r\n }}\r\n error={!!error}\r\n helperText={error ? error.message : null}\r\n />\r\n )}\r\n />\r\n </Box>\r\n </Card>\r\n )}\r\n {currentTab === 'billing' && (\r\n <Box>\r\n <Card>\r\n <Box sx={{ px: 3 }}>\r\n <PropertyList>\r\n <PropertyListItem align={align} label=\"Name\">\r\n <Typography color=\"primary\" variant=\"body1\">\r\n {info && `${info.firstName} ${info.lastName}`}\r\n </Typography>\r\n </PropertyListItem>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Company\">\r\n <Typography variant=\"body1\">\r\n {info && info.company}\r\n </Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Address\">\r\n <Typography variant=\"body1\">\r\n {info && info.address}\r\n </Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"City\">\r\n <Typography variant=\"body1\">{info && info.city}</Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"State / Province\">\r\n <Typography variant=\"body1\">\r\n {info && info.state}\r\n </Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Zip / Postal code\">\r\n <Typography variant=\"body1\">{info && info.zip}</Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Country\">\r\n <Typography variant=\"body1\">\r\n {info && info.country}\r\n </Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Phone\">\r\n <Typography variant=\"body1\">\r\n {info && info.phone}\r\n </Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Fax\">\r\n <Typography variant=\"body1\">{info && info.fax}</Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n <Box>\r\n <PropertyListItem align={align} label=\"Email\">\r\n <Typography variant=\"body1\" color=\"primary\">\r\n {info && info.email}\r\n </Typography>\r\n </PropertyListItem>\r\n </Box>\r\n <Divider />\r\n </PropertyList>\r\n </Box>\r\n </Card>\r\n </Box>\r\n )}\r\n </Grid>\r\n <Grid item md={6} xs={12}>\r\n <Box sx={{ height: '100%' }}>\r\n <Card sx={{ height: '100%' }}>\r\n <CardContent sx={{ px: 3 }}>\r\n <Box\r\n sx={{\r\n mt: 0,\r\n alignItems: 'center',\r\n }}\r\n >\r\n <Box>\r\n <Box sx={{ display: 'flex', alignItems: 'center', mb: 2 }}>\r\n <Typography variant=\"h6\">Pay with </Typography>\r\n <img\r\n alt=\"credit cards\"\r\n style={{ width: 340 }}\r\n src={creditCards}\r\n />\r\n </Box>\r\n\r\n <CreditCard\r\n acceptedCards={[\r\n 'visa',\r\n 'mastercard',\r\n 'amex',\r\n 'dinersclub',\r\n 'discover',\r\n ]}\r\n number={cardNumber}\r\n name=\"\"\r\n expiry={expiry}\r\n cvc={cvc}\r\n focused={focused}\r\n callback={handleCallback}\r\n />\r\n </Box>\r\n <Box>\r\n <Grid container columnSpacing={3}>\r\n <Grid item xs={12}>\r\n <TextField\r\n name=\"number\"\r\n value={cardNumber}\r\n required\r\n label=\"Card Number\"\r\n fullWidth\r\n onChange={handleInputChange}\r\n onFocus={handleInputFocus}\r\n sx={{\r\n flexGrow: 1,\r\n mr: 3,\r\n mt: 3,\r\n }}\r\n />\r\n </Grid>\r\n <Grid item md={6} xs={12}>\r\n <TextField\r\n name=\"expiry\"\r\n value={expiry}\r\n required\r\n label=\"Valid Thru (MM/YY)\"\r\n fullWidth\r\n onChange={handleInputChange}\r\n onFocus={handleInputFocus}\r\n sx={{\r\n flexGrow: 1,\r\n mr: 3,\r\n mt: 3,\r\n }}\r\n />\r\n </Grid>\r\n <Grid item md={6} xs={12}>\r\n <TextField\r\n name=\"cvc\"\r\n value={cvc}\r\n label=\"CVC\"\r\n fullWidth\r\n onChange={handleInputChange}\r\n onFocus={handleInputFocus}\r\n sx={{\r\n flexGrow: 1,\r\n mr: 3,\r\n mt: 3,\r\n }}\r\n />\r\n </Grid>\r\n\r\n <Grid item xs={12}>\r\n <form\r\n id=\"payment\"\r\n onSubmit={handleSubmit(onSubmitCreditCard)}\r\n >\r\n <Button\r\n color=\"primary\"\r\n variant=\"contained\"\r\n type=\"submit\"\r\n fullWidth\r\n disabled={\r\n !issuer || expiry.length !== 5 || inProgress\r\n }\r\n sx={{ mt: 3 }}\r\n >\r\n Pay\r\n </Button>\r\n </form>\r\n\r\n <Divider sx={{ m: 2 }} variant=\"middle\">\r\n OR\r\n </Divider>\r\n <form id=\"invoice\" onSubmit={handleSubmit(onInvoice)}>\r\n <Button\r\n color=\"primary\"\r\n variant=\"contained\"\r\n type=\"submit\"\r\n fullWidth\r\n disabled={inProgress}\r\n >\r\n Invoice\r\n </Button>\r\n </form>\r\n\r\n <Box sx={{ mt: 2 }}>\r\n <Typography\r\n variant=\"body2\"\r\n sx={{ color: '#666', fontStyle: 'italic' }}\r\n >\r\n You can use PayPal payment method once invoice is\r\n created\r\n </Typography>\r\n </Box>\r\n </Grid>\r\n </Grid>\r\n </Box>\r\n </Box>\r\n </CardContent>\r\n </Card>\r\n </Box>\r\n </Grid>\r\n <Grid item xs={12} sx={{}}>\r\n <Divider />\r\n <Box sx={{ mt: 3, display: 'flex', justifyContent: 'center' }}>\r\n <Typography variant=\"subtitle2\">\r\n Secure payment services provided by{' '}\r\n <Box component=\"span\" fontWeight=\"fontWeightBold\">\r\n Royal Bank of Canada\r\n </Box>{' '}\r\n and{' '}\r\n <Box component=\"span\" fontWeight=\"fontWeightBold\">\r\n LSoft Technologies\r\n </Box>\r\n </Typography>\r\n </Box>\r\n </Grid>\r\n </Grid>\r\n </Container>\r\n )}\r\n </Box>\r\n </>\r\n );\r\n};\r\n","import { Suspense, lazy } from 'react';\r\nimport { MainLayout } from './components/MainLayout';\r\nimport { PublicLayout } from './components/PublicLayout';\r\nimport { ProfileLayout } from './components/profile/ProfileLayout';\r\nimport { Home } from './pages/Home';\r\nimport { Category } from './pages/Category';\r\nimport { Search } from './pages/Search';\r\nimport { Question } from './pages/Question';\r\nimport { QuoteCheckout } from './pages/reseller/QuoteCheckout';\r\nimport { CartCheckout } from './pages/cart/CartCheckout';\r\n\r\n// Admin KB\r\nimport { DashboardLayout } from './components/dashboard/DashboardLayout';\r\nimport { AdmQuestionList } from './pages/dashboard/AdmQuestionList';\r\nimport { AdmCategoryList } from './pages/dashboard/AdmCategoryList';\r\nimport { CategoryDetails } from './pages/dashboard/CategoryDetails';\r\nimport { QuestionDetails } from './pages/dashboard/QuestionDetails';\r\nimport { Settings } from './pages/dashboard/Settings';\r\n\r\nimport { LoadingScreen } from './components/LoadingScreen';\r\n\r\n// Client profile\r\nimport { Checkout } from './pages/profile/Checkout';\r\n\r\n// Reseller profile\r\nimport { ResellerCheckout } from './pages/reseller/ResellerCheckout';\r\n\r\nconst Loadable = (Component) => (props) => (\r\n <Suspense fallback={<LoadingScreen />}>\r\n <Component {...props} />\r\n </Suspense>\r\n);\r\n\r\n// Authentication pages\r\nconst Login = Loadable(lazy(() => import('./pages/authentication/Login')));\r\nconst CreateAccount = Loadable(lazy(() => import('./pages/authentication/CreateAccount')));\r\nconst ForgotPassword = Loadable(lazy(() => import('./pages/authentication/ForgotPassword')));\r\nconst Register = Loadable(lazy(() => import('./pages/authentication/Register')));\r\n\r\n// Profile pages\r\nconst Orders = Loadable(lazy(() => import('./pages/profile/Orders')));\r\nconst Profile = Loadable(lazy(() => import('./pages/profile/Profile')));\r\nconst Upgrades = Loadable(lazy(() => import('./pages/profile/Upgrades')));\r\nconst Discounts = Loadable(lazy(() => import('./pages/profile/Discounts')));\r\nconst Support = Loadable(lazy(() => import('./pages/profile/Support')));\r\nconst Invoice = Loadable(lazy(() => import('./pages/profile/Invoice')));\r\nconst SoftwareDownload = Loadable(lazy(() => import('./pages/profile/SoftwareDownload')));\r\nconst AddSupport = Loadable(lazy(() => import('./pages/profile/AddSupport')));\r\nconst Deactivate = Loadable(lazy(() => import('./pages/profile/Deactivate')));\r\nconst Upgrade = Loadable(lazy(() => import('./pages/profile/Upgrade')));\r\nconst Unsubscribe = Loadable(lazy(() => import('./pages/profile/Unsubscribe')));\r\nconst Unsubscribed = Loadable(lazy(() => import('./pages/profile/Unsubscribed')));\r\n\r\n// Reseller profile\r\nconst ResellerProfile = Loadable(lazy(() => import('./pages/reseller/Profile')));\r\nconst ResellerOrders = Loadable(lazy(() => import('./pages/reseller/ResellerOrders')));\r\nconst ResellerNewOrder = Loadable(lazy(() => import('./pages/reseller/ResellerNewOrder')));\r\n\r\n// Help Center pages\r\nconst SubmitRequest = Loadable(lazy(() => import('./pages/Submit')));\r\n// const Category = Loadable(lazy(() => import('./pages/Category')));\r\n\r\n// Error pages\r\nconst AuthorizationRequired = Loadable(lazy(() => import('./pages/AuthorizationRequired')));\r\nconst NotFound = Loadable(lazy(() => import('./pages/NotFound')));\r\nconst ServerError = Loadable(lazy(() => import('./pages/ServerError')));\r\nconst Message = Loadable(lazy(() => import('./pages/Message')));\r\n\r\nexport const routes = [\r\n {\r\n path: '/account',\r\n children: [\r\n { path: 'login', element: <Login /> },\r\n { path: 'create-account', element: <CreateAccount /> },\r\n {\r\n path: 'request-sent',\r\n element: (\r\n <Message\r\n title=\"Request sent\"\r\n message=\"You'll get an email letting you know how to finilize profile registration.\"\r\n />\r\n ),\r\n },\r\n {\r\n path: 'password-sent',\r\n element: (\r\n <Message\r\n title=\"Password sent\"\r\n message=\"You'll get an email with a password to sign in to your account.\"\r\n />\r\n ),\r\n },\r\n { path: 'register', element: <Register /> },\r\n {\r\n path: 'verify-failed',\r\n element: (\r\n <Message\r\n title=\"Verification failed\"\r\n message=\"Registration URL is not correct or user has already been registered.\"\r\n />\r\n ),\r\n },\r\n {\r\n path: 'registration-successful',\r\n element: (\r\n <Message\r\n title=\"Registration successful\"\r\n message=\"Registration successful. You can now sign in to your account.\"\r\n linkText=\"Sign In\"\r\n linkUrl=\"/account/login\"\r\n />\r\n ),\r\n },\r\n { path: 'forgot-password', element: <ForgotPassword /> },\r\n ],\r\n },\r\n {\r\n path: '/client',\r\n element: <ProfileLayout />,\r\n children: [\r\n { path: 'orders', element: <Orders /> },\r\n { path: 'profile', element: <Profile /> },\r\n { path: 'upgrades', element: <Upgrades /> },\r\n { path: 'upgrades/:token', element: <Upgrade isPublic={false} /> },\r\n { path: 'discounts', element: <Discounts /> },\r\n { path: 'support', element: <Support /> },\r\n { path: 'invoices/:orderId', element: <Invoice isPublic={false} isReseller={false} /> },\r\n { path: 'downloads/:orderId', element: <SoftwareDownload isPublic={false} isReseller={false} /> },\r\n { path: 'add-support/:orderId', element: <AddSupport isPublic={false} isReseller={false} /> },\r\n { path: 'deactivate', element: <Deactivate /> },\r\n { path: 'checkout', element: <Checkout isPublic={false} /> },\r\n ],\r\n },\r\n {\r\n path: '/reseller',\r\n element: <ProfileLayout isReseller={true} />,\r\n children: [\r\n { path: 'orders', element: <ResellerOrders /> },\r\n { path: 'orders/new', element: <ResellerNewOrder /> },\r\n { path: 'profile', element: <ResellerProfile /> },\r\n { path: 'checkout', element: <ResellerCheckout /> },\r\n { path: 'invoices/:orderId', element: <Invoice isPublic={false} isReseller={true} /> },\r\n { path: 'downloads/:orderId', element: <SoftwareDownload isPublic={false} isReseller={true} /> },\r\n { path: 'add-support/:orderId', element: <AddSupport isPublic={false} isReseller={true} /> },\r\n { path: 'support', element: <Support /> },\r\n ],\r\n },\r\n {\r\n path: '/',\r\n element: <MainLayout />,\r\n children: [\r\n { path: '/', element: <Home /> },\r\n { path: '/categories/:id', element: <Category /> },\r\n { path: '/search', element: <Search /> },\r\n { path: '/requests/new', element: <SubmitRequest /> },\r\n { path: '/questions/:id', element: <Question /> },\r\n { path: 'load', element: <LoadingScreen /> },\r\n { path: '/unsubscribe', element: <Unsubscribe /> },\r\n { path: '/unsubscribed', element: <Unsubscribed /> },\r\n ],\r\n },\r\n {\r\n path: '/cart',\r\n element: <PublicLayout customTitle=\"Secure Order Processing\" />,\r\n children: [{ path: 'checkout', element: <CartCheckout /> }],\r\n },\r\n {\r\n path: '/invoices',\r\n element: <PublicLayout />,\r\n children: [{ path: ':orderId', element: <Invoice isPublic={true} isReseller={false} /> }],\r\n },\r\n {\r\n path: '/quote-checkout',\r\n element: <PublicLayout />,\r\n children: [{ path: ':orderId', element: <QuoteCheckout /> }],\r\n },\r\n {\r\n path: '/downloads',\r\n element: <PublicLayout />,\r\n children: [{ path: ':orderId', element: <SoftwareDownload isPublic={true} isReseller={false} /> }],\r\n },\r\n {\r\n path: '/add-support',\r\n element: <PublicLayout />,\r\n children: [\r\n { path: ':orderId', element: <AddSupport isPublic={true} isReseller={false} /> },\r\n { path: 'checkout', element: <Checkout isPublic={true} /> },\r\n { path: 'upgrades/:token', element: <Upgrade isPublic={true} /> },\r\n ],\r\n },\r\n {\r\n path: '/kb',\r\n element: <DashboardLayout />,\r\n children: [\r\n { index: true, element: <AdmQuestionList /> },\r\n { path: 'categories', element: <AdmCategoryList /> },\r\n { path: 'categories/new', element: <CategoryDetails /> },\r\n { path: 'categories/:categoryId', element: <CategoryDetails /> },\r\n { path: 'questions/:questionId', element: <QuestionDetails /> },\r\n { path: 'questions/new', element: <QuestionDetails /> },\r\n { path: 'settings', element: <Settings /> },\r\n ],\r\n },\r\n {\r\n path: '401',\r\n element: <AuthorizationRequired />,\r\n },\r\n {\r\n path: '404',\r\n element: <NotFound />,\r\n },\r\n {\r\n path: '500',\r\n element: <ServerError />,\r\n },\r\n {\r\n path: 'clients',\r\n element: <Login />,\r\n },\r\n {\r\n path: '*',\r\n element: <NotFound />,\r\n },\r\n];\r\n","import type { FC } from 'react';\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\nconst useStyles = makeStyles(() =>\r\n createStyles({\r\n '@global': {\r\n '*': {\r\n // boxSizing: 'border-box',\r\n margin: 0,\r\n padding: 0,\r\n },\r\n html: {\r\n '-webkit-font-smoothing': 'antialiased',\r\n '-moz-osx-font-smoothing': 'grayscale',\r\n height: '100%',\r\n width: '100%',\r\n },\r\n body: {\r\n height: '100%',\r\n width: '100%',\r\n },\r\n '#root': {\r\n height: '100%',\r\n width: '100%',\r\n },\r\n },\r\n })\r\n);\r\n\r\nconst GlobalStyles: FC = () => {\r\n useStyles();\r\n\r\n return null;\r\n};\r\n\r\nexport default GlobalStyles;\r\n","import { useRoutes } from 'react-router-dom';\r\nimport { routes } from './routes';\r\n\r\nimport { ThemeProvider, Theme, StyledEngineProvider } from '@mui/material';\r\nimport GlobalStyles from './components/GlobalStyles';\r\nimport { createTheme } from './theme';\r\n\r\ndeclare module '@mui/styles/defaultTheme' {\r\n // eslint-disable-next-line @typescript-eslint/no-empty-interface\r\n interface DefaultTheme extends Theme {}\r\n}\r\n\r\nexport const App = () => {\r\n const content = useRoutes(routes);\r\n const theme = createTheme({\r\n responsiveFontSizes: true,\r\n mode: 'light',\r\n });\r\n\r\n return (\r\n <StyledEngineProvider injectFirst>\r\n <ThemeProvider theme={theme}>\r\n <GlobalStyles />\r\n {content}\r\n </ThemeProvider>\r\n </StyledEngineProvider>\r\n );\r\n};\r\n","import { useEffect } from 'react';\r\nimport { useLocation } from 'react-router-dom';\r\n\r\nexport function ScrollToTop() {\r\n const { pathname } = useLocation();\r\n\r\n useEffect(() => {\r\n window.scrollTo(0, 0);\r\n }, [pathname]);\r\n\r\n return null;\r\n}\r\n","import { ReportHandler } from 'web-vitals';\r\n\r\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\r\n if (onPerfEntry && onPerfEntry instanceof Function) {\r\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\r\n getCLS(onPerfEntry);\r\n getFID(onPerfEntry);\r\n getFCP(onPerfEntry);\r\n getLCP(onPerfEntry);\r\n getTTFB(onPerfEntry);\r\n });\r\n }\r\n};\r\n\r\nexport default reportWebVitals;\r\n","import './index.css';\r\nimport ReactDOM from 'react-dom';\r\nimport { HelmetProvider } from 'react-helmet-async';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport { Provider as ReduxProvider } from 'react-redux';\r\nimport { LocalizationProvider } from '@mui/lab';\r\nimport AdapterDateFns from '@mui/lab/AdapterDateFns';\r\nimport { configureStore } from './Store';\r\nimport { App } from './App';\r\nimport { ScrollToTop } from './ScrollToTop';\r\nimport reportWebVitals from './reportWebVitals';\r\n\r\nconst store = configureStore();\r\n\r\nReactDOM.render(\r\n <HelmetProvider>\r\n <ReduxProvider store={store}>\r\n <LocalizationProvider dateAdapter={AdapterDateFns}>\r\n <BrowserRouter>\r\n <ScrollToTop />\r\n <App />\r\n </BrowserRouter>\r\n </LocalizationProvider>\r\n </ReduxProvider>\r\n </HelmetProvider>,\r\n document.getElementById('root')\r\n);\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals())\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nreportWebVitals();\r\n","import type { FC } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Box, ListItem, ListItemText, Typography } from '@mui/material';\r\nimport type { ListItemProps } from '@mui/material';\r\n\r\ninterface PropertyListItemProps extends ListItemProps {\r\n align?: 'horizontal' | 'vertical';\r\n label: string;\r\n value?: string;\r\n}\r\n\r\nexport const PropertyListItem: FC<PropertyListItemProps> = (props) => {\r\n const { align, children, disableGutters, value, label, ...other } = props;\r\n\r\n return (\r\n <ListItem\r\n sx={{\r\n px: disableGutters ? 0 : 3,\r\n py: 1.5,\r\n }}\r\n {...other}\r\n >\r\n <ListItemText\r\n disableTypography\r\n primary={\r\n <Typography sx={{ minWidth: align === 'vertical' ? 'inherit' : 180 }} variant=\"subtitle2\">\r\n {label}\r\n </Typography>\r\n }\r\n secondary={\r\n <Box\r\n sx={{\r\n flex: 1,\r\n mt: align === 'vertical' ? 0.5 : 0,\r\n }}\r\n >\r\n {children || (\r\n <Typography color=\"textSecondary\" variant=\"body2\">\r\n {value}\r\n </Typography>\r\n )}\r\n </Box>\r\n }\r\n sx={{\r\n display: 'flex',\r\n flexDirection: align === 'vertical' ? 'column' : 'row',\r\n my: 0,\r\n }}\r\n />\r\n </ListItem>\r\n );\r\n};\r\n\r\nPropertyListItem.defaultProps = {\r\n align: 'vertical',\r\n};\r\n\r\nPropertyListItem.propTypes = {\r\n align: PropTypes.oneOf(['horizontal', 'vertical']),\r\n children: PropTypes.node,\r\n disableGutters: PropTypes.bool,\r\n label: PropTypes.string.isRequired,\r\n value: PropTypes.string,\r\n};\r\n","import { Helmet } from 'react-helmet-async';\r\n\r\ninterface Props {\r\n title?: string;\r\n}\r\n\r\nexport const Title = ({ title }: Props) => (\r\n <Helmet>\r\n <title>{`${title || ''} - LSoft Technologies`}</title>\r\n </Helmet>\r\n);\r\n","export const settings = {\r\n phone1: '+1 (877) 403-8082',\r\n phone2: '+1 (905) 812-8434',\r\n fax: '+1 (647) 795-2904',\r\n hours: '9am to 6pm EST',\r\n email: 'sales @ lsoft.net',\r\n supportEmail: 'support @ lsoft.net',\r\n address: ['7177 Danton Promenade', 'Mississauga, ON', 'L5N 5P3', 'Canada'],\r\n mapUrl: 'https://maps.google.com/maps?q=7177%20Danton%20Prom&t=&z=13&ie=UTF8&iwloc=&output=embed',\r\n website: {\r\n name: 'www.lsoft.net',\r\n url: 'https://www.lsoft.net',\r\n },\r\n domainName: 'http://lsoft.net',\r\n secureWebOrderUrl: 'https://secure.lsoft.net/Order.aspx',\r\n socials: {\r\n facebook: 'http://www.facebook.com/pages/LSoft-Technologies/169521936414944',\r\n twitter: 'https://twitter.com/#!/lsoft_net',\r\n youtube: 'https://www.youtube.com/user/LsoftTechnologies',\r\n },\r\n hstNumber: '87239 4424 RT0001',\r\n year: '2024',\r\n};\r\n","import { forwardRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport PerfectScrollbar from 'react-perfect-scrollbar';\r\nimport type { ScrollBarProps as PerfectScrollbarProps } from 'react-perfect-scrollbar';\r\nimport { Box } from '@mui/material';\r\n\r\ninterface ScrollbarProps extends PerfectScrollbarProps {}\r\n\r\nexport const Scrollbar = forwardRef<HTMLDivElement, ScrollbarProps>((props, ref) => {\r\n const { children, ...other } = props;\r\n\r\n const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\r\n\r\n if (isMobile) {\r\n return (\r\n <Box ref={ref} sx={{ overflowX: 'auto' }}>\r\n {children}\r\n </Box>\r\n );\r\n }\r\n\r\n return (\r\n <PerfectScrollbar\r\n // @ts-ignore\r\n ref={ref}\r\n {...other}\r\n >\r\n {children}\r\n </PerfectScrollbar>\r\n );\r\n});\r\n\r\nScrollbar.propTypes = {\r\n children: PropTypes.node,\r\n};\r\n\r\nexport default Scrollbar;\r\n","import { Avatar } from '@mui/material';\r\n\r\ninterface Props {\r\n size?: number;\r\n}\r\n\r\nexport const Logo = ({ size }: Props) => (\r\n <Avatar src=\"/logo192.png\" alt=\"logo\" variant=\"square\" sx={{ width: size, height: size }} />\r\n);\r\n","import { http } from './http';\r\nimport type { ResellerProfile } from './types/profile';\r\nimport type {\r\n ResellerOrder,\r\n ResellerOrderResponse,\r\n ResellerOrderCount,\r\n ResellerProduct,\r\n ResellerProductPrice,\r\n ResellerCheckoutInfo,\r\n CheckoutResponse,\r\n QuoteCheckoutInfo,\r\n ResellerExtraSupport,\r\n} from './types/reseller';\r\nimport type { HttpResponse } from './http';\r\nimport type { Country } from './types/helper';\r\n\r\nexport const resellerService = {\r\n emptyProfile,\r\n getProfile,\r\n updateProfile,\r\n updatePassword,\r\n getOrders,\r\n getOrdersCount,\r\n getProducts,\r\n getProductPrice,\r\n getCountries,\r\n getCheckoutInfo,\r\n checkout,\r\n getQuoteCheckoutInfo,\r\n getExtraSupportInfo,\r\n};\r\n\r\nfunction emptyProfile(): ResellerProfile {\r\n return {\r\n login: '',\r\n reseller: '',\r\n resellerEmail: '',\r\n firstName: '',\r\n lastName: '',\r\n company: '',\r\n address: '',\r\n city: '',\r\n state: '',\r\n country: '',\r\n zip: '',\r\n phone: '',\r\n fax: '',\r\n };\r\n}\r\n\r\nasync function getProfile(resellerId: number): Promise<ResellerProfile | null> {\r\n const result = await http<ResellerProfile>({\r\n path: `/resellers/${resellerId}/profile`,\r\n });\r\n if (result.ok) {\r\n const profile = result.body;\r\n return profile;\r\n } else {\r\n return null;\r\n }\r\n}\r\n\r\nasync function updateProfile(resellerId: number, data: ResellerProfile): Promise<boolean> {\r\n const result = await http<any, ResellerProfile>({\r\n path: `/resellers/${resellerId}/profile`,\r\n method: 'PUT',\r\n body: data,\r\n });\r\n return result.ok;\r\n}\r\n\r\nexport interface UpdatePasswordRequest {\r\n oldPassword: string;\r\n newPassword: string;\r\n}\r\n\r\nasync function updatePassword(resellerId: number, data: UpdatePasswordRequest): Promise<boolean> {\r\n const result = await http<any, UpdatePasswordRequest>({\r\n path: `/resellers/${resellerId}/password`,\r\n method: 'POST',\r\n body: data,\r\n });\r\n return result.ok;\r\n}\r\n\r\nconst mapResellerOrder = (order: ResellerOrderResponse): ResellerOrder => ({\r\n ...order,\r\n dateTime: new Date(order.dateTime),\r\n expiryDate: order.expiryDate ? new Date(order.expiryDate) : null,\r\n});\r\n\r\nasync function getOrders(\r\n resellerId: number,\r\n from: Date,\r\n to: Date,\r\n query: string,\r\n prevDate: Date,\r\n prevOrder: string,\r\n rows: number\r\n): Promise<ResellerOrder[]> {\r\n const path = `/resellers/${resellerId}/orders?from=${from ? from.toISOString() : ''}&to=${\r\n to ? to.toISOString() : ''\r\n }&query=${query}&prevdate=${prevDate.toISOString()}&prevorder=${prevOrder}&rows=${rows}`;\r\n const result = await http<ResellerOrderResponse[]>({\r\n path: path,\r\n });\r\n if (result.ok && result.body) {\r\n return result.body.map(mapResellerOrder);\r\n } else {\r\n return [];\r\n }\r\n}\r\n\r\nasync function getOrdersCount(resellerId: number, from: Date, to: Date, query: string): Promise<number | undefined> {\r\n const path = `/resellers/${resellerId}/orders/count?from=${from ? from.toISOString() : ''}&to=${\r\n to ? to.toISOString() : ''\r\n }&query=${query}`;\r\n const result = await http<ResellerOrderCount>({\r\n path: path,\r\n });\r\n if (result.ok && result.body) {\r\n return result.body.count;\r\n } else {\r\n return undefined;\r\n }\r\n}\r\n\r\nasync function getProducts(resellerId: number): Promise<ResellerProduct[]> {\r\n const path = `/resellers/${resellerId}/products`;\r\n const result = await http<ResellerProduct[]>({\r\n path: path,\r\n });\r\n if (result.ok && result.body) {\r\n return result.body;\r\n } else {\r\n return [];\r\n }\r\n}\r\n\r\nasync function getProductPrice(pid: number, lic: number, qty: number): Promise<ResellerProductPrice | null> {\r\n const path = `/resellers/product-price?pid=${pid}&lic=${lic}&qty=${qty}`;\r\n const result = await http<ResellerProductPrice>({\r\n path: path,\r\n });\r\n if (result.ok && result.body) {\r\n return result.body;\r\n } else {\r\n return null;\r\n }\r\n}\r\n\r\nasync function getCountries(): Promise<Country[]> {\r\n const path = `/resellers/countries`;\r\n const result = await http<Country[]>({\r\n path: path,\r\n });\r\n if (result.ok && result.body) {\r\n return result.body;\r\n } else {\r\n return [];\r\n }\r\n}\r\n\r\nasync function getCheckoutInfo(\r\n resellerId: number,\r\n subtotal: number,\r\n products: string\r\n): Promise<ResellerCheckoutInfo | null> {\r\n const path = `/resellers/${resellerId}/checkout?subtotal=${subtotal}&products=${products}`;\r\n const result = await http<ResellerCheckoutInfo>({\r\n path: path,\r\n });\r\n if (result.ok && result.body) {\r\n return result.body;\r\n } else {\r\n return null;\r\n }\r\n}\r\n\r\nasync function checkout(params: any): Promise<CheckoutResponse | null> {\r\n const result = await http<CheckoutResponse, any>({\r\n path: 'https://secure.lsoft.net/OrderProcessBackend.aspx',\r\n method: 'POST',\r\n body: params,\r\n formData: true,\r\n });\r\n if (result.ok && result.body) {\r\n return result.body;\r\n } else {\r\n return null;\r\n }\r\n}\r\n\r\nasync function getQuoteCheckoutInfo(orderId: string): Promise<HttpResponse<QuoteCheckoutInfo>> {\r\n const path = `/resellers/quote-checkout/${orderId}`;\r\n const result = await http<QuoteCheckoutInfo>({\r\n path: path,\r\n });\r\n return result;\r\n}\r\n\r\nasync function getExtraSupportInfo(orderId: string): Promise<HttpResponse<ResellerExtraSupport>> {\r\n const path = `/resellers/extra-support/${orderId}`;\r\n const result = await http<ResellerExtraSupport>({\r\n path: path,\r\n });\r\n\r\n if (result.ok && result.body) {\r\n return { ok: result.ok, message: result.message, body: result.body };\r\n } else {\r\n return { ok: false, message: result.message, body: null };\r\n }\r\n}\r\n","import { useCallback, useEffect, useRef } from 'react';\r\n\r\nexport const useMounted = () => {\r\n const isMounted = useRef(false);\r\n\r\n useEffect(() => {\r\n isMounted.current = true;\r\n\r\n return () => {\r\n isMounted.current = false;\r\n };\r\n }, []);\r\n\r\n return useCallback(() => isMounted.current, []);\r\n};\r\n","export interface IToastState {\r\n open: boolean;\r\n status: 'error' | 'info' | 'success' | 'warning';\r\n message: string;\r\n}\r\n\r\nexport const defaultToastState: IToastState = {\r\n open: false,\r\n status: 'success',\r\n message: '',\r\n};\r\n","export const server =\r\n process.env.REACT_APP_ENV === 'production'\r\n ? 'https://dev.lsoft.net'\r\n : process.env.REACT_APP_ENV === 'staging'\r\n ? 'http://ec2-100-26-214-232.compute-1.amazonaws.com:5000'\r\n : 'http://localhost:4000';\r\n\r\nexport const webAPIUrl = `${server}/api`;\r\nexport const attachmentsUrl = `${server}/attachments/`;\r\nexport const tinymceKey = 'qutz8206qzbw7y81g6436ssgeely1iban0ce6wg1gt2zu7ab';\r\n","import type { FC, ReactNode } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { List } from '@mui/material';\r\n\r\ninterface PropertyListProps {\r\n children: ReactNode;\r\n}\r\n\r\nexport const PropertyList: FC<PropertyListProps> = (props) => {\r\n const { children } = props;\r\n\r\n return <List disablePadding>{children}</List>;\r\n};\r\n\r\nPropertyList.propTypes = {\r\n children: PropTypes.node,\r\n};\r\n"],"sourceRoot":""}