@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.
- package/CHANGELOG.md +8 -0
- package/dist/main/SentimentWidget/Main.js +41 -0
- package/dist/main/SentimentWidget/Main.js.map +1 -0
- package/dist/main/SentimentWidget/SentimentWidget.js +27 -0
- package/dist/main/SentimentWidget/SentimentWidget.js.map +1 -0
- package/dist/main/SentimentWidget/render.js +15 -0
- package/dist/main/SentimentWidget/render.js.map +1 -0
- package/dist/main/SentimentWidget/types.js +6 -0
- package/dist/main/SentimentWidget/types.js.map +1 -0
- package/dist/main/gql/getInstrumentSentiment.js +12 -0
- package/dist/main/gql/getInstrumentSentiment.js.map +1 -0
- package/dist/main/index.js +28 -0
- package/dist/main/index.js.map +1 -0
- package/dist/module/SentimentWidget/Main.js +34 -0
- package/dist/module/SentimentWidget/Main.js.map +1 -0
- package/dist/module/SentimentWidget/SentimentWidget.js +20 -0
- package/dist/module/SentimentWidget/SentimentWidget.js.map +1 -0
- package/dist/module/SentimentWidget/render.js +12 -0
- package/dist/module/SentimentWidget/render.js.map +1 -0
- package/dist/module/SentimentWidget/types.js +2 -0
- package/dist/module/SentimentWidget/types.js.map +1 -0
- package/dist/module/gql/getInstrumentSentiment.js +6 -0
- package/dist/module/gql/getInstrumentSentiment.js.map +1 -0
- package/dist/module/index.js +3 -0
- package/dist/module/index.js.map +1 -0
- package/dist/types/SentimentWidget/Main.d.ts +5 -0
- package/dist/types/SentimentWidget/SentimentWidget.d.ts +4 -0
- package/dist/types/SentimentWidget/render.d.ts +6 -0
- package/dist/types/SentimentWidget/types.d.ts +4 -0
- package/dist/types/gql/getInstrumentSentiment.d.ts +2 -0
- package/dist/types/index.d.ts +2 -0
- package/index.ts +1 -0
- package/package.json +18 -0
- package/src/SentimentWidget/Main.tsx +36 -0
- package/src/SentimentWidget/SentimentWidget.tsx +19 -0
- package/src/SentimentWidget/render.tsx +23 -0
- package/src/SentimentWidget/types.ts +4 -0
- package/src/gql/getInstrumentSentiment.ts +21 -0
- package/src/index.ts +2 -0
- package/test/Main.test.tsx +79 -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-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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|
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,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,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
|
+
});
|