@oanda/labs-currency-cross-table 1.0.6 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +68 -0
- package/codegen.ts +15 -0
- package/dist/main/CurrencyCrossTableWidget/CurrencyCrossTableWidget.js +12 -4
- package/dist/main/CurrencyCrossTableWidget/CurrencyCrossTableWidget.js.map +1 -1
- package/dist/main/CurrencyCrossTableWidget/Main.js +19 -17
- package/dist/main/CurrencyCrossTableWidget/Main.js.map +1 -1
- package/dist/main/CurrencyCrossTableWidget/ValidationWrapper.js +2 -1
- package/dist/main/CurrencyCrossTableWidget/ValidationWrapper.js.map +1 -1
- package/dist/main/CurrencyCrossTableWidget/components/Cell.js +2 -4
- package/dist/main/CurrencyCrossTableWidget/components/Cell.js.map +1 -1
- package/dist/main/CurrencyCrossTableWidget/components/CellValidationWrapper.js +49 -0
- package/dist/main/CurrencyCrossTableWidget/components/CellValidationWrapper.js.map +1 -0
- package/dist/main/CurrencyCrossTableWidget/components/CellWithData.js +19 -13
- package/dist/main/CurrencyCrossTableWidget/components/CellWithData.js.map +1 -1
- package/dist/main/CurrencyCrossTableWidget/components/TextCell.js +7 -5
- package/dist/main/CurrencyCrossTableWidget/components/TextCell.js.map +1 -1
- package/dist/main/CurrencyCrossTableWidget/components/types.js.map +1 -1
- package/dist/main/CurrencyCrossTableWidget/render.js +7 -2
- package/dist/main/CurrencyCrossTableWidget/render.js.map +1 -1
- package/dist/main/CurrencyCrossTableWidget/types.js +0 -13
- package/dist/main/CurrencyCrossTableWidget/types.js.map +1 -1
- package/dist/main/CurrencyCrossTableWidget/utils.js +13 -30
- package/dist/main/CurrencyCrossTableWidget/utils.js.map +1 -1
- package/dist/main/gql/types/fragment-masking.js +23 -0
- package/dist/main/gql/types/fragment-masking.js.map +1 -0
- package/dist/main/gql/types/gql.js +16 -0
- package/dist/main/gql/types/gql.js.map +1 -0
- package/dist/main/gql/types/graphql.js +223 -0
- package/dist/main/gql/types/graphql.js.map +1 -0
- package/dist/main/gql/types/index.js +28 -0
- package/dist/main/gql/types/index.js.map +1 -0
- package/dist/main/gql/validateInstruments.js +16 -0
- package/dist/main/gql/validateInstruments.js.map +1 -0
- package/dist/module/CurrencyCrossTableWidget/CurrencyCrossTableWidget.js +10 -2
- package/dist/module/CurrencyCrossTableWidget/CurrencyCrossTableWidget.js.map +1 -1
- package/dist/module/CurrencyCrossTableWidget/Main.js +21 -19
- package/dist/module/CurrencyCrossTableWidget/Main.js.map +1 -1
- package/dist/module/CurrencyCrossTableWidget/ValidationWrapper.js +2 -1
- package/dist/module/CurrencyCrossTableWidget/ValidationWrapper.js.map +1 -1
- package/dist/module/CurrencyCrossTableWidget/components/Cell.js +2 -4
- package/dist/module/CurrencyCrossTableWidget/components/Cell.js.map +1 -1
- package/dist/module/CurrencyCrossTableWidget/components/CellValidationWrapper.js +42 -0
- package/dist/module/CurrencyCrossTableWidget/components/CellValidationWrapper.js.map +1 -0
- package/dist/module/CurrencyCrossTableWidget/components/CellWithData.js +20 -14
- package/dist/module/CurrencyCrossTableWidget/components/CellWithData.js.map +1 -1
- package/dist/module/CurrencyCrossTableWidget/components/TextCell.js +7 -5
- package/dist/module/CurrencyCrossTableWidget/components/TextCell.js.map +1 -1
- package/dist/module/CurrencyCrossTableWidget/components/types.js.map +1 -1
- package/dist/module/CurrencyCrossTableWidget/render.js +6 -1
- package/dist/module/CurrencyCrossTableWidget/render.js.map +1 -1
- package/dist/module/CurrencyCrossTableWidget/types.js +0 -12
- package/dist/module/CurrencyCrossTableWidget/types.js.map +1 -1
- package/dist/module/CurrencyCrossTableWidget/utils.js +10 -29
- package/dist/module/CurrencyCrossTableWidget/utils.js.map +1 -1
- package/dist/module/gql/types/fragment-masking.js +15 -0
- package/dist/module/gql/types/fragment-masking.js.map +1 -0
- package/dist/module/gql/types/gql.js +8 -0
- package/dist/module/gql/types/gql.js.map +1 -0
- package/dist/module/gql/types/graphql.js +217 -0
- package/dist/module/gql/types/graphql.js.map +1 -0
- package/dist/module/gql/types/index.js +3 -0
- package/dist/module/gql/types/index.js.map +1 -0
- package/dist/module/gql/validateInstruments.js +10 -0
- package/dist/module/gql/validateInstruments.js.map +1 -0
- package/dist/types/CurrencyCrossTableWidget/CurrencyCrossTableWidget.d.ts +1 -1
- package/dist/types/CurrencyCrossTableWidget/Main.d.ts +1 -1
- package/dist/types/CurrencyCrossTableWidget/components/Cell.d.ts +1 -1
- package/dist/types/CurrencyCrossTableWidget/components/CellValidationWrapper.d.ts +4 -0
- package/dist/types/CurrencyCrossTableWidget/components/CellWithData.d.ts +1 -1
- package/dist/types/CurrencyCrossTableWidget/components/TextCell.d.ts +1 -1
- package/dist/types/CurrencyCrossTableWidget/components/types.d.ts +15 -4
- package/dist/types/CurrencyCrossTableWidget/types.d.ts +3 -11
- package/dist/types/CurrencyCrossTableWidget/utils.d.ts +5 -6
- package/dist/types/gql/types/fragment-masking.d.ts +15 -0
- package/dist/types/gql/types/gql.d.ts +37 -0
- package/dist/types/gql/types/graphql.d.ts +384 -0
- package/dist/types/gql/types/index.d.ts +2 -0
- package/dist/types/gql/validateInstruments.d.ts +1 -0
- package/package.json +12 -4
- package/src/CurrencyCrossTableWidget/CurrencyCrossTableWidget.tsx +16 -6
- package/src/CurrencyCrossTableWidget/Main.tsx +23 -19
- package/src/CurrencyCrossTableWidget/ValidationWrapper.tsx +1 -0
- package/src/CurrencyCrossTableWidget/components/Cell.tsx +2 -4
- package/src/CurrencyCrossTableWidget/components/CellValidationWrapper.tsx +49 -0
- package/src/CurrencyCrossTableWidget/components/CellWithData.tsx +30 -16
- package/src/CurrencyCrossTableWidget/components/TextCell.tsx +6 -4
- package/src/CurrencyCrossTableWidget/components/types.ts +15 -4
- package/src/CurrencyCrossTableWidget/render.tsx +6 -2
- package/src/CurrencyCrossTableWidget/types.tsx +3 -12
- package/src/CurrencyCrossTableWidget/utils.ts +17 -37
- package/src/gql/types/fragment-masking.ts +66 -0
- package/src/gql/types/gql.ts +42 -0
- package/src/gql/types/graphql.ts +423 -0
- package/src/gql/types/index.ts +2 -0
- package/src/gql/validateInstruments.ts +10 -0
- package/test/Main.test.tsx +12 -6
- package/test/mocks.ts +225 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Main.js","names":["React","Fragment","useEffect","useState","useLiveRatesQuery","
|
|
1
|
+
{"version":3,"file":"Main.js","names":["React","Fragment","Suspense","useEffect","useState","useLiveRatesQuery","TextCell","CellValidationWrapper","divisionMapper","Main","_ref","instruments","currencies","division","selectedCurrency","setSelectedCurrency","selectedPair","setSelectedPair","hasInstruments","length","target","setQuery","createElement","className","sticky","map","pair","key","label","hovered","currency","index","arr","instrument","emptyIndicator"],"sources":["../../../src/CurrencyCrossTableWidget/Main.tsx"],"sourcesContent":["import React, {\n Fragment, Suspense, useEffect, useState,\n} from 'react';\nimport { useLiveRatesQuery } from '@oanda/labs-widget-common';\nimport { MainProps } from './types';\nimport { TextCell } from './components';\nimport { CellValidationWrapper } from './components/CellValidationWrapper';\nimport { divisionMapper } from './utils';\n\nconst Main = ({\n instruments,\n currencies,\n division,\n}: MainProps) => {\n const [selectedCurrency, setSelectedCurrency] = useState('');\n const [selectedPair, setSelectedPair] = useState('');\n\n const hasInstruments = instruments.length > 0;\n\n const { target, setQuery } = useLiveRatesQuery();\n\n useEffect(() => {\n if (hasInstruments) {\n setQuery({ instruments });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, instruments);\n\n return (\n <div data-testid=\"currency-cross-table-wrapper\" className=\"lw-w-full lw-overflow-x-auto lw-overflow-y-hidden lw-border lw-border-b-0 lw-border-solid lw-border-border-primary\">\n <div className=\"lw-flex lw-w-max lw-min-w-full\">\n <TextCell sticky />\n {currencies.map(((pair) => (\n <TextCell\n key={pair}\n label={pair}\n hovered={pair === selectedPair}\n />\n )))}\n </div>\n {currencies.map(((currency, index, arr) => (\n <div\n key={currency}\n className=\"lw-flex lw-w-max lw-min-w-full\"\n >\n <TextCell\n label={currency}\n hovered={currency === selectedCurrency}\n sticky\n />\n {arr.map((pair) => (\n <Fragment key={`${currency}_${pair}`}>\n {currency !== pair ? (\n <Suspense>\n <CellValidationWrapper\n currency={currency}\n pair={pair}\n instrument={`${currency}${divisionMapper(division)}${pair}`}\n target={target}\n setSelectedCurrency={setSelectedCurrency}\n setSelectedPair={setSelectedPair}\n division={division}\n />\n </Suspense>\n ) : (\n <TextCell\n emptyIndicator\n />\n )}\n </Fragment>\n ))}\n </div>\n )))}\n </div>\n );\n};\n\nexport { Main };\n"],"mappings":"AAAA,OAAOA,KAAK,IACVC,QAAQ,EAAEC,QAAQ,EAAEC,SAAS,EAAEC,QAAQ,QAClC,OAAO;AACd,SAASC,iBAAiB,QAAQ,2BAA2B;AAE7D,SAASC,QAAQ,QAAQ,cAAc;AACvC,SAASC,qBAAqB,QAAQ,oCAAoC;AAC1E,SAASC,cAAc,QAAQ,SAAS;AAExC,MAAMC,IAAI,GAAGC,IAAA,IAII;EAAA,IAJH;IACZC,WAAW;IACXC,UAAU;IACVC;EACS,CAAC,GAAAH,IAAA;EACV,MAAM,CAACI,gBAAgB,EAAEC,mBAAmB,CAAC,GAAGX,QAAQ,CAAC,EAAE,CAAC;EAC5D,MAAM,CAACY,YAAY,EAAEC,eAAe,CAAC,GAAGb,QAAQ,CAAC,EAAE,CAAC;EAEpD,MAAMc,cAAc,GAAGP,WAAW,CAACQ,MAAM,GAAG,CAAC;EAE7C,MAAM;IAAEC,MAAM;IAAEC;EAAS,CAAC,GAAGhB,iBAAiB,CAAC,CAAC;EAEhDF,SAAS,CAAC,MAAM;IACd,IAAIe,cAAc,EAAE;MAClBG,QAAQ,CAAC;QAAEV;MAAY,CAAC,CAAC;IAC3B;EAEF,CAAC,EAAEA,WAAW,CAAC;EAEf,OACEX,KAAA,CAAAsB,aAAA;IAAK,eAAY,8BAA8B;IAACC,SAAS,EAAC;EAAoH,GAC5KvB,KAAA,CAAAsB,aAAA;IAAKC,SAAS,EAAC;EAAgC,GAC7CvB,KAAA,CAAAsB,aAAA,CAAChB,QAAQ;IAACkB,MAAM;EAAA,CAAE,CAAC,EAClBZ,UAAU,CAACa,GAAG,CAAGC,IAAI,IACpB1B,KAAA,CAAAsB,aAAA,CAAChB,QAAQ;IACPqB,GAAG,EAAED,IAAK;IACVE,KAAK,EAAEF,IAAK;IACZG,OAAO,EAAEH,IAAI,KAAKV;EAAa,CAChC,CACD,CACC,CAAC,EACLJ,UAAU,CAACa,GAAG,CAAE,CAACK,QAAQ,EAAEC,KAAK,EAAEC,GAAG,KACpChC,KAAA,CAAAsB,aAAA;IACEK,GAAG,EAAEG,QAAS;IACdP,SAAS,EAAC;EAAgC,GAE1CvB,KAAA,CAAAsB,aAAA,CAAChB,QAAQ;IACPsB,KAAK,EAAEE,QAAS;IAChBD,OAAO,EAAEC,QAAQ,KAAKhB,gBAAiB;IACvCU,MAAM;EAAA,CACP,CAAC,EACDQ,GAAG,CAACP,GAAG,CAAEC,IAAI,IACZ1B,KAAA,CAAAsB,aAAA,CAACrB,QAAQ;IAAC0B,GAAG,EAAE,GAAGG,QAAQ,IAAIJ,IAAI;EAAG,GAClCI,QAAQ,KAAKJ,IAAI,GAChB1B,KAAA,CAAAsB,aAAA,CAACpB,QAAQ,QACPF,KAAA,CAAAsB,aAAA,CAACf,qBAAqB;IACpBuB,QAAQ,EAAEA,QAAS;IACnBJ,IAAI,EAAEA,IAAK;IACXO,UAAU,EAAE,GAAGH,QAAQ,GAAGtB,cAAc,CAACK,QAAQ,CAAC,GAAGa,IAAI,EAAG;IAC5DN,MAAM,EAAEA,MAAO;IACfL,mBAAmB,EAAEA,mBAAoB;IACzCE,eAAe,EAAEA,eAAgB;IACjCJ,QAAQ,EAAEA;EAAS,CACpB,CACO,CAAC,GAEXb,KAAA,CAAAsB,aAAA,CAAChB,QAAQ;IACP4B,cAAc;EAAA,CACf,CAEK,CACX,CACE,CACL,CACC,CAAC;AAEV,CAAC;AAED,SAASzB,IAAI","ignoreList":[]}
|
|
@@ -14,7 +14,8 @@ const ValidationWrapper = _ref => {
|
|
|
14
14
|
className: "lw-flex lw-w-full lw-text-sm lw-tracking-normal lw-text-text-primary"
|
|
15
15
|
}, !showError && React.createElement(Main, {
|
|
16
16
|
instruments: currenciesToInstruments(currencies, division),
|
|
17
|
-
currencies: currencies
|
|
17
|
+
currencies: currencies,
|
|
18
|
+
division: division
|
|
18
19
|
}), showError && React.createElement("div", {
|
|
19
20
|
className: classnames('lw-flex lw-h-[250px] lw-w-full lw-items-center lw-border lw-border-solid lw-border-border-primary')
|
|
20
21
|
}, React.createElement(ChartError, null))));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ValidationWrapper.js","names":["React","classnames","ChartError","currenciesToInstruments","validCurrencies","Main","ValidationWrapper","_ref","currencies","division","isParamError","showError","createElement","Fragment","className","instruments"],"sources":["../../../src/CurrencyCrossTableWidget/ValidationWrapper.tsx"],"sourcesContent":["import React from 'react';\nimport classnames from 'classnames';\nimport { ChartError } from '@oanda/labs-widget-common';\nimport { currenciesToInstruments, validCurrencies } from './utils';\nimport { ValidationWrapperProps } from './types';\nimport { Main } from './Main';\n\nconst ValidationWrapper = ({\n currencies,\n division,\n isParamError,\n}: ValidationWrapperProps) => {\n const showError = !validCurrencies(currencies) || isParamError;\n\n return (\n <>\n <div\n className=\"lw-flex lw-w-full lw-text-sm lw-tracking-normal lw-text-text-primary\"\n >\n {!showError && (\n <Main\n instruments={currenciesToInstruments(currencies, division)}\n currencies={currencies}\n />\n )}\n {showError && (\n <div className={classnames('lw-flex lw-h-[250px] lw-w-full lw-items-center lw-border lw-border-solid lw-border-border-primary')}>\n <ChartError />\n </div>\n )}\n </div>\n </>\n );\n};\n\nexport { ValidationWrapper };\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,UAAU,MAAM,YAAY;AACnC,SAASC,UAAU,QAAQ,2BAA2B;AACtD,SAASC,uBAAuB,EAAEC,eAAe,QAAQ,SAAS;AAElE,SAASC,IAAI,QAAQ,QAAQ;AAE7B,MAAMC,iBAAiB,GAAGC,IAAA,IAII;EAAA,IAJH;IACzBC,UAAU;IACVC,QAAQ;IACRC;EACsB,CAAC,GAAAH,IAAA;EACvB,MAAMI,SAAS,GAAG,CAACP,eAAe,CAACI,UAAU,CAAC,IAAIE,YAAY;EAE9D,OACEV,KAAA,CAAAY,aAAA,CAAAZ,KAAA,CAAAa,QAAA,QACEb,KAAA,CAAAY,aAAA;IACEE,SAAS,EAAC;EAAsE,GAE/E,CAACH,SAAS,IACTX,KAAA,CAAAY,aAAA,CAACP,IAAI;IACHU,WAAW,EAAEZ,uBAAuB,CAACK,UAAU,EAAEC,QAAQ,CAAE;IAC3DD,UAAU,EAAEA;
|
|
1
|
+
{"version":3,"file":"ValidationWrapper.js","names":["React","classnames","ChartError","currenciesToInstruments","validCurrencies","Main","ValidationWrapper","_ref","currencies","division","isParamError","showError","createElement","Fragment","className","instruments"],"sources":["../../../src/CurrencyCrossTableWidget/ValidationWrapper.tsx"],"sourcesContent":["import React from 'react';\nimport classnames from 'classnames';\nimport { ChartError } from '@oanda/labs-widget-common';\nimport { currenciesToInstruments, validCurrencies } from './utils';\nimport { ValidationWrapperProps } from './types';\nimport { Main } from './Main';\n\nconst ValidationWrapper = ({\n currencies,\n division,\n isParamError,\n}: ValidationWrapperProps) => {\n const showError = !validCurrencies(currencies) || isParamError;\n\n return (\n <>\n <div\n className=\"lw-flex lw-w-full lw-text-sm lw-tracking-normal lw-text-text-primary\"\n >\n {!showError && (\n <Main\n instruments={currenciesToInstruments(currencies, division)}\n currencies={currencies}\n division={division}\n />\n )}\n {showError && (\n <div className={classnames('lw-flex lw-h-[250px] lw-w-full lw-items-center lw-border lw-border-solid lw-border-border-primary')}>\n <ChartError />\n </div>\n )}\n </div>\n </>\n );\n};\n\nexport { ValidationWrapper };\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,UAAU,MAAM,YAAY;AACnC,SAASC,UAAU,QAAQ,2BAA2B;AACtD,SAASC,uBAAuB,EAAEC,eAAe,QAAQ,SAAS;AAElE,SAASC,IAAI,QAAQ,QAAQ;AAE7B,MAAMC,iBAAiB,GAAGC,IAAA,IAII;EAAA,IAJH;IACzBC,UAAU;IACVC,QAAQ;IACRC;EACsB,CAAC,GAAAH,IAAA;EACvB,MAAMI,SAAS,GAAG,CAACP,eAAe,CAACI,UAAU,CAAC,IAAIE,YAAY;EAE9D,OACEV,KAAA,CAAAY,aAAA,CAAAZ,KAAA,CAAAa,QAAA,QACEb,KAAA,CAAAY,aAAA;IACEE,SAAS,EAAC;EAAsE,GAE/E,CAACH,SAAS,IACTX,KAAA,CAAAY,aAAA,CAACP,IAAI;IACHU,WAAW,EAAEZ,uBAAuB,CAACK,UAAU,EAAEC,QAAQ,CAAE;IAC3DD,UAAU,EAAEA,UAAW;IACvBC,QAAQ,EAAEA;EAAS,CACpB,CACF,EACAE,SAAS,IACRX,KAAA,CAAAY,aAAA;IAAKE,SAAS,EAAEb,UAAU,CAAC,mGAAmG;EAAE,GAC9HD,KAAA,CAAAY,aAAA,CAACV,UAAU,MAAE,CACV,CAEJ,CACL,CAAC;AAEP,CAAC;AAED,SAASI,iBAAiB","ignoreList":[]}
|
|
@@ -6,15 +6,13 @@ const Cell = _ref => {
|
|
|
6
6
|
children,
|
|
7
7
|
isError,
|
|
8
8
|
isLoading,
|
|
9
|
-
additionalBorderBottom,
|
|
10
9
|
hovered,
|
|
11
10
|
mouseEnterHandler,
|
|
12
11
|
mouseLeaveHandler
|
|
13
12
|
} = _ref;
|
|
14
13
|
return React.createElement("div", {
|
|
15
|
-
className: classnames('lw-flex lw-h-[
|
|
16
|
-
'lw-border-
|
|
17
|
-
'lw-font-semibold': hovered
|
|
14
|
+
className: classnames('lw-flex lw-h-11 lw-min-w-[70px] lw-flex-1 lw-items-center lw-justify-center lw-border-b lw-border-r lw-border-solid lw-border-border-primary last:lw-border-r-[0px]', {
|
|
15
|
+
'lw-bg-border-primary lw-font-semibold lw-shadow-innerBorderBgColor': hovered
|
|
18
16
|
}),
|
|
19
17
|
onMouseEnter: mouseEnterHandler,
|
|
20
18
|
onMouseLeave: mouseLeaveHandler
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cell.js","names":["React","classnames","CELL_EMPTY_VALUE","CELL_LOADING_VALUE","Cell","_ref","children","isError","isLoading","
|
|
1
|
+
{"version":3,"file":"Cell.js","names":["React","classnames","CELL_EMPTY_VALUE","CELL_LOADING_VALUE","Cell","_ref","children","isError","isLoading","hovered","mouseEnterHandler","mouseLeaveHandler","createElement","className","onMouseEnter","onMouseLeave"],"sources":["../../../../src/CurrencyCrossTableWidget/components/Cell.tsx"],"sourcesContent":["import React from 'react';\nimport classnames from 'classnames';\nimport { CellProps } from './types';\nimport { CELL_EMPTY_VALUE, CELL_LOADING_VALUE } from '../constant';\n\nconst Cell = ({\n children,\n isError,\n isLoading,\n hovered,\n mouseEnterHandler,\n mouseLeaveHandler,\n}: CellProps) => (\n <div\n className={classnames('lw-flex lw-h-11 lw-min-w-[70px] lw-flex-1 lw-items-center lw-justify-center lw-border-b lw-border-r lw-border-solid lw-border-border-primary last:lw-border-r-[0px]', {\n 'lw-bg-border-primary lw-font-semibold lw-shadow-innerBorderBgColor': hovered,\n })}\n onMouseEnter={mouseEnterHandler}\n onMouseLeave={mouseLeaveHandler}\n >\n {isLoading && <div className=\"lw-px-3 lw-py-3.5\">{CELL_LOADING_VALUE}</div>}\n {!isLoading && !isError && children}\n {!isLoading && isError && (\n <span>{CELL_EMPTY_VALUE}</span>\n )}\n </div>\n);\n\nexport { Cell };\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,UAAU,MAAM,YAAY;AAEnC,SAASC,gBAAgB,EAAEC,kBAAkB,QAAQ,aAAa;AAElE,MAAMC,IAAI,GAAGC,IAAA;EAAA,IAAC;IACZC,QAAQ;IACRC,OAAO;IACPC,SAAS;IACTC,OAAO;IACPC,iBAAiB;IACjBC;EACS,CAAC,GAAAN,IAAA;EAAA,OACVL,KAAA,CAAAY,aAAA;IACEC,SAAS,EAAEZ,UAAU,CAAC,qKAAqK,EAAE;MAC3L,oEAAoE,EAAEQ;IACxE,CAAC,CAAE;IACHK,YAAY,EAAEJ,iBAAkB;IAChCK,YAAY,EAAEJ;EAAkB,GAE/BH,SAAS,IAAIR,KAAA,CAAAY,aAAA;IAAKC,SAAS,EAAC;EAAmB,GAAEV,kBAAwB,CAAC,EAC1E,CAACK,SAAS,IAAI,CAACD,OAAO,IAAID,QAAQ,EAClC,CAACE,SAAS,IAAID,OAAO,IACpBP,KAAA,CAAAY,aAAA,eAAOV,gBAAuB,CAE7B,CAAC;AAAA,CACP;AAED,SAASE,IAAI","ignoreList":[]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useSuspenseQuery } from '@apollo/client';
|
|
3
|
+
import { validateInstruments } from '../../gql/validateInstruments';
|
|
4
|
+
import { CellWithData } from './CellWithData';
|
|
5
|
+
import { divisionMapper } from '../utils';
|
|
6
|
+
const CellValidationWrapper = _ref => {
|
|
7
|
+
let {
|
|
8
|
+
currency,
|
|
9
|
+
pair,
|
|
10
|
+
instrument,
|
|
11
|
+
target,
|
|
12
|
+
setSelectedCurrency,
|
|
13
|
+
setSelectedPair,
|
|
14
|
+
division
|
|
15
|
+
} = _ref;
|
|
16
|
+
const {
|
|
17
|
+
error
|
|
18
|
+
} = useSuspenseQuery(validateInstruments, {
|
|
19
|
+
variables: {
|
|
20
|
+
instruments: [instrument],
|
|
21
|
+
division
|
|
22
|
+
},
|
|
23
|
+
fetchPolicy: 'network-only',
|
|
24
|
+
errorPolicy: 'all'
|
|
25
|
+
});
|
|
26
|
+
const instrumentForCalculations = error ? `${pair}${divisionMapper(division)}${currency}` : '';
|
|
27
|
+
return React.createElement(CellWithData, {
|
|
28
|
+
currency: currency,
|
|
29
|
+
pair: pair,
|
|
30
|
+
record: {
|
|
31
|
+
instrument,
|
|
32
|
+
displayName: `${currency}${divisionMapper(division)}${pair}`
|
|
33
|
+
},
|
|
34
|
+
instrumentForCalculations: instrumentForCalculations,
|
|
35
|
+
target: target,
|
|
36
|
+
setSelectedCurrency: setSelectedCurrency,
|
|
37
|
+
setSelectedPair: setSelectedPair,
|
|
38
|
+
division: division
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
export { CellValidationWrapper };
|
|
42
|
+
//# sourceMappingURL=CellValidationWrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CellValidationWrapper.js","names":["React","useSuspenseQuery","validateInstruments","CellWithData","divisionMapper","CellValidationWrapper","_ref","currency","pair","instrument","target","setSelectedCurrency","setSelectedPair","division","error","variables","instruments","fetchPolicy","errorPolicy","instrumentForCalculations","createElement","record","displayName"],"sources":["../../../../src/CurrencyCrossTableWidget/components/CellValidationWrapper.tsx"],"sourcesContent":["import React from 'react';\nimport { useSuspenseQuery } from '@apollo/client';\nimport { CellValidationWrapperProps } from './types';\nimport { ValidateInstrumentsQuery, ValidateInstrumentsQueryVariables } from '../../gql/types/graphql';\nimport { validateInstruments } from '../../gql/validateInstruments';\nimport { CellWithData } from './CellWithData';\nimport { divisionMapper } from '../utils';\n\nconst CellValidationWrapper = ({\n currency,\n pair,\n instrument,\n target,\n setSelectedCurrency,\n setSelectedPair,\n division,\n}: CellValidationWrapperProps) => {\n const { error } = useSuspenseQuery<\n ValidateInstrumentsQuery,\n ValidateInstrumentsQueryVariables\n >(validateInstruments, {\n variables: {\n instruments: [instrument],\n division,\n },\n fetchPolicy: 'network-only',\n errorPolicy: 'all',\n });\n\n const instrumentForCalculations = error ? `${pair}${divisionMapper(division)}${currency}` : '';\n\n return (\n <CellWithData\n currency={currency}\n pair={pair}\n record={{\n instrument,\n displayName: `${currency}${divisionMapper(division)}${pair}`,\n }}\n instrumentForCalculations={instrumentForCalculations}\n target={target}\n setSelectedCurrency={setSelectedCurrency}\n setSelectedPair={setSelectedPair}\n division={division}\n />\n );\n};\n\nexport { CellValidationWrapper };\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,gBAAgB,QAAQ,gBAAgB;AAGjD,SAASC,mBAAmB,QAAQ,+BAA+B;AACnE,SAASC,YAAY,QAAQ,gBAAgB;AAC7C,SAASC,cAAc,QAAQ,UAAU;AAEzC,MAAMC,qBAAqB,GAAGC,IAAA,IAQI;EAAA,IARH;IAC7BC,QAAQ;IACRC,IAAI;IACJC,UAAU;IACVC,MAAM;IACNC,mBAAmB;IACnBC,eAAe;IACfC;EAC0B,CAAC,GAAAP,IAAA;EAC3B,MAAM;IAAEQ;EAAM,CAAC,GAAGb,gBAAgB,CAGhCC,mBAAmB,EAAE;IACrBa,SAAS,EAAE;MACTC,WAAW,EAAE,CAACP,UAAU,CAAC;MACzBI;IACF,CAAC;IACDI,WAAW,EAAE,cAAc;IAC3BC,WAAW,EAAE;EACf,CAAC,CAAC;EAEF,MAAMC,yBAAyB,GAAGL,KAAK,GAAG,GAAGN,IAAI,GAAGJ,cAAc,CAACS,QAAQ,CAAC,GAAGN,QAAQ,EAAE,GAAG,EAAE;EAE9F,OACEP,KAAA,CAAAoB,aAAA,CAACjB,YAAY;IACXI,QAAQ,EAAEA,QAAS;IACnBC,IAAI,EAAEA,IAAK;IACXa,MAAM,EAAE;MACNZ,UAAU;MACVa,WAAW,EAAE,GAAGf,QAAQ,GAAGH,cAAc,CAACS,QAAQ,CAAC,GAAGL,IAAI;IAC5D,CAAE;IACFW,yBAAyB,EAAEA,yBAA0B;IACrDT,MAAM,EAAEA,MAAO;IACfC,mBAAmB,EAAEA,mBAAoB;IACzCC,eAAe,EAAEA,eAAgB;IACjCC,QAAQ,EAAEA;EAAS,CACpB,CAAC;AAEN,CAAC;AAED,SAASR,qBAAqB","ignoreList":[]}
|
|
@@ -1,26 +1,33 @@
|
|
|
1
1
|
import React, { useState } from 'react';
|
|
2
|
-
import { Price } from '@oanda/labs-widget-common';
|
|
3
|
-
import { useRecords } from '../utils';
|
|
2
|
+
import { Price, useLiveRatesMessage } from '@oanda/labs-widget-common';
|
|
4
3
|
import { Cell } from './Cell';
|
|
4
|
+
import { getBuyPrice, getPriceMovement } from '../utils';
|
|
5
5
|
const CellWithData = _ref => {
|
|
6
6
|
let {
|
|
7
|
-
|
|
7
|
+
currency,
|
|
8
|
+
pair,
|
|
8
9
|
record,
|
|
10
|
+
instrumentForCalculations,
|
|
9
11
|
target,
|
|
10
|
-
additionalBorderBottom,
|
|
11
12
|
setSelectedCurrency,
|
|
12
13
|
setSelectedPair
|
|
13
14
|
} = _ref;
|
|
14
15
|
const [hovered, setHovered] = useState(false);
|
|
16
|
+
const instrumentForUpdates = instrumentForCalculations || record.instrument;
|
|
15
17
|
const {
|
|
16
|
-
|
|
17
|
-
error
|
|
18
|
-
} =
|
|
19
|
-
const
|
|
18
|
+
update,
|
|
19
|
+
error: liveRatesError
|
|
20
|
+
} = useLiveRatesMessage(instrumentForUpdates, target);
|
|
21
|
+
const updatedRecord = {
|
|
22
|
+
displayName: record.displayName,
|
|
23
|
+
instrument: record.instrument,
|
|
24
|
+
buy: update?.ask,
|
|
25
|
+
buyPriceMovement: update?.askPriceMovement,
|
|
26
|
+
displayPrecision: update?.displayPrecision
|
|
27
|
+
};
|
|
28
|
+
const checkLoading = id => !liveRatesError && updatedRecord?.[id] === undefined;
|
|
20
29
|
const handleMouseEnter = () => {
|
|
21
30
|
setHovered(true);
|
|
22
|
-
const currency = record.instrument.substring(0, 3);
|
|
23
|
-
const pair = record.instrument.substring(record.instrument.length - 3);
|
|
24
31
|
setSelectedCurrency(currency);
|
|
25
32
|
setSelectedPair(pair);
|
|
26
33
|
};
|
|
@@ -31,15 +38,14 @@ const CellWithData = _ref => {
|
|
|
31
38
|
};
|
|
32
39
|
return React.createElement(Cell, {
|
|
33
40
|
isLoading: checkLoading('buy'),
|
|
34
|
-
isError: !!
|
|
35
|
-
additionalBorderBottom: additionalBorderBottom,
|
|
41
|
+
isError: !!liveRatesError,
|
|
36
42
|
hovered: hovered,
|
|
37
43
|
mouseEnterHandler: handleMouseEnter,
|
|
38
44
|
mouseLeaveHandler: handleMouseLeave
|
|
39
45
|
}, React.createElement(Price, {
|
|
40
|
-
priceMovement: updatedRecord.buyPriceMovement,
|
|
46
|
+
priceMovement: getPriceMovement(updatedRecord.buyPriceMovement, !!instrumentForCalculations),
|
|
41
47
|
movementIndicator: "background"
|
|
42
|
-
}, React.createElement("span", null, updatedRecord.buy
|
|
48
|
+
}, React.createElement("span", null, getBuyPrice(updatedRecord.buy, !!instrumentForCalculations).toFixed(updatedRecord.displayPrecision))));
|
|
43
49
|
};
|
|
44
50
|
export { CellWithData };
|
|
45
51
|
//# sourceMappingURL=CellWithData.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CellWithData.js","names":["React","useState","Price","
|
|
1
|
+
{"version":3,"file":"CellWithData.js","names":["React","useState","Price","useLiveRatesMessage","Cell","getBuyPrice","getPriceMovement","CellWithData","_ref","currency","pair","record","instrumentForCalculations","target","setSelectedCurrency","setSelectedPair","hovered","setHovered","instrumentForUpdates","instrument","update","error","liveRatesError","updatedRecord","displayName","buy","ask","buyPriceMovement","askPriceMovement","displayPrecision","checkLoading","id","undefined","handleMouseEnter","handleMouseLeave","createElement","isLoading","isError","mouseEnterHandler","mouseLeaveHandler","priceMovement","movementIndicator","toFixed"],"sources":["../../../../src/CurrencyCrossTableWidget/components/CellWithData.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { Price, useLiveRatesMessage } from '@oanda/labs-widget-common';\nimport { Cell } from './Cell';\nimport { CellWithDataProps } from './types';\nimport { getBuyPrice, getPriceMovement } from '../utils';\n\nconst CellWithData = ({\n currency,\n pair,\n record,\n instrumentForCalculations,\n target,\n setSelectedCurrency,\n setSelectedPair,\n}: CellWithDataProps) => {\n const [hovered, setHovered] = useState(false);\n\n const instrumentForUpdates = instrumentForCalculations || record.instrument;\n\n const { update, error: liveRatesError } = useLiveRatesMessage(\n instrumentForUpdates,\n target,\n );\n\n const updatedRecord: Record<string, any> = {\n displayName: record.displayName,\n instrument: record.instrument,\n buy: update?.ask,\n buyPriceMovement: update?.askPriceMovement,\n displayPrecision: update?.displayPrecision,\n };\n\n const checkLoading = (id: string) => (!liveRatesError && updatedRecord?.[id] === undefined);\n\n const handleMouseEnter = () => {\n setHovered(true);\n setSelectedCurrency(currency);\n setSelectedPair(pair);\n };\n\n const handleMouseLeave = () => {\n setHovered(false);\n setSelectedCurrency('');\n setSelectedPair('');\n };\n\n return (\n <Cell\n isLoading={checkLoading('buy')}\n isError={!!liveRatesError}\n hovered={hovered}\n mouseEnterHandler={handleMouseEnter}\n mouseLeaveHandler={handleMouseLeave}\n >\n <Price priceMovement={getPriceMovement(updatedRecord.buyPriceMovement, !!instrumentForCalculations)} movementIndicator=\"background\">\n <span>\n {getBuyPrice(\n updatedRecord.buy,\n !!instrumentForCalculations,\n ).toFixed(updatedRecord.displayPrecision)}\n </span>\n </Price>\n </Cell>\n );\n};\n\nexport { CellWithData };\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,QAAQ,QAAQ,OAAO;AACvC,SAASC,KAAK,EAAEC,mBAAmB,QAAQ,2BAA2B;AACtE,SAASC,IAAI,QAAQ,QAAQ;AAE7B,SAASC,WAAW,EAAEC,gBAAgB,QAAQ,UAAU;AAExD,MAAMC,YAAY,GAAGC,IAAA,IAQI;EAAA,IARH;IACpBC,QAAQ;IACRC,IAAI;IACJC,MAAM;IACNC,yBAAyB;IACzBC,MAAM;IACNC,mBAAmB;IACnBC;EACiB,CAAC,GAAAP,IAAA;EAClB,MAAM,CAACQ,OAAO,EAAEC,UAAU,CAAC,GAAGhB,QAAQ,CAAC,KAAK,CAAC;EAE7C,MAAMiB,oBAAoB,GAAGN,yBAAyB,IAAID,MAAM,CAACQ,UAAU;EAE3E,MAAM;IAAEC,MAAM;IAAEC,KAAK,EAAEC;EAAe,CAAC,GAAGnB,mBAAmB,CAC3De,oBAAoB,EACpBL,MACF,CAAC;EAED,MAAMU,aAAkC,GAAG;IACzCC,WAAW,EAAEb,MAAM,CAACa,WAAW;IAC/BL,UAAU,EAAER,MAAM,CAACQ,UAAU;IAC7BM,GAAG,EAAEL,MAAM,EAAEM,GAAG;IAChBC,gBAAgB,EAAEP,MAAM,EAAEQ,gBAAgB;IAC1CC,gBAAgB,EAAET,MAAM,EAAES;EAC5B,CAAC;EAED,MAAMC,YAAY,GAAIC,EAAU,IAAM,CAACT,cAAc,IAAIC,aAAa,GAAGQ,EAAE,CAAC,KAAKC,SAAU;EAE3F,MAAMC,gBAAgB,GAAGA,CAAA,KAAM;IAC7BhB,UAAU,CAAC,IAAI,CAAC;IAChBH,mBAAmB,CAACL,QAAQ,CAAC;IAC7BM,eAAe,CAACL,IAAI,CAAC;EACvB,CAAC;EAED,MAAMwB,gBAAgB,GAAGA,CAAA,KAAM;IAC7BjB,UAAU,CAAC,KAAK,CAAC;IACjBH,mBAAmB,CAAC,EAAE,CAAC;IACvBC,eAAe,CAAC,EAAE,CAAC;EACrB,CAAC;EAED,OACEf,KAAA,CAAAmC,aAAA,CAAC/B,IAAI;IACHgC,SAAS,EAAEN,YAAY,CAAC,KAAK,CAAE;IAC/BO,OAAO,EAAE,CAAC,CAACf,cAAe;IAC1BN,OAAO,EAAEA,OAAQ;IACjBsB,iBAAiB,EAAEL,gBAAiB;IACpCM,iBAAiB,EAAEL;EAAiB,GAEpClC,KAAA,CAAAmC,aAAA,CAACjC,KAAK;IAACsC,aAAa,EAAElC,gBAAgB,CAACiB,aAAa,CAACI,gBAAgB,EAAE,CAAC,CAACf,yBAAyB,CAAE;IAAC6B,iBAAiB,EAAC;EAAY,GACjIzC,KAAA,CAAAmC,aAAA,eACG9B,WAAW,CACVkB,aAAa,CAACE,GAAG,EACjB,CAAC,CAACb,yBACJ,CAAC,CAAC8B,OAAO,CAACnB,aAAa,CAACM,gBAAgB,CACpC,CACD,CACH,CAAC;AAEX,CAAC;AAED,SAAStB,YAAY","ignoreList":[]}
|
|
@@ -4,14 +4,16 @@ const TextCell = _ref => {
|
|
|
4
4
|
let {
|
|
5
5
|
label,
|
|
6
6
|
emptyIndicator,
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
hovered,
|
|
8
|
+
sticky
|
|
9
9
|
} = _ref;
|
|
10
10
|
return React.createElement("span", {
|
|
11
|
-
className: classnames('lw-flex-1 lw-border-r lw-border-solid lw-border-border-primary lw-py-3.5 lw-text-center', {
|
|
12
|
-
'lw-border-b': additionalBorderBottom,
|
|
11
|
+
className: classnames('lw-h-11 lw-min-w-[70px] lw-flex-1 lw-border-b lw-border-r lw-border-solid lw-border-border-primary lw-py-3.5 lw-text-center last:lw-border-r-[0px]', {
|
|
13
12
|
'lw-bg-border-primary': emptyIndicator,
|
|
14
|
-
'lw-
|
|
13
|
+
'lw-shadow-innerBorderBgColor': emptyIndicator && hovered,
|
|
14
|
+
'lw-bg-border-primary lw-font-semibold': hovered,
|
|
15
|
+
'lw-sticky lw-left-0 lw-z-10': sticky,
|
|
16
|
+
'lw-bg-bg-primary': sticky && !hovered
|
|
15
17
|
})
|
|
16
18
|
}, label);
|
|
17
19
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextCell.js","names":["React","classnames","TextCell","_ref","label","emptyIndicator","
|
|
1
|
+
{"version":3,"file":"TextCell.js","names":["React","classnames","TextCell","_ref","label","emptyIndicator","hovered","sticky","createElement","className"],"sources":["../../../../src/CurrencyCrossTableWidget/components/TextCell.tsx"],"sourcesContent":["import React from 'react';\nimport classnames from 'classnames';\nimport { TextCellProps } from './types';\n\nconst TextCell = ({\n label,\n emptyIndicator,\n hovered,\n sticky,\n}: TextCellProps) => (\n <span className={classnames('lw-h-11 lw-min-w-[70px] lw-flex-1 lw-border-b lw-border-r lw-border-solid lw-border-border-primary lw-py-3.5 lw-text-center last:lw-border-r-[0px]', {\n 'lw-bg-border-primary': emptyIndicator,\n 'lw-shadow-innerBorderBgColor': emptyIndicator && hovered,\n 'lw-bg-border-primary lw-font-semibold': hovered,\n 'lw-sticky lw-left-0 lw-z-10': sticky,\n 'lw-bg-bg-primary': sticky && !hovered,\n })}\n >\n {label}\n </span>\n);\n\nexport { TextCell };\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,UAAU,MAAM,YAAY;AAGnC,MAAMC,QAAQ,GAAGC,IAAA;EAAA,IAAC;IAChBC,KAAK;IACLC,cAAc;IACdC,OAAO;IACPC;EACa,CAAC,GAAAJ,IAAA;EAAA,OACdH,KAAA,CAAAQ,aAAA;IAAMC,SAAS,EAAER,UAAU,CAAC,oJAAoJ,EAAE;MAChL,sBAAsB,EAAEI,cAAc;MACtC,8BAA8B,EAAEA,cAAc,IAAIC,OAAO;MACzD,uCAAuC,EAAEA,OAAO;MAChD,6BAA6B,EAAEC,MAAM;MACrC,kBAAkB,EAAEA,MAAM,IAAI,CAACD;IACjC,CAAC;EAAE,GAEAF,KACG,CAAC;AAAA,CACR;AAED,SAASF,QAAQ","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../../../../src/CurrencyCrossTableWidget/components/types.ts"],"sourcesContent":["import { DataRecord, LoaderSize } from '@oanda/labs-widget-common';\n\nexport interface CellWithDataProps {\n
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../../../src/CurrencyCrossTableWidget/components/types.ts"],"sourcesContent":["import { DataRecord, LoaderSize } from '@oanda/labs-widget-common';\nimport { Division } from '../../gql/types/graphql';\n\nexport interface CellValidationWrapperProps {\n currency: string;\n pair: string;\n instrument: string;\n target: EventTarget | null;\n division: Division;\n setSelectedCurrency: React.Dispatch<React.SetStateAction<string>>;\n setSelectedPair: React.Dispatch<React.SetStateAction<string>>;\n}\nexport interface CellWithDataProps {\n currency: string;\n pair: string;\n instrumentForCalculations: string;\n record: DataRecord;\n target: EventTarget | null;\n division: Division;\n setSelectedCurrency: React.Dispatch<React.SetStateAction<string>>;\n setSelectedPair: React.Dispatch<React.SetStateAction<string>>;\n}\n\nexport interface CellProps {\n children: React.ReactNode;\n isLoading?: boolean;\n isError?: boolean;\n loaderSize?: LoaderSize;\n hovered: boolean;\n mouseEnterHandler: () => void;\n mouseLeaveHandler: () => void;\n}\n\nexport interface TextCellProps {\n label?: string;\n emptyIndicator?: boolean;\n hovered?: boolean;\n sticky?: boolean;\n}\n"],"mappings":"","ignoreList":[]}
|
|
@@ -2,8 +2,9 @@ import React from 'react';
|
|
|
2
2
|
import { createRoot } from 'react-dom/client';
|
|
3
3
|
import { validateLocale, validateToolParams } from '@oanda/labs-widget-common';
|
|
4
4
|
import { CurrencyCrossTableWidget } from './CurrencyCrossTableWidget';
|
|
5
|
-
import { Division } from '
|
|
5
|
+
import { Division } from '../gql/types/graphql';
|
|
6
6
|
const {
|
|
7
|
+
graphqlUrl,
|
|
7
8
|
liveRatesUrl
|
|
8
9
|
} = window.widgetsConfig || {};
|
|
9
10
|
const currencyCrossTableElements = document.querySelectorAll('div[data-currency-cross-table-params]');
|
|
@@ -20,6 +21,7 @@ currencyCrossTableElements.forEach(element => {
|
|
|
20
21
|
division,
|
|
21
22
|
locale,
|
|
22
23
|
currencies,
|
|
24
|
+
graphqlUrl,
|
|
23
25
|
liveRatesUrl
|
|
24
26
|
}, [{
|
|
25
27
|
name: 'locale',
|
|
@@ -30,10 +32,13 @@ currencyCrossTableElements.forEach(element => {
|
|
|
30
32
|
}, {
|
|
31
33
|
name: 'currencies',
|
|
32
34
|
valueCheck: value => value.length > 0 && value.length <= 8
|
|
35
|
+
}, {
|
|
36
|
+
name: 'graphqlUrl'
|
|
33
37
|
}, {
|
|
34
38
|
name: 'liveRatesUrl'
|
|
35
39
|
}]);
|
|
36
40
|
root.render(React.createElement(CurrencyCrossTableWidget, {
|
|
41
|
+
graphqlUrl: graphqlUrl,
|
|
37
42
|
liveRatesUrl: liveRatesUrl,
|
|
38
43
|
division: division,
|
|
39
44
|
currencies: currencies,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","names":["React","createRoot","validateLocale","validateToolParams","CurrencyCrossTableWidget","Division","liveRatesUrl","window","widgetsConfig","currencyCrossTableElements","document","querySelectorAll","forEach","element","root","params","getAttribute","mode","currencies","division","locale","JSON","parse","isParamError","name","valueCheck","value","Object","values","includes","length","render","createElement","theme"],"sources":["../../../src/CurrencyCrossTableWidget/render.tsx"],"sourcesContent":["import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { Theme, validateLocale, validateToolParams } from '@oanda/labs-widget-common';\nimport { CurrencyCrossTableWidget } from './CurrencyCrossTableWidget';\nimport { Division } from '
|
|
1
|
+
{"version":3,"file":"render.js","names":["React","createRoot","validateLocale","validateToolParams","CurrencyCrossTableWidget","Division","graphqlUrl","liveRatesUrl","window","widgetsConfig","currencyCrossTableElements","document","querySelectorAll","forEach","element","root","params","getAttribute","mode","currencies","division","locale","JSON","parse","isParamError","name","valueCheck","value","Object","values","includes","length","render","createElement","theme"],"sources":["../../../src/CurrencyCrossTableWidget/render.tsx"],"sourcesContent":["import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { Theme, validateLocale, validateToolParams } from '@oanda/labs-widget-common';\nimport { CurrencyCrossTableWidget } from './CurrencyCrossTableWidget';\nimport { Division } from '../gql/types/graphql';\n\nconst {\n graphqlUrl,\n liveRatesUrl,\n} = window.widgetsConfig || {};\n\nconst currencyCrossTableElements = document.querySelectorAll('div[data-currency-cross-table-params]');\n\ncurrencyCrossTableElements.forEach((element) => {\n const root = createRoot(element);\n const params = element.getAttribute('data-currency-cross-table-params');\n const mode = element.getAttribute('data-mode');\n const {\n currencies, division, locale,\n } = JSON.parse(params as string);\n\n const isParamError = validateToolParams({\n division, locale, currencies, graphqlUrl, liveRatesUrl,\n }, [{\n name: 'locale',\n valueCheck: (value) => validateLocale(value),\n }, {\n name: 'division',\n valueCheck: (value) => Object.values(Division).includes(value),\n }, {\n name: 'currencies',\n valueCheck: (value) => (value as string[]).length > 0 && (value as string[]).length <= 8,\n }, {\n name: 'graphqlUrl',\n }, {\n name: 'liveRatesUrl',\n }]);\n\n root.render(\n <CurrencyCrossTableWidget\n graphqlUrl={graphqlUrl}\n liveRatesUrl={liveRatesUrl}\n division={division}\n currencies={currencies}\n locale={locale}\n theme={mode as Theme}\n isParamError={isParamError}\n />,\n );\n});\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAAgBC,cAAc,EAAEC,kBAAkB,QAAQ,2BAA2B;AACrF,SAASC,wBAAwB,QAAQ,4BAA4B;AACrE,SAASC,QAAQ,QAAQ,sBAAsB;AAE/C,MAAM;EACJC,UAAU;EACVC;AACF,CAAC,GAAGC,MAAM,CAACC,aAAa,IAAI,CAAC,CAAC;AAE9B,MAAMC,0BAA0B,GAAGC,QAAQ,CAACC,gBAAgB,CAAC,uCAAuC,CAAC;AAErGF,0BAA0B,CAACG,OAAO,CAAEC,OAAO,IAAK;EAC9C,MAAMC,IAAI,GAAGd,UAAU,CAACa,OAAO,CAAC;EAChC,MAAME,MAAM,GAAGF,OAAO,CAACG,YAAY,CAAC,kCAAkC,CAAC;EACvE,MAAMC,IAAI,GAAGJ,OAAO,CAACG,YAAY,CAAC,WAAW,CAAC;EAC9C,MAAM;IACJE,UAAU;IAAEC,QAAQ;IAAEC;EACxB,CAAC,GAAGC,IAAI,CAACC,KAAK,CAACP,MAAgB,CAAC;EAEhC,MAAMQ,YAAY,GAAGrB,kBAAkB,CAAC;IACtCiB,QAAQ;IAAEC,MAAM;IAAEF,UAAU;IAAEb,UAAU;IAAEC;EAC5C,CAAC,EAAE,CAAC;IACFkB,IAAI,EAAE,QAAQ;IACdC,UAAU,EAAGC,KAAK,IAAKzB,cAAc,CAACyB,KAAK;EAC7C,CAAC,EAAE;IACDF,IAAI,EAAE,UAAU;IAChBC,UAAU,EAAGC,KAAK,IAAKC,MAAM,CAACC,MAAM,CAACxB,QAAQ,CAAC,CAACyB,QAAQ,CAACH,KAAK;EAC/D,CAAC,EAAE;IACDF,IAAI,EAAE,YAAY;IAClBC,UAAU,EAAGC,KAAK,IAAMA,KAAK,CAAcI,MAAM,GAAG,CAAC,IAAKJ,KAAK,CAAcI,MAAM,IAAI;EACzF,CAAC,EAAE;IACDN,IAAI,EAAE;EACR,CAAC,EAAE;IACDA,IAAI,EAAE;EACR,CAAC,CAAC,CAAC;EAEHV,IAAI,CAACiB,MAAM,CACThC,KAAA,CAAAiC,aAAA,CAAC7B,wBAAwB;IACvBE,UAAU,EAAEA,UAAW;IACvBC,YAAY,EAAEA,YAAa;IAC3Ba,QAAQ,EAAEA,QAAS;IACnBD,UAAU,EAAEA,UAAW;IACvBE,MAAM,EAAEA,MAAO;IACfa,KAAK,EAAEhB,IAAc;IACrBM,YAAY,EAAEA;EAAa,CAC5B,CACH,CAAC;AACH,CAAC,CAAC","ignoreList":[]}
|
|
@@ -1,14 +1,2 @@
|
|
|
1
1
|
export { Locale } from '@oanda/mono-i18n';
|
|
2
|
-
export let Division = function (Division) {
|
|
3
|
-
Division["Oap"] = "OAP";
|
|
4
|
-
Division["Oau"] = "OAU";
|
|
5
|
-
Division["Oc"] = "OC";
|
|
6
|
-
Division["Ocan"] = "OCAN";
|
|
7
|
-
Division["Oel"] = "OEL";
|
|
8
|
-
Division["Ogm"] = "OGM";
|
|
9
|
-
Division["Oj"] = "OJ";
|
|
10
|
-
Division["Opt"] = "OPT";
|
|
11
|
-
Division["Otms"] = "OTMS";
|
|
12
|
-
return Division;
|
|
13
|
-
}({});
|
|
14
2
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":["Locale"
|
|
1
|
+
{"version":3,"file":"types.js","names":["Locale"],"sources":["../../../src/CurrencyCrossTableWidget/types.tsx"],"sourcesContent":["import { Locale } from '@oanda/mono-i18n';\nimport { Theme } from '@oanda/labs-widget-common';\nimport { Division } from '../gql/types/graphql';\n\nexport { Locale } from '@oanda/mono-i18n';\n\nexport interface CurrencyCrossTableConfig {\n division: Division;\n graphqlUrl: string;\n liveRatesUrl: string;\n currencies: string[];\n locale: Locale;\n theme?: Theme;\n isParamError?: boolean;\n removePadding?: boolean;\n}\n\nexport interface ValidationWrapperProps {\n currencies: string[];\n division: Division;\n isParamError?: boolean;\n}\nexport interface MainProps {\n currencies: string[];\n instruments: string[];\n division: Division;\n}\n"],"mappings":"AAIA,SAASA,MAAM,QAAQ,kBAAkB","ignoreList":[]}
|
|
@@ -1,39 +1,20 @@
|
|
|
1
|
-
import { useEffect, useState } from 'react';
|
|
2
|
-
import { useLiveRatesMessage } from '@oanda/labs-widget-common';
|
|
3
1
|
import { MAJOR_CURRENCIES } from './constant';
|
|
4
2
|
const validCurrencies = currencies => currencies.every(currency => MAJOR_CURRENCIES.includes(currency));
|
|
3
|
+
const divisionMapper = division => division === 'OGM' ? '' : '_';
|
|
5
4
|
const currenciesToInstruments = (currencies, division) => {
|
|
6
|
-
const divisionMapper = division === 'OGM' ? '' : '_';
|
|
7
5
|
const pairs = currencies.reduce((acc, cV, index, array) => {
|
|
8
6
|
const unique = array.filter((_item, idx) => index !== idx);
|
|
9
|
-
return [...acc, ...unique.map(el => `${cV}${divisionMapper}${el}`)];
|
|
7
|
+
return [...acc, ...unique.map(el => `${cV}${divisionMapper(division)}${el}`)];
|
|
10
8
|
}, []);
|
|
11
9
|
return pairs;
|
|
12
10
|
};
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
instrument: record.instrument
|
|
17
|
-
});
|
|
18
|
-
const [error, setError] = useState(null);
|
|
19
|
-
const {
|
|
20
|
-
update,
|
|
21
|
-
error: liveRatesError
|
|
22
|
-
} = useLiveRatesMessage(record.instrument, target);
|
|
23
|
-
useEffect(() => {
|
|
24
|
-
setUpdatedRecord({
|
|
25
|
-
displayName: record.displayName,
|
|
26
|
-
instrument: record.instrument,
|
|
27
|
-
buy: update?.ask,
|
|
28
|
-
buyPriceMovement: update?.askPriceMovement,
|
|
29
|
-
displayPrecision: update?.displayPrecision
|
|
30
|
-
});
|
|
31
|
-
setError(liveRatesError);
|
|
32
|
-
}, [update, record, liveRatesError]);
|
|
33
|
-
return {
|
|
34
|
-
updatedRecord,
|
|
35
|
-
error
|
|
36
|
-
};
|
|
11
|
+
const getPriceMovement = (priceMovement, isReversed) => {
|
|
12
|
+
if (priceMovement === undefined) return 0;
|
|
13
|
+
return isReversed ? priceMovement * -1 : priceMovement;
|
|
37
14
|
};
|
|
38
|
-
|
|
15
|
+
const getBuyPrice = (price, isReversed) => {
|
|
16
|
+
if (price === undefined) return 0;
|
|
17
|
+
return isReversed ? 1 / price : price;
|
|
18
|
+
};
|
|
19
|
+
export { validCurrencies, currenciesToInstruments, divisionMapper, getPriceMovement, getBuyPrice };
|
|
39
20
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":["
|
|
1
|
+
{"version":3,"file":"utils.js","names":["MAJOR_CURRENCIES","validCurrencies","currencies","every","currency","includes","divisionMapper","division","currenciesToInstruments","pairs","reduce","acc","cV","index","array","unique","filter","_item","idx","map","el","getPriceMovement","priceMovement","isReversed","undefined","getBuyPrice","price"],"sources":["../../../src/CurrencyCrossTableWidget/utils.ts"],"sourcesContent":["import { MAJOR_CURRENCIES } from './constant';\nimport { Division } from '../gql/types/graphql';\n\nconst validCurrencies = (currencies: string[]) => currencies\n .every((currency) => MAJOR_CURRENCIES.includes(currency));\n\nconst divisionMapper = (division: Division) => (division === 'OGM' ? '' : '_');\n\nconst currenciesToInstruments = (currencies: string[], division: any) => {\n const pairs = currencies.reduce((acc, cV, index, array) => {\n const unique = array.filter((_item, idx) => index !== idx);\n\n return [\n ...acc,\n ...unique.map((el) => `${cV}${divisionMapper(division)}${el}`),\n ];\n }, [] as string[]);\n\n return pairs;\n};\n\nconst getPriceMovement = (priceMovement: number | undefined, isReversed: boolean) => {\n if (priceMovement === undefined) return 0;\n\n return isReversed ? priceMovement * -1 : priceMovement;\n};\n\nconst getBuyPrice = (price: number | undefined, isReversed: boolean) => {\n if (price === undefined) return 0;\n\n return isReversed ? 1 / price : price;\n};\n\nexport {\n validCurrencies,\n currenciesToInstruments,\n divisionMapper,\n getPriceMovement,\n getBuyPrice,\n};\n"],"mappings":"AAAA,SAASA,gBAAgB,QAAQ,YAAY;AAG7C,MAAMC,eAAe,GAAIC,UAAoB,IAAKA,UAAU,CACzDC,KAAK,CAAEC,QAAQ,IAAKJ,gBAAgB,CAACK,QAAQ,CAACD,QAAQ,CAAC,CAAC;AAE3D,MAAME,cAAc,GAAIC,QAAkB,IAAMA,QAAQ,KAAK,KAAK,GAAG,EAAE,GAAG,GAAI;AAE9E,MAAMC,uBAAuB,GAAGA,CAACN,UAAoB,EAAEK,QAAa,KAAK;EACvE,MAAME,KAAK,GAAGP,UAAU,CAACQ,MAAM,CAAC,CAACC,GAAG,EAAEC,EAAE,EAAEC,KAAK,EAAEC,KAAK,KAAK;IACzD,MAAMC,MAAM,GAAGD,KAAK,CAACE,MAAM,CAAC,CAACC,KAAK,EAAEC,GAAG,KAAKL,KAAK,KAAKK,GAAG,CAAC;IAE1D,OAAO,CACL,GAAGP,GAAG,EACN,GAAGI,MAAM,CAACI,GAAG,CAAEC,EAAE,IAAK,GAAGR,EAAE,GAAGN,cAAc,CAACC,QAAQ,CAAC,GAAGa,EAAE,EAAE,CAAC,CAC/D;EACH,CAAC,EAAE,EAAc,CAAC;EAElB,OAAOX,KAAK;AACd,CAAC;AAED,MAAMY,gBAAgB,GAAGA,CAACC,aAAiC,EAAEC,UAAmB,KAAK;EACnF,IAAID,aAAa,KAAKE,SAAS,EAAE,OAAO,CAAC;EAEzC,OAAOD,UAAU,GAAGD,aAAa,GAAG,CAAC,CAAC,GAAGA,aAAa;AACxD,CAAC;AAED,MAAMG,WAAW,GAAGA,CAACC,KAAyB,EAAEH,UAAmB,KAAK;EACtE,IAAIG,KAAK,KAAKF,SAAS,EAAE,OAAO,CAAC;EAEjC,OAAOD,UAAU,GAAG,CAAC,GAAGG,KAAK,GAAGA,KAAK;AACvC,CAAC;AAED,SACEzB,eAAe,EACfO,uBAAuB,EACvBF,cAAc,EACde,gBAAgB,EAChBI,WAAW","ignoreList":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export function useFragment(_documentNode, fragmentType) {
|
|
2
|
+
return fragmentType;
|
|
3
|
+
}
|
|
4
|
+
export function makeFragmentData(data, _fragment) {
|
|
5
|
+
return data;
|
|
6
|
+
}
|
|
7
|
+
export function isFragmentReady(queryNode, fragmentNode, data) {
|
|
8
|
+
const deferredFields = queryNode.__meta__?.deferredFields;
|
|
9
|
+
if (!deferredFields) return true;
|
|
10
|
+
const fragDef = fragmentNode.definitions[0];
|
|
11
|
+
const fragName = fragDef?.name?.value;
|
|
12
|
+
const fields = fragName && deferredFields[fragName] || [];
|
|
13
|
+
return fields.length > 0 && fields.every(field => data && field in data);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=fragment-masking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fragment-masking.js","names":["useFragment","_documentNode","fragmentType","makeFragmentData","data","_fragment","isFragmentReady","queryNode","fragmentNode","deferredFields","__meta__","fragDef","definitions","fragName","name","value","fields","length","every","field"],"sources":["../../../../src/gql/types/fragment-masking.ts"],"sourcesContent":["import { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { FragmentDefinitionNode } from 'graphql';\nimport { Incremental } from './graphql';\n\n\nexport type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> = TDocumentType extends DocumentTypeDecoration<\n infer TType,\n any\n>\n ? [TType] extends [{ ' $fragmentName'?: infer TKey }]\n ? TKey extends string\n ? { ' $fragmentRefs'?: { [key in TKey]: TType } }\n : never\n : never\n : never;\n\n// return non-nullable if `fragmentType` is non-nullable\nexport function useFragment<TType>(\n _documentNode: DocumentTypeDecoration<TType, any>,\n fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>\n): TType;\n// return nullable if `fragmentType` is nullable\nexport function useFragment<TType>(\n _documentNode: DocumentTypeDecoration<TType, any>,\n fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined\n): TType | null | undefined;\n// return array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n _documentNode: DocumentTypeDecoration<TType, any>,\n fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n): ReadonlyArray<TType>;\n// return array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n _documentNode: DocumentTypeDecoration<TType, any>,\n fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): ReadonlyArray<TType> | null | undefined;\nexport function useFragment<TType>(\n _documentNode: DocumentTypeDecoration<TType, any>,\n fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): TType | ReadonlyArray<TType> | null | undefined {\n return fragmentType as any;\n}\n\n\nexport function makeFragmentData<\n F extends DocumentTypeDecoration<any, any>,\n FT extends ResultOf<F>\n>(data: FT, _fragment: F): FragmentType<F> {\n return data as FragmentType<F>;\n}\nexport function isFragmentReady<TQuery, TFrag>(\n queryNode: DocumentTypeDecoration<TQuery, any>,\n fragmentNode: TypedDocumentNode<TFrag>,\n data: FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> | null | undefined\n): data is FragmentType<typeof fragmentNode> {\n const deferredFields = (queryNode as { __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> } }).__meta__\n ?.deferredFields;\n\n if (!deferredFields) return true;\n\n const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined;\n const fragName = fragDef?.name?.value;\n\n const fields = (fragName && deferredFields[fragName]) || [];\n return fields.length > 0 && fields.every(field => data && field in data);\n}\n"],"mappings":"AAoCA,OAAO,SAASA,WAAWA,CACzBC,aAAiD,EACjDC,YAAmJ,EAClG;EACjD,OAAOA,YAAY;AACrB;AAGA,OAAO,SAASC,gBAAgBA,CAG9BC,IAAQ,EAAEC,SAAY,EAAmB;EACzC,OAAOD,IAAI;AACb;AACA,OAAO,SAASE,eAAeA,CAC7BC,SAA8C,EAC9CC,YAAsC,EACtCJ,IAAiF,EACtC;EAC3C,MAAMK,cAAc,GAAIF,SAAS,CAAwEG,QAAQ,EAC7GD,cAAc;EAElB,IAAI,CAACA,cAAc,EAAE,OAAO,IAAI;EAEhC,MAAME,OAAO,GAAGH,YAAY,CAACI,WAAW,CAAC,CAAC,CAAuC;EACjF,MAAMC,QAAQ,GAAGF,OAAO,EAAEG,IAAI,EAAEC,KAAK;EAErC,MAAMC,MAAM,GAAIH,QAAQ,IAAIJ,cAAc,CAACI,QAAQ,CAAC,IAAK,EAAE;EAC3D,OAAOG,MAAM,CAACC,MAAM,GAAG,CAAC,IAAID,MAAM,CAACE,KAAK,CAACC,KAAK,IAAIf,IAAI,IAAIe,KAAK,IAAIf,IAAI,CAAC;AAC1E","ignoreList":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as types from './graphql';
|
|
2
|
+
const documents = {
|
|
3
|
+
"\n query validateInstruments($instruments: [String]!, $division: Division) {\n mapInstrumentNames(instruments: $instruments, division: $division) {\n name\n displayName\n }\n }\n": types.ValidateInstrumentsDocument
|
|
4
|
+
};
|
|
5
|
+
export function graphql(source) {
|
|
6
|
+
return documents[source] ?? {};
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=gql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gql.js","names":["types","documents","ValidateInstrumentsDocument","graphql","source"],"sources":["../../../../src/gql/types/gql.ts"],"sourcesContent":["/* eslint-disable */\nimport * as types from './graphql';\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n/**\n * Map of all GraphQL operations in the project.\n *\n * This map has several performance disadvantages:\n * 1. It is not tree-shakeable, so it will include all operations in the project.\n * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n * 3. It does not support dead code elimination, so it will add unused operations.\n *\n * Therefore it is highly recommended to use the babel or swc plugin for production.\n */\nconst documents = {\n \"\\n query validateInstruments($instruments: [String]!, $division: Division) {\\n mapInstrumentNames(instruments: $instruments, division: $division) {\\n name\\n displayName\\n }\\n }\\n\": types.ValidateInstrumentsDocument,\n};\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n *\n *\n * @example\n * ```ts\n * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);\n * ```\n *\n * The query argument is unknown!\n * Please regenerate the types.\n */\nexport function graphql(source: string): unknown;\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(source: \"\\n query validateInstruments($instruments: [String]!, $division: Division) {\\n mapInstrumentNames(instruments: $instruments, division: $division) {\\n name\\n displayName\\n }\\n }\\n\"): (typeof documents)[\"\\n query validateInstruments($instruments: [String]!, $division: Division) {\\n mapInstrumentNames(instruments: $instruments, division: $division) {\\n name\\n displayName\\n }\\n }\\n\"];\n\nexport function graphql(source: string) {\n return (documents as any)[source] ?? {};\n}\n\nexport type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode< infer TType, any> ? TType : never;"],"mappings":"AACA,OAAO,KAAKA,KAAK,MAAM,WAAW;AAalC,MAAMC,SAAS,GAAG;EACd,sMAAsM,EAAED,KAAK,CAACE;AAClN,CAAC;AAqBD,OAAO,SAASC,OAAOA,CAACC,MAAc,EAAE;EACtC,OAAQH,SAAS,CAASG,MAAM,CAAC,IAAI,CAAC,CAAC;AACzC","ignoreList":[]}
|