From 198cd9b28d5137e9069f749e6d9b7f9b3809fba3 Mon Sep 17 00:00:00 2001 From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Date: Fri, 12 May 2023 19:25:51 +0530 Subject: [PATCH] feat: Show next available day/hour and minutes on widget (#6902) * feat: Show next available hour and minutes on widget * chore: Adds spec * chore: Show days * chore: Code clean up * chore: Review fixes * chore: Minor fixes * chore: Review suggestion fixes * chore: Minor fixes * Added timezone to widget payload * chore: Adds time zone * chore: Review fixes * chore: Adds comments * chore: Rounded up min with nearest multiple of 5 * chore: Review fixes * chore: Review fixes * chore: Review fixes * chore: Review fixes * chore: Fix specs * chore: Review fixes * chore: Fix specs * chore: Review fixes * chore: Moved day names to i18n * chore: Review fixes * chore: Fix specs --------- Co-authored-by: Tejaswini Chile Co-authored-by: Nithin David Thomas <1277421+nithindavid@users.noreply.github.com> Co-authored-by: Shivam Mishra --- app/javascript/shared/helpers/DateHelper.js | 7 + .../shared/helpers/specs/DateHelper.spec.js | 14 + .../widget/components/ChatHeader.vue | 8 +- .../widget/components/TeamAvailability.vue | 14 +- app/javascript/widget/i18n/locale/en.json | 12 +- app/javascript/widget/mixins/availability.js | 11 + .../widget/mixins/nextAvailabilityTime.js | 242 ++++++++ .../mixins/specs/nextAvailabilityTime.spec.js | 544 ++++++++++++++++++ app/views/widgets/show.html.erb | 1 + 9 files changed, 834 insertions(+), 19 deletions(-) create mode 100644 app/javascript/widget/mixins/nextAvailabilityTime.js create mode 100644 app/javascript/widget/mixins/specs/nextAvailabilityTime.spec.js 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 @@