diff --git a/api/.env.example b/api/.env.example index 9a594d4f57..c1ca581287 100644 --- a/api/.env.example +++ b/api/.env.example @@ -26,8 +26,8 @@ BING_TOKEN= # this is taken care of you if you use the docker-compose file. # SEARCH=TRUE SEARCH= -MEILI_HOST='http://localhost:7700' -MEILI_HTTP_ADDR='http://localhost:7700' +MEILI_HOST='http://0.0.0.0:7700' +MEILI_HTTP_ADDR='0.0.0.0:7700' # needs a secure key, feel free to generate your own. MEILI_MASTER_KEY=WjRvKvpelIYHa4dlcDGsdT9c0CKRbY-4VcuCQ1iZPcc diff --git a/api/lib/db/indexSync.js b/api/lib/db/indexSync.js index 300a7c7503..9902ad6bcf 100644 --- a/api/lib/db/indexSync.js +++ b/api/lib/db/indexSync.js @@ -43,8 +43,21 @@ async function indexSync(req, res, next) { await Conversation.syncWithMeili(); } } catch (err) { - console.error(err); - // res.status(500).json({ error: 'Server error' }); + // console.log('in index sync'); + if (err.message.includes('not found')) { + console.log('Creating indices...'); + setTimeout(async () => { + try { + await Message.syncWithMeili(); + await Conversation.syncWithMeili(); + } catch (err) { + console.error('Trouble creating indices, try restarting the server.'); + } + }, 750); + } else { + console.error(err); + // res.status(500).json({ error: 'Server error' }); + } } } diff --git a/api/server/controllers/errorController.js b/api/server/controllers/errorController.js index 7369626191..e22b21c123 100644 --- a/api/server/controllers/errorController.js +++ b/api/server/controllers/errorController.js @@ -3,11 +3,13 @@ const handleDuplicateKeyError = (err, res) => { const field = Object.keys(err.keyValue); const code = 409; const error = `An document with that ${field} already exists.`; + console.log('congrats you hit the duped keys error'); res.status(code).send({ messages: error, fields: field }); }; //handle validation errors const handleValidationError = (err, res) => { + console.log('congrats you hit the validation middleware'); let errors = Object.values(err.errors).map(el => el.message); let fields = Object.values(err.errors).map(el => el.path); let code = 400; diff --git a/api/server/index.js b/api/server/index.js index 362dce89ed..a04ebccd77 100644 --- a/api/server/index.js +++ b/api/server/index.js @@ -81,7 +81,7 @@ const projectPath = path.join(__dirname, '..', '..', 'client'); let messageCount = 0; process.on('uncaughtException', (err) => { - // console.error('There was an uncaught error:', err.message); + console.error('There was an uncaught error:', err.message); if (err.message.includes('fetch failed')) { if (messageCount === 0) console.error('Meilisearch error, search will be disabled'); messageCount++; diff --git a/api/server/routes/search.js b/api/server/routes/search.js index e85b2df4e7..a9da207f6e 100644 --- a/api/server/routes/search.js +++ b/api/server/routes/search.js @@ -4,7 +4,7 @@ const { MeiliSearch } = require('meilisearch'); const { Message } = require('../../models/Message'); const { Conversation, getConvosQueried } = require('../../models/Conversation'); const { reduceHits } = require('../../lib/utils/reduceHits'); -const { replaceSup, cleanUpPrimaryKeyValue } = require('../../lib/utils/misc'); +const { cleanUpPrimaryKeyValue } = require('../../lib/utils/misc'); const cache = new Map(); router.get('/sync', async function (req, res) { @@ -46,7 +46,7 @@ router.get('/', async function (req, res) { return { ...rest, searchResult: true, - text: replaceSup(_formatted.text) + text: _formatted.text }; }); const titles = (await Conversation.meiliSearch(q)).hits; @@ -55,8 +55,6 @@ router.get('/', async function (req, res) { const result = await getConvosQueried(user, sortedHits, pageNumber); cache.set(key, result.cache); delete result.cache; - // result.messages = messages.filter(message => { }); - // !result.filter.has(message.conversationId) const activeMessages = []; for (let i = 0; i < messages.length; i++) { diff --git a/client/package-lock.json b/client/package-lock.json index f5b78f93c4..56ccd4ec6c 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -34,9 +34,9 @@ "react-transition-group": "^4.4.5", "rehype-highlight": "^6.0.0", "rehype-katex": "^6.0.2", + "rehype-raw": "^6.1.1", "remark-gfm": "^3.0.1", "remark-math": "^5.1.1", - "remark-sub-super": "^1.0.20", "remark-supersub": "^1.0.0", "swr": "^2.0.3", "tailwind-merge": "^1.9.1", @@ -3187,6 +3187,11 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, + "node_modules/@types/parse5": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", + "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==" + }, "node_modules/@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", @@ -6814,6 +6819,45 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-raw": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz", + "integrity": "sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/parse5": "^6.0.0", + "hast-util-from-parse5": "^7.0.0", + "hast-util-to-parse5": "^7.0.0", + "html-void-elements": "^2.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz", + "integrity": "sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-to-text": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-3.1.2.tgz", @@ -6928,6 +6972,15 @@ "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", "dev": true }, + "node_modules/html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -10918,6 +10971,20 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/rehype-raw": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-6.1.1.tgz", + "integrity": "sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-raw": "^7.2.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-gfm": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", @@ -10977,11 +11044,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remark-sub-super": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/remark-sub-super/-/remark-sub-super-1.0.20.tgz", - "integrity": "sha512-ohnGWuB8FSvod8Qp+gEo/7QRDlI2RA8d+YyY4eLuMQPD3WGwqGMCuyWdNOSW0mzDMqse82PJqeke/GGXaj795A==" - }, "node_modules/remark-supersub": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/remark-supersub/-/remark-supersub-1.0.0.tgz", @@ -15229,6 +15291,11 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, + "@types/parse5": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", + "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==" + }, "@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", @@ -18048,6 +18115,37 @@ "@types/hast": "^2.0.0" } }, + "hast-util-raw": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz", + "integrity": "sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==", + "requires": { + "@types/hast": "^2.0.0", + "@types/parse5": "^6.0.0", + "hast-util-from-parse5": "^7.0.0", + "hast-util-to-parse5": "^7.0.0", + "html-void-elements": "^2.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + } + }, + "hast-util-to-parse5": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz", + "integrity": "sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==", + "requires": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + } + }, "hast-util-to-text": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-3.1.2.tgz", @@ -18149,6 +18247,11 @@ "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", "dev": true }, + "html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==" + }, "http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -20742,6 +20845,16 @@ "unified": "^10.0.0" } }, + "rehype-raw": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-6.1.1.tgz", + "integrity": "sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==", + "requires": { + "@types/hast": "^2.0.0", + "hast-util-raw": "^7.2.0", + "unified": "^10.0.0" + } + }, "remark-gfm": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", @@ -20785,11 +20898,6 @@ "unified": "^10.0.0" } }, - "remark-sub-super": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/remark-sub-super/-/remark-sub-super-1.0.20.tgz", - "integrity": "sha512-ohnGWuB8FSvod8Qp+gEo/7QRDlI2RA8d+YyY4eLuMQPD3WGwqGMCuyWdNOSW0mzDMqse82PJqeke/GGXaj795A==" - }, "remark-supersub": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/remark-supersub/-/remark-supersub-1.0.0.tgz", diff --git a/client/package.json b/client/package.json index 6dc50506a6..1b8fb0458f 100644 --- a/client/package.json +++ b/client/package.json @@ -44,9 +44,9 @@ "react-transition-group": "^4.4.5", "rehype-highlight": "^6.0.0", "rehype-katex": "^6.0.2", + "rehype-raw": "^6.1.1", "remark-gfm": "^3.0.1", "remark-math": "^5.1.1", - "remark-sub-super": "^1.0.20", "remark-supersub": "^1.0.0", "swr": "^2.0.3", "tailwind-merge": "^1.9.1", diff --git a/client/src/components/Messages/Content/Content.jsx b/client/src/components/Messages/Content/Content.jsx index 4ecf348c8a..03f565175d 100644 --- a/client/src/components/Messages/Content/Content.jsx +++ b/client/src/components/Messages/Content/Content.jsx @@ -4,31 +4,28 @@ import rehypeKatex from 'rehype-katex'; import rehypeHighlight from 'rehype-highlight'; import remarkMath from 'remark-math'; import remarkGfm from 'remark-gfm'; -// import supersub from 'remark-supersub' -import remarkSubSuper from 'remark-sub-super'; +import rehypeRaw from 'rehype-raw' import CodeBlock from './CodeBlock'; import { langSubset } from '~/utils/languages'; -const Content = React.memo(({ content }) => { +const Content = React.memo(({ content, isCreatedByUser = false }) => { + const rehypePlugins = [ + [rehypeKatex, { output: 'mathml' }], + [ + rehypeHighlight, + { + detect: true, + ignoreMissing: true, + subset: langSubset + } + ], + [rehypeRaw], + ] return ( <> { return {props?.children}; }); -const blinker = ({ node }) => { - if (node.type === 'text' && node.value === '█') { - return {node.value}; - } +// const blinker = ({ node }) => { +// if (node.type === 'text' && node.value === '█') { +// return {node.value}; +// } - return null; -}; +// return null; +// }; -const em = React.memo(({ node, ...props }) => { - if ( - props.children[0] && - typeof props.children[0] === 'string' && - props.children[0].startsWith('^') - ) { - return {props.children[0].substring(1)}; - } - if ( - props.children[0] && - typeof props.children[0] === 'string' && - props.children[0].startsWith('~') - ) { - return {props.children[0].substring(1)}; - } - return ; -}); +// const em = React.memo(({ node, ...props }) => { +// if ( +// props.children[0] && +// typeof props.children[0] === 'string' && +// props.children[0].startsWith('^') +// ) { +// return {props.children[0].substring(1)}; +// } +// if ( +// props.children[0] && +// typeof props.children[0] === 'string' && +// props.children[0].startsWith('~') +// ) { +// return {props.children[0].substring(1)}; +// } +// return ; +// }); export default Content; diff --git a/client/src/components/Messages/Content/Wrapper.jsx b/client/src/components/Messages/Content/Wrapper.jsx index 005e0c6237..99b095cbd8 100644 --- a/client/src/components/Messages/Content/Wrapper.jsx +++ b/client/src/components/Messages/Content/Wrapper.jsx @@ -7,7 +7,7 @@ const Wrapper = React.memo(({ text, generateCursor, isCreatedByUser, searchResul return ( ); } else if (!isCreatedByUser) {