@sanity/rich-date-input 3.0.0 → 3.0.2

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.
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2023 Sanity.io
3
+ Copyright (c) 2024 Sanity.io
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,4 +1,5 @@
1
1
  > This is a **Sanity Studio v3** plugin.
2
+ > For the v2 version, please refer to the [studio-v2 branch](https://github.com/sanity-io/rich-date-input/tree/studio-v2).
2
3
 
3
4
  # V3 Rich Date Input
4
5
 
@@ -36,15 +37,15 @@ export default defineType({
36
37
  title: 'Event',
37
38
  type: 'document',
38
39
  fields: [
39
- def{
40
+ defineField({
40
41
  name: 'scheduledAt',
41
42
  title: 'Scheduled at',
42
43
  type: 'richDate',
43
44
  //this will take the same options available on the datetime type: https://www.sanity.io/docs/datetime-type
44
45
  options: {
45
- timeStep: 30
46
- }
47
- },
46
+ timeStep: 30,
47
+ },
48
+ }),
48
49
  ],
49
50
  })
50
51
  ```
package/dist/index.esm.js CHANGED
@@ -10,7 +10,7 @@ const unlocalizeDateTime = (datetime, timezone) => {
10
10
  };
11
11
  const getConstructedUTCDate = (utc, offset) => {
12
12
  const date = new Date(utc);
13
- const currentOffset = /* @__PURE__ */new Date().getTimezoneOffset() * -1;
13
+ const currentOffset = ( /* @__PURE__ */new Date()).getTimezoneOffset() * -1;
14
14
  const diff = currentOffset - offset;
15
15
  const fakeUTCDate = new Date(date.getTime() - diff * 60 * 1e3);
16
16
  return fakeUTCDate.toISOString();
@@ -27,14 +27,15 @@ const allTimezones = getTimeZones().map(tz => {
27
27
  offset: tz.currentTimeFormat.split(" ")[0],
28
28
  // all searchable text - this is transformed before being rendered in `<AutoComplete>`
29
29
  value: "".concat(tz.currentTimeFormat, " ").concat(tz.abbreviation, " ").concat(tz.name),
30
- currentTimeOffsetInMinutes: tz.currentTimeOffsetInMinutes
30
+ currentTimeOffsetInMinutes: tz.currentTimeOffsetInMinutes,
31
+ group: tz.group
31
32
  };
32
33
  });
33
34
  const RelativeDateTimePicker = props => {
34
35
  var _a, _b;
35
36
  const value = props.dateValue;
36
37
  const timezone = (_a = value == null ? void 0 : value.timezone) != null ? _a : Intl.DateTimeFormat().resolvedOptions().timeZone;
37
- const offset = (_b = value == null ? void 0 : value.offset) != null ? _b : /* @__PURE__ */new Date().getTimezoneOffset() * -1;
38
+ const offset = (_b = value == null ? void 0 : value.offset) != null ? _b : ( /* @__PURE__ */new Date()).getTimezoneOffset() * -1;
38
39
  const handleDateChange = patch => {
39
40
  const patches = [];
40
41
  const newDatetime = patch == null ? void 0 : patch.value;
@@ -63,17 +64,18 @@ const RelativeDateTimePicker = props => {
63
64
  });
64
65
  };
65
66
  const TimezoneSelector = props => {
66
- var _a;
67
+ var _a, _b;
67
68
  const {
68
69
  onChange,
69
70
  value
70
71
  } = props;
71
72
  const currentTz = allTimezones.find(tz => tz.name === (value == null ? void 0 : value.timezone));
72
- const userTz = allTimezones.find(tz => tz.name === Intl.DateTimeFormat().resolvedOptions().timeZone);
73
+ const userTzName = Intl.DateTimeFormat().resolvedOptions().timeZone;
74
+ const userTz = (_a = allTimezones.find(tz => tz.name === userTzName)) != null ? _a : allTimezones.find(tz => tz.group.includes(userTzName));
73
75
  const handleTimezoneChange = selectedTz => {
74
- var _a2, _b;
76
+ var _a2, _b2;
75
77
  const newTimezone = (_a2 = allTimezones.find(tz => tz.value === selectedTz)) != null ? _a2 : userTz;
76
- const offset = (_b = newTimezone.currentTimeOffsetInMinutes) != null ? _b : 0;
78
+ const offset = (_b2 = newTimezone.currentTimeOffsetInMinutes) != null ? _b2 : 0;
77
79
  const timezonePatch = set(newTimezone.name, ["timezone"]);
78
80
  const offsetPatch = set(offset, ["offset"]);
79
81
  const patches = [timezonePatch, offsetPatch];
@@ -135,19 +137,19 @@ const TimezoneSelector = props => {
135
137
  return "".concat(option.alternativeName, " (").concat(option.namePretty, ")");
136
138
  },
137
139
  tabIndex: -1,
138
- value: (_a = currentTz == null ? void 0 : currentTz.value) != null ? _a : userTz.value
140
+ value: (_b = currentTz == null ? void 0 : currentTz.value) != null ? _b : userTz.value
139
141
  })
140
142
  })
141
143
  );
142
144
  };
143
145
  const TimezoneButton = props => {
144
- var _a, _b, _c;
146
+ var _a, _b, _c, _d, _e;
145
147
  const {
146
148
  onClick,
147
149
  timezone
148
150
  } = props;
149
151
  const currentTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
150
- const label = (_c = (_a = allTimezones.find(tz => tz.name === timezone)) == null ? void 0 : _a.abbreviation) != null ? _c : (_b = allTimezones.find(tz => tz.name === currentTimezone)) == null ? void 0 : _b.abbreviation;
152
+ const label = (_e = (_c = (_a = allTimezones.find(tz => tz.name === timezone)) == null ? void 0 : _a.abbreviation) != null ? _c : (_b = allTimezones.find(tz => tz.name === currentTimezone)) == null ? void 0 : _b.abbreviation) != null ? _e : (_d = allTimezones.find(tz => tz.group.includes(currentTimezone))) == null ? void 0 : _d.abbreviation;
151
153
  return /* @__PURE__ */jsx(Button, {
152
154
  fontSize: 1,
153
155
  style: {
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/utils/index.ts","../src/components/RelativeDateTimePicker.tsx","../src/components/TimezoneSelector.tsx","../src/components/TimezoneButton.tsx","../src/components/RichDateInput.tsx","../src/schema.ts","../src/index.ts"],"sourcesContent":["import {getTimeZones} from '@vvo/tzdb'\nimport {NormalizedTimeZone} from '../types'\nimport {formatInTimeZone} from 'date-fns-tz'\n\nexport const unlocalizeDateTime = (datetime: string, timezone: string): string => {\n return formatInTimeZone(datetime, timezone, 'yyyy-MM-dd HH:mm:ss')\n}\n\n/* We have to \"fake\" a UTC date to make the datepicker look \"right\"\n * to the user. For example, if someone sets 7:00AM PST, which is 3PM UTC\n * and I am on the east coast, I want to have 12:00PM UTC, which will look like 7:00AM to me\n * In other words, UTC minus 3 hours, or (UTC(my offset - their offset))\n * this is purely cosmetic and should not be saved at all\n */\nexport const getConstructedUTCDate = (utc: string, offset: number): string => {\n const date = new Date(utc)\n const currentOffset = new Date().getTimezoneOffset() * -1\n const diff = currentOffset - offset\n const fakeUTCDate = new Date(date.getTime() - diff * 60 * 1000)\n return fakeUTCDate.toISOString()\n}\n\n//keep some consistency with scheduled publishing\n//https://github.com/sanity-io/sanity-plugin-scheduled-publishing/blob/bb282e3df9a8a73df37fab8ee1fdd0e2430745be/src/hooks/useTimeZone.tsx#L17\nexport const allTimezones = getTimeZones().map((tz) => {\n return {\n abbreviation: tz.abbreviation,\n alternativeName: tz.alternativeName,\n mainCities: tz.mainCities.join(', '),\n // Main time zone name 'Africa/Dar_es_Salaam'\n name: tz.name,\n // Time zone name with underscores removed\n namePretty: tz.name.replaceAll('_', ' '),\n offset: tz.currentTimeFormat.split(' ')[0],\n // all searchable text - this is transformed before being rendered in `<AutoComplete>`\n value: `${tz.currentTimeFormat} ${tz.abbreviation} ${tz.name}`,\n currentTimeOffsetInMinutes: tz.currentTimeOffsetInMinutes,\n } as NormalizedTimeZone\n})\n","import {DateTimeInput, FormPatch, PatchEvent, InputProps, set, unset} from 'sanity'\n\nimport {getConstructedUTCDate, unlocalizeDateTime} from '../utils'\nimport {RichDate} from '../types'\nimport {formatInTimeZone, zonedTimeToUtc} from 'date-fns-tz'\n\ninterface RelativeDateTimePickerProps extends Omit<InputProps, 'renderDefault'> {\n dateValue?: RichDate\n}\n\nexport const RelativeDateTimePicker = (props: RelativeDateTimePickerProps) => {\n const value = props.dateValue\n const timezone = value?.timezone ?? Intl.DateTimeFormat().resolvedOptions().timeZone\n /*\n * if our offset is not coming from a lib, we have to reverse it\n * to get the real offset used everywhere\n * https://momentjscom.readthedocs.io/en/latest/moment/03-manipulating/09-utc-offset/\n */\n const offset = value?.offset ?? new Date().getTimezoneOffset() * -1\n const handleDateChange = (patch: FormPatch | PatchEvent | FormPatch[]) => {\n const patches = []\n const newDatetime = (patch as unknown as {value: string})?.value\n if (!newDatetime || !('type' in patch) || patch.type !== 'set') {\n props.onChange(unset())\n return\n }\n\n //get what time the user \"meant\" to set without tz info\n //since the datepicker always localizes to the user's timezone\n const desiredDateTime = unlocalizeDateTime(\n newDatetime,\n Intl.DateTimeFormat().resolvedOptions().timeZone,\n )\n\n //use the user-selected timezone here\n const utcDate = zonedTimeToUtc(desiredDateTime, timezone).toISOString()\n const localDate = formatInTimeZone(utcDate, timezone, \"yyyy-MM-dd'T'HH:mm:ssXXX\")\n\n patches.push(set(utcDate, ['utc']))\n patches.push(set(localDate, ['local']))\n\n if (!value?.timezone) {\n patches.push(set(timezone, ['timezone']))\n }\n\n if (!value?.offset) {\n patches.push(set(offset, ['offset']))\n }\n\n props.onChange(patches)\n }\n\n const dateToDisplay = value?.utc ? getConstructedUTCDate(value.utc, value.offset) : ''\n //@ts-expect-error -- slight mismatch in elementProps and renderDefault, but should line up in practice\n return <DateTimeInput {...props} onChange={handleDateChange} value={dateToDisplay} />\n}\n","import {SearchIcon} from '@sanity/icons'\nimport {ObjectInputProps, set} from 'sanity'\nimport {allTimezones, unlocalizeDateTime} from '../utils'\nimport {NormalizedTimeZone, RichDate} from '../types'\nimport {Autocomplete, Card, Text, Box} from '@sanity/ui'\nimport {formatInTimeZone, zonedTimeToUtc} from 'date-fns-tz'\n\ninterface TimezoneSelectorProps {\n onChange: Pick<ObjectInputProps, 'onChange'>['onChange']\n value?: RichDate\n}\n\nexport const TimezoneSelector = (props: TimezoneSelectorProps) => {\n const {onChange, value} = props\n const currentTz = allTimezones.find((tz) => tz.name === value?.timezone)\n const userTz = allTimezones.find(\n (tz) => tz.name === Intl.DateTimeFormat().resolvedOptions().timeZone,\n )!\n\n const handleTimezoneChange = (selectedTz: string) => {\n const newTimezone =\n allTimezones.find((tz) => tz.value === selectedTz) ?? (userTz as NormalizedTimeZone)\n\n const offset = newTimezone.currentTimeOffsetInMinutes ?? 0\n const timezonePatch = set(newTimezone.name, ['timezone'])\n const offsetPatch = set(offset, ['offset'])\n const patches = [timezonePatch, offsetPatch]\n\n //then, recalculate UTC and local from \"old\" time with the new offset\n if (value?.utc) {\n const desiredDateTime = unlocalizeDateTime(value.utc, value.timezone)\n const newUtcDate = zonedTimeToUtc(desiredDateTime, newTimezone.name).toISOString()\n const newLocalDate = formatInTimeZone(\n newUtcDate,\n newTimezone.name,\n \"yyyy-MM-dd'T'HH:mm:ssXXX\",\n )\n patches.push(set(newUtcDate, ['utc']))\n patches.push(set(newLocalDate, ['local']))\n }\n onChange(patches)\n }\n\n return (\n //taken from Scheduled Publishing, again!\n //https://github.com/sanity-io/sanity-plugin-scheduled-publishing/blob/bb282e3df9a8a73df37fab8ee1fdd0e2430745be/src/components/dialogs/DialogTimeZone.tsx#L100\n <Box padding={4}>\n <Autocomplete\n fontSize={2}\n icon={SearchIcon}\n id=\"timezone\"\n onChange={handleTimezoneChange}\n openButton\n options={allTimezones}\n padding={4}\n placeholder=\"Search for a city or time zone\"\n popover={{\n boundaryElement: document.querySelector('body'),\n constrainSize: true,\n placement: 'bottom-start',\n }}\n renderOption={(option) => {\n return (\n <Card as=\"button\" padding={3}>\n <Text size={1} textOverflow=\"ellipsis\">\n <span>GMT{option.offset}</span>\n <span style={{fontWeight: 500, marginLeft: '1em'}}>{option.alternativeName}</span>\n <span style={{marginLeft: '1em'}}>{option.mainCities}</span>\n </Text>\n </Card>\n )\n }}\n renderValue={(_, option) => {\n if (!option) return ''\n return `${option.alternativeName} (${option.namePretty})`\n }}\n tabIndex={-1}\n value={currentTz?.value ?? userTz.value}\n />\n </Box>\n )\n}\n","import {Button} from '@sanity/ui'\nimport {EarthAmericasIcon} from '@sanity/icons'\nimport {allTimezones} from '../utils'\nimport {NormalizedTimeZone} from '../types'\n\ninterface TimezoneButtonProps {\n onClick: () => void\n timezone: string\n}\n\nexport const TimezoneButton = (props: TimezoneButtonProps) => {\n const {onClick, timezone} = props\n const currentTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone\n const label =\n allTimezones.find((tz: NormalizedTimeZone) => tz.name === timezone)?.abbreviation ??\n allTimezones.find((tz: NormalizedTimeZone) => tz.name === currentTimezone)?.abbreviation\n\n return (\n <Button\n fontSize={1}\n style={{width: '100%'}}\n justify={'flex-start'}\n icon={EarthAmericasIcon}\n mode=\"ghost\"\n onClick={onClick}\n text={`${label}`}\n aria-label=\"Select a timezone\"\n />\n )\n}\n","import {ObjectInputMember, ObjectInputProps} from 'sanity'\nimport {Box, Flex, Dialog} from '@sanity/ui'\nimport {RelativeDateTimePicker} from './RelativeDateTimePicker'\nimport {TimezoneSelector} from './TimezoneSelector'\nimport {useCallback, useState} from 'react'\nimport {TimezoneButton} from './TimezoneButton'\nimport {RichDate} from '../types'\n\nexport const RichDateInput = (props: ObjectInputProps) => {\n const {onChange, value, members, schemaType} = props\n const {options} = schemaType\n const localMember = members.find((member) => member.kind === 'field' && member.name === 'local')\n const timezoneMember = members.find(\n (member) => member.kind === 'field' && member.name === 'timezone',\n )\n const [timezoneSelectorOpen, setTimezoneSelectorOpen] = useState(false)\n const onClose = useCallback(() => setTimezoneSelectorOpen(false), [])\n const onOpen = useCallback(() => setTimezoneSelectorOpen(true), [])\n\n return (\n <>\n <Flex>\n <Box flex={[1, 2, 4]}>\n {localMember && (\n <ObjectInputMember\n {...props}\n member={localMember}\n renderInput={(renderInputProps) => (\n <RelativeDateTimePicker\n {...renderInputProps}\n dateValue={value as RichDate}\n schemaType={{...renderInputProps.schemaType, options}}\n onChange={onChange}\n />\n )}\n />\n )}\n </Box>\n <Box flex={[1]} marginLeft={[2, 2, 3, 4]}>\n {timezoneMember && (\n <ObjectInputMember\n {...props}\n member={timezoneMember}\n renderInput={() => (\n <TimezoneButton onClick={onOpen} timezone={value?.timezone ?? ''} />\n )}\n />\n )}\n </Box>\n </Flex>\n {timezoneSelectorOpen && (\n <Dialog onClose={onClose} header=\"Select a timezone\" id=\"timezone-select\" width={1}>\n <TimezoneSelector onChange={onChange} value={value as RichDate} />\n </Dialog>\n )}\n </>\n )\n}\n","import {\n DatetimeDefinition,\n ObjectDefinition,\n ObjectSchemaType,\n defineField,\n defineType,\n} from 'sanity'\nimport {RichDateInput} from './components/RichDateInput'\n\nconst richDateTypeName = 'richDate' as const\n\nexport type RichDateSchemaType = Omit<ObjectSchemaType, 'options'> & {\n options?: DatetimeDefinition['options']\n}\n\n/**\n * @public\n */\nexport interface RichDateDefinition extends Omit<ObjectDefinition, 'type' | 'fields' | 'options'> {\n type: typeof richDateTypeName\n options?: DatetimeDefinition['options']\n}\n\ndeclare module 'sanity' {\n //allows the custom input to be valid for the schema def\n export interface IntrinsicDefinitions {\n richDate: RichDateDefinition\n }\n}\n\nexport const richDateSchema = defineType({\n name: richDateTypeName,\n title: 'Rich Date',\n type: 'object',\n fields: [\n defineField({\n name: 'local',\n title: 'Local',\n type: 'string',\n }),\n defineField({\n name: 'utc',\n title: 'UTC',\n type: 'string',\n }),\n defineField({\n name: 'timezone',\n title: 'Timezone',\n type: 'string',\n }),\n defineField({\n name: 'offset',\n title: 'Offset',\n type: 'number',\n }),\n ],\n\n components: {\n input: RichDateInput,\n },\n})\n","import {definePlugin} from 'sanity'\nimport {richDateSchema, RichDateDefinition, RichDateSchemaType} from './schema'\nimport {RichDate} from './types'\n\nexport const richDate = definePlugin({\n name: 'v3-rich-date-input',\n schema: {\n types: [richDateSchema],\n },\n})\n\nexport type {RichDateDefinition, RichDateSchemaType, RichDate}\n"],"names":["unlocalizeDateTime","datetime","timezone","formatInTimeZone","getConstructedUTCDate","utc","offset","date","Date","currentOffset","getTimezoneOffset","diff","fakeUTCDate","getTime","toISOString","allTimezones","getTimeZones","map","tz","abbreviation","alternativeName","mainCities","join","name","namePretty","replaceAll","currentTimeFormat","split","value","concat","currentTimeOffsetInMinutes","RelativeDateTimePicker","props","_a","_b","dateValue","Intl","DateTimeFormat","resolvedOptions","timeZone","handleDateChange","patch","patches","newDatetime","type","onChange","unset","desiredDateTime","utcDate","zonedTimeToUtc","localDate","push","set","dateToDisplay","DateTimeInput","TimezoneSelector","currentTz","find","userTz","handleTimezoneChange","selectedTz","newTimezone","timezonePatch","offsetPatch","newUtcDate","newLocalDate","jsx","Box","padding","children","Autocomplete","fontSize","icon","SearchIcon","id","openButton","options","placeholder","popover","boundaryElement","document","querySelector","constrainSize","placement","renderOption","option","Card","as","jsxs","Text","size","textOverflow","style","fontWeight","marginLeft","renderValue","_","tabIndex","TimezoneButton","_c","onClick","currentTimezone","label","Button","width","justify","EarthAmericasIcon","mode","text","RichDateInput","members","schemaType","localMember","member","kind","timezoneMember","timezoneSelectorOpen","setTimezoneSelectorOpen","useState","onClose","useCallback","onOpen","Fragment","Flex","flex","ObjectInputMember","renderInput","renderInputProps","Dialog","header","richDateTypeName","richDateSchema","defineType","title","fields","defineField","components","input","richDate","definePlugin","schema","types"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/utils/index.ts","../src/components/RelativeDateTimePicker.tsx","../src/components/TimezoneSelector.tsx","../src/components/TimezoneButton.tsx","../src/components/RichDateInput.tsx","../src/schema.ts","../src/index.ts"],"sourcesContent":["import {getTimeZones} from '@vvo/tzdb'\nimport {NormalizedTimeZone} from '../types'\nimport {formatInTimeZone} from 'date-fns-tz'\n\nexport const unlocalizeDateTime = (datetime: string, timezone: string): string => {\n return formatInTimeZone(datetime, timezone, 'yyyy-MM-dd HH:mm:ss')\n}\n\n/* We have to \"fake\" a UTC date to make the datepicker look \"right\"\n * to the user. For example, if someone sets 7:00AM PST, which is 3PM UTC\n * and I am on the east coast, I want to have 12:00PM UTC, which will look like 7:00AM to me\n * In other words, UTC minus 3 hours, or (UTC(my offset - their offset))\n * this is purely cosmetic and should not be saved at all\n */\nexport const getConstructedUTCDate = (utc: string, offset: number): string => {\n const date = new Date(utc)\n const currentOffset = new Date().getTimezoneOffset() * -1\n const diff = currentOffset - offset\n const fakeUTCDate = new Date(date.getTime() - diff * 60 * 1000)\n return fakeUTCDate.toISOString()\n}\n\n//keep some consistency with scheduled publishing\n//https://github.com/sanity-io/sanity-plugin-scheduled-publishing/blob/bb282e3df9a8a73df37fab8ee1fdd0e2430745be/src/hooks/useTimeZone.tsx#L17\nexport const allTimezones = getTimeZones().map((tz) => {\n return {\n abbreviation: tz.abbreviation,\n alternativeName: tz.alternativeName,\n mainCities: tz.mainCities.join(', '),\n // Main time zone name 'Africa/Dar_es_Salaam'\n name: tz.name,\n // Time zone name with underscores removed\n namePretty: tz.name.replaceAll('_', ' '),\n offset: tz.currentTimeFormat.split(' ')[0],\n // all searchable text - this is transformed before being rendered in `<AutoComplete>`\n value: `${tz.currentTimeFormat} ${tz.abbreviation} ${tz.name}`,\n currentTimeOffsetInMinutes: tz.currentTimeOffsetInMinutes,\n group: tz.group,\n } as NormalizedTimeZone\n})\n","import {DateTimeInput, FormPatch, PatchEvent, InputProps, set, unset} from 'sanity'\n\nimport {getConstructedUTCDate, unlocalizeDateTime} from '../utils'\nimport {RichDate} from '../types'\nimport {formatInTimeZone, zonedTimeToUtc} from 'date-fns-tz'\n\ninterface RelativeDateTimePickerProps extends Omit<InputProps, 'renderDefault'> {\n dateValue?: RichDate\n}\n\nexport const RelativeDateTimePicker = (props: RelativeDateTimePickerProps) => {\n const value = props.dateValue\n const timezone = value?.timezone ?? Intl.DateTimeFormat().resolvedOptions().timeZone\n /*\n * if our offset is not coming from a lib, we have to reverse it\n * to get the real offset used everywhere\n * https://momentjscom.readthedocs.io/en/latest/moment/03-manipulating/09-utc-offset/\n */\n const offset = value?.offset ?? new Date().getTimezoneOffset() * -1\n const handleDateChange = (patch: FormPatch | PatchEvent | FormPatch[]) => {\n const patches = []\n const newDatetime = (patch as unknown as {value: string})?.value\n if (!newDatetime || !('type' in patch) || patch.type !== 'set') {\n props.onChange(unset())\n return\n }\n\n //get what time the user \"meant\" to set without tz info\n //since the datepicker always localizes to the user's timezone\n const desiredDateTime = unlocalizeDateTime(\n newDatetime,\n Intl.DateTimeFormat().resolvedOptions().timeZone,\n )\n\n //use the user-selected timezone here\n const utcDate = zonedTimeToUtc(desiredDateTime, timezone).toISOString()\n const localDate = formatInTimeZone(utcDate, timezone, \"yyyy-MM-dd'T'HH:mm:ssXXX\")\n\n patches.push(set(utcDate, ['utc']))\n patches.push(set(localDate, ['local']))\n\n if (!value?.timezone) {\n patches.push(set(timezone, ['timezone']))\n }\n\n if (!value?.offset) {\n patches.push(set(offset, ['offset']))\n }\n\n props.onChange(patches)\n }\n\n const dateToDisplay = value?.utc ? getConstructedUTCDate(value.utc, value.offset) : ''\n //@ts-expect-error -- slight mismatch in elementProps and renderDefault, but should line up in practice\n return <DateTimeInput {...props} onChange={handleDateChange} value={dateToDisplay} />\n}\n","import {SearchIcon} from '@sanity/icons'\nimport {ObjectInputProps, set} from 'sanity'\nimport {allTimezones, unlocalizeDateTime} from '../utils'\nimport {NormalizedTimeZone, RichDate} from '../types'\nimport {Autocomplete, Card, Text, Box} from '@sanity/ui'\nimport {formatInTimeZone, zonedTimeToUtc} from 'date-fns-tz'\n\ninterface TimezoneSelectorProps {\n onChange: Pick<ObjectInputProps, 'onChange'>['onChange']\n value?: RichDate\n}\n\nexport const TimezoneSelector = (props: TimezoneSelectorProps) => {\n const {onChange, value} = props\n const currentTz = allTimezones.find((tz) => tz.name === value?.timezone)\n const userTzName = Intl.DateTimeFormat().resolvedOptions().timeZone\n const userTz = (allTimezones.find((tz) => tz.name === userTzName) ??\n allTimezones.find((tz) => tz.group.includes(userTzName)))!\n\n const handleTimezoneChange = (selectedTz: string) => {\n const newTimezone =\n allTimezones.find((tz) => tz.value === selectedTz) ?? (userTz as NormalizedTimeZone)\n\n const offset = newTimezone.currentTimeOffsetInMinutes ?? 0\n const timezonePatch = set(newTimezone.name, ['timezone'])\n const offsetPatch = set(offset, ['offset'])\n const patches = [timezonePatch, offsetPatch]\n\n //then, recalculate UTC and local from \"old\" time with the new offset\n if (value?.utc) {\n const desiredDateTime = unlocalizeDateTime(value.utc, value.timezone)\n const newUtcDate = zonedTimeToUtc(desiredDateTime, newTimezone.name).toISOString()\n const newLocalDate = formatInTimeZone(\n newUtcDate,\n newTimezone.name,\n \"yyyy-MM-dd'T'HH:mm:ssXXX\",\n )\n patches.push(set(newUtcDate, ['utc']))\n patches.push(set(newLocalDate, ['local']))\n }\n onChange(patches)\n }\n\n return (\n //taken from Scheduled Publishing, again!\n //https://github.com/sanity-io/sanity-plugin-scheduled-publishing/blob/bb282e3df9a8a73df37fab8ee1fdd0e2430745be/src/components/dialogs/DialogTimeZone.tsx#L100\n <Box padding={4}>\n <Autocomplete\n fontSize={2}\n icon={SearchIcon}\n id=\"timezone\"\n onChange={handleTimezoneChange}\n openButton\n options={allTimezones}\n padding={4}\n placeholder=\"Search for a city or time zone\"\n popover={{\n boundaryElement: document.querySelector('body'),\n constrainSize: true,\n placement: 'bottom-start',\n }}\n renderOption={(option) => {\n return (\n <Card as=\"button\" padding={3}>\n <Text size={1} textOverflow=\"ellipsis\">\n <span>GMT{option.offset}</span>\n <span style={{fontWeight: 500, marginLeft: '1em'}}>{option.alternativeName}</span>\n <span style={{marginLeft: '1em'}}>{option.mainCities}</span>\n </Text>\n </Card>\n )\n }}\n renderValue={(_, option) => {\n if (!option) return ''\n return `${option.alternativeName} (${option.namePretty})`\n }}\n tabIndex={-1}\n value={currentTz?.value ?? userTz.value}\n />\n </Box>\n )\n}\n","import {Button} from '@sanity/ui'\nimport {EarthAmericasIcon} from '@sanity/icons'\nimport {allTimezones} from '../utils'\n\ninterface TimezoneButtonProps {\n onClick: () => void\n timezone: string\n}\n\nexport const TimezoneButton = (props: TimezoneButtonProps) => {\n const {onClick, timezone} = props\n const currentTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone\n\n const label =\n allTimezones.find((tz) => tz.name === timezone)?.abbreviation ??\n allTimezones.find((tz) => tz.name === currentTimezone)?.abbreviation ??\n allTimezones.find((tz) => tz.group.includes(currentTimezone))?.abbreviation\n\n return (\n <Button\n fontSize={1}\n style={{width: '100%'}}\n justify={'flex-start'}\n icon={EarthAmericasIcon}\n mode=\"ghost\"\n onClick={onClick}\n text={`${label}`}\n aria-label=\"Select a timezone\"\n />\n )\n}\n","import {ObjectInputMember, ObjectInputProps} from 'sanity'\nimport {Box, Flex, Dialog} from '@sanity/ui'\nimport {RelativeDateTimePicker} from './RelativeDateTimePicker'\nimport {TimezoneSelector} from './TimezoneSelector'\nimport {useCallback, useState} from 'react'\nimport {TimezoneButton} from './TimezoneButton'\nimport {RichDate} from '../types'\n\nexport const RichDateInput = (props: ObjectInputProps) => {\n const {onChange, value, members, schemaType} = props\n const {options} = schemaType\n const localMember = members.find((member) => member.kind === 'field' && member.name === 'local')\n const timezoneMember = members.find(\n (member) => member.kind === 'field' && member.name === 'timezone',\n )\n const [timezoneSelectorOpen, setTimezoneSelectorOpen] = useState(false)\n const onClose = useCallback(() => setTimezoneSelectorOpen(false), [])\n const onOpen = useCallback(() => setTimezoneSelectorOpen(true), [])\n\n return (\n <>\n <Flex>\n <Box flex={[1, 2, 4]}>\n {localMember && (\n <ObjectInputMember\n {...props}\n member={localMember}\n renderInput={(renderInputProps) => (\n <RelativeDateTimePicker\n {...renderInputProps}\n dateValue={value as RichDate}\n schemaType={{...renderInputProps.schemaType, options}}\n onChange={onChange}\n />\n )}\n />\n )}\n </Box>\n <Box flex={[1]} marginLeft={[2, 2, 3, 4]}>\n {timezoneMember && (\n <ObjectInputMember\n {...props}\n member={timezoneMember}\n renderInput={() => (\n <TimezoneButton onClick={onOpen} timezone={value?.timezone ?? ''} />\n )}\n />\n )}\n </Box>\n </Flex>\n {timezoneSelectorOpen && (\n <Dialog onClose={onClose} header=\"Select a timezone\" id=\"timezone-select\" width={1}>\n <TimezoneSelector onChange={onChange} value={value as RichDate} />\n </Dialog>\n )}\n </>\n )\n}\n","import {\n DatetimeDefinition,\n ObjectDefinition,\n ObjectSchemaType,\n defineField,\n defineType,\n} from 'sanity'\nimport {RichDateInput} from './components/RichDateInput'\n\nconst richDateTypeName = 'richDate' as const\n\nexport type RichDateSchemaType = Omit<ObjectSchemaType, 'options'> & {\n options?: DatetimeDefinition['options']\n}\n\n/**\n * @public\n */\nexport interface RichDateDefinition extends Omit<ObjectDefinition, 'type' | 'fields' | 'options'> {\n type: typeof richDateTypeName\n options?: DatetimeDefinition['options']\n}\n\ndeclare module 'sanity' {\n //allows the custom input to be valid for the schema def\n export interface IntrinsicDefinitions {\n richDate: RichDateDefinition\n }\n}\n\nexport const richDateSchema = defineType({\n name: richDateTypeName,\n title: 'Rich Date',\n type: 'object',\n fields: [\n defineField({\n name: 'local',\n title: 'Local',\n type: 'string',\n }),\n defineField({\n name: 'utc',\n title: 'UTC',\n type: 'string',\n }),\n defineField({\n name: 'timezone',\n title: 'Timezone',\n type: 'string',\n }),\n defineField({\n name: 'offset',\n title: 'Offset',\n type: 'number',\n }),\n ],\n\n components: {\n input: RichDateInput,\n },\n})\n","import {definePlugin} from 'sanity'\nimport {richDateSchema, RichDateDefinition, RichDateSchemaType} from './schema'\nimport {RichDate} from './types'\n\nexport const richDate = definePlugin({\n name: 'v3-rich-date-input',\n schema: {\n types: [richDateSchema],\n },\n})\n\nexport type {RichDateDefinition, RichDateSchemaType, RichDate}\n"],"names":["unlocalizeDateTime","datetime","timezone","formatInTimeZone","getConstructedUTCDate","utc","offset","date","Date","currentOffset","getTimezoneOffset","diff","fakeUTCDate","getTime","toISOString","allTimezones","getTimeZones","map","tz","abbreviation","alternativeName","mainCities","join","name","namePretty","replaceAll","currentTimeFormat","split","value","concat","currentTimeOffsetInMinutes","group","RelativeDateTimePicker","props","_a","_b","dateValue","Intl","DateTimeFormat","resolvedOptions","timeZone","handleDateChange","patch","patches","newDatetime","type","onChange","unset","desiredDateTime","utcDate","zonedTimeToUtc","localDate","push","set","dateToDisplay","DateTimeInput","TimezoneSelector","currentTz","find","userTzName","userTz","includes","handleTimezoneChange","selectedTz","newTimezone","timezonePatch","offsetPatch","newUtcDate","newLocalDate","jsx","Box","padding","children","Autocomplete","fontSize","icon","SearchIcon","id","openButton","options","placeholder","popover","boundaryElement","document","querySelector","constrainSize","placement","renderOption","option","Card","as","jsxs","Text","size","textOverflow","style","fontWeight","marginLeft","renderValue","_","tabIndex","TimezoneButton","_c","_d","_e","onClick","currentTimezone","label","Button","width","justify","EarthAmericasIcon","mode","text","RichDateInput","members","schemaType","localMember","member","kind","timezoneMember","timezoneSelectorOpen","setTimezoneSelectorOpen","useState","onClose","useCallback","onOpen","Fragment","Flex","flex","ObjectInputMember","renderInput","renderInputProps","Dialog","header","richDateTypeName","richDateSchema","defineType","title","fields","defineField","components","input","richDate","definePlugin","schema","types"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -15,7 +15,7 @@ const unlocalizeDateTime = (datetime, timezone) => {
15
15
  };
16
16
  const getConstructedUTCDate = (utc, offset) => {
17
17
  const date = new Date(utc);
18
- const currentOffset = /* @__PURE__ */new Date().getTimezoneOffset() * -1;
18
+ const currentOffset = ( /* @__PURE__ */new Date()).getTimezoneOffset() * -1;
19
19
  const diff = currentOffset - offset;
20
20
  const fakeUTCDate = new Date(date.getTime() - diff * 60 * 1e3);
21
21
  return fakeUTCDate.toISOString();
@@ -32,14 +32,15 @@ const allTimezones = tzdb.getTimeZones().map(tz => {
32
32
  offset: tz.currentTimeFormat.split(" ")[0],
33
33
  // all searchable text - this is transformed before being rendered in `<AutoComplete>`
34
34
  value: "".concat(tz.currentTimeFormat, " ").concat(tz.abbreviation, " ").concat(tz.name),
35
- currentTimeOffsetInMinutes: tz.currentTimeOffsetInMinutes
35
+ currentTimeOffsetInMinutes: tz.currentTimeOffsetInMinutes,
36
+ group: tz.group
36
37
  };
37
38
  });
38
39
  const RelativeDateTimePicker = props => {
39
40
  var _a, _b;
40
41
  const value = props.dateValue;
41
42
  const timezone = (_a = value == null ? void 0 : value.timezone) != null ? _a : Intl.DateTimeFormat().resolvedOptions().timeZone;
42
- const offset = (_b = value == null ? void 0 : value.offset) != null ? _b : /* @__PURE__ */new Date().getTimezoneOffset() * -1;
43
+ const offset = (_b = value == null ? void 0 : value.offset) != null ? _b : ( /* @__PURE__ */new Date()).getTimezoneOffset() * -1;
43
44
  const handleDateChange = patch => {
44
45
  const patches = [];
45
46
  const newDatetime = patch == null ? void 0 : patch.value;
@@ -68,17 +69,18 @@ const RelativeDateTimePicker = props => {
68
69
  });
69
70
  };
70
71
  const TimezoneSelector = props => {
71
- var _a;
72
+ var _a, _b;
72
73
  const {
73
74
  onChange,
74
75
  value
75
76
  } = props;
76
77
  const currentTz = allTimezones.find(tz => tz.name === (value == null ? void 0 : value.timezone));
77
- const userTz = allTimezones.find(tz => tz.name === Intl.DateTimeFormat().resolvedOptions().timeZone);
78
+ const userTzName = Intl.DateTimeFormat().resolvedOptions().timeZone;
79
+ const userTz = (_a = allTimezones.find(tz => tz.name === userTzName)) != null ? _a : allTimezones.find(tz => tz.group.includes(userTzName));
78
80
  const handleTimezoneChange = selectedTz => {
79
- var _a2, _b;
81
+ var _a2, _b2;
80
82
  const newTimezone = (_a2 = allTimezones.find(tz => tz.value === selectedTz)) != null ? _a2 : userTz;
81
- const offset = (_b = newTimezone.currentTimeOffsetInMinutes) != null ? _b : 0;
83
+ const offset = (_b2 = newTimezone.currentTimeOffsetInMinutes) != null ? _b2 : 0;
82
84
  const timezonePatch = sanity.set(newTimezone.name, ["timezone"]);
83
85
  const offsetPatch = sanity.set(offset, ["offset"]);
84
86
  const patches = [timezonePatch, offsetPatch];
@@ -140,19 +142,19 @@ const TimezoneSelector = props => {
140
142
  return "".concat(option.alternativeName, " (").concat(option.namePretty, ")");
141
143
  },
142
144
  tabIndex: -1,
143
- value: (_a = currentTz == null ? void 0 : currentTz.value) != null ? _a : userTz.value
145
+ value: (_b = currentTz == null ? void 0 : currentTz.value) != null ? _b : userTz.value
144
146
  })
145
147
  })
146
148
  );
147
149
  };
148
150
  const TimezoneButton = props => {
149
- var _a, _b, _c;
151
+ var _a, _b, _c, _d, _e;
150
152
  const {
151
153
  onClick,
152
154
  timezone
153
155
  } = props;
154
156
  const currentTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
155
- const label = (_c = (_a = allTimezones.find(tz => tz.name === timezone)) == null ? void 0 : _a.abbreviation) != null ? _c : (_b = allTimezones.find(tz => tz.name === currentTimezone)) == null ? void 0 : _b.abbreviation;
157
+ const label = (_e = (_c = (_a = allTimezones.find(tz => tz.name === timezone)) == null ? void 0 : _a.abbreviation) != null ? _c : (_b = allTimezones.find(tz => tz.name === currentTimezone)) == null ? void 0 : _b.abbreviation) != null ? _e : (_d = allTimezones.find(tz => tz.group.includes(currentTimezone))) == null ? void 0 : _d.abbreviation;
156
158
  return /* @__PURE__ */jsxRuntime.jsx(ui.Button, {
157
159
  fontSize: 1,
158
160
  style: {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/utils/index.ts","../src/components/RelativeDateTimePicker.tsx","../src/components/TimezoneSelector.tsx","../src/components/TimezoneButton.tsx","../src/components/RichDateInput.tsx","../src/schema.ts","../src/index.ts"],"sourcesContent":["import {getTimeZones} from '@vvo/tzdb'\nimport {NormalizedTimeZone} from '../types'\nimport {formatInTimeZone} from 'date-fns-tz'\n\nexport const unlocalizeDateTime = (datetime: string, timezone: string): string => {\n return formatInTimeZone(datetime, timezone, 'yyyy-MM-dd HH:mm:ss')\n}\n\n/* We have to \"fake\" a UTC date to make the datepicker look \"right\"\n * to the user. For example, if someone sets 7:00AM PST, which is 3PM UTC\n * and I am on the east coast, I want to have 12:00PM UTC, which will look like 7:00AM to me\n * In other words, UTC minus 3 hours, or (UTC(my offset - their offset))\n * this is purely cosmetic and should not be saved at all\n */\nexport const getConstructedUTCDate = (utc: string, offset: number): string => {\n const date = new Date(utc)\n const currentOffset = new Date().getTimezoneOffset() * -1\n const diff = currentOffset - offset\n const fakeUTCDate = new Date(date.getTime() - diff * 60 * 1000)\n return fakeUTCDate.toISOString()\n}\n\n//keep some consistency with scheduled publishing\n//https://github.com/sanity-io/sanity-plugin-scheduled-publishing/blob/bb282e3df9a8a73df37fab8ee1fdd0e2430745be/src/hooks/useTimeZone.tsx#L17\nexport const allTimezones = getTimeZones().map((tz) => {\n return {\n abbreviation: tz.abbreviation,\n alternativeName: tz.alternativeName,\n mainCities: tz.mainCities.join(', '),\n // Main time zone name 'Africa/Dar_es_Salaam'\n name: tz.name,\n // Time zone name with underscores removed\n namePretty: tz.name.replaceAll('_', ' '),\n offset: tz.currentTimeFormat.split(' ')[0],\n // all searchable text - this is transformed before being rendered in `<AutoComplete>`\n value: `${tz.currentTimeFormat} ${tz.abbreviation} ${tz.name}`,\n currentTimeOffsetInMinutes: tz.currentTimeOffsetInMinutes,\n } as NormalizedTimeZone\n})\n","import {DateTimeInput, FormPatch, PatchEvent, InputProps, set, unset} from 'sanity'\n\nimport {getConstructedUTCDate, unlocalizeDateTime} from '../utils'\nimport {RichDate} from '../types'\nimport {formatInTimeZone, zonedTimeToUtc} from 'date-fns-tz'\n\ninterface RelativeDateTimePickerProps extends Omit<InputProps, 'renderDefault'> {\n dateValue?: RichDate\n}\n\nexport const RelativeDateTimePicker = (props: RelativeDateTimePickerProps) => {\n const value = props.dateValue\n const timezone = value?.timezone ?? Intl.DateTimeFormat().resolvedOptions().timeZone\n /*\n * if our offset is not coming from a lib, we have to reverse it\n * to get the real offset used everywhere\n * https://momentjscom.readthedocs.io/en/latest/moment/03-manipulating/09-utc-offset/\n */\n const offset = value?.offset ?? new Date().getTimezoneOffset() * -1\n const handleDateChange = (patch: FormPatch | PatchEvent | FormPatch[]) => {\n const patches = []\n const newDatetime = (patch as unknown as {value: string})?.value\n if (!newDatetime || !('type' in patch) || patch.type !== 'set') {\n props.onChange(unset())\n return\n }\n\n //get what time the user \"meant\" to set without tz info\n //since the datepicker always localizes to the user's timezone\n const desiredDateTime = unlocalizeDateTime(\n newDatetime,\n Intl.DateTimeFormat().resolvedOptions().timeZone,\n )\n\n //use the user-selected timezone here\n const utcDate = zonedTimeToUtc(desiredDateTime, timezone).toISOString()\n const localDate = formatInTimeZone(utcDate, timezone, \"yyyy-MM-dd'T'HH:mm:ssXXX\")\n\n patches.push(set(utcDate, ['utc']))\n patches.push(set(localDate, ['local']))\n\n if (!value?.timezone) {\n patches.push(set(timezone, ['timezone']))\n }\n\n if (!value?.offset) {\n patches.push(set(offset, ['offset']))\n }\n\n props.onChange(patches)\n }\n\n const dateToDisplay = value?.utc ? getConstructedUTCDate(value.utc, value.offset) : ''\n //@ts-expect-error -- slight mismatch in elementProps and renderDefault, but should line up in practice\n return <DateTimeInput {...props} onChange={handleDateChange} value={dateToDisplay} />\n}\n","import {SearchIcon} from '@sanity/icons'\nimport {ObjectInputProps, set} from 'sanity'\nimport {allTimezones, unlocalizeDateTime} from '../utils'\nimport {NormalizedTimeZone, RichDate} from '../types'\nimport {Autocomplete, Card, Text, Box} from '@sanity/ui'\nimport {formatInTimeZone, zonedTimeToUtc} from 'date-fns-tz'\n\ninterface TimezoneSelectorProps {\n onChange: Pick<ObjectInputProps, 'onChange'>['onChange']\n value?: RichDate\n}\n\nexport const TimezoneSelector = (props: TimezoneSelectorProps) => {\n const {onChange, value} = props\n const currentTz = allTimezones.find((tz) => tz.name === value?.timezone)\n const userTz = allTimezones.find(\n (tz) => tz.name === Intl.DateTimeFormat().resolvedOptions().timeZone,\n )!\n\n const handleTimezoneChange = (selectedTz: string) => {\n const newTimezone =\n allTimezones.find((tz) => tz.value === selectedTz) ?? (userTz as NormalizedTimeZone)\n\n const offset = newTimezone.currentTimeOffsetInMinutes ?? 0\n const timezonePatch = set(newTimezone.name, ['timezone'])\n const offsetPatch = set(offset, ['offset'])\n const patches = [timezonePatch, offsetPatch]\n\n //then, recalculate UTC and local from \"old\" time with the new offset\n if (value?.utc) {\n const desiredDateTime = unlocalizeDateTime(value.utc, value.timezone)\n const newUtcDate = zonedTimeToUtc(desiredDateTime, newTimezone.name).toISOString()\n const newLocalDate = formatInTimeZone(\n newUtcDate,\n newTimezone.name,\n \"yyyy-MM-dd'T'HH:mm:ssXXX\",\n )\n patches.push(set(newUtcDate, ['utc']))\n patches.push(set(newLocalDate, ['local']))\n }\n onChange(patches)\n }\n\n return (\n //taken from Scheduled Publishing, again!\n //https://github.com/sanity-io/sanity-plugin-scheduled-publishing/blob/bb282e3df9a8a73df37fab8ee1fdd0e2430745be/src/components/dialogs/DialogTimeZone.tsx#L100\n <Box padding={4}>\n <Autocomplete\n fontSize={2}\n icon={SearchIcon}\n id=\"timezone\"\n onChange={handleTimezoneChange}\n openButton\n options={allTimezones}\n padding={4}\n placeholder=\"Search for a city or time zone\"\n popover={{\n boundaryElement: document.querySelector('body'),\n constrainSize: true,\n placement: 'bottom-start',\n }}\n renderOption={(option) => {\n return (\n <Card as=\"button\" padding={3}>\n <Text size={1} textOverflow=\"ellipsis\">\n <span>GMT{option.offset}</span>\n <span style={{fontWeight: 500, marginLeft: '1em'}}>{option.alternativeName}</span>\n <span style={{marginLeft: '1em'}}>{option.mainCities}</span>\n </Text>\n </Card>\n )\n }}\n renderValue={(_, option) => {\n if (!option) return ''\n return `${option.alternativeName} (${option.namePretty})`\n }}\n tabIndex={-1}\n value={currentTz?.value ?? userTz.value}\n />\n </Box>\n )\n}\n","import {Button} from '@sanity/ui'\nimport {EarthAmericasIcon} from '@sanity/icons'\nimport {allTimezones} from '../utils'\nimport {NormalizedTimeZone} from '../types'\n\ninterface TimezoneButtonProps {\n onClick: () => void\n timezone: string\n}\n\nexport const TimezoneButton = (props: TimezoneButtonProps) => {\n const {onClick, timezone} = props\n const currentTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone\n const label =\n allTimezones.find((tz: NormalizedTimeZone) => tz.name === timezone)?.abbreviation ??\n allTimezones.find((tz: NormalizedTimeZone) => tz.name === currentTimezone)?.abbreviation\n\n return (\n <Button\n fontSize={1}\n style={{width: '100%'}}\n justify={'flex-start'}\n icon={EarthAmericasIcon}\n mode=\"ghost\"\n onClick={onClick}\n text={`${label}`}\n aria-label=\"Select a timezone\"\n />\n )\n}\n","import {ObjectInputMember, ObjectInputProps} from 'sanity'\nimport {Box, Flex, Dialog} from '@sanity/ui'\nimport {RelativeDateTimePicker} from './RelativeDateTimePicker'\nimport {TimezoneSelector} from './TimezoneSelector'\nimport {useCallback, useState} from 'react'\nimport {TimezoneButton} from './TimezoneButton'\nimport {RichDate} from '../types'\n\nexport const RichDateInput = (props: ObjectInputProps) => {\n const {onChange, value, members, schemaType} = props\n const {options} = schemaType\n const localMember = members.find((member) => member.kind === 'field' && member.name === 'local')\n const timezoneMember = members.find(\n (member) => member.kind === 'field' && member.name === 'timezone',\n )\n const [timezoneSelectorOpen, setTimezoneSelectorOpen] = useState(false)\n const onClose = useCallback(() => setTimezoneSelectorOpen(false), [])\n const onOpen = useCallback(() => setTimezoneSelectorOpen(true), [])\n\n return (\n <>\n <Flex>\n <Box flex={[1, 2, 4]}>\n {localMember && (\n <ObjectInputMember\n {...props}\n member={localMember}\n renderInput={(renderInputProps) => (\n <RelativeDateTimePicker\n {...renderInputProps}\n dateValue={value as RichDate}\n schemaType={{...renderInputProps.schemaType, options}}\n onChange={onChange}\n />\n )}\n />\n )}\n </Box>\n <Box flex={[1]} marginLeft={[2, 2, 3, 4]}>\n {timezoneMember && (\n <ObjectInputMember\n {...props}\n member={timezoneMember}\n renderInput={() => (\n <TimezoneButton onClick={onOpen} timezone={value?.timezone ?? ''} />\n )}\n />\n )}\n </Box>\n </Flex>\n {timezoneSelectorOpen && (\n <Dialog onClose={onClose} header=\"Select a timezone\" id=\"timezone-select\" width={1}>\n <TimezoneSelector onChange={onChange} value={value as RichDate} />\n </Dialog>\n )}\n </>\n )\n}\n","import {\n DatetimeDefinition,\n ObjectDefinition,\n ObjectSchemaType,\n defineField,\n defineType,\n} from 'sanity'\nimport {RichDateInput} from './components/RichDateInput'\n\nconst richDateTypeName = 'richDate' as const\n\nexport type RichDateSchemaType = Omit<ObjectSchemaType, 'options'> & {\n options?: DatetimeDefinition['options']\n}\n\n/**\n * @public\n */\nexport interface RichDateDefinition extends Omit<ObjectDefinition, 'type' | 'fields' | 'options'> {\n type: typeof richDateTypeName\n options?: DatetimeDefinition['options']\n}\n\ndeclare module 'sanity' {\n //allows the custom input to be valid for the schema def\n export interface IntrinsicDefinitions {\n richDate: RichDateDefinition\n }\n}\n\nexport const richDateSchema = defineType({\n name: richDateTypeName,\n title: 'Rich Date',\n type: 'object',\n fields: [\n defineField({\n name: 'local',\n title: 'Local',\n type: 'string',\n }),\n defineField({\n name: 'utc',\n title: 'UTC',\n type: 'string',\n }),\n defineField({\n name: 'timezone',\n title: 'Timezone',\n type: 'string',\n }),\n defineField({\n name: 'offset',\n title: 'Offset',\n type: 'number',\n }),\n ],\n\n components: {\n input: RichDateInput,\n },\n})\n","import {definePlugin} from 'sanity'\nimport {richDateSchema, RichDateDefinition, RichDateSchemaType} from './schema'\nimport {RichDate} from './types'\n\nexport const richDate = definePlugin({\n name: 'v3-rich-date-input',\n schema: {\n types: [richDateSchema],\n },\n})\n\nexport type {RichDateDefinition, RichDateSchemaType, RichDate}\n"],"names":["unlocalizeDateTime","datetime","timezone","formatInTimeZone","getConstructedUTCDate","utc","offset","date","Date","currentOffset","getTimezoneOffset","diff","fakeUTCDate","getTime","toISOString","allTimezones","getTimeZones","map","tz","abbreviation","alternativeName","mainCities","join","name","namePretty","replaceAll","currentTimeFormat","split","value","concat","currentTimeOffsetInMinutes","RelativeDateTimePicker","props","_a","_b","dateValue","Intl","DateTimeFormat","resolvedOptions","timeZone","handleDateChange","patch","patches","newDatetime","type","onChange","unset","desiredDateTime","utcDate","zonedTimeToUtc","localDate","push","set","dateToDisplay","DateTimeInput","TimezoneSelector","currentTz","find","userTz","handleTimezoneChange","selectedTz","newTimezone","timezonePatch","offsetPatch","newUtcDate","newLocalDate","jsx","Box","padding","children","Autocomplete","fontSize","icon","SearchIcon","id","openButton","options","placeholder","popover","boundaryElement","document","querySelector","constrainSize","placement","renderOption","option","Card","as","jsxs","Text","size","textOverflow","style","fontWeight","marginLeft","renderValue","_","tabIndex","TimezoneButton","_c","onClick","currentTimezone","label","Button","width","justify","EarthAmericasIcon","mode","text","RichDateInput","members","schemaType","localMember","member","kind","timezoneMember","timezoneSelectorOpen","setTimezoneSelectorOpen","useState","onClose","useCallback","onOpen","Fragment","Flex","flex","ObjectInputMember","renderInput","renderInputProps","Dialog","header","richDateTypeName","richDateSchema","defineType","title","fields","defineField","components","input","richDate","definePlugin","schema","types"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/utils/index.ts","../src/components/RelativeDateTimePicker.tsx","../src/components/TimezoneSelector.tsx","../src/components/TimezoneButton.tsx","../src/components/RichDateInput.tsx","../src/schema.ts","../src/index.ts"],"sourcesContent":["import {getTimeZones} from '@vvo/tzdb'\nimport {NormalizedTimeZone} from '../types'\nimport {formatInTimeZone} from 'date-fns-tz'\n\nexport const unlocalizeDateTime = (datetime: string, timezone: string): string => {\n return formatInTimeZone(datetime, timezone, 'yyyy-MM-dd HH:mm:ss')\n}\n\n/* We have to \"fake\" a UTC date to make the datepicker look \"right\"\n * to the user. For example, if someone sets 7:00AM PST, which is 3PM UTC\n * and I am on the east coast, I want to have 12:00PM UTC, which will look like 7:00AM to me\n * In other words, UTC minus 3 hours, or (UTC(my offset - their offset))\n * this is purely cosmetic and should not be saved at all\n */\nexport const getConstructedUTCDate = (utc: string, offset: number): string => {\n const date = new Date(utc)\n const currentOffset = new Date().getTimezoneOffset() * -1\n const diff = currentOffset - offset\n const fakeUTCDate = new Date(date.getTime() - diff * 60 * 1000)\n return fakeUTCDate.toISOString()\n}\n\n//keep some consistency with scheduled publishing\n//https://github.com/sanity-io/sanity-plugin-scheduled-publishing/blob/bb282e3df9a8a73df37fab8ee1fdd0e2430745be/src/hooks/useTimeZone.tsx#L17\nexport const allTimezones = getTimeZones().map((tz) => {\n return {\n abbreviation: tz.abbreviation,\n alternativeName: tz.alternativeName,\n mainCities: tz.mainCities.join(', '),\n // Main time zone name 'Africa/Dar_es_Salaam'\n name: tz.name,\n // Time zone name with underscores removed\n namePretty: tz.name.replaceAll('_', ' '),\n offset: tz.currentTimeFormat.split(' ')[0],\n // all searchable text - this is transformed before being rendered in `<AutoComplete>`\n value: `${tz.currentTimeFormat} ${tz.abbreviation} ${tz.name}`,\n currentTimeOffsetInMinutes: tz.currentTimeOffsetInMinutes,\n group: tz.group,\n } as NormalizedTimeZone\n})\n","import {DateTimeInput, FormPatch, PatchEvent, InputProps, set, unset} from 'sanity'\n\nimport {getConstructedUTCDate, unlocalizeDateTime} from '../utils'\nimport {RichDate} from '../types'\nimport {formatInTimeZone, zonedTimeToUtc} from 'date-fns-tz'\n\ninterface RelativeDateTimePickerProps extends Omit<InputProps, 'renderDefault'> {\n dateValue?: RichDate\n}\n\nexport const RelativeDateTimePicker = (props: RelativeDateTimePickerProps) => {\n const value = props.dateValue\n const timezone = value?.timezone ?? Intl.DateTimeFormat().resolvedOptions().timeZone\n /*\n * if our offset is not coming from a lib, we have to reverse it\n * to get the real offset used everywhere\n * https://momentjscom.readthedocs.io/en/latest/moment/03-manipulating/09-utc-offset/\n */\n const offset = value?.offset ?? new Date().getTimezoneOffset() * -1\n const handleDateChange = (patch: FormPatch | PatchEvent | FormPatch[]) => {\n const patches = []\n const newDatetime = (patch as unknown as {value: string})?.value\n if (!newDatetime || !('type' in patch) || patch.type !== 'set') {\n props.onChange(unset())\n return\n }\n\n //get what time the user \"meant\" to set without tz info\n //since the datepicker always localizes to the user's timezone\n const desiredDateTime = unlocalizeDateTime(\n newDatetime,\n Intl.DateTimeFormat().resolvedOptions().timeZone,\n )\n\n //use the user-selected timezone here\n const utcDate = zonedTimeToUtc(desiredDateTime, timezone).toISOString()\n const localDate = formatInTimeZone(utcDate, timezone, \"yyyy-MM-dd'T'HH:mm:ssXXX\")\n\n patches.push(set(utcDate, ['utc']))\n patches.push(set(localDate, ['local']))\n\n if (!value?.timezone) {\n patches.push(set(timezone, ['timezone']))\n }\n\n if (!value?.offset) {\n patches.push(set(offset, ['offset']))\n }\n\n props.onChange(patches)\n }\n\n const dateToDisplay = value?.utc ? getConstructedUTCDate(value.utc, value.offset) : ''\n //@ts-expect-error -- slight mismatch in elementProps and renderDefault, but should line up in practice\n return <DateTimeInput {...props} onChange={handleDateChange} value={dateToDisplay} />\n}\n","import {SearchIcon} from '@sanity/icons'\nimport {ObjectInputProps, set} from 'sanity'\nimport {allTimezones, unlocalizeDateTime} from '../utils'\nimport {NormalizedTimeZone, RichDate} from '../types'\nimport {Autocomplete, Card, Text, Box} from '@sanity/ui'\nimport {formatInTimeZone, zonedTimeToUtc} from 'date-fns-tz'\n\ninterface TimezoneSelectorProps {\n onChange: Pick<ObjectInputProps, 'onChange'>['onChange']\n value?: RichDate\n}\n\nexport const TimezoneSelector = (props: TimezoneSelectorProps) => {\n const {onChange, value} = props\n const currentTz = allTimezones.find((tz) => tz.name === value?.timezone)\n const userTzName = Intl.DateTimeFormat().resolvedOptions().timeZone\n const userTz = (allTimezones.find((tz) => tz.name === userTzName) ??\n allTimezones.find((tz) => tz.group.includes(userTzName)))!\n\n const handleTimezoneChange = (selectedTz: string) => {\n const newTimezone =\n allTimezones.find((tz) => tz.value === selectedTz) ?? (userTz as NormalizedTimeZone)\n\n const offset = newTimezone.currentTimeOffsetInMinutes ?? 0\n const timezonePatch = set(newTimezone.name, ['timezone'])\n const offsetPatch = set(offset, ['offset'])\n const patches = [timezonePatch, offsetPatch]\n\n //then, recalculate UTC and local from \"old\" time with the new offset\n if (value?.utc) {\n const desiredDateTime = unlocalizeDateTime(value.utc, value.timezone)\n const newUtcDate = zonedTimeToUtc(desiredDateTime, newTimezone.name).toISOString()\n const newLocalDate = formatInTimeZone(\n newUtcDate,\n newTimezone.name,\n \"yyyy-MM-dd'T'HH:mm:ssXXX\",\n )\n patches.push(set(newUtcDate, ['utc']))\n patches.push(set(newLocalDate, ['local']))\n }\n onChange(patches)\n }\n\n return (\n //taken from Scheduled Publishing, again!\n //https://github.com/sanity-io/sanity-plugin-scheduled-publishing/blob/bb282e3df9a8a73df37fab8ee1fdd0e2430745be/src/components/dialogs/DialogTimeZone.tsx#L100\n <Box padding={4}>\n <Autocomplete\n fontSize={2}\n icon={SearchIcon}\n id=\"timezone\"\n onChange={handleTimezoneChange}\n openButton\n options={allTimezones}\n padding={4}\n placeholder=\"Search for a city or time zone\"\n popover={{\n boundaryElement: document.querySelector('body'),\n constrainSize: true,\n placement: 'bottom-start',\n }}\n renderOption={(option) => {\n return (\n <Card as=\"button\" padding={3}>\n <Text size={1} textOverflow=\"ellipsis\">\n <span>GMT{option.offset}</span>\n <span style={{fontWeight: 500, marginLeft: '1em'}}>{option.alternativeName}</span>\n <span style={{marginLeft: '1em'}}>{option.mainCities}</span>\n </Text>\n </Card>\n )\n }}\n renderValue={(_, option) => {\n if (!option) return ''\n return `${option.alternativeName} (${option.namePretty})`\n }}\n tabIndex={-1}\n value={currentTz?.value ?? userTz.value}\n />\n </Box>\n )\n}\n","import {Button} from '@sanity/ui'\nimport {EarthAmericasIcon} from '@sanity/icons'\nimport {allTimezones} from '../utils'\n\ninterface TimezoneButtonProps {\n onClick: () => void\n timezone: string\n}\n\nexport const TimezoneButton = (props: TimezoneButtonProps) => {\n const {onClick, timezone} = props\n const currentTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone\n\n const label =\n allTimezones.find((tz) => tz.name === timezone)?.abbreviation ??\n allTimezones.find((tz) => tz.name === currentTimezone)?.abbreviation ??\n allTimezones.find((tz) => tz.group.includes(currentTimezone))?.abbreviation\n\n return (\n <Button\n fontSize={1}\n style={{width: '100%'}}\n justify={'flex-start'}\n icon={EarthAmericasIcon}\n mode=\"ghost\"\n onClick={onClick}\n text={`${label}`}\n aria-label=\"Select a timezone\"\n />\n )\n}\n","import {ObjectInputMember, ObjectInputProps} from 'sanity'\nimport {Box, Flex, Dialog} from '@sanity/ui'\nimport {RelativeDateTimePicker} from './RelativeDateTimePicker'\nimport {TimezoneSelector} from './TimezoneSelector'\nimport {useCallback, useState} from 'react'\nimport {TimezoneButton} from './TimezoneButton'\nimport {RichDate} from '../types'\n\nexport const RichDateInput = (props: ObjectInputProps) => {\n const {onChange, value, members, schemaType} = props\n const {options} = schemaType\n const localMember = members.find((member) => member.kind === 'field' && member.name === 'local')\n const timezoneMember = members.find(\n (member) => member.kind === 'field' && member.name === 'timezone',\n )\n const [timezoneSelectorOpen, setTimezoneSelectorOpen] = useState(false)\n const onClose = useCallback(() => setTimezoneSelectorOpen(false), [])\n const onOpen = useCallback(() => setTimezoneSelectorOpen(true), [])\n\n return (\n <>\n <Flex>\n <Box flex={[1, 2, 4]}>\n {localMember && (\n <ObjectInputMember\n {...props}\n member={localMember}\n renderInput={(renderInputProps) => (\n <RelativeDateTimePicker\n {...renderInputProps}\n dateValue={value as RichDate}\n schemaType={{...renderInputProps.schemaType, options}}\n onChange={onChange}\n />\n )}\n />\n )}\n </Box>\n <Box flex={[1]} marginLeft={[2, 2, 3, 4]}>\n {timezoneMember && (\n <ObjectInputMember\n {...props}\n member={timezoneMember}\n renderInput={() => (\n <TimezoneButton onClick={onOpen} timezone={value?.timezone ?? ''} />\n )}\n />\n )}\n </Box>\n </Flex>\n {timezoneSelectorOpen && (\n <Dialog onClose={onClose} header=\"Select a timezone\" id=\"timezone-select\" width={1}>\n <TimezoneSelector onChange={onChange} value={value as RichDate} />\n </Dialog>\n )}\n </>\n )\n}\n","import {\n DatetimeDefinition,\n ObjectDefinition,\n ObjectSchemaType,\n defineField,\n defineType,\n} from 'sanity'\nimport {RichDateInput} from './components/RichDateInput'\n\nconst richDateTypeName = 'richDate' as const\n\nexport type RichDateSchemaType = Omit<ObjectSchemaType, 'options'> & {\n options?: DatetimeDefinition['options']\n}\n\n/**\n * @public\n */\nexport interface RichDateDefinition extends Omit<ObjectDefinition, 'type' | 'fields' | 'options'> {\n type: typeof richDateTypeName\n options?: DatetimeDefinition['options']\n}\n\ndeclare module 'sanity' {\n //allows the custom input to be valid for the schema def\n export interface IntrinsicDefinitions {\n richDate: RichDateDefinition\n }\n}\n\nexport const richDateSchema = defineType({\n name: richDateTypeName,\n title: 'Rich Date',\n type: 'object',\n fields: [\n defineField({\n name: 'local',\n title: 'Local',\n type: 'string',\n }),\n defineField({\n name: 'utc',\n title: 'UTC',\n type: 'string',\n }),\n defineField({\n name: 'timezone',\n title: 'Timezone',\n type: 'string',\n }),\n defineField({\n name: 'offset',\n title: 'Offset',\n type: 'number',\n }),\n ],\n\n components: {\n input: RichDateInput,\n },\n})\n","import {definePlugin} from 'sanity'\nimport {richDateSchema, RichDateDefinition, RichDateSchemaType} from './schema'\nimport {RichDate} from './types'\n\nexport const richDate = definePlugin({\n name: 'v3-rich-date-input',\n schema: {\n types: [richDateSchema],\n },\n})\n\nexport type {RichDateDefinition, RichDateSchemaType, RichDate}\n"],"names":["unlocalizeDateTime","datetime","timezone","formatInTimeZone","getConstructedUTCDate","utc","offset","date","Date","currentOffset","getTimezoneOffset","diff","fakeUTCDate","getTime","toISOString","allTimezones","getTimeZones","map","tz","abbreviation","alternativeName","mainCities","join","name","namePretty","replaceAll","currentTimeFormat","split","value","concat","currentTimeOffsetInMinutes","group","RelativeDateTimePicker","props","_a","_b","dateValue","Intl","DateTimeFormat","resolvedOptions","timeZone","handleDateChange","patch","patches","newDatetime","type","onChange","unset","desiredDateTime","utcDate","zonedTimeToUtc","localDate","push","set","dateToDisplay","DateTimeInput","TimezoneSelector","currentTz","find","userTzName","userTz","includes","handleTimezoneChange","selectedTz","newTimezone","timezonePatch","offsetPatch","newUtcDate","newLocalDate","jsx","Box","padding","children","Autocomplete","fontSize","icon","SearchIcon","id","openButton","options","placeholder","popover","boundaryElement","document","querySelector","constrainSize","placement","renderOption","option","Card","as","jsxs","Text","size","textOverflow","style","fontWeight","marginLeft","renderValue","_","tabIndex","TimezoneButton","_c","_d","_e","onClick","currentTimezone","label","Button","width","justify","EarthAmericasIcon","mode","text","RichDateInput","members","schemaType","localMember","member","kind","timezoneMember","timezoneSelectorOpen","setTimezoneSelectorOpen","useState","onClose","useCallback","onOpen","Fragment","Flex","flex","ObjectInputMember","renderInput","renderInputProps","Dialog","header","richDateTypeName","richDateSchema","defineType","title","fields","defineField","components","input","richDate","definePlugin","schema","types"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sanity/rich-date-input",
3
- "version": "3.0.0",
3
+ "version": "3.0.2",
4
4
  "description": "A timezone-aware datetime type and input component for Sanity Studio",
5
5
  "keywords": [
6
6
  "sanity",
@@ -55,8 +55,9 @@
55
55
  "dependencies": {
56
56
  "@sanity/icons": "^2.7.0",
57
57
  "@sanity/incompatible-plugin": "^1.0.4",
58
- "@sanity/ui": "^1.9.3",
59
- "@vvo/tzdb": "^6.112.0",
58
+ "@sanity/ui": "^2.0.2",
59
+ "@vvo/tzdb": "^6.125.0",
60
+ "date-fns": "^2.26.1",
60
61
  "date-fns-tz": "^2.0.0"
61
62
  },
62
63
  "devDependencies": {
@@ -83,7 +84,7 @@
83
84
  "react-dom": "^18.2.0",
84
85
  "react-is": "^18.2.0",
85
86
  "rimraf": "^5.0.5",
86
- "sanity": "^3.19.3",
87
+ "sanity": "^3.31.0",
87
88
  "styled-components": "^5.3.11",
88
89
  "typescript": "^5.2.2"
89
90
  },
@@ -1,7 +1,6 @@
1
1
  import {Button} from '@sanity/ui'
2
2
  import {EarthAmericasIcon} from '@sanity/icons'
3
3
  import {allTimezones} from '../utils'
4
- import {NormalizedTimeZone} from '../types'
5
4
 
6
5
  interface TimezoneButtonProps {
7
6
  onClick: () => void
@@ -11,9 +10,11 @@ interface TimezoneButtonProps {
11
10
  export const TimezoneButton = (props: TimezoneButtonProps) => {
12
11
  const {onClick, timezone} = props
13
12
  const currentTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone
13
+
14
14
  const label =
15
- allTimezones.find((tz: NormalizedTimeZone) => tz.name === timezone)?.abbreviation ??
16
- allTimezones.find((tz: NormalizedTimeZone) => tz.name === currentTimezone)?.abbreviation
15
+ allTimezones.find((tz) => tz.name === timezone)?.abbreviation ??
16
+ allTimezones.find((tz) => tz.name === currentTimezone)?.abbreviation ??
17
+ allTimezones.find((tz) => tz.group.includes(currentTimezone))?.abbreviation
17
18
 
18
19
  return (
19
20
  <Button
@@ -13,9 +13,9 @@ interface TimezoneSelectorProps {
13
13
  export const TimezoneSelector = (props: TimezoneSelectorProps) => {
14
14
  const {onChange, value} = props
15
15
  const currentTz = allTimezones.find((tz) => tz.name === value?.timezone)
16
- const userTz = allTimezones.find(
17
- (tz) => tz.name === Intl.DateTimeFormat().resolvedOptions().timeZone,
18
- )!
16
+ const userTzName = Intl.DateTimeFormat().resolvedOptions().timeZone
17
+ const userTz = (allTimezones.find((tz) => tz.name === userTzName) ??
18
+ allTimezones.find((tz) => tz.group.includes(userTzName)))!
19
19
 
20
20
  const handleTimezoneChange = (selectedTz: string) => {
21
21
  const newTimezone =
@@ -14,4 +14,5 @@ export interface NormalizedTimeZone {
14
14
  offset: string
15
15
  value: string
16
16
  currentTimeOffsetInMinutes: number
17
+ group: string[]
17
18
  }
@@ -35,5 +35,6 @@ export const allTimezones = getTimeZones().map((tz) => {
35
35
  // all searchable text - this is transformed before being rendered in `<AutoComplete>`
36
36
  value: `${tz.currentTimeFormat} ${tz.abbreviation} ${tz.name}`,
37
37
  currentTimeOffsetInMinutes: tz.currentTimeOffsetInMinutes,
38
+ group: tz.group,
38
39
  } as NormalizedTimeZone
39
40
  })