diff --git a/config/default.js b/config/default.js index 42e7064993..a0bcae4d7f 100644 --- a/config/default.js +++ b/config/default.js @@ -211,4 +211,31 @@ module.exports = { GRANT_TYPE: '', }, }, + HEADER_AUTH_URLS: { + href: 'https://accounts.topcoder-dev.com/member/registration?utm_source=community-app-main', + location: 'https://accounts.topcoder-dev.com/member?retUrl=%S&utm_source=community-app-main', + }, + ACCOUNT_MENU: [ + { + title: 'Settings', + href: '/settings/profile', + }, + { separator: true }, + { + title: 'Help', + href: 'https://help.topcoder-dev.com/', + }, + { + title: 'About Topcoder', + href: 'https://www.topcoder.com/about/', + }, + { + title: 'Log Out', + href: 'https://www.topcoder-dev.com/logout', + }, + ], + ACCOUNT_MENU_SWITCH_TEXT: { + title: 'Switch to BUSINESS', + href: 'https://connect.topcoder-dev.com', + }, }; diff --git a/package-lock.json b/package-lock.json index cfaa80f8f4..31b863ff85 100644 --- a/package-lock.json +++ b/package-lock.json @@ -501,6 +501,110 @@ "integrity": "sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ==", "dev": true }, + "@babel/register": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.4.4.tgz", + "integrity": "sha512-sn51H88GRa00+ZoMqCVgOphmswG4b7mhf9VOB0LUBAieykq2GnRFerlN+JQkO/ntT7wz4jaHNSRPg9IdMPEUkA==", + "requires": { + "core-js": "3.1.4", + "find-cache-dir": "2.1.0", + "lodash": "4.17.11", + "mkdirp": "0.5.1", + "pirates": "4.0.1", + "source-map-support": "0.5.12" + }, + "dependencies": { + "core-js": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.4.tgz", + "integrity": "sha512-YNZN8lt82XIMLnLirj9MhKDFZHalwzzrL9YLt6eb0T5D0EDl4IQ90IGkua8mHbnxNrkj1d8hbdizMc0Qmg1WnQ==" + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "1.0.1", + "make-dir": "2.1.0", + "pkg-dir": "3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "3.0.0", + "path-exists": "3.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "4.0.1", + "semver": "5.6.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "requires": { + "p-try": "2.2.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "3.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-support": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "requires": { + "buffer-from": "1.1.1", + "source-map": "0.6.1" + } + } + } + }, "@babel/runtime": { "version": "7.3.4", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.4.tgz", @@ -3145,8 +3249,7 @@ "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, "buffer-xor": { "version": "1.0.3", @@ -3968,8 +4071,7 @@ "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, "commoner": { "version": "0.10.8", @@ -4343,7 +4445,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.0.tgz", "integrity": "sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg==", - "dev": true, "requires": { "cross-spawn": "6.0.5", "is-windows": "1.0.2" @@ -4353,7 +4454,6 @@ "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, "requires": { "nice-try": "1.0.5", "path-key": "2.0.1", @@ -7425,6 +7525,7 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", + "optional": true, "requires": { "nan": "2.12.1", "node-pre-gyp": "0.10.3" @@ -7432,19 +7533,26 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "ansi-regex": { "version": "2.1.1", - "bundled": true + "bundled": true, + "dev": true }, "aproba": { "version": "1.2.0", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "are-we-there-yet": { "version": "1.1.5", "bundled": true, + "dev": true, + "optional": true, "requires": { "delegates": "1.0.0", "readable-stream": "2.3.6" @@ -7452,11 +7560,13 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, + "dev": true, "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -7464,57 +7574,78 @@ }, "chownr": { "version": "1.1.1", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "code-point-at": { "version": "1.1.0", - "bundled": true + "bundled": true, + "dev": true }, "concat-map": { "version": "0.0.1", - "bundled": true + "bundled": true, + "dev": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true + "bundled": true, + "dev": true }, "core-util-is": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "debug": { "version": "2.6.9", "bundled": true, + "dev": true, + "optional": true, "requires": { "ms": "2.0.0" } }, "deep-extend": { "version": "0.6.0", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "delegates": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "detect-libc": { "version": "1.0.3", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "fs-minipass": { "version": "1.2.5", "bundled": true, + "dev": true, + "optional": true, "requires": { "minipass": "2.3.5" } }, "fs.realpath": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "gauge": { "version": "2.7.4", "bundled": true, + "dev": true, + "optional": true, "requires": { "aproba": "1.2.0", "console-control-strings": "1.1.0", @@ -7529,6 +7660,8 @@ "glob": { "version": "7.1.3", "bundled": true, + "dev": true, + "optional": true, "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -7540,11 +7673,15 @@ }, "has-unicode": { "version": "2.0.1", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "iconv-lite": { "version": "0.4.24", "bundled": true, + "dev": true, + "optional": true, "requires": { "safer-buffer": "2.1.2" } @@ -7552,6 +7689,8 @@ "ignore-walk": { "version": "3.0.1", "bundled": true, + "dev": true, + "optional": true, "requires": { "minimatch": "3.0.4" } @@ -7559,6 +7698,8 @@ "inflight": { "version": "1.0.6", "bundled": true, + "dev": true, + "optional": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -7566,37 +7707,46 @@ }, "inherits": { "version": "2.0.3", - "bundled": true + "bundled": true, + "dev": true }, "ini": { "version": "1.3.5", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "number-is-nan": "1.0.1" } }, "isarray": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "minimatch": { "version": "3.0.4", "bundled": true, + "dev": true, "requires": { "brace-expansion": "1.1.11" } }, "minimist": { "version": "0.0.8", - "bundled": true + "bundled": true, + "dev": true }, "minipass": { "version": "2.3.5", "bundled": true, + "dev": true, "requires": { "safe-buffer": "5.1.2", "yallist": "3.0.3" @@ -7605,6 +7755,8 @@ "minizlib": { "version": "1.2.1", "bundled": true, + "dev": true, + "optional": true, "requires": { "minipass": "2.3.5" } @@ -7612,17 +7764,22 @@ "mkdirp": { "version": "0.5.1", "bundled": true, + "dev": true, "requires": { "minimist": "0.0.8" } }, "ms": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "needle": { "version": "2.2.4", "bundled": true, + "dev": true, + "optional": true, "requires": { "debug": "2.6.9", "iconv-lite": "0.4.24", @@ -7632,6 +7789,8 @@ "node-pre-gyp": { "version": "0.10.3", "bundled": true, + "dev": true, + "optional": true, "requires": { "detect-libc": "1.0.3", "mkdirp": "0.5.1", @@ -7648,6 +7807,8 @@ "nopt": { "version": "4.0.1", "bundled": true, + "dev": true, + "optional": true, "requires": { "abbrev": "1.1.1", "osenv": "0.1.5" @@ -7655,11 +7816,15 @@ }, "npm-bundled": { "version": "1.0.5", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "npm-packlist": { "version": "1.2.0", "bundled": true, + "dev": true, + "optional": true, "requires": { "ignore-walk": "3.0.1", "npm-bundled": "1.0.5" @@ -7668,6 +7833,8 @@ "npmlog": { "version": "4.1.2", "bundled": true, + "dev": true, + "optional": true, "requires": { "are-we-there-yet": "1.1.5", "console-control-strings": "1.1.0", @@ -7677,30 +7844,40 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "object-assign": { "version": "4.1.1", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "once": { "version": "1.4.0", "bundled": true, + "dev": true, "requires": { "wrappy": "1.0.2" } }, "os-homedir": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "os-tmpdir": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "osenv": { "version": "0.1.5", "bundled": true, + "dev": true, + "optional": true, "requires": { "os-homedir": "1.0.2", "os-tmpdir": "1.0.2" @@ -7708,15 +7885,21 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "process-nextick-args": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "rc": { "version": "1.2.8", "bundled": true, + "dev": true, + "optional": true, "requires": { "deep-extend": "0.6.0", "ini": "1.3.5", @@ -7726,13 +7909,17 @@ "dependencies": { "minimist": { "version": "1.2.0", - "bundled": true + "bundled": true, + "dev": true, + "optional": true } } }, "readable-stream": { "version": "2.3.6", "bundled": true, + "dev": true, + "optional": true, "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", @@ -7746,37 +7933,51 @@ "rimraf": { "version": "2.6.3", "bundled": true, + "dev": true, + "optional": true, "requires": { "glob": "7.1.3" } }, "safe-buffer": { "version": "5.1.2", - "bundled": true + "bundled": true, + "dev": true }, "safer-buffer": { "version": "2.1.2", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "sax": { "version": "1.2.4", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "semver": { "version": "5.6.0", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "set-blocking": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "signal-exit": { "version": "3.0.2", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "string-width": { "version": "1.0.2", "bundled": true, + "dev": true, "requires": { "code-point-at": "1.1.0", "is-fullwidth-code-point": "1.0.0", @@ -7786,6 +7987,8 @@ "string_decoder": { "version": "1.1.1", "bundled": true, + "dev": true, + "optional": true, "requires": { "safe-buffer": "5.1.2" } @@ -7793,17 +7996,22 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, + "dev": true, "requires": { "ansi-regex": "2.1.1" } }, "strip-json-comments": { "version": "2.0.1", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "tar": { "version": "4.4.8", "bundled": true, + "dev": true, + "optional": true, "requires": { "chownr": "1.1.1", "fs-minipass": "1.2.5", @@ -7816,22 +8024,28 @@ }, "util-deprecate": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "wide-align": { "version": "1.1.3", "bundled": true, + "dev": true, + "optional": true, "requires": { "string-width": "1.0.2" } }, "wrappy": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "yallist": { "version": "3.0.3", - "bundled": true + "bundled": true, + "dev": true } } }, @@ -8147,6 +8361,11 @@ "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", "dev": true }, + "gud": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" + }, "handlebars": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.0.tgz", @@ -9280,8 +9499,7 @@ "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" }, "is-word-character": { "version": "1.0.2", @@ -11713,6 +11931,31 @@ "dom-walk": "0.1.1" } }, + "mini-create-react-context": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz", + "integrity": "sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw==", + "requires": { + "@babel/runtime": "7.4.5", + "gud": "1.0.0", + "tiny-warning": "1.0.2" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", + "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", + "requires": { + "regenerator-runtime": "0.13.2" + } + }, + "regenerator-runtime": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", + "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" + } + } + }, "mini-css-extract-plugin": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.5.tgz", @@ -12009,6 +12252,203 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "navigation-component": { + "version": "git+https://github.com/topcoder-platform/navigation-component.git#69604750b855d16d70c6871c3760ef20f137172d", + "requires": { + "classnames": "2.2.6", + "lodash": "4.17.11", + "moment": "2.24.0", + "prop-types": "15.7.2", + "react-resize-detector": "4.2.0", + "react-router-dom": "5.0.1", + "topcoder-react-utils": "0.7.9" + }, + "dependencies": { + "config": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/config/-/config-3.1.0.tgz", + "integrity": "sha512-t6oDeNQbsIWa+D/KF4959TANzjSHLv1BA/hvL8tHEA3OUSWgBXELKaONSI6nr9oanbKs0DXonjOWLcrtZ3yTAA==", + "requires": { + "json5": "1.0.1" + } + }, + "history": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/history/-/history-4.9.0.tgz", + "integrity": "sha512-H2DkjCjXf0Op9OAr6nJ56fcRkTSNrUiv41vNJ6IswJjif6wlpZK0BTfFbi7qK9dXLSYZxkq5lBsj3vUjlYBYZA==", + "requires": { + "@babel/runtime": "7.3.4", + "loose-envify": "1.4.0", + "resolve-pathname": "2.2.0", + "tiny-invariant": "1.0.4", + "tiny-warning": "1.0.2", + "value-equal": "0.4.0" + } + }, + "hoist-non-react-statics": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", + "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", + "requires": { + "react-is": "16.8.4" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "1.2.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "requires": { + "isarray": "0.0.1" + } + }, + "react-redux": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-6.0.1.tgz", + "integrity": "sha512-T52I52Kxhbqy/6TEfBv85rQSDz6+Y28V/pf52vDWs1YRXG19mcFOGfHnY2HsNFHyhP+ST34Aih98fvt6tqwVcQ==", + "requires": { + "@babel/runtime": "7.3.4", + "hoist-non-react-statics": "3.3.0", + "invariant": "2.2.4", + "loose-envify": "1.4.0", + "prop-types": "15.7.2", + "react-is": "16.8.4" + } + }, + "react-router": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.0.1.tgz", + "integrity": "sha512-EM7suCPNKb1NxcTZ2LEOWFtQBQRQXecLxVpdsP4DW4PbbqYWeRiLyV/Tt1SdCrvT2jcyXAXmVTmzvSzrPR63Bg==", + "requires": { + "@babel/runtime": "7.3.4", + "history": "4.9.0", + "hoist-non-react-statics": "3.3.0", + "loose-envify": "1.4.0", + "mini-create-react-context": "0.3.2", + "path-to-regexp": "1.7.0", + "prop-types": "15.7.2", + "react-is": "16.8.4", + "tiny-invariant": "1.0.4", + "tiny-warning": "1.0.2" + } + }, + "react-router-dom": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.0.1.tgz", + "integrity": "sha512-zaVHSy7NN0G91/Bz9GD4owex5+eop+KvgbxXsP/O+iW1/Ln+BrJ8QiIR5a6xNPtrdTvLkxqlDClx13QO1uB8CA==", + "requires": { + "@babel/runtime": "7.3.4", + "history": "4.9.0", + "loose-envify": "1.4.0", + "prop-types": "15.7.2", + "react-router": "5.0.1", + "tiny-invariant": "1.0.4", + "tiny-warning": "1.0.2" + } + }, + "redux": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.1.tgz", + "integrity": "sha512-R7bAtSkk7nY6O/OYMVR9RiBI+XghjF9rlbl5806HJbQph0LJVHZrU5oaO4q70eUKiqMRqm4y07KLTlMZ2BlVmg==", + "requires": { + "loose-envify": "1.4.0", + "symbol-observable": "1.2.0" + } + }, + "topcoder-react-utils": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/topcoder-react-utils/-/topcoder-react-utils-0.7.9.tgz", + "integrity": "sha512-bH5t7lVTezl3rh2S1pguMWhUlJb39gOLLkCG9jwLCsMKTzri+LsOvpRJ6dOvYZPzA7GdmCgQNeGAoctiqAGb4g==", + "requires": { + "@babel/register": "7.4.4", + "@babel/runtime": "7.3.4", + "body-parser": "1.18.3", + "command-line-args": "5.0.2", + "command-line-usage": "5.0.5", + "compression": "1.7.3", + "config": "3.1.0", + "cookie-parser": "1.4.4", + "cross-env": "5.2.0", + "express": "4.16.4", + "helmet": "3.16.0", + "lodash": "4.17.11", + "moment": "2.24.0", + "morgan": "1.9.1", + "node-forge": "0.7.6", + "prop-types": "15.7.2", + "raf": "3.4.1", + "react": "16.8.4", + "react-css-super-themr": "2.2.0", + "react-dom": "16.8.4", + "react-helmet": "5.2.0", + "react-redux": "6.0.1", + "react-router-dom": "4.3.1", + "redux": "4.0.1", + "redux-actions": "2.6.5", + "redux-devtools": "3.5.0", + "redux-devtools-dock-monitor": "1.1.3", + "redux-devtools-log-monitor": "1.4.0", + "redux-promise": "0.6.0", + "request-ip": "2.1.3", + "serialize-javascript": "1.6.1", + "serve-favicon": "2.5.0", + "shortid": "2.2.14", + "url-parse": "1.4.4" + }, + "dependencies": { + "hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + }, + "react-router": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz", + "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", + "requires": { + "history": "4.9.0", + "hoist-non-react-statics": "2.5.5", + "invariant": "2.2.4", + "loose-envify": "1.4.0", + "path-to-regexp": "1.7.0", + "prop-types": "15.7.2", + "warning": "4.0.3" + } + }, + "react-router-dom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.3.1.tgz", + "integrity": "sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==", + "requires": { + "history": "4.9.0", + "invariant": "2.2.4", + "loose-envify": "1.4.0", + "prop-types": "15.7.2", + "react-router": "4.3.1", + "warning": "4.0.3" + } + } + } + } + } + }, "ncname": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", @@ -12052,8 +12492,7 @@ "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "nocache": { "version": "2.0.0", @@ -12203,6 +12642,11 @@ } } }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" + }, "node-notifier": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", @@ -13002,6 +13446,14 @@ "pinkie": "2.0.4" } }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "requires": { + "node-modules-regexp": "1.0.0" + } + }, "pixelmatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", @@ -14945,6 +15397,11 @@ "performance-now": "2.1.0" } }, + "raf-schd": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.1.tgz", + "integrity": "sha512-/QTXV4+Tf81CmJgTZac47N63ZzKmaVe+1cQX/grCFeLrs4Mcc6oq+KJfbF3tFjeS1NF91lmTvgmwYjk02UTo9A==" + }, "railroad-diagrams": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", @@ -15472,6 +15929,18 @@ "eventemitter3": "3.1.0" } }, + "react-resize-detector": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-4.2.0.tgz", + "integrity": "sha512-AtOaNIxs0ydua7tEoglXR3902/EdlIj9PXDu1Zj0ug2VAUnkSQjguLGzaG/N6CXLOhJSccTsUCZxjLayQ1mE9Q==", + "requires": { + "lodash": "4.17.11", + "lodash-es": "4.17.11", + "prop-types": "15.7.2", + "raf-schd": "4.0.1", + "resize-observer-polyfill": "1.5.1" + } + }, "react-router": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz", @@ -16657,6 +17126,11 @@ "integrity": "sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc=", "dev": true }, + "resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "resolve": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", @@ -28016,6 +28490,16 @@ "setimmediate": "1.0.5" } }, + "tiny-invariant": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.0.4.tgz", + "integrity": "sha512-lMhRd/djQJ3MoaHEBrw8e2/uM4rs9YMNk0iOr8rHQ0QdbM7D4l0gFl3szKdeixrlyfm9Zqi4dxHCM2qVG8ND5g==" + }, + "tiny-warning": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.2.tgz", + "integrity": "sha512-rru86D9CpQRLvsFG5XFdy0KdLAvjdQDyZCsRcuu60WtzFylDM3eAWSxEVz5kzL2Gp544XiUvPbVKtOA/txLi9Q==" + }, "tinycolor2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", diff --git a/package.json b/package.json index cda3f3a074..7de502ca32 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,7 @@ "moment-timezone": "^0.5.21", "money": "^0.2.0", "morgan": "^1.9.0", + "navigation-component": "git+https://github.com/topcoder-platform/navigation-component.git#develop", "node-forge": "^0.7.5", "nuka-carousel": "^4.5.3", "postcss": "^6.0.23", diff --git a/src/assets/images/tc-logo.svg b/src/assets/images/tc-logo.svg new file mode 100644 index 0000000000..88d9bc860f --- /dev/null +++ b/src/assets/images/tc-logo.svg @@ -0,0 +1,17 @@ + + \ No newline at end of file diff --git a/src/shared/actions/contentful.js b/src/shared/actions/contentful.js index 76b53ffa2a..30167f4c65 100644 --- a/src/shared/actions/contentful.js +++ b/src/shared/actions/contentful.js @@ -1,5 +1,9 @@ +import _ from 'lodash'; import { getService } from 'services/contentful'; import { redux } from 'topcoder-react-utils'; +import { removeTrailingSlash } from 'utils/url'; +import { menuItemBuilder, target as urlTarget } from 'utils/contentful'; +import { services } from 'topcoder-react-lib'; const ERRMSG_UNKNOWN_TARGET = 'Unknown action target'; @@ -125,6 +129,158 @@ async function queryContentDone(operationId, queryId, target, }; } +/** + * Prepare menu fetching + * @param {Object} menuProps The navi menu data from Contentful + */ +function getMenuInit(menuProps) { + return { + ...menuProps, + }; +} + +/** + * Fetches recursively complete navi menu data from Contentful + * @param {Object} menuProps The navi menu data from Contentful + */ +async function getMenuDone(menuProps) { + const { + preview, spaceName, environment, fields, + } = menuProps; + let { baseUrl } = fields; + let menu = []; // will store results here + const service = getService({ preview, spaceName, environment }); + // remove trail slash from baseUrl + baseUrl = baseUrl ? removeTrailingSlash(baseUrl) : baseUrl; + // different menu strucures depending on title + // if title is set new navi supports only 2 levels of menus + // otherwise 3 when directly loaded + if (fields.title) { + menu.push({ + id: menuProps.id, + title: fields.title, + subMenu: [], + }); + } + // Prepare menu loading + const l1P = _.map( + fields.items, + item => service.getEntry(item.sys.id).then(async (L1Item) => { + const mI = menuItemBuilder(baseUrl, L1Item); + const { childRoutes, submenu } = L1Item.fields; + if (childRoutes) { + mI.subMenu = await Promise.all(_.map( + childRoutes, + cR => service.getEntry(cR.sys.id).then( + async (cR2) => { + const url2 = urlTarget(baseUrl, L1Item); + const sI2 = menuItemBuilder(url2, cR2); + // no title => 3 level menu supported + if (!fields.title && cR2.fields.childRoutes) { + sI2.subMenu = await Promise.all(_.map( + cR2.fields.childRoutes, + cR3 => service.getEntry(cR3.sys.id).then( + c3 => menuItemBuilder(urlTarget(url2, cR2), c3), + ), + )); + } + return sI2; + }, + ), + )); + } + if (submenu) { + const submenuNavi = await service.getEntry(submenu.sys.id); + mI.subMenu = await Promise.all(_.map( + submenuNavi.fields.items, + subI => service.getEntry(subI.sys.id).then( + async (sub2) => { + const url2 = urlTarget(baseUrl, L1Item); + const sI2 = menuItemBuilder(url2, sub2); + // no title => 3 level menu supported + if (!fields.title && sub2.fields.submenu) { + const submenuNavi2 = await service.getEntry(sub2.fields.submenu.sys.id); + sI2.subMenu = await Promise.all(_.map( + submenuNavi2.fields.items, + cR3 => service.getEntry(cR3.sys.id).then( + s3 => menuItemBuilder(urlTarget(url2, sub2), s3), + ), + )); + } + return sI2; + }, + ), + )); + } + return mI; + }), + ); + // Load and wait for all menu data + const menuData = await Promise.all(l1P); + // Load logo if set + let menuLogo; + if (fields.logo) { + menuLogo = await service.getAsset(fields.logo.sys.id); + } + // merge and return menu + if (fields.title) { + menu[0].subMenu = menuData; + } else { + menu = menuData; + } + + return { + id: menuProps.id, + menu, + menuLogo, + }; +} + +/** + * Prepare challenges block fetching + * @param {Object} blockProps + */ +function getChallengesBlockInit(blockProps) { + return { + ...blockProps, + }; +} + +/** + * Fetchs challenges block needed data + * @param {Object} blockProps + */ +async function getChallengesBlockDone(blockProps) { + const { + id, preview, spaceName, environment, + } = blockProps; + // get the Contentful data + const service = getService({ preview, spaceName, environment }); + const block = await service.getEntry(id); + // prepare for getting the challenges + const challengesService = services.challenge.getService(); + const filter = {}; + if (!block.fields.completedChallenges) { + filter.status = 'ACTIVE'; + } + if (block.fields.challengeTitleContains) { + filter.name = block.fields.challengeTitleContains; + } + if (block.fields.challengeType) { + filter.subTrack = block.fields.challengeType.join(','); + } + if (block.fields.technologies) { + filter.technologies = block.fields.technologies.join(','); + } + const challenges = await challengesService.getChallenges(filter); + + return { + id, + challenges: challenges.challenges, + fields: block.fields, + }; +} + export default redux.createActions({ CONTENTFUL: { BOOK_CONTENT: bookContent, @@ -136,5 +292,9 @@ export default redux.createActions({ GET_CONTENT_DONE: getContentDone, QUERY_CONTENT_INIT: queryContentInit, QUERY_CONTENT_DONE: queryContentDone, + GET_MENU_INIT: getMenuInit, + GET_MENU_DONE: getMenuDone, + GET_CHALLENGES_BLOCK_INIT: getChallengesBlockInit, + GET_CHALLENGES_BLOCK_DONE: getChallengesBlockDone, }, }); diff --git a/src/shared/components/ChallengesBlock/index.jsx b/src/shared/components/ChallengesBlock/index.jsx deleted file mode 100644 index 598638900e..0000000000 --- a/src/shared/components/ChallengesBlock/index.jsx +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Displays a few challenge cards and the link to challenge listing. - */ - -import PT from 'prop-types'; -import React from 'react'; -import { PrimaryButton } from 'topcoder-react-ui-kit'; - -import Card from './Card'; - -import './style.scss'; - -export default function ChallengesBlock({ - baseUrl, - challenges, - setChallengeListingFilter, -}) { - return ( -