{"version":3,"sources":["components/QPHeader.jsx","server/schema/api.ts","components/inputs/QPAutocomplete.tsx","components/inputs/QPMuiSelect.tsx","server/api-client.ts","redux/types.ts","redux/actions.ts","redux/selectors.ts","hooks/use-select.tsx","components/inputs/QPMuiProgramSelect.tsx","components/QPSelects.tsx","components/inputs/QPSlider.tsx","validators/slider-validator.ts","utils.ts","components/inputs/QPSwitch.tsx","components/QPConfig.tsx","hooks/use-slider.tsx","hooks/use-checkbox.tsx","components/QPFooter.jsx","img/headerLogo.png","hooks/use-variants-ref.tsx","components/QPResponse.tsx","components/QPBody.jsx","pages/quickPricer/quickPricer.jsx","App.js","reportWebVitals.js","redux/inputsReducer.ts","redux/limits-reducer.ts","redux/loans-reducer.ts","redux/program-reducer.ts","redux/validation-reducer.ts","redux/valuesReducer.ts","redux/rootReducer.ts","redux/calculate-saga.ts","index.tsx","pages/quickPricer/quickPricer.module.css"],"names":["QuickPricerHeader","params","className","ContentType","QPAutocomplete","isValid","order","name","selectedValue","onChange","values","FormControl","error","sx","mt","id","style","color","backgroundColor","Autocomplete","disablePortal","getOptionLabel","option","value","options","getOptionDisabled","isDisabled","e","PaperComponent","children","Paper","ListboxProps","maxHeight","renderInput","TextField","variant","border","InputProps","disableUnderline","label","QPMuiSelect","InputLabel","Select","labelId","valueID","parseInt","target","find","map","item","MenuItem","disabled","apiClient","limits","limitsCreate","data","request","path","method","body","type","Json","format","loans","calculateCreate","programs","programsList","programsDetail","apiConfig","baseUrl","securityData","securityWorker","abortControllers","Map","customFetch","fetch","baseApiParams","credentials","headers","redirect","referrerPolicy","setSecurityData","contentFormatters","input","JSON","stringify","FormData","Object","keys","reduce","formData","key","property","append","Blob","UrlEncoded","toQueryString","createAbortSignal","cancelToken","has","abortController","get","signal","AbortController","set","abortRequest","abort","delete","a","secure","query","secureParams","requestParams","mergeRequestParams","queryString","payloadFormatter","responseFormat","then","response","r","ok","catch","this","assign","encodedKey","encodeURIComponent","encodeQueryParam","v","join","rawQuery","filter","Array","isArray","addArrayQueryParam","addQueryParam","params1","params2","process","FETCH_PROGRAMS","UPDATE_PROGRAMS","FETCH_INPUTS","FETCH_LIMITED_INPUTS_START","FETCH_LIMITED_INPUTS_END","UPDATE_INPUTS","UPDATE_NO_LIMIT_INPUTS","CALCULATE_LOAN","CALCULATE_LOAN_START","CALCULATE_LOAN_ERROR","updateInputs","payload","fetchInputs","programId","dispatch","result","i","programSelector","state","program","limitsSelector","limitsValueSelector","inputsSelector","inputs","loansSelector","loan","loansSuccessSelector","success","loansStateSelector","limitsStateSelector","validationSelector","validation","configInputsSelector","sort","b","index","headerInputsSelector","valuesSelector","useSelect","useDispatch","useSelector","useCallback","select","selectLimits","availableValues","limit","selectedValueId","handleChange","checkLimit","some","length","MyListSubheader","props","ListSubheader","fontWeight","fontSize","bgcolor","muiSkipListHighlight","QPMuiProgramSelect","React","useState","secondLienPrograms","setSecondLienPrograms","firstLienPrograms","setFirstLienPrograms","useEffect","secondLienProgramIndex","findIndex","splice","QPSelects","selectedProgram","useMemo","defaultValue","renderSelect","programSelect","updatePrograms","QuickPricerSlider","max","min","step","limitFrom","limitTo","fullValue","onSpecialClick","specialValues","specialValue","sliderValue","sliderRef","useRef","isMouseDown","setMouseDown","numericValue","setSliderNumericValue","colorRanges","setColorRanges","limitValue","setLimitValue","showLimitValue","onInputChange","parseFloat","roundStep","roundedValue","Math","round","undefined","availableColor","errorColor","sliderLimitTick","document","getElementById","start","end","limitLength","left","parentElement","background","slider","current","handleMouseDown","handleMouseUp","addEventListener","capture","removeEventListener","formatedText","toFixed","renderSpecials","display","flexDirection","justifyContent","paddingLeft","position","special","isChecked","marginBottom","Checkbox","flexBasis","padding","paddingRight","checked","htmlFor","window","innerWidth","onMouseLeave","showSpinButton","placeholder","cssClass","floatLabelType","ref","readonly","colorRange","change","changed","ticks","placement","largeStep","showSmallTicks","renderingTicks","args","tickValue","text","bind","validateSlider","from","to","getSliderLimit","inputId","dropInvalidOptionalValues","validInputsIds","uiType","checkboxLimits","Boolean","includes","QPSwitch","availableCount","wasChecked","nextValue","QPConfig","configInputs","renderSlider","sliderTrackLimit","availableSpecials","sliderFullValue","sliderHasSpecialValue","sliderStep","useSlider","renderCheckbox","checkbox","useCheckbox","QPFooter","open","setOpen","handleClose","href","rel","src","alt","Button","p","xs","md","endIcon","onClick","Modal","onClose","Box","top","transform","width","boxShadow","Typography","component","IconButton","cursor","right","useVariantsRef","onIncrement","onDecrement","container","spinUp","querySelector","incrementButton","cloneNode","parentNode","replaceChild","spinDown","decrementButton","QuickPricerResponse","modalParams","setModalParams","setVariant","variantIdx","setVariantIdx","loanSuccess","loanState","limitsState","ficoInput","ltvInput","fico","ficoValue","ltv","ltvValue","htmlRegexG","idx","variants","currentVariant","handleIncrement","handleDecrement","discount","monthlyPayment","rate","textValue","finalProgram","description","replace","obj","createModalParams","discountPointsRef","monthlyPaymentRef","rateRef","every","validationArray","console","log","el","CircularProgress","eventMethod","eventer","close","dangerouslySetInnerHTML","__html","maxWidth","height","title","btoa","unescape","QPBody","QuickPricer","refLimits","refNewValues","newValues","forEach","elInInputs","cond","push","isEqual","jsonBody","json","errors","code","fetchLimitedInputs","isLoading","styles","spinnerWrapper","spinner","App","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","initialState","convert","rootReducer","combineReducers","action","calculateAsync","watchLimitsEnd","validationState","specialValueIsAvailable","specialValueIsValid","sliderValueIsValid","put","call","takeEvery","sagaMiddleware","createSagaMiddleware","store","createStore","composeWithDevTools","applyMiddleware","thunk","run","app","render","module","exports"],"mappings":"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","file":"static/js/main.7bafd102.chunk.js","sourcesContent":["import * as React from 'react';\r\nimport CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline'\r\nexport default function QuickPricerHeader(params) {\r\n const showBanner = false;\r\n\r\n return (\r\n
\r\n \r\n {showBanner &&
Second Lien is now available! See \"Program\" section.
}\r\n
\r\n );\r\n}\r\n","/* eslint-disable */\r\n/* tslint:disable */\r\n/*\r\n * ---------------------------------------------------------------\r\n * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ##\r\n * ## ##\r\n * ## AUTHOR: acacode ##\r\n * ## SOURCE: https://github.com/acacode/swagger-typescript-api ##\r\n * ---------------------------------------------------------------\r\n */\r\n\r\nexport interface BaseFilterModel {\r\n /** @format int32 */\r\n id: number;\r\n value: string;\r\n\r\n /** @format int32 */\r\n order: number;\r\n\r\n /** @format double */\r\n from?: number;\r\n\r\n /** @format double */\r\n to?: number ;\r\n\r\n /** @format double */\r\n sliderValue?: number;\r\n isDisabled: boolean;\r\n}\r\n\r\n/**\r\n * @format int32\r\n */\r\nexport type ErrorCodes =\r\n | 100\r\n | 101\r\n | 102\r\n | 103\r\n | 104\r\n | 110\r\n | 111\r\n | 150\r\n | 151\r\n | 160\r\n | 161\r\n | 200\r\n | 201\r\n | 202;\r\n\r\nexport interface FilterListResponse {\r\n data?: FilterModel[] | null;\r\n errors?: QpError[] | null;\r\n success?: boolean;\r\n}\r\n\r\nexport interface FilterModel {\r\n /** @format int32 */\r\n id: number;\r\n value: string;\r\n\r\n /** @format int32 */\r\n order: number;\r\n\r\n /** @format double */\r\n from?: number | null;\r\n\r\n /** @format double */\r\n to?: number | null;\r\n\r\n /** @format double */\r\n sliderValue?: number | null;\r\n isDisabled?: boolean | null;\r\n availableValues: BaseFilterModel[];\r\n uiType: UIControlTypes;\r\n name: string;\r\n\r\n /** @format int32 */\r\n defaultValue: number;\r\n checkLimit?: boolean;\r\n\r\n /** @format float */\r\n sliderStep?: number;\r\n}\r\n\r\nexport interface FilterResponse {\r\n data?: FilterModel;\r\n errors?: QpError[] | null;\r\n success?: boolean;\r\n}\r\n\r\nexport interface LoanResponse {\r\n data?: LoanResponseModel;\r\n errors?: QpError[] | null;\r\n success?: boolean;\r\n}\r\n\r\nexport interface LoanResponseModel {\r\n /** @format int32 */\r\n id?: number;\r\n name?: string | null;\r\n description?: string | null;\r\n currentVariant?: number;\r\n variants: {\r\n id: number;\r\n rate: string;\r\n discount: string;\r\n credit: string;\r\n monthlyPayment: string;\r\n }[]\r\n}\r\n\r\nexport interface QpError {\r\n code?: ErrorCodes;\r\n message?: string | null;\r\n}\r\n\r\nexport interface RequestFilterContract {\r\n /** @format int32 */\r\n id?: number;\r\n\r\n /** @format int32 */\r\n value?: number;\r\n\r\n /** @format double */\r\n sliderValue?: number;\r\n}\r\n\r\nexport interface ResponseModel1 {\r\n data?: T;\r\n errors?: QpError[] | null;\r\n success?: boolean;\r\n}\r\n\r\nexport type T = object;\r\n\r\n/**\r\n * @format int32\r\n */\r\nexport type UIControlTypes = 'SelectList' | 'Slider' | 'CheckBox';\r\n\r\nexport type QueryParamsType = Record;\r\nexport type ResponseFormat = keyof Omit;\r\n\r\nexport interface FullRequestParams extends Omit {\r\n /** set parameter to `true` for call `securityWorker` for this request */\r\n secure?: boolean;\r\n /** request path */\r\n path: string;\r\n /** content type of request body */\r\n type?: ContentType;\r\n /** query params */\r\n query?: QueryParamsType;\r\n /** format of response (i.e. response.json() -> format: \"json\") */\r\n format?: ResponseFormat;\r\n /** request body */\r\n body?: unknown;\r\n /** base url */\r\n baseUrl?: string;\r\n /** request cancellation token */\r\n cancelToken?: CancelToken;\r\n}\r\n\r\nexport type RequestParams = Omit;\r\n\r\nexport interface ApiConfig {\r\n baseUrl?: string;\r\n baseApiParams?: Omit;\r\n securityWorker?: (\r\n securityData: SecurityDataType | null,\r\n ) => Promise | RequestParams | void;\r\n customFetch?: typeof fetch;\r\n}\r\n\r\nexport interface HttpResponse extends Response {\r\n data: D;\r\n error: E;\r\n}\r\n\r\ntype CancelToken = Symbol | string | number;\r\n\r\nexport enum ContentType {\r\n Json = 'application/json',\r\n FormData = 'multipart/form-data',\r\n UrlEncoded = 'application/x-www-form-urlencoded',\r\n}\r\n\r\nexport class HttpClient {\r\n public baseUrl: string = '';\r\n private securityData: SecurityDataType | null = null;\r\n private securityWorker?: ApiConfig['securityWorker'];\r\n private abortControllers = new Map();\r\n private customFetch = (...fetchParams: Parameters) => fetch(...fetchParams);\r\n\r\n private baseApiParams: RequestParams = {\r\n credentials: 'same-origin',\r\n headers: {},\r\n redirect: 'follow',\r\n referrerPolicy: 'no-referrer',\r\n };\r\n\r\n constructor(apiConfig: ApiConfig = {}) {\r\n Object.assign(this, apiConfig);\r\n }\r\n\r\n public setSecurityData = (data: SecurityDataType | null) => {\r\n this.securityData = data;\r\n };\r\n\r\n private encodeQueryParam(key: string, value: any) {\r\n const encodedKey = encodeURIComponent(key);\r\n return `${encodedKey}=${encodeURIComponent(typeof value === 'number' ? value : `${value}`)}`;\r\n }\r\n\r\n private addQueryParam(query: QueryParamsType, key: string) {\r\n return this.encodeQueryParam(key, query[key]);\r\n }\r\n\r\n private addArrayQueryParam(query: QueryParamsType, key: string) {\r\n const value = query[key];\r\n return value.map((v: any) => this.encodeQueryParam(key, v)).join('&');\r\n }\r\n\r\n protected toQueryString(rawQuery?: QueryParamsType): string {\r\n const query = rawQuery || {};\r\n const keys = Object.keys(query).filter((key) => 'undefined' !== typeof query[key]);\r\n return keys\r\n .map((key) =>\r\n Array.isArray(query[key])\r\n ? this.addArrayQueryParam(query, key)\r\n : this.addQueryParam(query, key),\r\n )\r\n .join('&');\r\n }\r\n\r\n protected addQueryParams(rawQuery?: QueryParamsType): string {\r\n const queryString = this.toQueryString(rawQuery);\r\n return queryString ? `?${queryString}` : '';\r\n }\r\n\r\n private contentFormatters: Record any> = {\r\n [ContentType.Json]: (input: any) =>\r\n input !== null && (typeof input === 'object' || typeof input === 'string')\r\n ? JSON.stringify(input)\r\n : input,\r\n [ContentType.FormData]: (input: any) =>\r\n Object.keys(input || {}).reduce((formData, key) => {\r\n const property = input[key];\r\n formData.append(\r\n key,\r\n property instanceof Blob\r\n ? property\r\n : typeof property === 'object' && property !== null\r\n ? JSON.stringify(property)\r\n : `${property}`,\r\n );\r\n return formData;\r\n }, new FormData()),\r\n [ContentType.UrlEncoded]: (input: any) => this.toQueryString(input),\r\n };\r\n\r\n private mergeRequestParams(params1: RequestParams, params2?: RequestParams): RequestParams {\r\n return {\r\n ...this.baseApiParams,\r\n ...params1,\r\n ...(params2 || {}),\r\n headers: {\r\n ...(this.baseApiParams.headers || {}),\r\n ...(params1.headers || {}),\r\n ...((params2 && params2.headers) || {}),\r\n },\r\n };\r\n }\r\n\r\n private createAbortSignal = (cancelToken: CancelToken): AbortSignal | undefined => {\r\n if (this.abortControllers.has(cancelToken)) {\r\n const abortController = this.abortControllers.get(cancelToken);\r\n if (abortController) {\r\n return abortController.signal;\r\n }\r\n return void 0;\r\n }\r\n\r\n const abortController = new AbortController();\r\n this.abortControllers.set(cancelToken, abortController);\r\n return abortController.signal;\r\n };\r\n\r\n public abortRequest = (cancelToken: CancelToken) => {\r\n const abortController = this.abortControllers.get(cancelToken);\r\n\r\n if (abortController) {\r\n abortController.abort();\r\n this.abortControllers.delete(cancelToken);\r\n }\r\n };\r\n\r\n public request = async ({\r\n body,\r\n secure,\r\n path,\r\n type,\r\n query,\r\n format,\r\n baseUrl,\r\n cancelToken,\r\n ...params\r\n }: FullRequestParams): Promise> => {\r\n const secureParams =\r\n ((typeof secure === 'boolean' ? secure : this.baseApiParams.secure) &&\r\n this.securityWorker &&\r\n (await this.securityWorker(this.securityData))) ||\r\n {};\r\n const requestParams = this.mergeRequestParams(params, secureParams);\r\n const queryString = query && this.toQueryString(query);\r\n const payloadFormatter = this.contentFormatters[type || ContentType.Json];\r\n const responseFormat = format || requestParams.format;\r\n\r\n return this.customFetch(\r\n `${baseUrl || this.baseUrl || ''}${path}${queryString ? `?${queryString}` : ''}`,\r\n {\r\n ...requestParams,\r\n headers: {\r\n ...(type && type !== ContentType.FormData ? { 'Content-Type': type } : {}),\r\n ...(requestParams.headers || {}),\r\n },\r\n signal: cancelToken ? this.createAbortSignal(cancelToken) : void 0,\r\n body: typeof body === 'undefined' || body === null ? null : payloadFormatter(body),\r\n },\r\n ).then(async (response) => {\r\n const r = response as HttpResponse;\r\n r.data = null as unknown as T;\r\n r.error = null as unknown as E;\r\n\r\n const data = !responseFormat\r\n ? r\r\n : await response[responseFormat]()\r\n .then((data) => {\r\n if (r.ok) {\r\n r.data = data;\r\n } else {\r\n r.error = data;\r\n }\r\n return r;\r\n })\r\n .catch((e) => {\r\n r.error = e;\r\n return r;\r\n });\r\n\r\n if (cancelToken) {\r\n this.abortControllers.delete(cancelToken);\r\n }\r\n\r\n if (!response.ok) throw data;\r\n return data;\r\n });\r\n };\r\n}\r\n\r\n/**\r\n * @title QuickPricer Web Api\r\n * @version version: 1.121.1110.2001\r\n */\r\nexport class Api extends HttpClient {\r\n limits = {\r\n /**\r\n * No description\r\n *\r\n * @tags Limits\r\n * @name LimitsCreate\r\n * @summary Returns a collection of filters with available values, limited by the selected filters.\r\n * @request POST:/Limits\r\n * @response `200` `FilterListResponse` Success\r\n * @response `400` `ResponseModel1` Bad Request\r\n */\r\n limitsCreate: (data: RequestFilterContract[], params: RequestParams = {}) =>\r\n this.request({\r\n path: `/Limits`,\r\n method: 'POST',\r\n body: data,\r\n type: ContentType.Json,\r\n format: 'json',\r\n ...params,\r\n }),\r\n };\r\n loans = {\r\n /**\r\n * No description\r\n *\r\n * @tags Loans\r\n * @name CalculateCreate\r\n * @summary Calculate loan by selected filters.\r\n * @request POST:/Loans/Calculate\r\n * @response `200` `LoanResponse` Success\r\n * @response `400` `ResponseModel1` Bad Request\r\n */\r\n calculateCreate: (data: RequestFilterContract[], params: RequestParams = {}) =>\r\n this.request({\r\n path: `/Loans/Calculate`,\r\n method: 'POST',\r\n body: data,\r\n type: ContentType.Json,\r\n format: 'json',\r\n ...params,\r\n }),\r\n };\r\n programs = {\r\n /**\r\n * No description\r\n *\r\n * @tags Programs\r\n * @name ProgramsList\r\n * @summary Get all available programs.\r\n * @request GET:/Programs\r\n * @response `200` `FilterResponse` Success\r\n * @response `400` `ResponseModel1` Bad Request\r\n */\r\n programsList: (params: RequestParams = {}) =>\r\n this.request({\r\n path: `/Programs`,\r\n method: 'GET',\r\n format: 'json',\r\n ...params,\r\n }),\r\n\r\n /**\r\n * No description\r\n *\r\n * @tags Programs\r\n * @name ProgramsDetail\r\n * @summary Get all filters for a program.\r\n * @request GET:/Programs/{id}\r\n * @response `200` `FilterListResponse` Success\r\n * @response `400` `ResponseModel1` Bad Request\r\n */\r\n programsDetail: (id: number, params: RequestParams = {}) =>\r\n this.request({\r\n path: `/Programs/${id}`,\r\n method: 'GET',\r\n format: 'json',\r\n ...params,\r\n }),\r\n };\r\n}\r\n","import React from 'react';\r\nimport { Autocomplete, FormControl, Paper, TextField } from '@mui/material';\r\nimport { BaseFilterModel } from '../../server/schema/api';\r\n\r\ntype Props = {\r\n id: number;\r\n order: number;\r\n selectedValue?: BaseFilterModel;\r\n name: string;\r\n isValid: boolean;\r\n values?: BaseFilterModel[];\r\n onChange?: (value: BaseFilterModel) => void;\r\n};\r\n\r\nexport const QPAutocomplete: React.FC = ({\r\n isValid,\r\n order,\r\n name,\r\n selectedValue,\r\n onChange,\r\n values = []\r\n}) => {\r\n function handleDataChange(e, value) {\r\n onChange?.(value);\r\n }\r\n\r\n return (\r\n \r\n option.value }\r\n value={selectedValue}\r\n options={values}\r\n getOptionDisabled={(option) => option.isDisabled } \r\n onChange={handleDataChange}\r\n PaperComponent={({ children }) => (\r\n {children}\r\n )}\r\n ListboxProps={{\r\n className: \"qpAutocompleteList\",\r\n style:{\r\n maxHeight: '225px',\r\n }\r\n }}\r\n renderInput={(params) => }\r\n />\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { FormControl, InputLabel, MenuItem, Select } from '@mui/material';\r\nimport { BaseFilterModel } from '../../server/schema/api';\r\n\r\ntype Props = {\r\n id: number;\r\n order: number;\r\n selectedValue?: BaseFilterModel;\r\n name: string;\r\n isValid: boolean;\r\n values?: BaseFilterModel[];\r\n onChange?: (value: BaseFilterModel) => void;\r\n};\r\n\r\nexport const QPMuiSelect: React.FC = ({\r\n isValid,\r\n order,\r\n name,\r\n selectedValue,\r\n onChange,\r\n values = []\r\n}) => {\r\n function handleDataChange(e) {\r\n const valueID = parseInt(e.target.value);\r\n const value = values.find((e) => e.id === valueID);\r\n onChange?.(value!);\r\n }\r\n\r\n\r\n return (\r\n \r\n {name}\r\n \r\n {values.map((item) => (\r\n {item.value}\r\n ))}\r\n \r\n\r\n );\r\n};\r\n","import { Api } from \"./schema/api\";\r\n\r\n\r\nexport const apiClient = new Api({baseUrl: process.env.REACT_APP_ADMORTGAGE_API_URL});","export const FETCH_PROGRAMS = 'PROGRAMS/FETCH_PROGRAMS';\r\nexport const UPDATE_PROGRAMS = 'PROGRAMS/UPDATE_PROGRAMS';\r\nexport const FETCH_INPUTS = 'INPUTS/FETCH_INPUTS';\r\nexport const FETCH_LIMITED_INPUTS_START = 'INPUTS/FETCH_LIMITED_INPUTS_START';\r\nexport const FETCH_LIMITED_INPUTS_END = 'INPUTS/FETCH_LIMITED_INPUTS_END';\r\nexport const UPDATE_INPUTS = 'INPUTS/UPDATE_INPUTS';\r\nexport const UPDATE_NO_LIMIT_INPUTS = 'INPUTS/UPDATE_NO_LIMIT_INPUTS';\r\nexport const CALCULATE_LOAN = 'LOAN/CALCULATE_LOAN';\r\nexport const CALCULATE_LOAN_START = 'LOAN/CALCULATE_LOAN_START';\r\nexport const CALCULATE_LOAN_ERROR = 'LOAN/CALCULATE_LOAN_ERROR';\r\n","import { Dispatch } from 'redux';\r\nimport { apiClient } from '../server/api-client';\r\nimport { HttpResponse, RequestFilterContract, ResponseModel1 } from '../server/schema/api';\r\nimport {\r\n CALCULATE_LOAN_ERROR,\r\n FETCH_INPUTS,\r\n FETCH_LIMITED_INPUTS_END,\r\n FETCH_LIMITED_INPUTS_START,\r\n FETCH_PROGRAMS,\r\n UPDATE_INPUTS, UPDATE_NO_LIMIT_INPUTS,\r\n UPDATE_PROGRAMS,\r\n} from './types';\r\n\r\nexport function fetchPrograms() {\r\n return async (dispatch: Dispatch) => {\r\n const response = await apiClient.programs.programsList();\r\n const result = response.data;\r\n dispatch({ type: FETCH_PROGRAMS, payload: result.data });\r\n const id = result.data?.defaultValue || 0;\r\n await fetchInputs(id)(dispatch);\r\n };\r\n}\r\n\r\nexport function updateInputs(input: any) {\r\n return {\r\n type: UPDATE_INPUTS,\r\n payload: input,\r\n };\r\n}\r\nexport function updateNoLimitInputs(input: any) {\r\n return {\r\n type: UPDATE_NO_LIMIT_INPUTS,\r\n payload: input,\r\n };\r\n}\r\n\r\nexport function updatePrograms(program: any) {\r\n return {\r\n type: UPDATE_PROGRAMS,\r\n payload: program,\r\n };\r\n}\r\n\r\nexport function fetchInputs(programId: number) {\r\n return async (dispatch: Dispatch) => {\r\n const response = await apiClient.programs.programsDetail(programId);\r\n const result = response.data;\r\n dispatch({ type: FETCH_INPUTS, payload: result.data?.filter((i) => i.order !== 99) });\r\n };\r\n}\r\n\r\nexport function fetchLimitedInputs(inputs: RequestFilterContract[], programId: number) {\r\n const data = inputs.map((e) => {\r\n if (e.value && e.sliderValue) {\r\n return { id: e.id, value: e.value };\r\n }\r\n return e;\r\n });\r\n let jsonBody = programId ? [...data, { id: 0, value: programId }] : data;\r\n jsonBody = jsonBody.map((i: any) => {\r\n return { id: i.id, value: i.value, sliderValue: i.sliderValue };\r\n });\r\n return async (dispatch: Dispatch) => {\r\n try {\r\n dispatch({ type: FETCH_LIMITED_INPUTS_START });\r\n const response = await apiClient.limits.limitsCreate(jsonBody);\r\n const json = response.data;\r\n if (json.success === true) {\r\n dispatch({ type: FETCH_LIMITED_INPUTS_END, payload: json.data });\r\n }\r\n } catch (e) {\r\n const programNotFound = (e as HttpResponse).error.errors?.some(\r\n (e) => e.code === 111,\r\n );\r\n if (programNotFound) {\r\n dispatch({ type: CALCULATE_LOAN_ERROR });\r\n }\r\n }\r\n };\r\n}\r\n","import { AppState } from './rootReducer';\r\n\r\nexport const programSelector = (state: AppState) => state.program;\r\nexport const limitsSelector = (state: AppState) => state.limits;\r\nexport const limitsValueSelector = (state: AppState) => state.limits.limits;\r\nexport const inputsSelector = (state: AppState) => state.inputs;\r\nexport const loansSelector = (state: AppState) => state.loans.loan;\r\nexport const loansSuccessSelector = (state: AppState) => state.loans.success;\r\nexport const loansStateSelector = (state: AppState) => state.loans.state;\r\nexport const limitsStateSelector = (state: AppState) => state.limits.state;\r\nexport const validationSelector = (state: AppState) => state.validation;\r\nexport const selectedProgramSelector = (state: AppState) =>\r\n state.program.value || state.program.defaultValue;\r\nexport const configInputsSelector = (state: AppState) =>\r\n inputsSelector(state)\r\n .sort((a, b) => a.order - b.order)\r\n .filter((item, index) => index >= 4 && item.order !== 99);\r\n\r\nexport const headerInputsSelector = (state: AppState) =>\r\n inputsSelector(state)\r\n .sort((a, b) => {\r\n return a.order - b.order;\r\n })\r\n .filter((item, index) => index < 4 && item.order !== 99);\r\n\r\nexport const valuesSelector = (state: AppState) => state.values;\r\n// ((item) => item.order < 4 && item.order !== 99)\r\n","import { useCallback } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { QPAutocomplete } from '../components/inputs/QPAutocomplete';\r\nimport { QPMuiSelect } from '../components/inputs/QPMuiSelect';\r\nimport { updateInputs, updateNoLimitInputs } from '../redux/actions';\r\nimport { limitsSelector, valuesSelector } from '../redux/selectors';\r\nimport { BaseFilterModel, FilterModel } from '../server/schema/api';\r\nexport const useSelect = () => {\r\n const dispatch = useDispatch();\r\n const { limits } = useSelector(limitsSelector);\r\n const values = useSelector(valuesSelector);\r\n return useCallback(\r\n (select: FilterModel) => { \r\n const selectLimits = limits.find((e) => e.id === select.id)?.availableValues || [];\r\n\r\n const options = select.availableValues.map((value) => {\r\n const limit = selectLimits.find((e) => e.id === value.id);\r\n return {\r\n ...value,\r\n isDisabled: limit ? limit.isDisabled : true,\r\n };\r\n });\r\n const selectedValueId = values.find((e) => e.id === select.id)?.value;\r\n const selectedValue = options.find((e) => e.id === selectedValueId);\r\n const isValid = !selectedValue?.isDisabled;\r\n const isVisible =\r\n select.checkLimit || (!select.checkLimit && options.some((e) => !e.isDisabled));\r\n const handleChange = (value: BaseFilterModel) => {\r\n const isValid = !value.isDisabled;\r\n dispatch({ type: 'SET_IS_VALID', payload: { [select.id]: isValid } });\r\n if (select.checkLimit)\r\n dispatch(updateInputs({ id: select.id, value: value.id }));\r\n else {dispatch(updateNoLimitInputs({ id: select.id, value: value.id }));}\r\n };\r\n return isVisible ? (\r\n options.length > 11 ? : \r\n ) : null;\r\n },\r\n [dispatch, limits, values],\r\n );\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport { FormControl, InputLabel, ListSubheader, ListSubheaderProps, MenuItem, Select } from '@mui/material';\r\nimport { BaseFilterModel } from '../../server/schema/api';\r\n\r\ntype Props = {\r\n id: number;\r\n order: number;\r\n selectedValue?: BaseFilterModel;\r\n name: string;\r\n isValid: boolean;\r\n values?: BaseFilterModel[];\r\n onChange?: (value: BaseFilterModel) => void;\r\n};\r\n\r\nfunction MyListSubheader(props: ListSubheaderProps) {\r\n return ;\r\n}\r\n\r\nMyListSubheader.muiSkipListHighlight = true;\r\nexport default MyListSubheader;\r\n\r\nexport const QPMuiProgramSelect: React.FC = ({\r\n isValid,\r\n order,\r\n name,\r\n selectedValue,\r\n onChange,\r\n values = []\r\n}) => {\r\n const [secondLienPrograms, setSecondLienPrograms] = React.useState([]);\r\n const [firstLienPrograms, setFirstLienPrograms] = React.useState([...values]);\r\n useEffect(() => {\r\n const programs = [...values]\r\n const secondLienProgramIndex = programs.findIndex(program => program.value === 'Non-QM/Second Lien');\r\n setSecondLienPrograms([programs[secondLienProgramIndex]]);\r\n programs.splice(secondLienProgramIndex, 1)\r\n setFirstLienPrograms(programs);\r\n }, [values]);\r\n\r\n function handleDataChange(e) {\r\n const valueID = parseInt(e.target.value);\r\n const value = values.find((e) => e.id === valueID);\r\n onChange?.(value!);\r\n }\r\n\r\n\r\n return (\r\n \r\n {name}\r\n \r\n First Lien\r\n {firstLienPrograms.map((item) => (\r\n {item.value}\r\n ))}\r\n Second Lien\r\n {secondLienPrograms?.map((item) => (\r\n {item?.value}\r\n ))}\r\n \r\n\r\n );\r\n};\r\n","import { useMemo } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useSelect } from '../hooks/use-select';\r\nimport { fetchInputs, updatePrograms } from '../redux/actions';\r\nimport { headerInputsSelector, programSelector } from '../redux/selectors';\r\nimport { QPMuiProgramSelect } from './inputs/QPMuiProgramSelect';\r\n\r\nconst QPSelects = () => {\r\n const dispatch = useDispatch();\r\n const program = useSelector(programSelector);\r\n const inputs = useSelector(headerInputsSelector);\r\n\r\n\r\n const selectedProgram = useMemo(\r\n () =>\r\n !!program?.value\r\n ? program.availableValues?.find((e) => e.id === parseInt(program.value))\r\n : program.availableValues?.find((e) => e.id === program.defaultValue),\r\n [program],\r\n );\r\n\r\n const handleProgramChange = (programSelect) => {\r\n dispatch(updatePrograms({ ...program, value: programSelect.id }));\r\n dispatch(fetchInputs(programSelect.id));\r\n };\r\n const renderSelect = useSelect();\r\n\r\n return (\r\n
\r\n
\r\n \r\n {inputs.map(renderSelect)}\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default QPSelects;\r\n","import { Checkbox } from '@mui/material';\r\nimport {\r\n ColorRangeDataModel,\r\n NumericTextBoxComponent,\r\n SliderComponent,\r\n} from '@syncfusion/ej2-react-inputs';\r\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\r\nimport { BaseFilterModel } from '../../server/schema/api';\r\n\r\ntype Props = {\r\n id: number;\r\n order: number;\r\n min: number;\r\n max: number;\r\n step?: number;\r\n fullValue?: { value?: number; sliderValue?: number };\r\n label?: string;\r\n limitFrom?: number;\r\n limitTo?: number;\r\n isValid: boolean;\r\n specialValues?: BaseFilterModel[];\r\n onChange?: (number) => void;\r\n onSpecialClick?: (data: { type: 'check' | 'uncheck'; special: BaseFilterModel }) => void;\r\n};\r\n\r\nexport const QuickPricerSlider: React.FC = ({\r\n max,\r\n min,\r\n step,\r\n id,\r\n order,\r\n label,\r\n limitFrom,\r\n limitTo,\r\n fullValue = {},\r\n isValid = true,\r\n onChange,\r\n onSpecialClick,\r\n specialValues = [],\r\n}) => {\r\n const { value: specialValue, sliderValue } = fullValue;\r\n const sliderRef = useRef(null);\r\n const [isMouseDown, setMouseDown] = useState(false);\r\n const [numericValue, setSliderNumericValue] = useState(sliderValue);\r\n const [colorRanges, setColorRanges] = useState();\r\n const [limitValue, setLimitValue] = useState();\r\n\r\n const showLimitValue = useMemo(\r\n () => limitValue !== min && limitValue !== max,\r\n [min, max, limitValue],\r\n );\r\n\r\n useEffect(() => {\r\n if (sliderValue !== undefined) {\r\n onInputChange({ value: sliderValue });\r\n }\r\n }, [sliderValue]);\r\n\r\n useEffect(() => {\r\n const red = '#ca363a';\r\n const green = '#00a2ae';\r\n const black70 = '#4d4d4d';\r\n const black40 = '#999999';\r\n const availableColor = !!specialValue ? black40 : green;\r\n const errorColor = !!specialValue ? black70 : red;\r\n const sliderLimitTick = document.getElementById(`slider${id}__limit-tick`);\r\n\r\n if (limitFrom) {\r\n setLimitValue(limitFrom);\r\n setColorRanges([\r\n { start: 0, end: limitFrom, color: errorColor },\r\n { start: limitFrom, end: max, color: availableColor },\r\n ]);\r\n\r\n const limitLength = ((limitFrom - min) * 100) / (max - min);\r\n sliderLimitTick && (sliderLimitTick.style.left = `${limitLength - 1.5}%`);\r\n }\r\n if (limitTo) {\r\n setLimitValue(limitTo);\r\n setColorRanges([\r\n { start: min, end: limitTo, color: availableColor },\r\n { start: limitTo, end: max, color: errorColor },\r\n ]);\r\n\r\n const limitLength = ((max - limitTo) * 100) / (max - min);\r\n sliderLimitTick && (sliderLimitTick.style.left = `${100 - limitLength - 1.5}%`);\r\n }\r\n if (!limitFrom && !limitTo) {\r\n setColorRanges([{ start: min, end: max, color: availableColor }]);\r\n }\r\n }, [limitFrom, limitTo, min, max, id, specialValue]);\r\n\r\n useEffect(() => {\r\n document.getElementById(`slider${id}-numeric-textbox`)!.parentElement!.style.background =\r\n isValid ? '#f1f2f3' : 'rgba(255,0,0,0.2)';\r\n }, [isValid, id]);\r\n\r\n function onInputChange(e) {\r\n if (isMouseDown) {\r\n return;\r\n }\r\n const value = parseFloat(e.value);\r\n const roundStep = step ?? 1;\r\n const roundedValue = Math.round(value / roundStep) * roundStep;\r\n setSliderNumericValue(roundedValue);\r\n if (!e.target) {\r\n onChange?.(roundedValue);\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n const slider = sliderRef?.current;\r\n const handleMouseDown = () => setMouseDown(true);\r\n const handleMouseUp = () => setMouseDown(false);\r\n\r\n slider?.addEventListener('mousedown', handleMouseDown, { capture: true });\r\n slider?.addEventListener('mouseup', handleMouseUp, { capture: true });\r\n\r\n return () => {\r\n slider?.removeEventListener('mousedown', handleMouseDown, { capture: true });\r\n slider?.removeEventListener('mouseup', handleMouseUp, { capture: true });\r\n };\r\n }, []);\r\n\r\n function renderingTicksHandler(args) {\r\n const tickValue = args.value;\r\n const formatedText =\r\n tickValue / 1000000 >= 1\r\n ? parseFloat((tickValue / 1000000).toFixed(1)) + ' M'\r\n : tickValue / 100000 >= 1\r\n ? parseFloat((tickValue / 1000).toFixed(1)) + ' K'\r\n : tickValue;\r\n args.text = formatedText;\r\n }\r\n\r\n const formatedText =\r\n limitValue! / 1000000 >= 1\r\n ? parseFloat((limitValue! / 1000000).toFixed(1)) + ' M'\r\n : limitValue! / 100000 >= 1\r\n ? parseFloat((limitValue! / 1000).toFixed(1)) + ' K'\r\n : limitValue!;\r\n\r\n const renderSpecials = useCallback(\r\n () => (\r\n \r\n {specialValues\r\n .sort((a, b) => a.order - b.order)\r\n .map((special) => {\r\n const isChecked = specialValue === special.id;\r\n const isDisabled = special.isDisabled;\r\n const isValid = !(isChecked && isDisabled);\r\n return (\r\n \r\n \r\n onSpecialClick?.({ type: isChecked ? 'uncheck' : 'check', special })\r\n }\r\n />\r\n \r\n \r\n );\r\n })}\r\n \r\n ),\r\n [specialValues, specialValue, onSpecialClick],\r\n );\r\n return (\r\n = 1250 ? { order: order } : { order: 0 }}\r\n onMouseLeave={() => setMouseDown(false)}\r\n >\r\n \r\n
\r\n setSliderNumericValue(e.value)}\r\n changed={(e) => onInputChange(e)}\r\n ticks={{\r\n placement: 'After',\r\n largeStep: max - min,\r\n showSmallTicks: false,\r\n }}\r\n renderingTicks={renderingTicksHandler.bind(this) as any}\r\n />\r\n \r\n {showLimitValue && formatedText}\r\n \r\n
\r\n {renderSpecials()}\r\n \r\n );\r\n};\r\n","export const validateSlider = (limit: any, value: number | undefined): boolean => {\r\n if (!limit) return true;\r\n if(!value) return false;\r\n if (limit.from) {\r\n return value >= limit.from;\r\n }\r\n\r\n if (limit.to) {\r\n return value <= limit.to;\r\n }\r\n return true;\r\n};\r\n","import { ValuesState } from './redux/valuesReducer';\r\nimport { FilterModel } from './server/schema/api';\r\nimport { validateSlider } from './validators/slider-validator';\r\n\r\nexport const getSliderLimit = (limits: FilterModel[], inputId: number) => {\r\n return limits.find((e) => e.id === inputId)?.availableValues.find((e) => e.id === 999);\r\n};\r\n\r\nexport const dropInvalidOptionalValues = (\r\n inputs: FilterModel[],\r\n limits: FilterModel[],\r\n values: ValuesState,\r\n): ValuesState => {\r\n const validInputsIds = inputs.reduce((result, input) => {\r\n if (input.uiType === 'CheckBox') {\r\n const checkboxLimits = limits.find((e) => e.id === input.id)?.availableValues || [];\r\n const selectedValueId = values.find((e) => e.id === input.id)?.value;\r\n const selectedValue = checkboxLimits.find((e) => e.id === selectedValueId);\r\n const isValid = Boolean(selectedValue);\r\n const shouldDrop = !input.checkLimit && !isValid;\r\n return shouldDrop ? result : [...result, input.id];\r\n }\r\n if (input.uiType === 'Slider') {\r\n const limit = getSliderLimit(limits, input.id);\r\n const value = values.find((e) => e.id === input.id)?.sliderValue;\r\n const isValid = validateSlider(limit, value);\r\n const shouldDrop = !input.checkLimit && !isValid;\r\n return shouldDrop ? result : [...result, input.id];\r\n }\r\n\r\n if (input.uiType === 'SelectList') {\r\n const selectLimits = limits.find((e) => e.id === input.id)?.availableValues || [];\r\n\r\n const options = input.availableValues.map((value) => {\r\n const limit = selectLimits.find((e) => e.id === value.id);\r\n return {\r\n ...value,\r\n isDisabled: limit ? limit.isDisabled : true,\r\n };\r\n });\r\n\r\n const selectedValueId = values.find((e) => e.id === input.id)?.value;\r\n const selectedValue = options.find((e) => e.id === selectedValueId);\r\n const isValid = !selectedValue?.isDisabled;\r\n const shouldDrop = !input.checkLimit && !isValid;\r\n return shouldDrop ? result : [...result, input.id];\r\n }\r\n\r\n return [...result, input.id];\r\n }, [] as number[]);\r\n return values.filter((e) => validInputsIds.includes(e.id));\r\n};\r\n","import { Checkbox } from '@mui/material';\r\nimport React from 'react';\r\nimport { BaseFilterModel } from '../../server/schema/api';\r\n\r\ntype Props = {\r\n order: number;\r\n selectedValue?: BaseFilterModel;\r\n name: string;\r\n isValid: boolean;\r\n values?: BaseFilterModel[];\r\n onChange?: (value: BaseFilterModel) => void;\r\n};\r\n\r\nexport const QPSwitch: React.FC = ({\r\n name,\r\n order,\r\n values,\r\n selectedValue,\r\n isValid,\r\n onChange,\r\n}) => {\r\n const onInputChange = () => {\r\n const wasChecked = selectedValue?.value === '1';\r\n const nextValue = values?.find((e) => (wasChecked ? e.value === '0' : e.value === '1'));\r\n if (nextValue && !nextValue.isDisabled) {\r\n onChange?.(nextValue);\r\n }\r\n };\r\n const availableCount = values?.filter((e) => !e.isDisabled).length || 0;\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import { useSelector } from 'react-redux';\r\nimport { configInputsSelector } from '../redux/selectors';\r\nimport { useSlider } from '../hooks/use-slider';\r\nimport { useSelect } from '../hooks/use-select';\r\nimport { useCheckbox } from '../hooks/use-checkbox';\r\nexport const QPConfig = () => {\r\n const configInputs = useSelector(configInputsSelector);\r\n const renderSlider = useSlider();\r\n const renderSelect = useSelect();\r\n const renderCheckbox = useCheckbox();\r\n\r\n return (\r\n
\r\n {configInputs.map((input) => {\r\n switch (input.uiType) {\r\n case 'SelectList':\r\n return renderSelect(input);\r\n case 'Slider':\r\n return renderSlider(input);\r\n case 'CheckBox':\r\n return renderCheckbox(input);\r\n default:\r\n break;\r\n }\r\n return null;\r\n })}\r\n
\r\n );\r\n};\r\n","import { useCallback } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { QuickPricerSlider } from '../components/inputs/QPSlider';\r\nimport { updateInputs } from '../redux/actions';\r\nimport { limitsSelector, valuesSelector } from '../redux/selectors';\r\nimport { FilterModel } from '../server/schema/api';\r\nimport { getSliderLimit } from '../utils';\r\nimport { validateSlider } from '../validators/slider-validator';\r\n\r\nexport const useSlider = () => {\r\n const dispatch = useDispatch();\r\n const { limits } = useSelector(limitsSelector);\r\n const values = useSelector(valuesSelector);\r\n\r\n return useCallback(\r\n (slider: FilterModel) => {\r\n const sliderTrackLimit = getSliderLimit(limits, slider.id);\r\n const availableSpecials = limits\r\n .find((e) => e.id === slider.id)\r\n ?.availableValues.filter((e) => e.id !== 999);\r\n\r\n const specialValues = slider.availableValues\r\n .filter((e) => e.id !== 999)\r\n .map((special) => {\r\n const isDisabled =\r\n availableSpecials?.find((e) => e.id === special.id)?.isDisabled ?? true;\r\n return { ...special, isDisabled };\r\n });\r\n\r\n const sliderFullValue = values.find((e) => e.id === slider.id);\r\n\r\n const sliderHasSpecialValue = Boolean(sliderFullValue?.value);\r\n\r\n const sliderValueIsValid =\r\n !slider.checkLimit || validateSlider(sliderTrackLimit, sliderFullValue?.sliderValue);\r\n const isValid = sliderValueIsValid || sliderHasSpecialValue;\r\n\r\n const handleChange = (sliderValue: number) => {\r\n const isValid = !slider.checkLimit || validateSlider(sliderTrackLimit, sliderValue);\r\n dispatch({ type: 'SET_IS_VALID', payload: { [slider.id]: isValid } });\r\n dispatch(updateInputs({ id: slider.id, sliderValue: sliderValue }));\r\n };\r\n\r\n const handleSpecialClick = ({ type, special }) => {\r\n dispatch(\r\n updateInputs({\r\n id: slider.id,\r\n sliderValue: sliderFullValue?.sliderValue,\r\n value: type === 'check' ? special.id : undefined,\r\n }),\r\n );\r\n };\r\n\r\n return (\r\n \r\n );\r\n },\r\n [dispatch, values, limits],\r\n );\r\n};\r\n","import { useCallback } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { QPSwitch } from '../components/inputs/QPSwitch';\r\nimport { updateInputs } from '../redux/actions';\r\nimport { limitsSelector, valuesSelector } from '../redux/selectors';\r\nimport { BaseFilterModel, FilterModel } from '../server/schema/api';\r\n\r\nexport const useCheckbox = () => {\r\n const dispatch = useDispatch();\r\n const { limits } = useSelector(limitsSelector);\r\n const values = useSelector(valuesSelector);\r\n return useCallback(\r\n (checkbox: FilterModel) => {\r\n const checkboxLimits = limits.find((e) => e.id === checkbox.id)?.availableValues || [];\r\n\r\n const options = checkbox.availableValues.map((value) => {\r\n const limit = checkboxLimits.find((e) => e.id === value.id);\r\n return {\r\n ...value,\r\n isDisabled: limit ? limit.isDisabled : true,\r\n };\r\n });\r\n\r\n const selectedValueId = values.find((e) => e.id === checkbox.id)?.value;\r\n const selectedValue = options.find((e) => e.id === selectedValueId);\r\n const isValid = !checkbox.checkLimit || Boolean(!selectedValue?.isDisabled);\r\n\r\n const handleChange = (value: BaseFilterModel) => {\r\n const isValid = true;\r\n dispatch({ type: 'SET_IS_VALID', payload: { [checkbox.id]: isValid } });\r\n dispatch(updateInputs({ id: checkbox.id, value: value?.id }));\r\n };\r\n\r\n const isVisible =\r\n checkbox.checkLimit || (!checkbox.checkLimit && options.some((e) => !e.isDisabled));\r\n\r\n return isVisible ? (\r\n \r\n ) : null;\r\n },\r\n [dispatch, limits, values],\r\n );\r\n};\r\n","import headerLogo from '../img/headerLogo.png';\r\nimport * as React from 'react';\r\nimport Box from '@mui/material/Box';\r\nimport Button from '@mui/material/Button';\r\nimport Typography from '@mui/material/Typography';\r\nimport Modal from '@mui/material/Modal';\r\nimport { IconButton } from '@mui/material';\r\nimport InfoOutlinedIcon from '@mui/icons-material/InfoOutlined';\r\n\r\nexport default function QPFooter(params) {\r\n const [open, setOpen] = React.useState(false);\r\n const handleOpen = () => setOpen(true);\r\n const handleClose = () => setOpen(false);\r\n\r\n const style = {\r\n position: 'absolute',\r\n top: '50%',\r\n left: '50%',\r\n transform: 'translate(-50%, -50%)',\r\n width: {\r\n md: 600,\r\n xs: 300,\r\n },\r\n bgcolor: 'background.paper',\r\n boxShadow: 24,\r\n p: {\r\n xs: 2,\r\n md: 3,\r\n },\r\n };\r\n\r\n return (\r\n
\r\n
\r\n
\r\n \r\n \"logo\"\r\n \r\n
\r\n }\r\n onClick={handleOpen}\r\n >\r\n What's new\r\n \r\n \r\n \r\n \r\n Our Quick Pricer can now calculate Non-Qm, Prime Jumbo, Conventional and Government products! Here is how it works:\r\n \r\n x\r\n \r\n \r\n \r\n
    \r\n
  • Set borrower’s parameters in QP
  • \r\n
  • \r\n QP determines available products for set parameters and offers a product with the lowest rate\r\n
  • \r\n
  • \r\n In each parameter there is a range of allowable values applicable for different programs and products\r\n
  • \r\n
  • \r\n Selected values can affect limits in other parameters so that eligible programs can be offered\r\n
  • \r\n
  • \r\n If the selected value is unavailable, you will receive a hint with a parameter that needs to be adjusted\r\n
  • \r\n
  • \r\n Separately selectable states have specific limitations, provided with commentaries. In contrast, “All other states” include all eligible states without any restrictions, where A&D Mortgage operates. Please, check our rate sheets for detailed information about states and restrictions.\r\n
  • \r\n
  • \r\n DTI parameter implemented\r\n
  • \r\n
\r\n *Although we have good artificial intelligence, the final rate may vary.\r\n
\r\n
\r\n \r\n
\r\n A&D Mortgage Quick Pricer is intended for licensed mortgage and real estate professionals only\r\n and is not intended to be utilized by potential borrowers or by the general public. The\r\n information does not take into consideration borrower’s personal financial situation, verified\r\n credit score, income, existing debt, or other factors. This is not a commitment to lend. The\r\n non-binding quotes are not official Loan Estimates under Reg. Z. A&D Mortgage LLC is an equal\r\n opportunity lender. Rate, terms and programs subject to change without notice. Refinancing the \r\n borrowers existing loan, may increase total finance charges over the life of the loan.\r\n
\r\n );\r\n}\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPkAAAAqCAYAAABx5f0RAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAoeSURBVHgB7VxLdts4Fn2g3HOnp93lIHGqp3F6A1FWENcKLA97FGcFllcQewWxV1DOCqysIO5pVyVh0j2PatbnVImsd0lQAUGQBEXoe3DPUSLSIPBI4OJ9KfpF/vOcNgSbJEtAwM7gP/JZugnkggyQhQICArwiwj8ppeN1Eh1jQwYKCAjwjqj4si6iB4IHBCwXkX6waqIHggcELB+ReWJVRA8EDwhYDSLbyWUTPRA8IGB1iOr+sCyiB4IHBKwWUdMffRM9EDwgYPWI2hr4InogeEDAetBKcqAv0QPBAwLWByeSA4sSPRA8IGC9cCY50JXogeABAetHJ5IDrkQPBA8I2Ax0JjnQRvRA8ICAzcFCJAfqiB4IHhCwWViY5IBJ9EDwgIDNwx71hCL6/DttCZ4cyDepoDP9XJrSxaev8djl+sOH0undd250L4hi/nI7i+h9zKAFYY4ZCXr2SxzfUwdIxiClz/q5j19iQQE7Cy+T61OD/yP+sPQFx+t8P0oJA0njT9OZoEfMw2lbH64kN8EbyZg3kgtaAJYxJ0zQF9QBjx/Kz+Z9bxLJK/eY0OnH/8bXFLAwepnrwDaa6IMZHVsIDuxHCY1oiRCCxryQP0OjUn8MHx/IM9fGhz/IUc19B+wwepF8W33wNKLazACT8BUtBmj/if5JYabbAZP5DhYF9QTLe+7SDzaVpvsO2F0s7JNvK8GhzahZm8knf5fDX/8XT6gL2Of++DU+rXTG4Ic8YjPdJBiI/pb//4n6Yd+ln0FCY3bOJHUE5Gfr5oSvLawfbCjTNI8zvE8iumyKM7DVcqcfszt0uvcHyXSPTviZDNFnk7vAcZNsPorjunnJXLCEN+iynJBxwrEQuEdTfk4/69fUuTpFX7yBDvnwqLhnFVe5yOQflOezyW3yKRuA56E/P5zDfPD3e7UOb/T2C/liyyT4sn3yik+a0rVa/EOtWauvW/EduR8byQv8KOVRwtqb8gmeQ8zoheuG0hQHaOonWxQDuqu71kYytTDPhRGctIEX2yWT/cIWy7A9J37eo7rx22IdNlkPpTzhfi/JeLZdxi2AeZox4ZrcGhVMPWrry7dsmBO1GQypGTFvpi+Kzbezub7NabInUg7NycNOygvZDIQNde3hA4iCW8YhJscxeQCT+G2d2Z4MMk3vDBWYvHMhOIB2kav7IfzGPNgyO85I0kQix3FhtWAjbotbmARvkG3kUzYEi6md4Flz5Q5KHHQi+bbnwS0m8wS73a9xpgEnpbYD//7rH5RNeFnbCXpOfgCzukLKx1Kedw22sWl/WbOQpyrOUNHYaM/XvaEVQsUZrGNC25Ixp22ILJaWwrQhvtIk27kv2eBu2bJB/OBhBVxb5CvcQXeSbzvB1a42LJ0UGekysO/3zrjEuzZX5uykLEJ3P7mAWizf++KgoR61x3eRGsRP6aapT1g7LNSJeZ77fo304qcv8SM2JR/gmKob1sjlmWXmLpuT3N8DfBrbpnSFtsVH/xsvXlu24BZ9spzP4HJBZh7wilpQk3mIMSbuF/eNvsxnXgefslnnhOcR13+M41N8IF+dReoUeNuFSjYVeNIR88OZL/iEteyAsp13vpPzTowHOyGPYHPwt6gsx8IRdpHwAsllHBZ9qd07I4O65+/9w3TkYJmNxPMmSCEa3iAIzdbOpX4Ox7z4QMKSJnV4ZnHCxPnkUIuQjZ3SvbK0KmDN+9Jw4GMmTykAqfzSM/b1n1KTqRvRS/OU7tcWffG++UIVEzXOm0/ZLHMSc/xnZLbj54T07HO9L8xHK8l3geCZdkuNhc35av0QWpZN2yuhm/SsmfjS17HjgnQBE/yhcapX39zf6yT31QpkuXO+j6lB5hjxh8Gs2adjQj81F6dJ8AI4z4uqtDGSaO6fN4Wb+Iuf55kaLkXaZKUk/LeogUjclyifeMdyxma7bJ0cyJu2VKtP2cw54e+QYWxvnGUB9ONmTb4rtegWLY4HCzI8Ms7tm+2UnzsmfyhPfkdfzwQCeocH8oq0RYfcObsf09Kt8KYGzcFmaWN/adUXj6kZMF+H2rFsasyBxg+0JPDGFtf+bUBx2hC3N03rJrMc1gV1zAH1kc2ckyxeImqCf9V+ZC3Jd4XgSotXTDFoaZd5Un7upQ9trnL0ZTMP5nNPsIYewzzUFuq+KI9Tck3WCc4x/0b+gDn57l6J+qh3Ymrq5WNjZLOSfJfeJttL6DgVi/u9lJe69tbmKk9eiQSjmIR6AhsQ+8enaWrPhc+MgFUTVFGF1E4dtbSXonzsFJjyhJIVwRvyidqQY72R2ujbzOvSfcNErm0rnEi5NNkY73lnuCY3TCsk37XXRTnI86rvLtlHmxfVTkke5Ta1+LXN71sECE4dSnnLfR4bY1x1GoN9USr7m/vw8T99rfrlHMN4xWao1M9lpuyqINiXTUuuAgKPd+y+jKMZ/fv3v9AUMQikTh1y35BbbzMEAWtI+ZJWKBu3eS/K1YpPZ4M8/Wtrb8pdSqHtGsFtaRHWaseoJmr6pHl6SEf7iysc4EAJp/5BdR1P7DeRB/lMayJWJY3eMKNKWgtjdLIUoohuzXMs/xv9RRhsXIrg40rbhPq6BbV1BGaxDbsg1xbLQSI1muzRhywKHtHbNhKpcUy5M1L++Dc5t2RgjUUt1XDLkG0QVbR2Jpv8QZY2m2xeDuQ5+tZTmXOS7+IPPliKEbDBvWu7LrEXrZy0XCYpN8/mn4YJjM30jA+gv1KuVAXbqAOydJUlEgyio+RUbVyfha1Uky2TzjX/VdyXB6aR2jBBjG8m0dlS+6lv8BJgUt7aCkpASB7/G+47yV9PPnLt05ds2ZyIyuYrmfy3kE1/PkqhoJjrZ2xK+J6RfBcJbi1uEG5+Ncxy1uZX5UvpyENxzBQkZII/803wAkhrza2SBYNtrP3P6nxr7QWLEtCer3tNfSGslsCwIJdZ1YfniLx7S5EPm2ftVtNAZC/52FyyfSdrwBzUo2xspZ3WzAnmYmjZfPaLGFC0sz/ZFFU174zcI9lKm5ewQKlrXg6JskNBZ6hQQsGCz7z7MgD51OJsrcbKwO2S3DLpfV8wc5vGFZYyYJAJxSFZRRrq7YtST1UtxxveIw5wmrLFZj9IR0bc3kH7TsgRvmTrPCcsI974w5cVZxUCtg0yf9UUi/O5psXnr5rCX+z6E1Qu4CDiSBUwfX/VMy+HvTAr4FxeDVavvA61U5OGV03lAG3N8QVN+Blc8WdqZkrq+vItWyEf5kRlAAr58ih8LuON/owCyQO2GurtLLw5di9mdGUSqvaVWfb1l107sCmy9f4hx4CAdYKDSifKwsAPORyzVsw0PhXFKGlWHVbNbFD/IqRtkS1o8oCthcx/ROEbdcVqtPjGyDaggIAtxXQ6/f9fH+x/US+XuFQ1wq/+1ypKfDdJtqDJA3YCWaAuoSFHsJ/qaT5VEhrz+VvOmNysI7Oxbtn+BHxysqCJRtjYAAAAAElFTkSuQmCC\"","import { useRef, useEffect, MutableRefObject } from \"react\";\r\n\r\nexport const useVariantsRef = (onIncrement, onDecrement): MutableRefObject => {\r\n const ref = useRef(null);\r\n useEffect(() => {\r\n if (!ref.current) {\r\n return;\r\n }\r\n const container = (ref.current as any).container as HTMLDivElement;\r\n const spinUp = container.querySelector('.e-spin-up');\r\n const incrementButton = spinUp?.cloneNode(true);\r\n if (incrementButton) {\r\n spinUp?.parentNode?.replaceChild(incrementButton, spinUp);\r\n incrementButton?.addEventListener('click', onIncrement);\r\n }\r\n const spinDown = container.querySelector('.e-spin-down');\r\n const decrementButton = spinDown?.cloneNode(true);\r\n if (decrementButton) {\r\n spinDown?.parentNode?.replaceChild(decrementButton, spinDown);\r\n decrementButton?.addEventListener('click', onDecrement);\r\n }\r\n\r\n return () => {\r\n incrementButton?.removeEventListener('click', onIncrement);\r\n decrementButton?.removeEventListener('click', () => onDecrement);\r\n }\r\n\r\n });\r\n return ref;\r\n}","import React, { useEffect, useState } from 'react';\r\nimport { NumericTextBoxComponent } from '@syncfusion/ej2-react-inputs';\r\nimport { useSelector } from 'react-redux';\r\nimport {\r\n inputsSelector,\r\n limitsStateSelector,\r\n loansSelector,\r\n loansStateSelector,\r\n loansSuccessSelector,\r\n programSelector,\r\n validationSelector,\r\n valuesSelector,\r\n} from '../redux/selectors';\r\nimport { useVariantsRef } from '../hooks/use-variants-ref';\r\nimport { Box, CircularProgress, Modal } from '@mui/material';\r\nimport ShareIcon from '@mui/icons-material/Share';\r\n\r\nexport default function QuickPricerResponse(props) {\r\n const loan = useSelector(loansSelector);\r\n\r\n const [open, setOpen] = React.useState(false);\r\n const [modalParams, setModalParams] = React.useState('');\r\n const handleOpen = () => setOpen(true);\r\n const handleClose = () => setOpen(false);\r\n\r\n const [variant, setVariant] = useState(null);\r\n const [variantIdx, setVariantIdx] = useState(0);\r\n\r\n const loanSuccess = useSelector(loansSuccessSelector);\r\n const program = useSelector(programSelector);\r\n const loanState = useSelector(loansStateSelector);\r\n const limitsState = useSelector(limitsStateSelector);\r\n const validation = useSelector(validationSelector);\r\n const inputs = useSelector(inputsSelector);\r\n const values = useSelector(valuesSelector);\r\n const ficoInput = inputs.find((i) => i.name === 'FICO');\r\n const ltvInput = inputs.find((i) => i.name === 'LTV');\r\n const fico = values.find((i) => i.id === ficoInput?.id);\r\n const ficoValue = fico?.value\r\n ? ficoInput?.availableValues.find((e) => e.id === fico.value)?.value\r\n : fico?.sliderValue ?? '';\r\n const ltv = values.find((i) => i.id === ltvInput?.id);\r\n const ltvValue = ltv?.value\r\n ? ltvInput?.availableValues.find((e) => e.id === ltv.value)?.value\r\n : ltv?.sliderValue ?? '';\r\n\r\n const htmlRegexG = /<(?:\"[^\"]*\"['\"]*|'[^']*'['\"]*|[^'\">])+>/g;\r\n\r\n useEffect(() => {\r\n const idx = loan?.variants.findIndex((e) => e.id === loan.currentVariant);\r\n setVariantIdx(idx ?? 0);\r\n }, [loan]);\r\n\r\n useEffect(() => setVariant(loan?.variants[variantIdx]), [loan, variantIdx]);\r\n\r\n const handleIncrement = () => {\r\n if (variantIdx !== (loan?.variants || []).length - 1) {\r\n setVariantIdx(variantIdx + 1);\r\n }\r\n };\r\n const handleDecrement = () => {\r\n if (variantIdx !== 0) {\r\n setVariantIdx(variantIdx - 1);\r\n }\r\n };\r\n\r\n const createModalParams = (values, inputs) => {\r\n const modalParams = values.map((value) => ({\r\n // id: value.id,\r\n value: !!value.value ? value.value : value.sliderValue,\r\n name: inputs.find((i) => i.id === value.id).name,\r\n textValue: !!value.value\r\n ? inputs.find((i) => i.id === value.id).availableValues.find((i) => i.id === value.value)\r\n ?.value\r\n : value.sliderValue,\r\n }));\r\n\r\n return modalParams.reduce(\r\n (obj, item) =>\r\n Object.assign(obj, { [item.name]: { value: item.value, textValue: item.textValue } }),\r\n {},\r\n );\r\n };\r\n\r\n useEffect(\r\n () =>\r\n setModalParams(\r\n JSON.stringify({\r\n ...{\r\n discount: { value: variant?.discount },\r\n monthlyPayment: { value: variant?.monthlyPayment },\r\n rate: { value: variant?.rate },\r\n },\r\n ...{\r\n program: {\r\n value: program.availableValues[0].id,\r\n textValue: program.availableValues[0].value,\r\n },\r\n },\r\n ...{\r\n finalProgram: { value: loan?.id, textValue: loan?.name },\r\n description: { value: loan?.description?.replace(htmlRegexG,\"\") },\r\n },\r\n ...createModalParams(values, inputs),\r\n }),\r\n ),\r\n [htmlRegexG, inputs, loan?.description, loan?.id, loan?.name, program.availableValues, values, variant?.discount, variant?.monthlyPayment, variant?.rate],\r\n );\r\n\r\n const discountPointsRef = useVariantsRef(handleIncrement, handleDecrement);\r\n const monthlyPaymentRef = useVariantsRef(handleIncrement, handleDecrement);\r\n const rateRef = useVariantsRef(handleIncrement, handleDecrement);\r\n\r\n if (!Object.values(validation).every((isValid) => isValid)) {\r\n const validationArray = Object.keys(validation).reduce((result, id) => {\r\n if (!validation[id]) {\r\n const name = inputs.find((e) => `${e.id}` === id)?.name;\r\n if (name) {\r\n return [...result, name];\r\n }\r\n }\r\n return result;\r\n }, [] as string[]);\r\n\r\n console.log('condition >>' ,validation);\r\n \r\n console.log('validationArray >>', validationArray);\r\n if (!!validationArray.length) {\r\n return (\r\n
\r\n

Values are out of limit

\r\n
\r\n
\r\n
    \r\n {validationArray.map((el) => {\r\n return (\r\n
  • \r\n

    {el}

    \r\n
  • \r\n );\r\n })}\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n\r\n }\r\n\r\n if (limitsState !== 'DONE' || loanState !== 'DONE') {\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n if (!loanSuccess) {\r\n return (\r\n
\r\n

Could not find program for selected filters

\r\n
\r\n );\r\n }\r\n\r\n const styleModal = {\r\n maxWidth: '100%',\r\n position: 'absolute' as 'absolute',\r\n top: '50%',\r\n left: '50%',\r\n transform: 'translate(-50%, -50%)',\r\n width: '600px',\r\n height: '850px',\r\n bgcolor: 'background.paper',\r\n boxShadow: 24,\r\n p: 0.625,\r\n };\r\n\r\n // Create IE + others compatible event handler\r\n var eventMethod = (window.addEventListener as any) ? 'addEventListener' : 'attachEvent';\r\n var eventer = window[eventMethod];\r\n var messageEvent = eventMethod === 'attachEvent' ? 'onmessage' : 'message';\r\n\r\n // Listen to message from child window\r\n eventer(\r\n messageEvent,\r\n function (e) {\r\n // console.log('parent received message!: ', e.data);\r\n if (e.data.close) {\r\n handleClose();\r\n // console.log(\r\n // 'modalParams :>> ',\r\n // JSON.stringify({\r\n // ...{\r\n // program: {\r\n // value: program.availableValues[0].id,\r\n // textValue: program.availableValues[0].value,\r\n // },\r\n // },\r\n // ...{ finalProgram: { value: loan?.id, textValue: loan?.name } },\r\n // ...modalParams,\r\n // }),\r\n // );\r\n }\r\n },\r\n false,\r\n );\r\n\r\n return (\r\n
\r\n

One loan program found

\r\n
\r\n
\r\n

{loan?.name}

\r\n
\r\n \r\n {`FICO: ${ficoValue}`}\r\n \r\n
Min FICO: {ficoInput?.from}
\r\n
\r\n \r\n {`LTV: ${ltvValue}`}\r\n \r\n
Max LTV: {ltvInput?.to}
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n = 0 ? 'Discount points' : 'Lender Credit'\r\n }\r\n />\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n\r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n}\r\n","import React from 'react';\r\nimport { QPConfig } from './QPConfig';\r\nimport QPFooter from './QPFooter';\r\nimport QPResponse from './QPResponse';\r\nexport default function QPBody() {\r\n return (\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n );\r\n}\r\n","import '../../scss/quickPricer.scss';\r\n\r\nimport React, { useRef } from 'react';\r\nimport CircularProgress from '@mui/material/CircularProgress';\r\n\r\nimport { useEffect } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport QPHeader from '../../components/QPHeader';\r\nimport QPSelects from '../../components/QPSelects';\r\nimport QPBody from '../../components/QPBody';\r\nimport { fetchLimitedInputs, fetchPrograms } from '../../redux/actions';\r\nimport { isEqual } from 'lodash';\r\nimport {\r\n inputsSelector,\r\n limitsStateSelector,\r\n limitsValueSelector,\r\n programSelector,\r\n valuesSelector,\r\n} from '../../redux/selectors';\r\nimport styles from './quickPricer.module.css';\r\nfunction QuickPricer(params) {\r\n const dispatch = useDispatch();\r\n const limits = useSelector(limitsValueSelector);\r\n const state = useSelector(limitsStateSelector);\r\n const inputs = useSelector(inputsSelector);\r\n const program = useSelector(programSelector);\r\n const values = useSelector(valuesSelector);\r\n let refLimits = useRef();\r\n let refNewValues = useRef();\r\n useEffect(() => dispatch(fetchPrograms()), [dispatch]);\r\n useEffect(() => {\r\n if (inputs.length === 0) return;\r\n // if (isEqual(limits, refLimits.current)) return;\r\n const newValues = [];\r\n values.forEach((i, index) => {\r\n let elInInputs = inputs.find((e) => e.id === i.id);\r\n const cond = limits.find((e) => e.id === i.value)?.availableValues.find((e) => i.id === e.id);\r\n\r\n if (elInInputs.checkLimit || cond) {\r\n newValues.push(i);\r\n }\r\n refLimits.current = limits;\r\n });\r\n if (\r\n isEqual(\r\n refNewValues.current?.sort((a, b) => a.id - b.id),\r\n newValues.sort((a, b) => a.id - b.id),\r\n )\r\n )\r\n return;\r\n refNewValues.current = newValues;\r\n dispatch(\r\n fetchLimitedInputs(newValues, program.value ? parseInt(program.value) : program.defaultValue),\r\n );\r\n }, [dispatch, program, inputs, values, limits, state]);\r\n\r\n const isLoading = limits.length === 0;\r\n\r\n return (\r\n
\r\n
\r\n \r\n
\r\n {isLoading ? (\r\n
\r\n \r\n
\r\n ) : (\r\n <>\r\n {}\r\n \r\n \r\n )}\r\n
\r\n );\r\n}\r\n\r\nexport default QuickPricer;\r\n","import QuickPricer from './pages/quickPricer/quickPricer';\r\n\r\nfunction App() {\r\n\treturn (\r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default App;\r\n","const reportWebVitals = onPerfEntry => {\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 { FilterModel } from '../server/schema/api';\r\nimport { FETCH_INPUTS } from './types';\r\n\r\nexport type InputsState = FilterModel[];\r\n\r\nconst initialState: InputsState = [];\r\n\r\nexport const inputsReducer = (state = initialState, action) => {\r\n switch (action.type) {\r\n case FETCH_INPUTS:\r\n return action.payload;\r\n default:\r\n return state;\r\n }\r\n};\r\n","import { FilterModel } from '../server/schema/api';\r\nimport { FETCH_LIMITED_INPUTS_END, FETCH_LIMITED_INPUTS_START } from './types';\r\n\r\nexport type LimitsState = {\r\n state: 'NONE' | 'PENDING' | 'DONE';\r\n limits: FilterModel[];\r\n};\r\nconst initialState: LimitsState = {\r\n state: 'NONE',\r\n limits: [],\r\n};\r\n\r\nexport const limitsReducer = (state = initialState, action): LimitsState => {\r\n switch (action.type) {\r\n case FETCH_LIMITED_INPUTS_START:\r\n return { ...state, state: 'PENDING' };\r\n case FETCH_LIMITED_INPUTS_END:\r\n return { state: 'DONE', limits: action.payload as FilterModel[] };\r\n default:\r\n return state;\r\n }\r\n};\r\n","import { LoanResponseModel } from '../server/schema/api';\r\nimport { CALCULATE_LOAN, CALCULATE_LOAN_ERROR, CALCULATE_LOAN_START } from './types';\r\n\r\nexport type LoansState = {\r\n loan?: LoanResponseModel;\r\n success: boolean;\r\n state: any;\r\n};\r\nconst initialState: LoansState = {\r\n success: true,\r\n state: 'NONE'\r\n};\r\n\r\nexport const loansReducer = (state = initialState, action) => {\r\n switch (action.type) {\r\n case CALCULATE_LOAN:\r\n return {success: true, loan: action.payload, state: 'DONE'};\r\n case CALCULATE_LOAN_ERROR:\r\n return { success: false, state: 'DONE'}\r\n case CALCULATE_LOAN_START:\r\n return { success: false, state: 'PENDING'}\r\n default:\r\n return state;\r\n }\r\n};\r\n","import { FilterModel } from '../server/schema/api';\r\nimport { FETCH_PROGRAMS, UPDATE_PROGRAMS } from './types';\r\n\r\nexport type ProgramState = FilterModel;\r\nconst initialState: ProgramState = {} as any;\r\n\r\nexport const programReducer = (state = initialState, action) => {\r\n switch (action.type) {\r\n case FETCH_PROGRAMS:\r\n return action.payload;\r\n case UPDATE_PROGRAMS:\r\n return action.payload;\r\n default:\r\n return state;\r\n }\r\n};\r\n","export type ValidationState = { [id: number]: boolean };\r\nconst initialState: ValidationState = {};\r\n\r\nexport const validationReducer = (state = initialState, action) => {\r\n switch (action.type) {\r\n case 'SET_IS_VALID':\r\n return { ...state, ...action.payload };\r\n case 'SET_IS_VALID_BATCH':\r\n return { ...state, ...action.payload };\r\n default:\r\n return state;\r\n }\r\n};\r\n","import { FilterModel } from '../server/schema/api';\r\nimport { FETCH_INPUTS, UPDATE_INPUTS, UPDATE_NO_LIMIT_INPUTS } from './types';\r\n\r\nexport type ValuesState = { id: number; value?: number; sliderValue?: number }[];\r\n\r\nconst initialState: ValuesState = [];\r\n\r\nconst convert = (payload: FilterModel[]): ValuesState => {\r\n return payload.map((input) => {\r\n return input.uiType === 'Slider'\r\n ? {\r\n id: input.id,\r\n sliderValue: input.defaultValue,\r\n }\r\n : { id: input.id, value: input.defaultValue };\r\n });\r\n};\r\n\r\nexport const valuesReducer = (state = initialState, action) => {\r\n switch (action.type) {\r\n case FETCH_INPUTS:\r\n return convert(action.payload);\r\n case UPDATE_INPUTS:\r\n return [...state.filter((e) => e.id !== action.payload.id), action.payload];\r\n case UPDATE_NO_LIMIT_INPUTS:\r\n return [...state.filter((e) => e.id !== action.payload.id), action.payload];\r\n default:\r\n return state;\r\n }\r\n};\r\n","import { combineReducers } from 'redux';\r\nimport { inputsReducer, InputsState } from './inputsReducer';\r\nimport { limitsReducer, LimitsState } from './limits-reducer';\r\nimport { loansReducer, LoansState } from './loans-reducer';\r\nimport { programReducer, ProgramState } from './program-reducer';\r\nimport { validationReducer, ValidationState } from './validation-reducer';\r\nimport { valuesReducer, ValuesState } from './valuesReducer';\r\n\r\nexport type AppState = {\r\n program: ProgramState;\r\n inputs: InputsState;\r\n limits: LimitsState;\r\n loans: LoansState;\r\n validation: ValidationState;\r\n values: ValuesState;\r\n};\r\n\r\nexport const rootReducer = combineReducers({\r\n program: programReducer,\r\n inputs: inputsReducer,\r\n limits: limitsReducer,\r\n loans: loansReducer,\r\n validation: validationReducer,\r\n values: valuesReducer,\r\n});\r\n","import { call, put, select, takeEvery } from 'typed-redux-saga';\r\nimport { apiClient } from '../server/api-client';\r\nimport { dropInvalidOptionalValues, getSliderLimit } from '../utils';\r\nimport { validateSlider } from '../validators/slider-validator';\r\nimport { inputsSelector, limitsSelector, programSelector, valuesSelector } from './selectors';\r\n\r\nimport {\r\n CALCULATE_LOAN,\r\n FETCH_LIMITED_INPUTS_END,\r\n CALCULATE_LOAN_ERROR,\r\n CALCULATE_LOAN_START,\r\n UPDATE_NO_LIMIT_INPUTS,\r\n} from './types';\r\nimport { ValidationState } from './validation-reducer';\r\n//TODO: extract logic and combine with drop...\r\nexport function* calculateAsync() {\r\n try {\r\n const program: ReturnType = yield select(programSelector);\r\n const inputs: ReturnType = yield select(inputsSelector);\r\n const { limits }: ReturnType = yield select(limitsSelector);\r\n const values: ReturnType = yield select(valuesSelector);\r\n\r\n const validationState = inputs.reduce((result, input) => {\r\n if (input.uiType === 'CheckBox') {\r\n const checkboxLimits = limits.find((e) => e.id === input.id)?.availableValues || [];\r\n const selectedValueId = values.find((e) => e.id === input.id)?.value;\r\n const selectedValue = checkboxLimits.find((e) => e.id === selectedValueId);\r\n const isValid = !input.checkLimit || Boolean(selectedValue);\r\n return { ...result, [input.id]: isValid };\r\n }\r\n if (input.uiType === 'Slider') {\r\n const sliderTrackLimit = getSliderLimit(limits, input.id);\r\n\r\n const availableSpecials = limits\r\n .find((e) => e.id === input.id)\r\n ?.availableValues.filter((e) => e.id !== 999);\r\n\r\n const specialValues = input.availableValues\r\n .filter((e) => e.id !== 999)\r\n .map((special) => {\r\n const isDisabled =\r\n availableSpecials?.find((e) => e.id === special.id)?.isDisabled ?? true;\r\n return { ...special, isDisabled };\r\n });\r\n\r\n const sliderFullValue = values.find((e) => e.id === input.id);\r\n\r\n const sliderHasSpecialValue = Boolean(sliderFullValue?.value);\r\n const specialValueIsAvailable = !specialValues.find((e) => e.id === sliderFullValue?.value)\r\n ?.isDisabled;\r\n\r\n const specialValueIsValid =\r\n !input.checkLimit ||\r\n (sliderHasSpecialValue && specialValueIsAvailable) ||\r\n !sliderHasSpecialValue;\r\n\r\n const sliderValueIsValid =\r\n !input.checkLimit || validateSlider(sliderTrackLimit, sliderFullValue?.sliderValue);\r\n\r\n const isValid =\r\n (sliderHasSpecialValue && specialValueIsValid) ||\r\n (!sliderHasSpecialValue && sliderValueIsValid);\r\n\r\n return { ...result, [input.id]: isValid };\r\n }\r\n if (input.uiType === 'SelectList') {\r\n const selectLimits = limits.find((e) => e.id === input.id)?.availableValues || [];\r\n\r\n const options = input.availableValues.map((value) => {\r\n const limit = selectLimits.find((e) => e.id === value.id);\r\n return {\r\n ...value,\r\n isDisabled: limit ? limit.isDisabled : true,\r\n };\r\n }); \r\n\r\n const selectedValueId = values.find((e) => e.id === input.id)?.value;\r\n const selectedValue = options.find((e) => e.id === selectedValueId); \r\n const isValid = options.every(el => el.isDisabled) || !selectedValue?.isDisabled;\r\n return { ...result, [input.id]: isValid };\r\n }\r\n\r\n return result;\r\n }, {} as ValidationState);\r\n\r\n yield put({ type: 'SET_IS_VALID_BATCH', payload: validationState });\r\n yield put({ type: CALCULATE_LOAN_START });\r\n if (Object.values(validationState).every((isValid) => isValid)) {\r\n const body = [\r\n ...dropInvalidOptionalValues(inputs, limits, values),\r\n { id: 0, value: program.value ? parseInt(program.value) : program.defaultValue },\r\n ];\r\n const response = yield call(apiClient.loans.calculateCreate as any, body);\r\n if (response.data.success) {\r\n yield put({ type: CALCULATE_LOAN, payload: response.data.data });\r\n } else {\r\n yield put({ type: CALCULATE_LOAN_ERROR });\r\n }\r\n }\r\n } catch (error) {\r\n yield put({ type: CALCULATE_LOAN_ERROR });\r\n }\r\n}\r\nexport function* watchLimitsEnd() {\r\n yield takeEvery([FETCH_LIMITED_INPUTS_END, UPDATE_NO_LIMIT_INPUTS], calculateAsync);\r\n}\r\n","import React from 'react';\r\nimport { render } from 'react-dom';\r\nimport App from './App';\r\nimport reportWebVitals from './reportWebVitals';\r\nimport { applyMiddleware, createStore } from 'redux';\r\nimport { Provider } from 'react-redux';\r\nimport thunk from 'redux-thunk';\r\nimport { rootReducer } from './redux/rootReducer';\r\nimport createSagaMiddleware from 'redux-saga';\r\nimport { composeWithDevTools } from 'redux-devtools-extension';\r\nimport { watchLimitsEnd } from './redux/calculate-saga';\r\n\r\n// if (process.env.NODE_ENV === 'development') {\r\n// const { worker } = require('./server/mocks/browser');\r\n// worker.start({ onUnhandledRequest: 'bypass' });\r\n// }\r\n\r\nconst sagaMiddleware = createSagaMiddleware();\r\nconst store = createStore(rootReducer, composeWithDevTools(applyMiddleware(thunk, sagaMiddleware)));\r\nsagaMiddleware.run(watchLimitsEnd);\r\nconst app = (\r\n \r\n \r\n \r\n);\r\nrender(app, document.getElementById('root'));\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(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nreportWebVitals();\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"spinnerWrapper\":\"quickPricer_spinnerWrapper__33yRy\",\"spinner\":\"quickPricer_spinner__x3W4B\"};"],"sourceRoot":""}