2017-12-13 10:35:42 +00:00
|
|
|
// @flow
|
|
|
|
|
|
|
|
import moment from 'moment';
|
|
|
|
|
2018-01-29 22:20:38 +00:00
|
|
|
// MomentJS uses static language bundle loading, so in order to support dynamic
|
|
|
|
// language selection in the app we need to load all bundles that we support in
|
|
|
|
// the app.
|
|
|
|
// FIXME: If we decide to support MomentJS in other features as well we may need
|
|
|
|
// to move this import and the lenient matcher to the i18n feature.
|
2017-12-25 18:03:46 +00:00
|
|
|
require('moment/locale/bg');
|
|
|
|
require('moment/locale/de');
|
|
|
|
require('moment/locale/eo');
|
|
|
|
require('moment/locale/es');
|
|
|
|
require('moment/locale/fr');
|
|
|
|
require('moment/locale/hy-am');
|
|
|
|
require('moment/locale/it');
|
|
|
|
require('moment/locale/nb');
|
|
|
|
|
2018-01-26 18:18:43 +00:00
|
|
|
// OC is not available. Please submit OC translation to the MomentJS project.
|
2017-12-25 18:03:46 +00:00
|
|
|
|
|
|
|
require('moment/locale/pl');
|
|
|
|
require('moment/locale/pt');
|
|
|
|
require('moment/locale/pt-br');
|
|
|
|
require('moment/locale/ru');
|
|
|
|
require('moment/locale/sk');
|
|
|
|
require('moment/locale/sl');
|
|
|
|
require('moment/locale/sv');
|
|
|
|
require('moment/locale/tr');
|
|
|
|
require('moment/locale/zh-cn');
|
2017-12-20 00:49:36 +00:00
|
|
|
|
2018-01-29 22:20:38 +00:00
|
|
|
import { i18next } from '../base/i18n';
|
|
|
|
import { parseURIString } from '../base/util';
|
|
|
|
|
2017-12-13 10:35:42 +00:00
|
|
|
/**
|
2018-01-17 11:19:10 +00:00
|
|
|
* Retrieves the recent room list and generates all the data needed to be
|
2017-12-20 00:49:36 +00:00
|
|
|
* displayed.
|
|
|
|
*
|
2018-02-02 18:13:33 +00:00
|
|
|
* @param {Array<Object>} list - The stored recent list retrieved from redux.
|
2018-01-17 11:19:10 +00:00
|
|
|
* @returns {Array}
|
2017-12-20 00:49:36 +00:00
|
|
|
*/
|
2018-01-17 11:19:10 +00:00
|
|
|
export function getRecentRooms(list: Array<Object>): Array<Object> {
|
|
|
|
const recentRoomDS = [];
|
|
|
|
|
|
|
|
if (list.length) {
|
|
|
|
// We init the locale on every list render, so then it changes
|
|
|
|
// immediately if a language change happens in the app.
|
|
|
|
const locale = _getSupportedLocale();
|
|
|
|
|
|
|
|
for (const e of list) {
|
|
|
|
const location = parseURIString(e.conference);
|
|
|
|
|
|
|
|
if (location && location.room && location.hostname) {
|
|
|
|
recentRoomDS.push({
|
|
|
|
baseURL: `${location.protocol}//${location.host}`,
|
|
|
|
conference: e.conference,
|
|
|
|
conferenceDuration: e.conferenceDuration,
|
|
|
|
conferenceDurationString:
|
|
|
|
_getDurationString(
|
|
|
|
e.conferenceDuration,
|
|
|
|
locale),
|
|
|
|
dateString: _getDateString(e.date, locale),
|
|
|
|
dateTimeStamp: e.date,
|
|
|
|
initials: _getInitials(location.room),
|
|
|
|
room: location.room,
|
|
|
|
serverName: location.hostname
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-12-13 10:35:42 +00:00
|
|
|
|
2018-01-17 11:19:10 +00:00
|
|
|
return recentRoomDS.reverse();
|
2017-12-13 10:35:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2017-12-20 00:49:36 +00:00
|
|
|
* Returns a well formatted date string to be displayed in the list.
|
|
|
|
*
|
|
|
|
* @param {number} dateTimeStamp - The UTC timestamp to be converted to String.
|
2017-12-25 18:03:46 +00:00
|
|
|
* @param {string} locale - The locale to init the formatter with. Note: This
|
2018-01-26 18:18:43 +00:00
|
|
|
* locale must be supported by the formatter so ensure this prerequisite before
|
|
|
|
* invoking the function.
|
2017-12-20 00:49:36 +00:00
|
|
|
* @private
|
|
|
|
* @returns {string}
|
|
|
|
*/
|
2017-12-25 18:03:46 +00:00
|
|
|
function _getDateString(dateTimeStamp: number, locale: string) {
|
2017-12-13 10:35:42 +00:00
|
|
|
const date = new Date(dateTimeStamp);
|
2017-12-25 18:03:46 +00:00
|
|
|
const m = _getLocalizedFormatter(date, locale);
|
2017-12-13 10:35:42 +00:00
|
|
|
|
|
|
|
if (date.toDateString() === new Date().toDateString()) {
|
2017-12-20 00:49:36 +00:00
|
|
|
// The date is today, we use fromNow format.
|
|
|
|
return m.fromNow();
|
2017-12-13 10:35:42 +00:00
|
|
|
}
|
|
|
|
|
2017-12-20 00:49:36 +00:00
|
|
|
return m.format('lll');
|
2017-12-13 10:35:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2017-12-20 00:49:36 +00:00
|
|
|
* Returns a well formatted duration string to be displayed as the conference
|
|
|
|
* length.
|
|
|
|
*
|
|
|
|
* @param {number} duration - The duration in MS.
|
2017-12-25 18:03:46 +00:00
|
|
|
* @param {string} locale - The locale to init the formatter with. Note: This
|
2018-01-26 18:18:43 +00:00
|
|
|
* locale must be supported by the formatter so ensure this prerequisite before
|
|
|
|
* invoking the function.
|
2017-12-20 00:49:36 +00:00
|
|
|
* @private
|
|
|
|
* @returns {string}
|
|
|
|
*/
|
2017-12-25 18:03:46 +00:00
|
|
|
function _getDurationString(duration: number, locale: string) {
|
2018-01-17 11:19:10 +00:00
|
|
|
return _getLocalizedFormatter(duration, locale).humanize();
|
2017-12-13 10:35:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2017-12-20 00:49:36 +00:00
|
|
|
* Returns the initials supposed to be used based on the room name.
|
|
|
|
*
|
|
|
|
* @param {string} room - The room name.
|
|
|
|
* @private
|
|
|
|
* @returns {string}
|
|
|
|
*/
|
2017-12-13 10:35:42 +00:00
|
|
|
function _getInitials(room: string) {
|
|
|
|
return room && room.charAt(0) ? room.charAt(0).toUpperCase() : '?';
|
|
|
|
}
|
2017-12-25 18:03:46 +00:00
|
|
|
|
|
|
|
/**
|
2018-01-29 22:20:38 +00:00
|
|
|
* Returns a localized date formatter initialized with a specific {@code Date}
|
|
|
|
* or duration ({@code number}).
|
2017-12-25 18:03:46 +00:00
|
|
|
*
|
|
|
|
* @private
|
2018-01-17 11:19:10 +00:00
|
|
|
* @param {Date | number} dateOrDuration - The date or duration to format.
|
2018-01-29 22:20:38 +00:00
|
|
|
* @param {string} locale - The locale to init the formatter with. Note: The
|
|
|
|
* specified locale must be supported by the formatter so ensure the
|
|
|
|
* prerequisite is met before invoking the function.
|
2017-12-25 18:03:46 +00:00
|
|
|
* @returns {Object}
|
|
|
|
*/
|
2018-01-17 11:19:10 +00:00
|
|
|
function _getLocalizedFormatter(dateOrDuration: Date | number, locale: string) {
|
|
|
|
const m
|
|
|
|
= typeof dateOrDuration === 'number'
|
|
|
|
? moment.duration(dateOrDuration)
|
|
|
|
: moment(dateOrDuration);
|
2017-12-25 18:03:46 +00:00
|
|
|
|
2018-01-17 11:19:10 +00:00
|
|
|
return m.locale(locale);
|
2017-12-25 18:03:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A lenient locale matcher to match language and dialect if possible.
|
|
|
|
*
|
|
|
|
* @private
|
|
|
|
* @returns {string}
|
|
|
|
*/
|
|
|
|
function _getSupportedLocale() {
|
2018-01-26 18:18:43 +00:00
|
|
|
const i18nLocale = i18next.language;
|
|
|
|
let supportedLocale;
|
|
|
|
|
|
|
|
if (i18nLocale) {
|
|
|
|
const localeRegexp = new RegExp('^([a-z]{2,2})(-)*([a-z]{2,2})*$');
|
|
|
|
const localeResult = localeRegexp.exec(i18nLocale.toLowerCase());
|
|
|
|
|
|
|
|
if (localeResult) {
|
|
|
|
const currentLocaleRegexp
|
|
|
|
= new RegExp(
|
|
|
|
`^${localeResult[1]}(-)*${`(${localeResult[3]})*` || ''}`);
|
|
|
|
|
|
|
|
supportedLocale
|
|
|
|
= moment.locales().find(lang => currentLocaleRegexp.exec(lang));
|
|
|
|
}
|
2017-12-25 18:03:46 +00:00
|
|
|
}
|
|
|
|
|
2018-01-26 18:18:43 +00:00
|
|
|
return supportedLocale || 'en';
|
2017-12-25 18:03:46 +00:00
|
|
|
}
|