mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-10-31 19:17:48 +00:00 
			
		
		
		
	 d45527b851
			
		
	
	d45527b851
	
	
	
		
			
			Fixes [CW-5540](https://linear.app/chatwoot/issue/CW-5540/feat-allow-retry-a-failed-message-sendout), https://github.com/chatwoot/chatwoot/issues/12333 ## Type of change - [x] New feature (non-breaking change which adds functionality) ## How Has This Been Tested? ### Screenshot <img width="196" height="113" alt="image" src="https://github.com/user-attachments/assets/8b4a1aa9-c75c-4169-b4a2-e89148647e91" /> ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [x] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --------- Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>
		
			
				
	
	
		
			117 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import {
 | |
|   format,
 | |
|   isSameYear,
 | |
|   fromUnixTime,
 | |
|   formatDistanceToNow,
 | |
|   differenceInDays,
 | |
| } from 'date-fns';
 | |
| 
 | |
| /**
 | |
|  * Formats a Unix timestamp into a human-readable time format.
 | |
|  * @param {number} time - Unix timestamp.
 | |
|  * @param {string} [dateFormat='h:mm a'] - Desired format of the time.
 | |
|  * @returns {string} Formatted time string.
 | |
|  */
 | |
| export const messageStamp = (time, dateFormat = 'h:mm a') => {
 | |
|   const unixTime = fromUnixTime(time);
 | |
|   return format(unixTime, dateFormat);
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Provides a formatted timestamp, adjusting the format based on the current year.
 | |
|  * @param {number} time - Unix timestamp.
 | |
|  * @param {string} [dateFormat='MMM d, yyyy'] - Desired date format.
 | |
|  * @returns {string} Formatted date string.
 | |
|  */
 | |
| export const messageTimestamp = (time, dateFormat = 'MMM d, yyyy') => {
 | |
|   const messageTime = fromUnixTime(time);
 | |
|   const now = new Date();
 | |
|   const messageDate = format(messageTime, dateFormat);
 | |
|   if (!isSameYear(messageTime, now)) {
 | |
|     return format(messageTime, 'LLL d y, h:mm a');
 | |
|   }
 | |
|   return messageDate;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Converts a Unix timestamp to a relative time string (e.g., 3 hours ago).
 | |
|  * @param {number} time - Unix timestamp.
 | |
|  * @returns {string} Relative time string.
 | |
|  */
 | |
| export const dynamicTime = time => {
 | |
|   const unixTime = fromUnixTime(time);
 | |
|   return formatDistanceToNow(unixTime, { addSuffix: true });
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Formats a Unix timestamp into a specified date format.
 | |
|  * @param {number} time - Unix timestamp.
 | |
|  * @param {string} [dateFormat='MMM d, yyyy'] - Desired date format.
 | |
|  * @returns {string} Formatted date string.
 | |
|  */
 | |
| export const dateFormat = (time, df = 'MMM d, yyyy') => {
 | |
|   const unixTime = fromUnixTime(time);
 | |
|   return format(unixTime, df);
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Converts a detailed time description into a shorter format, optionally appending 'ago'.
 | |
|  * @param {string} time - Detailed time description (e.g., 'a minute ago').
 | |
|  * @param {boolean} [withAgo=false] - Whether to append 'ago' to the result.
 | |
|  * @returns {string} Shortened time description.
 | |
|  */
 | |
| export const shortTimestamp = (time, withAgo = false) => {
 | |
|   // This function takes a time string and converts it to a short time string
 | |
|   // with the following format: 1m, 1h, 1d, 1mo, 1y
 | |
|   // The function also takes an optional boolean parameter withAgo
 | |
|   // which will add the word "ago" to the end of the time string
 | |
|   const suffix = withAgo ? ' ago' : '';
 | |
|   const timeMappings = {
 | |
|     'less than a minute ago': 'now',
 | |
|     'a minute ago': `1m${suffix}`,
 | |
|     'an hour ago': `1h${suffix}`,
 | |
|     'a day ago': `1d${suffix}`,
 | |
|     'a month ago': `1mo${suffix}`,
 | |
|     'a year ago': `1y${suffix}`,
 | |
|   };
 | |
|   // Check if the time string is one of the specific cases
 | |
|   if (timeMappings[time]) {
 | |
|     return timeMappings[time];
 | |
|   }
 | |
|   const convertToShortTime = time
 | |
|     .replace(/about|over|almost|/g, '')
 | |
|     .replace(' minute ago', `m${suffix}`)
 | |
|     .replace(' minutes ago', `m${suffix}`)
 | |
|     .replace(' hour ago', `h${suffix}`)
 | |
|     .replace(' hours ago', `h${suffix}`)
 | |
|     .replace(' day ago', `d${suffix}`)
 | |
|     .replace(' days ago', `d${suffix}`)
 | |
|     .replace(' month ago', `mo${suffix}`)
 | |
|     .replace(' months ago', `mo${suffix}`)
 | |
|     .replace(' year ago', `y${suffix}`)
 | |
|     .replace(' years ago', `y${suffix}`);
 | |
|   return convertToShortTime;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Calculates the difference in days between now and a given timestamp.
 | |
|  * @param {Date} now - Current date/time.
 | |
|  * @param {number} timestampInSeconds - Unix timestamp in seconds.
 | |
|  * @returns {number} Number of days difference.
 | |
|  */
 | |
| export const getDayDifferenceFromNow = (now, timestampInSeconds) => {
 | |
|   const date = new Date(timestampInSeconds * 1000);
 | |
|   return differenceInDays(now, date);
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Checks if more than 24 hours have passed since a given timestamp.
 | |
|  * Useful for determining if retry/refresh actions should be disabled.
 | |
|  * @param {number} timestamp - Unix timestamp.
 | |
|  * @returns {boolean} True if more than 24 hours have passed.
 | |
|  */
 | |
| export const hasOneDayPassed = timestamp => {
 | |
|   if (!timestamp) return true; // Defensive check
 | |
|   return getDayDifferenceFromNow(new Date(), timestamp) >= 1;
 | |
| };
 |