@sprucelabs/calendar-utils 36.1.3 → 36.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,10 @@
1
1
  import { AbstractEventEmitter } from '@sprucelabs/mercury-event-emitter';
2
2
  import { Locale, TimezoneName } from '../types/calendar.types';
3
3
  export default class LocaleImpl extends AbstractEventEmitter<LocaleContract> implements Locale {
4
+ private zoneNameByOffset;
5
+ private offsetsForDate;
4
6
  private offset;
5
- private currentZone?;
7
+ protected currentZone?: TimezoneName;
6
8
  private timezoneChoices;
7
9
  constructor();
8
10
  setTimezoneOffsetMinutes(offset: number): void;
@@ -17,6 +17,8 @@ import TimezoneChoiceSorter from './TimezoneChoiceSorter.js';
17
17
  export default class LocaleImpl extends AbstractEventEmitter {
18
18
  constructor() {
19
19
  super(localeContract);
20
+ this.zoneNameByOffset = {};
21
+ this.offsetsForDate = {};
20
22
  this.offset = new Date().getTimezoneOffset() * -1;
21
23
  const sorter = new TimezoneChoiceSorter(this);
22
24
  this.timezoneChoices = sorter.sort(timezoneChoices);
@@ -27,7 +29,12 @@ export default class LocaleImpl extends AbstractEventEmitter {
27
29
  }
28
30
  getTimezoneOffsetMinutes(onDate) {
29
31
  if (onDate) {
30
- return this.zoneNameToOffsetMinutes(this.getZoneName(), onDate);
32
+ const dateRoundedToNearestHour = onDate - (onDate % 3600000);
33
+ const key = `${this.getZoneName()}-${dateRoundedToNearestHour}`;
34
+ if (!this.offsetsForDate[key]) {
35
+ this.offsetsForDate[key] = this.zoneNameToOffsetMinutes(this.getZoneName(), onDate);
36
+ }
37
+ return this.offsetsForDate[key];
31
38
  }
32
39
  return this.offset;
33
40
  }
@@ -51,12 +58,16 @@ export default class LocaleImpl extends AbstractEventEmitter {
51
58
  if (offset === 0) {
52
59
  return 'UTC';
53
60
  }
54
- return this.timezoneChoices
61
+ if (this.zoneNameByOffset[offset]) {
62
+ return this.zoneNameByOffset[offset];
63
+ }
64
+ this.zoneNameByOffset[offset] = this.timezoneChoices
55
65
  .map((t) => t.value)
56
66
  .find((name) => {
57
67
  const o = this.zoneNameToOffsetMinutes(name);
58
68
  return o === offset;
59
69
  });
70
+ return this.zoneNameByOffset[offset];
60
71
  }
61
72
  zoneNameToOffsetMinutes(name, onDate) {
62
73
  const results = getTimezoneOffset(name, onDate);
@@ -1,8 +1,10 @@
1
1
  import { AbstractEventEmitter } from '@sprucelabs/mercury-event-emitter';
2
2
  import { Locale, TimezoneName } from '../types/calendar.types';
3
3
  export default class LocaleImpl extends AbstractEventEmitter<LocaleContract> implements Locale {
4
+ private zoneNameByOffset;
5
+ private offsetsForDate;
4
6
  private offset;
5
- private currentZone?;
7
+ protected currentZone?: TimezoneName;
6
8
  private timezoneChoices;
7
9
  constructor();
8
10
  setTimezoneOffsetMinutes(offset: number): void;
@@ -13,6 +13,8 @@ const TimezoneChoiceSorter_1 = __importDefault(require("./TimezoneChoiceSorter")
13
13
  class LocaleImpl extends mercury_event_emitter_1.AbstractEventEmitter {
14
14
  constructor() {
15
15
  super(localeContract);
16
+ this.zoneNameByOffset = {};
17
+ this.offsetsForDate = {};
16
18
  this.offset = new Date().getTimezoneOffset() * -1;
17
19
  const sorter = new TimezoneChoiceSorter_1.default(this);
18
20
  this.timezoneChoices = sorter.sort(spruce_core_schemas_1.timezoneChoices);
@@ -23,7 +25,12 @@ class LocaleImpl extends mercury_event_emitter_1.AbstractEventEmitter {
23
25
  }
24
26
  getTimezoneOffsetMinutes(onDate) {
25
27
  if (onDate) {
26
- return this.zoneNameToOffsetMinutes(this.getZoneName(), onDate);
28
+ const dateRoundedToNearestHour = onDate - (onDate % 3600000);
29
+ const key = `${this.getZoneName()}-${dateRoundedToNearestHour}`;
30
+ if (!this.offsetsForDate[key]) {
31
+ this.offsetsForDate[key] = this.zoneNameToOffsetMinutes(this.getZoneName(), onDate);
32
+ }
33
+ return this.offsetsForDate[key];
27
34
  }
28
35
  return this.offset;
29
36
  }
@@ -45,12 +52,16 @@ class LocaleImpl extends mercury_event_emitter_1.AbstractEventEmitter {
45
52
  if (offset === 0) {
46
53
  return 'UTC';
47
54
  }
48
- return this.timezoneChoices
55
+ if (this.zoneNameByOffset[offset]) {
56
+ return this.zoneNameByOffset[offset];
57
+ }
58
+ this.zoneNameByOffset[offset] = this.timezoneChoices
49
59
  .map((t) => t.value)
50
60
  .find((name) => {
51
61
  const o = this.zoneNameToOffsetMinutes(name);
52
62
  return o === offset;
53
63
  });
64
+ return this.zoneNameByOffset[offset];
54
65
  }
55
66
  zoneNameToOffsetMinutes(name, onDate) {
56
67
  const results = (0, date_fns_tz_1.getTimezoneOffset)(name, onDate);
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "36.1.3",
6
+ "version": "36.1.5",
7
7
  "files": [
8
8
  "build/**/*",
9
9
  "!build/__tests__",