diff --git a/common/app/Nav/LargeNav.jsx b/common/app/Nav/LargeNav.jsx
index e9d4052a6c..ef305f9cfe 100644
--- a/common/app/Nav/LargeNav.jsx
+++ b/common/app/Nav/LargeNav.jsx
@@ -16,11 +16,7 @@ function LargeNav({ clickOnLogo, clickOnMap, shouldShowMapButton, panes }) {
-
+
diff --git a/common/app/Nav/MediumNav.jsx b/common/app/Nav/MediumNav.jsx
index bb5004121c..559bf623f1 100644
--- a/common/app/Nav/MediumNav.jsx
+++ b/common/app/Nav/MediumNav.jsx
@@ -19,11 +19,7 @@ function MediumNav({ clickOnLogo, clickOnMap, shouldShowMapButton, panes }) {
-
+
diff --git a/common/app/Nav/SmallNav.jsx b/common/app/Nav/SmallNav.jsx
index f4ff42afce..50b456e1c3 100644
--- a/common/app/Nav/SmallNav.jsx
+++ b/common/app/Nav/SmallNav.jsx
@@ -31,11 +31,7 @@ function SmallNav({ clickOnLogo, clickOnMap, shouldShowMapButton, panes }) {
clickOnMap={ clickOnMap }
shouldShowMapButton={ shouldShowMapButton }
>
-
+
diff --git a/common/app/Nav/nav.less b/common/app/Nav/nav.less
index c9a2ea8a12..4933b99e39 100644
--- a/common/app/Nav/nav.less
+++ b/common/app/Nav/nav.less
@@ -266,6 +266,11 @@ li.nav-avatar {
::placeholder {
color: @input-color-placeholder;
}
+
+ .ais-Hits {
+ background-color: white;
+ z-index: 5;
+ }
}
.navbar-header {
display: flex;
diff --git a/package-lock.json b/package-lock.json
index 13c9ff0c6a..90eb49be67 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -208,6 +208,11 @@
"resolved": "https://registry.npmjs.org/after-all-results/-/after-all-results-2.0.0.tgz",
"integrity": "sha1-asL8ICtQD4jaj09VMM+hAPTGotA="
},
+ "agentkeepalive": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-2.2.0.tgz",
+ "integrity": "sha1-xdG9SxKQCPEWPyNvhuX66iAm4u8="
+ },
"ajv": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz",
@@ -219,6 +224,60 @@
"json-schema-traverse": "0.3.1"
}
},
+ "algoliasearch": {
+ "version": "3.26.0",
+ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-3.26.0.tgz",
+ "integrity": "sha512-FdUjBMl1csMvw5TeJ8wtVrf/KFOfCboztIwu/ivNs2rqBgEku1q2DqOXVUa9a/qAQdKSVYH2SLlwi5DPPFzmig==",
+ "requires": {
+ "agentkeepalive": "2.2.0",
+ "debug": "2.6.9",
+ "envify": "4.1.0",
+ "es6-promise": "4.2.4",
+ "events": "1.1.1",
+ "foreach": "2.0.5",
+ "global": "4.3.2",
+ "inherits": "2.0.3",
+ "isarray": "2.0.4",
+ "load-script": "1.0.0",
+ "object-keys": "1.0.11",
+ "querystring-es3": "0.2.1",
+ "reduce": "1.0.1",
+ "semver": "5.4.1",
+ "tunnel-agent": "0.6.0"
+ },
+ "dependencies": {
+ "envify": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/envify/-/envify-4.1.0.tgz",
+ "integrity": "sha512-IKRVVoAYr4pIx4yIWNsz9mOsboxlNXiu7TNBnem/K/uTHdkyzXWDzHCK7UTolqBbgaBz0tQHsD3YNls0uIIjiw==",
+ "requires": {
+ "esprima": "4.0.0",
+ "through": "2.3.8"
+ }
+ },
+ "es6-promise": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz",
+ "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ=="
+ },
+ "isarray": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz",
+ "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA=="
+ }
+ }
+ },
+ "algoliasearch-helper": {
+ "version": "2.24.0",
+ "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-2.24.0.tgz",
+ "integrity": "sha512-aW3lp9JLqPpghfsRMbmqTh6WNSTdFqldKYHaMq2KKATCO2GwFxV3e8EDI0GUUXBimiZXJ0FzsOTt7V7FyQ1WjQ==",
+ "requires": {
+ "events": "1.1.1",
+ "lodash": "4.17.4",
+ "qs": "6.5.1",
+ "util": "0.10.3"
+ }
+ },
"align-text": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
@@ -4069,8 +4128,7 @@
"decode-uri-component": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
- "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
- "dev": true
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
},
"dedent": {
"version": "0.7.0",
@@ -13825,8 +13883,7 @@
"querystring-es3": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
- "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
- "dev": true
+ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM="
},
"querystringify": {
"version": "1.0.0",
@@ -14058,14 +14115,30 @@
}
},
"react-freecodecamp-search": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/react-freecodecamp-search/-/react-freecodecamp-search-1.4.1.tgz",
- "integrity": "sha512-ftzu4mx4UEVK/lPlkcq4gMsbAcohkkVSYzK0yRVI386MFreuO0b8iZ5aCpHJY+wXZp+U/VBtQiR5pBCNOwzfNA==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/react-freecodecamp-search/-/react-freecodecamp-search-2.0.1.tgz",
+ "integrity": "sha1-8RoY15DzYj++PnTBK0AQZDP/FS0=",
"requires": {
- "rxjs": "5.5.5",
+ "query-string": "6.0.0",
+ "react-instantsearch": "5.0.1",
+ "rxjs": "5.5.7",
"xhr": "2.4.1"
},
"dependencies": {
+ "query-string": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.0.0.tgz",
+ "integrity": "sha1-i485RHtz6CkNb141gXeSGOkXEUI=",
+ "requires": {
+ "decode-uri-component": "0.2.0",
+ "strict-uri-encode": "2.0.0"
+ }
+ },
+ "strict-uri-encode": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
+ "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY="
+ },
"xhr": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/xhr/-/xhr-2.4.1.tgz",
@@ -14128,6 +14201,18 @@
"react-transition-group": "1.2.1"
}
},
+ "react-instantsearch": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/react-instantsearch/-/react-instantsearch-5.0.1.tgz",
+ "integrity": "sha512-CL6LcrHSnWD0pF6sIzhPWkO10cmpwofwv2IYXrFkYNnBE14ayZm6QIfhmT/2lQlBmCtk/6NHAFfzn9dPPjg1Rg==",
+ "requires": {
+ "algoliasearch": "3.26.0",
+ "algoliasearch-helper": "2.24.0",
+ "classnames": "2.2.5",
+ "lodash": "4.17.4",
+ "prop-types": "15.6.0"
+ }
+ },
"react-lazy-cache": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/react-lazy-cache/-/react-lazy-cache-3.0.1.tgz",
@@ -14365,6 +14450,14 @@
}
}
},
+ "reduce": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce/-/reduce-1.0.1.tgz",
+ "integrity": "sha1-FPouX/H8VgcDoCDLtfuqtpFWWAQ=",
+ "requires": {
+ "object-keys": "1.0.11"
+ }
+ },
"reduce-reducers": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/reduce-reducers/-/reduce-reducers-0.1.2.tgz",
@@ -15012,9 +15105,9 @@
}
},
"rxjs": {
- "version": "5.5.5",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.5.tgz",
- "integrity": "sha512-D/MfQnPMBk8P8gfwGxvCkuaWBcG58W7dUMT//URPoYzIbDEKT0GezdirkK5whMgKFBATfCoTpxO8bJQGJ04W5A==",
+ "version": "5.5.7",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.7.tgz",
+ "integrity": "sha512-Hxo2ac8gRQjwjtKgukMIwBRbq5+KAeEV5hXM4obYBOAghev41bDQWgFH4svYiU9UnQ5kNww2LgfyBdevCd2HXA==",
"requires": {
"symbol-observable": "1.0.1"
},
@@ -17964,7 +18057,6 @@
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
"integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
- "dev": true,
"requires": {
"inherits": "2.0.1"
},
@@ -17972,8 +18064,7 @@
"inherits": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
- "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
- "dev": true
+ "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
}
}
},
diff --git a/package.json b/package.json
index 8a1a2dcf60..b428c4a831 100644
--- a/package.json
+++ b/package.json
@@ -118,7 +118,7 @@
"react-d3": "^0.4.0",
"react-dom": "^15.6.2",
"react-fontawesome": "^1.2.0",
- "react-freecodecamp-search": "^1.4.1",
+ "react-freecodecamp-search": "^2.0.1",
"react-helmet": "^5.2.0",
"react-images": "^0.5.1",
"react-media": "^1.8.0",
diff --git a/server/middlewares/csp.js b/server/middlewares/csp.js
index 868a0c6bc3..228d84c934 100644
--- a/server/middlewares/csp.js
+++ b/server/middlewares/csp.js
@@ -3,7 +3,8 @@ import helmet from 'helmet';
let trusted = [
"'self'",
'https://search.freecodecamp.org',
- 'https://*.opbeat.com'
+ 'https://*.opbeat.com',
+ 'https://*.algolianet.com'
];
const host = process.env.HOST || 'localhost';