ng-time-past-pipe
Version:
Reactive textual representation of the time that has been passed between a given date and now in your Angular App.
1 lines • 20.8 kB
Source Map (JSON)
{"version":3,"file":"ng-time-past-pipe.mjs","sources":["../../../projects/ng-time-past-pipe/src/lib/time-diff.ts","../../../projects/ng-time-past-pipe/src/lib/time-interval.ts","../../../projects/ng-time-past-pipe/src/lib/time-past.ts","../../../projects/ng-time-past-pipe/src/lib/ticker.ts","../../../projects/ng-time-past-pipe/src/lib/time-past.pipe.ts","../../../projects/ng-time-past-pipe/src/lib/time-past.service.ts","../../../projects/ng-time-past-pipe/src/ng-time-past-pipe.ts"],"sourcesContent":["import { inject, InjectFlags, InjectionToken } from '@angular/core';\n\n/**\n * Represents the Time Difference in the different time units\n *\n * @public\n * @api\n */\nexport interface TimeDiff {\n seconds: number;\n minutes: number;\n hours: number;\n months: number;\n days: number;\n years: number;\n isFuture?: boolean;\n}\n\n/**\n * Function Type for the `TimeDiffGenerator`\n *\n * @public\n * @api\n */\nexport type TimeDiffGenerator = (diff: TimeDiff) => string;\n\n/**\n * Custom `TimeDiffGenerator` Injection Token\n *\n * @public\n * @api\n */\nexport const CUSTOM_TIME_DIFF_GENERATOR = new InjectionToken<TimeDiffGenerator>(\n 'Custom Time Diff Generator'\n);\n\n/**\n * Return a respective textual representation of the input, as the input is a timespan that has been passed.\n *\n * @param diff The time diff object\n * @public\n * @api\n */\nexport const defaultTimeDiffGenerator: TimeDiffGenerator = (\n diff: TimeDiff\n): string => {\n if (diff.seconds === 0) {\n return 'about now';\n }\n\n return diff.isFuture ? getFutureDiffString(diff) : getPastDiffString(diff);\n};\n\nexport const getPastDiffString = (diff: TimeDiff) => {\n const { seconds, minutes, hours, months, days, years } = diff;\n\n if (seconds <= 5) {\n return 'a few seconds ago';\n } else if (seconds <= 59) {\n return seconds + ' seconds ago';\n } else if (seconds <= 90) {\n return 'about a minute ago';\n }\n\n if (minutes <= 45) {\n return minutes + ' minutes ago';\n } else if (minutes <= 90) {\n return 'one hour ago';\n }\n\n if (hours <= 22) {\n return hours + ' hours ago';\n } else if (hours <= 36) {\n return 'a day ago';\n }\n\n if (days <= 25) {\n return days + ' days ago';\n } else if (days <= 45) {\n return 'a month ago';\n }\n\n if (days <= 345) {\n return months + ' months ago';\n } else if (days <= 545) {\n return 'a year ago';\n }\n\n return years + ' years ago';\n};\n\nexport const getFutureDiffString = (diff: TimeDiff): string => {\n const { seconds, minutes, hours, months, days, years } = diff;\n\n if (seconds <= 59) {\n return 'in ' + seconds + ' seconds';\n }\n\n if (seconds <= 90) {\n return 'in one minute';\n } else if (minutes <= 59) {\n return 'in ' + minutes + ' minutes';\n }\n\n if (minutes <= 90) {\n return 'in one hour';\n } else if (hours <= 22) {\n return 'in ' + hours + ' hours';\n }\n\n if (hours <= 36) {\n return 'in one day';\n } else if (days <= 25) {\n return 'in ' + days + ' days';\n }\n\n if (days <= 45) {\n return 'in one month';\n } else if (days <= 345) {\n return 'in ' + months + ' months';\n }\n\n if (days <= 545) {\n return 'in one year';\n }\n\n return 'in ' + years + ' years';\n};\n\n/**\n * Provides the TimeDiffGenerator preferring a custom provider for internal usage\n *\n * @internal\n */\nexport const TIME_DIFF_GENERATOR = new InjectionToken<TimeDiffGenerator>(\n 'Time Diff Generator',\n {\n factory: () => {\n const customGenerator = inject(\n CUSTOM_TIME_DIFF_GENERATOR,\n InjectFlags.Optional\n );\n return customGenerator ?? defaultTimeDiffGenerator;\n },\n }\n);\n\n/**\n * TimeDiff Factory\n *\n * @param seconds The time difference in seconds. Negative values are considered as a future event\n * @internal\n */\nexport const createTimeDiff = (seconds: number): TimeDiff => {\n const isFuture = seconds < 0;\n\n if (isFuture) {\n seconds = Math.abs(seconds);\n }\n\n const diff: Partial<TimeDiff> = { seconds, isFuture };\n\n diff.minutes = Math.round(seconds / 60);\n diff.hours = Math.round(diff.minutes / 60);\n diff.days = Math.round(diff.hours / 24);\n diff.months = Math.round(diff.days / 30.416);\n diff.years = Math.round(diff.days / 365);\n\n return diff as TimeDiff;\n};\n","import { TimeDiff } from './time-diff';\nimport { inject, InjectFlags, InjectionToken } from '@angular/core';\n\n/**\n * Function Type for the `UpdateIntervalGenerator`\n *\n * @public\n * @api\n */\nexport type UpdateIntervalGenerator = (diff: TimeDiff) => number;\n\n/**\n * Custom `UpdateIntervalGenerator` Injection Token\n *\n * @public\n * @api\n */\nexport const CUSTOM_UPDATE_INTERVAL_GENERATOR = new InjectionToken<UpdateIntervalGenerator>('Custom Update Interval Generator');\n\n/**\n * Determinate the point of time on when the output should be checked for a update\n *\n * @param diff The time diff object\n * @return A point of time in future in seconds\n * @public\n * @api\n */\nexport const defaultUpdateIntervalGenerator: UpdateIntervalGenerator = (diff: TimeDiff): number => {\n if (diff.seconds < 60) { // less than 1 min, update every second\n return 1;\n } else if (diff.seconds < 3600) { // less than an hour, update every 30 secs\n return 30;\n } else if (diff.seconds < 86400) { // less than a day, update every 5 min\n return 300;\n }\n // update every hour\n return 3600;\n};\n\n/**\n * Provides the `UpdateIntervalGenerator` preferring a custom provider for internal usage\n *\n * @internal\n */\nexport const UPDATE_INTERVAL_GENERATOR = new InjectionToken<UpdateIntervalGenerator>('Update Interval Generator', {\n factory: () => {\n const customGenerator = inject(CUSTOM_UPDATE_INTERVAL_GENERATOR, InjectFlags.Optional);\n return customGenerator ?? defaultUpdateIntervalGenerator;\n },\n});\n","/**\n * Accessor Input Type\n */\nexport type TAInput = number | string | Date;\n\n/**\n * Optimistic parse a given input to seconds that past between it and now\n *\n * @param value A value of type string, number or date\n * @return The time past in seconds between now and input value\n * @internal\n */\nexport const parseInputValue = (value: TAInput): number => {\n let dateValueTime;\n if (typeof value === 'number') {\n if (value <= 0) {\n // Negative number will always be handled as seconds in the future\n return value;\n }\n\n const length = Math.ceil(Math.log10(value + 1));\n if (length < 10 && length > 0) {\n return value; // Guessing the input is already the passed seconds\n }\n\n if (length === 10) { value *= 1000; } // Guessing UnixTimestamp\n dateValueTime = value; // All other lengths are considered intentional and therefore processed\n } else {\n // Use Date constructor to determine the microseconds\n dateValueTime = (value instanceof Date ? value : new Date(value)).getTime();\n }\n\n return Math.floor((Date.now() - dateValueTime) / 1000);\n};\n\n/**\n * Strict TAInput Type Validator\n *\n * @param value The optimistic input value to validate\n * @internal\n */\nexport const validateTAInputType = (value: TAInput): boolean => {\n return (typeof value === 'number' || typeof value === 'string' || value instanceof Date);\n};\n","import { InjectionToken } from '@angular/core';\nimport { interval, Observable } from 'rxjs';\n\nexport const TIME_PAST_TICKER = new InjectionToken<Observable<number>>('TimePastTimer', {\n factory: () => interval(1000),\n providedIn: 'root'\n});\n","import {\n ChangeDetectorRef,\n Inject,\n OnDestroy,\n Pipe,\n PipeTransform,\n} from '@angular/core';\nimport {\n createTimeDiff,\n TIME_DIFF_GENERATOR,\n TimeDiffGenerator,\n} from './time-diff';\nimport {\n UPDATE_INTERVAL_GENERATOR,\n UpdateIntervalGenerator,\n} from './time-interval';\nimport { parseInputValue, TAInput, validateTAInputType } from './time-past';\nimport { TIME_PAST_TICKER } from './ticker';\nimport { Observable, Subscription } from 'rxjs';\nimport { filter, map } from 'rxjs/operators';\n\n@Pipe({\n standalone: true,\n name: 'timePast',\n pure: false,\n})\nexport class TimePastPipe implements PipeTransform, OnDestroy {\n private initialSeconds: any;\n private lastInput: any;\n private lastSeconds: number;\n private lastResult: string;\n\n private currentPeriod = 1;\n private readonly intervalTimer = this.ticker.pipe(\n filter((tick) => tick % this.currentPeriod === 0),\n map((tick) => tick / this.currentPeriod)\n );\n private readonly intervalSubscription: Subscription;\n\n /**\n * TimePastPipe Class Constructor\n */\n constructor(\n private readonly changeDetectorRef: ChangeDetectorRef,\n @Inject(TIME_PAST_TICKER) private readonly ticker: Observable<number>,\n @Inject(TIME_DIFF_GENERATOR)\n private readonly timeDiffGenerator: TimeDiffGenerator,\n @Inject(UPDATE_INTERVAL_GENERATOR)\n private readonly updateIntervalGenerator: UpdateIntervalGenerator\n ) {\n this.intervalSubscription = this.intervalTimer.subscribe(() => {\n this.changeDetectorRef.markForCheck();\n });\n }\n\n /**\n * Transform anything that can be parsed to a Date in the past, to a string that represent the relative\n * time that has been passed between now and this point of time.\n *\n * @param value A value that can be parsed to a Date in the past or future\n * @param overflow Overflow to time in past when initial date was in future\n * @return The textual representation of the time that has been passed between the given Date\n * and the current.\n */\n transform<T extends TAInput>(value: T, overflow = true): string | T {\n if (this.isValidInput(value) === false) {\n return value;\n }\n\n const seconds = parseInputValue(value);\n this.initialSeconds ||= seconds;\n\n if (this.lastSeconds === seconds || (overflow === false && this.initialSeconds < 0 && seconds > 0)) {\n return this.lastResult;\n }\n\n // The ChangeDetector should not call transform again while the new value is being resolved\n this.changeDetectorRef.detach();\n\n this.lastSeconds = seconds;\n\n const timeDiff = createTimeDiff(seconds);\n const result = (this.lastResult = this.timeDiffGenerator(timeDiff));\n\n // Make sure the update interval refreshed as well\n this.currentPeriod = this.updateIntervalGenerator(timeDiff);\n\n // Reattach the ChangeDetector so that further changes are being transformed\n this.changeDetectorRef.reattach();\n\n return result;\n }\n\n /**\n * Validate the Input Value and log a warning per value when it fails\n *\n * @param value\n * @private\n */\n private isValidInput(value: TAInput): boolean {\n const validationResult = validateTAInputType(value);\n\n if (validationResult === false && this.lastInput !== value) {\n console.warn(\n `[TimePastPipe] Invalid Input of type ${typeof value} (${value}).`\n );\n }\n\n this.lastInput = value;\n\n return validationResult;\n }\n\n /**\n * Clear interval ticker subscription\n */\n ngOnDestroy(): void {\n if (this.intervalSubscription) {\n this.intervalSubscription.unsubscribe();\n }\n }\n}\n\n/**\n * @deprecated Use TimePastPipe instead\n */\nexport const NgTimePastPipePipe = TimePastPipe;\n","import { Inject, Injectable } from '@angular/core';\nimport { createTimeDiff, TIME_DIFF_GENERATOR, TimeDiffGenerator } from './time-diff';\nimport { parseInputValue, TAInput, validateTAInputType } from './time-past';\n\n@Injectable({ providedIn: 'root' })\n/**\n * Public TimePast Service Class\n *\n * @public\n * @api\n */\nexport class TimePastService {\n constructor(@Inject(TIME_DIFF_GENERATOR) private readonly timeDiffGenerator: TimeDiffGenerator) { }\n\n /**\n * Transform anything that can be parsed to a Date in the past, to a string that represent the relative\n * time that has been passed between now and this point of time.\n *\n * @param value A value that can be parsed to a Date in the past\n * @return The textual representation of the time that has been passed between the given Date\n * and the current.\n */\n timePast(value: TAInput): string {\n if (validateTAInputType(value) === false) {\n return undefined;\n }\n\n const seconds = parseInputValue(value);\n const timeDiff = createTimeDiff(seconds);\n\n return this.timeDiffGenerator(timeDiff);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}