@oanda/labs-order-book-widget 1.0.0
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 +8 -0
- package/dist/main/OrderBookWidget/Main.js +70 -0
- package/dist/main/OrderBookWidget/Main.js.map +1 -0
- package/dist/main/OrderBookWidget/OrderBookWidget.js +23 -0
- package/dist/main/OrderBookWidget/OrderBookWidget.js.map +1 -0
- package/dist/main/OrderBookWidget/components/Chart/Chart.js +67 -0
- package/dist/main/OrderBookWidget/components/Chart/Chart.js.map +1 -0
- package/dist/main/OrderBookWidget/components/Chart/config.js +106 -0
- package/dist/main/OrderBookWidget/components/Chart/config.js.map +1 -0
- package/dist/main/OrderBookWidget/components/Chart/utils.js +21 -0
- package/dist/main/OrderBookWidget/components/Chart/utils.js.map +1 -0
- package/dist/main/OrderBookWidget/render.js +17 -0
- package/dist/main/OrderBookWidget/render.js.map +1 -0
- package/dist/main/OrderBookWidget/types.js +13 -0
- package/dist/main/OrderBookWidget/types.js.map +1 -0
- package/dist/main/OrderBookWidget/utils.js +17 -0
- package/dist/main/OrderBookWidget/utils.js.map +1 -0
- package/dist/main/index.js +28 -0
- package/dist/main/index.js.map +1 -0
- package/dist/module/OrderBookWidget/Main.js +62 -0
- package/dist/module/OrderBookWidget/Main.js.map +1 -0
- package/dist/module/OrderBookWidget/OrderBookWidget.js +16 -0
- package/dist/module/OrderBookWidget/OrderBookWidget.js.map +1 -0
- package/dist/module/OrderBookWidget/components/Chart/Chart.js +57 -0
- package/dist/module/OrderBookWidget/components/Chart/Chart.js.map +1 -0
- package/dist/module/OrderBookWidget/components/Chart/config.js +97 -0
- package/dist/module/OrderBookWidget/components/Chart/config.js.map +1 -0
- package/dist/module/OrderBookWidget/components/Chart/utils.js +14 -0
- package/dist/module/OrderBookWidget/components/Chart/utils.js.map +1 -0
- package/dist/module/OrderBookWidget/render.js +14 -0
- package/dist/module/OrderBookWidget/render.js.map +1 -0
- package/dist/module/OrderBookWidget/types.js +6 -0
- package/dist/module/OrderBookWidget/types.js.map +1 -0
- package/dist/module/OrderBookWidget/utils.js +11 -0
- package/dist/module/OrderBookWidget/utils.js.map +1 -0
- package/dist/module/index.js +3 -0
- package/dist/module/index.js.map +1 -0
- package/dist/types/OrderBookWidget/Main.d.ts +4 -0
- package/dist/types/OrderBookWidget/OrderBookWidget.d.ts +4 -0
- package/dist/types/OrderBookWidget/components/Chart/Chart.d.ts +6 -0
- package/dist/types/OrderBookWidget/components/Chart/config.d.ts +4 -0
- package/dist/types/OrderBookWidget/components/Chart/utils.d.ts +4 -0
- package/dist/types/OrderBookWidget/render.d.ts +6 -0
- package/dist/types/OrderBookWidget/types.d.ts +28 -0
- package/dist/types/OrderBookWidget/utils.d.ts +2 -0
- package/dist/types/index.d.ts +2 -0
- package/index.ts +1 -0
- package/package.json +19 -0
- package/src/OrderBookWidget/Main.tsx +80 -0
- package/src/OrderBookWidget/OrderBookWidget.tsx +17 -0
- package/src/OrderBookWidget/components/Chart/Chart.tsx +86 -0
- package/src/OrderBookWidget/components/Chart/config.tsx +100 -0
- package/src/OrderBookWidget/components/Chart/utils.tsx +13 -0
- package/src/OrderBookWidget/render.tsx +26 -0
- package/src/OrderBookWidget/types.ts +32 -0
- package/src/OrderBookWidget/utils.ts +25 -0
- package/src/index.ts +2 -0
- package/test/Main.test.tsx +57 -0
- package/tsconfig.types.json +12 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Change Log
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
|
+
|
|
6
|
+
# 1.0.0 (2023-09-01)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @oanda/labs-order-book-widget
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.Main = void 0;
|
|
7
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
8
|
+
var _labsWidgetCommon = require("@oanda/labs-widget-common");
|
|
9
|
+
var _Chart = require("./components/Chart/Chart");
|
|
10
|
+
var _types = require("./types");
|
|
11
|
+
var _utils = require("./utils");
|
|
12
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
13
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
14
|
+
const Main = _ref => {
|
|
15
|
+
let {
|
|
16
|
+
apiUrl,
|
|
17
|
+
instrument,
|
|
18
|
+
division
|
|
19
|
+
} = _ref;
|
|
20
|
+
const [isLoading, setIsLoading] = (0, _react.useState)(false);
|
|
21
|
+
const [error, setError] = (0, _react.useState)(undefined);
|
|
22
|
+
const [dataType, setDataType] = (0, _react.useState)(_types.DataType.Order);
|
|
23
|
+
const [data, setData] = (0, _react.useState)(undefined);
|
|
24
|
+
(0, _react.useEffect)(() => {
|
|
25
|
+
setIsLoading(true);
|
|
26
|
+
setData(undefined);
|
|
27
|
+
setError(undefined);
|
|
28
|
+
(0, _utils.getData)(apiUrl, instrument, division, dataType).then(result => {
|
|
29
|
+
setIsLoading(false);
|
|
30
|
+
if (dataType === _types.DataType.Order && (result === null || result === void 0 ? void 0 : result.orderBooks.length) > 0) {
|
|
31
|
+
setData(result.orderBooks);
|
|
32
|
+
} else if (dataType === _types.DataType.Position && (result === null || result === void 0 ? void 0 : result.positionBooks.length) > 0) {
|
|
33
|
+
setData(result.positionBooks);
|
|
34
|
+
} else {
|
|
35
|
+
setData(undefined);
|
|
36
|
+
}
|
|
37
|
+
}).catch(err => {
|
|
38
|
+
setIsLoading(false);
|
|
39
|
+
setError(JSON.stringify(err));
|
|
40
|
+
});
|
|
41
|
+
}, [dataType, apiUrl, instrument, division]);
|
|
42
|
+
const isTypeOrder = dataType === _types.DataType.Order;
|
|
43
|
+
return _react.default.createElement("div", {
|
|
44
|
+
"data-testid": "order-book-widget",
|
|
45
|
+
className: "border border-solid border-grey p-4 text-sm text-black"
|
|
46
|
+
}, _react.default.createElement("div", {
|
|
47
|
+
className: "flex gap-2"
|
|
48
|
+
}, _react.default.createElement(_labsWidgetCommon.Button, {
|
|
49
|
+
variant: isTypeOrder ? _labsWidgetCommon.ButtonVariant.primary : _labsWidgetCommon.ButtonVariant.secondary,
|
|
50
|
+
onClick: () => setDataType(_types.DataType.Order)
|
|
51
|
+
}, "Order Book"), _react.default.createElement(_labsWidgetCommon.Button, {
|
|
52
|
+
variant: isTypeOrder ? _labsWidgetCommon.ButtonVariant.secondary : _labsWidgetCommon.ButtonVariant.primary,
|
|
53
|
+
onClick: () => setDataType(_types.DataType.Position)
|
|
54
|
+
}, "Position Book")), _react.default.createElement("div", {
|
|
55
|
+
className: "relative h-[600px] w-full"
|
|
56
|
+
}, error && _react.default.createElement("div", {
|
|
57
|
+
className: "absolute left-0 top-0 flex h-full w-full items-center justify-center bg-lightGrey/[0.4]"
|
|
58
|
+
}, _react.default.createElement(_labsWidgetCommon.ChartError, null)), isLoading && _react.default.createElement("div", {
|
|
59
|
+
className: "absolute left-0 top-0 flex h-full w-full items-center justify-center bg-lightGrey/[0.4]"
|
|
60
|
+
}, _react.default.createElement(_labsWidgetCommon.Spinner, {
|
|
61
|
+
size: _labsWidgetCommon.SpinnerSize.lg
|
|
62
|
+
})), data && _react.default.createElement("div", {
|
|
63
|
+
className: "absolute left-0 top-0 flex h-full w-full"
|
|
64
|
+
}, _react.default.createElement(_Chart.Chart, {
|
|
65
|
+
data: data[data.length - 1],
|
|
66
|
+
isTypeOrder: isTypeOrder
|
|
67
|
+
}))));
|
|
68
|
+
};
|
|
69
|
+
exports.Main = Main;
|
|
70
|
+
//# sourceMappingURL=Main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Main.js","names":["_react","_interopRequireWildcard","require","_labsWidgetCommon","_Chart","_types","_utils","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","Main","_ref","apiUrl","instrument","division","isLoading","setIsLoading","useState","error","setError","undefined","dataType","setDataType","DataType","Order","data","setData","useEffect","getData","then","result","orderBooks","length","Position","positionBooks","catch","err","JSON","stringify","isTypeOrder","createElement","className","Button","variant","ButtonVariant","primary","secondary","onClick","ChartError","Spinner","size","SpinnerSize","lg","Chart","exports"],"sources":["../../../src/OrderBookWidget/Main.tsx"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport {\n Button, ButtonVariant, ChartError, Spinner, SpinnerSize,\n} from '@oanda/labs-widget-common';\nimport { Chart } from './components/Chart/Chart';\nimport { DataType, MainProps, OrderBookData } from './types';\nimport { getData } from './utils';\n\nconst Main = ({\n apiUrl,\n instrument,\n division,\n}: MainProps) => {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | undefined>(undefined);\n const [dataType, setDataType] = useState(DataType.Order);\n const [data, setData] = useState<OrderBookData[] | undefined>(undefined);\n\n useEffect(() => {\n setIsLoading(true);\n setData(undefined);\n setError(undefined);\n\n getData(apiUrl, instrument, division, dataType)\n .then((result) => {\n setIsLoading(false);\n if (dataType === DataType.Order && result?.orderBooks.length > 0) {\n setData(result.orderBooks);\n } else if (dataType === DataType.Position && result?.positionBooks.length > 0) {\n setData(result.positionBooks);\n } else {\n setData(undefined);\n }\n }).catch((err) => {\n setIsLoading(false);\n setError(JSON.stringify(err));\n });\n }, [dataType, apiUrl, instrument, division]);\n\n const isTypeOrder = dataType === DataType.Order;\n\n return (\n <div data-testid=\"order-book-widget\" className=\"border border-solid border-grey p-4 text-sm text-black\">\n <div className=\"flex gap-2\">\n <Button\n variant={isTypeOrder ? ButtonVariant.primary : ButtonVariant.secondary}\n onClick={() => setDataType(DataType.Order)}\n >\n Order Book\n </Button>\n <Button\n variant={isTypeOrder ? ButtonVariant.secondary : ButtonVariant.primary}\n onClick={() => setDataType(DataType.Position)}\n >\n Position Book\n </Button>\n </div>\n {/* @todo: chart height */}\n <div className=\"relative h-[600px] w-full\">\n {error && (\n <div className=\"absolute left-0 top-0 flex h-full w-full items-center justify-center bg-lightGrey/[0.4]\">\n <ChartError />\n </div>\n )}\n {isLoading && (\n <div className=\"absolute left-0 top-0 flex h-full w-full items-center justify-center bg-lightGrey/[0.4]\">\n <Spinner size={SpinnerSize.lg} />\n </div>\n )}\n {data && (\n <div className=\"absolute left-0 top-0 flex h-full w-full\">\n <Chart data={data[data.length - 1]} isTypeOrder={isTypeOrder} />\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport { Main };\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,iBAAA,GAAAD,OAAA;AAGA,IAAAE,MAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AACA,IAAAI,MAAA,GAAAJ,OAAA;AAAkC,SAAAK,yBAAAC,WAAA,eAAAC,OAAA,kCAAAC,iBAAA,OAAAD,OAAA,QAAAE,gBAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,WAAA,WAAAA,WAAA,GAAAG,gBAAA,GAAAD,iBAAA,KAAAF,WAAA;AAAA,SAAAP,wBAAAW,GAAA,EAAAJ,WAAA,SAAAA,WAAA,IAAAI,GAAA,IAAAA,GAAA,CAAAC,UAAA,WAAAD,GAAA,QAAAA,GAAA,oBAAAA,GAAA,wBAAAA,GAAA,4BAAAE,OAAA,EAAAF,GAAA,UAAAG,KAAA,GAAAR,wBAAA,CAAAC,WAAA,OAAAO,KAAA,IAAAA,KAAA,CAAAC,GAAA,CAAAJ,GAAA,YAAAG,KAAA,CAAAE,GAAA,CAAAL,GAAA,SAAAM,MAAA,WAAAC,qBAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,GAAA,IAAAX,GAAA,QAAAW,GAAA,kBAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAd,GAAA,EAAAW,GAAA,SAAAI,IAAA,GAAAR,qBAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAV,GAAA,EAAAW,GAAA,cAAAI,IAAA,KAAAA,IAAA,CAAAV,GAAA,IAAAU,IAAA,CAAAC,GAAA,KAAAR,MAAA,CAAAC,cAAA,CAAAH,MAAA,EAAAK,GAAA,EAAAI,IAAA,YAAAT,MAAA,CAAAK,GAAA,IAAAX,GAAA,CAAAW,GAAA,SAAAL,MAAA,CAAAJ,OAAA,GAAAF,GAAA,MAAAG,KAAA,IAAAA,KAAA,CAAAa,GAAA,CAAAhB,GAAA,EAAAM,MAAA,YAAAA,MAAA;AAElC,MAAMW,IAAI,GAAGC,IAAA,IAII;EAAA,IAJH;IACZC,MAAM;IACNC,UAAU;IACVC;EACS,CAAC,GAAAH,IAAA;EACV,MAAM,CAACI,SAAS,EAAEC,YAAY,CAAC,GAAG,IAAAC,eAAQ,EAAC,KAAK,CAAC;EACjD,MAAM,CAACC,KAAK,EAAEC,QAAQ,CAAC,GAAG,IAAAF,eAAQ,EAAqBG,SAAS,CAAC;EACjE,MAAM,CAACC,QAAQ,EAAEC,WAAW,CAAC,GAAG,IAAAL,eAAQ,EAACM,eAAQ,CAACC,KAAK,CAAC;EACxD,MAAM,CAACC,IAAI,EAAEC,OAAO,CAAC,GAAG,IAAAT,eAAQ,EAA8BG,SAAS,CAAC;EAExE,IAAAO,gBAAS,EAAC,MAAM;IACdX,YAAY,CAAC,IAAI,CAAC;IAClBU,OAAO,CAACN,SAAS,CAAC;IAClBD,QAAQ,CAACC,SAAS,CAAC;IAEnB,IAAAQ,cAAO,EAAChB,MAAM,EAAEC,UAAU,EAAEC,QAAQ,EAAEO,QAAQ,CAAC,CAC5CQ,IAAI,CAAEC,MAAM,IAAK;MAChBd,YAAY,CAAC,KAAK,CAAC;MACnB,IAAIK,QAAQ,KAAKE,eAAQ,CAACC,KAAK,IAAI,CAAAM,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAEC,UAAU,CAACC,MAAM,IAAG,CAAC,EAAE;QAChEN,OAAO,CAACI,MAAM,CAACC,UAAU,CAAC;MAC5B,CAAC,MAAM,IAAIV,QAAQ,KAAKE,eAAQ,CAACU,QAAQ,IAAI,CAAAH,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAEI,aAAa,CAACF,MAAM,IAAG,CAAC,EAAE;QAC7EN,OAAO,CAACI,MAAM,CAACI,aAAa,CAAC;MAC/B,CAAC,MAAM;QACLR,OAAO,CAACN,SAAS,CAAC;MACpB;IACF,CAAC,CAAC,CAACe,KAAK,CAAEC,GAAG,IAAK;MAChBpB,YAAY,CAAC,KAAK,CAAC;MACnBG,QAAQ,CAACkB,IAAI,CAACC,SAAS,CAACF,GAAG,CAAC,CAAC;IAC/B,CAAC,CAAC;EACN,CAAC,EAAE,CAACf,QAAQ,EAAET,MAAM,EAAEC,UAAU,EAAEC,QAAQ,CAAC,CAAC;EAE5C,MAAMyB,WAAW,GAAGlB,QAAQ,KAAKE,eAAQ,CAACC,KAAK;EAE/C,OACE3C,MAAA,CAAAc,OAAA,CAAA6C,aAAA;IAAK,eAAY,mBAAmB;IAACC,SAAS,EAAC;EAAwD,GACrG5D,MAAA,CAAAc,OAAA,CAAA6C,aAAA;IAAKC,SAAS,EAAC;EAAY,GACzB5D,MAAA,CAAAc,OAAA,CAAA6C,aAAA,CAACxD,iBAAA,CAAA0D,MAAM;IACLC,OAAO,EAAEJ,WAAW,GAAGK,+BAAa,CAACC,OAAO,GAAGD,+BAAa,CAACE,SAAU;IACvEC,OAAO,EAAEA,CAAA,KAAMzB,WAAW,CAACC,eAAQ,CAACC,KAAK;EAAE,GAC5C,YAEO,CAAC,EACT3C,MAAA,CAAAc,OAAA,CAAA6C,aAAA,CAACxD,iBAAA,CAAA0D,MAAM;IACLC,OAAO,EAAEJ,WAAW,GAAGK,+BAAa,CAACE,SAAS,GAAGF,+BAAa,CAACC,OAAQ;IACvEE,OAAO,EAAEA,CAAA,KAAMzB,WAAW,CAACC,eAAQ,CAACU,QAAQ;EAAE,GAC/C,eAEO,CACL,CAAC,EAENpD,MAAA,CAAAc,OAAA,CAAA6C,aAAA;IAAKC,SAAS,EAAC;EAA2B,GACvCvB,KAAK,IACJrC,MAAA,CAAAc,OAAA,CAAA6C,aAAA;IAAKC,SAAS,EAAC;EAAyF,GACtG5D,MAAA,CAAAc,OAAA,CAAA6C,aAAA,CAACxD,iBAAA,CAAAgE,UAAU,MAAE,CACV,CACN,EACAjC,SAAS,IACRlC,MAAA,CAAAc,OAAA,CAAA6C,aAAA;IAAKC,SAAS,EAAC;EAAyF,GACtG5D,MAAA,CAAAc,OAAA,CAAA6C,aAAA,CAACxD,iBAAA,CAAAiE,OAAO;IAACC,IAAI,EAAEC,6BAAW,CAACC;EAAG,CAAE,CAC7B,CACN,EACA3B,IAAI,IACH5C,MAAA,CAAAc,OAAA,CAAA6C,aAAA;IAAKC,SAAS,EAAC;EAA0C,GACvD5D,MAAA,CAAAc,OAAA,CAAA6C,aAAA,CAACvD,MAAA,CAAAoE,KAAK;IAAC5B,IAAI,EAAEA,IAAI,CAACA,IAAI,CAACO,MAAM,GAAG,CAAC,CAAE;IAACO,WAAW,EAAEA;EAAY,CAAE,CAC5D,CAEJ,CACF,CAAC;AAEV,CAAC;AAACe,OAAA,CAAA5C,IAAA,GAAAA,IAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.OrderBookWidget = void 0;
|
|
7
|
+
var _react = _interopRequireDefault(require("react"));
|
|
8
|
+
var _Main = require("./Main");
|
|
9
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
|
+
const OrderBookWidget = _ref => {
|
|
11
|
+
let {
|
|
12
|
+
apiUrl,
|
|
13
|
+
instrument,
|
|
14
|
+
division
|
|
15
|
+
} = _ref;
|
|
16
|
+
return _react.default.createElement(_Main.Main, {
|
|
17
|
+
apiUrl: apiUrl,
|
|
18
|
+
instrument: instrument,
|
|
19
|
+
division: division
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
exports.OrderBookWidget = OrderBookWidget;
|
|
23
|
+
//# sourceMappingURL=OrderBookWidget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrderBookWidget.js","names":["_react","_interopRequireDefault","require","_Main","obj","__esModule","default","OrderBookWidget","_ref","apiUrl","instrument","division","createElement","Main","exports"],"sources":["../../../src/OrderBookWidget/OrderBookWidget.tsx"],"sourcesContent":["import React from 'react';\nimport { Main } from './Main';\nimport { OrderBookWidgetConfig } from './types';\n\nconst OrderBookWidget = ({\n apiUrl,\n instrument,\n division,\n}: OrderBookWidgetConfig) => (\n <Main\n apiUrl={apiUrl}\n instrument={instrument}\n division={division}\n />\n);\n\nexport { OrderBookWidget };\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AAA8B,SAAAD,uBAAAG,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAG9B,MAAMG,eAAe,GAAGC,IAAA;EAAA,IAAC;IACvBC,MAAM;IACNC,UAAU;IACVC;EACqB,CAAC,GAAAH,IAAA;EAAA,OACtBR,MAAA,CAAAM,OAAA,CAAAM,aAAA,CAACT,KAAA,CAAAU,IAAI;IACHJ,MAAM,EAAEA,MAAO;IACfC,UAAU,EAAEA,UAAW;IACvBC,QAAQ,EAAEA;EAAS,CACpB,CAAC;AAAA,CACH;AAACG,OAAA,CAAAP,eAAA,GAAAA,eAAA"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.Chart = void 0;
|
|
7
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
8
|
+
var _chart = require("chart.js");
|
|
9
|
+
var _chartjsPluginZoom = _interopRequireDefault(require("chartjs-plugin-zoom"));
|
|
10
|
+
var _reactChartjs = require("react-chartjs-2");
|
|
11
|
+
var _config = require("./config");
|
|
12
|
+
var _utils = require("./utils");
|
|
13
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
14
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
15
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
16
|
+
_chart.Chart.register(_chart.CategoryScale, _chart.LinearScale, _chart.BarElement, _chart.Tooltip, _chartjsPluginZoom.default);
|
|
17
|
+
const Chart = _ref => {
|
|
18
|
+
let {
|
|
19
|
+
data,
|
|
20
|
+
isTypeOrder
|
|
21
|
+
} = _ref;
|
|
22
|
+
const chartRef = (0, _react.useRef)(null);
|
|
23
|
+
const sell = data.buckets.map(item => Number(item.shortCountPercent) * -1);
|
|
24
|
+
const buy = data.buckets.map(item => Number(item.longCountPercent));
|
|
25
|
+
const price = data.buckets.map(item => Number(item.price));
|
|
26
|
+
const maxSell = Math.abs(Math.min(...sell));
|
|
27
|
+
const maxBuy = Math.max(...buy);
|
|
28
|
+
const rangeX = Math.ceil(Math.max(maxSell, maxBuy));
|
|
29
|
+
const minRangeY = Math.min(...price);
|
|
30
|
+
const maxRangeY = Math.max(...price);
|
|
31
|
+
const chartData = {
|
|
32
|
+
labels: price,
|
|
33
|
+
datasets: [{
|
|
34
|
+
data: sell,
|
|
35
|
+
backgroundColor: _config.colorNeg,
|
|
36
|
+
label: isTypeOrder ? 'Sell Orders' : 'Short Positions',
|
|
37
|
+
barPercentage: 1,
|
|
38
|
+
borderWidth: 1,
|
|
39
|
+
categoryPercentage: 1,
|
|
40
|
+
borderColor: 'transparent'
|
|
41
|
+
}, {
|
|
42
|
+
data: buy,
|
|
43
|
+
backgroundColor: _config.colorPos,
|
|
44
|
+
label: isTypeOrder ? 'Buy Orders' : 'Long Positions',
|
|
45
|
+
borderColor: 'transparent',
|
|
46
|
+
borderWidth: 1,
|
|
47
|
+
barPercentage: 1,
|
|
48
|
+
categoryPercentage: 1
|
|
49
|
+
}]
|
|
50
|
+
};
|
|
51
|
+
(0, _react.useEffect)(() => {
|
|
52
|
+
if (chartRef && chartRef.current) {
|
|
53
|
+
chartRef.current.zoomScale('y', (0, _utils.getInitialRange)(price), 'none');
|
|
54
|
+
}
|
|
55
|
+
}, [price]);
|
|
56
|
+
return _react.default.createElement("div", {
|
|
57
|
+
className: "w-full"
|
|
58
|
+
}, _react.default.createElement("div", {
|
|
59
|
+
className: "mb-0 ml-[70px] mr-2.5 mt-[30px] flex justify-between text-xs text-darkGrey"
|
|
60
|
+
}, isTypeOrder ? _react.default.createElement(_react.default.Fragment, null, _react.default.createElement("div", null, "Sell"), _react.default.createElement("div", null, "Open Orders"), _react.default.createElement("div", null, "Buy")) : _react.default.createElement(_react.default.Fragment, null, _react.default.createElement("div", null, "Short"), _react.default.createElement("div", null, "Open Positions"), _react.default.createElement("div", null, "Long"))), _react.default.createElement(_reactChartjs.Bar, {
|
|
61
|
+
ref: chartRef,
|
|
62
|
+
options: (0, _config.getChartOptions)(rangeX, minRangeY, maxRangeY),
|
|
63
|
+
data: chartData
|
|
64
|
+
}));
|
|
65
|
+
};
|
|
66
|
+
exports.Chart = Chart;
|
|
67
|
+
//# sourceMappingURL=Chart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Chart.js","names":["_react","_interopRequireWildcard","require","_chart","_chartjsPluginZoom","_interopRequireDefault","_reactChartjs","_config","_utils","obj","__esModule","default","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","ChartJS","register","CategoryScale","LinearScale","BarElement","Tooltip","zoomPlugin","Chart","_ref","data","isTypeOrder","chartRef","useRef","sell","buckets","map","item","Number","shortCountPercent","buy","longCountPercent","price","maxSell","Math","abs","min","maxBuy","max","rangeX","ceil","minRangeY","maxRangeY","chartData","labels","datasets","backgroundColor","colorNeg","label","barPercentage","borderWidth","categoryPercentage","borderColor","colorPos","useEffect","current","zoomScale","getInitialRange","createElement","className","Fragment","Bar","ref","options","getChartOptions","exports"],"sources":["../../../../../src/OrderBookWidget/components/Chart/Chart.tsx"],"sourcesContent":["import React, { useRef, useEffect } from 'react';\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n BarElement,\n Tooltip,\n} from 'chart.js';\nimport zoomPlugin from 'chartjs-plugin-zoom';\nimport { Bar } from 'react-chartjs-2';\nimport type { ChartData } from 'chart.js';\nimport { colorNeg, colorPos, getChartOptions } from './config';\nimport { OrderBookData } from '../../types';\nimport { getInitialRange } from './utils';\n\nChartJS.register(CategoryScale, LinearScale, BarElement, Tooltip, zoomPlugin);\n\nexport const Chart = ({ data, isTypeOrder }: { data: OrderBookData, isTypeOrder: boolean }) => {\n const chartRef = useRef<ChartJS | null>(null);\n\n const sell = data.buckets.map((item) => Number(item.shortCountPercent) * -1);\n const buy = data.buckets.map((item) => Number(item.longCountPercent));\n const price = data.buckets.map((item) => Number(item.price));\n\n const maxSell = Math.abs(Math.min(...sell));\n const maxBuy = Math.max(...buy);\n const rangeX = Math.ceil((Math.max(maxSell, maxBuy)));\n const minRangeY = (Math.min(...price));\n const maxRangeY = (Math.max(...price));\n\n const chartData: ChartData<'bar'> = {\n labels: price,\n datasets: [\n {\n data: sell,\n backgroundColor: colorNeg,\n label: isTypeOrder ? 'Sell Orders' : 'Short Positions',\n barPercentage: 1,\n borderWidth: 1,\n categoryPercentage: 1,\n borderColor: 'transparent',\n },\n {\n data: buy,\n backgroundColor: colorPos,\n label: isTypeOrder ? 'Buy Orders' : 'Long Positions',\n borderColor: 'transparent',\n borderWidth: 1,\n barPercentage: 1,\n categoryPercentage: 1,\n },\n ],\n };\n\n useEffect(() => {\n if (chartRef && chartRef.current) {\n chartRef.current.zoomScale('y', getInitialRange(price), 'none');\n }\n }, [price]);\n\n return (\n <div className=\"w-full\">\n {/* @todo: set correct margin when new designs are available */}\n <div className=\"mb-0 ml-[70px] mr-2.5 mt-[30px] flex justify-between text-xs text-darkGrey\">\n {isTypeOrder ? (\n <>\n <div>Sell</div>\n <div>Open Orders</div>\n <div>Buy</div>\n </>\n ) : (\n <>\n <div>Short</div>\n <div>Open Positions</div>\n <div>Long</div>\n </>\n )}\n </div>\n <Bar\n ref={chartRef as any}\n options={getChartOptions(rangeX, minRangeY, maxRangeY)}\n data={chartData}\n />\n </div>\n );\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getChartOptions = exports.colorPos = exports.colorNeg = void 0;
|
|
7
|
+
const colorPos = '#4A87F1';
|
|
8
|
+
exports.colorPos = colorPos;
|
|
9
|
+
const colorNeg = '#00d37e';
|
|
10
|
+
exports.colorNeg = colorNeg;
|
|
11
|
+
const getChartOptions = (rangeX, minRangeY, maxRangeY) => ({
|
|
12
|
+
animation: {
|
|
13
|
+
duration: 0
|
|
14
|
+
},
|
|
15
|
+
transitions: {
|
|
16
|
+
zoom: {
|
|
17
|
+
animation: {
|
|
18
|
+
duration: 500
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
skipNull: true,
|
|
23
|
+
scales: {
|
|
24
|
+
x: {
|
|
25
|
+
min: rangeX * -1,
|
|
26
|
+
max: rangeX,
|
|
27
|
+
ticks: {
|
|
28
|
+
color: '#607890',
|
|
29
|
+
callback: tickValue => tickValue === 0 ? '%' : "".concat(Math.abs(Number(tickValue)), " %")
|
|
30
|
+
},
|
|
31
|
+
grid: {
|
|
32
|
+
color: '#d1d7e0'
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
y: {
|
|
36
|
+
bounds: 'ticks',
|
|
37
|
+
type: 'linear',
|
|
38
|
+
min: minRangeY,
|
|
39
|
+
max: maxRangeY,
|
|
40
|
+
stacked: true,
|
|
41
|
+
afterFit(scaleInstance) {
|
|
42
|
+
scaleInstance.width = 80;
|
|
43
|
+
},
|
|
44
|
+
ticks: {
|
|
45
|
+
color: '#607890'
|
|
46
|
+
},
|
|
47
|
+
grid: {
|
|
48
|
+
color: '#d1d7e0'
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
indexAxis: 'y',
|
|
53
|
+
responsive: true,
|
|
54
|
+
plugins: {
|
|
55
|
+
zoom: {
|
|
56
|
+
limits: {
|
|
57
|
+
y: {
|
|
58
|
+
min: minRangeY,
|
|
59
|
+
max: maxRangeY
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
pan: {
|
|
63
|
+
enabled: true,
|
|
64
|
+
modifierKey: 'shift',
|
|
65
|
+
mode: 'y'
|
|
66
|
+
},
|
|
67
|
+
zoom: {
|
|
68
|
+
wheel: {
|
|
69
|
+
enabled: true
|
|
70
|
+
},
|
|
71
|
+
pinch: {
|
|
72
|
+
enabled: true
|
|
73
|
+
},
|
|
74
|
+
drag: {
|
|
75
|
+
enabled: true
|
|
76
|
+
},
|
|
77
|
+
mode: 'y'
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
tooltip: {
|
|
81
|
+
position: 'nearest',
|
|
82
|
+
yAlign: 'bottom',
|
|
83
|
+
backgroundColor: 'rgba(255, 255, 255, 0.90)',
|
|
84
|
+
borderWidth: 1,
|
|
85
|
+
borderColor: '#607890',
|
|
86
|
+
titleColor: '#607890',
|
|
87
|
+
bodyColor: '#607890',
|
|
88
|
+
displayColors: false,
|
|
89
|
+
titleFont: {
|
|
90
|
+
size: 14,
|
|
91
|
+
weight: 'normal'
|
|
92
|
+
},
|
|
93
|
+
bodyFont: {
|
|
94
|
+
size: 14,
|
|
95
|
+
weight: 'normal'
|
|
96
|
+
},
|
|
97
|
+
padding: 8,
|
|
98
|
+
callbacks: {
|
|
99
|
+
title: context => "Price: ".concat(context[0].label),
|
|
100
|
+
label: context => "".concat(context.dataset.label, ": ").concat(Math.abs(Number(context.raw)), "%")
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
exports.getChartOptions = getChartOptions;
|
|
106
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","names":["colorPos","exports","colorNeg","getChartOptions","rangeX","minRangeY","maxRangeY","animation","duration","transitions","zoom","skipNull","scales","x","min","max","ticks","color","callback","tickValue","concat","Math","abs","Number","grid","y","bounds","type","stacked","afterFit","scaleInstance","width","indexAxis","responsive","plugins","limits","pan","enabled","modifierKey","mode","wheel","pinch","drag","tooltip","position","yAlign","backgroundColor","borderWidth","borderColor","titleColor","bodyColor","displayColors","titleFont","size","weight","bodyFont","padding","callbacks","title","context","label","dataset","raw"],"sources":["../../../../../src/OrderBookWidget/components/Chart/config.tsx"],"sourcesContent":["import type { ChartOptions } from 'chart.js';\n\nexport const colorPos = '#4A87F1';\nexport const colorNeg = '#00d37e';\n\nexport const getChartOptions = (rangeX: number, minRangeY: number, maxRangeY: number): ChartOptions<'bar'> => ({\n animation: {\n duration: 0,\n },\n transitions: {\n zoom: {\n animation: {\n duration: 500,\n },\n },\n },\n skipNull: true,\n scales: {\n x: {\n min: rangeX * -1,\n max: rangeX,\n ticks: {\n color: '#607890',\n callback: (tickValue) => (tickValue === 0 ? '%' : `${Math.abs(Number(tickValue))} %`),\n },\n grid: {\n color: '#d1d7e0',\n },\n },\n y: {\n bounds: 'ticks',\n type: 'linear',\n min: minRangeY,\n max: maxRangeY,\n stacked: true,\n afterFit(scaleInstance) {\n // eslint-disable-next-line no-param-reassign\n scaleInstance.width = 80;\n },\n ticks: {\n color: '#607890',\n },\n grid: {\n color: '#d1d7e0',\n },\n },\n },\n indexAxis: 'y' as const,\n responsive: true,\n plugins: {\n zoom: {\n limits: {\n y: {\n min: minRangeY,\n max: maxRangeY,\n },\n },\n pan: {\n enabled: true,\n modifierKey: 'shift',\n mode: 'y',\n },\n zoom: {\n wheel: {\n enabled: true,\n },\n pinch: {\n enabled: true,\n },\n drag: {\n enabled: true,\n },\n mode: 'y',\n },\n },\n tooltip: {\n position: 'nearest',\n yAlign: 'bottom',\n backgroundColor: 'rgba(255, 255, 255, 0.90)',\n borderWidth: 1,\n borderColor: '#607890',\n titleColor: '#607890',\n bodyColor: '#607890',\n displayColors: false,\n titleFont: {\n size: 14,\n weight: 'normal',\n },\n bodyFont: {\n size: 14,\n weight: 'normal',\n },\n padding: 8,\n callbacks: {\n title: (context) => `Price: ${context[0].label}`,\n label: (context) => `${context.dataset.label}: ${Math.abs(Number(context.raw))}%`,\n },\n },\n },\n});\n"],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getInitialRange = void 0;
|
|
7
|
+
const calculateQuartile = (sortedData, q) => {
|
|
8
|
+
const pos = (sortedData.length - 1) * q;
|
|
9
|
+
const base = Math.floor(pos);
|
|
10
|
+
const rest = pos - base;
|
|
11
|
+
if (sortedData[base + 1] !== undefined) {
|
|
12
|
+
return sortedData[base] + rest * (sortedData[base + 1] - sortedData[base]);
|
|
13
|
+
}
|
|
14
|
+
return sortedData[base];
|
|
15
|
+
};
|
|
16
|
+
const getInitialRange = data => ({
|
|
17
|
+
min: calculateQuartile(data, 0.25),
|
|
18
|
+
max: calculateQuartile(data, 0.75)
|
|
19
|
+
});
|
|
20
|
+
exports.getInitialRange = getInitialRange;
|
|
21
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","names":["calculateQuartile","sortedData","q","pos","length","base","Math","floor","rest","undefined","getInitialRange","data","min","max","exports"],"sources":["../../../../../src/OrderBookWidget/components/Chart/utils.tsx"],"sourcesContent":["const calculateQuartile = (sortedData: number[], q: number) => {\n const pos = ((sortedData.length) - 1) * q;\n const base = Math.floor(pos);\n const rest = pos - base;\n if ((sortedData[base + 1] !== undefined)) {\n return sortedData[base] + rest * (sortedData[base + 1] - sortedData[base]);\n }\n return sortedData[base];\n};\n\nexport const getInitialRange = (\n data: number[],\n) => ({ min: calculateQuartile(data, 0.25), max: calculateQuartile(data, 0.75) });\n"],"mappings":";;;;;;AAAA,MAAMA,iBAAiB,GAAGA,CAACC,UAAoB,EAAEC,CAAS,KAAK;EAC7D,MAAMC,GAAG,GAAG,CAAEF,UAAU,CAACG,MAAM,GAAI,CAAC,IAAIF,CAAC;EACzC,MAAMG,IAAI,GAAGC,IAAI,CAACC,KAAK,CAACJ,GAAG,CAAC;EAC5B,MAAMK,IAAI,GAAGL,GAAG,GAAGE,IAAI;EACvB,IAAKJ,UAAU,CAACI,IAAI,GAAG,CAAC,CAAC,KAAKI,SAAS,EAAG;IACxC,OAAOR,UAAU,CAACI,IAAI,CAAC,GAAGG,IAAI,IAAIP,UAAU,CAACI,IAAI,GAAG,CAAC,CAAC,GAAGJ,UAAU,CAACI,IAAI,CAAC,CAAC;EAC5E;EACA,OAAOJ,UAAU,CAACI,IAAI,CAAC;AACzB,CAAC;AAEM,MAAMK,eAAe,GAC1BC,IAAc,KACV;EAAEC,GAAG,EAAEZ,iBAAiB,CAACW,IAAI,EAAE,IAAI,CAAC;EAAEE,GAAG,EAAEb,iBAAiB,CAACW,IAAI,EAAE,IAAI;AAAE,CAAC,CAAC;AAACG,OAAA,CAAAJ,eAAA,GAAAA,eAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _react = _interopRequireDefault(require("react"));
|
|
4
|
+
var _reactDom = require("react-dom");
|
|
5
|
+
var _OrderBookWidget = require("./OrderBookWidget");
|
|
6
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
7
|
+
const {
|
|
8
|
+
apiUrl,
|
|
9
|
+
instrument,
|
|
10
|
+
division
|
|
11
|
+
} = window.orderBookWidgetConfig;
|
|
12
|
+
(0, _reactDom.render)(_react.default.createElement(_OrderBookWidget.OrderBookWidget, {
|
|
13
|
+
apiUrl: apiUrl,
|
|
14
|
+
instrument: instrument,
|
|
15
|
+
division: division
|
|
16
|
+
}), document.getElementById('order-book'));
|
|
17
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","names":["_react","_interopRequireDefault","require","_reactDom","_OrderBookWidget","obj","__esModule","default","apiUrl","instrument","division","window","orderBookWidgetConfig","render","createElement","OrderBookWidget","document","getElementById"],"sources":["../../../src/OrderBookWidget/render.tsx"],"sourcesContent":["import React from 'react';\nimport { render } from 'react-dom';\nimport { OrderBookWidget } from './OrderBookWidget';\n\nimport { OrderBookWidgetConfig } from './types';\n\ndeclare global {\n interface Window {\n orderBookWidgetConfig: OrderBookWidgetConfig;\n }\n}\n\nconst {\n apiUrl,\n instrument,\n division,\n} = window.orderBookWidgetConfig;\n\nrender(\n <OrderBookWidget\n apiUrl={apiUrl}\n instrument={instrument}\n division={division}\n />,\n document.getElementById('order-book'),\n);\n"],"mappings":";;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,SAAA,GAAAD,OAAA;AACA,IAAAE,gBAAA,GAAAF,OAAA;AAAoD,SAAAD,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAUpD,MAAM;EACJG,MAAM;EACNC,UAAU;EACVC;AACF,CAAC,GAAGC,MAAM,CAACC,qBAAqB;AAEhC,IAAAC,gBAAM,EACJb,MAAA,CAAAO,OAAA,CAAAO,aAAA,CAACV,gBAAA,CAAAW,eAAe;EACdP,MAAM,EAAEA,MAAO;EACfC,UAAU,EAAEA,UAAW;EACvBC,QAAQ,EAAEA;AAAS,CACpB,CAAC,EACFM,QAAQ,CAACC,cAAc,CAAC,YAAY,CACtC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.DataType = void 0;
|
|
7
|
+
let DataType = function (DataType) {
|
|
8
|
+
DataType["Order"] = "ORDER";
|
|
9
|
+
DataType["Position"] = "POSITION";
|
|
10
|
+
return DataType;
|
|
11
|
+
}({});
|
|
12
|
+
exports.DataType = DataType;
|
|
13
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","names":["DataType","exports"],"sources":["../../../src/OrderBookWidget/types.ts"],"sourcesContent":["// @todo get from graphql schema\nexport interface OrderBookData {\n instrument: string;\n price: string;\n bucketWidth: string;\n buckets: {\n price: string;\n longCountPercent: string;\n shortCountPercent: string;\n }[];\n time: string;\n unixTime: string;\n region: string;\n division: string;\n}\n\nexport enum DataType {\n Order = 'ORDER',\n Position = 'POSITION',\n}\n\nexport interface OrderBookWidgetConfig {\n apiUrl: string;\n instrument: string;\n division: string;\n}\n\nexport interface MainProps {\n apiUrl: string;\n instrument: string;\n division: string;\n}\n"],"mappings":";;;;;;IAgBYA,QAAQ,aAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAAA,OAARA,QAAQ;AAAA;AAAAC,OAAA,CAAAD,QAAA,GAAAA,QAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getData = void 0;
|
|
7
|
+
var _types = require("./types");
|
|
8
|
+
const getFetchUrl = (apiUrl, instrument, division, dataType) => {
|
|
9
|
+
const recentHourlyDataType = dataType === _types.DataType.Order ? 'recentHourlyOrderBooks' : 'recentHourlyPositionBooks';
|
|
10
|
+
return "".concat(apiUrl, "/instruments/").concat(instrument, "/").concat(recentHourlyDataType, "?division=").concat(division);
|
|
11
|
+
};
|
|
12
|
+
const getData = (apiUrl, instrument, division, dataType) => {
|
|
13
|
+
const fetchUrl = getFetchUrl(apiUrl, instrument, division, dataType);
|
|
14
|
+
return fetch(fetchUrl).then(res => res.json());
|
|
15
|
+
};
|
|
16
|
+
exports.getData = getData;
|
|
17
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","names":["_types","require","getFetchUrl","apiUrl","instrument","division","dataType","recentHourlyDataType","DataType","Order","concat","getData","fetchUrl","fetch","then","res","json","exports"],"sources":["../../../src/OrderBookWidget/utils.ts"],"sourcesContent":["import { DataType } from './types';\n\nconst getFetchUrl = (\n apiUrl: string,\n instrument: string,\n division: string,\n dataType: string,\n) => {\n const recentHourlyDataType = dataType === DataType.Order ? 'recentHourlyOrderBooks' : 'recentHourlyPositionBooks';\n\n return `${apiUrl}/instruments/${instrument}/${recentHourlyDataType}?division=${division}`;\n};\n\nconst getData = (\n apiUrl: string,\n instrument: string,\n division: string,\n dataType: string,\n) => {\n const fetchUrl = getFetchUrl(apiUrl, instrument, division, dataType);\n\n return fetch(fetchUrl).then((res) => res.json());\n};\n\nexport { getData };\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAEA,MAAMC,WAAW,GAAGA,CAClBC,MAAc,EACdC,UAAkB,EAClBC,QAAgB,EAChBC,QAAgB,KACb;EACH,MAAMC,oBAAoB,GAAGD,QAAQ,KAAKE,eAAQ,CAACC,KAAK,GAAG,wBAAwB,GAAG,2BAA2B;EAEjH,UAAAC,MAAA,CAAUP,MAAM,mBAAAO,MAAA,CAAgBN,UAAU,OAAAM,MAAA,CAAIH,oBAAoB,gBAAAG,MAAA,CAAaL,QAAQ;AACzF,CAAC;AAED,MAAMM,OAAO,GAAGA,CACdR,MAAc,EACdC,UAAkB,EAClBC,QAAgB,EAChBC,QAAgB,KACb;EACH,MAAMM,QAAQ,GAAGV,WAAW,CAACC,MAAM,EAAEC,UAAU,EAAEC,QAAQ,EAAEC,QAAQ,CAAC;EAEpE,OAAOO,KAAK,CAACD,QAAQ,CAAC,CAACE,IAAI,CAAEC,GAAG,IAAKA,GAAG,CAACC,IAAI,CAAC,CAAC,CAAC;AAClD,CAAC;AAACC,OAAA,CAAAN,OAAA,GAAAA,OAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
var _types = require("./OrderBookWidget/types");
|
|
7
|
+
Object.keys(_types).forEach(function (key) {
|
|
8
|
+
if (key === "default" || key === "__esModule") return;
|
|
9
|
+
if (key in exports && exports[key] === _types[key]) return;
|
|
10
|
+
Object.defineProperty(exports, key, {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: function () {
|
|
13
|
+
return _types[key];
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
var _OrderBookWidget = require("./OrderBookWidget/OrderBookWidget");
|
|
18
|
+
Object.keys(_OrderBookWidget).forEach(function (key) {
|
|
19
|
+
if (key === "default" || key === "__esModule") return;
|
|
20
|
+
if (key in exports && exports[key] === _OrderBookWidget[key]) return;
|
|
21
|
+
Object.defineProperty(exports, key, {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: function () {
|
|
24
|
+
return _OrderBookWidget[key];
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["_types","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get","_OrderBookWidget"],"sources":["../../src/index.ts"],"sourcesContent":["export * from './OrderBookWidget/types';\nexport * from './OrderBookWidget/OrderBookWidget';\n"],"mappings":";;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,MAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,MAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAT,MAAA,CAAAK,GAAA;IAAA;EAAA;AAAA;AACA,IAAAK,gBAAA,GAAAT,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAO,gBAAA,EAAAN,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAK,gBAAA,CAAAL,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAC,gBAAA,CAAAL,GAAA;IAAA;EAAA;AAAA"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import React, { useState, useEffect } from 'react';
|
|
2
|
+
import { Button, ButtonVariant, ChartError, Spinner, SpinnerSize } from '@oanda/labs-widget-common';
|
|
3
|
+
import { Chart } from './components/Chart/Chart';
|
|
4
|
+
import { DataType } from './types';
|
|
5
|
+
import { getData } from './utils';
|
|
6
|
+
const Main = _ref => {
|
|
7
|
+
let {
|
|
8
|
+
apiUrl,
|
|
9
|
+
instrument,
|
|
10
|
+
division
|
|
11
|
+
} = _ref;
|
|
12
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
13
|
+
const [error, setError] = useState(undefined);
|
|
14
|
+
const [dataType, setDataType] = useState(DataType.Order);
|
|
15
|
+
const [data, setData] = useState(undefined);
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
setIsLoading(true);
|
|
18
|
+
setData(undefined);
|
|
19
|
+
setError(undefined);
|
|
20
|
+
getData(apiUrl, instrument, division, dataType).then(result => {
|
|
21
|
+
setIsLoading(false);
|
|
22
|
+
if (dataType === DataType.Order && (result === null || result === void 0 ? void 0 : result.orderBooks.length) > 0) {
|
|
23
|
+
setData(result.orderBooks);
|
|
24
|
+
} else if (dataType === DataType.Position && (result === null || result === void 0 ? void 0 : result.positionBooks.length) > 0) {
|
|
25
|
+
setData(result.positionBooks);
|
|
26
|
+
} else {
|
|
27
|
+
setData(undefined);
|
|
28
|
+
}
|
|
29
|
+
}).catch(err => {
|
|
30
|
+
setIsLoading(false);
|
|
31
|
+
setError(JSON.stringify(err));
|
|
32
|
+
});
|
|
33
|
+
}, [dataType, apiUrl, instrument, division]);
|
|
34
|
+
const isTypeOrder = dataType === DataType.Order;
|
|
35
|
+
return React.createElement("div", {
|
|
36
|
+
"data-testid": "order-book-widget",
|
|
37
|
+
className: "border border-solid border-grey p-4 text-sm text-black"
|
|
38
|
+
}, React.createElement("div", {
|
|
39
|
+
className: "flex gap-2"
|
|
40
|
+
}, React.createElement(Button, {
|
|
41
|
+
variant: isTypeOrder ? ButtonVariant.primary : ButtonVariant.secondary,
|
|
42
|
+
onClick: () => setDataType(DataType.Order)
|
|
43
|
+
}, "Order Book"), React.createElement(Button, {
|
|
44
|
+
variant: isTypeOrder ? ButtonVariant.secondary : ButtonVariant.primary,
|
|
45
|
+
onClick: () => setDataType(DataType.Position)
|
|
46
|
+
}, "Position Book")), React.createElement("div", {
|
|
47
|
+
className: "relative h-[600px] w-full"
|
|
48
|
+
}, error && React.createElement("div", {
|
|
49
|
+
className: "absolute left-0 top-0 flex h-full w-full items-center justify-center bg-lightGrey/[0.4]"
|
|
50
|
+
}, React.createElement(ChartError, null)), isLoading && React.createElement("div", {
|
|
51
|
+
className: "absolute left-0 top-0 flex h-full w-full items-center justify-center bg-lightGrey/[0.4]"
|
|
52
|
+
}, React.createElement(Spinner, {
|
|
53
|
+
size: SpinnerSize.lg
|
|
54
|
+
})), data && React.createElement("div", {
|
|
55
|
+
className: "absolute left-0 top-0 flex h-full w-full"
|
|
56
|
+
}, React.createElement(Chart, {
|
|
57
|
+
data: data[data.length - 1],
|
|
58
|
+
isTypeOrder: isTypeOrder
|
|
59
|
+
}))));
|
|
60
|
+
};
|
|
61
|
+
export { Main };
|
|
62
|
+
//# sourceMappingURL=Main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Main.js","names":["React","useState","useEffect","Button","ButtonVariant","ChartError","Spinner","SpinnerSize","Chart","DataType","getData","Main","_ref","apiUrl","instrument","division","isLoading","setIsLoading","error","setError","undefined","dataType","setDataType","Order","data","setData","then","result","orderBooks","length","Position","positionBooks","catch","err","JSON","stringify","isTypeOrder","createElement","className","variant","primary","secondary","onClick","size","lg"],"sources":["../../../src/OrderBookWidget/Main.tsx"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport {\n Button, ButtonVariant, ChartError, Spinner, SpinnerSize,\n} from '@oanda/labs-widget-common';\nimport { Chart } from './components/Chart/Chart';\nimport { DataType, MainProps, OrderBookData } from './types';\nimport { getData } from './utils';\n\nconst Main = ({\n apiUrl,\n instrument,\n division,\n}: MainProps) => {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | undefined>(undefined);\n const [dataType, setDataType] = useState(DataType.Order);\n const [data, setData] = useState<OrderBookData[] | undefined>(undefined);\n\n useEffect(() => {\n setIsLoading(true);\n setData(undefined);\n setError(undefined);\n\n getData(apiUrl, instrument, division, dataType)\n .then((result) => {\n setIsLoading(false);\n if (dataType === DataType.Order && result?.orderBooks.length > 0) {\n setData(result.orderBooks);\n } else if (dataType === DataType.Position && result?.positionBooks.length > 0) {\n setData(result.positionBooks);\n } else {\n setData(undefined);\n }\n }).catch((err) => {\n setIsLoading(false);\n setError(JSON.stringify(err));\n });\n }, [dataType, apiUrl, instrument, division]);\n\n const isTypeOrder = dataType === DataType.Order;\n\n return (\n <div data-testid=\"order-book-widget\" className=\"border border-solid border-grey p-4 text-sm text-black\">\n <div className=\"flex gap-2\">\n <Button\n variant={isTypeOrder ? ButtonVariant.primary : ButtonVariant.secondary}\n onClick={() => setDataType(DataType.Order)}\n >\n Order Book\n </Button>\n <Button\n variant={isTypeOrder ? ButtonVariant.secondary : ButtonVariant.primary}\n onClick={() => setDataType(DataType.Position)}\n >\n Position Book\n </Button>\n </div>\n {/* @todo: chart height */}\n <div className=\"relative h-[600px] w-full\">\n {error && (\n <div className=\"absolute left-0 top-0 flex h-full w-full items-center justify-center bg-lightGrey/[0.4]\">\n <ChartError />\n </div>\n )}\n {isLoading && (\n <div className=\"absolute left-0 top-0 flex h-full w-full items-center justify-center bg-lightGrey/[0.4]\">\n <Spinner size={SpinnerSize.lg} />\n </div>\n )}\n {data && (\n <div className=\"absolute left-0 top-0 flex h-full w-full\">\n <Chart data={data[data.length - 1]} isTypeOrder={isTypeOrder} />\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport { Main };\n"],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Main } from './Main';
|
|
3
|
+
const OrderBookWidget = _ref => {
|
|
4
|
+
let {
|
|
5
|
+
apiUrl,
|
|
6
|
+
instrument,
|
|
7
|
+
division
|
|
8
|
+
} = _ref;
|
|
9
|
+
return React.createElement(Main, {
|
|
10
|
+
apiUrl: apiUrl,
|
|
11
|
+
instrument: instrument,
|
|
12
|
+
division: division
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
export { OrderBookWidget };
|
|
16
|
+
//# sourceMappingURL=OrderBookWidget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrderBookWidget.js","names":["React","Main","OrderBookWidget","_ref","apiUrl","instrument","division","createElement"],"sources":["../../../src/OrderBookWidget/OrderBookWidget.tsx"],"sourcesContent":["import React from 'react';\nimport { Main } from './Main';\nimport { OrderBookWidgetConfig } from './types';\n\nconst OrderBookWidget = ({\n apiUrl,\n instrument,\n division,\n}: OrderBookWidgetConfig) => (\n <Main\n apiUrl={apiUrl}\n instrument={instrument}\n division={division}\n />\n);\n\nexport { OrderBookWidget };\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,IAAI,QAAQ,QAAQ;AAG7B,MAAMC,eAAe,GAAGC,IAAA;EAAA,IAAC;IACvBC,MAAM;IACNC,UAAU;IACVC;EACqB,CAAC,GAAAH,IAAA;EAAA,OACtBH,KAAA,CAAAO,aAAA,CAACN,IAAI;IACHG,MAAM,EAAEA,MAAO;IACfC,UAAU,EAAEA,UAAW;IACvBC,QAAQ,EAAEA;EAAS,CACpB,CAAC;AAAA,CACH;AAED,SAASJ,eAAe"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import React, { useRef, useEffect } from 'react';
|
|
2
|
+
import { Chart as ChartJS, CategoryScale, LinearScale, BarElement, Tooltip } from 'chart.js';
|
|
3
|
+
import zoomPlugin from 'chartjs-plugin-zoom';
|
|
4
|
+
import { Bar } from 'react-chartjs-2';
|
|
5
|
+
import { colorNeg, colorPos, getChartOptions } from './config';
|
|
6
|
+
import { getInitialRange } from './utils';
|
|
7
|
+
ChartJS.register(CategoryScale, LinearScale, BarElement, Tooltip, zoomPlugin);
|
|
8
|
+
export const Chart = _ref => {
|
|
9
|
+
let {
|
|
10
|
+
data,
|
|
11
|
+
isTypeOrder
|
|
12
|
+
} = _ref;
|
|
13
|
+
const chartRef = useRef(null);
|
|
14
|
+
const sell = data.buckets.map(item => Number(item.shortCountPercent) * -1);
|
|
15
|
+
const buy = data.buckets.map(item => Number(item.longCountPercent));
|
|
16
|
+
const price = data.buckets.map(item => Number(item.price));
|
|
17
|
+
const maxSell = Math.abs(Math.min(...sell));
|
|
18
|
+
const maxBuy = Math.max(...buy);
|
|
19
|
+
const rangeX = Math.ceil(Math.max(maxSell, maxBuy));
|
|
20
|
+
const minRangeY = Math.min(...price);
|
|
21
|
+
const maxRangeY = Math.max(...price);
|
|
22
|
+
const chartData = {
|
|
23
|
+
labels: price,
|
|
24
|
+
datasets: [{
|
|
25
|
+
data: sell,
|
|
26
|
+
backgroundColor: colorNeg,
|
|
27
|
+
label: isTypeOrder ? 'Sell Orders' : 'Short Positions',
|
|
28
|
+
barPercentage: 1,
|
|
29
|
+
borderWidth: 1,
|
|
30
|
+
categoryPercentage: 1,
|
|
31
|
+
borderColor: 'transparent'
|
|
32
|
+
}, {
|
|
33
|
+
data: buy,
|
|
34
|
+
backgroundColor: colorPos,
|
|
35
|
+
label: isTypeOrder ? 'Buy Orders' : 'Long Positions',
|
|
36
|
+
borderColor: 'transparent',
|
|
37
|
+
borderWidth: 1,
|
|
38
|
+
barPercentage: 1,
|
|
39
|
+
categoryPercentage: 1
|
|
40
|
+
}]
|
|
41
|
+
};
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
if (chartRef && chartRef.current) {
|
|
44
|
+
chartRef.current.zoomScale('y', getInitialRange(price), 'none');
|
|
45
|
+
}
|
|
46
|
+
}, [price]);
|
|
47
|
+
return React.createElement("div", {
|
|
48
|
+
className: "w-full"
|
|
49
|
+
}, React.createElement("div", {
|
|
50
|
+
className: "mb-0 ml-[70px] mr-2.5 mt-[30px] flex justify-between text-xs text-darkGrey"
|
|
51
|
+
}, isTypeOrder ? React.createElement(React.Fragment, null, React.createElement("div", null, "Sell"), React.createElement("div", null, "Open Orders"), React.createElement("div", null, "Buy")) : React.createElement(React.Fragment, null, React.createElement("div", null, "Short"), React.createElement("div", null, "Open Positions"), React.createElement("div", null, "Long"))), React.createElement(Bar, {
|
|
52
|
+
ref: chartRef,
|
|
53
|
+
options: getChartOptions(rangeX, minRangeY, maxRangeY),
|
|
54
|
+
data: chartData
|
|
55
|
+
}));
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=Chart.js.map
|