@oanda/labs-sentiment-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.
Files changed (41) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/main/SentimentWidget/Main.js +41 -0
  3. package/dist/main/SentimentWidget/Main.js.map +1 -0
  4. package/dist/main/SentimentWidget/SentimentWidget.js +27 -0
  5. package/dist/main/SentimentWidget/SentimentWidget.js.map +1 -0
  6. package/dist/main/SentimentWidget/render.js +15 -0
  7. package/dist/main/SentimentWidget/render.js.map +1 -0
  8. package/dist/main/SentimentWidget/types.js +6 -0
  9. package/dist/main/SentimentWidget/types.js.map +1 -0
  10. package/dist/main/gql/getInstrumentSentiment.js +12 -0
  11. package/dist/main/gql/getInstrumentSentiment.js.map +1 -0
  12. package/dist/main/index.js +28 -0
  13. package/dist/main/index.js.map +1 -0
  14. package/dist/module/SentimentWidget/Main.js +34 -0
  15. package/dist/module/SentimentWidget/Main.js.map +1 -0
  16. package/dist/module/SentimentWidget/SentimentWidget.js +20 -0
  17. package/dist/module/SentimentWidget/SentimentWidget.js.map +1 -0
  18. package/dist/module/SentimentWidget/render.js +12 -0
  19. package/dist/module/SentimentWidget/render.js.map +1 -0
  20. package/dist/module/SentimentWidget/types.js +2 -0
  21. package/dist/module/SentimentWidget/types.js.map +1 -0
  22. package/dist/module/gql/getInstrumentSentiment.js +6 -0
  23. package/dist/module/gql/getInstrumentSentiment.js.map +1 -0
  24. package/dist/module/index.js +3 -0
  25. package/dist/module/index.js.map +1 -0
  26. package/dist/types/SentimentWidget/Main.d.ts +5 -0
  27. package/dist/types/SentimentWidget/SentimentWidget.d.ts +4 -0
  28. package/dist/types/SentimentWidget/render.d.ts +6 -0
  29. package/dist/types/SentimentWidget/types.d.ts +4 -0
  30. package/dist/types/gql/getInstrumentSentiment.d.ts +2 -0
  31. package/dist/types/index.d.ts +2 -0
  32. package/index.ts +1 -0
  33. package/package.json +18 -0
  34. package/src/SentimentWidget/Main.tsx +36 -0
  35. package/src/SentimentWidget/SentimentWidget.tsx +19 -0
  36. package/src/SentimentWidget/render.tsx +23 -0
  37. package/src/SentimentWidget/types.ts +4 -0
  38. package/src/gql/getInstrumentSentiment.ts +21 -0
  39. package/src/index.ts +2 -0
  40. package/test/Main.test.tsx +79 -0
  41. 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-sentiment-widget
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.Main = void 0;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _labsWidgetCommon = require("@oanda/labs-widget-common");
9
+ var _client = require("@apollo/client");
10
+ var _getInstrumentSentiment = require("../gql/getInstrumentSentiment");
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
+ const Main = _ref => {
13
+ let {
14
+ instrument
15
+ } = _ref;
16
+ const {
17
+ loading,
18
+ data,
19
+ error
20
+ } = (0, _client.useQuery)(_getInstrumentSentiment.getInstrumentSentiment, {
21
+ variables: {
22
+ division: 'OJ',
23
+ name: instrument
24
+ }
25
+ });
26
+ const {
27
+ sentiment
28
+ } = (data === null || data === void 0 ? void 0 : data.sentiment[0]) || {};
29
+ const isError = error || (sentiment === null || sentiment === void 0 ? void 0 : sentiment.shortPercent) === 0 && (sentiment === null || sentiment === void 0 ? void 0 : sentiment.longPercent) === 0 || (sentiment === null || sentiment === void 0 ? void 0 : sentiment.shortPercent) === undefined || (sentiment === null || sentiment === void 0 ? void 0 : sentiment.longPercent) === undefined;
30
+ return _react.default.createElement("div", {
31
+ "data-testid": "sentiment-widget",
32
+ className: "flex items-center justify-between border border-solid border-grey p-4 text-sm text-black"
33
+ }, !loading ? _react.default.createElement(_react.default.Fragment, null, _react.default.createElement("p", {
34
+ className: "mr-12 font-sans font-bold"
35
+ }, instrument), !isError && _react.default.createElement(_labsWidgetCommon.Sentiment, {
36
+ height: _labsWidgetCommon.SentimentHeight.md,
37
+ sentiment: sentiment
38
+ }), isError && _react.default.createElement(_labsWidgetCommon.Error, null)) : _react.default.createElement(_labsWidgetCommon.Spinner, null));
39
+ };
40
+ exports.Main = Main;
41
+ //# sourceMappingURL=Main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Main.js","names":["_react","_interopRequireDefault","require","_labsWidgetCommon","_client","_getInstrumentSentiment","obj","__esModule","default","Main","_ref","instrument","loading","data","error","useQuery","getInstrumentSentiment","variables","division","name","sentiment","isError","shortPercent","longPercent","undefined","createElement","className","Fragment","Sentiment","height","SentimentHeight","md","Error","Spinner","exports"],"sources":["../../../src/SentimentWidget/Main.tsx"],"sourcesContent":["import React from 'react';\nimport {\n Sentiment, SentimentHeight, Spinner, Error,\n} from '@oanda/labs-widget-common';\nimport { useQuery } from '@apollo/client';\nimport { getInstrumentSentiment } from '../gql/getInstrumentSentiment';\n\nconst Main = ({ instrument }: { instrument: string }) => {\n const { loading, data, error } = useQuery(getInstrumentSentiment, {\n variables: {\n division: 'OJ',\n name: instrument,\n },\n });\n\n const { sentiment } = data?.sentiment[0] || {};\n const isError = error\n || (sentiment?.shortPercent === 0 && sentiment?.longPercent === 0)\n || sentiment?.shortPercent === undefined\n || sentiment?.longPercent === undefined;\n\n return (\n <div data-testid=\"sentiment-widget\" className=\"flex items-center justify-between border border-solid border-grey p-4 text-sm text-black\">\n {!loading\n ? (\n <>\n <p className=\"mr-12 font-sans font-bold\">{instrument}</p>\n {!isError && <Sentiment height={SentimentHeight.md} sentiment={sentiment} />}\n {isError && <Error />}\n </>\n ) : <Spinner />}\n </div>\n );\n};\n\nexport { Main };\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,iBAAA,GAAAD,OAAA;AAGA,IAAAE,OAAA,GAAAF,OAAA;AACA,IAAAG,uBAAA,GAAAH,OAAA;AAAuE,SAAAD,uBAAAK,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEvE,MAAMG,IAAI,GAAGC,IAAA,IAA4C;EAAA,IAA3C;IAAEC;EAAmC,CAAC,GAAAD,IAAA;EAClD,MAAM;IAAEE,OAAO;IAAEC,IAAI;IAAEC;EAAM,CAAC,GAAG,IAAAC,gBAAQ,EAACC,8CAAsB,EAAE;IAChEC,SAAS,EAAE;MACTC,QAAQ,EAAE,IAAI;MACdC,IAAI,EAAER;IACR;EACF,CAAC,CAAC;EAEF,MAAM;IAAES;EAAU,CAAC,GAAG,CAAAP,IAAI,aAAJA,IAAI,uBAAJA,IAAI,CAAEO,SAAS,CAAC,CAAC,CAAC,KAAI,CAAC,CAAC;EAC9C,MAAMC,OAAO,GAAGP,KAAK,IACf,CAAAM,SAAS,aAATA,SAAS,uBAATA,SAAS,CAAEE,YAAY,MAAK,CAAC,IAAI,CAAAF,SAAS,aAATA,SAAS,uBAATA,SAAS,CAAEG,WAAW,MAAK,CAAE,IAC/D,CAAAH,SAAS,aAATA,SAAS,uBAATA,SAAS,CAAEE,YAAY,MAAKE,SAAS,IACrC,CAAAJ,SAAS,aAATA,SAAS,uBAATA,SAAS,CAAEG,WAAW,MAAKC,SAAS;EAEzC,OACExB,MAAA,CAAAQ,OAAA,CAAAiB,aAAA;IAAK,eAAY,kBAAkB;IAACC,SAAS,EAAC;EAA0F,GACrI,CAACd,OAAO,GAELZ,MAAA,CAAAQ,OAAA,CAAAiB,aAAA,CAAAzB,MAAA,CAAAQ,OAAA,CAAAmB,QAAA,QACE3B,MAAA,CAAAQ,OAAA,CAAAiB,aAAA;IAAGC,SAAS,EAAC;EAA2B,GAAEf,UAAc,CAAC,EACxD,CAACU,OAAO,IAAIrB,MAAA,CAAAQ,OAAA,CAAAiB,aAAA,CAACtB,iBAAA,CAAAyB,SAAS;IAACC,MAAM,EAAEC,iCAAe,CAACC,EAAG;IAACX,SAAS,EAAEA;EAAU,CAAE,CAAC,EAC3EC,OAAO,IAAIrB,MAAA,CAAAQ,OAAA,CAAAiB,aAAA,CAACtB,iBAAA,CAAA6B,KAAK,MAAE,CACpB,CAAC,GACDhC,MAAA,CAAAQ,OAAA,CAAAiB,aAAA,CAACtB,iBAAA,CAAA8B,OAAO,MAAE,CACb,CAAC;AAEV,CAAC;AAACC,OAAA,CAAAzB,IAAA,GAAAA,IAAA"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.SentimentWidget = void 0;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _client = require("@apollo/client");
9
+ var _Main = require("./Main");
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+ const SentimentWidget = _ref => {
12
+ let {
13
+ graphqlUrl,
14
+ instrument
15
+ } = _ref;
16
+ const client = new _client.ApolloClient({
17
+ uri: graphqlUrl,
18
+ cache: new _client.InMemoryCache()
19
+ });
20
+ return _react.default.createElement(_client.ApolloProvider, {
21
+ client: client
22
+ }, _react.default.createElement(_Main.Main, {
23
+ instrument: instrument
24
+ }));
25
+ };
26
+ exports.SentimentWidget = SentimentWidget;
27
+ //# sourceMappingURL=SentimentWidget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SentimentWidget.js","names":["_react","_interopRequireDefault","require","_client","_Main","obj","__esModule","default","SentimentWidget","_ref","graphqlUrl","instrument","client","ApolloClient","uri","cache","InMemoryCache","createElement","ApolloProvider","Main","exports"],"sources":["../../../src/SentimentWidget/SentimentWidget.tsx"],"sourcesContent":["import React from 'react';\nimport { ApolloClient, InMemoryCache, ApolloProvider } from '@apollo/client';\nimport { Main } from './Main';\nimport { SentimentWidgetConfig } from './types';\n\nconst SentimentWidget = ({ graphqlUrl, instrument }: SentimentWidgetConfig) => {\n const client = new ApolloClient({\n uri: graphqlUrl,\n cache: new InMemoryCache(),\n });\n\n return (\n <ApolloProvider client={client}>\n <Main instrument={instrument} />\n </ApolloProvider>\n );\n};\n\nexport { SentimentWidget };\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,KAAA,GAAAF,OAAA;AAA8B,SAAAD,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAG9B,MAAMG,eAAe,GAAGC,IAAA,IAAuD;EAAA,IAAtD;IAAEC,UAAU;IAAEC;EAAkC,CAAC,GAAAF,IAAA;EACxE,MAAMG,MAAM,GAAG,IAAIC,oBAAY,CAAC;IAC9BC,GAAG,EAAEJ,UAAU;IACfK,KAAK,EAAE,IAAIC,qBAAa,CAAC;EAC3B,CAAC,CAAC;EAEF,OACEhB,MAAA,CAAAO,OAAA,CAAAU,aAAA,CAACd,OAAA,CAAAe,cAAc;IAACN,MAAM,EAAEA;EAAO,GAC7BZ,MAAA,CAAAO,OAAA,CAAAU,aAAA,CAACb,KAAA,CAAAe,IAAI;IAACR,UAAU,EAAEA;EAAW,CAAE,CACjB,CAAC;AAErB,CAAC;AAACS,OAAA,CAAAZ,eAAA,GAAAA,eAAA"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ var _react = _interopRequireDefault(require("react"));
4
+ var _reactDom = require("react-dom");
5
+ var _SentimentWidget = require("./SentimentWidget");
6
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
7
+ const {
8
+ graphqlUrl,
9
+ instrument
10
+ } = window.sentimentWidgetConfig;
11
+ (0, _reactDom.render)(_react.default.createElement(_SentimentWidget.SentimentWidget, {
12
+ graphqlUrl: graphqlUrl,
13
+ instrument: instrument
14
+ }), document.getElementById('sentiment'));
15
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","names":["_react","_interopRequireDefault","require","_reactDom","_SentimentWidget","obj","__esModule","default","graphqlUrl","instrument","window","sentimentWidgetConfig","render","createElement","SentimentWidget","document","getElementById"],"sources":["../../../src/SentimentWidget/render.tsx"],"sourcesContent":["import React from 'react';\nimport { render } from 'react-dom';\nimport { SentimentWidget } from './SentimentWidget';\nimport { SentimentWidgetConfig } from './types';\n\ndeclare global {\n interface Window {\n sentimentWidgetConfig: SentimentWidgetConfig;\n }\n}\n\nconst {\n graphqlUrl,\n instrument,\n} = window.sentimentWidgetConfig;\n\nrender(\n <SentimentWidget\n graphqlUrl={graphqlUrl}\n instrument={instrument}\n />,\n document.getElementById('sentiment'),\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;AASpD,MAAM;EACJG,UAAU;EACVC;AACF,CAAC,GAAGC,MAAM,CAACC,qBAAqB;AAEhC,IAAAC,gBAAM,EACJZ,MAAA,CAAAO,OAAA,CAAAM,aAAA,CAACT,gBAAA,CAAAU,eAAe;EACdN,UAAU,EAAEA,UAAW;EACvBC,UAAU,EAAEA;AAAW,CACxB,CAAC,EACFM,QAAQ,CAACC,cAAc,CAAC,WAAW,CACrC,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../src/SentimentWidget/types.ts"],"sourcesContent":["export interface SentimentWidgetConfig {\n graphqlUrl: string;\n instrument: string;\n}\n"],"mappings":""}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getInstrumentSentiment = void 0;
7
+ var _client = require("@apollo/client");
8
+ var _templateObject;
9
+ function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
10
+ const getInstrumentSentiment = (0, _client.gql)(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n query GetInstrumentSentiment(\n $division: Division!\n $name: String!\n ) {\n sentiment(\n division: $division\n name: $name\n ) {\n name\n sentiment {\n shortPercent\n longPercent\n }\n }\n }\n"])));
11
+ exports.getInstrumentSentiment = getInstrumentSentiment;
12
+ //# sourceMappingURL=getInstrumentSentiment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getInstrumentSentiment.js","names":["_client","require","_templateObject","_taggedTemplateLiteral","strings","raw","slice","Object","freeze","defineProperties","value","getInstrumentSentiment","gql","exports"],"sources":["../../../src/gql/getInstrumentSentiment.ts"],"sourcesContent":["import { gql } from '@apollo/client';\n\nconst getInstrumentSentiment = gql`\n query GetInstrumentSentiment(\n $division: Division!\n $name: String!\n ) {\n sentiment(\n division: $division\n name: $name\n ) {\n name\n sentiment {\n shortPercent\n longPercent\n }\n }\n }\n`;\n\nexport { getInstrumentSentiment };\n"],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAAqC,IAAAC,eAAA;AAAA,SAAAC,uBAAAC,OAAA,EAAAC,GAAA,SAAAA,GAAA,IAAAA,GAAA,GAAAD,OAAA,CAAAE,KAAA,cAAAC,MAAA,CAAAC,MAAA,CAAAD,MAAA,CAAAE,gBAAA,CAAAL,OAAA,IAAAC,GAAA,IAAAK,KAAA,EAAAH,MAAA,CAAAC,MAAA,CAAAH,GAAA;AAErC,MAAMM,sBAAsB,OAAGC,WAAG,EAAAV,eAAA,KAAAA,eAAA,GAAAC,sBAAA,sQAgBjC;AAACU,OAAA,CAAAF,sBAAA,GAAAA,sBAAA"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _types = require("./SentimentWidget/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 _SentimentWidget = require("./SentimentWidget/SentimentWidget");
18
+ Object.keys(_SentimentWidget).forEach(function (key) {
19
+ if (key === "default" || key === "__esModule") return;
20
+ if (key in exports && exports[key] === _SentimentWidget[key]) return;
21
+ Object.defineProperty(exports, key, {
22
+ enumerable: true,
23
+ get: function () {
24
+ return _SentimentWidget[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","_SentimentWidget"],"sources":["../../src/index.ts"],"sourcesContent":["export * from './SentimentWidget/types';\nexport * from './SentimentWidget/SentimentWidget';\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,34 @@
1
+ import React from 'react';
2
+ import { Sentiment, SentimentHeight, Spinner, Error } from '@oanda/labs-widget-common';
3
+ import { useQuery } from '@apollo/client';
4
+ import { getInstrumentSentiment } from '../gql/getInstrumentSentiment';
5
+ const Main = _ref => {
6
+ let {
7
+ instrument
8
+ } = _ref;
9
+ const {
10
+ loading,
11
+ data,
12
+ error
13
+ } = useQuery(getInstrumentSentiment, {
14
+ variables: {
15
+ division: 'OJ',
16
+ name: instrument
17
+ }
18
+ });
19
+ const {
20
+ sentiment
21
+ } = (data === null || data === void 0 ? void 0 : data.sentiment[0]) || {};
22
+ const isError = error || (sentiment === null || sentiment === void 0 ? void 0 : sentiment.shortPercent) === 0 && (sentiment === null || sentiment === void 0 ? void 0 : sentiment.longPercent) === 0 || (sentiment === null || sentiment === void 0 ? void 0 : sentiment.shortPercent) === undefined || (sentiment === null || sentiment === void 0 ? void 0 : sentiment.longPercent) === undefined;
23
+ return React.createElement("div", {
24
+ "data-testid": "sentiment-widget",
25
+ className: "flex items-center justify-between border border-solid border-grey p-4 text-sm text-black"
26
+ }, !loading ? React.createElement(React.Fragment, null, React.createElement("p", {
27
+ className: "mr-12 font-sans font-bold"
28
+ }, instrument), !isError && React.createElement(Sentiment, {
29
+ height: SentimentHeight.md,
30
+ sentiment: sentiment
31
+ }), isError && React.createElement(Error, null)) : React.createElement(Spinner, null));
32
+ };
33
+ export { Main };
34
+ //# sourceMappingURL=Main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Main.js","names":["React","Sentiment","SentimentHeight","Spinner","Error","useQuery","getInstrumentSentiment","Main","_ref","instrument","loading","data","error","variables","division","name","sentiment","isError","shortPercent","longPercent","undefined","createElement","className","Fragment","height","md"],"sources":["../../../src/SentimentWidget/Main.tsx"],"sourcesContent":["import React from 'react';\nimport {\n Sentiment, SentimentHeight, Spinner, Error,\n} from '@oanda/labs-widget-common';\nimport { useQuery } from '@apollo/client';\nimport { getInstrumentSentiment } from '../gql/getInstrumentSentiment';\n\nconst Main = ({ instrument }: { instrument: string }) => {\n const { loading, data, error } = useQuery(getInstrumentSentiment, {\n variables: {\n division: 'OJ',\n name: instrument,\n },\n });\n\n const { sentiment } = data?.sentiment[0] || {};\n const isError = error\n || (sentiment?.shortPercent === 0 && sentiment?.longPercent === 0)\n || sentiment?.shortPercent === undefined\n || sentiment?.longPercent === undefined;\n\n return (\n <div data-testid=\"sentiment-widget\" className=\"flex items-center justify-between border border-solid border-grey p-4 text-sm text-black\">\n {!loading\n ? (\n <>\n <p className=\"mr-12 font-sans font-bold\">{instrument}</p>\n {!isError && <Sentiment height={SentimentHeight.md} sentiment={sentiment} />}\n {isError && <Error />}\n </>\n ) : <Spinner />}\n </div>\n );\n};\n\nexport { Main };\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SACEC,SAAS,EAAEC,eAAe,EAAEC,OAAO,EAAEC,KAAK,QACrC,2BAA2B;AAClC,SAASC,QAAQ,QAAQ,gBAAgB;AACzC,SAASC,sBAAsB,QAAQ,+BAA+B;AAEtE,MAAMC,IAAI,GAAGC,IAAA,IAA4C;EAAA,IAA3C;IAAEC;EAAmC,CAAC,GAAAD,IAAA;EAClD,MAAM;IAAEE,OAAO;IAAEC,IAAI;IAAEC;EAAM,CAAC,GAAGP,QAAQ,CAACC,sBAAsB,EAAE;IAChEO,SAAS,EAAE;MACTC,QAAQ,EAAE,IAAI;MACdC,IAAI,EAAEN;IACR;EACF,CAAC,CAAC;EAEF,MAAM;IAAEO;EAAU,CAAC,GAAG,CAAAL,IAAI,aAAJA,IAAI,uBAAJA,IAAI,CAAEK,SAAS,CAAC,CAAC,CAAC,KAAI,CAAC,CAAC;EAC9C,MAAMC,OAAO,GAAGL,KAAK,IACf,CAAAI,SAAS,aAATA,SAAS,uBAATA,SAAS,CAAEE,YAAY,MAAK,CAAC,IAAI,CAAAF,SAAS,aAATA,SAAS,uBAATA,SAAS,CAAEG,WAAW,MAAK,CAAE,IAC/D,CAAAH,SAAS,aAATA,SAAS,uBAATA,SAAS,CAAEE,YAAY,MAAKE,SAAS,IACrC,CAAAJ,SAAS,aAATA,SAAS,uBAATA,SAAS,CAAEG,WAAW,MAAKC,SAAS;EAEzC,OACEpB,KAAA,CAAAqB,aAAA;IAAK,eAAY,kBAAkB;IAACC,SAAS,EAAC;EAA0F,GACrI,CAACZ,OAAO,GAELV,KAAA,CAAAqB,aAAA,CAAArB,KAAA,CAAAuB,QAAA,QACEvB,KAAA,CAAAqB,aAAA;IAAGC,SAAS,EAAC;EAA2B,GAAEb,UAAc,CAAC,EACxD,CAACQ,OAAO,IAAIjB,KAAA,CAAAqB,aAAA,CAACpB,SAAS;IAACuB,MAAM,EAAEtB,eAAe,CAACuB,EAAG;IAACT,SAAS,EAAEA;EAAU,CAAE,CAAC,EAC3EC,OAAO,IAAIjB,KAAA,CAAAqB,aAAA,CAACjB,KAAK,MAAE,CACpB,CAAC,GACDJ,KAAA,CAAAqB,aAAA,CAAClB,OAAO,MAAE,CACb,CAAC;AAEV,CAAC;AAED,SAASI,IAAI"}
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ import { ApolloClient, InMemoryCache, ApolloProvider } from '@apollo/client';
3
+ import { Main } from './Main';
4
+ const SentimentWidget = _ref => {
5
+ let {
6
+ graphqlUrl,
7
+ instrument
8
+ } = _ref;
9
+ const client = new ApolloClient({
10
+ uri: graphqlUrl,
11
+ cache: new InMemoryCache()
12
+ });
13
+ return React.createElement(ApolloProvider, {
14
+ client: client
15
+ }, React.createElement(Main, {
16
+ instrument: instrument
17
+ }));
18
+ };
19
+ export { SentimentWidget };
20
+ //# sourceMappingURL=SentimentWidget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SentimentWidget.js","names":["React","ApolloClient","InMemoryCache","ApolloProvider","Main","SentimentWidget","_ref","graphqlUrl","instrument","client","uri","cache","createElement"],"sources":["../../../src/SentimentWidget/SentimentWidget.tsx"],"sourcesContent":["import React from 'react';\nimport { ApolloClient, InMemoryCache, ApolloProvider } from '@apollo/client';\nimport { Main } from './Main';\nimport { SentimentWidgetConfig } from './types';\n\nconst SentimentWidget = ({ graphqlUrl, instrument }: SentimentWidgetConfig) => {\n const client = new ApolloClient({\n uri: graphqlUrl,\n cache: new InMemoryCache(),\n });\n\n return (\n <ApolloProvider client={client}>\n <Main instrument={instrument} />\n </ApolloProvider>\n );\n};\n\nexport { SentimentWidget };\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,YAAY,EAAEC,aAAa,EAAEC,cAAc,QAAQ,gBAAgB;AAC5E,SAASC,IAAI,QAAQ,QAAQ;AAG7B,MAAMC,eAAe,GAAGC,IAAA,IAAuD;EAAA,IAAtD;IAAEC,UAAU;IAAEC;EAAkC,CAAC,GAAAF,IAAA;EACxE,MAAMG,MAAM,GAAG,IAAIR,YAAY,CAAC;IAC9BS,GAAG,EAAEH,UAAU;IACfI,KAAK,EAAE,IAAIT,aAAa,CAAC;EAC3B,CAAC,CAAC;EAEF,OACEF,KAAA,CAAAY,aAAA,CAACT,cAAc;IAACM,MAAM,EAAEA;EAAO,GAC7BT,KAAA,CAAAY,aAAA,CAACR,IAAI;IAACI,UAAU,EAAEA;EAAW,CAAE,CACjB,CAAC;AAErB,CAAC;AAED,SAASH,eAAe"}
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import { render } from 'react-dom';
3
+ import { SentimentWidget } from './SentimentWidget';
4
+ const {
5
+ graphqlUrl,
6
+ instrument
7
+ } = window.sentimentWidgetConfig;
8
+ render(React.createElement(SentimentWidget, {
9
+ graphqlUrl: graphqlUrl,
10
+ instrument: instrument
11
+ }), document.getElementById('sentiment'));
12
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","names":["React","render","SentimentWidget","graphqlUrl","instrument","window","sentimentWidgetConfig","createElement","document","getElementById"],"sources":["../../../src/SentimentWidget/render.tsx"],"sourcesContent":["import React from 'react';\nimport { render } from 'react-dom';\nimport { SentimentWidget } from './SentimentWidget';\nimport { SentimentWidgetConfig } from './types';\n\ndeclare global {\n interface Window {\n sentimentWidgetConfig: SentimentWidgetConfig;\n }\n}\n\nconst {\n graphqlUrl,\n instrument,\n} = window.sentimentWidgetConfig;\n\nrender(\n <SentimentWidget\n graphqlUrl={graphqlUrl}\n instrument={instrument}\n />,\n document.getElementById('sentiment'),\n);\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,MAAM,QAAQ,WAAW;AAClC,SAASC,eAAe,QAAQ,mBAAmB;AASnD,MAAM;EACJC,UAAU;EACVC;AACF,CAAC,GAAGC,MAAM,CAACC,qBAAqB;AAEhCL,MAAM,CACJD,KAAA,CAAAO,aAAA,CAACL,eAAe;EACdC,UAAU,EAAEA,UAAW;EACvBC,UAAU,EAAEA;AAAW,CACxB,CAAC,EACFI,QAAQ,CAACC,cAAc,CAAC,WAAW,CACrC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../src/SentimentWidget/types.ts"],"sourcesContent":["export interface SentimentWidgetConfig {\n graphqlUrl: string;\n instrument: string;\n}\n"],"mappings":""}
@@ -0,0 +1,6 @@
1
+ var _templateObject;
2
+ function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
3
+ import { gql } from '@apollo/client';
4
+ const getInstrumentSentiment = gql(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n query GetInstrumentSentiment(\n $division: Division!\n $name: String!\n ) {\n sentiment(\n division: $division\n name: $name\n ) {\n name\n sentiment {\n shortPercent\n longPercent\n }\n }\n }\n"])));
5
+ export { getInstrumentSentiment };
6
+ //# sourceMappingURL=getInstrumentSentiment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getInstrumentSentiment.js","names":["gql","getInstrumentSentiment","_templateObject","_taggedTemplateLiteral"],"sources":["../../../src/gql/getInstrumentSentiment.ts"],"sourcesContent":["import { gql } from '@apollo/client';\n\nconst getInstrumentSentiment = gql`\n query GetInstrumentSentiment(\n $division: Division!\n $name: String!\n ) {\n sentiment(\n division: $division\n name: $name\n ) {\n name\n sentiment {\n shortPercent\n longPercent\n }\n }\n }\n`;\n\nexport { getInstrumentSentiment };\n"],"mappings":";;AAAA,SAASA,GAAG,QAAQ,gBAAgB;AAEpC,MAAMC,sBAAsB,GAAGD,GAAG,CAAAE,eAAA,KAAAA,eAAA,GAAAC,sBAAA,sQAgBjC;AAED,SAASF,sBAAsB"}
@@ -0,0 +1,3 @@
1
+ export * from './SentimentWidget/types';
2
+ export * from './SentimentWidget/SentimentWidget';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/index.ts"],"sourcesContent":["export * from './SentimentWidget/types';\nexport * from './SentimentWidget/SentimentWidget';\n"],"mappings":"AAAA,cAAc,yBAAyB;AACvC,cAAc,mCAAmC"}
@@ -0,0 +1,5 @@
1
+ /// <reference types="react" />
2
+ declare const Main: ({ instrument }: {
3
+ instrument: string;
4
+ }) => JSX.Element;
5
+ export { Main };
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ import { SentimentWidgetConfig } from './types';
3
+ declare const SentimentWidget: ({ graphqlUrl, instrument }: SentimentWidgetConfig) => JSX.Element;
4
+ export { SentimentWidget };
@@ -0,0 +1,6 @@
1
+ import { SentimentWidgetConfig } from './types';
2
+ declare global {
3
+ interface Window {
4
+ sentimentWidgetConfig: SentimentWidgetConfig;
5
+ }
6
+ }
@@ -0,0 +1,4 @@
1
+ export interface SentimentWidgetConfig {
2
+ graphqlUrl: string;
3
+ instrument: string;
4
+ }
@@ -0,0 +1,2 @@
1
+ declare const getInstrumentSentiment: import("@apollo/client").DocumentNode;
2
+ export { getInstrumentSentiment };
@@ -0,0 +1,2 @@
1
+ export * from './SentimentWidget/types';
2
+ export * from './SentimentWidget/SentimentWidget';
package/index.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './src';
package/package.json ADDED
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "@oanda/labs-sentiment-widget",
3
+ "version": "1.0.0",
4
+ "description": "Labs Sentiment Widget",
5
+ "main": "dist/main/index.js",
6
+ "module": "dist/module/index.js",
7
+ "types": "dist/types/index.d.ts",
8
+ "scripts": {},
9
+ "keywords": [],
10
+ "author": "OANDA",
11
+ "license": "UNLICENSED",
12
+ "dependencies": {
13
+ "@apollo/client": "3.7.17",
14
+ "@oanda/labs-widget-common": "^1.0.0",
15
+ "graphql": "16.7.1"
16
+ },
17
+ "gitHead": "ec860bf52c63bedcf1e806288188f42bc9a0c3b3"
18
+ }
@@ -0,0 +1,36 @@
1
+ import React from 'react';
2
+ import {
3
+ Sentiment, SentimentHeight, Spinner, Error,
4
+ } from '@oanda/labs-widget-common';
5
+ import { useQuery } from '@apollo/client';
6
+ import { getInstrumentSentiment } from '../gql/getInstrumentSentiment';
7
+
8
+ const Main = ({ instrument }: { instrument: string }) => {
9
+ const { loading, data, error } = useQuery(getInstrumentSentiment, {
10
+ variables: {
11
+ division: 'OJ',
12
+ name: instrument,
13
+ },
14
+ });
15
+
16
+ const { sentiment } = data?.sentiment[0] || {};
17
+ const isError = error
18
+ || (sentiment?.shortPercent === 0 && sentiment?.longPercent === 0)
19
+ || sentiment?.shortPercent === undefined
20
+ || sentiment?.longPercent === undefined;
21
+
22
+ return (
23
+ <div data-testid="sentiment-widget" className="flex items-center justify-between border border-solid border-grey p-4 text-sm text-black">
24
+ {!loading
25
+ ? (
26
+ <>
27
+ <p className="mr-12 font-sans font-bold">{instrument}</p>
28
+ {!isError && <Sentiment height={SentimentHeight.md} sentiment={sentiment} />}
29
+ {isError && <Error />}
30
+ </>
31
+ ) : <Spinner />}
32
+ </div>
33
+ );
34
+ };
35
+
36
+ export { Main };
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import { ApolloClient, InMemoryCache, ApolloProvider } from '@apollo/client';
3
+ import { Main } from './Main';
4
+ import { SentimentWidgetConfig } from './types';
5
+
6
+ const SentimentWidget = ({ graphqlUrl, instrument }: SentimentWidgetConfig) => {
7
+ const client = new ApolloClient({
8
+ uri: graphqlUrl,
9
+ cache: new InMemoryCache(),
10
+ });
11
+
12
+ return (
13
+ <ApolloProvider client={client}>
14
+ <Main instrument={instrument} />
15
+ </ApolloProvider>
16
+ );
17
+ };
18
+
19
+ export { SentimentWidget };
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+ import { render } from 'react-dom';
3
+ import { SentimentWidget } from './SentimentWidget';
4
+ import { SentimentWidgetConfig } from './types';
5
+
6
+ declare global {
7
+ interface Window {
8
+ sentimentWidgetConfig: SentimentWidgetConfig;
9
+ }
10
+ }
11
+
12
+ const {
13
+ graphqlUrl,
14
+ instrument,
15
+ } = window.sentimentWidgetConfig;
16
+
17
+ render(
18
+ <SentimentWidget
19
+ graphqlUrl={graphqlUrl}
20
+ instrument={instrument}
21
+ />,
22
+ document.getElementById('sentiment'),
23
+ );
@@ -0,0 +1,4 @@
1
+ export interface SentimentWidgetConfig {
2
+ graphqlUrl: string;
3
+ instrument: string;
4
+ }
@@ -0,0 +1,21 @@
1
+ import { gql } from '@apollo/client';
2
+
3
+ const getInstrumentSentiment = gql`
4
+ query GetInstrumentSentiment(
5
+ $division: Division!
6
+ $name: String!
7
+ ) {
8
+ sentiment(
9
+ division: $division
10
+ name: $name
11
+ ) {
12
+ name
13
+ sentiment {
14
+ shortPercent
15
+ longPercent
16
+ }
17
+ }
18
+ }
19
+ `;
20
+
21
+ export { getInstrumentSentiment };
package/src/index.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './SentimentWidget/types';
2
+ export * from './SentimentWidget/SentimentWidget';
@@ -0,0 +1,79 @@
1
+ /**
2
+ * @jest-environment jsdom
3
+ */
4
+ import React from 'react';
5
+ import { render } from '@testing-library/react';
6
+ import { MockedProvider } from '@apollo/client/testing';
7
+ import { Main } from '../src/SentimentWidget/Main';
8
+ import { getInstrumentSentiment } from '../src/gql/getInstrumentSentiment';
9
+
10
+ const mocks = [
11
+ {
12
+ request: {
13
+ query: getInstrumentSentiment,
14
+ variables: {
15
+ division: 'OJ',
16
+ name: 'EUR/USD',
17
+ },
18
+ },
19
+ result: {
20
+ data: {
21
+ sentiment: [{
22
+ name: 'EUR/USD',
23
+ sentiment: {
24
+ longPercent: 34,
25
+ shortPercent: 66,
26
+ },
27
+ },
28
+ ],
29
+ },
30
+ },
31
+ },
32
+ ];
33
+
34
+ const zeroPercentMocks = [
35
+ {
36
+ request: {
37
+ query: getInstrumentSentiment,
38
+ variables: {
39
+ division: 'OJ',
40
+ name: 'GBP/USD',
41
+ },
42
+ },
43
+ result: {
44
+ data: {
45
+ sentiment: [{
46
+ name: 'GBP/USD',
47
+ sentiment: {
48
+ longPercent: 0,
49
+ shortPercent: 0,
50
+ },
51
+ },
52
+ ],
53
+ },
54
+ },
55
+ },
56
+ ];
57
+
58
+ describe('Main component', () => {
59
+ it('should render main component', async () => {
60
+ const { findByTestId } = render(
61
+ <MockedProvider mocks={mocks}>
62
+ <Main instrument="EUR/USD" />
63
+ </MockedProvider>,
64
+ );
65
+
66
+ expect(await findByTestId('sentiment-widget')).toBeInTheDocument();
67
+ expect(await findByTestId('sentiment')).toBeInTheDocument();
68
+ });
69
+ it('should render error when both sentiment values are 0', async () => {
70
+ const { findByTestId } = render(
71
+ <MockedProvider mocks={zeroPercentMocks}>
72
+ <Main instrument="GBP/USD" />
73
+ </MockedProvider>,
74
+ );
75
+
76
+ expect(await findByTestId('sentiment-widget')).toBeInTheDocument();
77
+ expect(await findByTestId('error')).toBeInTheDocument();
78
+ });
79
+ });
@@ -0,0 +1,12 @@
1
+ {
2
+ "extends": "../../tsconfig.types.json",
3
+ "compilerOptions": {
4
+ "rootDir": "./src",
5
+ "outDir": "./dist",
6
+ "declarationDir": "./dist/types"
7
+ },
8
+ "include": [
9
+ "./src/**/*",
10
+ "../../types/**/*"
11
+ ]
12
+ }