feat: convert from using dst offsets to use timezone code

feat: select timezones from current selected country
This commit is contained in:
Sérgio Salgado 2021-11-22 17:30:37 +00:00
parent cc8c48ff4c
commit 7d6fb17158
16 changed files with 86 additions and 117 deletions

View file

@ -1,89 +1,23 @@
import moment from 'moment'
import * as R from 'ramda'
import { format } from 'date-fns'
import { zonedTimeToUtc, utcToZonedTime } from 'date-fns-tz'
// import moment from 'moment'
// import * as R from 'ramda'
const getPossibleUTCDSTPairs = timezones =>
R.map(
it => ({
utcOffset: it.utcOffset,
dstOffset: it.dstOffset,
utcOffsetStr: it.utcOffsetStr,
dstOffsetStr: it.dstOffsetStr
}),
R.uniqBy(
it => [it.utcOffset, it.dstOffset, it.utcOffsetStr, it.dstOffsetStr],
timezones
)
)
// const buildLabel = tz => {
// return `(UTC${tz.utcOffsetStr}) ${R.map(it => it.city, tz.cities).join(', ')}`
// }
const getFormattedTimezones = timezones =>
R.sort(
R.ascend(R.prop('utcOffset')),
R.map(
it => ({
utcOffset: it.utcOffset,
dstOffset: it.dstOffset,
utcOffsetStr: it.utcOffsetStr,
dstOffsetStr: it.dstOffsetStr,
cities: R.map(
ite => {
const regionCityPair = R.split('/', ite.name)
return {
region: regionCityPair[0],
city: R.replace(/_/g, ' ', regionCityPair[1]),
country: ite.country
}
},
R.filter(
itx =>
R.eqProps('utcOffset', it, itx) &&
R.eqProps('dstOffset', it, itx) &&
!R.isNil(itx.country) &&
!R.includes('Etc', itx.name) &&
R.includes('/', itx.name),
timezones
)
)
}),
getPossibleUTCDSTPairs(timezones)
)
const formatDate = (date, timezone, pattern) => {
const browserTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone
const newDate = utcToZonedTime(
zonedTimeToUtc(date, browserTimezone),
timezone
)
const getFinalTimezones = timezones => {
const formattedTimezones = getFormattedTimezones(timezones)
const nonEmptyTimezones = R.filter(
it => !R.isEmpty(it.cities),
formattedTimezones
)
const nonDuplicateCities = R.map(
it => ({
...it,
cities: R.uniqBy(R.prop('country'), R.uniqBy(R.prop('city'), it.cities))
}),
nonEmptyTimezones
)
return nonDuplicateCities
return format(newDate, pattern)
}
const buildLabel = tz => {
return `(UTC${tz.utcOffsetStr}) ${R.map(it => it.city, tz.cities).join(', ')}`
const formatDateNonUtc = (date, pattern) => {
return format(date, pattern)
}
const getTzLabels = timezones =>
R.map(
it => ({ label: buildLabel(it), code: `${it.utcOffset}:${it.dstOffset}` }),
getFinalTimezones(timezones)
)
const formatDate = (date, timezoneCode, format) => {
const dstOffset = timezoneCode?.split(':')[1] ?? 0
return moment
.utc(date)
.utcOffset(parseInt(dstOffset))
.format(format)
}
const formatDateNonUtc = (date, format) => {
return moment(date).format(format)
}
export { getTzLabels, formatDate, formatDateNonUtc }
export { formatDate, formatDateNonUtc }