|
| 1 | +import {ILogger} from '@webex/cc-store'; |
| 2 | + |
| 3 | +/** |
| 4 | + * Parses the timeoutTimestamp value (string or number) to a number. |
| 5 | + * The backend sends campaignPreviewOfferTimeout as a string epoch timestamp in milliseconds. |
| 6 | + */ |
| 7 | +export const parseTimeoutTimestamp = (value: string | number | undefined, logger?: ILogger): number => { |
| 8 | + try { |
| 9 | + if (value === undefined) { |
| 10 | + return 0; |
| 11 | + } |
| 12 | + if (typeof value === 'number') { |
| 13 | + return value; |
| 14 | + } |
| 15 | + if (typeof value === 'string') { |
| 16 | + const parsed = parseInt(value, 10); |
| 17 | + if (!isNaN(parsed)) { |
| 18 | + return parsed; |
| 19 | + } |
| 20 | + } |
| 21 | + return 0; |
| 22 | + } catch (error) { |
| 23 | + logger?.error('CC-Widgets: CampaignCountdown: Error in parseTimeoutTimestamp', { |
| 24 | + module: 'cc-components#campaign-countdown.utils.ts', |
| 25 | + method: 'parseTimeoutTimestamp', |
| 26 | + error: error.message, |
| 27 | + }); |
| 28 | + return 0; |
| 29 | + } |
| 30 | +}; |
| 31 | + |
| 32 | +/** |
| 33 | + * Calculates remaining seconds based on either a timestamp or a direct seconds value. |
| 34 | + * If timeoutTimestamp is provided, it calculates the difference from now. |
| 35 | + * Otherwise, it uses timeoutInSeconds directly. |
| 36 | + */ |
| 37 | +export const calculateRemainingSeconds = ( |
| 38 | + timeoutTimestamp?: string | number, |
| 39 | + timeoutInSeconds?: number, |
| 40 | + logger?: ILogger |
| 41 | +): number => { |
| 42 | + try { |
| 43 | + // timeoutTimestamp takes precedence |
| 44 | + if (timeoutTimestamp !== undefined) { |
| 45 | + const parsedTimestamp = parseTimeoutTimestamp(timeoutTimestamp, logger); |
| 46 | + if (parsedTimestamp > 0) { |
| 47 | + const now = Date.now(); |
| 48 | + const diffMs = parsedTimestamp - now; |
| 49 | + return diffMs > 0 ? Math.ceil(diffMs / 1000) : 0; |
| 50 | + } |
| 51 | + } |
| 52 | + // Fall back to timeoutInSeconds |
| 53 | + if (typeof timeoutInSeconds === 'number') { |
| 54 | + return Math.max(0, timeoutInSeconds); |
| 55 | + } |
| 56 | + return 0; |
| 57 | + } catch (error) { |
| 58 | + logger?.error('CC-Widgets: CampaignCountdown: Error in calculateRemainingSeconds', { |
| 59 | + module: 'cc-components#campaign-countdown.utils.ts', |
| 60 | + method: 'calculateRemainingSeconds', |
| 61 | + error: error.message, |
| 62 | + }); |
| 63 | + return 0; |
| 64 | + } |
| 65 | +}; |
| 66 | + |
| 67 | +/** |
| 68 | + * Formats seconds into MM:SS format for countdown display |
| 69 | + */ |
| 70 | +export const formatCountdown = (seconds: number, logger?: ILogger): string => { |
| 71 | + try { |
| 72 | + const safeSeconds = Math.max(0, seconds); |
| 73 | + const minutes = Math.floor(safeSeconds / 60); |
| 74 | + const remainingSeconds = safeSeconds % 60; |
| 75 | + |
| 76 | + return `${minutes.toString().padStart(2, '0')}:${remainingSeconds.toString().padStart(2, '0')}`; |
| 77 | + } catch (error) { |
| 78 | + logger?.error('CC-Widgets: CampaignCountdown: Error in formatCountdown', { |
| 79 | + module: 'cc-components#campaign-countdown.utils.ts', |
| 80 | + method: 'formatCountdown', |
| 81 | + error: error.message, |
| 82 | + }); |
| 83 | + return '00:00'; |
| 84 | + } |
| 85 | +}; |
0 commit comments