diff --git a/.gitignore b/.gitignore index 5a42acb67..c76651868 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ dist/coral-admin/bundle.js tests/e2e/reports .DS_Store *.iml +*.swp dump.rdb .env gaba.cfg diff --git a/client/coral-embed-stream/src/CommentStream.js b/client/coral-embed-stream/src/CommentStream.js index 69fc5f73f..be8c510d9 100644 --- a/client/coral-embed-stream/src/CommentStream.js +++ b/client/coral-embed-stream/src/CommentStream.js @@ -67,12 +67,29 @@ class CommentStream extends Component { // Set up messaging between embedded Iframe an parent component this.pym = new Pym.Child({polling: 100}); - const path = /https?\:\/\/([^?#]+)/.exec(this.pym.parentUrl); + const path = this.pym.parentUrl.split('#')[0]; - this.props.getStream(path[1] || window.location); + this.props.getStream(path || window.location); this.path = path; this.pym.sendMessage('childReady'); + + this.pym.onMessage('DOMContentLoaded', hash => { + const commentId = hash.replace('#', 'c_'); + let count = 0; + const interval = setInterval(() => { + if (document.getElementById(commentId)) { + window.clearInterval(interval); + this.pym.scrollParentToChildEl(commentId); + } + + if (++count > 100) { // ~10 seconds + // give up waiting for the comments to load. + // it would be weird for the page to jump after that long. + window.clearInterval(interval); + } + }, 100); + }); } render () { diff --git a/client/coral-embed-stream/style/default.css b/client/coral-embed-stream/style/default.css index 59efc3dc8..688fc78f6 100644 --- a/client/coral-embed-stream/style/default.css +++ b/client/coral-embed-stream/style/default.css @@ -113,7 +113,6 @@ hr { /* Comment styles */ .comment { - position: relative; margin-bottom: 10px; position: relative; } diff --git a/client/coral-framework/modules/i18n/i18n.js b/client/coral-framework/modules/i18n/i18n.js index afe8606d1..1d81e885c 100644 --- a/client/coral-framework/modules/i18n/i18n.js +++ b/client/coral-framework/modules/i18n/i18n.js @@ -1,5 +1,7 @@ import timeago from 'timeago.js'; import esTA from '../../../../node_modules/timeago.js/locales/es'; +import has from 'lodash/has'; +import get from 'lodash/get'; /** * Default locales, this should be overriden by config file @@ -46,21 +48,18 @@ class i18n { * it takes a string with the translation key and returns * the translation value or the key itself if not found * it works with nested translations (my.page.title) + * + * any extra parameters are optional and replace a variable marked by {0}, {1}, etc in the translation. */ - this.t = (key) => { - const arr = key.split('.'); - let translation = this.translations; - try { - for (let i = 0; i < arr.length; i++) {translation = translation[arr[i]];} - } catch (error) { - console.warn(`${key} language key not set`); - return key; - } - - const val = String(translation); - if (val) { - return val; + this.t = (key, ...replacements) => { + if (has(this.translations, key)) { + let translation = get(this.translations, key); + // replace any {n} with the arguments passed to this method + replacements.forEach((str, i) => { + translation = translation.replace(new RegExp(`\\{${i}\\}`, 'g'), str); + }); + return translation; } else { console.warn(`${key} language key not set`); return key; diff --git a/services/mailer.js b/services/mailer.js index 4da8024ca..b7d621954 100644 --- a/services/mailer.js +++ b/services/mailer.js @@ -1,10 +1,36 @@ const nodemailer = require('nodemailer'); -if (!process.env.TALK_SMTP_CONNECTION_URL) { - console.error('TALK_SMTP_CONNECTION_URL should be defined if you would like to send password reset emails from Talk'); +const smtpRequiredProps = [ + 'TALK_SMTP_USERNAME', + 'TALK_SMTP_PASSWORD', + 'TALK_SMTP_PROVIDER' +]; + +smtpRequiredProps.forEach(prop => { + if (!process.env[prop]) { + console.error(`process.env.${prop} should be defined if you would like to send password reset emails from Talk`); + } +}); + +const options = { + // list of providers here: + // https://github.com/nodemailer/nodemailer-wellknown#supported-services + service: process.env.TALK_SMTP_PROVIDER, + auth: { + user: process.env.TALK_SMTP_USERNAME, + pass: process.env.TALK_SMTP_PASSWORD + } +}; + +if (process.env.TALK_SMTP_PORT) { + options.port = process.env.TALK_SMTP_PORT; } -const defaultTransporter = nodemailer.createTransport(process.env.TALK_SMTP_CONNECTION_URL); +if (process.env.TALK_SMTP_HOST) { + options.host = process.env.TALK_SMTP_HOST; +} + +const defaultTransporter = nodemailer.createTransport(options); const mailer = {