@oanda/labs-order-book-widget 1.0.70 → 1.0.72

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.
Files changed (73) hide show
  1. package/CHANGELOG.md +548 -0
  2. package/dist/main/OrderBookWidget/ChartWithData.js +62 -0
  3. package/dist/main/OrderBookWidget/ChartWithData.js.map +1 -0
  4. package/dist/main/OrderBookWidget/Main.js +46 -0
  5. package/dist/main/OrderBookWidget/Main.js.map +1 -0
  6. package/dist/main/OrderBookWidget/OrderBookWidget.js +2 -2
  7. package/dist/main/OrderBookWidget/OrderBookWidget.js.map +1 -1
  8. package/dist/main/OrderBookWidget/components/Chart/Chart.js +16 -7
  9. package/dist/main/OrderBookWidget/components/Chart/Chart.js.map +1 -1
  10. package/dist/main/OrderBookWidget/components/Chart/constants.js +5 -3
  11. package/dist/main/OrderBookWidget/components/Chart/constants.js.map +1 -1
  12. package/dist/main/OrderBookWidget/components/Chart/formatters.js +10 -4
  13. package/dist/main/OrderBookWidget/components/Chart/formatters.js.map +1 -1
  14. package/dist/main/OrderBookWidget/components/Chart/getOption.js +81 -36
  15. package/dist/main/OrderBookWidget/components/Chart/getOption.js.map +1 -1
  16. package/dist/main/OrderBookWidget/components/Chart/types.js.map +1 -1
  17. package/dist/main/OrderBookWidget/config.js +69 -1
  18. package/dist/main/OrderBookWidget/config.js.map +1 -1
  19. package/dist/main/OrderBookWidget/types.js +20 -0
  20. package/dist/main/OrderBookWidget/types.js.map +1 -1
  21. package/dist/main/translations/sources/en.json +3 -0
  22. package/dist/main/translations/sources/zh_TW.json +3 -0
  23. package/dist/module/OrderBookWidget/ChartWithData.js +55 -0
  24. package/dist/module/OrderBookWidget/ChartWithData.js.map +1 -0
  25. package/dist/module/OrderBookWidget/Main.js +38 -0
  26. package/dist/module/OrderBookWidget/Main.js.map +1 -0
  27. package/dist/module/OrderBookWidget/OrderBookWidget.js +2 -2
  28. package/dist/module/OrderBookWidget/OrderBookWidget.js.map +1 -1
  29. package/dist/module/OrderBookWidget/components/Chart/Chart.js +17 -8
  30. package/dist/module/OrderBookWidget/components/Chart/Chart.js.map +1 -1
  31. package/dist/module/OrderBookWidget/components/Chart/constants.js +4 -2
  32. package/dist/module/OrderBookWidget/components/Chart/constants.js.map +1 -1
  33. package/dist/module/OrderBookWidget/components/Chart/formatters.js +10 -4
  34. package/dist/module/OrderBookWidget/components/Chart/formatters.js.map +1 -1
  35. package/dist/module/OrderBookWidget/components/Chart/getOption.js +80 -35
  36. package/dist/module/OrderBookWidget/components/Chart/getOption.js.map +1 -1
  37. package/dist/module/OrderBookWidget/components/Chart/types.js.map +1 -1
  38. package/dist/module/OrderBookWidget/config.js +69 -1
  39. package/dist/module/OrderBookWidget/config.js.map +1 -1
  40. package/dist/module/OrderBookWidget/types.js +19 -1
  41. package/dist/module/OrderBookWidget/types.js.map +1 -1
  42. package/dist/module/translations/sources/en.json +3 -0
  43. package/dist/module/translations/sources/zh_TW.json +3 -0
  44. package/dist/types/OrderBookWidget/ChartWithData.d.ts +4 -0
  45. package/dist/types/OrderBookWidget/Main.d.ts +4 -0
  46. package/dist/types/OrderBookWidget/components/Chart/Chart.d.ts +1 -1
  47. package/dist/types/OrderBookWidget/components/Chart/constants.d.ts +4 -2
  48. package/dist/types/OrderBookWidget/components/Chart/getOption.d.ts +16 -1
  49. package/dist/types/OrderBookWidget/components/Chart/types.d.ts +11 -1
  50. package/dist/types/OrderBookWidget/config.d.ts +7 -1
  51. package/dist/types/OrderBookWidget/types.d.ts +26 -3
  52. package/package.json +3 -3
  53. package/src/OrderBookWidget/ChartWithData.tsx +78 -0
  54. package/src/OrderBookWidget/Main.tsx +40 -0
  55. package/src/OrderBookWidget/OrderBookWidget.tsx +2 -2
  56. package/src/OrderBookWidget/components/Chart/Chart.tsx +12 -6
  57. package/src/OrderBookWidget/components/Chart/constants.ts +4 -2
  58. package/src/OrderBookWidget/components/Chart/formatters.ts +6 -4
  59. package/src/OrderBookWidget/components/Chart/getOption.ts +93 -39
  60. package/src/OrderBookWidget/components/Chart/types.ts +11 -3
  61. package/src/OrderBookWidget/config.ts +70 -1
  62. package/src/OrderBookWidget/types.ts +28 -3
  63. package/src/translations/sources/en.json +3 -0
  64. package/src/translations/sources/zh_TW.json +3 -0
  65. package/test/Main.test.tsx +129 -0
  66. package/test/chartOptions.test.ts +20 -0
  67. package/dist/main/OrderBookWidget/Widget.js +0 -61
  68. package/dist/main/OrderBookWidget/Widget.js.map +0 -1
  69. package/dist/module/OrderBookWidget/Widget.js +0 -53
  70. package/dist/module/OrderBookWidget/Widget.js.map +0 -1
  71. package/dist/types/OrderBookWidget/Widget.d.ts +0 -4
  72. package/src/OrderBookWidget/Widget.tsx +0 -62
  73. package/test/Widget.test.tsx +0 -71
@@ -1,4 +1,5 @@
1
1
  import { BookType } from '../gql/types/graphql';
2
+ import { InstrumentId } from './types';
2
3
  const navigationConfig = [{
3
4
  id: BookType.Order,
4
5
  label: 'order_book'
@@ -6,5 +7,72 @@ const navigationConfig = [{
6
7
  id: BookType.Position,
7
8
  label: 'position_book'
8
9
  }];
9
- export { navigationConfig };
10
+ const instrumentSelectConfig = [{
11
+ id: InstrumentId.EUR_AUD,
12
+ label: 'EUR/AUD'
13
+ }, {
14
+ id: InstrumentId.EUR_GBP,
15
+ label: 'EUR/GBP'
16
+ }, {
17
+ id: InstrumentId.EUR_JPY,
18
+ label: 'EUR/JPY'
19
+ }, {
20
+ id: InstrumentId.EUR_USD,
21
+ label: 'EUR/USD'
22
+ }, {
23
+ id: InstrumentId.EUR_CHF,
24
+ label: 'EUR/CHF'
25
+ }, {
26
+ id: InstrumentId.USD_CHF,
27
+ label: 'USD/CHF'
28
+ }, {
29
+ id: InstrumentId.USD_JPY,
30
+ label: 'USD/JPY'
31
+ }, {
32
+ id: InstrumentId.USD_CAD,
33
+ label: 'USD/CAD'
34
+ }, {
35
+ id: InstrumentId.GBP_USD,
36
+ label: 'GBP/USD'
37
+ }, {
38
+ id: InstrumentId.GBP_JPY,
39
+ label: 'GBP/JPY'
40
+ }, {
41
+ id: InstrumentId.GBP_CHF,
42
+ label: 'GBP/CHF'
43
+ }, {
44
+ id: InstrumentId.AUD_JPY,
45
+ label: 'AUD/JPY'
46
+ }, {
47
+ id: InstrumentId.AUD_USD,
48
+ label: 'AUD/USD'
49
+ }, {
50
+ id: InstrumentId.NZD_USD,
51
+ label: 'NZD/USD'
52
+ }, {
53
+ id: InstrumentId.XAU_USD,
54
+ label: 'XAU/USD'
55
+ }, {
56
+ id: InstrumentId.XAG_USD,
57
+ label: 'XAG/USD'
58
+ }];
59
+ const instrumentPrecisionConfig = {
60
+ [InstrumentId.EUR_AUD]: 5,
61
+ [InstrumentId.EUR_GBP]: 5,
62
+ [InstrumentId.EUR_JPY]: 3,
63
+ [InstrumentId.EUR_USD]: 5,
64
+ [InstrumentId.EUR_CHF]: 5,
65
+ [InstrumentId.USD_CHF]: 5,
66
+ [InstrumentId.USD_JPY]: 3,
67
+ [InstrumentId.USD_CAD]: 5,
68
+ [InstrumentId.GBP_USD]: 5,
69
+ [InstrumentId.GBP_JPY]: 3,
70
+ [InstrumentId.GBP_CHF]: 5,
71
+ [InstrumentId.AUD_JPY]: 3,
72
+ [InstrumentId.AUD_USD]: 5,
73
+ [InstrumentId.NZD_USD]: 5,
74
+ [InstrumentId.XAU_USD]: 3,
75
+ [InstrumentId.XAG_USD]: 5
76
+ };
77
+ export { navigationConfig, instrumentSelectConfig, instrumentPrecisionConfig };
10
78
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","names":["BookType","navigationConfig","id","Order","label","Position"],"sources":["../../../src/OrderBookWidget/config.ts"],"sourcesContent":["import { BookType } from '../gql/types/graphql';\n\nconst navigationConfig = [{\n id: BookType.Order,\n label: 'order_book',\n}, {\n id: BookType.Position,\n label: 'position_book',\n}];\n\nexport { navigationConfig };\n"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,sBAAsB;AAE/C,MAAMC,gBAAgB,GAAG,CAAC;EACxBC,EAAE,EAAEF,QAAQ,CAACG,KAAK;EAClBC,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,QAAQ,CAACK,QAAQ;EACrBD,KAAK,EAAE;AACT,CAAC,CAAC;AAEF,SAASH,gBAAgB"}
1
+ {"version":3,"file":"config.js","names":["BookType","InstrumentId","navigationConfig","id","Order","label","Position","instrumentSelectConfig","EUR_AUD","EUR_GBP","EUR_JPY","EUR_USD","EUR_CHF","USD_CHF","USD_JPY","USD_CAD","GBP_USD","GBP_JPY","GBP_CHF","AUD_JPY","AUD_USD","NZD_USD","XAU_USD","XAG_USD","instrumentPrecisionConfig"],"sources":["../../../src/OrderBookWidget/config.ts"],"sourcesContent":["import { BookType } from '../gql/types/graphql';\nimport { InstrumentId } from './types';\n\nconst navigationConfig = [{\n id: BookType.Order,\n label: 'order_book',\n}, {\n id: BookType.Position,\n label: 'position_book',\n}];\n\nconst instrumentSelectConfig = [{\n id: InstrumentId.EUR_AUD,\n label: 'EUR/AUD',\n}, {\n id: InstrumentId.EUR_GBP,\n label: 'EUR/GBP',\n}, {\n id: InstrumentId.EUR_JPY,\n label: 'EUR/JPY',\n}, {\n id: InstrumentId.EUR_USD,\n label: 'EUR/USD',\n}, {\n id: InstrumentId.EUR_CHF,\n label: 'EUR/CHF',\n}, {\n id: InstrumentId.USD_CHF,\n label: 'USD/CHF',\n}, {\n id: InstrumentId.USD_JPY,\n label: 'USD/JPY',\n}, {\n id: InstrumentId.USD_CAD,\n label: 'USD/CAD',\n}, {\n id: InstrumentId.GBP_USD,\n label: 'GBP/USD',\n}, {\n id: InstrumentId.GBP_JPY,\n label: 'GBP/JPY',\n}, {\n id: InstrumentId.GBP_CHF,\n label: 'GBP/CHF',\n}, {\n id: InstrumentId.AUD_JPY,\n label: 'AUD/JPY',\n}, {\n id: InstrumentId.AUD_USD,\n label: 'AUD/USD',\n}, {\n id: InstrumentId.NZD_USD,\n label: 'NZD/USD',\n}, {\n id: InstrumentId.XAU_USD,\n label: 'XAU/USD',\n}, {\n id: InstrumentId.XAG_USD,\n label: 'XAG/USD',\n}];\n\nconst instrumentPrecisionConfig: Record<InstrumentId, number> = {\n [InstrumentId.EUR_AUD]: 5,\n [InstrumentId.EUR_GBP]: 5,\n [InstrumentId.EUR_JPY]: 3,\n [InstrumentId.EUR_USD]: 5,\n [InstrumentId.EUR_CHF]: 5,\n [InstrumentId.USD_CHF]: 5,\n [InstrumentId.USD_JPY]: 3,\n [InstrumentId.USD_CAD]: 5,\n [InstrumentId.GBP_USD]: 5,\n [InstrumentId.GBP_JPY]: 3,\n [InstrumentId.GBP_CHF]: 5,\n [InstrumentId.AUD_JPY]: 3,\n [InstrumentId.AUD_USD]: 5,\n [InstrumentId.NZD_USD]: 5,\n [InstrumentId.XAU_USD]: 3,\n [InstrumentId.XAG_USD]: 5,\n};\nexport { navigationConfig, instrumentSelectConfig, instrumentPrecisionConfig };\n"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,sBAAsB;AAC/C,SAASC,YAAY,QAAQ,SAAS;AAEtC,MAAMC,gBAAgB,GAAG,CAAC;EACxBC,EAAE,EAAEH,QAAQ,CAACI,KAAK;EAClBC,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEH,QAAQ,CAACM,QAAQ;EACrBD,KAAK,EAAE;AACT,CAAC,CAAC;AAEF,MAAME,sBAAsB,GAAG,CAAC;EAC9BJ,EAAE,EAAEF,YAAY,CAACO,OAAO;EACxBH,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACQ,OAAO;EACxBJ,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACS,OAAO;EACxBL,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACU,OAAO;EACxBN,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACW,OAAO;EACxBP,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACY,OAAO;EACxBR,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACa,OAAO;EACxBT,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACc,OAAO;EACxBV,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACe,OAAO;EACxBX,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACgB,OAAO;EACxBZ,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACiB,OAAO;EACxBb,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACkB,OAAO;EACxBd,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACmB,OAAO;EACxBf,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACoB,OAAO;EACxBhB,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACqB,OAAO;EACxBjB,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACsB,OAAO;EACxBlB,KAAK,EAAE;AACT,CAAC,CAAC;AAEF,MAAMmB,yBAAuD,GAAG;EAC9D,CAACvB,YAAY,CAACO,OAAO,GAAG,CAAC;EACzB,CAACP,YAAY,CAACQ,OAAO,GAAG,CAAC;EACzB,CAACR,YAAY,CAACS,OAAO,GAAG,CAAC;EACzB,CAACT,YAAY,CAACU,OAAO,GAAG,CAAC;EACzB,CAACV,YAAY,CAACW,OAAO,GAAG,CAAC;EACzB,CAACX,YAAY,CAACY,OAAO,GAAG,CAAC;EACzB,CAACZ,YAAY,CAACa,OAAO,GAAG,CAAC;EACzB,CAACb,YAAY,CAACc,OAAO,GAAG,CAAC;EACzB,CAACd,YAAY,CAACe,OAAO,GAAG,CAAC;EACzB,CAACf,YAAY,CAACgB,OAAO,GAAG,CAAC;EACzB,CAAChB,YAAY,CAACiB,OAAO,GAAG,CAAC;EACzB,CAACjB,YAAY,CAACkB,OAAO,GAAG,CAAC;EACzB,CAAClB,YAAY,CAACmB,OAAO,GAAG,CAAC;EACzB,CAACnB,YAAY,CAACoB,OAAO,GAAG,CAAC;EACzB,CAACpB,YAAY,CAACqB,OAAO,GAAG,CAAC;EACzB,CAACrB,YAAY,CAACsB,OAAO,GAAG;AAC1B,CAAC;AACD,SAASrB,gBAAgB,EAAEK,sBAAsB,EAAEiB,yBAAyB"}
@@ -1,2 +1,20 @@
1
- export {};
1
+ export let InstrumentId = function (InstrumentId) {
2
+ InstrumentId["EUR_AUD"] = "EUR_AUD";
3
+ InstrumentId["EUR_GBP"] = "EUR_GBP";
4
+ InstrumentId["EUR_JPY"] = "EUR_JPY";
5
+ InstrumentId["EUR_USD"] = "EUR_USD";
6
+ InstrumentId["EUR_CHF"] = "EUR_CHF";
7
+ InstrumentId["USD_CHF"] = "USD_CHF";
8
+ InstrumentId["USD_JPY"] = "USD_JPY";
9
+ InstrumentId["USD_CAD"] = "USD_CAD";
10
+ InstrumentId["GBP_USD"] = "GBP_USD";
11
+ InstrumentId["GBP_JPY"] = "GBP_JPY";
12
+ InstrumentId["GBP_CHF"] = "GBP_CHF";
13
+ InstrumentId["AUD_JPY"] = "AUD_JPY";
14
+ InstrumentId["AUD_USD"] = "AUD_USD";
15
+ InstrumentId["NZD_USD"] = "NZD_USD";
16
+ InstrumentId["XAU_USD"] = "XAU_USD";
17
+ InstrumentId["XAG_USD"] = "XAG_USD";
18
+ return InstrumentId;
19
+ }({});
2
20
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../../src/OrderBookWidget/types.ts"],"sourcesContent":["import { Theme } from '@oanda/labs-widget-common';\nimport { Locale } from '@oanda/mono-i18n';\n\nexport interface OrderBookWidgetConfig {\n graphqlUrl: string;\n instrument: string;\n locale: Locale;\n theme?: Theme;\n}\n\nexport interface OrderBookWrapperConfig extends OrderBookWidgetConfig {\n renderElementId: string;\n}\n\nexport interface WidgetProps {\n instrument: string;\n}\n"],"mappings":""}
1
+ {"version":3,"file":"types.js","names":["InstrumentId"],"sources":["../../../src/OrderBookWidget/types.ts"],"sourcesContent":["import { Theme } from '@oanda/labs-widget-common';\nimport { Locale } from '@oanda/mono-i18n';\nimport { BookType } from '../gql/types/graphql';\n\nexport interface OrderBookWidgetConfig {\n graphqlUrl: string;\n instrument: InstrumentId;\n locale: Locale;\n theme?: Theme;\n}\n\nexport interface OrderBookWrapperConfig extends OrderBookWidgetConfig {\n renderElementId: string;\n}\n\nexport interface MainProps {\n instrument?: InstrumentId;\n}\n\nexport interface ChartWithDataProps {\n instrument: InstrumentId;\n bookType: BookType;\n}\n\nexport enum InstrumentId {\n EUR_AUD = 'EUR_AUD',\n EUR_GBP = 'EUR_GBP',\n EUR_JPY = 'EUR_JPY',\n EUR_USD = 'EUR_USD',\n EUR_CHF = 'EUR_CHF',\n USD_CHF = 'USD_CHF',\n USD_JPY = 'USD_JPY',\n USD_CAD = 'USD_CAD',\n GBP_USD = 'GBP_USD',\n GBP_JPY = 'GBP_JPY',\n GBP_CHF = 'GBP_CHF',\n AUD_JPY = 'AUD_JPY',\n AUD_USD = 'AUD_USD',\n NZD_USD = 'NZD_USD',\n XAU_USD = 'XAU_USD',\n XAG_USD = 'XAG_USD',\n}\n"],"mappings":"AAwBA,WAAYA,YAAY,aAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAA,OAAZA,YAAY;AAAA"}
@@ -1,4 +1,5 @@
1
1
  {
2
+ "buy": "Buy",
2
3
  "data_unavailable": "Data unavailable",
3
4
  "long": "Long",
4
5
  "long_positions": "Long Positions",
@@ -9,6 +10,8 @@
9
10
  "position_book": "Position Book",
10
11
  "price": "Price",
11
12
  "reset_zoom": "Reset Zoom",
13
+ "select_instrument": "Select instrument",
14
+ "sell": "Sell",
12
15
  "sell_orders": "Sell Orders",
13
16
  "short": "Short",
14
17
  "short_positions": "Short Positions",
@@ -1,4 +1,5 @@
1
1
  {
2
+ "buy": "買進",
2
3
  "data_unavailable": "沒有數據",
3
4
  "long": "長",
4
5
  "long_positions": "長倉",
@@ -9,6 +10,8 @@
9
10
  "position_book": "倉位手冊",
10
11
  "price": "價格",
11
12
  "reset_zoom": "重置比例",
13
+ "select_instrument": "選擇證券",
14
+ "sell": "賣出",
12
15
  "sell_orders": "賣單",
13
16
  "short": "短",
14
17
  "short_positions": "短倉",
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ import { ChartWithDataProps } from './types';
3
+ declare const ChartWithData: ({ instrument, bookType, }: ChartWithDataProps) => JSX.Element;
4
+ export { ChartWithData };
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ import { MainProps } from './types';
3
+ declare const Main: ({ instrument }: MainProps) => JSX.Element;
4
+ export { Main };
@@ -1,3 +1,3 @@
1
1
  /// <reference types="react" />
2
2
  import { ChartProps } from './types';
3
- export declare const Chart: ({ data, isOrderBook }: ChartProps) => JSX.Element;
3
+ export declare const Chart: ({ data, isOrderBook, precision }: ChartProps) => JSX.Element;
@@ -1,6 +1,8 @@
1
1
  export declare const INITIAL_BARS = 80;
2
2
  export declare const X_LABEL_SIZE = 40;
3
- export declare const Y_LABEL_SIZE_MOBILE = 35;
3
+ export declare const Y_LABEL_SIZE_MOBILE = 50;
4
4
  export declare const Y_LABEL_SIZE_DESKTOP = 120;
5
5
  export declare const CHART_WIDTH = 9999;
6
- export declare const CHART_HEIGHT = 450;
6
+ export declare const CHART_HEIGHT_DESKTOP = 450;
7
+ export declare const CHART_HEIGHT_MOBILE = 390;
8
+ export declare const ZOOM_CONTROL_HEIGHT = 40;
@@ -1,5 +1,5 @@
1
1
  import { GetOptionType, GetResponsiveOptionsProps } from './types';
2
- export declare const getDesktopOption: ({ isDark, isOrderBook }: GetResponsiveOptionsProps) => {
2
+ export declare const getResponsiveOption: ({ isDark, isOrderBook, isDesktop, lang, }: GetResponsiveOptionsProps) => {
3
3
  grid: {
4
4
  name: string;
5
5
  top: string;
@@ -7,6 +7,21 @@ export declare const getDesktopOption: ({ isDark, isOrderBook }: GetResponsiveOp
7
7
  right: string;
8
8
  bottom: string;
9
9
  }[];
10
+ yAxis: {
11
+ axisLabel: {
12
+ margin: number;
13
+ };
14
+ };
15
+ series: {
16
+ type: string;
17
+ name: string;
18
+ id: string;
19
+ markLine: {
20
+ label: {
21
+ padding: number[];
22
+ };
23
+ };
24
+ }[];
10
25
  graphic: ({
11
26
  top: number | undefined;
12
27
  bottom: number | undefined;
@@ -3,16 +3,26 @@ import { GetOrderPositionBooksQuery } from '../../../gql/types/graphql';
3
3
  export interface ChartProps {
4
4
  data: GetOrderPositionBooksQuery;
5
5
  isOrderBook: boolean;
6
+ precision: number;
6
7
  }
7
8
  export interface GetResponsiveOptionsProps {
9
+ isDesktop: boolean;
8
10
  isDark: boolean;
9
11
  isOrderBook: boolean;
12
+ lang: (label: string) => string;
10
13
  }
11
14
  export interface GetOptionProps {
12
15
  data: GetOrderPositionBooksQuery;
13
16
  precision: number;
14
17
  isDark: boolean;
15
18
  isOrderBook: boolean;
19
+ isDesktop: boolean;
20
+ lang: (label: string) => string;
16
21
  }
17
22
  export type GetOptionType = (props: GetOptionProps) => EChartsOption;
18
- export type TooltipFormatterType = (data: number[], precision: number, isOrderBook: boolean) => string;
23
+ export type TooltipFormatterType = (props: {
24
+ data: number[];
25
+ precision: number;
26
+ isOrderBook: boolean;
27
+ lang: (label: string) => string;
28
+ }) => string;
@@ -1,6 +1,12 @@
1
1
  import { BookType } from '../gql/types/graphql';
2
+ import { InstrumentId } from './types';
2
3
  declare const navigationConfig: {
3
4
  id: BookType;
4
5
  label: string;
5
6
  }[];
6
- export { navigationConfig };
7
+ declare const instrumentSelectConfig: {
8
+ id: InstrumentId;
9
+ label: string;
10
+ }[];
11
+ declare const instrumentPrecisionConfig: Record<InstrumentId, number>;
12
+ export { navigationConfig, instrumentSelectConfig, instrumentPrecisionConfig };
@@ -1,14 +1,37 @@
1
1
  import { Theme } from '@oanda/labs-widget-common';
2
2
  import { Locale } from '@oanda/mono-i18n';
3
+ import { BookType } from '../gql/types/graphql';
3
4
  export interface OrderBookWidgetConfig {
4
5
  graphqlUrl: string;
5
- instrument: string;
6
+ instrument: InstrumentId;
6
7
  locale: Locale;
7
8
  theme?: Theme;
8
9
  }
9
10
  export interface OrderBookWrapperConfig extends OrderBookWidgetConfig {
10
11
  renderElementId: string;
11
12
  }
12
- export interface WidgetProps {
13
- instrument: string;
13
+ export interface MainProps {
14
+ instrument?: InstrumentId;
15
+ }
16
+ export interface ChartWithDataProps {
17
+ instrument: InstrumentId;
18
+ bookType: BookType;
19
+ }
20
+ export declare enum InstrumentId {
21
+ EUR_AUD = "EUR_AUD",
22
+ EUR_GBP = "EUR_GBP",
23
+ EUR_JPY = "EUR_JPY",
24
+ EUR_USD = "EUR_USD",
25
+ EUR_CHF = "EUR_CHF",
26
+ USD_CHF = "USD_CHF",
27
+ USD_JPY = "USD_JPY",
28
+ USD_CAD = "USD_CAD",
29
+ GBP_USD = "GBP_USD",
30
+ GBP_JPY = "GBP_JPY",
31
+ GBP_CHF = "GBP_CHF",
32
+ AUD_JPY = "AUD_JPY",
33
+ AUD_USD = "AUD_USD",
34
+ NZD_USD = "NZD_USD",
35
+ XAU_USD = "XAU_USD",
36
+ XAG_USD = "XAG_USD"
14
37
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oanda/labs-order-book-widget",
3
- "version": "1.0.70",
3
+ "version": "1.0.72",
4
4
  "description": "Labs Order Book Widget",
5
5
  "main": "dist/main/index.js",
6
6
  "module": "dist/module/index.js",
@@ -13,7 +13,7 @@
13
13
  "license": "UNLICENSED",
14
14
  "dependencies": {
15
15
  "@apollo/client": "3.7.17",
16
- "@oanda/labs-widget-common": "^1.0.70",
16
+ "@oanda/labs-widget-common": "^1.0.72",
17
17
  "@oanda/mono-i18n": "9.0.0",
18
18
  "classnames": "2.3.2",
19
19
  "echarts": "5.4.3",
@@ -25,5 +25,5 @@
25
25
  "@graphql-codegen/client-preset": "4.1.0",
26
26
  "@graphql-codegen/typescript": "4.0.1"
27
27
  },
28
- "gitHead": "2dafe2b860ab4c1be9a490b33e23ff51b5ab7608"
28
+ "gitHead": "4a224fac68b6b607825b7ac6802ea0b5c499996e"
29
29
  }
@@ -0,0 +1,78 @@
1
+ import React from 'react';
2
+ import { useQuery } from '@apollo/client';
3
+ import { useMediaQuery } from 'usehooks-ts';
4
+ import classnames from 'classnames';
5
+ import { ChartError, Spinner, SpinnerSize } from '@oanda/labs-widget-common';
6
+ import { ChartWithDataProps } from './types';
7
+ import { getOrderPositionBooks } from '../gql/getOrderPositionBooks';
8
+ import { GetOrderPositionBooksQuery, GetOrderPositionBooksQueryVariables, BookType } from '../gql/types/graphql';
9
+ import { Chart } from './components/Chart/Chart';
10
+ import { instrumentPrecisionConfig } from './config';
11
+
12
+ const ChartWithData = ({
13
+ instrument,
14
+ bookType,
15
+ }: ChartWithDataProps) => {
16
+ const isDesktop = useMediaQuery('(min-width: 768px)');
17
+
18
+ const { loading, data, error } = useQuery<
19
+ GetOrderPositionBooksQuery,
20
+ GetOrderPositionBooksQueryVariables
21
+ >(getOrderPositionBooks, {
22
+ variables: {
23
+ instrument,
24
+ bookType,
25
+ recentHours: 1,
26
+ },
27
+ });
28
+
29
+ const isError = (!loading && !data?.orderPositionBooks[0]?.price) || !!error;
30
+
31
+ return (
32
+ <div className={classnames('lw-relative lw-w-full', {
33
+ 'lw-h-[450px]': isDesktop,
34
+ 'lw-h-[390px]': !isDesktop,
35
+ })}
36
+ >
37
+ {isError && (
38
+ <div className={
39
+ classnames(
40
+ 'lw-absolute lw-left-0 lw-top-0 lw-flex lw-w-full lw-items-center lw-justify-center lw-border lw-border-solid lw-border-border-primary',
41
+ {
42
+ 'lw-h-full': isDesktop,
43
+ 'lw-h-[calc(100%-40px)]': !isDesktop,
44
+ },
45
+ )
46
+ }
47
+ >
48
+ <ChartError />
49
+ </div>
50
+ )}
51
+ {loading && (
52
+ <div className={
53
+ classnames(
54
+ 'lw-absolute lw-left-0 lw-top-0 lw-flex lw-w-full lw-items-center lw-justify-center lw-border lw-border-solid lw-border-border-primary',
55
+ {
56
+ 'lw-h-full': isDesktop,
57
+ 'lw-h-[calc(100%-40px)]': !isDesktop,
58
+ },
59
+ )
60
+ }
61
+ >
62
+ <Spinner size={SpinnerSize.lg} />
63
+ </div>
64
+ )}
65
+ {data && (
66
+ <div className="lw-absolute lw-left-0 lw-top-0 lw-flex lw-h-full lw-w-full">
67
+ <Chart
68
+ data={data}
69
+ isOrderBook={bookType === BookType.Order}
70
+ precision={instrumentPrecisionConfig[instrument]}
71
+ />
72
+ </div>
73
+ )}
74
+ </div>
75
+ );
76
+ };
77
+
78
+ export { ChartWithData };
@@ -0,0 +1,40 @@
1
+ import React, { useState } from 'react';
2
+ import { Select, Tabs } from '@oanda/labs-widget-common';
3
+ import { useLocale } from '@oanda/mono-i18n';
4
+ import { InstrumentId, MainProps } from './types';
5
+ import { BookType } from '../gql/types/graphql';
6
+ import { instrumentSelectConfig, navigationConfig } from './config';
7
+ import { ChartWithData } from './ChartWithData';
8
+
9
+ const Main = ({ instrument }: MainProps) => {
10
+ const [bookType, setBookType] = useState(BookType.Order);
11
+ const [toolInstrument, setToolInstrument] = useState(instrumentSelectConfig[0]);
12
+ const { lang } = useLocale();
13
+
14
+ return (
15
+ <div data-testid="order-book-widget" className="lw-p-4 lw-pt-0 lw-text-sm lw-tracking-normal lw-text-black">
16
+ <Tabs
17
+ activeTab={bookType}
18
+ handleClick={(e) => setBookType(e.currentTarget.value as BookType)}
19
+ labelCallback={lang}
20
+ items={navigationConfig}
21
+ mobileFullWidth
22
+ />
23
+ {!instrument && (
24
+ <div className="lw-mb-6 lw-mt-12">
25
+ <Select
26
+ selectLabel={lang('select_instrument')}
27
+ options={instrumentSelectConfig}
28
+ selectedOption={toolInstrument}
29
+ setSelectedOption={
30
+ (val) => setToolInstrument(val as { id: InstrumentId; label: string })
31
+ }
32
+ />
33
+ </div>
34
+ )}
35
+ <ChartWithData instrument={instrument || toolInstrument.id} bookType={bookType} />
36
+ </div>
37
+ );
38
+ };
39
+
40
+ export { Main };
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import { ApolloClient, InMemoryCache, ApolloProvider } from '@apollo/client';
3
3
  import { LocaleProvider } from '@oanda/mono-i18n';
4
4
  import { ThemeProvider, getLocale } from '@oanda/labs-widget-common';
5
- import { Widget } from './Widget';
5
+ import { Main } from './Main';
6
6
  import { OrderBookWidgetConfig } from './types';
7
7
  import { translations } from '../translations';
8
8
 
@@ -21,7 +21,7 @@ const OrderBookWidget = ({
21
21
  <ThemeProvider theme={theme}>
22
22
  <LocaleProvider locale={getLocale(locale)} translations={translations}>
23
23
  <ApolloProvider client={client}>
24
- <Widget instrument={instrument} />
24
+ <Main instrument={instrument} />
25
25
  </ApolloProvider>
26
26
  </LocaleProvider>
27
27
  </ThemeProvider>
@@ -5,13 +5,15 @@ import {
5
5
  Theme, ThemeContext, colorPalette, getChartTheme,
6
6
  } from '@oanda/labs-widget-common';
7
7
  import { useMediaQuery } from 'usehooks-ts';
8
- import { getDesktopOption, getOption } from './getOption';
8
+ import { useLocale } from '@oanda/mono-i18n';
9
+ import { getResponsiveOption, getOption } from './getOption';
9
10
  import { ChartProps } from './types';
10
11
 
11
12
  registerTheme('dark_theme', getChartTheme(Theme.Dark));
12
13
  registerTheme('light_theme', getChartTheme(Theme.Light));
13
14
 
14
- export const Chart = ({ data, isOrderBook }: ChartProps) => {
15
+ export const Chart = ({ data, isOrderBook, precision }: ChartProps) => {
16
+ const { lang } = useLocale();
15
17
  const isDark = useContext(ThemeContext) === Theme.Dark;
16
18
  const echartRef = useRef(null);
17
19
  const isDesktop = useMediaQuery('(min-width: 768px)');
@@ -48,9 +50,13 @@ export const Chart = ({ data, isOrderBook }: ChartProps) => {
48
50
  // @ts-ignore
49
51
  const echartInstance = echartRef.current.getEchartsInstance() as EChartsType;
50
52
 
51
- echartInstance.setOption(getDesktopOption({ isDark, isOrderBook }));
53
+ echartInstance.setOption(
54
+ getResponsiveOption({
55
+ isDark, isOrderBook, isDesktop, lang,
56
+ }),
57
+ );
52
58
  }
53
- }, [echartRef, isDesktop, isDark, isOrderBook]);
59
+ }, [echartRef, isDesktop, isDark, isOrderBook, lang]);
54
60
 
55
61
  return (
56
62
  <div className="lw-relative lw-w-full">
@@ -60,11 +66,11 @@ export const Chart = ({ data, isOrderBook }: ChartProps) => {
60
66
  ref={echartRef}
61
67
  theme={isDark ? 'dark_theme' : 'light_theme'}
62
68
  style={{
63
- height: '450px',
69
+ height: isDesktop ? '450px' : '390px',
64
70
  width: '100%',
65
71
  }}
66
72
  option={getOption({
67
- data, precision: 4, isDark, isOrderBook,
73
+ data, precision, isDark, isOrderBook, isDesktop, lang,
68
74
  })}
69
75
  />
70
76
  )}
@@ -1,7 +1,9 @@
1
1
  export const INITIAL_BARS = 80;
2
2
 
3
3
  export const X_LABEL_SIZE = 40;
4
- export const Y_LABEL_SIZE_MOBILE = 35;
4
+ export const Y_LABEL_SIZE_MOBILE = 50;
5
5
  export const Y_LABEL_SIZE_DESKTOP = 120;
6
6
  export const CHART_WIDTH = 9999;
7
- export const CHART_HEIGHT = 450;
7
+ export const CHART_HEIGHT_DESKTOP = 450;
8
+ export const CHART_HEIGHT_MOBILE = 390;
9
+ export const ZOOM_CONTROL_HEIGHT = 40;
@@ -1,9 +1,11 @@
1
1
  import { TooltipFormatterType } from './types';
2
2
 
3
- const tooltipFormatter: TooltipFormatterType = (data, precision, isOrderBook) => {
4
- const priceText = `Price: ${data[0].toFixed(precision)}`;
5
- const buyText = data[1] ? `<br />${isOrderBook ? 'Buy' : 'Long positions'}: ${data[1]}%` : '';
6
- const sellText = data[2] ? `<br />${isOrderBook ? 'Sell' : 'Short positions'}: ${data[2] * -1}%` : '';
3
+ const tooltipFormatter: TooltipFormatterType = ({
4
+ data, precision, isOrderBook, lang,
5
+ }) => {
6
+ const priceText = `${lang('price')}: ${data[0].toFixed(precision)}`;
7
+ const buyText = data[1] ? `<br />${lang(isOrderBook ? 'buy' : 'long_positions')}: ${data[1]}%` : '';
8
+ const sellText = data[2] ? `<br />${lang(isOrderBook ? 'sell' : 'short_positions')}: ${data[2] * -1}%` : '';
7
9
 
8
10
  return priceText + buyText + sellText;
9
11
  };