diff --git a/app/javascript/shared/helpers/DateHelper.js b/app/javascript/shared/helpers/DateHelper.js index 15638c5a8..c8b0f231b 100644 --- a/app/javascript/shared/helpers/DateHelper.js +++ b/app/javascript/shared/helpers/DateHelper.js @@ -30,3 +30,10 @@ export const isTimeAfter = (h1, m1, h2, m2) => { return true; }; + +export const generateRelativeTime = (value, unit, languageCode) => { + const rtf = new Intl.RelativeTimeFormat(languageCode, { + numeric: 'auto', + }); + return rtf.format(value, unit); +}; diff --git a/app/javascript/shared/helpers/specs/DateHelper.spec.js b/app/javascript/shared/helpers/specs/DateHelper.spec.js index c67c1a27b..030910a3d 100644 --- a/app/javascript/shared/helpers/specs/DateHelper.spec.js +++ b/app/javascript/shared/helpers/specs/DateHelper.spec.js @@ -3,6 +3,7 @@ import { formatUnixDate, formatDigitToString, isTimeAfter, + generateRelativeTime, } from '../DateHelper'; describe('#DateHelper', () => { @@ -62,3 +63,16 @@ describe('#isTimeAfter', () => { expect(isTimeAfter(11, 59, 12, 0)).toEqual(false); }); }); + +describe('#generateRelativeTime', () => { + it('should return correct relative time', () => { + expect(generateRelativeTime(-1, 'day', 'en')).toEqual('yesterday'); + expect(generateRelativeTime(1, 'day', 'en')).toEqual('tomorrow'); + expect(generateRelativeTime(1, 'hour', 'en')).toEqual('in 1 hour'); + expect(generateRelativeTime(-1, 'hour', 'en')).toEqual('1 hour ago'); + expect(generateRelativeTime(1, 'minute', 'en')).toEqual('in 1 minute'); + expect(generateRelativeTime(-1, 'minute', 'en')).toEqual('1 minute ago'); + expect(generateRelativeTime(1, 'second', 'en')).toEqual('in 1 second'); + expect(generateRelativeTime(-1, 'second', 'en')).toEqual('1 second ago'); + }); +}); diff --git a/app/javascript/widget/components/ChatHeader.vue b/app/javascript/widget/components/ChatHeader.vue index 906c98d14..f6a8aecd8 100644 --- a/app/javascript/widget/components/ChatHeader.vue +++ b/app/javascript/widget/components/ChatHeader.vue @@ -46,6 +46,7 @@ import { mapGetters } from 'vuex'; import availabilityMixin from 'widget/mixins/availability'; +import nextAvailabilityTime from 'widget/mixins/nextAvailabilityTime'; import FluentIcon from 'shared/components/FluentIcon/Index.vue'; import HeaderActions from './HeaderActions'; import routerMixin from 'widget/mixins/routerMixin'; @@ -57,7 +58,7 @@ export default { FluentIcon, HeaderActions, }, - mixins: [availabilityMixin, routerMixin, darkMixin], + mixins: [nextAvailabilityTime, availabilityMixin, routerMixin, darkMixin], props: { avatarUrl: { type: String, @@ -93,11 +94,6 @@ export default { } return anyAgentOnline; }, - replyWaitMessage() { - return this.isOnline - ? this.replyTimeStatus - : this.$t('TEAM_AVAILABILITY.OFFLINE'); - }, }, methods: { onBackButtonClick() { diff --git a/app/javascript/widget/components/TeamAvailability.vue b/app/javascript/widget/components/TeamAvailability.vue index a3a6b0c02..8305c7a4e 100644 --- a/app/javascript/widget/components/TeamAvailability.vue +++ b/app/javascript/widget/components/TeamAvailability.vue @@ -35,6 +35,7 @@