{"version":3,"sources":["serviceWorker.ts","Api/FxRates.tsx","Api/PapiClient.tsx","Login/LoginForm.tsx","Grid/Columns.ts","Login/State.ts","Markets/MarketsGrid.tsx","Localisation/strings.ts","Platform/State.ts","Account/SwitchAccountButton.tsx","LogoutButton.tsx","Platform/PlatformLayout.tsx","Localisation/IntlProvider.tsx","Store/RootReducer.ts","Store/StoreProvider.tsx","TradeHistory/TradeHistoryGridRow.ts","Session/PapiProviderWithSession.ts","Push/SubscriptionLifecycle.tsx","Positions/StreamingOpenPositions.tsx","Localisation/FormattedCurrency.tsx","Localisation/FormattedPrice.tsx","Localisation/Converters.ts","Grid/Renderers.tsx","Positions/PositionsGrid.tsx","Positions/GroupPositionsByMarketAndCurrency.ts","Positions/ActiveTradingAccountStreamingOpenPositionsGrid.tsx","Trades/StreamingOpenTrades.tsx","Grid/Sorters.ts","Trades/TradesGrid.tsx","Trades/TradesByMarketAndValueDateGrid.tsx","Trades/ActiveTradingAccountStreamingOpenTradesByMarketAndValueDateGrid.tsx","Positions/ActiveTradingAccountStreamingOpenPositionsWithTradesByMarketAndValueDateGrids.tsx","Localisation/FormattedProductType.tsx","TradingAccountResources/StreamingTradingAccountResources.tsx","Account/AccountSelectorTradingAccountListItem.tsx","Account/AccountSelectorTradingAccountList.tsx","ClientAccountResources/StreamingClientAccountResources.tsx","Account/AccountSelectorClientAccountDescription.tsx","Account/AccountSelector.tsx","TradingAccountResources/TradingAccountResources.tsx","TradingAccountResources/ActiveTradingAccountStreamingResources.tsx","Input/DatePickerExtensions.ts","TradeHistory/SpotFx/SpotFxTradeHistorySearchForm.tsx","TradeHistory/SpotFx/SpotFxTradeHistoryGrid.tsx","Api/PapiHoc.tsx","TradeHistory/SpotFx/SpotFxTradeHistory.tsx","TradeHistory/SpotFx/ActiveTradingAccountSpotFxTradeHistory.tsx","Localisation/FormattedStatementPeriod.tsx","Statements/StatementsList.tsx","Statements/StatementsSearchForm.tsx","Statements/Statements.tsx","Statements/ActiveTradingAccountStatements.tsx","Trades/ActiveTradingAccountStreamingOpenTradesGrid.tsx","TradeHistory/TradeHistorySearchForm.tsx","TradeHistory/TradeHistoryGrid.tsx","TradeHistory/TradeHistory.tsx","TradeHistory/ActiveTradingAccountTradeHistory.tsx","App.tsx","index.tsx"],"names":["Boolean","window","location","hostname","match","FxRatesContext","React","createContext","FxRatesProviderCmp","props","_this","Object","classCallCheck","this","possibleConstructorReturn","getPrototypeOf","call","getAndOrSubscribeFxRate","fromCurrency","toCurrency","_this$state","state","fxRates","inFlight","fxRateKey","createKey","fxRate","isInFlight","undefined","storeInFlight","fetchAndSubscribeToFxRate","_ref","asyncToGenerator","regenerator_default","a","mark","_callee","fxRateFetchResult","wrap","_context","prev","next","tryFetch","sent","abrupt","storeFxRateChange","swanApiClient","streamExchangeRates","subscriptionKey","consumeUpdate","start","stop","_x","_x2","_x3","apply","arguments","newFxRates","objectSpread2","setState","updatedExchangeRates","forEach","x","update","FromCurrency","toString","ToCurrency","Rate","concat","react_default","createElement","Provider","value","children","nextProps","nextState","newInFlight","getExchangeRate","Content","Key","clearInFlight","Component","FxRatesConsumer","Consumer","FxRatesProvider","defaultAuthenticationContext","login","Promise","resolve","success","loginFromToken","client","isAuthenticated","authenticationInProgress","deauthenticate","PapiAuthenticationContext","ActiveTradingAccountContext","PapiAuthenticationProvider","_React$Component","existingToken","url","username","password","accountOperatorKey","result","response","accountResponse","authenticate","message","console","error","authenticationResponse","getAccount","updateAuthenticatedState","t0","_callee2","config","_context2","getLightstreamerConfiguration","connectToPush","componentWillMount","_callee3","_context3","setClientAccount","setTradingAccounts","TradingAccounts","setLinkedTradingAccounts","LinkedTradingAccounts","setActiveTradingAccount","SwanPublicClient","inherits","createClass","key","authenticationContextState","activeTradingAccountContextState","activeTradingAccount","react","PapiAuthenticationConsumer","PapiClientContext","PapiClientProvider","_React$Component2","PapiClientConsumer","ActiveTradingAccountConsumer","FormItem","es_form","Item","ColumnVisibility","loginForm","create","injectIntl","_useState","useState","_useState2","slicedToArray","loading","setLoading","remember","getFieldDecorator","form","usernamePlaceholder","intl","formatMessage","id","usernameValidationMessage","passwordPlaceholder","passwordValidationMessage","onSubmit","e","preventDefault","saveSessionAction","saveLoginRememberAction","validateFields","err","values","onLogin","then","currencies","Configuration","Currencies","y","token","Authentication","Token","handleSubmit","className","src","width","height","style","display","margin","alt","typography","Paragraph","textAlign","href","target","rel","rules","required","input","prefix","icon","type","placeholder","valuePropName","initialValue","es_checkbox","es_button","htmlType","LoginForm","connect","dispatch","session","saveLoginRemember","GridColumnsProvider","columnPreferences","columns","columnsByKey","getColumns","filter","visibility","Hidden","map","getDefaultMarketColumns","Visible","label","supportedLocales","priceFlashRenderer","text","record","direction","MarketsGridWithIntl","selector","markets","columnsProvider","offer","bid","cod","name","low","high","dataIndex","title","sorter","b","data","Name","defaultSortOrder","render","Price","ChangeOnDayPercentage","parseFloat","index","pickedColumns","getPickedColumns","table","dataSource","pagination","pageSize","size","rowKey","saveActiveTradingAccount","settingsMarketsGrid","tradingAccount","account","SwitchAccountButtonCmp","block","onClick","setActiveTradingAccountAction","SwitchAccountButtonWithIntl","SwitchAccountButton","LogoutButtonCmp","LogoutButton","Sider","PlatformLayoutCmp","selectedPage","defaultSelectedPage","_this2","layout","breakpoint","collapsedWidth","menu","theme","mode","defaultSelectedKeys","onSelect","item","onMenuSelect","pages","navigationDetails","find","page","PlatformLayout","strings","en-gb","converters.unknownValue","productType.spreadBet","productType.cfd","productType.spotFx","tradingInstructionDirection.buy","tradingInstructionDirection.sell","statementPeriod.daily","statementPeriod.monthly","tradeSubType.new","tradeSubType.roll","tradeSubType.fxConversionOpen","openingOrClosing.opening","openingOrClosing.closing","platform.selectLocale","grid.bid","grid.mid","grid.offer","grid.cod","grid.marketName","grid.low","grid.high","loginForm.usernamePlaceholder","loginForm.usernameValidationMessage","loginForm.passwordPlaceholder","loginForm.passwordValidationMessage","clientAccountResources.cashBalance","clientAccountResources.marginRequirement","clientAccountResources.openPnL","clientAccountResources.netOpenPositions","clientAccountResources.availableBalance","clientAccountResources.netOpenPositionsLimit","clientAccountResources.netOpenPositionsAvailable","positionsGrid.title","positionsGrid.marketName","positionsGrid.quantity","positionsGrid.currentPrice","positionsGrid.netOpenPrice","positionsGrid.baseCurrencyOpenPnL","positionsGrid.baseCurrencyMargin","tradeGrid.title","tradeGrid.reference","tradeGrid.bookingDate","tradeGrid.quantity","tradeGrid.marketName","tradeGrid.bookingPrice","tradeGrid.currentPrice","tradeGrid.baseCurrencyProfitAndLoss","tradeGrid.baseCurrencyMargin","tradeGrid.baseCurrencyConsideration","tradeGrid.deliveryCurrencyConsideration","tradesByMarketAndValueDateGrid.title","tradesByMarketAndValueDateGrid.valueDate","tradesByMarketAndValueDateGrid.baseCurrencyConsideration","tradesByMarketAndValueDateGrid.deliveryCurrencyConsideration","accountSelector.title","accountSelector.clientAccountTitle","accountSelector.selectTradingAccountButton","tradingAccountResources.cashBalance","tradingAccountResources.openPnL","tradingAccountResources.marginRequirement","tradingAccountResources.netOpenPositions","tradingAccountResources.netEquity","switchAccountButton.text","logoutButton.text","openPositionsWithTradesByMarketAndValueDateGrids.tradeGridNoPositionSelected","openPositionsWithTradesByMarketAndValueDateGrids.tradeGridEmptyText","tradeHistoryGrid.reference","tradeHistoryGrid.marketName","tradeHistoryGrid.quantity","tradeHistoryGrid.direction","tradeHistoryGrid.baseCurrencyConsideration","tradeHistoryGrid.deliveryCurrencyConsideration","tradeHistoryGrid.bookingPrice","tradeHistoryGrid.bookingTime","tradeHistoryGrid.valueDate","tradeHistoryGrid.openingOrClosing","tradeHistoryGrid.currency","tradeHistoryGrid.profitAndLoss","tradeHistoryGrid.subType","tradeHistory.searching","tradeHistory.emptySearchResultsEmptyText","tradeHistory.notYetSearchedEmptyText","tradeHistory.downloadButton","tradeHistorySearchForm.date","tradeHistorySearchForm.from","tradeHistorySearchForm.fromAndToDatesRequiredValidationMessage","tradeHistorySearchForm.to","tradeHistorySearchForm.market","tradeHistorySearchForm.name","tradeHistorySearchForm.direction","tradeHistorySearchForm.valueDate","tradeHistorySearchForm.search","tradeHistorySearchForm.tradeSubType","statementsList.date","statementsList.period","statementsList.fileName","statementsList.fileSize","statementsList.download","statementsSearchFrom.search","statementsSearchFrom.date","statementsSearchFrom.from","statementsSearchFrom.to","statementsSearchFrom.period","statementsSearchFrom.fromDateToDateAndPeriodRequiredValidationMessage","statements.searching","statements.emptySearchResultsEmptyText","statements.notYetSearchedEmptyText","openPositionsGrid.emptyText","openTradesGrid.emptyText","locale","onLocaleChange","_","IntlProvider","localStorage","setItem","defaultValue","getItem","provider","messages","rootReducer","combineReducers","length","action","settings","settingsColours","clientAccount","tradingAccounts","toConsumableArray","linkedTradingAccounts","persistConfig","storage","whitelist","OpeningOrClosing","configuredStore","preloadedState","middlewares","enhancers","persistingRootReducer","persistReducer","applyMiddleware","composedEnhancers","composeWithDevTools","createStore","configureStore","StoreProvider","es","store","integration_react","persistor","persistStore","PapiAuthenticationProviderWithSessionState","saveLinkedTradingAccounts","saveClientAccount","ContextStateToProp","subscription","startSubscription","prevProps","groupKey","stopSubscription","papiSubscribe","SubscriptionLifecycle","_React$PureComponent2","_this3","SubscriptionLifecycle_ContextStateToProp","StreamingOpenPositionsCmp","newData","positions","PositionKey","StreamUpdateType","Delete","delete","set","BaseCurrencyOpenPnL","BaseCurrencyMarginRequirement","applyFxRate","position","CurrencyId","baseCurrency","baseCurrencyOpenPnl","OpenPnL","baseCurrencyMarginRequirement","MarginRequirement","Map","positionsArray","Array","from","SubscriptionLifecycle_SubscriptionLifecycle","streamPositions","StreamingOpenPositions","Currency","FormattedCurrency","_React$PureComponent","lib","PureComponent","FormattedPrice","currency","minimumFractionDigits","Exponent","maximumFractionDigits","convertToTradeHistoryGridRows","history","baseCurrencyId","openingTradeMatchesByTrade","closingTradeMatchesByTrade","TradeMatches","tradeMatch","has","OpeningTradeKey","get","push","ClosingTradeKey","tradeMatchPostings","Postings","isConvertedTradeMatchPosting","isTradeMatchPosting","PostingType","LedgerProcessType","Trade","TradeMatchKey","Trades","trade","closingTradeMatches","InstructionKey","Pnl","PnlCurrencyId","opening","postings","postingsAreAllTheSameCurrency","every","posting","pnl","reduce","accumulator","Amount","pnlCurrencyId","closing","tradeSubTypeToStringConverter","TradeSubType","New","Roll","FxConversionOpen","tradingInstructionDirectionToStringConverter","TradingInstructionDirection","Buy","Sell","quantityDirectionToStringConverter","openingOrClosingToStringConverter","currencyToStringConverter","IsoCode","undefinedRenderer","valueSelector","renderer","__","currencyViaRecordRenderer","currencyIdSelector","currencyId","FormattedCurrency_FormattedCurrency","considerationRenderer","subValueExtractor","considerationValue","valueExtractor","Value","dateRenderer","dateTimeRenderer","priceRenderer","FormattedPrice_FormattedPrice","priceWithCurrencyViaRecordRenderer","quantityDirectionRenderer","DefaultColumns","DefaultSpotFxColumns","PositionsGridWithIntl","baseCurrencySymbol","Symbol","column","MarketName","sortDirections","Quantity","align","Math","abs","CurrentPrice","BookingPrice","symbol","Error","bordered","rowSelection","onSelectionChange","onChange","PositionsGrid","parseInt","addOrUndefined","groupPositionsByMarketAndCurrency","groupedPositions","MarketKey","getByMarketAndCurrencyKey","entries","positionsByMarketAndCurrency","firstPosition","quantity","p","current","absoluteQuantity","currentPrice","openPnL","baseCurrencyOpenPnL","status","Status","PositionStatus","TriggeredOrder","Closed","bookingPrice","AccountKey","TradingAccountKey","activeTradingAccountType","ProductType","SpotFX","ActiveTradingAccountStreamingOpenPositionsGridWithIntl","groupByDirection","activeTradingAccountKey","emptyText","ActiveTradingAccountStreamingOpenPositionsGrid","AccountType","StreamingOpenTradesCmp","trades","OpenPnl","tradesArray","streamTrades","StreamingOpenTrades","getConsiderationSorter","aConsiderationValue","bConsiderationValue","bAbsConsideration","aAbsConsideration","isDefined","getDateSorter","getDefinedSorter","getReferenceSorter","extractId","reference","splitReference","split","idString","aValue","aId","bValue","bId","getNumberSorter","TradesGrid","_useSelector","useSelector","Reference","BookingTime","Consideration","BaseConsideration","DeliveryConsideration","TradesByMarketAndValueDateGridCmp","expandedRowRender","byValueDateTrades","summary","valueDate","consideration","tradesOnMarketByValueDate","getNonConversionTradesOnMarketByValueDate","getTime","getTitle","marketKey","SubType","_this4","ValueDate","Date","getFullYear","getMonth","getDate","getSummary","tradesOnMarket","filterTradesBySubTypeAndMarket","groupTradesByValueDate","TradesByMarketAndValueDateGridCmpWithIntl","TradesByMarketAndValueDateGrid","ActiveTradingAccountStreamingOpenTradesByMarketAndValueDateGridCmp","ActiveTradingAccountStreamingOpenTradesByMarketAndValueDateGridWithIntl","ActiveTradingAccountStreamingOpenTradesByMarketAndValueDateGrid","ownProps","ActiveTradingAccountStreamingOpenPositionsWithTradesByMarketAndValueDateGridsCmp","onPositionSelectionChange","selectedRowKeys","selectedRows","selectedPosition","marketName","byMarket","row","col","span","ActiveTradingAccountStreamingOpenPositionsWithTradesByMarketAndValueDateGrids","FormattedProductType","SpreadBet","components_message","CFD","StreamingTradingAccountResourcesCmp","tradingAccountResources","streamTradingAccountResources","_this2$state$tradingA","currencyKey","StreamingTradingAccountResources","AccountSelectorTradingAccountListItemCmp","list","AccountCode","FormattedProductType_FormattedProductType","descriptions","NetOpenPosition","onTradingAccountSelected","AccountSelectorTradingAccountListItem","AccountSelectorTradingAccountListCmp","renderItem","AccountSelectorTradingAccountList","StreamingClientAccountResourcesCmp","clientAccountResources","streamClientAccountResources","StreamingClientAccountResources","AccountSelectorClientAccountDescriptionCmp","NetOpenPositionLimit","calculateNetOpenPositionAvailable","CashBalance","AccountSelectorClientAccountDescription","AccountSelectorCmp","linkedTradingAccountsByClientAccount","getLinkedTradingAccountsByClientAccount","Title_default","level","card","divider","clientAccountsForLinkedTradingAccounts","Set","AccountSelectorWithIntl","AccountSelector","Text","TradingAccountResourcesCmp","cashBalanceLabel","openPnLLabel","marginRequirementLabel","netOpenPositionsLabel","netEquityLabel","strong","NetEquity","TradingAccountResources","ActiveTradingAccountStreamingResourcesCmp","TradingAccountResources_TradingAccountResources","ActiveTradingAccountStreamingResources","getRangePickerValue","first","second","firstUndefined","secondUndefined","moment","SpotFxTradeHistorySearchFormCmp","canSearch","to","searchButton","disabled","onSearchClick","date_picker","RangePicker","showTime","allowClear","disabledDate","toDate","dates","onDateChange","event","onMarketChange","onPressEnter","es_select","selectedValue","onDirectionChange","Option","onTradeSubTypeChange","tradeSubType","onValueDateChange","valueDateFrom","valueDateTo","tooltip","extra","float","pickerFrom","pickerTo","pickerValueDateFrom","startOf","pickerValueDateTo","endOf","searchParameters","onSearch","SpotFxTradeHistorySearchForm","SpotFxTradeHistoryGridCmp","aStr","bStr","localeCompare","OriginalQuantity","SpotFxTradeHistoryGridWithIntl","SpotFxTradeHistoryGrid","withPapi","WrappedComponent","outProps","papiClient","SpotFxTradeHistoryCmp","hasSearched","searching","searchResults","searchFormValues","enableDownloadButton","downloadButton","tradeHistory","react_csv","convertResultsToCsvData","filename","spin","indicator","tip","delay","searchTrades","tradingAccountKey","errorResponse","JSON","parse","errorMessage","Message","_x$Consideration","_x$Consideration$Base","_x$Consideration2","_x$Consideration2$Del","Market","Direction","BookingDate","formatDate","formatTime","SpotFxTradeHistory","SpotFxActiveTradingAccountTradeHistoryCmp","SpotFxActiveTradingAccountTradeHistory","FormattedStatementPeriod","StatementPeriod","Daily","Monthly","StatementsList","onDownloadClick","statement","blob","getStatement","download","FileName","statements","Period","FileSize","unit","unitDisplay","StatementsSearchForm","setFrom","_useState3","_useState4","setTo","_useState5","period","_useState6","setPeriod","selectedFrom","onFromChange","selectedTo","onToChange","selectedPeriod","onPeriodChange","Statements","_useState7","_useState8","setHasSearched","_useState9","_useState10","setSearching","_useState11","_useState12","setStatements","fetchedStatements","getStatements","finish","formAndList","ActiveTradingAccountStatements","Statements_Statements","ActiveTradingAccountStreamingOpenTradesGridWithIntl","ActiveTradingAccountStreamingOpenTradesGrid","TradeHistorySearchForm","TradeHistoryGrid","TradeHistory","setHistory","getTradeHistory","ProfitAndLoss","ActiveTradingAccountTradeHistory","activeTradingAccountCurrencies","top","papi","request","process","App","aggregateOpenTrades","setAggregateOpenTrades","StoreProvider_StoreProvider","IntlProvider_IntlProvider","PapiClient_PapiClientProvider","active","PlatformLayout_PlatformLayout","es_switch","checked","AccountSelector_AccountSelector","skeleton","LoginForm_LoginForm","ReactDOM","src_App_0","document","getElementById","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.e4b35193.chunk.js","sourcesContent":["// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\ntype Config = {\r\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\r\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\r\n};\r\n\r\nexport function register(config?: Config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(\r\n (process as { env: { [key: string]: string } }).env.PUBLIC_URL,\r\n window.location.href\r\n );\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl: string, config?: Config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n 'New content is available and will be used when all ' +\r\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (\r\n response.status === 404 ||\r\n (contentType != null && contentType.indexOf('javascript') === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import React from \"react\";\r\nimport {\r\n SwanPublicClient,\r\n StreamUpdate,\r\n ExchangeRate\r\n} from \"swan-public-api-client\";\r\n\r\ninterface Props {\r\n swanApiClient: SwanPublicClient;\r\n}\r\n\r\nexport type FxRate = number | undefined;\r\n\r\nexport interface FxRates {\r\n getAndOrSubscribeFxRate: (fromCurrency: string, toCurrency: string) => FxRate;\r\n}\r\n\r\ninterface State {\r\n fxRates: { [fxRateKey: string]: FxRate };\r\n inFlight: { [fxRateKey: string]: boolean };\r\n}\r\n\r\nconst FxRatesContext = React.createContext({} as FxRates);\r\n\r\nclass FxRatesProviderCmp extends React.Component {\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n fxRates: {},\r\n inFlight: {}\r\n };\r\n }\r\n public render() {\r\n return (\r\n \r\n {this.props.children}\r\n \r\n );\r\n }\r\n public shouldComponentUpdate(nextProps: Props, nextState: State) {\r\n if (nextProps === this.props && nextState.fxRates === this.state.fxRates) {\r\n // the state of in-flight values is the only thing that changed\r\n return false;\r\n }\r\n return true;\r\n }\r\n private getAndOrSubscribeFxRate = (\r\n fromCurrency: string,\r\n toCurrency: string\r\n ): FxRate => {\r\n const { fxRates, inFlight } = this.state;\r\n const fxRateKey = this.createKey(fromCurrency, toCurrency);\r\n const fxRate = fxRates[fxRateKey];\r\n // we avoid subscribing and making REST requests multiple times for the same FX rate\r\n const isInFlight = inFlight[fxRateKey];\r\n if (fxRate === undefined && isInFlight !== true) {\r\n this.storeInFlight(fxRateKey);\r\n this.fetchAndSubscribeToFxRate(fromCurrency, toCurrency, fxRateKey);\r\n }\r\n return fxRate;\r\n };\r\n private fetchAndSubscribeToFxRate = async (\r\n fromCurrency: string,\r\n toCurrency: string,\r\n fxRateKey: string\r\n ) => {\r\n const fxRateFetchResult = await this.tryFetch(\r\n fromCurrency,\r\n toCurrency,\r\n fxRateKey\r\n );\r\n if (fxRateFetchResult === undefined) {\r\n return;\r\n }\r\n this.storeFxRateChange(fxRateKey, fxRateFetchResult.fxRate);\r\n const stream = this.props.swanApiClient.streamExchangeRates(\r\n fxRateFetchResult.subscriptionKey,\r\n this.consumeUpdate,\r\n undefined,\r\n 0.1\r\n );\r\n // these streams are not `stop()`ped. but we want to remain subscribed to FX rate pairs for the lifetime of the app anyway\r\n stream.start();\r\n };\r\n private storeInFlight(fxRateKey: string) {\r\n const { inFlight } = this.state;\r\n inFlight[fxRateKey] = true;\r\n const newInFlight = { ...inFlight };\r\n this.setState({ inFlight: newInFlight });\r\n }\r\n private clearInFlight(fxRateKey: string) {\r\n const { inFlight } = this.state;\r\n inFlight[fxRateKey] = false;\r\n const newInFlight = { ...inFlight };\r\n this.setState({ inFlight: newInFlight });\r\n }\r\n private async tryFetch(\r\n fromCurrency: string,\r\n toCurrency: string,\r\n fxRateKey: string\r\n ): Promise<{ fxRate: number; subscriptionKey: string } | undefined> {\r\n let subscriptionKey: string;\r\n let fxRate: number;\r\n try {\r\n const { Content } = await this.props.swanApiClient.getExchangeRate(\r\n fromCurrency,\r\n toCurrency\r\n );\r\n subscriptionKey = Content.Key;\r\n fxRate = Content.Rate;\r\n } catch {\r\n // there is no fx rate or there was a comms issue\r\n // when the rate is not present in swan then many fetch requests may be sent. this should never be the case\r\n // when the rate is temporarily unavailable then allow components to fetch again\r\n this.clearInFlight(fxRateKey);\r\n return undefined;\r\n }\r\n return { fxRate, subscriptionKey };\r\n }\r\n private storeFxRateChange = (fxRateKey: string, fxRate: number) => {\r\n const { fxRates } = this.state;\r\n fxRates[fxRateKey] = fxRate;\r\n\r\n const newFxRates = {\r\n ...fxRates\r\n };\r\n this.setState({\r\n fxRates: newFxRates\r\n });\r\n };\r\n private consumeUpdate = (\r\n updatedExchangeRates: Array>\r\n ) => {\r\n const { fxRates } = this.state;\r\n updatedExchangeRates.forEach((x: StreamUpdate) => {\r\n fxRates[this.createKey(\r\n x.update.FromCurrency.toString(),\r\n x.update.ToCurrency.toString()\r\n )] = x.update.Rate\r\n });\r\n const newFxRates = { ...fxRates };\r\n this.setState({ fxRates: newFxRates });\r\n };\r\n private createKey = (fromCurrency: string, toCurrency: string): string => {\r\n return `${fromCurrency}#${toCurrency}`;\r\n };\r\n}\r\n\r\nexport const FxRatesConsumer = FxRatesContext.Consumer;\r\n\r\nexport const FxRatesProvider = FxRatesProviderCmp;\r\n","import * as React from \"react\";\r\nimport {\r\n ApiResponse,\r\n PushConnectionError,\r\n Account,\r\n AuthenticationResponse,\r\n SwanPublicClient,\r\n TradingAccount\r\n} from \"swan-public-api-client\";\r\nimport {\r\n saveTradingAccounts,\r\n saveClientAccount,\r\n saveLinkedTradingAccounts,\r\n saveActiveTradingAccount\r\n} from \"../Platform/State\";\r\nimport { FxRatesProvider } from \"./FxRates\";\r\n\r\nexport interface PapiAuthenticationContextState extends AuthenticationState {\r\n login: (\r\n username: string,\r\n password: string,\r\n accountOperatorKey: string\r\n ) => Promise;\r\n loginFromToken: () => Promise;\r\n}\r\n\r\nconst defaultAuthenticationContext: PapiAuthenticationContextState = {\r\n login: () => {\r\n return Promise.resolve({ success: false });\r\n },\r\n loginFromToken: () => {\r\n return Promise.resolve();\r\n },\r\n client: undefined,\r\n isAuthenticated: false,\r\n authenticationInProgress: false,\r\n // tslint:disable-next-line: no-empty\r\n deauthenticate: () => {}\r\n};\r\n\r\nconst PapiAuthenticationContext = React.createContext(\r\n defaultAuthenticationContext\r\n);\r\n\r\ninterface ActiveTradingAccountContextState {\r\n activeTradingAccount?: TradingAccount;\r\n}\r\n\r\nconst ActiveTradingAccountContext = React.createContext<\r\n ActiveTradingAccountContextState\r\n>({});\r\n\r\ninterface AuthenticationState {\r\n client: SwanPublicClient | undefined;\r\n isAuthenticated: boolean;\r\n authenticationInProgress: boolean;\r\n deauthenticate: () => void;\r\n}\r\n\r\nexport interface PropsFromState {\r\n existingToken?: string;\r\n activeTradingAccount?: TradingAccount;\r\n}\r\n\r\nexport interface PropsFromActions {\r\n setTradingAccounts: typeof saveTradingAccounts;\r\n setLinkedTradingAccounts: typeof saveLinkedTradingAccounts;\r\n setClientAccount: typeof saveClientAccount;\r\n setActiveTradingAccount: typeof saveActiveTradingAccount\r\n}\r\n\r\ninterface AuthenticationProps extends PropsFromState, PropsFromActions {\r\n url: string;\r\n children: React.ReactNode\r\n}\r\n\r\nexport type LoginResult =\r\n | { success: true; authenticationResponse: AuthenticationResponse }\r\n | { success: false };\r\n\r\n// tslint:disable-next-line: max-classes-per-file\r\nexport class PapiAuthenticationProvider extends React.Component<\r\n AuthenticationProps,\r\n AuthenticationState\r\n> {\r\n private client: SwanPublicClient;\r\n private existingToken?: string;\r\n private url: string;\r\n constructor(props: AuthenticationProps) {\r\n super(props);\r\n\r\n const { url, existingToken } = props;\r\n this.url = url;\r\n this.client = new SwanPublicClient(url, existingToken);\r\n this.existingToken = props.existingToken;\r\n this.state = {\r\n isAuthenticated: false,\r\n client: undefined,\r\n authenticationInProgress: false,\r\n // tslint:disable-next-line: no-empty\r\n deauthenticate: () => {}\r\n };\r\n }\r\n public login = async (\r\n username: string,\r\n password: string,\r\n accountOperatorKey: string\r\n ): Promise => {\r\n let result: LoginResult = { success: false };\r\n try {\r\n const response = await this.client.authenticate(\r\n username,\r\n password,\r\n accountOperatorKey,\r\n // tslint:disable-next-line:no-empty\r\n x => {}, // console.log(x),\r\n (x: PushConnectionError, message: string) => {\r\n console.error(x);\r\n // todo: what to do when LS errors?\r\n // this.setState({isAuthenticated: false});\r\n }\r\n );\r\n result = { success: true, authenticationResponse: response.Content };\r\n const accountResponse = await this.client.getAccount();\r\n this.updateAuthenticatedState(accountResponse);\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n\r\n return result;\r\n };\r\n public loginFromToken = async () => {\r\n const accountResponse = await this.client.getAccount();\r\n const config = await this.client.getLightstreamerConfiguration();\r\n this.client.connectToPush(\r\n config.Content,\r\n // tslint:disable-next-line:no-empty\r\n x => {}, // console.log(x),\r\n (x: PushConnectionError, message: string) => {\r\n console.error(x);\r\n // todo: what to do when LS errors?\r\n // this.setState({isAuthenticated: false});\r\n }\r\n );\r\n this.updateAuthenticatedState(accountResponse);\r\n };\r\n public componentWillMount = async () => {\r\n if (this.existingToken) {\r\n try {\r\n this.setState({ authenticationInProgress: true });\r\n await this.loginFromToken();\r\n } catch (ex) {\r\n console.error(\"existing session token could not be used to login.\", ex);\r\n }\r\n this.setState({ authenticationInProgress: false });\r\n }\r\n };\r\n public render() {\r\n const authenticationContextState: PapiAuthenticationContextState = {\r\n login: this.login,\r\n loginFromToken: this.loginFromToken,\r\n isAuthenticated: this.state.isAuthenticated,\r\n client: this.state.client,\r\n authenticationInProgress: this.state.authenticationInProgress,\r\n deauthenticate: this.deauthenticate\r\n };\r\n const activeTradingAccountContextState: ActiveTradingAccountContextState = {\r\n activeTradingAccount: this.props.activeTradingAccount\r\n };\r\n return (\r\n \r\n \r\n {this.props.children}\r\n \r\n \r\n );\r\n }\r\n private updateAuthenticatedState = (\r\n accountResponse: ApiResponse\r\n ) => {\r\n this.props.setClientAccount(accountResponse.Content);\r\n this.props.setTradingAccounts(accountResponse.Content.TradingAccounts);\r\n this.props.setLinkedTradingAccounts(accountResponse.Content.LinkedTradingAccounts);\r\n this.setState({\r\n isAuthenticated: true,\r\n client: this.client\r\n });\r\n };\r\n private deauthenticate = () => {\r\n this.client.deauthenticate();\r\n this.props.setActiveTradingAccount(undefined);\r\n\r\n this.client = new SwanPublicClient(this.url, undefined);\r\n this.setState({\r\n client: undefined,\r\n isAuthenticated: false\r\n });\r\n };\r\n}\r\n\r\nexport const PapiAuthenticationConsumer = PapiAuthenticationContext.Consumer;\r\n\r\ninterface PapiClientContextState {\r\n client: SwanPublicClient;\r\n}\r\n\r\n// use a cast from an empty object as the required default object so that we can expose `PapiClientContextState` instead of `PapiClientContextState | undefined`\r\nconst PapiClientContext = React.createContext(\r\n {} as PapiClientContextState\r\n);\r\n\r\n// tslint:disable-next-line:max-classes-per-file\r\nexport class PapiClientProvider extends React.Component<\r\n PapiClientContextState\r\n> {\r\n public render() {\r\n return (\r\n \r\n \r\n {this.props.children}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport const PapiClientConsumer = PapiClientContext.Consumer;\r\nexport const ActiveTradingAccountConsumer =\r\n ActiveTradingAccountContext.Consumer;\r\n","import * as React from \"react\";\r\nimport { Form, Icon, Input, Button, Checkbox, message, Typography } from \"antd\";\r\nimport { FormComponentProps } from \"antd/lib/form\";\r\nimport \"./LoginForm.less\";\r\nimport { injectIntl, WrappedComponentProps } from \"react-intl\";\r\nimport { UsernamePassword } from \"./UsernamePassword\";\r\nimport { connect } from \"react-redux\";\r\nimport { saveSession, saveLoginRemember, SessionState } from \"./State\";\r\nimport { LoginResult } from \"../Api/PapiClient\";\r\nimport { AppState } from \"../Store/RootReducer\";\r\nimport { Currency } from \"swan-public-api-client\";\r\nimport { useState } from \"react\";\r\n\r\nconst FormItem = Form.Item;\r\n\r\ninterface LoginProps {\r\n onLogin: (request: UsernamePassword) => Promise;\r\n saveSessionAction: (session: SessionState) => void;\r\n saveLoginRememberAction: (remember: boolean) => void;\r\n remember: boolean;\r\n}\r\n\r\ninterface Props extends FormComponentProps, WrappedComponentProps, LoginProps {}\r\n\r\ninterface LoginFormFields {\r\n password: string;\r\n username: string;\r\n remember: boolean;\r\n}\r\n\r\nfunction LoginFormCmp(props: Props) {\r\n const [loading, setLoading] = useState(false);\r\n\r\n const { remember } = props;\r\n const { getFieldDecorator } = props.form;\r\n // todo: problem: there's no compile time safety for the ids of the strings\r\n const usernamePlaceholder = props.intl.formatMessage({\r\n id: \"loginForm.usernamePlaceholder\"\r\n });\r\n const usernameValidationMessage = props.intl.formatMessage({\r\n id: \"loginForm.usernameValidationMessage\"\r\n });\r\n const passwordPlaceholder = props.intl.formatMessage({\r\n id: \"loginForm.passwordPlaceholder\"\r\n });\r\n const passwordValidationMessage = props.intl.formatMessage({\r\n id: \"loginForm.passwordValidationMessage\"\r\n });\r\n return (\r\n
handleSubmit(e, props, setLoading)} className=\"login-form\">\r\n \"axi\"\r\n \r\n Any issues please contact our middle office team at Middle.Office.Requests@axicorp.com\r\n \r\n \r\n {getFieldDecorator(\"username\", {\r\n rules: [{ required: true, message: usernameValidationMessage }]\r\n })(\r\n }\r\n placeholder={usernamePlaceholder}\r\n />\r\n )}\r\n \r\n \r\n {getFieldDecorator(\"password\", {\r\n rules: [{ required: true, message: passwordValidationMessage }]\r\n })(\r\n }\r\n type=\"password\"\r\n placeholder={passwordPlaceholder}\r\n />\r\n )}\r\n \r\n \r\n {getFieldDecorator(\"remember\", {\r\n valuePropName: \"checked\",\r\n initialValue: remember\r\n })(Remember me)}\r\n \r\n Log in\r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nfunction handleSubmit(e: React.FormEvent, props: Props, setLoading: (loading: boolean) => void) {\r\n e.preventDefault();\r\n const { form, saveSessionAction, saveLoginRememberAction } = props;\r\n form.validateFields((err, values: LoginFormFields) => {\r\n if (!err) {\r\n setLoading(true);\r\n\r\n const { remember } = values;\r\n saveLoginRememberAction(remember);\r\n props\r\n .onLogin({\r\n password: values.password,\r\n username: values.username\r\n })\r\n .then(result => {\r\n setLoading(false);\r\n\r\n if (!result.success) {\r\n message.error(\"Log in failed. Please check your username and password and try again.\");\r\n return;\r\n }\r\n\r\n if (remember) {\r\n const currencies: { [key: number]: Currency } = {};\r\n result.authenticationResponse.Configuration.Currencies.forEach(\r\n (x, y) => (currencies[y] = x)\r\n );\r\n saveSessionAction({\r\n token: result.authenticationResponse.Authentication.Token,\r\n currencies\r\n });\r\n }\r\n });\r\n }\r\n });\r\n}\r\n\r\nconst intlLoginForm = Form.create()(injectIntl(LoginFormCmp));\r\n\r\n// casting required because I think the type of form coming back from antd has lost the type info of props\r\nconst loginForm = (intlLoginForm as unknown) as React.ComponentClass<\r\n LoginProps\r\n>;\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n saveSessionAction: (session: SessionState) => dispatch(saveSession(session)),\r\n saveLoginRememberAction: (remember: boolean) =>\r\n dispatch(saveLoginRemember(remember))\r\n});\r\n\r\nconst mapStateToProps = (state: AppState) => {\r\n const { remember } = state.login;\r\n return { remember };\r\n};\r\n\r\nconst loginWithDispatch = connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(loginForm);\r\n\r\nexport const LoginForm = loginWithDispatch;\r\n","import { ColumnProps } from \"antd/lib/table\";\r\n\r\nexport enum ColumnVisibility {\r\n Visible,\r\n Hidden,\r\n Optional\r\n}\r\n\r\nexport interface ColumnDefinition {\r\n key: string;\r\n visibility: ColumnVisibility;\r\n}\r\n\r\nexport interface ColumnsProvider {\r\n getPickedColumns: (columns: T[]) => T[];\r\n getColumns: () => ColumnDefinition[];\r\n}\r\n\r\nexport class GridColumnsProvider implements ColumnsProvider> {\r\n private columnPreferences: ColumnDefinition[];\r\n constructor(\r\n columnPreferences: ColumnDefinition[]\r\n ) {\r\n this.columnPreferences = columnPreferences;\r\n }\r\n public getColumns(): ColumnDefinition[] {\r\n return this.columnPreferences;\r\n }\r\n public getPickedColumns(columns: Array>) {\r\n const columnsByKey: { [key: string]: any } = {};\r\n columns.forEach(x => (columnsByKey[x.key!] = x));\r\n\r\n const pickedColumns = this.getColumns()\r\n .filter(x => x.visibility !== ColumnVisibility.Hidden)\r\n .map(x => columnsByKey[x.key]);\r\n\r\n return pickedColumns;\r\n }\r\n}\r\n","import { Currency } from \"swan-public-api-client\";\r\n\r\nconst saveSessionAction = \"SAVE_SESSION\";\r\nconst clearSessionAction = \"CLEAR_TOKEN\";\r\nconst saveLoginRememberAction = \"SAVE_LOGIN_REMEMBER\";\r\n\r\n// state in the store\r\nexport interface LoginState {\r\n remember: boolean;\r\n}\r\nexport interface SessionState {\r\n token?: string;\r\n currencies: { [key: number]: Currency };\r\n}\r\n\r\n// available action type definitions\r\ninterface SessionSaveAction {\r\n type: typeof saveSessionAction;\r\n session: SessionState;\r\n}\r\ninterface SessionClearSessionAction {\r\n type: typeof clearSessionAction;\r\n}\r\ninterface LoginSaveRememberAction {\r\n type: typeof saveLoginRememberAction;\r\n remember: boolean;\r\n}\r\n\r\n// reducers\r\nexport const session = (\r\n state: SessionState = { currencies: {} },\r\n action: SessionSaveAction | SessionClearSessionAction\r\n): SessionState => {\r\n switch (action.type) {\r\n case saveSessionAction:\r\n return action.session;\r\n case clearSessionAction:\r\n return { currencies: {} };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport const login = (\r\n state: LoginState = { remember: false },\r\n action: LoginSaveRememberAction\r\n): LoginState => {\r\n switch (action.type) {\r\n case saveLoginRememberAction:\r\n return {\r\n remember: action.remember\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\n// actions\r\n\r\nexport const saveSession = (s: SessionState): SessionSaveAction => ({\r\n session: s,\r\n type: saveSessionAction\r\n});\r\n\r\nexport const saveLoginRemember = (\r\n remember: boolean\r\n): LoginSaveRememberAction => ({ remember, type: saveLoginRememberAction });\r\n","import * as React from \"react\";\r\nimport { PriceChange } from \"./PriceChange\";\r\nimport { MarketSummary } from \"swan-public-api-client\";\r\nimport { WrappedComponentProps, injectIntl } from \"react-intl\";\r\nimport { Table } from \"antd\";\r\nimport { ColumnProps } from \"antd/lib/table\";\r\nimport { connect } from \"react-redux\";\r\nimport { AppState } from \"../Store/RootReducer\";\r\nimport {\r\n ColumnVisibility,\r\n ColumnDefinition,\r\n ColumnsProvider,\r\n GridColumnsProvider\r\n} from \"../Grid/Columns\";\r\nimport \"./MarketsGrid.less\";\r\n\r\nexport interface NamedColumnDefinition extends ColumnDefinition {\r\n label: string;\r\n}\r\n\r\nexport function getDefaultMarketColumns(): NamedColumnDefinition[] {\r\n const columns = [\r\n {\r\n key: \"name\",\r\n visibility: ColumnVisibility.Visible,\r\n label: \"Market Name\"\r\n },\r\n {\r\n key: \"bid\",\r\n visibility: ColumnVisibility.Visible,\r\n label: \"Bid\"\r\n },\r\n {\r\n key: \"offer\",\r\n visibility: ColumnVisibility.Visible,\r\n label: \"Offer\"\r\n },\r\n {\r\n key: \"cod\",\r\n visibility: ColumnVisibility.Visible,\r\n label: \"Change on Day (%)\"\r\n },\r\n {\r\n key: \"low\",\r\n visibility: ColumnVisibility.Hidden,\r\n label: \"Low\"\r\n },\r\n {\r\n key: \"high\",\r\n visibility: ColumnVisibility.Hidden,\r\n label: \"High\"\r\n }\r\n ];\r\n return columns;\r\n}\r\n\r\ninterface Props extends WrappedComponentProps {\r\n markets: Array>;\r\n columnsProvider: ColumnsProvider>>;\r\n}\r\n\r\n// can move to separate files as column and renderer function definitions\r\nconst priceFlashRenderer = (\r\n text: string,\r\n record: PriceChange\r\n) => {\r\n return {text};\r\n};\r\nconst posnegPercentageRenderer = (\r\n selector: (x: PriceChange) => number\r\n) => (text: string, record: PriceChange, index: number) => {\r\n const value = selector(record);\r\n let className = \"grid-\";\r\n if (value > 0) {\r\n className += \"positive\";\r\n } else if (value < 0) {\r\n className += \"negative\";\r\n } else {\r\n className = \"\";\r\n }\r\n return {text}%;\r\n};\r\n\r\n// tslint:disable-next-line:max-classes-per-file\r\nconst BasicMarketsGrid = (props: Props) => {\r\n const { markets, columnsProvider } = props;\r\n const offer = props.intl.formatMessage({ id: \"grid.offer\" });\r\n const bid = props.intl.formatMessage({ id: \"grid.bid\" });\r\n const cod = props.intl.formatMessage({ id: \"grid.cod\" });\r\n const name = props.intl.formatMessage({ id: \"grid.marketName\" });\r\n const low = props.intl.formatMessage({ id: \"grid.low\" });\r\n const high = props.intl.formatMessage({ id: \"grid.high\" });\r\n const columns: Array>> = [\r\n {\r\n key: \"name\",\r\n dataIndex: \"data.Name\",\r\n width: 2,\r\n title: name,\r\n sorter: (a, b) => (a.data.Name > b.data.Name ? 1 : -1),\r\n defaultSortOrder: \"ascend\"\r\n },\r\n {\r\n key: \"bid\",\r\n dataIndex: \"widenedPrice.bid\",\r\n width: 1,\r\n title: bid,\r\n render: priceFlashRenderer\r\n },\r\n {\r\n key: \"offer\",\r\n dataIndex: \"widenedPrice.ask\",\r\n width: 1,\r\n title: offer,\r\n render: priceFlashRenderer\r\n },\r\n {\r\n key: \"cod\",\r\n dataIndex: \"data.Price.ChangeOnDayPercentage\",\r\n width: 1,\r\n title: cod,\r\n sorter: (a, b) => {\r\n return a.data.Price.ChangeOnDayPercentage >\r\n b.data.Price.ChangeOnDayPercentage\r\n ? 1\r\n : -1;\r\n },\r\n render: posnegPercentageRenderer(x =>\r\n parseFloat(x.data.Price.ChangeOnDayPercentage.toString())\r\n )\r\n },\r\n {\r\n key: \"low\",\r\n // todo: the low and the high don't have spread widening applied so\r\n // it's possible the user will see (and possibly trade!) a price that goes higher than the high and lower than the low\r\n dataIndex: \"data.Price.Low\",\r\n width: 1,\r\n title: low\r\n },\r\n {\r\n key: \"high\",\r\n dataIndex: \"data.Price.High\",\r\n width: 1,\r\n title: high\r\n }\r\n ];\r\n const rowKey = (x: PriceChange) => x.data.Key;\r\n const pickedColumns = columnsProvider.getPickedColumns(columns);\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst MarketsGridWithIntl = injectIntl(BasicMarketsGrid);\r\n\r\nconst mapStateToProps = (state: AppState) => ({\r\n columnsProvider: new GridColumnsProvider>(\r\n (state.settingsMarketsGrid && state.settingsMarketsGrid.columns) ||\r\n getDefaultMarketColumns()\r\n )\r\n});\r\n\r\nexport const MarketsGrid = connect(mapStateToProps)(MarketsGridWithIntl);\r\n","interface Pack extends Record {\r\n \"converters.unknownValue\": string;\r\n \"productType.spreadBet\": string;\r\n \"productType.cfd\": string;\r\n \"productType.spotFx\": string;\r\n \"tradingInstructionDirection.buy\": string;\r\n \"tradingInstructionDirection.sell\": string;\r\n \"statementPeriod.daily\": string;\r\n \"statementPeriod.monthly\": string;\r\n \"tradeSubType.new\": string;\r\n \"tradeSubType.roll\": string;\r\n \"tradeSubType.fxConversionOpen\": string;\r\n \"openingOrClosing.opening\": string;\r\n \"openingOrClosing.closing\": string;\r\n \"loginForm.usernamePlaceholder\": string;\r\n \"loginForm.usernameValidationMessage\": string;\r\n \"loginForm.passwordPlaceholder\": string;\r\n \"loginForm.passwordValidationMessage\": string;\r\n \"grid.bid\": string;\r\n \"grid.mid\": string;\r\n \"grid.offer\": string;\r\n \"grid.cod\": string;\r\n \"grid.marketName\": string;\r\n \"grid.low\": string;\r\n \"grid.high\": string;\r\n \"platform.selectLocale\": string;\r\n \"clientAccountResources.cashBalance\": string;\r\n \"clientAccountResources.openPnL\": string;\r\n \"clientAccountResources.marginRequirement\": string;\r\n \"clientAccountResources.netOpenPositions\": string;\r\n \"clientAccountResources.availableBalance\": string;\r\n \"clientAccountResources.netOpenPositionsLimit\": string;\r\n \"clientAccountResources.netOpenPositionsAvailable\": string;\r\n \"positionsGrid.title\": string;\r\n \"positionsGrid.marketName\": string;\r\n \"positionsGrid.quantity\": string;\r\n \"positionsGrid.currentPrice\": string;\r\n \"positionsGrid.netOpenPrice\": string;\r\n \"positionsGrid.baseCurrencyOpenPnL\": string;\r\n \"positionsGrid.baseCurrencyMargin\": string;\r\n \"tradeGrid.title\": string;\r\n \"tradeGrid.reference\": string;\r\n \"tradeGrid.bookingDate\": string;\r\n \"tradeGrid.quantity\": string;\r\n \"tradeGrid.marketName\": string;\r\n \"tradeGrid.bookingPrice\": string;\r\n \"tradeGrid.currentPrice\": string;\r\n \"tradeGrid.baseCurrencyProfitAndLoss\": string;\r\n \"tradeGrid.baseCurrencyMargin\": string;\r\n \"tradeGrid.baseCurrencyConsideration\": string;\r\n \"tradeGrid.deliveryCurrencyConsideration\": string;\r\n \"tradesByMarketAndValueDateGrid.title\": string;\r\n \"tradesByMarketAndValueDateGrid.valueDate\": string;\r\n \"tradesByMarketAndValueDateGrid.baseCurrencyConsideration\": string;\r\n \"tradesByMarketAndValueDateGrid.deliveryCurrencyConsideration\": string;\r\n \"accountSelector.title\": string;\r\n \"accountSelector.clientAccountTitle\": string;\r\n \"accountSelector.selectTradingAccountButton\": string;\r\n \"tradingAccountResources.cashBalance\": string;\r\n \"tradingAccountResources.openPnL\": string;\r\n \"tradingAccountResources.marginRequirement\": string;\r\n \"tradingAccountResources.netOpenPositions\": string;\r\n \"tradingAccountResources.netEquity\": string;\r\n \"switchAccountButton.text\": string;\r\n \"logoutButton.text\": string;\r\n \"openPositionsWithTradesByMarketAndValueDateGrids.tradeGridNoPositionSelected\": string;\r\n \"openPositionsWithTradesByMarketAndValueDateGrids.tradeGridEmptyText\": string;\r\n \"tradeHistoryGrid.reference\": string;\r\n \"tradeHistoryGrid.marketName\": string;\r\n \"tradeHistoryGrid.quantity\": string;\r\n \"tradeHistoryGrid.direction\": string;\r\n \"tradeHistoryGrid.baseCurrencyConsideration\": string;\r\n \"tradeHistoryGrid.deliveryCurrencyConsideration\": string;\r\n \"tradeHistoryGrid.bookingPrice\": string;\r\n \"tradeHistoryGrid.bookingTime\": string;\r\n \"tradeHistoryGrid.valueDate\": string;\r\n \"tradeHistoryGrid.openingOrClosing\": string;\r\n \"tradeHistoryGrid.currency\": string;\r\n \"tradeHistoryGrid.profitAndLoss\": string;\r\n \"tradeHistoryGrid.subType\": string;\r\n \"tradeHistory.searching\": string;\r\n \"tradeHistory.emptySearchResultsEmptyText\": string;\r\n \"tradeHistory.notYetSearchedEmptyText\": string;\r\n \"tradeHistory.downloadButton\": string;\r\n \"tradeHistorySearchForm.date\": string;\r\n \"tradeHistorySearchForm.from\": string;\r\n \"tradeHistorySearchForm.to\": string;\r\n \"tradeHistorySearchForm.fromAndToDatesRequiredValidationMessage\": string;\r\n \"tradeHistorySearchForm.market\": string;\r\n \"tradeHistorySearchForm.name\": string;\r\n \"tradeHistorySearchForm.direction\": string;\r\n \"tradeHistorySearchForm.valueDate\": string;\r\n \"tradeHistorySearchForm.search\": string;\r\n \"tradeHistorySearchForm.tradeSubType\": string;\r\n \"statementsList.date\": string;\r\n \"statementsList.period\": string;\r\n \"statementsList.fileName\": string;\r\n \"statementsList.fileSize\": string;\r\n \"statementsList.download\": string;\r\n \"statementsSearchFrom.search\": string;\r\n \"statementsSearchFrom.date\": string;\r\n \"statementsSearchFrom.from\": string;\r\n \"statementsSearchFrom.to\": string;\r\n \"statementsSearchFrom.period\": string;\r\n \"statementsSearchFrom.fromDateToDateAndPeriodRequiredValidationMessage\": string;\r\n \"statements.searching\": string;\r\n \"statements.emptySearchResultsEmptyText\": string;\r\n \"statements.notYetSearchedEmptyText\": string;\r\n \"openPositionsGrid.emptyText\": string;\r\n \"openTradesGrid.emptyText\": string;\r\n}\r\n\r\nexport enum supportedLocales {\r\n \"en-gb\" = \"en-gb\"\r\n}\r\n\r\nexport type AllLocales = { [key in supportedLocales]: Pack };\r\n\r\nexport const strings: AllLocales = {\r\n \"en-gb\": {\r\n \"converters.unknownValue\": \"Unknown\",\r\n \"productType.spreadBet\": \"Spread Bet\",\r\n \"productType.cfd\": \"CFD\",\r\n \"productType.spotFx\": \"Spot FX\",\r\n \"tradingInstructionDirection.buy\": \"Buy\",\r\n \"tradingInstructionDirection.sell\": \"Sell\",\r\n \"statementPeriod.daily\": \"Daily\",\r\n \"statementPeriod.monthly\": \"Monthly\",\r\n \"tradeSubType.new\": \"New\",\r\n \"tradeSubType.roll\": \"Roll\",\r\n \"tradeSubType.fxConversionOpen\": \"FX Conversion\",\r\n \"openingOrClosing.opening\": \"Opening\",\r\n \"openingOrClosing.closing\": \"Closing\",\r\n \"platform.selectLocale\": \"Language\",\r\n \"grid.bid\": \"Bid\",\r\n \"grid.mid\": \"Mid\",\r\n \"grid.offer\": \"Offer\",\r\n \"grid.cod\": \"Change on Day\",\r\n \"grid.marketName\": \"Market\",\r\n \"grid.low\": \"Low\",\r\n \"grid.high\": \"High\",\r\n \"loginForm.usernamePlaceholder\": \"Username\",\r\n \"loginForm.usernameValidationMessage\": \"Please enter your username\",\r\n \"loginForm.passwordPlaceholder\": \"Password\",\r\n \"loginForm.passwordValidationMessage\": \"Please enter your password\",\r\n \"clientAccountResources.cashBalance\": \"Cash\",\r\n \"clientAccountResources.marginRequirement\": \"Margin\",\r\n \"clientAccountResources.openPnL\": \"Open P&L\",\r\n \"clientAccountResources.netOpenPositions\": \"NOP\",\r\n \"clientAccountResources.availableBalance\": \"Available\",\r\n \"clientAccountResources.netOpenPositionsLimit\": \"NOP Limit\",\r\n \"clientAccountResources.netOpenPositionsAvailable\": \"NOP Available\",\r\n \"positionsGrid.title\": \"Daily Market Position Summary\",\r\n \"positionsGrid.marketName\": \"Market\",\r\n \"positionsGrid.quantity\": \"Base Net Position\",\r\n \"positionsGrid.currentPrice\": \"Current Price\",\r\n \"positionsGrid.netOpenPrice\": \"Net Open Price\",\r\n \"positionsGrid.baseCurrencyOpenPnL\": \"Open P&L ({symbol})\",\r\n \"positionsGrid.baseCurrencyMargin\": \"Margin ({symbol})\",\r\n \"tradeGrid.title\": \"Trades\",\r\n \"tradeGrid.reference\": \"Reference\",\r\n \"tradeGrid.bookingDate\": \"Booking Date\",\r\n \"tradeGrid.quantity\": \"Quantity\",\r\n \"tradeGrid.marketName\": \"Market\",\r\n \"tradeGrid.bookingPrice\": \"Booking Price\",\r\n \"tradeGrid.currentPrice\": \"Current Price\",\r\n \"tradeGrid.baseCurrencyProfitAndLoss\": \"Open P&L ({symbol})\",\r\n \"tradeGrid.baseCurrencyMargin\": \"Margin ({symbol})\",\r\n \"tradeGrid.baseCurrencyConsideration\": \"Base Consideration\",\r\n \"tradeGrid.deliveryCurrencyConsideration\": \"Delivery Consideration\",\r\n \"tradesByMarketAndValueDateGrid.title\": \"Trades\",\r\n \"tradesByMarketAndValueDateGrid.valueDate\": \"Value Date\",\r\n \"tradesByMarketAndValueDateGrid.baseCurrencyConsideration\": \"Base Consideration\",\r\n \"tradesByMarketAndValueDateGrid.deliveryCurrencyConsideration\": \"Delivery Consideration\",\r\n \"accountSelector.title\": \"Your Accounts\",\r\n \"accountSelector.clientAccountTitle\": \"Account Summary\",\r\n \"accountSelector.selectTradingAccountButton\": \"Select\",\r\n \"tradingAccountResources.cashBalance\": \"Cash\",\r\n \"tradingAccountResources.openPnL\": \"Open P&L\",\r\n \"tradingAccountResources.marginRequirement\": \"Margin\",\r\n \"tradingAccountResources.netOpenPositions\": \"NOP\",\r\n \"tradingAccountResources.netEquity\": \"Net Equity\",\r\n \"switchAccountButton.text\": \"Switch Account\",\r\n \"logoutButton.text\": \"Logout\",\r\n \"openPositionsWithTradesByMarketAndValueDateGrids.tradeGridNoPositionSelected\": \"Select a position to view its trades\",\r\n \"openPositionsWithTradesByMarketAndValueDateGrids.tradeGridEmptyText\": \"No open trades\",\r\n \"tradeHistoryGrid.reference\": \"Reference\",\r\n \"tradeHistoryGrid.marketName\": \"Market\",\r\n \"tradeHistoryGrid.quantity\": \"Quantity\",\r\n \"tradeHistoryGrid.direction\": \"Direction\",\r\n \"tradeHistoryGrid.baseCurrencyConsideration\": \"Base Consideration\",\r\n \"tradeHistoryGrid.deliveryCurrencyConsideration\": \"Delivery Consideration\",\r\n \"tradeHistoryGrid.bookingPrice\": \"Booking Price\",\r\n \"tradeHistoryGrid.bookingTime\": \"Booking Date\",\r\n \"tradeHistoryGrid.valueDate\": \"Value Date\",\r\n \"tradeHistoryGrid.openingOrClosing\": \"Opening/Closing\",\r\n \"tradeHistoryGrid.currency\": \"Currency\",\r\n \"tradeHistoryGrid.profitAndLoss\": \"P&L\",\r\n \"tradeHistoryGrid.subType\": \"Sub Type\",\r\n \"tradeHistory.searching\": \"Searching…\",\r\n \"tradeHistory.emptySearchResultsEmptyText\": \"No trades found that match the given search critera\",\r\n \"tradeHistory.notYetSearchedEmptyText\": \"Use the search to find trades\",\r\n \"tradeHistory.downloadButton\": \"Download\",\r\n \"tradeHistorySearchForm.date\": \"Date\",\r\n \"tradeHistorySearchForm.from\": \"From\",\r\n \"tradeHistorySearchForm.fromAndToDatesRequiredValidationMessage\": \"From and to dates are required\",\r\n \"tradeHistorySearchForm.to\": \"To\",\r\n \"tradeHistorySearchForm.market\": \"Market\",\r\n \"tradeHistorySearchForm.name\": \"Name\",\r\n \"tradeHistorySearchForm.direction\": \"Direction\",\r\n \"tradeHistorySearchForm.valueDate\": \"Value Date\",\r\n \"tradeHistorySearchForm.search\": \"Search\",\r\n \"tradeHistorySearchForm.tradeSubType\": \"Sub Type\",\r\n \"statementsList.date\": \"Date\",\r\n \"statementsList.period\": \"Period\",\r\n \"statementsList.fileName\": \"Filename\",\r\n \"statementsList.fileSize\": \"Size\",\r\n \"statementsList.download\": \"Download\",\r\n \"statementsSearchFrom.search\": \"Search\",\r\n \"statementsSearchFrom.date\": \"Date\",\r\n \"statementsSearchFrom.from\": \"From\",\r\n \"statementsSearchFrom.to\": \"To\",\r\n \"statementsSearchFrom.period\": \"Period\",\r\n \"statementsSearchFrom.fromDateToDateAndPeriodRequiredValidationMessage\": \"From and to dates, and period are required\",\r\n \"statements.searching\": \"Searching…\",\r\n \"statements.emptySearchResultsEmptyText\": \"No statements found for the given search critera\",\r\n \"statements.notYetSearchedEmptyText\": \"Use the search to view your statements\",\r\n \"openPositionsGrid.emptyText\": \"No open positions\",\r\n \"openTradesGrid.emptyText\": \"No open trades\"\r\n }\r\n};\r\n","import { ColumnDefinition } from \"../Grid/Columns\";\r\nimport { getDefaultMarketColumns } from \"../Markets/MarketsGrid\";\r\nimport { Account, TradingAccount, Currency } from \"swan-public-api-client\";\r\n\r\nconst settingsSaveMarketsGridAction = \"SETTINGS_SAVE_MARKETS_GRID\";\r\nconst settingsSaveColoursAction = \"SETTINGS_SAVE_COLOURS\";\r\n\r\nconst saveClientAccountAction = \"SAVE_CLIENT_ACCOUNT\"\r\nconst saveActiveTradingAccountAction = \"SAVE_ACTIVE_TRADING_ACCOUNT\";\r\nconst saveTradingAccountsAction = \"SAVE_TRADING_ACCOUNTS\";\r\nconst saveCurrenciesAction = \"SAVE_CURRENCIES\";\r\nconst saveLinkedTradingAccountsAction = \"SAVE_LINKED_TRADING_ACCOUNTS\";\r\n\r\nexport interface ClientAccount {\r\n account?: Account;\r\n}\r\n\r\nexport interface ActiveTradingAccount {\r\n account?: TradingAccount;\r\n}\r\n\r\nexport interface SettingsMarketsGrid {\r\n columns: ColumnDefinition[];\r\n}\r\n\r\nexport interface SettingsColours {\r\n \"@primary-color\"?: string;\r\n}\r\n\r\ninterface SettingsSaveMarketsGridAction {\r\n type: typeof settingsSaveMarketsGridAction;\r\n settings: SettingsMarketsGrid;\r\n}\r\n\r\ninterface SettingsSaveColoursAction {\r\n type: typeof settingsSaveColoursAction;\r\n settings: SettingsColours;\r\n}\r\n\r\ninterface SaveClientAccountAction {\r\n type: typeof saveClientAccountAction;\r\n account: Account;\r\n}\r\n\r\ninterface SaveActiveTradingAccountAction {\r\n type: typeof saveActiveTradingAccountAction;\r\n account: TradingAccount | undefined;\r\n}\r\n\r\ninterface SaveTradingAccountsAction {\r\n type: typeof saveTradingAccountsAction;\r\n tradingAccounts: TradingAccount[];\r\n}\r\n\r\ninterface SaveLinkedTradingAccountsAction {\r\n type: typeof saveLinkedTradingAccountsAction;\r\n linkedTradingAccounts: TradingAccount[];\r\n}\r\n\r\ninterface SaveCurrenciesAction {\r\n type: typeof saveCurrenciesAction;\r\n currencies: Currency[];\r\n}\r\n\r\nexport const settingsMarketsGrid = (\r\n state: SettingsMarketsGrid = { columns: getDefaultMarketColumns() },\r\n action: SettingsSaveMarketsGridAction\r\n): SettingsMarketsGrid => {\r\n switch (action.type) {\r\n case settingsSaveMarketsGridAction:\r\n return {\r\n columns: action.settings.columns\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport const settingsColours = (\r\n state: SettingsColours = { },\r\n action: SettingsSaveColoursAction\r\n): SettingsColours => {\r\n switch (action.type) {\r\n case settingsSaveColoursAction:\r\n return { ...action.settings };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport const settingsSaveMarketsGrid = (settings: SettingsMarketsGrid): SettingsSaveMarketsGridAction => ({\r\n settings,\r\n type: settingsSaveMarketsGridAction\r\n});\r\n\r\nexport const settingsSaveColours = (settings: SettingsColours): SettingsSaveColoursAction => ({\r\n settings,\r\n type: settingsSaveColoursAction\r\n});\r\n\r\nexport const clientAccount = (\r\n state: ClientAccount = {},\r\n action: SaveClientAccountAction\r\n): ClientAccount => {\r\n switch (action.type) {\r\n case saveClientAccountAction:\r\n return { account: action.account };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport const activeTradingAccount = (\r\n state: ActiveTradingAccount = {},\r\n action: SaveActiveTradingAccountAction\r\n): ActiveTradingAccount => {\r\n switch (action.type) {\r\n case saveActiveTradingAccountAction:\r\n return { account: action.account !== undefined ? { ...action.account } : undefined };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport const tradingAccounts = (\r\n state: TradingAccount[] = [],\r\n action: SaveTradingAccountsAction\r\n): TradingAccount[] => {\r\n switch (action.type) {\r\n case saveTradingAccountsAction:\r\n return [...action.tradingAccounts];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport const linkedTradingAccounts = (\r\n state: TradingAccount[] = [],\r\n action: SaveLinkedTradingAccountsAction\r\n): TradingAccount[] => {\r\n switch (action.type) {\r\n case saveLinkedTradingAccountsAction:\r\n return [...action.linkedTradingAccounts];\r\n default:\r\n return state;\r\n }\r\n}\r\n\r\nexport const currencies = (\r\n state: Currency[] = [],\r\n action: SaveCurrenciesAction\r\n): Currency[] => {\r\n switch (action.type) {\r\n case saveCurrenciesAction:\r\n return [...action.currencies];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport const saveClientAccount = (\r\n account: Account\r\n): SaveClientAccountAction => ({\r\n account,\r\n type: saveClientAccountAction\r\n});\r\n\r\nexport const saveActiveTradingAccount = (\r\n tradingAccount: TradingAccount | undefined\r\n): SaveActiveTradingAccountAction => ({\r\n account: tradingAccount,\r\n type: saveActiveTradingAccountAction\r\n});\r\n\r\nexport const saveTradingAccounts = (\r\n tas: TradingAccount[]\r\n): SaveTradingAccountsAction => ({\r\n tradingAccounts: tas,\r\n type: saveTradingAccountsAction\r\n});\r\n\r\nexport const saveLinkedTradingAccounts = (\r\n linkedTradingAccounts: TradingAccount[]\r\n): SaveLinkedTradingAccountsAction => ({\r\n linkedTradingAccounts,\r\n type: saveLinkedTradingAccountsAction\r\n});\r\n","import * as React from \"react\";\r\nimport { WrappedComponentProps, injectIntl } from \"react-intl\";\r\nimport { connect } from \"react-redux\";\r\nimport { saveActiveTradingAccount } from \"../Platform/State\";\r\nimport { Button } from \"antd\";\r\nimport { TradingAccount } from \"swan-public-api-client\";\r\nimport { ButtonType } from \"antd/lib/button\";\r\n\r\ninterface PropsFromActions {\r\n setActiveTradingAccountAction: typeof saveActiveTradingAccount;\r\n}\r\n\r\ninterface Props extends WrappedComponentProps, PropsFromActions {\r\n type?: ButtonType;\r\n block?: boolean;\r\n}\r\n\r\nclass SwitchAccountButtonCmp extends React.PureComponent {\r\n public render() {\r\n return (\r\n this.onClick()}\r\n >\r\n {this.props.intl.formatMessage({ id: \"switchAccountButton.text\" })}\r\n \r\n );\r\n }\r\n\r\n private onClick() {\r\n this.props.setActiveTradingAccountAction(undefined);\r\n }\r\n}\r\n\r\nconst SwitchAccountButtonWithIntl = injectIntl(SwitchAccountButtonCmp);\r\n\r\nconst mapDispatchToProps = (dispatch: any): PropsFromActions => ({\r\n setActiveTradingAccountAction: (tradingAccount: TradingAccount | undefined) => dispatch(saveActiveTradingAccount(tradingAccount))\r\n});\r\n\r\nexport const SwitchAccountButton = connect(\r\n null,\r\n mapDispatchToProps\r\n)(\r\n SwitchAccountButtonWithIntl\r\n);\r\n","import * as React from \"react\";\r\nimport { PapiAuthenticationConsumer } from \"./Api/PapiClient\";\r\nimport { Button } from \"antd\";\r\nimport { WrappedComponentProps, injectIntl } from \"react-intl\";\r\nimport { ButtonType } from \"antd/lib/button\";\r\n\r\ninterface Props extends WrappedComponentProps {\r\n type?: ButtonType;\r\n block?: boolean;\r\n}\r\n\r\nclass LogoutButtonCmp extends React.PureComponent {\r\n public render() {\r\n return (\r\n \r\n {state => {\r\n return (\r\n state.deauthenticate()}\r\n >\r\n {this.props.intl.formatMessage({ id: \"logoutButton.text\" })}\r\n \r\n );\r\n }}\r\n \r\n );\r\n }\r\n}\r\n\r\nexport const LogoutButton = injectIntl(LogoutButtonCmp);\r\n","import * as React from \"react\";\r\nimport { Layout, Menu, Icon } from \"antd\";\r\nimport { WrappedComponentProps, injectIntl } from \"react-intl\";\r\nimport \"./PlatformLayout.less\";\r\nimport { SwitchAccountButton } from \"../Account/SwitchAccountButton\";\r\nimport { LogoutButton } from \"../LogoutButton\";\r\nimport { SelectParam } from \"antd/lib/menu\";\r\n\r\nconst { Sider } = Layout;\r\n\r\ninterface Props extends WrappedComponentProps {\r\n pages: LayoutPageProps[];\r\n defaultSelectedPage?: string;\r\n}\r\n\r\ninterface LayoutPageNavigationDetails {\r\n title: string;\r\n icon: string;\r\n}\r\n\r\ninterface LayoutPageProps {\r\n key: string;\r\n navigationDetails: LayoutPageNavigationDetails;\r\n page: React.ReactNode;\r\n}\r\n\r\ninterface State {\r\n selectedPage: string;\r\n}\r\n\r\nclass PlatformLayoutCmp extends React.Component {\r\n constructor(props: Props) {\r\n super(props);\r\n\r\n const selectedPage = props.defaultSelectedPage ? props.defaultSelectedPage : \"1\";\r\n this.state = {\r\n selectedPage\r\n };\r\n }\r\n\r\n public render() {\r\n return (\r\n
\r\n \r\n \r\n \"axi\"\r\n this.onMenuSelect(item)}\r\n >\r\n { this.props.pages.map(x => {\r\n return (\r\n \r\n \r\n {x.navigationDetails.title}\r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n { this.props.pages.find(x => x.key === this.state.selectedPage)!.page }\r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n private onMenuSelect(item: SelectParam) {\r\n this.setState({\r\n selectedPage: item.key\r\n });\r\n }\r\n}\r\n\r\nexport const PlatformLayout = injectIntl(PlatformLayoutCmp);\r\n","import * as React from \"react\";\r\nimport { strings, AllLocales, supportedLocales } from \"./strings\";\r\nimport { IntlProvider as LibIntlProvider } from \"react-intl\";\r\n\r\nexport interface IntlProps {\r\n locale: supportedLocales;\r\n onLocaleChange: (locale: supportedLocales) => void;\r\n}\r\n\r\nconst { Provider, Consumer } = React.createContext({\r\n locale: supportedLocales[\"en-gb\"],\r\n onLocaleChange: (_: supportedLocales) => undefined\r\n});\r\n\r\ninterface Props {\r\n children: React.ReactChild;\r\n}\r\n\r\ninterface State {\r\n locale: supportedLocales;\r\n strings: AllLocales;\r\n}\r\n\r\nexport class IntlProvider extends React.Component<\r\n Props,\r\n State\r\n > {\r\n constructor(props: Props) {\r\n super(props);\r\n // hack: localstorage should be done on start and via store subscription\r\n const defaultValue = (localStorage.getItem(\"myData\") || \"en-gb\") as keyof typeof supportedLocales;\r\n const locale = supportedLocales[defaultValue];\r\n this.state = {\r\n locale,\r\n strings\r\n };\r\n }\r\n public render() {\r\n const locale = this.state.strings[this.state.locale];\r\n return (\r\n \r\n \r\n {this.props.children}\r\n \r\n \r\n );\r\n }\r\n private onLocaleChange = (locale: supportedLocales) => {\r\n this.setState({\r\n locale\r\n });\r\n // hack: use redux and dispatch.\r\n localStorage.setItem(\"myData\", locale);\r\n }\r\n}\r\n\r\nexport const IntlConsumer = Consumer;\r\n\r\nexport function withIntl(WrappedComponent: React.ComponentType) {\r\n type TWithoutIntl = Pick>;\r\n return (props: TWithoutIntl) => {\r\n return (\r\n {state => {\r\n const newProps = { ...props, ...state } as T;\r\n return ();\r\n }\r\n }\r\n );\r\n };\r\n}\r\n","import { combineReducers } from \"redux\";\r\nimport { session, login, LoginState, SessionState } from \"../Login/State\";\r\nimport {\r\n SettingsMarketsGrid,\r\n settingsMarketsGrid,\r\n SettingsColours,\r\n settingsColours,\r\n ActiveTradingAccount,\r\n activeTradingAccount,\r\n tradingAccounts,\r\n ClientAccount,\r\n clientAccount,\r\n linkedTradingAccounts\r\n} from \"../Platform/State\";\r\nimport { TradingAccount } from \"swan-public-api-client\";\r\n\r\nexport interface AppState {\r\n login: LoginState;\r\n session: SessionState;\r\n settingsMarketsGrid: SettingsMarketsGrid;\r\n settingsColours: SettingsColours;\r\n clientAccount: ClientAccount,\r\n activeTradingAccount: ActiveTradingAccount;\r\n tradingAccounts: TradingAccount[];\r\n linkedTradingAccounts: TradingAccount[];\r\n}\r\n\r\nexport const rootReducer = combineReducers({\r\n login,\r\n session,\r\n settingsMarketsGrid,\r\n settingsColours,\r\n clientAccount,\r\n activeTradingAccount,\r\n tradingAccounts,\r\n linkedTradingAccounts\r\n});\r\n","import { applyMiddleware, createStore, StoreEnhancer } from \"redux\";\r\nimport { rootReducer } from \"./RootReducer\";\r\nimport { composeWithDevTools } from \"redux-devtools-extension\";\r\nimport { Logger } from \"./Logger\";\r\nimport { MonitorReducerEnhancer } from \"./MonitorReducer\";\r\nimport { Provider } from \"react-redux\";\r\nimport { PersistGate } from \"redux-persist/integration/react\";\r\nimport storage from \"redux-persist/lib/storage\"; // defaults to localStorage for web\r\nimport { persistStore, persistReducer, PersistConfig } from \"redux-persist\";\r\nimport React from \"react\";\r\n\r\nconst persistConfig: PersistConfig = {\r\n key: \"root\",\r\n storage,\r\n whitelist: [\r\n \"login\",\r\n \"session\",\r\n \"settingsMarketsGrid\",\r\n \"settingsColours\"\r\n ]\r\n};\r\n\r\nexport function configureStore(preloadedState: any) {\r\n const persistingRootReducer = persistReducer(persistConfig, rootReducer);\r\n let middlewares: any[];\r\n let enhancers: any[];\r\n if (process.env.NODE_ENV === \"development\") {\r\n middlewares = [Logger];\r\n } else {\r\n middlewares = [];\r\n enhancers = [];\r\n }\r\n const middlewareEnhancer = applyMiddleware(...middlewares);\r\n if (process.env.NODE_ENV === \"development\") {\r\n enhancers = [middlewareEnhancer, MonitorReducerEnhancer];\r\n } else {\r\n enhancers = [];\r\n }\r\n\r\n const composedEnhancers = composeWithDevTools(...enhancers) as StoreEnhancer;\r\n\r\n const store = createStore(\r\n persistingRootReducer,\r\n preloadedState,\r\n composedEnhancers\r\n );\r\n return store;\r\n}\r\n\r\nconst configuredStore = configureStore(undefined);\r\n\r\nexport const StoreProvider: React.FunctionComponent> = props => {\r\n const { children } = props;\r\n return (\r\n \r\n \r\n {children}\r\n \r\n \r\n );\r\n};\r\n","import { HistoricalTrade, HistoricalTradeResponse, TradeMatch, TradeMatchPosting, isConvertedTradeMatchPosting, isTradeMatchPosting, LedgerProcessType } from \"swan-public-api-client\";\r\n\r\nexport interface TradeHistoryGridRow extends HistoricalTrade {\r\n Pnl?: number;\r\n PnlCurrencyId?: number;\r\n OpeningOrClosing: OpeningOrClosing;\r\n}\r\n\r\nexport enum OpeningOrClosing {\r\n opening,\r\n closing\r\n}\r\n\r\nexport function convertToTradeHistoryGridRows(history: HistoricalTradeResponse | undefined, baseCurrencyId: number): TradeHistoryGridRow[] {\r\n if (history === undefined) {\r\n return [];\r\n }\r\n\r\n const openingTradeMatchesByTrade = new Map();\r\n const closingTradeMatchesByTrade = new Map();\r\n history.TradeMatches.forEach(tradeMatch => {\r\n if (!openingTradeMatchesByTrade.has(tradeMatch.OpeningTradeKey.Key)) {\r\n openingTradeMatchesByTrade.set(tradeMatch.OpeningTradeKey.Key, []);\r\n }\r\n const tradeMatchesForOpeningTrade = openingTradeMatchesByTrade.get(tradeMatch.OpeningTradeKey.Key)!;\r\n tradeMatchesForOpeningTrade.push(tradeMatch);\r\n\r\n if (!closingTradeMatchesByTrade.has(tradeMatch.ClosingTradeKey.Key)) {\r\n closingTradeMatchesByTrade.set(tradeMatch.ClosingTradeKey.Key, []);\r\n }\r\n const tradeMatchesForClosingTrade = closingTradeMatchesByTrade.get(tradeMatch.ClosingTradeKey.Key)!;\r\n tradeMatchesForClosingTrade.push(tradeMatch);\r\n });\r\n\r\n const tradeMatchPostings = new Map();\r\n history.Postings.forEach(x => {\r\n if (\r\n (isConvertedTradeMatchPosting(x) || isTradeMatchPosting(x))\r\n && x.PostingType.Key === LedgerProcessType.Trade) {\r\n tradeMatchPostings.set(x.TradeMatchKey, x);\r\n }\r\n });\r\n\r\n return history.Trades.map(trade => {\r\n const closingTradeMatches = closingTradeMatchesByTrade.get(trade.InstructionKey.Key);\r\n if (closingTradeMatches === undefined) {\r\n const openingTradeRow: TradeHistoryGridRow = {\r\n ...trade!,\r\n Pnl: undefined,\r\n PnlCurrencyId: undefined,\r\n OpeningOrClosing: OpeningOrClosing.opening\r\n };\r\n return openingTradeRow;\r\n }\r\n\r\n const postings = closingTradeMatches.map(tradeMatch => tradeMatchPostings.get(tradeMatch.Key)!);\r\n const postingsAreAllTheSameCurrency = postings.every(isConvertedTradeMatchPosting) || postings.every(posting => !isConvertedTradeMatchPosting(posting));\r\n const pnl = postingsAreAllTheSameCurrency // Can't add postings of different currencies\r\n ? postings.reduce((accumulator, posting) => accumulator + posting.Amount, 0)\r\n : undefined;\r\n const pnlCurrencyId = postingsAreAllTheSameCurrency\r\n ? postings.every(isConvertedTradeMatchPosting)\r\n ? baseCurrencyId\r\n : trade.CurrencyId\r\n : undefined;\r\n\r\n const tradeRow: TradeHistoryGridRow = {\r\n ...trade!,\r\n Pnl: pnl,\r\n PnlCurrencyId: pnlCurrencyId,\r\n OpeningOrClosing: OpeningOrClosing.closing\r\n };\r\n return tradeRow;\r\n });\r\n}\r\n","import {\r\n PapiAuthenticationProvider, PropsFromState, PropsFromActions,\r\n} from \"../Api/PapiClient\";\r\nimport { AppState } from \"../Store/RootReducer\";\r\nimport { connect } from \"react-redux\";\r\nimport { saveTradingAccounts, saveClientAccount, saveLinkedTradingAccounts, saveActiveTradingAccount } from \"../Platform/State\";\r\nimport { TradingAccount, Account } from \"swan-public-api-client\";\r\n\r\nconst mapStatetoProps = (state: AppState): PropsFromState => {\r\n const { token } = state.session;\r\n return {\r\n existingToken: token,\r\n activeTradingAccount: state.activeTradingAccount.account };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any): PropsFromActions => ({\r\n setTradingAccounts: (tradingAccounts: TradingAccount[]) => dispatch(saveTradingAccounts(tradingAccounts)),\r\n setLinkedTradingAccounts: (linkedTradingAccounts: TradingAccount[]) => dispatch(saveLinkedTradingAccounts(linkedTradingAccounts)),\r\n setClientAccount: (account: Account) => dispatch(saveClientAccount(account)),\r\n setActiveTradingAccount: (activeTradingAccount: TradingAccount | undefined) => dispatch(saveActiveTradingAccount(activeTradingAccount))\r\n})\r\n\r\nexport const PapiAuthenticationProviderWithSessionState = connect(\r\n mapStatetoProps,\r\n mapDispatchToProps\r\n)(PapiAuthenticationProvider);\r\n","import * as React from \"react\";\r\nimport { SwanPublicClient } from \"swan-public-api-client\";\r\nimport { PapiClientConsumer } from \"../Api/PapiClient\";\r\n\r\ninterface PushStream {\r\n start: () => void;\r\n stop: () => void;\r\n}\r\n\r\ninterface SubscriptionLifecycleState {\r\n subscription: PushStream | undefined;\r\n}\r\n\r\ninterface Props {\r\n papiSubscribe: (client: SwanPublicClient, groupKey: string) => PushStream;\r\n client: SwanPublicClient;\r\n groupKey: string;\r\n}\r\n\r\nclass ContextStateToProp extends React.PureComponent<\r\n Props,\r\n SubscriptionLifecycleState\r\n> {\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = { subscription: undefined };\r\n }\r\n public componentDidMount() {\r\n const subscription = this.startSubscription(this.props.client);\r\n this.setState({\r\n subscription\r\n });\r\n }\r\n public componentDidUpdate(prevProps: Props) {\r\n if (prevProps.groupKey !== this.props.groupKey) {\r\n this.stopSubscription();\r\n const subscription = this.startSubscription(this.props.client);\r\n this.setState({\r\n subscription\r\n });\r\n }\r\n }\r\n public componentWillUnmount() {\r\n this.stopSubscription();\r\n }\r\n public render() {\r\n return this.props.children;\r\n }\r\n private stopSubscription() {\r\n if (this.state.subscription) {\r\n this.state.subscription.stop();\r\n }\r\n }\r\n private startSubscription(client: SwanPublicClient) {\r\n const subscription = this.props.papiSubscribe(client, this.props.groupKey);\r\n subscription.start();\r\n return subscription;\r\n }\r\n}\r\n\r\ninterface SubscriptionLifecycleProps {\r\n groupKey: string;\r\n papiSubscribe: (client: SwanPublicClient, groupKey: string) => PushStream;\r\n children: () => JSX.Element;\r\n}\r\n\r\n// tslint:disable-next-line:max-classes-per-file\r\nexport class SubscriptionLifecycle extends React.PureComponent<\r\n SubscriptionLifecycleProps\r\n> {\r\n constructor(props: SubscriptionLifecycleProps) {\r\n super(props);\r\n this.state = {\r\n subscription: undefined\r\n };\r\n }\r\n public render() {\r\n return (\r\n \r\n {state => {\r\n return (\r\n \r\n {this.props.children()}\r\n \r\n );\r\n }}\r\n \r\n );\r\n }\r\n}\r\n","import * as React from \"react\";\r\nimport {\r\n Position,\r\n SwanPublicClient,\r\n StreamUpdate,\r\n StreamUpdateType,\r\n Currency\r\n} from \"swan-public-api-client\";\r\nimport { SubscriptionLifecycle } from \"../Push/SubscriptionLifecycle\";\r\nimport { FxConvertedPosition } from \"./FxConvertedPosition\";\r\nimport { connect } from \"react-redux\";\r\nimport { AppState } from \"../Store/RootReducer\";\r\nimport { FxRates } from \"../Api/FxRates\";\r\n\r\ninterface PropsFromAppState {\r\n baseCurrency: Currency;\r\n}\r\n\r\ninterface Props extends PropsFromAppState {\r\n children: (positions: FxConvertedPosition[]) => JSX.Element;\r\n groupKey: string;\r\n fxRates: FxRates;\r\n}\r\n\r\ninterface State {\r\n positions: Map;\r\n}\r\n\r\nclass StreamingOpenPositionsCmp extends React.Component {\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n positions: new Map()\r\n };\r\n }\r\n\r\n // clear the existing state when the subscription key changes\r\n public componentDidUpdate(prevProps: Props) {\r\n if (prevProps.groupKey !== this.props.groupKey) {\r\n const state: State = {\r\n positions: new Map()\r\n };\r\n\r\n this.setState(state);\r\n }\r\n }\r\n\r\n public render() {\r\n const papiSubscribe = (client: SwanPublicClient, groupKey: string) => {\r\n return client.streamPositions(\r\n groupKey,\r\n this.consumeUpdate,\r\n undefined\r\n );\r\n };\r\n\r\n const positionsArray = Array\r\n .from(this.state.positions.values())\r\n .map(this.applyFxRate);\r\n\r\n return (\r\n \r\n {() => {\r\n return this.props.children(positionsArray);\r\n }}\r\n \r\n );\r\n }\r\n\r\n private consumeUpdate = (newData: Array>) => {\r\n const positions = this.state.positions;\r\n\r\n newData.forEach(update => {\r\n const key = update.update.PositionKey.Key;\r\n switch (update.type) {\r\n case StreamUpdateType.Delete:\r\n positions.delete(key);\r\n break;\r\n default:\r\n positions.set(key, {\r\n ...update.update,\r\n BaseCurrencyOpenPnL: undefined,\r\n BaseCurrencyMarginRequirement: undefined\r\n });\r\n break;\r\n }\r\n });\r\n\r\n this.setState({ positions });\r\n }\r\n\r\n private applyFxRate = (\r\n position: Position | FxConvertedPosition\r\n ): FxConvertedPosition => {\r\n const fxRate = this.props.fxRates.getAndOrSubscribeFxRate(\r\n position.CurrencyId.toString(),\r\n this.props.baseCurrency.Key\r\n );\r\n const baseCurrencyOpenPnl = fxRate !== undefined\r\n ? position.OpenPnL * fxRate\r\n : undefined;\r\n const baseCurrencyMarginRequirement = fxRate !== undefined\r\n ? position.MarginRequirement * fxRate\r\n : undefined;\r\n\r\n return {\r\n ...position,\r\n BaseCurrencyOpenPnL: baseCurrencyOpenPnl,\r\n BaseCurrencyMarginRequirement: baseCurrencyMarginRequirement\r\n };\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: AppState): PropsFromAppState => {\r\n return {\r\n baseCurrency: state.clientAccount.account!.Currency\r\n };\r\n};\r\n\r\nexport const StreamingOpenPositions = connect(\r\n mapStateToProps\r\n)(StreamingOpenPositionsCmp);\r\n","import React from \"react\";\r\nimport { Currency } from \"swan-public-api-client\";\r\nimport { FormattedNumber } from \"react-intl\";\r\n\r\ninterface Props {\r\n value: number | null | undefined;\r\n currency: Currency | null | undefined;\r\n}\r\n\r\nexport class FormattedCurrency extends React.PureComponent {\r\n public render() {\r\n if (this.props.value === undefined\r\n || this.props.value === null) {\r\n return (\"–\");\r\n }\r\n\r\n return ();\r\n }\r\n}\r\n","import React from \"react\";\r\nimport { Currency } from \"swan-public-api-client\";\r\nimport { FormattedNumber } from \"react-intl\";\r\n\r\ninterface Props {\r\n value: number | null | undefined;\r\n currency: Currency | null | undefined;\r\n}\r\n\r\nexport class FormattedPrice extends React.PureComponent {\r\n public render() {\r\n if (this.props.value === undefined\r\n || this.props.value === null) {\r\n return (\"–\");\r\n }\r\n\r\n if (this.props.currency !== undefined\r\n && this.props.currency !== null) {\r\n return ();\r\n } else {\r\n return ();\r\n // return (); // if we don't know the currency, the best we can do is make sure we don't truncate the values\r\n }\r\n }\r\n}\r\n","import { TradeSubType, TradingInstructionDirection, Currency } from \"swan-public-api-client\";\r\nimport { IntlShape } from \"react-intl\";\r\nimport { OpeningOrClosing } from \"../TradeHistory/TradeHistoryGridRow\";\r\n\r\nexport function tradeSubTypeToStringConverter(value: TradeSubType, intl: IntlShape) {\r\n switch (value) {\r\n case TradeSubType.New:\r\n return intl.formatMessage({ id: \"tradeSubType.new\" });\r\n case TradeSubType.Roll:\r\n return intl.formatMessage({ id: \"tradeSubType.roll\" });\r\n case TradeSubType.FxConversionOpen:\r\n return intl.formatMessage({ id: \"tradeSubType.fxConversionOpen\" });\r\n default:\r\n return intl.formatMessage({ id: \"converters.unknownValue\" });\r\n }\r\n}\r\n\r\nexport function tradingInstructionDirectionToStringConverter(value: TradingInstructionDirection, intl: IntlShape) {\r\n switch (value) {\r\n case TradingInstructionDirection.Buy:\r\n return intl.formatMessage({ id: \"tradingInstructionDirection.buy\" });\r\n case TradingInstructionDirection.Sell:\r\n return intl.formatMessage({ id: \"tradingInstructionDirection.sell\" });\r\n default:\r\n return intl.formatMessage({ id: \"converters.unknownValue\"});\r\n }\r\n}\r\n\r\nexport function quantityDirectionToStringConverter(value: number, intl: IntlShape) {\r\n return tradingInstructionDirectionToStringConverter(\r\n value >= 0\r\n ? TradingInstructionDirection.Buy\r\n : TradingInstructionDirection.Sell,\r\n intl);\r\n}\r\n\r\nexport function openingOrClosingToStringConverter(value: OpeningOrClosing, intl: IntlShape) {\r\n switch (value) {\r\n case OpeningOrClosing.opening:\r\n return intl.formatMessage({ id: \"openingOrClosing.opening\" });\r\n case OpeningOrClosing.closing:\r\n return intl.formatMessage({ id: \"openingOrClosing.closing\" });\r\n default:\r\n return intl.formatMessage({ id: \"converters.unknownValue\"});\r\n }\r\n}\r\n\r\nexport function currencyToStringConverter(value: Currency | undefined, intl: IntlShape) {\r\n return value?.IsoCode ?? intl.formatMessage({ id: \"converters.unknownValue\"});\r\n}\r\n","import * as React from \"react\";\r\nimport { Currency, ConsiderationValue, TradingInstructionDirection, TradeSubType } from \"swan-public-api-client\";\r\nimport { FormattedNumber, FormattedDate, IntlShape, FormattedTime } from \"react-intl\";\r\nimport { FormattedCurrency } from \"../Localisation/FormattedCurrency\";\r\nimport { FormattedPrice } from \"../Localisation/FormattedPrice\";\r\nimport { tradeSubTypeToStringConverter, tradingInstructionDirectionToStringConverter, quantityDirectionToStringConverter, currencyToStringConverter } from \"../Localisation/Converters\";\r\n\r\nfunction undefinedRenderer(\r\n valueSelector: (record: TRecord) => TProperty | null | undefined,\r\n renderer: (value: TProperty) => JSX.Element\r\n) {\r\n return (_: any, record: TRecord, __: number) => {\r\n const value = valueSelector(record);\r\n if (value === undefined\r\n || value === null) {\r\n return (\"–\");\r\n }\r\n\r\n return renderer(value);\r\n }\r\n};\r\n\r\nexport function currencyNameRenderer(\r\n valueSelector: (x: T) => number | null | undefined,\r\n currencies: Map,\r\n intl: IntlShape\r\n) {\r\n return (_: any, record: T, __: number) => {\r\n const value = valueSelector(record);\r\n const currency = value !== undefined && value !== null\r\n ? currencies.get(value)\r\n : undefined;\r\n return currencyToStringConverter(currency, intl);\r\n };\r\n}\r\n\r\nexport function currencyRenderer(\r\n valueSelector: (x: T) => number | null | undefined,\r\n currency: Currency\r\n) {\r\n return (_: any, record: T, __: number) => {\r\n const value = valueSelector(record);\r\n return ();\r\n }\r\n}\r\n\r\nexport function currencyViaRecordRenderer(\r\n valueSelector: (x: T) => number | null | undefined,\r\n currencyIdSelector: (x: T) => number | null | undefined,\r\n currencies: Map\r\n) {\r\n return (_: any, record: T, __: number) => {\r\n const value = valueSelector(record);\r\n const currencyId = currencyIdSelector(record);\r\n const currency = currencyId !== undefined && currencyId !== null\r\n ? currencies.get(currencyId)\r\n : undefined;\r\n\r\n return ();\r\n };\r\n}\r\n\r\nexport function currencyRoundedValueRenderer(\r\n valueSelector: (x: T) => number,\r\n currencyIdSelector: (x: T) => number,\r\n currencies: Map\r\n) {\r\n return (_: any, record: T, __: number) => {\r\n const value = valueSelector(record);\r\n const currencyId = currencyIdSelector(record);\r\n const currency = currencies.get(currencyId);\r\n if (currency) {\r\n return ()\r\n } else {\r\n return ()\r\n }\r\n };\r\n}\r\n\r\nexport function considerationRenderer(\r\n valueSelector: (x: T) => ConsiderationValue | null | undefined,\r\n currencies: Map\r\n) {\r\n const subValueExtractor = (\r\n considerationValue: ConsiderationValue | null | undefined,\r\n valueExtractor: (considerationValue: ConsiderationValue) => TReturn\r\n ) => {\r\n if (considerationValue === undefined) {\r\n return undefined;\r\n }\r\n if (considerationValue === null) {\r\n return null;\r\n }\r\n\r\n return valueExtractor(considerationValue);\r\n };\r\n\r\n const currencyRendererValueSelector = (x: T) => {\r\n const value = valueSelector(x);\r\n return subValueExtractor(\r\n value,\r\n considerationValue => considerationValue.Value\r\n );\r\n };\r\n const currencyRendererCurrencyIdSelector = (x: T) => {\r\n const value = valueSelector(x);\r\n return subValueExtractor(\r\n value,\r\n considerationValue => considerationValue.CurrencyId\r\n );\r\n };\r\n\r\n return currencyViaRecordRenderer(\r\n currencyRendererValueSelector,\r\n currencyRendererCurrencyIdSelector,\r\n currencies\r\n );\r\n}\r\n\r\nexport function dateRenderer(\r\n valueSelector: (x: T) => Date | null | undefined\r\n) {\r\n return undefinedRenderer(\r\n valueSelector,\r\n value => \r\n );\r\n}\r\n\r\nexport function dateTimeRenderer(\r\n valueSelector: (x: T) => Date | null | undefined\r\n) {\r\n return undefinedRenderer(\r\n valueSelector,\r\n value => \r\n );\r\n}\r\n\r\nexport function priceRenderer(\r\n valueSelector: (x: T) => number | null | undefined,\r\n currency: Currency\r\n) {\r\n return (_: any, record: T, __: number) => {\r\n const value = valueSelector(record);\r\n return ();\r\n };\r\n}\r\n\r\nexport function priceWithCurrencyViaRecordRenderer(\r\n valueSelector: (x: T) => number | null | undefined,\r\n currencyIdSelector: (x: T) => number | null | undefined,\r\n currencies: Map\r\n) {\r\n return (_: any, record: T, __: number) => {\r\n const value = valueSelector(record);\r\n const currencyId = currencyIdSelector(record);\r\n const currency = currencyId !== undefined && currencyId !== null\r\n ? currencies.get(currencyId)\r\n : undefined;\r\n\r\n return ();\r\n }\r\n}\r\n\r\nexport function directionRenderer(\r\n valueSelector: (x: T) => TradingInstructionDirection,\r\n intl: IntlShape\r\n) {\r\n return (_: any, record: T, __: number) => {\r\n const value = valueSelector(record);\r\n return tradingInstructionDirectionToStringConverter(value, intl);\r\n };\r\n}\r\n\r\nexport function quantityDirectionRenderer(\r\n valueSelector: (x: T) => number,\r\n intl: IntlShape\r\n) {\r\n return (_: any, record: T, __: number) => {\r\n const value = valueSelector(record);\r\n return quantityDirectionToStringConverter(value, intl);\r\n };\r\n}\r\n\r\nexport function tradeSubTypeRenderer(\r\n valueSelector: (x: T) => TradeSubType,\r\n intl: IntlShape\r\n) {\r\n return (_: any, record: T, __: number) => {\r\n const value = valueSelector(record);\r\n return tradeSubTypeToStringConverter(value, intl);\r\n };\r\n}\r\n","import * as React from \"react\";\r\nimport { Table } from \"antd\";\r\nimport { WrappedComponentProps, injectIntl } from \"react-intl\";\r\nimport { Position, Currency } from \"swan-public-api-client\";\r\nimport { PaginationConfig } from \"antd/lib/pagination\";\r\nimport { connect } from \"react-redux\";\r\nimport { AppState } from \"../Store/RootReducer\";\r\nimport { ColumnProps, TableLocale } from \"antd/lib/table\";\r\nimport { currencyRoundedValueRenderer, priceWithCurrencyViaRecordRenderer, priceRenderer } from \"../Grid/Renderers\";\r\nimport { FxConvertedPosition } from \"./FxConvertedPosition\";\r\n\r\ninterface PropsFromState {\r\n currencies: Map;\r\n baseCurrency: Currency;\r\n}\r\n\r\ninterface PositionsGridProps {\r\n columns: Column[];\r\n bordered?: boolean;\r\n locale?: TableLocale;\r\n pagination?: PaginationConfig | false;\r\n title?: boolean | ((currentPageData: object[]) => React.ReactNode);\r\n onSelectionChange?: (\r\n selectedRowKeys: string[] | number[],\r\n selectedRows: FxConvertedPosition[]\r\n ) => void;\r\n}\r\n\r\nexport type Column = \"marketName\" | \"quantity\" | \"bookingPrice\" | \"currentPrice\" | \"profitAndLoss\" | \"margin\";\r\n\r\nexport const DefaultColumns: Column[] = [\"marketName\", \"quantity\", \"bookingPrice\", \"currentPrice\", \"profitAndLoss\", \"margin\"];\r\nexport const DefaultSpotFxColumns: Column[] = [\"marketName\", \"quantity\", \"bookingPrice\", \"currentPrice\", \"profitAndLoss\"];\r\n\r\ninterface Props\r\n extends WrappedComponentProps,\r\n PropsFromState,\r\n PositionsGridProps {\r\n positions: FxConvertedPosition[];\r\n}\r\n\r\nfunction PositionsGridCmp(props: Props) {\r\n const {\r\n Symbol: baseCurrencySymbol\r\n } = props.baseCurrency;\r\n\r\n const columns: Array> = props.columns.map(column => {\r\n switch (column) {\r\n case \"marketName\":\r\n return {\r\n dataIndex: \"MarketName\",\r\n title: props.intl.formatMessage({ id: \"positionsGrid.marketName\" }),\r\n sorter: (a, b) => (a.MarketName < b.MarketName ? -1 : 1),\r\n sortDirections: [\"ascend\", \"descend\"],\r\n defaultSortOrder: \"ascend\"\r\n };\r\n case \"quantity\":\r\n return {\r\n dataIndex: \"Quantity\",\r\n title: props.intl.formatMessage({ id: \"positionsGrid.quantity\" }),\r\n render: currencyRoundedValueRenderer(\r\n x => x.Quantity,\r\n x => x.CurrencyId,\r\n props.currencies\r\n ),\r\n align: \"right\",\r\n sorter: (a, b) => (Math.abs(a.Quantity) < Math.abs(b.Quantity) ? -1 : 1),\r\n sortDirections: [\"ascend\", \"descend\"]\r\n };\r\n case \"currentPrice\":\r\n return {\r\n dataIndex: \"CurrentPrice\",\r\n title: props.intl.formatMessage({\r\n id: \"positionsGrid.currentPrice\"\r\n }),\r\n render: priceWithCurrencyViaRecordRenderer(\r\n x => x.CurrentPrice,\r\n _ => undefined,\r\n props.currencies\r\n ),\r\n align: \"right\",\r\n sorter: (a, b) => (a.CurrentPrice < b.CurrentPrice ? -1 : 1),\r\n sortDirections: [\"ascend\", \"descend\"]\r\n };\r\n case \"bookingPrice\":\r\n return {\r\n dataIndex: \"BookingPrice\",\r\n title: props.intl.formatMessage({\r\n id: \"positionsGrid.netOpenPrice\"\r\n }),\r\n render: priceWithCurrencyViaRecordRenderer(\r\n x => x.BookingPrice,\r\n _ => undefined,\r\n props.currencies\r\n ),\r\n align: \"right\",\r\n sorter: (a, b) => (a.BookingPrice < b.BookingPrice ? -1 : 1),\r\n sortDirections: [\"ascend\", \"descend\"]\r\n };\r\n case \"profitAndLoss\":\r\n return {\r\n dataIndex: \"BaseCurrencyOpenPnL\",\r\n render: priceRenderer(\r\n x => x.BaseCurrencyOpenPnL,\r\n props.baseCurrency\r\n ),\r\n title: props.intl.formatMessage(\r\n {\r\n id: \"positionsGrid.baseCurrencyOpenPnL\"\r\n },\r\n { symbol: baseCurrencySymbol }\r\n ),\r\n align: \"right\",\r\n sorter: (a, b) =>\r\n (a.BaseCurrencyOpenPnL || -1) < (b.BaseCurrencyOpenPnL || -1) ? -1 : 1,\r\n sortDirections: [\"ascend\", \"descend\"]\r\n };\r\n case \"margin\":\r\n return {\r\n dataIndex: \"BaseCurrencyMarginRequirement\",\r\n render: priceRenderer(\r\n x => x.BaseCurrencyMarginRequirement,\r\n props.baseCurrency\r\n ),\r\n title: props.intl.formatMessage(\r\n {\r\n id: \"positionsGrid.baseCurrencyMargin\"\r\n },\r\n { symbol: baseCurrencySymbol }\r\n ),\r\n align: \"right\",\r\n sorter: (a, b) =>\r\n (a.BaseCurrencyOpenPnL || -1) < (b.BaseCurrencyOpenPnL || -1) ? -1 : 1,\r\n sortDirections: [\"ascend\", \"descend\"]\r\n };\r\n default:\r\n throw Error(`Unknown column \"${column}\"`);\r\n }\r\n });\r\n\r\n return (\r\n record.PositionKey.Key}\r\n columns={columns}\r\n size=\"middle\"\r\n bordered={props.bordered}\r\n title={props.title === undefined || props.title === false\r\n ? undefined\r\n : props.title === true\r\n ? () => props.intl.formatMessage({ id: \"positionsGrid.title\" })\r\n : props.title}\r\n locale={props.locale}\r\n pagination={props.pagination}\r\n rowSelection={\r\n props.onSelectionChange\r\n ? {\r\n type: \"radio\",\r\n onChange: props.onSelectionChange\r\n }\r\n : undefined\r\n }\r\n />\r\n );\r\n}\r\n\r\nconst PositionsGridWithIntl = injectIntl(PositionsGridCmp);\r\n\r\nconst mapStateToProps = (state: AppState): PropsFromState => ({\r\n currencies: new Map(\r\n state.activeTradingAccount.account!.Currencies.map(x => [\r\n parseInt(x.Key, 10),\r\n x\r\n ])\r\n ),\r\n baseCurrency: state.clientAccount.account!.Currency\r\n});\r\n\r\nexport const PositionsGrid = connect(mapStateToProps)(PositionsGridWithIntl);\r\n","import { PositionStatus } from \"swan-public-api-client\";\r\nimport { FxConvertedPosition } from \"./FxConvertedPosition\";\r\n\r\nconst addOrUndefined = (x: number | undefined, y: number | undefined) => {\r\n if (x === undefined || y === undefined) {\r\n return undefined;\r\n }\r\n return x + y;\r\n};\r\n\r\n// Positions from the PAPI are keys by market, currency and direction.\r\n// We combine the direction rows here.\r\nexport function groupPositionsByMarketAndCurrency(\r\n positions: FxConvertedPosition[]\r\n): FxConvertedPosition[] {\r\n const groupedPositions = new Map();\r\n\r\n positions.forEach(position => {\r\n const key = getByMarketAndCurrencyKey(position);\r\n if (!groupedPositions.has(key)) {\r\n groupedPositions.set(key, []);\r\n }\r\n\r\n groupedPositions.get(key)!.push(position);\r\n });\r\n\r\n return Array.from(groupedPositions.entries()).map(x => {\r\n const key = x[0];\r\n const positionsByMarketAndCurrency = x[1];\r\n const firstPosition = positionsByMarketAndCurrency[0];\r\n\r\n const quantity = positionsByMarketAndCurrency\r\n .map(p => p.Quantity)\r\n .reduce((accumulator, current) => accumulator + current);\r\n\r\n const absoluteQuantity = positionsByMarketAndCurrency\r\n .map(p => p.Quantity)\r\n .reduce((accumulator, current) => accumulator + Math.abs(current), 0);\r\n\r\n const currentPrice =\r\n positionsByMarketAndCurrency\r\n .map(p => p.CurrentPrice)\r\n .reduce((accumulator, current) => accumulator + current) /\r\n positionsByMarketAndCurrency.length;\r\n\r\n const openPnL = positionsByMarketAndCurrency\r\n .map(p => p.OpenPnL)\r\n .reduce((accumulator, current) => accumulator + current);\r\n\r\n const baseCurrencyOpenPnL = positionsByMarketAndCurrency\r\n .map(p => p.BaseCurrencyOpenPnL)\r\n .reduce((accumulator, current) => addOrUndefined(accumulator, current));\r\n\r\n const baseCurrencyMarginRequirement = positionsByMarketAndCurrency\r\n .map(p => p.BaseCurrencyMarginRequirement)\r\n .reduce((accumulator, current) => addOrUndefined(accumulator, current));\r\n\r\n const status = positionsByMarketAndCurrency\r\n .map(p => p.Status)\r\n .reduce((accumulator, current) => {\r\n if (accumulator === PositionStatus.TriggeredOrder) {\r\n return PositionStatus.TriggeredOrder;\r\n }\r\n if (accumulator === PositionStatus.Closed) {\r\n return PositionStatus.Closed;\r\n }\r\n\r\n return current;\r\n });\r\n\r\n const bookingPrice = positionsByMarketAndCurrency.reduce(\r\n (accumulator, current) =>\r\n accumulator +\r\n (current.BookingPrice * Math.abs(current.Quantity)) / absoluteQuantity,\r\n 0\r\n );\r\n\r\n const combinedPosition: FxConvertedPosition = {\r\n PositionKey: { Key: key },\r\n AccountKey: firstPosition.AccountKey,\r\n TradingAccountKey: firstPosition.TradingAccountKey,\r\n MarketKey: firstPosition.MarketKey,\r\n MarketName: firstPosition.MarketName,\r\n Quantity: quantity,\r\n CurrentPrice: currentPrice,\r\n OpenPnL: openPnL,\r\n CurrencyId: firstPosition.CurrencyId,\r\n MarginRequirement: firstPosition.MarginRequirement, // margin requirement for both directions is the same, and is the total\r\n Status: status,\r\n BookingPrice: bookingPrice,\r\n BaseCurrencyOpenPnL: baseCurrencyOpenPnL,\r\n BaseCurrencyMarginRequirement: baseCurrencyMarginRequirement\r\n };\r\n return combinedPosition;\r\n });\r\n}\r\n\r\nfunction getByMarketAndCurrencyKey(position: FxConvertedPosition): string {\r\n return `${position.MarketKey}#${position.CurrencyId}`;\r\n}\r\n","import * as React from \"react\";\r\nimport { StreamingOpenPositions } from \"./StreamingOpenPositions\";\r\nimport { PositionsGrid, Column, DefaultSpotFxColumns, DefaultColumns } from \"./PositionsGrid\";\r\nimport { AppState } from \"../Store/RootReducer\";\r\nimport { connect } from \"react-redux\";\r\nimport { groupPositionsByMarketAndCurrency } from \"./GroupPositionsByMarketAndCurrency\";\r\nimport { WrappedComponentProps, injectIntl } from \"react-intl\";\r\nimport { FxRatesConsumer } from \"../Api/FxRates\";\r\nimport { ProductType } from \"swan-public-api-client\";\r\nimport { TableLocale, PaginationConfig } from \"antd/lib/table\";\r\nimport { FxConvertedPosition } from \"./FxConvertedPosition\";\r\n\r\ninterface PropsFromState {\r\n activeTradingAccountKey: string;\r\n activeTradingAccountType: ProductType;\r\n}\r\n\r\ninterface PositionsGridProps {\r\n columns?: Column[];\r\n bordered?: boolean;\r\n locale?: TableLocale;\r\n pagination?: PaginationConfig | false;\r\n title?: boolean | ((currentPageData: object[]) => React.ReactNode);\r\n onSelectionChange?: (\r\n selectedRowKeys: string[] | number[],\r\n selectedRows: FxConvertedPosition[]\r\n ) => void;\r\n}\r\n\r\ninterface Props\r\n extends PositionsGridProps,\r\n PropsFromState,\r\n WrappedComponentProps {\r\n groupByDirection?: boolean;\r\n}\r\n\r\nfunction getColumns(props: Props): Column[] {\r\n if (props.columns !== undefined) {\r\n return props.columns;\r\n }\r\n\r\n switch (props.activeTradingAccountType) {\r\n case ProductType.SpotFX:\r\n return DefaultSpotFxColumns;\r\n default:\r\n return DefaultColumns;\r\n }\r\n}\r\n\r\nconst ActiveTradingAccountStreamingOpenPositionsGridCmp = (props: Props) => {\r\n const groupByDirection =\r\n props.groupByDirection === undefined ? true : props.groupByDirection;\r\n\r\n return (\r\n \r\n {fxRates => (\r\n \r\n {positions => (\r\n \r\n )}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nconst mapStateToProps = (state: AppState): PropsFromState => {\r\n return {\r\n activeTradingAccountKey: state.activeTradingAccount.account!.Key,\r\n activeTradingAccountType: state.activeTradingAccount.account!.AccountType\r\n };\r\n};\r\n\r\nconst ActiveTradingAccountStreamingOpenPositionsGridWithIntl = injectIntl(\r\n ActiveTradingAccountStreamingOpenPositionsGridCmp\r\n);\r\n\r\nexport const ActiveTradingAccountStreamingOpenPositionsGrid = connect(\r\n mapStateToProps\r\n)(ActiveTradingAccountStreamingOpenPositionsGridWithIntl);\r\n","import * as React from \"react\";\r\nimport { Trade, SwanPublicClient, StreamUpdate, StreamUpdateType, Currency } from \"swan-public-api-client\";\r\nimport { SubscriptionLifecycle } from \"../Push/SubscriptionLifecycle\";\r\nimport { FxConvertedTrade } from \"./FxConvertedTrade\";\r\nimport { FxRates } from \"../Api/FxRates\";\r\nimport { connect } from \"react-redux\";\r\nimport { AppState } from \"../Store/RootReducer\";\r\n\r\ninterface PropsFromAppState {\r\n baseCurrency: Currency;\r\n}\r\n\r\ninterface Props extends PropsFromAppState {\r\n children: (trades: FxConvertedTrade[]) => JSX.Element;\r\n groupKey: string;\r\n fxRates: FxRates;\r\n}\r\n\r\ninterface State {\r\n trades: Map;\r\n}\r\n\r\nclass StreamingOpenTradesCmp extends React.Component {\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n trades: new Map()\r\n };\r\n }\r\n\r\n // clear the existing state when the subscription key changes\r\n public componentDidUpdate(prevProps: Props) {\r\n if (prevProps.groupKey !== this.props.groupKey) {\r\n const state: State = {\r\n trades: new Map()\r\n };\r\n\r\n this.setState(state);\r\n }\r\n }\r\n\r\n public render() {\r\n const papiSubscribe = (client: SwanPublicClient, groupKey: string) => {\r\n return client.streamTrades(\r\n groupKey,\r\n this.consumeUpdate,\r\n undefined\r\n );\r\n };\r\n\r\n const tradesArray = Array\r\n .from(this.state.trades.values())\r\n .map(this.applyFxRate);\r\n\r\n return (\r\n \r\n {() => {\r\n return this.props.children(tradesArray);\r\n }}\r\n \r\n );\r\n }\r\n\r\n private consumeUpdate = (newData: Array>) => {\r\n const trades = this.state.trades;\r\n\r\n newData.forEach(update => {\r\n const key = update.update.InstructionKey.Key;\r\n\r\n switch (update.type) {\r\n case StreamUpdateType.Delete:\r\n trades.delete(key);\r\n break;\r\n default:\r\n trades.set(key, {\r\n ...update.update,\r\n BaseCurrencyOpenPnL: undefined,\r\n BaseCurrencyMarginRequirement: undefined\r\n });\r\n break;\r\n }\r\n });\r\n\r\n this.setState({ trades });\r\n }\r\n\r\n private applyFxRate = (\r\n trade: Trade | FxConvertedTrade\r\n ): FxConvertedTrade => {\r\n const fxRate = this.props.fxRates.getAndOrSubscribeFxRate(\r\n trade.CurrencyId.toString(),\r\n this.props.baseCurrency.Key\r\n );\r\n const baseCurrencyOpenPnl = fxRate !== undefined\r\n ? trade.OpenPnl * fxRate\r\n : undefined;\r\n const baseCurrencyMarginRequirement = fxRate !== undefined\r\n ? trade.MarginRequirement * fxRate\r\n : undefined;\r\n\r\n return {\r\n ...trade,\r\n BaseCurrencyOpenPnL: baseCurrencyOpenPnl,\r\n BaseCurrencyMarginRequirement: baseCurrencyMarginRequirement\r\n }\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: AppState): PropsFromAppState => {\r\n return {\r\n baseCurrency: state.clientAccount.account!.Currency\r\n };\r\n};\r\n\r\nexport const StreamingOpenTrades = connect(\r\n mapStateToProps\r\n)(StreamingOpenTradesCmp);\r\n","import { ConsiderationValue } from \"swan-public-api-client\";\r\n\r\nexport function getConsiderationSorter(\r\n selector: (x: T) => ConsiderationValue | undefined\r\n) {\r\n return (a: T, b: T) => {\r\n const aConsiderationValue = selector(a);\r\n const bConsiderationValue = selector(b);\r\n\r\n // check whether considerations are set. Unset considerations are sorted to the top\r\n if (!aConsiderationValue && !bConsiderationValue) {\r\n return 0;\r\n }\r\n if (aConsiderationValue && !bConsiderationValue) {\r\n return -1;\r\n }\r\n if (!aConsiderationValue && bConsiderationValue) {\r\n return 1;\r\n }\r\n // sort by abs value, and don't worry that different rows are in different currencies\r\n const bAbsConsideration = Math.abs(bConsiderationValue!.Value);\r\n const aAbsConsideration = Math.abs(aConsiderationValue!.Value);\r\n if (aAbsConsideration < bAbsConsideration) {\r\n return -1;\r\n }\r\n if (aAbsConsideration > bAbsConsideration) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n };\r\n}\r\n\r\nfunction isDefined(x: T | undefined | null): boolean {\r\n return x !== undefined && x !== null;\r\n};\r\n\r\nexport function getDateSorter(selector: (x: T) => Date | null | undefined) {\r\n return getDefinedSorter(\r\n selector,\r\n (a, b) => a === b\r\n ? 0\r\n : a < b\r\n ? -1\r\n : 1\r\n );\r\n}\r\n\r\nexport function getReferenceSorter(selector: (x: T) => string) {\r\n const extractId = (reference: string) => {\r\n const splitReference = reference.split(\"-\");\r\n const idString = splitReference[splitReference.length - 1];\r\n const id = parseInt(idString, 10);\r\n return id;\r\n };\r\n\r\n return (a: T, b: T) => {\r\n const aValue = selector(a);\r\n const aId = extractId(aValue);\r\n\r\n const bValue = selector(b);\r\n const bId = extractId(bValue);\r\n\r\n if (aId < bId) {\r\n return -1;\r\n }\r\n if (aId > bId) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n };\r\n}\r\n\r\nexport function getNumberSorter(selector: (x: T) => number | null | undefined) {\r\n return getDefinedSorter(\r\n selector,\r\n (a, b) => a === b\r\n ? 0\r\n : a < b\r\n ? -1\r\n : 1\r\n );\r\n}\r\n\r\nfunction getDefinedSorter(\r\n selector: (x: TRecord) => TValue | null | undefined,\r\n sorter: (a: TValue, b: TValue) => -1 | 0 | 1\r\n) {\r\n return (a: TRecord, b: TRecord) => {\r\n const aValue = selector(a);\r\n const bValue = selector(b);\r\n\r\n if (!isDefined(aValue) && !isDefined(bValue)) {\r\n return 0;\r\n }\r\n if (isDefined(aValue) && !isDefined(bValue)) {\r\n return -1;\r\n }\r\n if (!isDefined(aValue) && isDefined(bValue)) {\r\n return 1;\r\n }\r\n\r\n return sorter(aValue!, bValue!);\r\n };\r\n}\r\n","import * as React from \"react\";\r\nimport { Table } from \"antd\";\r\nimport { WrappedComponentProps, injectIntl } from \"react-intl\";\r\nimport { Currency } from \"swan-public-api-client\";\r\nimport { PaginationConfig } from \"antd/lib/pagination\";\r\nimport { ColumnProps, TableLocale } from \"antd/lib/table\";\r\nimport { AppState } from \"../Store/RootReducer\";\r\nimport { considerationRenderer, priceWithCurrencyViaRecordRenderer, dateTimeRenderer, priceRenderer } from \"../Grid/Renderers\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { getConsiderationSorter, getReferenceSorter, getDateSorter, getNumberSorter } from \"../Grid/Sorters\";\r\nimport { FxConvertedTrade } from \"./FxConvertedTrade\";\r\n\r\ninterface PropsFromState {\r\n baseCurrency: Currency;\r\n currencies: Map;\r\n}\r\n\r\ninterface TradesGridProps {\r\n columns: Column[];\r\n bordered?: boolean;\r\n locale?: TableLocale;\r\n pagination?: PaginationConfig | false;\r\n title?: boolean | ((currentPageData: object[]) => React.ReactNode);\r\n}\r\n\r\nexport type Column = \"reference\" | \"bookingDate\" | \"quantity\" | \"marketName\" | \"bookingPrice\" | \"currentPrice\" | \"profitAndLoss\" | \"margin\" | \"baseCurrencyConsideration\" | \"deliveryCurrencyConsideration\";\r\n\r\nexport const DefaultColumns: Column[] = [\"reference\", \"bookingDate\", \"quantity\", \"marketName\", \"bookingPrice\", \"currentPrice\", \"profitAndLoss\", \"margin\"];\r\nexport const DefaultSpotFxColumns: Column[] = [\"reference\", \"baseCurrencyConsideration\", \"deliveryCurrencyConsideration\", \"bookingPrice\"];\r\n\r\ninterface Props extends WrappedComponentProps, TradesGridProps {\r\n trades: FxConvertedTrade[];\r\n}\r\n\r\nfunction TradeGridCmp(props: Props) {\r\n const { baseCurrency, currencies } = useSelector(state => ({\r\n baseCurrency: state.clientAccount.account!.Currency,\r\n currencies: new Map(\r\n state.activeTradingAccount.account!.Currencies.map(x => [parseInt(x.Key, 10), x])\r\n )\r\n }));\r\n\r\n const columns: Array> = props.columns.map(column => {\r\n switch (column) {\r\n case \"reference\":\r\n return {\r\n dataIndex: \"Reference\",\r\n title: props.intl.formatMessage({ id: \"tradeGrid.reference\" }),\r\n sorter: getReferenceSorter(x => x.Reference),\r\n sortDirections: [\"ascend\", \"descend\"],\r\n defaultSortOrder: \"ascend\"\r\n };\r\n case \"bookingDate\":\r\n return {\r\n dataIndex: \"BookingTime\",\r\n title: props.intl.formatMessage({ id: \"tradeGrid.bookingDate\" }),\r\n render: dateTimeRenderer(x => x.BookingTime),\r\n sorter: getDateSorter(x => x.BookingTime),\r\n sortDirections: [\"ascend\", \"descend\"],\r\n defaultSortOrder: \"ascend\"\r\n };\r\n case \"quantity\":\r\n return {\r\n dataIndex: \"Quantity\",\r\n title: props.intl.formatMessage({ id: \"tradeGrid.quantity\" }),\r\n render: priceWithCurrencyViaRecordRenderer(x => x.Quantity, x => x.CurrencyId, currencies),\r\n sorter: (a, b) => a.Quantity < b.Quantity ? -1 : 1,\r\n sortDirections: [\"ascend\", \"descend\"],\r\n align: \"right\"\r\n };\r\n case \"marketName\":\r\n return {\r\n dataIndex: \"MarketName\",\r\n title: props.intl.formatMessage({ id: \"tradeGrid.marketName\" }),\r\n sortDirections: [\"ascend\", \"descend\"]\r\n };\r\n case \"bookingPrice\":\r\n return {\r\n dataIndex: \"BookingPrice\",\r\n title: props.intl.formatMessage({ id: \"tradeGrid.bookingPrice\" }),\r\n render: priceWithCurrencyViaRecordRenderer(x => x.BookingPrice, _ => undefined, currencies),\r\n sorter: (a, b) => a.BookingPrice < b.BookingPrice ? -1 : 1,\r\n sortDirections: [\"ascend\", \"descend\"],\r\n align: \"right\"\r\n };\r\n case \"currentPrice\":\r\n return {\r\n dataIndex: \"CurrentPrice\",\r\n title: props.intl.formatMessage({ id: \"tradeGrid.currentPrice\" }),\r\n render: priceWithCurrencyViaRecordRenderer(x => x.CurrentPrice, _ => undefined, currencies),\r\n sorter: (a, b) => a.CurrentPrice < b.CurrentPrice ? -1 : 1,\r\n sortDirections: [\"ascend\", \"descend\"],\r\n align: \"right\"\r\n };\r\n case \"profitAndLoss\":\r\n return {\r\n dataIndex: \"BaseCurrencyOpenPnL\",\r\n title: props.intl.formatMessage({ id: \"tradeGrid.baseCurrencyProfitAndLoss\" }, { symbol: baseCurrency.Symbol }),\r\n render: priceRenderer(x => x.BaseCurrencyOpenPnL, baseCurrency),\r\n sorter: getNumberSorter(x => x.BaseCurrencyOpenPnL),\r\n sortDirections: [\"ascend\", \"descend\"],\r\n align: \"right\"\r\n };\r\n case \"margin\":\r\n return {\r\n dataIndex: \"BaseCurrencyMarginRequirement\",\r\n title: props.intl.formatMessage({ id: \"tradeGrid.baseCurrencyMargin\" }, { symbol: baseCurrency.Symbol }),\r\n render: priceRenderer(x => x.BaseCurrencyMarginRequirement, baseCurrency),\r\n sorter: getNumberSorter(x => x.BaseCurrencyMarginRequirement),\r\n sortDirections: [\"ascend\", \"descend\"],\r\n align: \"right\"\r\n };\r\n case \"baseCurrencyConsideration\":\r\n return {\r\n dataIndex: \"Consideration.BaseConsideration.Value\",\r\n title: props.intl.formatMessage({ id: \"tradeGrid.baseCurrencyConsideration\" }),\r\n render: considerationRenderer(\r\n x => x.Consideration.BaseConsideration,\r\n currencies\r\n ),\r\n sorter: getConsiderationSorter(x => x.Consideration.BaseConsideration),\r\n sortDirections: [\"ascend\", \"descend\"],\r\n align: \"right\"\r\n };\r\n case \"deliveryCurrencyConsideration\":\r\n return {\r\n dataIndex: \"Consideration.DeliveryConsideration.Value\",\r\n title: props.intl.formatMessage({ id: \"tradeGrid.deliveryCurrencyConsideration\" }),\r\n render: considerationRenderer(\r\n x => x.Consideration.DeliveryConsideration,\r\n currencies\r\n ),\r\n sorter: getConsiderationSorter(x => x.Consideration.DeliveryConsideration),\r\n sortDirections: [\"ascend\", \"descend\"],\r\n align: \"right\"\r\n };\r\n default:\r\n throw Error(`Unknown column \"${column}\"`);\r\n }\r\n });\r\n\r\n return (\r\n record.InstructionKey.Key}\r\n columns={columns}\r\n size=\"middle\"\r\n bordered={props.bordered}\r\n title={props.title === undefined || props.title === false\r\n ? undefined\r\n : props.title === true\r\n ? () => props.intl.formatMessage({ id: \"tradeGrid.title\" })\r\n : props.title}\r\n locale={props.locale}\r\n pagination={props.pagination}\r\n />\r\n );\r\n}\r\n\r\nexport const TradesGrid = injectIntl(TradeGridCmp);\r\n","import * as React from \"react\";\r\nimport { TradesGrid, DefaultSpotFxColumns } from \"./TradesGrid\";\r\nimport { AppState } from \"../Store/RootReducer\";\r\nimport { connect } from \"react-redux\";\r\nimport {\r\n Trade,\r\n Consideration,\r\n Currency,\r\n TradeSubType\r\n} from \"swan-public-api-client\";\r\nimport { Table } from \"antd\";\r\nimport { ColumnProps, PaginationConfig, TableLocale } from \"antd/lib/table\";\r\nimport { considerationRenderer, dateRenderer } from \"../Grid/Renderers\";\r\nimport { WrappedComponentProps, injectIntl } from \"react-intl\";\r\nimport { getDateSorter, getConsiderationSorter } from \"../Grid/Sorters\";\r\nimport { FxConvertedTrade } from \"./FxConvertedTrade\";\r\n\r\ninterface PropsFromState {\r\n currencies: Map;\r\n}\r\n\r\nexport interface TradesByMarketAndValueDateGridProps {\r\n marketKey: string;\r\n bordered?: boolean;\r\n pagination: PaginationConfig | false;\r\n title?: boolean | string | ((currentPageData: object[]) => React.ReactNode);\r\n locale?: TableLocale;\r\n}\r\n\r\ninterface Props\r\n extends PropsFromState,\r\n WrappedComponentProps,\r\n TradesByMarketAndValueDateGridProps {\r\n trades: FxConvertedTrade[];\r\n}\r\n\r\ninterface ValueDateSummary {\r\n valueDate: Date | undefined;\r\n consideration: Consideration;\r\n}\r\n\r\ninterface ByValueDateTrades {\r\n summary: ValueDateSummary;\r\n trades: FxConvertedTrade[];\r\n}\r\n\r\nclass TradesByMarketAndValueDateGridCmp extends React.PureComponent {\r\n public render() {\r\n const columns: Array> = [\r\n {\r\n dataIndex: \"summary.valueDate\",\r\n title: this.props.intl.formatMessage({\r\n id: \"tradesByMarketAndValueDateGrid.valueDate\"\r\n }),\r\n sorter: getDateSorter(x => x.summary.valueDate),\r\n sortDirections: [\"ascend\", \"descend\"],\r\n defaultSortOrder: \"ascend\",\r\n render: dateRenderer(x => x.summary.valueDate)\r\n },\r\n {\r\n dataIndex: \"summary.consideration.BaseConsideration.Value\",\r\n title: this.props.intl.formatMessage({\r\n id: \"tradesByMarketAndValueDateGrid.baseCurrencyConsideration\"\r\n }),\r\n render: considerationRenderer(\r\n x => x.summary.consideration.BaseConsideration,\r\n this.props.currencies\r\n ),\r\n align: \"right\",\r\n sorter: getConsiderationSorter(x => x.summary.consideration.BaseConsideration)\r\n },\r\n {\r\n dataIndex: \"summary.consideration.DeliveryConsideration.Value\",\r\n title: this.props.intl.formatMessage({\r\n id: \"tradesByMarketAndValueDateGrid.deliveryCurrencyConsideration\"\r\n }),\r\n render: considerationRenderer(\r\n x => x.summary.consideration.DeliveryConsideration,\r\n this.props.currencies\r\n ),\r\n align: \"right\",\r\n sorter: getConsiderationSorter(x => x.summary.consideration.DeliveryConsideration)\r\n }\r\n ];\r\n const tradesOnMarketByValueDate = this.getNonConversionTradesOnMarketByValueDate(\r\n this.props.trades\r\n );\r\n\r\n return (\r\n \r\n record.summary.valueDate\r\n ? record.summary.valueDate.getTime().toString()\r\n : \"undefined\"\r\n }\r\n columns={columns}\r\n expandedRowRender={this.expandedRowRender}\r\n size=\"middle\"\r\n bordered={this.props.bordered}\r\n pagination={this.props.pagination}\r\n title={this.getTitle()}\r\n locale={this.props.locale}\r\n />\r\n );\r\n }\r\n\r\n private getTitle() {\r\n if (this.props.title === undefined) {\r\n return undefined;\r\n }\r\n if (this.props.title === false) {\r\n return undefined;\r\n }\r\n if (this.props.title === true) {\r\n return () =>\r\n this.props.intl.formatMessage({\r\n id: \"tradesByMarketAndValueDateGrid.title\"\r\n });\r\n }\r\n if (typeof this.props.title === \"string\") {\r\n return () =>\r\n `${this.props.title} ${this.props.intl.formatMessage({\r\n id: \"tradesByMarketAndValueDateGrid.title\"\r\n })}`;\r\n }\r\n\r\n return () => this.props.title;\r\n }\r\n\r\n private filterTradesBySubTypeAndMarket(trades: FxConvertedTrade[]) {\r\n return trades.filter(\r\n x =>\r\n x.MarketKey === this.props.marketKey &&\r\n x.SubType !== TradeSubType.FxConversionOpen\r\n );\r\n }\r\n\r\n private groupTradesByValueDate(trades: FxConvertedTrade[]): ByValueDateTrades[] {\r\n const map = new Map<\r\n number | undefined,\r\n { valueDate: Date | undefined; trades: FxConvertedTrade[] }\r\n >();\r\n\r\n trades.forEach(x => {\r\n const valueDate = x.ValueDate\r\n ? new Date(\r\n x.ValueDate.getFullYear(),\r\n x.ValueDate.getMonth(),\r\n x.ValueDate.getDate()\r\n )\r\n : undefined;\r\n const key = valueDate !== undefined ? valueDate.getTime() : undefined;\r\n\r\n if (!map.has(key)) {\r\n map.set(key, {\r\n valueDate,\r\n trades: []\r\n });\r\n }\r\n\r\n const byValueDate = map.get(key);\r\n byValueDate!.trades.push(x);\r\n });\r\n\r\n return Array.from(map.entries()).map(x => ({\r\n summary: this.getSummary(x[1].valueDate, x[1].trades),\r\n trades: x[1].trades\r\n }));\r\n }\r\n\r\n private getNonConversionTradesOnMarketByValueDate(trades: FxConvertedTrade[]) {\r\n const tradesOnMarket = this.filterTradesBySubTypeAndMarket(trades);\r\n const tradesOnMarketByValueDate = this.groupTradesByValueDate(\r\n tradesOnMarket\r\n );\r\n\r\n return tradesOnMarketByValueDate;\r\n }\r\n\r\n private expandedRowRender = (byValueDateTrades: ByValueDateTrades) => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n private getSummary(\r\n valueDate: Date | undefined,\r\n trades: Trade[]\r\n ): ValueDateSummary {\r\n const consideration = trades\r\n .map(x => x.Consideration)\r\n .reduce((accumulator, value) => ({\r\n BaseConsideration:\r\n accumulator.BaseConsideration && value.BaseConsideration\r\n ? {\r\n Value:\r\n accumulator.BaseConsideration.Value +\r\n value.BaseConsideration.Value,\r\n CurrencyId: accumulator.BaseConsideration.CurrencyId\r\n }\r\n : undefined,\r\n DeliveryConsideration:\r\n accumulator.DeliveryConsideration && value.DeliveryConsideration\r\n ? {\r\n Value:\r\n accumulator.DeliveryConsideration.Value +\r\n value.DeliveryConsideration.Value,\r\n CurrencyId: accumulator.DeliveryConsideration.CurrencyId\r\n }\r\n : undefined\r\n }));\r\n\r\n return {\r\n valueDate,\r\n consideration\r\n };\r\n }\r\n}\r\n\r\nconst TradesByMarketAndValueDateGridCmpWithIntl = injectIntl(\r\n TradesByMarketAndValueDateGridCmp\r\n);\r\n\r\nconst mapStateToProps = (state: AppState): PropsFromState => {\r\n return {\r\n currencies: new Map(\r\n state.activeTradingAccount.account!.Currencies.map(x => [\r\n parseInt(x.Key, 10),\r\n x\r\n ])\r\n )\r\n };\r\n};\r\n\r\nexport const TradesByMarketAndValueDateGrid = connect(mapStateToProps)(\r\n TradesByMarketAndValueDateGridCmpWithIntl\r\n);\r\n","import * as React from \"react\";\r\nimport { StreamingOpenTrades } from \"./StreamingOpenTrades\";\r\nimport { AppState } from \"../Store/RootReducer\";\r\nimport { connect } from \"react-redux\";\r\nimport { WrappedComponentProps, injectIntl } from \"react-intl\";\r\nimport { TradesByMarketAndValueDateGrid, TradesByMarketAndValueDateGridProps } from \"./TradesByMarketAndValueDateGrid\";\r\nimport { FxRatesConsumer } from \"../Api/FxRates\";\r\n\r\ninterface PropsFromState {\r\n activeTradingAccountKey: string;\r\n}\r\n\r\ninterface Props extends PropsFromState, WrappedComponentProps, TradesByMarketAndValueDateGridProps { }\r\n\r\nclass ActiveTradingAccountStreamingOpenTradesByMarketAndValueDateGridCmp extends React.PureComponent {\r\n public render() {\r\n return (\r\n \r\n {fxRates => (\r\n \r\n {trades =>\r\n \r\n }\r\n \r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\nconst ActiveTradingAccountStreamingOpenTradesByMarketAndValueDateGridWithIntl = injectIntl(ActiveTradingAccountStreamingOpenTradesByMarketAndValueDateGridCmp);\r\n\r\nconst mapStateToProps = (state: AppState, ownProps: TradesByMarketAndValueDateGridProps): PropsFromState => {\r\n return {\r\n activeTradingAccountKey: state.activeTradingAccount.account!.Key,\r\n ...ownProps\r\n };\r\n};\r\n\r\nexport const ActiveTradingAccountStreamingOpenTradesByMarketAndValueDateGrid = connect(mapStateToProps)(ActiveTradingAccountStreamingOpenTradesByMarketAndValueDateGridWithIntl);\r\n","import * as React from \"react\";\r\nimport { Row, Col } from \"antd\";\r\nimport { ActiveTradingAccountStreamingOpenPositionsGrid } from \"./ActiveTradingAccountStreamingOpenPositionsGrid\";\r\nimport { ActiveTradingAccountStreamingOpenTradesByMarketAndValueDateGrid } from \"../Trades/ActiveTradingAccountStreamingOpenTradesByMarketAndValueDateGrid\";\r\nimport { TradesByMarketAndValueDateGrid } from \"../Trades/TradesByMarketAndValueDateGrid\";\r\nimport { Position } from \"swan-public-api-client\";\r\nimport { WrappedComponentProps, injectIntl } from \"react-intl\";\r\n\r\ninterface State {\r\n marketKey?: string;\r\n marketName?: string;\r\n}\r\n\r\nclass ActiveTradingAccountStreamingOpenPositionsWithTradesByMarketAndValueDateGridsCmp extends React.PureComponent<\r\n WrappedComponentProps,\r\n State\r\n> {\r\n constructor(props: WrappedComponentProps) {\r\n super(props);\r\n this.state = {\r\n marketKey: undefined,\r\n marketName: undefined\r\n };\r\n }\r\n\r\n public render() {\r\n const byMarket = this.state.marketKey ? (\r\n \r\n ) : (\r\n \r\n );\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n {byMarket}\r\n \r\n
\r\n );\r\n }\r\n\r\n private onPositionSelectionChange = (\r\n selectedRowKeys: string[] | number[],\r\n selectedRows: Position[]\r\n ) => {\r\n if (selectedRows.length === 0) {\r\n this.setState({\r\n marketKey: undefined,\r\n marketName: undefined\r\n });\r\n return;\r\n }\r\n\r\n const selectedPosition = selectedRows[0]; // Selection only allows 1 row\r\n this.setState({\r\n marketKey: selectedPosition.MarketKey,\r\n marketName: selectedPosition.MarketName\r\n });\r\n };\r\n}\r\n\r\nexport const ActiveTradingAccountStreamingOpenPositionsWithTradesByMarketAndValueDateGrids = injectIntl(\r\n ActiveTradingAccountStreamingOpenPositionsWithTradesByMarketAndValueDateGridsCmp\r\n);\r\n","import React from \"react\";\r\nimport { ProductType } from \"swan-public-api-client\";\r\nimport { FormattedMessage } from \"react-intl\";\r\n\r\ninterface Props {\r\n value: ProductType\r\n}\r\n\r\nexport class FormattedProductType extends React.PureComponent {\r\n public render() {\r\n switch (this.props.value) {\r\n case ProductType.SpreadBet:\r\n return ();\r\n case ProductType.CFD:\r\n return ();\r\n case ProductType.SpotFX:\r\n return ();\r\n default:\r\n throw new Error(`Unknown ProductType \"${this.props.value}\"`);\r\n }\r\n }\r\n}\r\n","import * as React from \"react\";\r\nimport { TradingAccountResources, StreamUpdate, SwanPublicClient, Currency } from \"swan-public-api-client\";\r\nimport { SubscriptionLifecycle } from \"../Push/SubscriptionLifecycle\";\r\nimport { AppState } from \"../Store/RootReducer\";\r\nimport { connect } from \"react-redux\";\r\n\r\ninterface PropsFromState {\r\n currencies: Map;\r\n}\r\n\r\ninterface OwnProps {\r\n groupKey: string;\r\n children: (currency?: Currency, tradingAccountResources?: TradingAccountResources) => JSX.Element;\r\n}\r\n\r\ninterface Props extends PropsFromState, OwnProps {}\r\n\r\ninterface State {\r\n tradingAccountResources?: TradingAccountResources;\r\n}\r\n\r\nclass StreamingTradingAccountResourcesCmp extends React.PureComponent {\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n tradingAccountResources: undefined\r\n };\r\n }\r\n\r\n public componentDidUpdate(prevProps: Props) {\r\n if (prevProps.groupKey !== this.props.groupKey) {\r\n const state: State = {\r\n tradingAccountResources: undefined\r\n };\r\n\r\n this.setState(state);\r\n }\r\n }\r\n\r\n public render() {\r\n const papiSubscribe = (client: SwanPublicClient, groupKey: string) => {\r\n return client.streamTradingAccountResources(groupKey, this.consumeUpdate, undefined);\r\n };\r\n return \r\n {() => {\r\n const currencyKey = this.state.tradingAccountResources?.CurrencyId.toString();\r\n const currency = currencyKey !== undefined ? this.props.currencies.get(currencyKey) : undefined;\r\n return this.props.children(currency, this.state.tradingAccountResources);\r\n }}\r\n \r\n }\r\n\r\n private consumeUpdate = (newData: Array>) => {\r\n const data = newData[0];\r\n this.setState({\r\n tradingAccountResources: data.update\r\n });\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: AppState, ownProps: OwnProps): PropsFromState => ({\r\n currencies: new Map(state.tradingAccounts.concat(state.linkedTradingAccounts).find(x => x.Key === ownProps.groupKey)!.Currencies.map(x => [x.Key, x]))\r\n});\r\n\r\nexport const StreamingTradingAccountResources = connect(mapStateToProps)(\r\n StreamingTradingAccountResourcesCmp\r\n);","import * as React from \"react\";\r\nimport { List, Icon, Descriptions, Button } from \"antd\";\r\nimport { FormattedProductType } from \"../Localisation/FormattedProductType\";\r\nimport { StreamingTradingAccountResources } from \"../TradingAccountResources/StreamingTradingAccountResources\";\r\nimport { WrappedComponentProps, injectIntl } from \"react-intl\";\r\nimport { TradingAccount } from \"swan-public-api-client\";\r\nimport { FormattedCurrency } from \"../Localisation/FormattedCurrency\";\r\n\r\ninterface Props extends WrappedComponentProps {\r\n tradingAccount: TradingAccount;\r\n onTradingAccountSelected: (tradingAccount: TradingAccount) => void;\r\n}\r\n\r\nclass AccountSelectorTradingAccountListItemCmp extends React.PureComponent {\r\n public render() {\r\n return (\r\n \r\n \r\n
{this.props.tradingAccount.AccountCode}
\r\n
\r\n
\r\n \r\n {(currency, tradingAccountResources) =>\r\n \r\n \r\n \r\n \r\n }\r\n \r\n
\r\n
\r\n this.props.onTradingAccountSelected(this.props.tradingAccount)}>\r\n {this.props.intl.formatMessage({ id: \"accountSelector.selectTradingAccountButton\" })}\r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport const AccountSelectorTradingAccountListItem = injectIntl(AccountSelectorTradingAccountListItemCmp);","import * as React from \"react\";\r\nimport { List } from \"antd\";\r\nimport { AccountSelectorTradingAccountListItem } from \"./AccountSelectorTradingAccountListItem\";\r\nimport { WrappedComponentProps, injectIntl } from \"react-intl\";\r\nimport { TradingAccount } from \"swan-public-api-client\";\r\n\r\ninterface Props extends WrappedComponentProps {\r\n tradingAccounts: TradingAccount[];\r\n onTradingAccountSelected: (tradingAccount: TradingAccount) => void;\r\n\r\n bordered?: boolean;\r\n}\r\n\r\nclass AccountSelectorTradingAccountListCmp extends React.PureComponent {\r\n public render() {\r\n return (\r\n (\r\n this.props.onTradingAccountSelected(tradingAccount)} />\r\n )}\r\n bordered={this.props.bordered}\r\n />\r\n )\r\n }\r\n}\r\n\r\nexport const AccountSelectorTradingAccountList = injectIntl(AccountSelectorTradingAccountListCmp);","import * as React from \"react\";\r\nimport { AccountResources, SwanPublicClient, StreamUpdate, Currency } from \"swan-public-api-client\";\r\nimport { SubscriptionLifecycle } from \"../Push/SubscriptionLifecycle\";\r\nimport { AppState } from \"../Store/RootReducer\";\r\nimport { connect } from \"react-redux\";\r\n\r\ninterface PropsFromState {\r\n groupKey: string;\r\n currency: Currency;\r\n}\r\n\r\ninterface Props extends PropsFromState {\r\n children: (currency: Currency, clientAccountResources?: AccountResources) => JSX.Element;\r\n}\r\n\r\ninterface State {\r\n clientAccountResources?: AccountResources;\r\n}\r\n\r\nclass StreamingClientAccountResourcesCmp extends React.PureComponent {\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n clientAccountResources: undefined\r\n };\r\n }\r\n\r\n public componentDidUpdate(prevProps: Props) {\r\n if (prevProps.groupKey !== this.props.groupKey) {\r\n const state: State = {\r\n clientAccountResources: undefined\r\n };\r\n\r\n this.setState(state);\r\n }\r\n }\r\n\r\n public render() {\r\n const papiSubscribe = (client: SwanPublicClient, groupKey: string) => {\r\n return client.streamClientAccountResources(groupKey, this.consumeUpdate, undefined);\r\n };\r\n return \r\n {() => {\r\n return this.props.children(this.props.currency, this.state.clientAccountResources);\r\n }}\r\n \r\n }\r\n\r\n private consumeUpdate = (newData: Array>) => {\r\n const data = newData[0];\r\n this.setState({\r\n clientAccountResources: data.update\r\n });\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: AppState): PropsFromState => {\r\n return {\r\n groupKey: state.clientAccount.account!.Key,\r\n currency: state.clientAccount.account!.Currency\r\n };\r\n};\r\n\r\nexport const StreamingClientAccountResources = connect(mapStateToProps)(StreamingClientAccountResourcesCmp);\r\n","import * as React from \"react\";\r\nimport { WrappedComponentProps, injectIntl } from \"react-intl\";\r\nimport { Icon, Descriptions } from \"antd\";\r\nimport { StreamingClientAccountResources } from \"../ClientAccountResources/StreamingClientAccountResources\";\r\nimport { FormattedCurrency } from \"../Localisation/FormattedCurrency\";\r\nimport { AccountResources } from \"swan-public-api-client\";\r\n\r\ninterface Props extends WrappedComponentProps {}\r\n\r\nclass AccountSelectorClientAccountDescriptionCmp extends React.PureComponent {\r\n public render() {\r\n return (\r\n
\r\n \r\n \r\n {(currency, clientAccountResources) =>\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 \r\n \r\n }\r\n \r\n
\r\n );\r\n }\r\n\r\n private calculateNetOpenPositionAvailable(clientAccountResources: AccountResources | undefined) {\r\n if (clientAccountResources === undefined) {\r\n return undefined;\r\n }\r\n\r\n if (clientAccountResources.NetOpenPositionLimit === undefined) {\r\n return undefined;\r\n }\r\n\r\n return clientAccountResources.NetOpenPositionLimit - clientAccountResources.NetOpenPosition;\r\n }\r\n}\r\n\r\nexport const AccountSelectorClientAccountDescription = injectIntl(AccountSelectorClientAccountDescriptionCmp);\r\n","import * as React from \"react\";\r\nimport { Account, TradingAccount } from \"swan-public-api-client\";\r\nimport { WrappedComponentProps, injectIntl } from \"react-intl\";\r\nimport { connect } from \"react-redux\";\r\nimport { AppState } from \"../Store/RootReducer\";\r\nimport { Card, Layout, Divider } from \"antd\";\r\nimport { saveActiveTradingAccount } from \"../Platform/State\";\r\nimport Title from \"antd/lib/typography/Title\";\r\nimport { AccountSelectorTradingAccountList } from \"./AccountSelectorTradingAccountList\";\r\nimport { AccountSelectorClientAccountDescription } from \"./AccountSelectorClientAccountDescription\";\r\nimport \"./AccountSelector.less\";\r\n\r\ninterface PropsFromState {\r\n clientAccount: Account;\r\n tradingAccounts: TradingAccount[];\r\n linkedTradingAccounts: TradingAccount[];\r\n}\r\n\r\ninterface PropsFromActions {\r\n setActiveTradingAccountAction: typeof saveActiveTradingAccount;\r\n}\r\n\r\ninterface Props extends WrappedComponentProps, PropsFromState, PropsFromActions {}\r\n\r\nclass AccountSelectorCmp extends React.PureComponent {\r\n public render() {\r\n const linkedTradingAccountsByClientAccount = this.getLinkedTradingAccountsByClientAccount();\r\n\r\n return (\r\n \r\n \r\n {this.props.intl.formatMessage({ id: \"accountSelector.title\" })}\r\n \r\n \r\n \r\n this.onTradingAccountSelected(tradingAccount)}\r\n bordered={false}\r\n />\r\n \r\n {linkedTradingAccountsByClientAccount.map(x => {\r\n return (\r\n \r\n this.onTradingAccountSelected(tradingAccount)}\r\n bordered={false}\r\n />\r\n \r\n );\r\n })}\r\n \r\n \r\n );\r\n }\r\n\r\n private onTradingAccountSelected(tradingAccount: TradingAccount) {\r\n this.props.setActiveTradingAccountAction(tradingAccount);\r\n }\r\n\r\n private getLinkedTradingAccountsByClientAccount() {\r\n const clientAccountsForLinkedTradingAccounts = new Set(this.props.linkedTradingAccounts.map(x => x.AccountKey));\r\n const linkedTradingAccountsByClientAccount = new Map(Array.from(clientAccountsForLinkedTradingAccounts).map(x => [x, []]));\r\n this.props.linkedTradingAccounts.forEach(x => {\r\n const byClientAccount = linkedTradingAccountsByClientAccount.get(x.AccountKey)!;\r\n byClientAccount.push(x);\r\n });\r\n\r\n return Array.from(linkedTradingAccountsByClientAccount.values());\r\n }\r\n}\r\n\r\nconst AccountSelectorWithIntl = injectIntl(AccountSelectorCmp);\r\n\r\nconst mapStateToProps = (state: AppState): PropsFromState => ({\r\n clientAccount: state.clientAccount.account!,\r\n tradingAccounts: state.tradingAccounts,\r\n linkedTradingAccounts: state.linkedTradingAccounts\r\n});\r\n\r\nconst mapDispatchToProps = (dispatch: any): PropsFromActions => ({\r\n setActiveTradingAccountAction: (tradingAccount: TradingAccount | undefined) => dispatch(saveActiveTradingAccount(tradingAccount))\r\n});\r\n\r\nexport const AccountSelector = connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(\r\n AccountSelectorWithIntl\r\n);\r\n","import * as React from \"react\";\r\nimport { TradingAccountResources as TradingAccountResourcesData, Currency } from \"swan-public-api-client\";\r\nimport { WrappedComponentProps, injectIntl } from \"react-intl\";\r\nimport { Typography, Card } from \"antd\";\r\nimport { FormattedCurrency } from \"../Localisation/FormattedCurrency\";\r\nimport \"./TradingAccountResources.less\";\r\n\r\nconst { Text } = Typography;\r\n\r\ninterface Props extends WrappedComponentProps {\r\n tradingAccountResources?: TradingAccountResourcesData;\r\n currency?: Currency,\r\n bordered?: boolean;\r\n className?: string;\r\n}\r\n\r\nclass TradingAccountResourcesCmp extends React.PureComponent {\r\n public render() {\r\n const cashBalanceLabel = this.props.intl.formatMessage({\r\n id: \"tradingAccountResources.cashBalance\"\r\n });\r\n const openPnLLabel = this.props.intl.formatMessage({\r\n id: \"tradingAccountResources.openPnL\"\r\n });\r\n const marginRequirementLabel = this.props.intl.formatMessage({\r\n id: \"tradingAccountResources.marginRequirement\"\r\n });\r\n const netOpenPositionsLabel = this.props.intl.formatMessage({\r\n id: \"tradingAccountResources.netOpenPositions\"\r\n });\r\n const netEquityLabel = this.props.intl.formatMessage({\r\n id: \"tradingAccountResources.netEquity\"\r\n });\r\n\r\n return (\r\n \r\n
\r\n
{cashBalanceLabel}
\r\n
{openPnLLabel}
\r\n
{marginRequirementLabel}
\r\n
{netEquityLabel}
\r\n
{netOpenPositionsLabel}
\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 const TradingAccountResources = injectIntl(TradingAccountResourcesCmp);\r\n","import * as React from \"react\";\r\nimport { AppState } from \"../Store/RootReducer\";\r\nimport { StreamingTradingAccountResources } from \"./StreamingTradingAccountResources\";\r\nimport { TradingAccountResources } from \"./TradingAccountResources\";\r\nimport { connect } from \"react-redux\";\r\n\r\ninterface PropsFromState {\r\n activeTradingAccountKey: string;\r\n}\r\n\r\ninterface Props extends PropsFromState {\r\n bordered?: boolean;\r\n className?: string;\r\n}\r\n\r\nclass ActiveTradingAccountStreamingResourcesCmp extends React.PureComponent {\r\n public render() {\r\n return (\r\n \r\n {(currency, tradingAccountResources) => }\r\n \r\n )\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: AppState): PropsFromState => ({\r\n activeTradingAccountKey: state.activeTradingAccount.account!.Key\r\n});\r\n\r\nexport const ActiveTradingAccountStreamingResources = connect(mapStateToProps)(ActiveTradingAccountStreamingResourcesCmp);\r\n","import { RangePickerValue } from \"antd/lib/date-picker/interface\";\r\nimport moment from \"moment\";\r\n\r\nexport function getRangePickerValue(first: Date | undefined, second: Date | undefined): RangePickerValue {\r\n const firstUndefined = first === undefined;\r\n const secondUndefined = second === undefined;\r\n\r\n if (!firstUndefined && !secondUndefined) {\r\n return [moment(first!), moment(second!)];\r\n }\r\n\r\n if (!firstUndefined && secondUndefined) {\r\n return [moment(first!)];\r\n }\r\n\r\n if (firstUndefined && !secondUndefined) {\r\n return [undefined, moment(second!)];\r\n }\r\n\r\n return [];\r\n}\r\n","import * as React from \"react\";\r\nimport { injectIntl, WrappedComponentProps } from \"react-intl\";\r\nimport { Form, DatePicker, Input, Select, Button, Tooltip } from \"antd\";\r\nimport { RangePickerValue } from \"antd/lib/date-picker/interface\";\r\nimport { TradingInstructionDirection, TradeSubType } from \"swan-public-api-client\";\r\nimport { SelectValue } from \"antd/lib/select\";\r\nimport { getRangePickerValue } from \"../../Input/DatePickerExtensions\";\r\nimport { ReactNode } from \"react\";\r\n\r\nexport interface SearchParameters {\r\n from: Date;\r\n to: Date;\r\n marketName?: string;\r\n direction?: TradingInstructionDirection;\r\n valueDateFrom?: Date;\r\n valueDateTo?: Date;\r\n tradeSubType?: TradeSubType;\r\n}\r\n\r\nexport interface SpotFxTradeHistorySearchFormValues {\r\n from?: Date;\r\n to?: Date;\r\n marketName?: string;\r\n direction?: TradingInstructionDirection;\r\n valueDateFrom?: Date;\r\n valueDateTo?: Date;\r\n tradeSubType?: TradeSubType;\r\n}\r\n\r\n// tslint:disable-next-line: no-empty-interface\r\ninterface State extends SpotFxTradeHistorySearchFormValues {}\r\n\r\ninterface Props extends WrappedComponentProps {\r\n values?: SpotFxTradeHistorySearchFormValues;\r\n onSearch: (searchParameters: SearchParameters) => void;\r\n extra?: string|ReactNode;\r\n}\r\n\r\nclass SpotFxTradeHistorySearchFormCmp extends React.Component {\r\n constructor(props: Props) {\r\n super(props);\r\n\r\n this.state = {\r\n ...props.values\r\n };\r\n }\r\n\r\n public render() {\r\n const canSearch = this.state.from !== undefined && this.state.to !== undefined;\r\n const searchButton = (\r\n this.onSearchClick()}\r\n >\r\n {this.props.intl.formatMessage({ id: \"tradeHistorySearchForm.search\" })}\r\n \r\n );\r\n\r\n return (\r\n
\r\n \r\n (x === null || x === undefined) || x.toDate() > new Date()}\r\n onChange={dates => this.onDateChange(dates)}\r\n value={getRangePickerValue(this.state.from, this.state.to)}\r\n />\r\n \r\n \r\n this.onMarketChange(event)}\r\n onPressEnter={() => this.onSearchClick()}\r\n value={this.state.marketName}\r\n />\r\n \r\n \r\n this.onDirectionChange(selectedValue)}\r\n value={this.state.direction}\r\n >\r\n {this.props.intl.formatMessage({ id: \"tradingInstructionDirection.buy\" })}\r\n {this.props.intl.formatMessage({ id: \"tradingInstructionDirection.sell\" })}\r\n \r\n \r\n \r\n this.onTradeSubTypeChange(selectedValue)}\r\n value={this.state.tradeSubType}\r\n >\r\n {this.props.intl.formatMessage({ id: \"tradeSubType.new\" })}\r\n {this.props.intl.formatMessage({ id: \"tradeSubType.roll\" })}\r\n {this.props.intl.formatMessage({ id: \"tradeSubType.fxConversionOpen\" })}\r\n \r\n \r\n \r\n this.onValueDateChange(dates)}\r\n value={getRangePickerValue(this.state.valueDateFrom, this.state.valueDateTo)}\r\n />\r\n \r\n \r\n {canSearch\r\n ? searchButton\r\n : (\r\n {searchButton}\r\n )\r\n }\r\n \r\n {\r\n this.props.extra\r\n ? {this.props.extra}\r\n : \"\"\r\n }\r\n
\r\n );\r\n }\r\n\r\n private onDateChange(dates: RangePickerValue) {\r\n const pickerFrom = dates[0];\r\n const from = pickerFrom?.toDate();\r\n\r\n if (dates.length === 1) {\r\n this.setState({\r\n ...this.state,\r\n from\r\n });\r\n return;\r\n }\r\n\r\n const pickerTo = dates[1];\r\n const to = pickerTo?.toDate();\r\n\r\n this.setState({\r\n ...this.state,\r\n from,\r\n to\r\n });\r\n }\r\n\r\n private onMarketChange(event: React.ChangeEvent) {\r\n const value = event.target.value;\r\n const marketName = value.length > 0\r\n ? value\r\n : undefined;\r\n\r\n this.setState({\r\n ...this.state,\r\n marketName\r\n });\r\n }\r\n\r\n private onDirectionChange(selectedValue: SelectValue) {\r\n const direction = selectedValue as TradingInstructionDirection | undefined;\r\n\r\n this.setState({\r\n ...this.state,\r\n direction\r\n });\r\n }\r\n\r\n private onTradeSubTypeChange(selectedValue: SelectValue) {\r\n const tradeSubType = selectedValue as TradeSubType | undefined;\r\n\r\n this.setState({\r\n ...this.state,\r\n tradeSubType\r\n });\r\n }\r\n\r\n private onValueDateChange(dates: RangePickerValue) {\r\n const pickerValueDateFrom = dates[0];\r\n const valueDateFrom = pickerValueDateFrom?.startOf(\"date\").toDate();\r\n\r\n if (dates.length === 1) {\r\n this.setState({\r\n ...this.state,\r\n valueDateFrom\r\n });\r\n return;\r\n }\r\n\r\n const pickerValueDateTo = dates[1];\r\n const valueDateTo = pickerValueDateTo?.endOf(\"date\").toDate();\r\n\r\n this.setState({\r\n ...this.state,\r\n valueDateFrom,\r\n valueDateTo\r\n });\r\n }\r\n\r\n private onSearchClick() {\r\n if (this.state.from !== undefined && this.state.to !== undefined) {\r\n const searchParameters: SearchParameters = {\r\n ...this.state,\r\n from: this.state.from,\r\n to: this.state.to\r\n };\r\n\r\n this.props.onSearch(searchParameters);\r\n }\r\n }\r\n}\r\n\r\nexport const SpotFxTradeHistorySearchForm = injectIntl(SpotFxTradeHistorySearchFormCmp);\r\n","import * as React from \"react\";\r\nimport { injectIntl, WrappedComponentProps } from \"react-intl\";\r\nimport { Table } from \"antd\";\r\nimport { Currency, FoundTrade } from \"swan-public-api-client\";\r\nimport { SpinProps } from \"antd/lib/spin\";\r\nimport { PaginationConfig, ColumnProps, TableLocale } from \"antd/lib/table\";\r\nimport {\r\n considerationRenderer,\r\n priceWithCurrencyViaRecordRenderer,\r\n dateTimeRenderer,\r\n dateRenderer,\r\n quantityDirectionRenderer,\r\n tradeSubTypeRenderer\r\n} from \"../../Grid/Renderers\";\r\nimport {\r\n getConsiderationSorter,\r\n getDateSorter,\r\n getReferenceSorter,\r\n} from \"../../Grid/Sorters\";\r\nimport { connect } from \"react-redux\";\r\nimport { AppState } from \"../../Store/RootReducer\";\r\nimport { tradeSubTypeToStringConverter } from \"../../Localisation/Converters\";\r\n\r\ninterface PropsFromState {\r\n currencies: Map;\r\n}\r\n\r\ninterface Props extends WrappedComponentProps, PropsFromState {\r\n loading?: boolean | SpinProps;\r\n bordered?: boolean;\r\n locale?: TableLocale;\r\n pagination?: PaginationConfig | false;\r\n trades: FoundTrade[];\r\n}\r\n\r\nclass SpotFxTradeHistoryGridCmp extends React.PureComponent {\r\n public render() {\r\n return (\r\n trade.InstructionKey.Key}\r\n locale={this.props.locale}\r\n columns={this.getColumns()}\r\n />\r\n );\r\n }\r\n\r\n private getColumns() {\r\n const columns: Array> = [\r\n {\r\n dataIndex: \"Reference\",\r\n title: this.props.intl.formatMessage({ id: \"tradeHistoryGrid.reference\" }),\r\n sorter: getReferenceSorter(x => x.Reference),\r\n sortDirections: [\"ascend\", \"descend\"],\r\n defaultSortOrder: \"ascend\"\r\n },\r\n {\r\n dataIndex: \"MarketName\",\r\n title: this.props.intl.formatMessage({ id: \"tradeHistoryGrid.marketName\" }),\r\n sorter: (a, b) => a.MarketName < b.MarketName ? -1 : 1,\r\n sortDirections: [\"ascend\", \"descend\"]\r\n },\r\n {\r\n dataIndex: \"SubType\",\r\n title: this.props.intl.formatMessage({ id: \"tradeHistoryGrid.subType\" }),\r\n sorter: (a, b) => {\r\n const aStr = tradeSubTypeToStringConverter(a.SubType, this.props.intl);\r\n const bStr = tradeSubTypeToStringConverter(b.SubType, this.props.intl);\r\n return aStr.localeCompare(bStr);\r\n },\r\n sortDirections: [\"ascend\", \"descend\"],\r\n render: tradeSubTypeRenderer(x => x.SubType, this.props.intl),\r\n },\r\n {\r\n dataIndex: \"OriginalQuantity\",\r\n title: this.props.intl.formatMessage({ id: \"tradeHistoryGrid.direction\" }),\r\n sorter: (a, b) => a.OriginalQuantity < b.OriginalQuantity ? -1 : 1,\r\n sortDirections: [\"ascend\", \"descend\"],\r\n render: quantityDirectionRenderer(x => x.OriginalQuantity, this.props.intl)\r\n },\r\n {\r\n dataIndex: \"Consideration.BaseConsideration.Value\",\r\n title: this.props.intl.formatMessage({ id: \"tradeHistoryGrid.baseCurrencyConsideration\" }),\r\n sorter: getConsiderationSorter(x => x.Consideration.BaseConsideration),\r\n sortDirections: [\"ascend\", \"descend\"],\r\n render: considerationRenderer(\r\n x => x.Consideration.BaseConsideration,\r\n this.props.currencies\r\n ),\r\n align: \"right\"\r\n },\r\n {\r\n dataIndex: \"Consideration.DeliveryConsideration.Value\",\r\n title: this.props.intl.formatMessage({ id: \"tradeHistoryGrid.deliveryCurrencyConsideration\" }),\r\n sorter: getConsiderationSorter(x => x.Consideration.DeliveryConsideration),\r\n sortDirections: [\"ascend\", \"descend\"],\r\n render: considerationRenderer(\r\n x => x.Consideration.DeliveryConsideration,\r\n this.props.currencies\r\n ),\r\n align: \"right\"\r\n },\r\n {\r\n dataIndex: \"BookingPrice\",\r\n title: this.props.intl.formatMessage({ id: \"tradeHistoryGrid.bookingPrice\" }),\r\n sorter: (a, b) => a.BookingPrice < b.BookingPrice ? -1 : 1,\r\n sortDirections: [\"ascend\", \"descend\"],\r\n render: priceWithCurrencyViaRecordRenderer(x => x.BookingPrice, _ => undefined, this.props.currencies),\r\n align: \"right\"\r\n },\r\n {\r\n dataIndex: \"BookingTime\",\r\n title: this.props.intl.formatMessage({ id: \"tradeHistoryGrid.bookingTime\" }),\r\n sorter: getDateSorter(x => x.BookingTime),\r\n sortDirections: [\"ascend\", \"descend\"],\r\n render: dateTimeRenderer(x => x.BookingTime)\r\n },\r\n {\r\n dataIndex: \"ValueDate\",\r\n title: this.props.intl.formatMessage({ id: \"tradeHistoryGrid.valueDate\" }),\r\n sorter: getDateSorter(x => x.ValueDate),\r\n sortDirections: [\"ascend\", \"descend\"],\r\n render: dateRenderer(x => x.ValueDate)\r\n }\r\n ];\r\n\r\n return columns;\r\n }\r\n}\r\n\r\nconst SpotFxTradeHistoryGridWithIntl = injectIntl(SpotFxTradeHistoryGridCmp);\r\n\r\nconst mapStateToProps = (state: AppState): PropsFromState => ({\r\n currencies: new Map(\r\n state.activeTradingAccount.account!.Currencies.map(x => [parseInt(x.Key, 10), x])\r\n )\r\n});\r\n\r\nexport const SpotFxTradeHistoryGrid = connect(mapStateToProps)(\r\n SpotFxTradeHistoryGridWithIntl\r\n);\r\n","import { PapiClientConsumer } from \"./PapiClient\";\r\nimport { SwanPublicClient } from \"swan-public-api-client\";\r\nimport React from \"react\";\r\n\r\nexport interface PapiClientProps {\r\n papiClient: SwanPublicClient;\r\n}\r\n\r\nexport function withPapi(\r\n WrappedComponent: React.ComponentType\r\n) {\r\n type TWithoutPapi = Pick>;\r\n\r\n return (props: TWithoutPapi) => {\r\n return (\r\n \r\n {state => {\r\n const outProps = { ...props, papiClient: state.client } as T;\r\n return ;\r\n }}\r\n \r\n );\r\n };\r\n}\r\n","import * as React from \"react\";\r\nimport { CSVLink } from \"react-csv\";\r\nimport {\r\n SpotFxTradeHistorySearchForm,\r\n SearchParameters,\r\n SpotFxTradeHistorySearchFormValues,\r\n} from \"./SpotFxTradeHistorySearchForm\";\r\nimport { SpotFxTradeHistoryGrid } from \"./SpotFxTradeHistoryGrid\";\r\nimport {\r\n ApiResponse,\r\n TradeSearchResponse,\r\n FoundTrade,\r\n} from \"swan-public-api-client\";\r\nimport { Spin, Icon, message, Button } from \"antd\";\r\nimport { WrappedComponentProps, injectIntl } from \"react-intl\";\r\nimport { withPapi, PapiClientProps } from \"../../Api/PapiHoc\";\r\nimport { quantityDirectionToStringConverter, tradeSubTypeToStringConverter } from \"../../Localisation/Converters\";\r\n\r\ninterface CsvRow {\r\n Reference: string;\r\n Market: string;\r\n SubType: string;\r\n Direction: string;\r\n BaseConsideration?: number;\r\n DeliveryConsideration?: number;\r\n BookingPrice: number;\r\n BookingDate: string;\r\n ValueDate?: string;\r\n}\r\n\r\ninterface ErrorResponse {\r\n Message: string;\r\n}\r\n\r\ninterface State {\r\n hasSearched: boolean;\r\n searching: boolean;\r\n searchResults: FoundTrade[];\r\n searchFormValues?: SpotFxTradeHistorySearchFormValues;\r\n}\r\n\r\ninterface Props extends WrappedComponentProps, PapiClientProps {\r\n tradingAccountKey: string;\r\n}\r\n\r\nclass SpotFxTradeHistoryCmp extends React.PureComponent {\r\n public constructor(props: Props) {\r\n super(props);\r\n\r\n this.state = {\r\n hasSearched: false,\r\n searching: false,\r\n searchResults: [],\r\n };\r\n }\r\n\r\n public render() {\r\n const {\r\n searchResults,\r\n searchFormValues,\r\n hasSearched,\r\n searching\r\n } = this.state;\r\n const {\r\n intl\r\n } = this.props;\r\n const enableDownloadButton = searchResults.length > 0;\r\n const downloadButton =\r\n \r\n {intl.formatMessage({ id: \"tradeHistory.downloadButton\" })}\r\n ;\r\n\r\n const tradeHistory = (\r\n <>\r\n this.onSearch(searchParameters)}\r\n values={searchFormValues}\r\n extra={\r\n enableDownloadButton\r\n ?\r\n \r\n {downloadButton}\r\n \r\n : downloadButton\r\n }\r\n />\r\n \r\n \r\n );\r\n\r\n return searching ? (\r\n }\r\n tip={intl.formatMessage({ id: \"tradeHistory.searching\" })}\r\n delay={100}\r\n >\r\n {tradeHistory}\r\n \r\n ) : (\r\n
{tradeHistory}
\r\n );\r\n }\r\n\r\n private async onSearch(searchParameters: SearchParameters) {\r\n this.setState({\r\n hasSearched: true,\r\n searching: true,\r\n searchFormValues: {\r\n ...searchParameters,\r\n },\r\n });\r\n let searchResults: ApiResponse;\r\n try {\r\n searchResults = await this.props.papiClient.searchTrades(\r\n this.props.tradingAccountKey,\r\n searchParameters.from,\r\n searchParameters.to,\r\n searchParameters.marketName,\r\n searchParameters.direction,\r\n searchParameters.valueDateFrom,\r\n searchParameters.valueDateTo,\r\n searchParameters.tradeSubType\r\n );\r\n } catch (error) {\r\n this.setState({\r\n searching: false,\r\n searchResults: [],\r\n });\r\n\r\n if (error instanceof Error && error.message !== undefined) {\r\n const errorResponse: ErrorResponse = JSON.parse(error.message);\r\n const errorMessage = errorResponse.Message;\r\n message.error(errorMessage);\r\n return;\r\n } else {\r\n // We don't know what this error type is, so we don't know how to handle it\r\n throw error;\r\n }\r\n }\r\n\r\n this.setState({\r\n searching: false,\r\n searchResults: searchResults.Content.Trades,\r\n });\r\n }\r\n\r\n private convertResultsToCsvData(): CsvRow[] {\r\n const { intl } = this.props;\r\n\r\n return this.state.searchResults.map(x => {\r\n return {\r\n Reference: x.Reference,\r\n Market: x.MarketName,\r\n SubType: tradeSubTypeToStringConverter(x.SubType, intl),\r\n Direction: quantityDirectionToStringConverter(x.OriginalQuantity, intl),\r\n BaseConsideration: x.Consideration?.BaseConsideration?.Value,\r\n DeliveryConsideration: x.Consideration?.DeliveryConsideration?.Value,\r\n BookingPrice: x.BookingPrice,\r\n BookingDate: `${intl.formatDate(x.BookingTime)} ${intl.formatTime(x.BookingTime)}`,\r\n ValueDate: intl.formatDate(x.ValueDate)\r\n }\r\n });\r\n }\r\n}\r\n\r\nconst SpotFxTradeHistoryWithIntl = injectIntl(SpotFxTradeHistoryCmp);\r\n\r\nexport const SpotFxTradeHistory = withPapi(SpotFxTradeHistoryWithIntl);\r\n","import * as React from \"react\";\r\nimport { SpotFxTradeHistory } from \"./SpotFxTradeHistory\";\r\nimport { connect } from \"react-redux\";\r\nimport { AppState } from \"../../Store/RootReducer\";\r\n\r\ninterface PropsFromState {\r\n activeTradingAccountKey: string;\r\n}\r\n\r\nclass SpotFxActiveTradingAccountTradeHistoryCmp extends React.PureComponent {\r\n public render() {\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: AppState): PropsFromState => {\r\n return {\r\n activeTradingAccountKey: state.activeTradingAccount.account!.Key\r\n };\r\n};\r\n\r\nexport const SpotFxActiveTradingAccountTradeHistory = connect(mapStateToProps)(SpotFxActiveTradingAccountTradeHistoryCmp);\r\n","import React from \"react\";\r\nimport { StatementPeriod } from \"swan-public-api-client\";\r\nimport { FormattedMessage } from \"react-intl\";\r\n\r\ninterface Props {\r\n value: StatementPeriod\r\n}\r\n\r\nexport function FormattedStatementPeriod(props: Props) {\r\n switch (props.value) {\r\n case StatementPeriod.Daily:\r\n return ();\r\n case StatementPeriod.Monthly:\r\n return ();\r\n default:\r\n throw new Error(`Unknown StatementPeriod \"${props.value}\"`);\r\n }\r\n}\r\n","import * as React from \"react\";\r\nimport download from \"downloadjs\";\r\nimport { injectIntl, FormattedDate, FormattedNumber, WrappedComponentProps } from \"react-intl\";\r\nimport { List, Descriptions, Button } from \"antd\";\r\nimport { Statement } from \"swan-public-api-client\";\r\nimport { withPapi, PapiClientProps } from \"../Api/PapiHoc\";\r\nimport { FormattedStatementPeriod } from \"../Localisation/FormattedStatementPeriod\";\r\nimport { ListLocale } from \"antd/lib/list\";\r\n\r\ninterface Props extends WrappedComponentProps, PapiClientProps {\r\n tradingAccountKey: string;\r\n statements: Statement[];\r\n bordered?: boolean;\r\n locale?: ListLocale;\r\n}\r\n\r\nfunction StatementsListCmp(props: Props) {\r\n const onDownloadClick = async (statement: Statement) => {\r\n const blob = await props.papiClient.getStatement(\r\n props.tradingAccountKey,\r\n statement.Key\r\n );\r\n\r\n download(blob, statement.FileName);\r\n };\r\n\r\n return (\r\n (\r\n \r\n \r\n \r\n \r\n {statement.FileName}\r\n \r\n \r\n onDownloadClick(statement)}\r\n >\r\n {props.intl.formatMessage({ id: \"statementsList.download\" })}\r\n \r\n \r\n )}\r\n bordered={props.bordered}\r\n />\r\n );\r\n}\r\n\r\nexport const StatementsListWithIntl = injectIntl(StatementsListCmp);\r\n\r\nexport const StatementsList = withPapi(StatementsListWithIntl);\r\n","import * as React from \"react\";\r\nimport { useState } from \"react\";\r\nimport { WrappedComponentProps, injectIntl } from \"react-intl\";\r\nimport { Form, DatePicker, Select, Button, Tooltip } from \"antd\";\r\nimport { getRangePickerValue } from \"../Input/DatePickerExtensions\";\r\nimport { StatementPeriod } from \"swan-public-api-client\";\r\nimport { SelectValue } from \"antd/lib/select\";\r\nimport { RangePickerValue } from \"antd/lib/date-picker/interface\";\r\n\r\nexport interface SearchParameters {\r\n from: Date;\r\n to: Date;\r\n period: StatementPeriod;\r\n}\r\n\r\ninterface Props extends WrappedComponentProps {\r\n onSearch: (searchParameters: SearchParameters) => void;\r\n\r\n from?: Date;\r\n onFromChange?: (from: Date | undefined) => void;\r\n\r\n to?: Date;\r\n onToChange?: (to: Date | undefined) => void;\r\n\r\n period?: StatementPeriod;\r\n onPeriodChange?: (period: StatementPeriod | undefined) => void;\r\n}\r\n\r\nfunction StatementsSearchFormCmp(props: Props) {\r\n const [from, setFrom] = useState(props.from);\r\n const [to, setTo] = useState(props.to);\r\n const [period, setPeriod] = useState(props.period);\r\n\r\n const onDateChange = (dates: RangePickerValue) => {\r\n const pickerFrom = dates[0];\r\n const selectedFrom = pickerFrom?.startOf(\"date\").toDate();\r\n setFrom(selectedFrom);\r\n if (props.onFromChange !== undefined) {\r\n props.onFromChange(selectedFrom);\r\n }\r\n\r\n const pickerTo = dates[1];\r\n const selectedTo = pickerTo?.endOf(\"date\").toDate();\r\n setTo(selectedTo);\r\n if (props.onToChange !== undefined) {\r\n props.onToChange(selectedTo);\r\n }\r\n };\r\n\r\n const onPeriodChange = (selectedPeriod: StatementPeriod | undefined) => {\r\n setPeriod(selectedPeriod);\r\n if (props.onPeriodChange !== undefined) {\r\n props.onPeriodChange(selectedPeriod);\r\n }\r\n }\r\n\r\n const onSearchClick = () => {\r\n props.onSearch({\r\n from: from!,\r\n to: to!,\r\n period: period!\r\n });\r\n }\r\n\r\n const canSearch = from !== undefined && to !== undefined && period !== undefined;\r\n const searchButton = (\r\n onSearchClick()}\r\n >\r\n {props.intl.formatMessage({ id: \"statementsSearchFrom.search\" })}\r\n \r\n );\r\n\r\n return (\r\n
\r\n \r\n (x === null || x === undefined) || x.toDate() > new Date()}\r\n onChange={dates => onDateChange(dates)}\r\n value={getRangePickerValue(from, to)}\r\n />\r\n \r\n \r\n onPeriodChange(selectedValue as StatementPeriod | undefined)}\r\n value={period}\r\n >\r\n {props.intl.formatMessage({ id: \"statementPeriod.daily\" })}\r\n {props.intl.formatMessage({ id: \"statementPeriod.monthly\" })}\r\n \r\n \r\n \r\n {canSearch\r\n ? searchButton\r\n : {searchButton}\r\n }\r\n \r\n
\r\n );\r\n}\r\n\r\nexport const StatementsSearchForm = injectIntl(StatementsSearchFormCmp);\r\n","import * as React from \"react\";\r\nimport { useState } from \"react\";\r\nimport { Spin, Icon } from \"antd\";\r\nimport \"./Statements.less\";\r\nimport { WrappedComponentProps, injectIntl } from \"react-intl\";\r\nimport { PapiClientProps, withPapi } from \"../Api/PapiHoc\";\r\nimport { StatementPeriod, Statement } from \"swan-public-api-client\";\r\nimport { StatementsList } from \"./StatementsList\";\r\nimport { StatementsSearchForm, SearchParameters } from \"./StatementsSearchForm\";\r\n\r\ninterface Props extends WrappedComponentProps, PapiClientProps {\r\n tradingAccountKey: string;\r\n}\r\n\r\nfunction StatementsCmp(props: Props) {\r\n const [from, setFrom] = useState(undefined as Date | undefined);\r\n const [to, setTo] = useState(undefined as Date | undefined);\r\n const [period, setPeriod] = useState(undefined as StatementPeriod | undefined);\r\n const [hasSearched, setHasSearched] = useState(false);\r\n const [searching, setSearching] = useState(false);\r\n const [statements, setStatements] = useState([] as Statement[]);\r\n\r\n const onSearch = async (searchParameters: SearchParameters) => {\r\n try {\r\n setSearching(true);\r\n setHasSearched(true);\r\n\r\n const fetchedStatements = await props.papiClient.getStatements(\r\n props.tradingAccountKey,\r\n searchParameters.from,\r\n searchParameters.to,\r\n searchParameters.period\r\n );\r\n setStatements(fetchedStatements.map(x => x.Content));\r\n } finally {\r\n setSearching(false);\r\n }\r\n };\r\n\r\n const formAndList = (\r\n <>\r\n \r\n \r\n \r\n );\r\n\r\n return (\r\n
\r\n {searching\r\n ? (\r\n )}\r\n tip={props.intl.formatMessage({ id: \"statements.searching\" })}\r\n delay={100}\r\n >\r\n {formAndList}\r\n \r\n )\r\n : formAndList\r\n }\r\n
\r\n );\r\n}\r\n\r\nconst StatementsWithIntl = injectIntl(StatementsCmp);\r\n\r\nexport const Statements = withPapi(StatementsWithIntl);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { AppState } from \"../Store/RootReducer\";\r\nimport { Statements } from \"./Statements\";\r\n\r\ninterface PropsFromState {\r\n activeTradingAccountKey: string;\r\n}\r\n\r\nfunction ActiveTradingAccountStatementsCmp(props: PropsFromState) {\r\n return (\r\n \r\n );\r\n}\r\n\r\nconst mapStateToProps = (state: AppState): PropsFromState => {\r\n return {\r\n activeTradingAccountKey: state.activeTradingAccount.account!.Key\r\n };\r\n};\r\n\r\nexport const ActiveTradingAccountStatements = connect(mapStateToProps)(ActiveTradingAccountStatementsCmp);\r\n","import * as React from \"react\";\r\nimport { ProductType } from \"swan-public-api-client\";\r\nimport { WrappedComponentProps, injectIntl } from \"react-intl\";\r\nimport { StreamingOpenTrades } from \"./StreamingOpenTrades\";\r\nimport { TradesGrid, Column, DefaultSpotFxColumns, DefaultColumns } from \"./TradesGrid\";\r\nimport { PaginationConfig } from \"antd/lib/table\";\r\nimport { AppState } from \"../Store/RootReducer\";\r\nimport { connect } from \"react-redux\";\r\nimport { FxRatesConsumer } from \"../Api/FxRates\";\r\n\r\ninterface PropsFromState {\r\n activeTradingAccountKey: string;\r\n activeTradingAccountType: ProductType;\r\n}\r\n\r\ninterface TradeGridProps {\r\n columns?: Column[];\r\n bordered?: boolean;\r\n pagination?: PaginationConfig | false;\r\n title?: boolean | ((currentPageData: object[]) => React.ReactNode);\r\n}\r\n\r\ninterface Props extends PropsFromState, WrappedComponentProps, TradeGridProps {}\r\n\r\nfunction getColumns(props: Props): Column[] {\r\n if (props.columns !== undefined) {\r\n return props.columns;\r\n }\r\n\r\n switch (props.activeTradingAccountType) {\r\n case ProductType.SpotFX:\r\n return DefaultSpotFxColumns;\r\n default:\r\n return DefaultColumns;\r\n }\r\n}\r\n\r\nfunction ActiveTradingAccountStreamingOpenTradesGridCmp(props: Props) {\r\n return (\r\n \r\n {fxRates => (\r\n \r\n {trades =>\r\n \r\n }\r\n \r\n )}\r\n \r\n );\r\n}\r\n\r\nconst ActiveTradingAccountStreamingOpenTradesGridWithIntl = injectIntl(ActiveTradingAccountStreamingOpenTradesGridCmp);\r\n\r\nconst mapStateToProps = (state: AppState, ownProps: TradeGridProps): PropsFromState => {\r\n return {\r\n activeTradingAccountKey: state.activeTradingAccount.account!.Key,\r\n activeTradingAccountType: state.activeTradingAccount.account!.AccountType\r\n }\r\n};\r\n\r\nexport const ActiveTradingAccountStreamingOpenTradesGrid = connect(mapStateToProps)(ActiveTradingAccountStreamingOpenTradesGridWithIntl);\r\n","import * as React from \"react\";\r\nimport { WrappedComponentProps, injectIntl } from \"react-intl\";\r\nimport { useState, ReactNode } from \"react\";\r\nimport { Form, DatePicker, Button, Tooltip } from \"antd\";\r\nimport { getRangePickerValue } from \"../Input/DatePickerExtensions\";\r\nimport { RangePickerValue } from \"antd/lib/date-picker/interface\";\r\n\r\nexport interface SearchParameters {\r\n from: Date;\r\n to: Date;\r\n}\r\n\r\ninterface Props extends WrappedComponentProps {\r\n onSearch: (searchParameters: SearchParameters) => void;\r\n\r\n from?: Date;\r\n onFromChange?: (from: Date | undefined) => void;\r\n\r\n to?: Date;\r\n onToChange?: (to: Date | undefined) => void;\r\n\r\n extra?: string|ReactNode;\r\n}\r\n\r\nfunction TradeHistorySearchFormCmp(props: Props) {\r\n const [from, setFrom] = useState(props.from);\r\n const [to, setTo] = useState(props.to);\r\n\r\n const onDateChange = (dates: RangePickerValue) => {\r\n const pickerFrom = dates[0];\r\n const selectedFrom = pickerFrom?.startOf(\"date\").toDate();\r\n setFrom(selectedFrom);\r\n if (props.onFromChange !== undefined) {\r\n props.onFromChange(selectedFrom);\r\n }\r\n\r\n const pickerTo = dates[1];\r\n const selectedTo = pickerTo?.endOf(\"date\").toDate();\r\n setTo(selectedTo);\r\n if (props.onToChange !== undefined) {\r\n props.onToChange(selectedTo);\r\n }\r\n };\r\n\r\n const onSearchClick = () => {\r\n props.onSearch({\r\n from: from!,\r\n to: to!\r\n });\r\n }\r\n\r\n const canSearch = from !== undefined && to !== undefined;\r\n const searchButton = (\r\n onSearchClick()}\r\n >\r\n {props.intl.formatMessage({ id: \"tradeHistorySearchForm.search\" })}\r\n \r\n );\r\n\r\n return (\r\n
\r\n \r\n (x === null || x === undefined) || x.toDate() > new Date()}\r\n onChange={dates => onDateChange(dates)}\r\n value={getRangePickerValue(from, to)}\r\n />\r\n \r\n \r\n {canSearch\r\n ? searchButton\r\n : {searchButton}\r\n }\r\n \r\n {\r\n props.extra\r\n ? {props.extra}\r\n : \"\"\r\n }\r\n
\r\n );\r\n}\r\n\r\nexport const TradeHistorySearchForm = injectIntl(TradeHistorySearchFormCmp);\r\n","import * as React from \"react\";\r\nimport { injectIntl, WrappedComponentProps } from \"react-intl\";\r\nimport { Table } from \"antd\";\r\nimport { Currency } from \"swan-public-api-client\";\r\nimport { PaginationConfig, TableLocale, ColumnProps } from \"antd/lib/table\";\r\nimport { SpinProps } from \"antd/lib/spin\";\r\nimport { getReferenceSorter, getConsiderationSorter, getDateSorter, getNumberSorter } from \"../Grid/Sorters\";\r\nimport { considerationRenderer, currencyNameRenderer, dateTimeRenderer, priceWithCurrencyViaRecordRenderer, currencyViaRecordRenderer } from \"../Grid/Renderers\";\r\nimport { TradeHistoryGridRow } from \"./TradeHistoryGridRow\";\r\nimport { openingOrClosingToStringConverter } from \"../Localisation/Converters\";\r\n\r\ninterface Props extends WrappedComponentProps {\r\n loading?: boolean | SpinProps;\r\n bordered?: boolean;\r\n locale?: TableLocale;\r\n pagination?: PaginationConfig | false;\r\n history: TradeHistoryGridRow[];\r\n baseCurrency: Currency;\r\n currencies: Map;\r\n}\r\n\r\nfunction TradeHistoryGridCmp(props: Props) {\r\n const columns: Array> = [\r\n {\r\n dataIndex: \"Reference\",\r\n title: props.intl.formatMessage({ id: \"tradeHistoryGrid.reference\" }),\r\n sorter: getReferenceSorter(x => x.Reference),\r\n sortDirections: [\"ascend\", \"descend\"],\r\n defaultSortOrder: \"ascend\"\r\n },\r\n {\r\n dataIndex: \"MarketName\",\r\n title: props.intl.formatMessage({ id: \"tradeHistoryGrid.marketName\" }),\r\n sorter: (a, b) => a.MarketName < b.MarketName ? -1 : 1,\r\n sortDirections: [\"ascend\", \"descend\"]\r\n },\r\n {\r\n dataIndex: \"OpeningOrClosing\",\r\n title: props.intl.formatMessage({ id: \"tradeHistoryGrid.openingOrClosing\" }),\r\n render: (value, record) => {\r\n return openingOrClosingToStringConverter(record.OpeningOrClosing, props.intl);\r\n },\r\n sortDirections: [\"ascend\", \"descend\"]\r\n },\r\n {\r\n dataIndex: \"OriginalQuantity\",\r\n title: props.intl.formatMessage({ id: \"tradeHistoryGrid.quantity\" }),\r\n sorter: (a, b) => a.OriginalQuantity < b.OriginalQuantity ? -1 : 1,\r\n sortDirections: [\"ascend\", \"descend\"]\r\n },\r\n {\r\n dataIndex: \"CurrencyId\",\r\n title: props.intl.formatMessage({ id: \"tradeHistoryGrid.currency\" }),\r\n render: currencyNameRenderer(x => x.CurrencyId, props.currencies, props.intl),\r\n sortDirections: [\"ascend\", \"descend\"]\r\n },\r\n {\r\n dataIndex: \"BookingTime\",\r\n title: props.intl.formatMessage({ id: \"tradeHistoryGrid.bookingTime\" }),\r\n sorter: getDateSorter(x => x.BookingTime),\r\n sortDirections: [\"ascend\", \"descend\"],\r\n render: dateTimeRenderer(x => x.BookingTime)\r\n },\r\n {\r\n dataIndex: \"BookingPrice\",\r\n title: props.intl.formatMessage({ id: \"tradeHistoryGrid.bookingPrice\" }),\r\n sorter: (a, b) => a.BookingPrice < b.BookingPrice ? -1 : 1,\r\n sortDirections: [\"ascend\", \"descend\"],\r\n render: priceWithCurrencyViaRecordRenderer(x => x.BookingPrice, _ => undefined, props.currencies),\r\n align: \"right\"\r\n },\r\n {\r\n dataIndex: \"Pnl\",\r\n title: props.intl.formatMessage({ id: \"tradeHistoryGrid.profitAndLoss\" }),\r\n sorter: getNumberSorter(x => x.Pnl),\r\n sortDirections: [\"ascend\", \"descend\"],\r\n render: currencyViaRecordRenderer(x => x.Pnl, x => x.PnlCurrencyId, props.currencies),\r\n align: \"right\"\r\n },\r\n {\r\n dataIndex: \"Consideration.BaseConsideration.Value\",\r\n title: props.intl.formatMessage({ id: \"tradeHistoryGrid.baseCurrencyConsideration\" }),\r\n sorter: getConsiderationSorter(x => x.Consideration.BaseConsideration),\r\n sortDirections: [\"ascend\", \"descend\"],\r\n render: considerationRenderer(\r\n x => x.Consideration.BaseConsideration,\r\n props.currencies\r\n ),\r\n align: \"right\"\r\n },\r\n {\r\n dataIndex: \"Consideration.DeliveryConsideration.Value\",\r\n title: props.intl.formatMessage({ id: \"tradeHistoryGrid.deliveryCurrencyConsideration\" }),\r\n sorter: getConsiderationSorter(x => x.Consideration.DeliveryConsideration),\r\n sortDirections: [\"ascend\", \"descend\"],\r\n render: considerationRenderer(\r\n x => x.Consideration.DeliveryConsideration,\r\n props.currencies\r\n ),\r\n align: \"right\"\r\n }\r\n ];\r\n\r\n return (\r\n row.InstructionKey.Key}\r\n locale={props.locale}\r\n columns={columns}\r\n />\r\n );\r\n}\r\n\r\nexport const TradeHistoryGrid = injectIntl(TradeHistoryGridCmp);\r\n","import * as React from \"react\";\r\nimport { useState } from \"react\";\r\nimport { WrappedComponentProps, injectIntl, IntlShape } from \"react-intl\";\r\nimport { PapiClientProps, withPapi } from \"../Api/PapiHoc\";\r\nimport { TradeHistorySearchForm, SearchParameters } from \"./TradeHistorySearchForm\";\r\nimport { TradeHistoryGrid } from \"./TradeHistoryGrid\";\r\nimport { Spin, Icon, Button } from \"antd\";\r\nimport { Currency } from \"swan-public-api-client\";\r\nimport { convertToTradeHistoryGridRows, TradeHistoryGridRow } from \"./TradeHistoryGridRow\";\r\nimport { CSVLink } from \"react-csv\";\r\nimport { openingOrClosingToStringConverter, currencyToStringConverter } from \"../Localisation/Converters\";\r\n\r\ninterface CsvRow {\r\n Reference: string;\r\n Market: string;\r\n OpeningOrClosing: string;\r\n Quantity: number;\r\n Currency: string;\r\n BookingDate: string;\r\n BookingPrice: number;\r\n ProfitAndLoss?: number;\r\n BaseConsideration?: number;\r\n DeliveryConsideration?: number;\r\n}\r\n\r\ninterface Props extends WrappedComponentProps, PapiClientProps {\r\n tradingAccountKey: string;\r\n baseCurrency: Currency;\r\n currencies: Map;\r\n}\r\n\r\nfunction TradeHistoryCmp(props: Props) {\r\n const [from, setFrom] = useState(undefined as Date | undefined);\r\n const [to, setTo] = useState(undefined as Date | undefined);\r\n const [hasSearched, setHasSearched] = useState(false);\r\n const [searching, setSearching] = useState(false);\r\n const [history, setHistory] = useState([] as TradeHistoryGridRow[]);\r\n\r\n const onSearch = async (searchParameters: SearchParameters) => {\r\n try {\r\n setSearching(true);\r\n setHasSearched(true);\r\n\r\n const searchResults = await props.papiClient.getTradeHistory(\r\n props.tradingAccountKey,\r\n searchParameters.from,\r\n searchParameters.to\r\n );\r\n const value = convertToTradeHistoryGridRows(searchResults.Content, parseInt(props.baseCurrency.Key, 10));\r\n setHistory(value);\r\n } finally {\r\n setSearching(false);\r\n }\r\n };\r\n\r\n const enableDownloadButton = history.length > 0;\r\n const downloadButton =\r\n \r\n {props.intl.formatMessage({ id: \"tradeHistory.downloadButton\" })}\r\n ;\r\n\r\n const tradeHistory = (\r\n <>\r\n \r\n {downloadButton}\r\n \r\n : downloadButton\r\n }\r\n />\r\n \r\n \r\n );\r\n\r\n return (\r\n
\r\n {searching\r\n ? (\r\n )}\r\n tip={props.intl.formatMessage({ id: \"tradeHistory.searching\" })}\r\n delay={100}\r\n >\r\n {tradeHistory}\r\n \r\n )\r\n : tradeHistory\r\n }\r\n
\r\n );\r\n}\r\n\r\nfunction convertResultsToCsvData(\r\n searchResults: TradeHistoryGridRow[],\r\n currencies: Map,\r\n intl: IntlShape\r\n): CsvRow[] {\r\n return searchResults.map(x => {\r\n return {\r\n Reference: x.Reference,\r\n Market: x.MarketName,\r\n OpeningOrClosing: openingOrClosingToStringConverter(x.OpeningOrClosing, intl),\r\n Quantity: x.OriginalQuantity,\r\n Currency: currencyToStringConverter(currencies.get(x.CurrencyId), intl),\r\n BookingDate: `${intl.formatDate(x.BookingTime)} ${intl.formatTime(x.BookingTime)}`,\r\n BookingPrice: x.BookingPrice,\r\n ProfitAndLoss: x.Pnl,\r\n BaseConsideration: x.Consideration?.BaseConsideration?.Value,\r\n DeliveryConsideration: x.Consideration?.DeliveryConsideration?.Value\r\n }\r\n });\r\n}\r\n\r\nconst TradeHistoryWithIntl = injectIntl(TradeHistoryCmp);\r\n\r\nexport const TradeHistory = withPapi(TradeHistoryWithIntl);\r\n","import * as React from \"react\";\r\nimport { Currency } from \"swan-public-api-client\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { AppState } from \"../Store/RootReducer\";\r\nimport { TradeHistory } from \"./TradeHistory\";\r\n\r\ninterface PropsFromAppState {\r\n activeTradingAccountKey: string;\r\n activeTradingAccountCurrencies: Map;\r\n baseCurrency: Currency\r\n}\r\n\r\nexport function ActiveTradingAccountTradeHistory() {\r\n const {\r\n activeTradingAccountKey,\r\n activeTradingAccountCurrencies,\r\n baseCurrency\r\n } = useSelector(x => ({\r\n activeTradingAccountKey: x.activeTradingAccount.account!.Key,\r\n activeTradingAccountCurrencies: new Map(\r\n x.activeTradingAccount.account!.Currencies.map(y => [parseInt(y.Key, 10), y])\r\n ),\r\n baseCurrency: x.clientAccount.account!.Currency\r\n }));\r\n\r\n return (\r\n \r\n );\r\n}\r\n","import * as React from \"react\";\r\nimport {\r\n PapiAuthenticationConsumer,\r\n PapiClientProvider,\r\n PapiAuthenticationContextState,\r\n LoginResult,\r\n ActiveTradingAccountConsumer\r\n} from \"./Api/PapiClient\";\r\nimport { LoginForm } from \"./Login/LoginForm\";\r\nimport { UsernamePassword } from \"./Login/UsernamePassword\";\r\nimport \"./App.less\";\r\nimport { PlatformLayout } from \"./Platform/PlatformLayout\";\r\nimport { IntlProvider } from \"./Localisation/IntlProvider\";\r\nimport { StoreProvider } from \"./Store/StoreProvider\";\r\nimport { Skeleton, Card, message, Switch, Form } from \"antd\";\r\nimport { PapiAuthenticationProviderWithSessionState } from \"./Session/PapiProviderWithSession\";\r\nimport { ActiveTradingAccountStreamingOpenPositionsWithTradesByMarketAndValueDateGrids } from \"./Positions/ActiveTradingAccountStreamingOpenPositionsWithTradesByMarketAndValueDateGrids\";\r\nimport { AccountSelector } from \"./Account/AccountSelector\";\r\nimport { ActiveTradingAccountStreamingResources } from \"./TradingAccountResources/ActiveTradingAccountStreamingResources\";\r\nimport { SpotFxActiveTradingAccountTradeHistory } from \"./TradeHistory/SpotFx/ActiveTradingAccountSpotFxTradeHistory\";\r\nimport { ActiveTradingAccountStatements } from \"./Statements/ActiveTradingAccountStatements\";\r\nimport { ProductType } from \"swan-public-api-client\";\r\nimport { useState } from \"react\";\r\nimport { ActiveTradingAccountStreamingOpenPositionsGrid } from \"./Positions/ActiveTradingAccountStreamingOpenPositionsGrid\";\r\nimport { ActiveTradingAccountStreamingOpenTradesGrid } from \"./Trades/ActiveTradingAccountStreamingOpenTradesGrid\";\r\nimport { ActiveTradingAccountTradeHistory } from \"./TradeHistory/ActiveTradingAccountTradeHistory\";\r\n\r\nconst papiUrl = process.env.REACT_APP_PAPI_URL as string;\r\nconst accountOperatorKey = process.env.REACT_APP_ACCOUNT_OPERATOR_KEY as string;\r\n\r\nmessage.config({\r\n top: 32\r\n});\r\n\r\nconst login = (papi: PapiAuthenticationContextState) => (\r\n request: UsernamePassword\r\n): Promise => {\r\n return papi.login(request.username, request.password, accountOperatorKey);\r\n};\r\n\r\nconst App = () => {\r\n // todo: get default locale on startup from useragent or localstorage, inside the component\r\n\r\n const [aggregateOpenTrades, setAggregateOpenTrades] = useState(false);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {papi => {\r\n if (papi.isAuthenticated && papi.client) {\r\n return (\r\n \r\n \r\n {active => {\r\n if (active.activeTradingAccount) {\r\n return (\r\n \r\n \r\n {\r\n active.activeTradingAccount.AccountType === ProductType.SpotFX\r\n ? \r\n \r\n \r\n : \r\n \r\n setAggregateOpenTrades(x)} />\r\n \r\n \r\n }\r\n >\r\n {aggregateOpenTrades ? : }\r\n \r\n }\r\n \r\n )\r\n },\r\n {\r\n key: \"2\",\r\n navigationDetails: {\r\n title: \"Trade History\",\r\n icon: \"history\"\r\n },\r\n page: (\r\n
\r\n \r\n \r\n {active.activeTradingAccount.AccountType === ProductType.SpotFX\r\n ? \r\n : \r\n }\r\n \r\n
\r\n )\r\n },\r\n {\r\n key: \"3\",\r\n navigationDetails: {\r\n title: \"Statements\",\r\n icon: \"file-text\"\r\n },\r\n page: (\r\n \r\n \r\n \r\n )\r\n }\r\n ]} />\r\n );\r\n } else {\r\n return (\r\n \r\n );\r\n }\r\n }}\r\n
\r\n
\r\n );\r\n } else {\r\n return papi.authenticationInProgress ? (\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 App;\r\n","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\nimport \"./index.css\";\r\nimport { unregister } from \"./serviceWorker\";\r\nimport App from \"./App\";\r\n\r\nReactDOM.render(, document.getElementById(\"root\") as HTMLElement);\r\nunregister();\r\n"],"sourceRoot":""}