@sanity/rich-date-input 3.0.6 → 3.0.8

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/README.md CHANGED
@@ -1,4 +1,3 @@
1
- > This is a **Sanity Studio v3** plugin.
2
1
  > For the v2 version, please refer to the [studio-v2 branch](https://github.com/sanity-io/rich-date-input/tree/studio-v2).
3
2
 
4
3
  # V3 Rich Date Input
package/dist/index.d.ts CHANGED
@@ -15,8 +15,10 @@ export declare const richDate: Plugin_2<void>
15
15
  /**
16
16
  * @public
17
17
  */
18
- export declare interface RichDateDefinition
19
- extends Omit<ObjectDefinition, 'type' | 'fields' | 'options'> {
18
+ export declare interface RichDateDefinition extends Omit<
19
+ ObjectDefinition,
20
+ 'type' | 'fields' | 'options'
21
+ > {
20
22
  type: typeof richDateTypeName
21
23
  options?: DatetimeDefinition['options']
22
24
  }
package/dist/index.esm.js CHANGED
@@ -31,14 +31,37 @@ const allTimezones = getTimeZones().map(tz => {
31
31
  group: tz.group
32
32
  };
33
33
  });
34
+ var __defProp$1 = Object.defineProperty;
35
+ var __defProps$1 = Object.defineProperties;
36
+ var __getOwnPropDescs$1 = Object.getOwnPropertyDescriptors;
37
+ var __getOwnPropSymbols$1 = Object.getOwnPropertySymbols;
38
+ var __hasOwnProp$1 = Object.prototype.hasOwnProperty;
39
+ var __propIsEnum$1 = Object.prototype.propertyIsEnumerable;
40
+ var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, {
41
+ enumerable: true,
42
+ configurable: true,
43
+ writable: true,
44
+ value
45
+ }) : obj[key] = value;
46
+ var __spreadValues$1 = (a, b) => {
47
+ for (var prop in b || (b = {})) if (__hasOwnProp$1.call(b, prop)) __defNormalProp$1(a, prop, b[prop]);
48
+ if (__getOwnPropSymbols$1) for (var prop of __getOwnPropSymbols$1(b)) {
49
+ if (__propIsEnum$1.call(b, prop)) __defNormalProp$1(a, prop, b[prop]);
50
+ }
51
+ return a;
52
+ };
53
+ var __spreadProps$1 = (a, b) => __defProps$1(a, __getOwnPropDescs$1(b));
34
54
  const RelativeDateTimePicker = props => {
55
+ var _a;
35
56
  const {
36
57
  dateValue: value,
37
- onChange
58
+ inputProps: {
59
+ onChange
60
+ }
38
61
  } = props;
39
62
  const handleDateChange = useCallback(patch => {
40
- var _a;
41
- const timezone = (_a = value == null ? void 0 : value.timezone) != null ? _a : Intl.DateTimeFormat().resolvedOptions().timeZone;
63
+ var _a2;
64
+ const timezone = (_a2 = value == null ? void 0 : value.timezone) != null ? _a2 : Intl.DateTimeFormat().resolvedOptions().timeZone;
42
65
  const newDatetime = patch == null ? void 0 : patch.value;
43
66
  if (!newDatetime || !("type" in patch) || patch.type !== "set") {
44
67
  onChange(unset());
@@ -59,21 +82,21 @@ const RelativeDateTimePicker = props => {
59
82
  }
60
83
  onChange(patches);
61
84
  }, [onChange, value]);
62
- const dateToDisplay = (value == null ? void 0 : value.utc) ? getConstructedUTCDate(value.utc, value.offset) : "";
63
- return /* @__PURE__ */jsx(DateTimeInput, {
64
- ...props,
85
+ const displayOffset = (value == null ? void 0 : value.utc) && (value == null ? void 0 : value.timezone) ? getTimezoneOffset(value.timezone, new Date(value.utc)) / 60 / 1e3 : (_a = value == null ? void 0 : value.offset) != null ? _a : 0;
86
+ const dateToDisplay = (value == null ? void 0 : value.utc) ? getConstructedUTCDate(value.utc, displayOffset) : "";
87
+ return /* @__PURE__ */jsx(DateTimeInput, __spreadProps$1(__spreadValues$1({}, props), {
65
88
  onChange: handleDateChange,
66
89
  value: dateToDisplay
67
- });
90
+ }));
68
91
  };
69
92
  const TimezoneButton = props => {
70
- var _a, _b, _c, _d, _e;
93
+ var _a, _b, _c, _d, _e, _f, _g;
71
94
  const {
72
95
  onClick,
73
96
  timezone
74
97
  } = props;
75
98
  const currentTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
76
- 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;
99
+ const label = (_g = (_e = (_c = (_a = allTimezones.find(tz => tz.name === timezone)) == null ? void 0 : _a.abbreviation) != null ? _c : (_b = allTimezones.find(tz => tz.group.includes(timezone))) == null ? void 0 : _b.abbreviation) != null ? _e : (_d = allTimezones.find(tz => tz.name === currentTimezone)) == null ? void 0 : _d.abbreviation) != null ? _g : (_f = allTimezones.find(tz => tz.group.includes(currentTimezone))) == null ? void 0 : _f.abbreviation;
77
100
  return /* @__PURE__ */jsx(Button, {
78
101
  fontSize: 1,
79
102
  style: {
@@ -166,6 +189,26 @@ const TimezoneSelector = props => {
166
189
  })
167
190
  );
168
191
  };
192
+ var __defProp = Object.defineProperty;
193
+ var __defProps = Object.defineProperties;
194
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
195
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
196
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
197
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
198
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, {
199
+ enumerable: true,
200
+ configurable: true,
201
+ writable: true,
202
+ value
203
+ }) : obj[key] = value;
204
+ var __spreadValues = (a, b) => {
205
+ for (var prop in b || (b = {})) if (__hasOwnProp.call(b, prop)) __defNormalProp(a, prop, b[prop]);
206
+ if (__getOwnPropSymbols) for (var prop of __getOwnPropSymbols(b)) {
207
+ if (__propIsEnum.call(b, prop)) __defNormalProp(a, prop, b[prop]);
208
+ }
209
+ return a;
210
+ };
211
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
169
212
  const RichDateInput = props => {
170
213
  const {
171
214
  onChange,
@@ -185,24 +228,23 @@ const RichDateInput = props => {
185
228
  children: [/* @__PURE__ */jsxs(Flex, {
186
229
  children: [/* @__PURE__ */jsx(Box, {
187
230
  flex: [1, 2, 4],
188
- children: localMember && /* @__PURE__ */jsx(ObjectInputMember, {
189
- ...props,
231
+ children: localMember && /* @__PURE__ */jsx(ObjectInputMember, __spreadProps(__spreadValues({}, props), {
190
232
  member: localMember,
191
- renderInput: renderInputProps => /* @__PURE__ */jsx(RelativeDateTimePicker, {
192
- ...renderInputProps,
233
+ renderField: renderFieldProps => /* @__PURE__ */jsx(RelativeDateTimePicker, __spreadProps(__spreadValues({}, renderFieldProps), {
193
234
  dateValue: value,
194
- schemaType: {
195
- ...renderInputProps.schemaType,
235
+ schemaType: __spreadProps(__spreadValues({}, renderFieldProps.schemaType), {
196
236
  options
197
- },
198
- onChange
199
- })
200
- })
237
+ }),
238
+ inputProps: __spreadProps(__spreadValues({}, renderFieldProps.inputProps), {
239
+ onChange
240
+ })
241
+ }))
242
+ }))
201
243
  }), /* @__PURE__ */jsx(Box, {
202
244
  flex: [1],
203
245
  marginLeft: [2, 2, 3, 4],
204
- children: timezoneMember && /* @__PURE__ */jsx(ObjectInputMember, {
205
- ...props,
246
+ marginTop: 2,
247
+ children: timezoneMember && /* @__PURE__ */jsx(ObjectInputMember, __spreadProps(__spreadValues({}, props), {
206
248
  member: timezoneMember,
207
249
  renderInput: () => {
208
250
  var _a;
@@ -211,7 +253,7 @@ const RichDateInput = props => {
211
253
  timezone: (_a = value == null ? void 0 : value.timezone) != null ? _a : ""
212
254
  });
213
255
  }
214
- })
256
+ }))
215
257
  })]
216
258
  }), timezoneSelectorOpen && /* @__PURE__ */jsx(Dialog, {
217
259
  onClose,
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/utils/index.ts","../src/components/RelativeDateTimePicker.tsx","../src/components/TimezoneButton.tsx","../src/components/TimezoneSelector.tsx","../src/components/RichDateInput.tsx","../src/schema.ts","../src/index.ts"],"sourcesContent":["import {getTimeZones} from '@vvo/tzdb'\nimport {formatInTimeZone} from 'date-fns-tz'\n\nimport {NormalizedTimeZone} from '../types'\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 = 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 {formatInTimeZone, getTimezoneOffset, zonedTimeToUtc} from 'date-fns-tz'\nimport {type ReactNode, useCallback} from 'react'\nimport {DateTimeInput, FormPatch, InputProps, PatchEvent, set, unset} from 'sanity'\n\nimport {RichDate} from '../types'\nimport {getConstructedUTCDate, unlocalizeDateTime} from '../utils'\n\ninterface RelativeDateTimePickerProps extends Omit<InputProps, 'renderDefault'> {\n dateValue?: RichDate\n}\nexport const RelativeDateTimePicker = (props: RelativeDateTimePickerProps): ReactNode => {\n const {dateValue: value, onChange} = props\n\n const handleDateChange = useCallback(\n (patch: FormPatch | PatchEvent | FormPatch[]) => {\n const timezone = value?.timezone ?? Intl.DateTimeFormat().resolvedOptions().timeZone\n const newDatetime = (patch as unknown as {value: string})?.value\n if (!newDatetime || !('type' in patch) || patch.type !== 'set') {\n onChange(unset())\n return\n }\n\n /* get what time the user \"meant\" to set without tz info\n * right now, newDatetime is the time the user set plus\n * their current offset, not the timezone offset\n */\n const desiredDateTime = unlocalizeDateTime(\n newDatetime,\n Intl.DateTimeFormat().resolvedOptions().timeZone,\n )\n\n const newUtcDateObject = zonedTimeToUtc(desiredDateTime, timezone)\n // offset may have changed based on DST, capture that\n const newOffset = getTimezoneOffset(timezone, newUtcDateObject) / 60 / 1000\n const localDate = formatInTimeZone(newUtcDateObject, timezone, \"yyyy-MM-dd'T'HH:mm:ssXXX\")\n\n const patches = []\n\n patches.push(set(newUtcDateObject.toISOString(), ['utc']))\n patches.push(set(localDate, ['local']))\n\n if (!value?.timezone) {\n patches.push(set(timezone, ['timezone']))\n }\n\n if (value?.offset !== newOffset) {\n patches.push(set(newOffset, ['offset']))\n }\n\n onChange(patches)\n },\n [onChange, value],\n )\n\n const dateToDisplay = value?.utc ? getConstructedUTCDate(value.utc, value.offset) : ''\n\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 {EarthAmericasIcon} from '@sanity/icons'\nimport {Button} from '@sanity/ui'\nimport {type ReactNode} from 'react'\n\nimport {allTimezones} from '../utils'\n\ninterface TimezoneButtonProps {\n onClick: () => void\n timezone: string\n}\n\nexport const TimezoneButton = (props: TimezoneButtonProps): ReactNode => {\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 {SearchIcon} from '@sanity/icons'\nimport {Autocomplete, Box, Card, Text} from '@sanity/ui'\nimport {formatInTimeZone, getTimezoneOffset, zonedTimeToUtc} from 'date-fns-tz'\nimport {type ReactNode, useCallback} from 'react'\nimport {ObjectInputProps, set} from 'sanity'\n\nimport {NormalizedTimeZone, RichDate} from '../types'\nimport {allTimezones, unlocalizeDateTime} from '../utils'\n\ninterface TimezoneSelectorProps {\n onChange: Pick<ObjectInputProps, 'onChange'>['onChange']\n value?: RichDate\n}\n\nexport const TimezoneSelector = (props: TimezoneSelectorProps): ReactNode => {\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 = useCallback(\n (selectedTz: string) => {\n const newTimezone =\n allTimezones.find((tz) => tz.value === selectedTz) ?? (userTz as NormalizedTimeZone)\n\n const timezonePatch = set(newTimezone.name, ['timezone'])\n const patches = [timezonePatch]\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 newUtcDateObject = zonedTimeToUtc(desiredDateTime, newTimezone.name)\n const newOffset = getTimezoneOffset(newTimezone.name, newUtcDateObject) / 60 / 1000\n const newLocalDate = formatInTimeZone(\n newUtcDateObject.toISOString(),\n newTimezone.name,\n \"yyyy-MM-dd'T'HH:mm:ssXXX\",\n )\n patches.push(set(newUtcDateObject.toISOString(), ['utc']))\n patches.push(set(newLocalDate, ['local']))\n patches.push(set(newOffset, ['offset']))\n }\n onChange(patches)\n },\n [onChange, userTz, value],\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 // eslint-disable-next-line react/jsx-no-bind\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 // eslint-disable-next-line react/jsx-no-bind\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 {Box, Dialog, Flex} from '@sanity/ui'\nimport {type ReactNode, useCallback, useState} from 'react'\nimport {ObjectInputMember, ObjectInputProps} from 'sanity'\n\nimport {RichDate} from '../types'\nimport {RelativeDateTimePicker} from './RelativeDateTimePicker'\nimport {TimezoneButton} from './TimezoneButton'\nimport {TimezoneSelector} from './TimezoneSelector'\n\nexport const RichDateInput = (props: ObjectInputProps): ReactNode => {\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 // eslint-disable-next-line react/jsx-no-bind\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 // eslint-disable-next-line react/jsx-no-bind\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 defineField,\n defineType,\n ObjectDefinition,\n ObjectSchemaType,\n} from 'sanity'\n\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'\n\nimport {RichDateDefinition, richDateSchema, 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 {RichDate, RichDateDefinition, RichDateSchemaType}\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","dateValue","onChange","handleDateChange","useCallback","patch","_a","Intl","DateTimeFormat","resolvedOptions","timeZone","newDatetime","type","unset","desiredDateTime","newUtcDateObject","zonedTimeToUtc","newOffset","localDate","patches","push","set","dateToDisplay","DateTimeInput","TimezoneButton","_b","_c","_d","_e","onClick","currentTimezone","label","find","includes","jsx","Button","fontSize","style","width","justify","icon","EarthAmericasIcon","mode","text","TimezoneSelector","currentTz","userTzName","userTz","handleTimezoneChange","selectedTz","newTimezone","timezonePatch","newLocalDate","Box","padding","children","Autocomplete","SearchIcon","id","openButton","options","placeholder","popover","boundaryElement","document","querySelector","constrainSize","placement","renderOption","option","Card","as","jsxs","Text","size","textOverflow","fontWeight","marginLeft","renderValue","_","tabIndex","RichDateInput","members","schemaType","localMember","member","kind","timezoneMember","timezoneSelectorOpen","setTimezoneSelectorOpen","useState","onClose","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/TimezoneButton.tsx","../src/components/TimezoneSelector.tsx","../src/components/RichDateInput.tsx","../src/schema.ts","../src/index.ts"],"sourcesContent":["import {getTimeZones} from '@vvo/tzdb'\nimport {formatInTimeZone} from 'date-fns-tz'\n\nimport {NormalizedTimeZone} from '../types'\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 = 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 {formatInTimeZone, getTimezoneOffset, zonedTimeToUtc} from 'date-fns-tz'\nimport {type ReactNode, useCallback} from 'react'\nimport {DateTimeInput, FieldProps, FormPatch, PatchEvent, set, unset} from 'sanity'\n\nimport {RichDate} from '../types'\nimport {getConstructedUTCDate, unlocalizeDateTime} from '../utils'\n\ninterface RelativeDateTimePickerProps extends Omit<FieldProps, 'renderDefault'> {\n dateValue?: RichDate\n}\nexport const RelativeDateTimePicker = (props: RelativeDateTimePickerProps): ReactNode => {\n const {\n dateValue: value,\n inputProps: {onChange},\n } = props\n\n const handleDateChange = useCallback(\n (patch: FormPatch | PatchEvent | FormPatch[]) => {\n const timezone = value?.timezone ?? Intl.DateTimeFormat().resolvedOptions().timeZone\n const newDatetime = (patch as unknown as {value: string})?.value\n if (!newDatetime || !('type' in patch) || patch.type !== 'set') {\n onChange(unset())\n return\n }\n\n /* get what time the user \"meant\" to set without tz info\n * right now, newDatetime is the time the user set plus\n * their current offset, not the timezone offset\n */\n const desiredDateTime = unlocalizeDateTime(\n newDatetime,\n Intl.DateTimeFormat().resolvedOptions().timeZone,\n )\n\n const newUtcDateObject = zonedTimeToUtc(desiredDateTime, timezone)\n // offset may have changed based on DST, capture that\n const newOffset = getTimezoneOffset(timezone, newUtcDateObject) / 60 / 1000\n const localDate = formatInTimeZone(newUtcDateObject, timezone, \"yyyy-MM-dd'T'HH:mm:ssXXX\")\n\n const patches = []\n\n patches.push(set(newUtcDateObject.toISOString(), ['utc']))\n patches.push(set(localDate, ['local']))\n\n if (!value?.timezone) {\n patches.push(set(timezone, ['timezone']))\n }\n\n if (value?.offset !== newOffset) {\n patches.push(set(newOffset, ['offset']))\n }\n\n onChange(patches)\n },\n [onChange, value],\n )\n\n // Dynamically calculate the offset for the actual event date to handle DST correctly\n const displayOffset =\n value?.utc && value?.timezone\n ? getTimezoneOffset(value.timezone, new Date(value.utc)) / 60 / 1000\n : (value?.offset ?? 0)\n\n const dateToDisplay = value?.utc ? getConstructedUTCDate(value.utc, displayOffset) : ''\n\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 {EarthAmericasIcon} from '@sanity/icons'\nimport {Button} from '@sanity/ui'\nimport {type ReactNode} from 'react'\n\nimport {allTimezones} from '../utils'\n\ninterface TimezoneButtonProps {\n onClick: () => void\n timezone: string\n}\n\nexport const TimezoneButton = (props: TimezoneButtonProps): ReactNode => {\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.group.includes(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 {SearchIcon} from '@sanity/icons'\nimport {Autocomplete, Box, Card, Text} from '@sanity/ui'\nimport {formatInTimeZone, getTimezoneOffset, zonedTimeToUtc} from 'date-fns-tz'\nimport {type ReactNode, useCallback} from 'react'\nimport {ObjectInputProps, set} from 'sanity'\n\nimport {NormalizedTimeZone, RichDate} from '../types'\nimport {allTimezones, unlocalizeDateTime} from '../utils'\n\ninterface TimezoneSelectorProps {\n onChange: Pick<ObjectInputProps, 'onChange'>['onChange']\n value?: RichDate\n}\n\nexport const TimezoneSelector = (props: TimezoneSelectorProps): ReactNode => {\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 = useCallback(\n (selectedTz: string) => {\n const newTimezone =\n allTimezones.find((tz) => tz.value === selectedTz) ?? (userTz as NormalizedTimeZone)\n\n const timezonePatch = set(newTimezone.name, ['timezone'])\n const patches = [timezonePatch]\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 newUtcDateObject = zonedTimeToUtc(desiredDateTime, newTimezone.name)\n const newOffset = getTimezoneOffset(newTimezone.name, newUtcDateObject) / 60 / 1000\n const newLocalDate = formatInTimeZone(\n newUtcDateObject.toISOString(),\n newTimezone.name,\n \"yyyy-MM-dd'T'HH:mm:ssXXX\",\n )\n patches.push(set(newUtcDateObject.toISOString(), ['utc']))\n patches.push(set(newLocalDate, ['local']))\n patches.push(set(newOffset, ['offset']))\n }\n onChange(patches)\n },\n [onChange, userTz, value],\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 // eslint-disable-next-line react/jsx-no-bind\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 // eslint-disable-next-line react/jsx-no-bind\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 {Box, Dialog, Flex} from '@sanity/ui'\nimport {type ReactNode, useCallback, useState} from 'react'\nimport {ObjectInputMember, ObjectInputProps} from 'sanity'\n\nimport {RichDate} from '../types'\nimport {RelativeDateTimePicker} from './RelativeDateTimePicker'\nimport {TimezoneButton} from './TimezoneButton'\nimport {TimezoneSelector} from './TimezoneSelector'\n\nexport const RichDateInput = (props: ObjectInputProps): ReactNode => {\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 // eslint-disable-next-line react/jsx-no-bind\n renderField={(renderFieldProps) => (\n <RelativeDateTimePicker\n {...renderFieldProps}\n dateValue={value as RichDate}\n schemaType={{...renderFieldProps.schemaType, options}}\n inputProps={{...renderFieldProps.inputProps, onChange: onChange}}\n />\n )}\n />\n )}\n </Box>\n <Box flex={[1]} marginLeft={[2, 2, 3, 4]} marginTop={2}>\n {timezoneMember && (\n <ObjectInputMember\n {...props}\n member={timezoneMember}\n // eslint-disable-next-line react/jsx-no-bind\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 defineField,\n defineType,\n ObjectDefinition,\n ObjectSchemaType,\n} from 'sanity'\n\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'\n\nimport {RichDateDefinition, richDateSchema, 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 {RichDate, RichDateDefinition, RichDateSchemaType}\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","dateValue","inputProps","onChange","handleDateChange","useCallback","patch","Intl","DateTimeFormat","resolvedOptions","timeZone","newDatetime","type","unset","desiredDateTime","newUtcDateObject","zonedTimeToUtc","newOffset","localDate","patches","push","set","displayOffset","dateToDisplay","DateTimeInput","__spreadProps","__spreadValues","TimezoneButton","_b","_c","_d","_e","_f","_g","onClick","currentTimezone","label","find","includes","jsx","Button","fontSize","style","width","justify","icon","EarthAmericasIcon","mode","text","TimezoneSelector","currentTz","userTzName","userTz","handleTimezoneChange","selectedTz","newTimezone","timezonePatch","newLocalDate","Box","padding","children","Autocomplete","SearchIcon","id","openButton","options","placeholder","popover","boundaryElement","document","querySelector","constrainSize","placement","renderOption","option","Card","as","jsxs","Text","size","textOverflow","fontWeight","marginLeft","renderValue","_","tabIndex","RichDateInput","members","schemaType","localMember","member","kind","timezoneMember","timezoneSelectorOpen","setTimezoneSelectorOpen","useState","onClose","onOpen","Fragment","Flex","flex","ObjectInputMember","renderField","renderFieldProps","marginTop","renderInput","Dialog","header","richDateTypeName","richDateSchema","defineType","title","fields","defineField","components","input","richDate","definePlugin","schema","types"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -36,14 +36,37 @@ const allTimezones = tzdb.getTimeZones().map(tz => {
36
36
  group: tz.group
37
37
  };
38
38
  });
39
+ var __defProp$1 = Object.defineProperty;
40
+ var __defProps$1 = Object.defineProperties;
41
+ var __getOwnPropDescs$1 = Object.getOwnPropertyDescriptors;
42
+ var __getOwnPropSymbols$1 = Object.getOwnPropertySymbols;
43
+ var __hasOwnProp$1 = Object.prototype.hasOwnProperty;
44
+ var __propIsEnum$1 = Object.prototype.propertyIsEnumerable;
45
+ var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, {
46
+ enumerable: true,
47
+ configurable: true,
48
+ writable: true,
49
+ value
50
+ }) : obj[key] = value;
51
+ var __spreadValues$1 = (a, b) => {
52
+ for (var prop in b || (b = {})) if (__hasOwnProp$1.call(b, prop)) __defNormalProp$1(a, prop, b[prop]);
53
+ if (__getOwnPropSymbols$1) for (var prop of __getOwnPropSymbols$1(b)) {
54
+ if (__propIsEnum$1.call(b, prop)) __defNormalProp$1(a, prop, b[prop]);
55
+ }
56
+ return a;
57
+ };
58
+ var __spreadProps$1 = (a, b) => __defProps$1(a, __getOwnPropDescs$1(b));
39
59
  const RelativeDateTimePicker = props => {
60
+ var _a;
40
61
  const {
41
62
  dateValue: value,
42
- onChange
63
+ inputProps: {
64
+ onChange
65
+ }
43
66
  } = props;
44
67
  const handleDateChange = react.useCallback(patch => {
45
- var _a;
46
- const timezone = (_a = value == null ? void 0 : value.timezone) != null ? _a : Intl.DateTimeFormat().resolvedOptions().timeZone;
68
+ var _a2;
69
+ const timezone = (_a2 = value == null ? void 0 : value.timezone) != null ? _a2 : Intl.DateTimeFormat().resolvedOptions().timeZone;
47
70
  const newDatetime = patch == null ? void 0 : patch.value;
48
71
  if (!newDatetime || !("type" in patch) || patch.type !== "set") {
49
72
  onChange(sanity.unset());
@@ -64,21 +87,21 @@ const RelativeDateTimePicker = props => {
64
87
  }
65
88
  onChange(patches);
66
89
  }, [onChange, value]);
67
- const dateToDisplay = (value == null ? void 0 : value.utc) ? getConstructedUTCDate(value.utc, value.offset) : "";
68
- return /* @__PURE__ */jsxRuntime.jsx(sanity.DateTimeInput, {
69
- ...props,
90
+ const displayOffset = (value == null ? void 0 : value.utc) && (value == null ? void 0 : value.timezone) ? dateFnsTz.getTimezoneOffset(value.timezone, new Date(value.utc)) / 60 / 1e3 : (_a = value == null ? void 0 : value.offset) != null ? _a : 0;
91
+ const dateToDisplay = (value == null ? void 0 : value.utc) ? getConstructedUTCDate(value.utc, displayOffset) : "";
92
+ return /* @__PURE__ */jsxRuntime.jsx(sanity.DateTimeInput, __spreadProps$1(__spreadValues$1({}, props), {
70
93
  onChange: handleDateChange,
71
94
  value: dateToDisplay
72
- });
95
+ }));
73
96
  };
74
97
  const TimezoneButton = props => {
75
- var _a, _b, _c, _d, _e;
98
+ var _a, _b, _c, _d, _e, _f, _g;
76
99
  const {
77
100
  onClick,
78
101
  timezone
79
102
  } = props;
80
103
  const currentTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
81
- 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;
104
+ const label = (_g = (_e = (_c = (_a = allTimezones.find(tz => tz.name === timezone)) == null ? void 0 : _a.abbreviation) != null ? _c : (_b = allTimezones.find(tz => tz.group.includes(timezone))) == null ? void 0 : _b.abbreviation) != null ? _e : (_d = allTimezones.find(tz => tz.name === currentTimezone)) == null ? void 0 : _d.abbreviation) != null ? _g : (_f = allTimezones.find(tz => tz.group.includes(currentTimezone))) == null ? void 0 : _f.abbreviation;
82
105
  return /* @__PURE__ */jsxRuntime.jsx(ui.Button, {
83
106
  fontSize: 1,
84
107
  style: {
@@ -171,6 +194,26 @@ const TimezoneSelector = props => {
171
194
  })
172
195
  );
173
196
  };
197
+ var __defProp = Object.defineProperty;
198
+ var __defProps = Object.defineProperties;
199
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
200
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
201
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
202
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
203
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, {
204
+ enumerable: true,
205
+ configurable: true,
206
+ writable: true,
207
+ value
208
+ }) : obj[key] = value;
209
+ var __spreadValues = (a, b) => {
210
+ for (var prop in b || (b = {})) if (__hasOwnProp.call(b, prop)) __defNormalProp(a, prop, b[prop]);
211
+ if (__getOwnPropSymbols) for (var prop of __getOwnPropSymbols(b)) {
212
+ if (__propIsEnum.call(b, prop)) __defNormalProp(a, prop, b[prop]);
213
+ }
214
+ return a;
215
+ };
216
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
174
217
  const RichDateInput = props => {
175
218
  const {
176
219
  onChange,
@@ -190,24 +233,23 @@ const RichDateInput = props => {
190
233
  children: [/* @__PURE__ */jsxRuntime.jsxs(ui.Flex, {
191
234
  children: [/* @__PURE__ */jsxRuntime.jsx(ui.Box, {
192
235
  flex: [1, 2, 4],
193
- children: localMember && /* @__PURE__ */jsxRuntime.jsx(sanity.ObjectInputMember, {
194
- ...props,
236
+ children: localMember && /* @__PURE__ */jsxRuntime.jsx(sanity.ObjectInputMember, __spreadProps(__spreadValues({}, props), {
195
237
  member: localMember,
196
- renderInput: renderInputProps => /* @__PURE__ */jsxRuntime.jsx(RelativeDateTimePicker, {
197
- ...renderInputProps,
238
+ renderField: renderFieldProps => /* @__PURE__ */jsxRuntime.jsx(RelativeDateTimePicker, __spreadProps(__spreadValues({}, renderFieldProps), {
198
239
  dateValue: value,
199
- schemaType: {
200
- ...renderInputProps.schemaType,
240
+ schemaType: __spreadProps(__spreadValues({}, renderFieldProps.schemaType), {
201
241
  options
202
- },
203
- onChange
204
- })
205
- })
242
+ }),
243
+ inputProps: __spreadProps(__spreadValues({}, renderFieldProps.inputProps), {
244
+ onChange
245
+ })
246
+ }))
247
+ }))
206
248
  }), /* @__PURE__ */jsxRuntime.jsx(ui.Box, {
207
249
  flex: [1],
208
250
  marginLeft: [2, 2, 3, 4],
209
- children: timezoneMember && /* @__PURE__ */jsxRuntime.jsx(sanity.ObjectInputMember, {
210
- ...props,
251
+ marginTop: 2,
252
+ children: timezoneMember && /* @__PURE__ */jsxRuntime.jsx(sanity.ObjectInputMember, __spreadProps(__spreadValues({}, props), {
211
253
  member: timezoneMember,
212
254
  renderInput: () => {
213
255
  var _a;
@@ -216,7 +258,7 @@ const RichDateInput = props => {
216
258
  timezone: (_a = value == null ? void 0 : value.timezone) != null ? _a : ""
217
259
  });
218
260
  }
219
- })
261
+ }))
220
262
  })]
221
263
  }), timezoneSelectorOpen && /* @__PURE__ */jsxRuntime.jsx(ui.Dialog, {
222
264
  onClose,
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/TimezoneButton.tsx","../src/components/TimezoneSelector.tsx","../src/components/RichDateInput.tsx","../src/schema.ts","../src/index.ts"],"sourcesContent":["import {getTimeZones} from '@vvo/tzdb'\nimport {formatInTimeZone} from 'date-fns-tz'\n\nimport {NormalizedTimeZone} from '../types'\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 = 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 {formatInTimeZone, getTimezoneOffset, zonedTimeToUtc} from 'date-fns-tz'\nimport {type ReactNode, useCallback} from 'react'\nimport {DateTimeInput, FormPatch, InputProps, PatchEvent, set, unset} from 'sanity'\n\nimport {RichDate} from '../types'\nimport {getConstructedUTCDate, unlocalizeDateTime} from '../utils'\n\ninterface RelativeDateTimePickerProps extends Omit<InputProps, 'renderDefault'> {\n dateValue?: RichDate\n}\nexport const RelativeDateTimePicker = (props: RelativeDateTimePickerProps): ReactNode => {\n const {dateValue: value, onChange} = props\n\n const handleDateChange = useCallback(\n (patch: FormPatch | PatchEvent | FormPatch[]) => {\n const timezone = value?.timezone ?? Intl.DateTimeFormat().resolvedOptions().timeZone\n const newDatetime = (patch as unknown as {value: string})?.value\n if (!newDatetime || !('type' in patch) || patch.type !== 'set') {\n onChange(unset())\n return\n }\n\n /* get what time the user \"meant\" to set without tz info\n * right now, newDatetime is the time the user set plus\n * their current offset, not the timezone offset\n */\n const desiredDateTime = unlocalizeDateTime(\n newDatetime,\n Intl.DateTimeFormat().resolvedOptions().timeZone,\n )\n\n const newUtcDateObject = zonedTimeToUtc(desiredDateTime, timezone)\n // offset may have changed based on DST, capture that\n const newOffset = getTimezoneOffset(timezone, newUtcDateObject) / 60 / 1000\n const localDate = formatInTimeZone(newUtcDateObject, timezone, \"yyyy-MM-dd'T'HH:mm:ssXXX\")\n\n const patches = []\n\n patches.push(set(newUtcDateObject.toISOString(), ['utc']))\n patches.push(set(localDate, ['local']))\n\n if (!value?.timezone) {\n patches.push(set(timezone, ['timezone']))\n }\n\n if (value?.offset !== newOffset) {\n patches.push(set(newOffset, ['offset']))\n }\n\n onChange(patches)\n },\n [onChange, value],\n )\n\n const dateToDisplay = value?.utc ? getConstructedUTCDate(value.utc, value.offset) : ''\n\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 {EarthAmericasIcon} from '@sanity/icons'\nimport {Button} from '@sanity/ui'\nimport {type ReactNode} from 'react'\n\nimport {allTimezones} from '../utils'\n\ninterface TimezoneButtonProps {\n onClick: () => void\n timezone: string\n}\n\nexport const TimezoneButton = (props: TimezoneButtonProps): ReactNode => {\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 {SearchIcon} from '@sanity/icons'\nimport {Autocomplete, Box, Card, Text} from '@sanity/ui'\nimport {formatInTimeZone, getTimezoneOffset, zonedTimeToUtc} from 'date-fns-tz'\nimport {type ReactNode, useCallback} from 'react'\nimport {ObjectInputProps, set} from 'sanity'\n\nimport {NormalizedTimeZone, RichDate} from '../types'\nimport {allTimezones, unlocalizeDateTime} from '../utils'\n\ninterface TimezoneSelectorProps {\n onChange: Pick<ObjectInputProps, 'onChange'>['onChange']\n value?: RichDate\n}\n\nexport const TimezoneSelector = (props: TimezoneSelectorProps): ReactNode => {\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 = useCallback(\n (selectedTz: string) => {\n const newTimezone =\n allTimezones.find((tz) => tz.value === selectedTz) ?? (userTz as NormalizedTimeZone)\n\n const timezonePatch = set(newTimezone.name, ['timezone'])\n const patches = [timezonePatch]\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 newUtcDateObject = zonedTimeToUtc(desiredDateTime, newTimezone.name)\n const newOffset = getTimezoneOffset(newTimezone.name, newUtcDateObject) / 60 / 1000\n const newLocalDate = formatInTimeZone(\n newUtcDateObject.toISOString(),\n newTimezone.name,\n \"yyyy-MM-dd'T'HH:mm:ssXXX\",\n )\n patches.push(set(newUtcDateObject.toISOString(), ['utc']))\n patches.push(set(newLocalDate, ['local']))\n patches.push(set(newOffset, ['offset']))\n }\n onChange(patches)\n },\n [onChange, userTz, value],\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 // eslint-disable-next-line react/jsx-no-bind\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 // eslint-disable-next-line react/jsx-no-bind\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 {Box, Dialog, Flex} from '@sanity/ui'\nimport {type ReactNode, useCallback, useState} from 'react'\nimport {ObjectInputMember, ObjectInputProps} from 'sanity'\n\nimport {RichDate} from '../types'\nimport {RelativeDateTimePicker} from './RelativeDateTimePicker'\nimport {TimezoneButton} from './TimezoneButton'\nimport {TimezoneSelector} from './TimezoneSelector'\n\nexport const RichDateInput = (props: ObjectInputProps): ReactNode => {\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 // eslint-disable-next-line react/jsx-no-bind\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 // eslint-disable-next-line react/jsx-no-bind\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 defineField,\n defineType,\n ObjectDefinition,\n ObjectSchemaType,\n} from 'sanity'\n\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'\n\nimport {RichDateDefinition, richDateSchema, 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 {RichDate, RichDateDefinition, RichDateSchemaType}\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","dateValue","onChange","handleDateChange","useCallback","patch","_a","Intl","DateTimeFormat","resolvedOptions","timeZone","newDatetime","type","unset","desiredDateTime","newUtcDateObject","zonedTimeToUtc","newOffset","localDate","patches","push","set","dateToDisplay","DateTimeInput","TimezoneButton","_b","_c","_d","_e","onClick","currentTimezone","label","find","includes","jsx","Button","fontSize","style","width","justify","icon","EarthAmericasIcon","mode","text","TimezoneSelector","currentTz","userTzName","userTz","handleTimezoneChange","selectedTz","newTimezone","timezonePatch","newLocalDate","Box","padding","children","Autocomplete","SearchIcon","id","openButton","options","placeholder","popover","boundaryElement","document","querySelector","constrainSize","placement","renderOption","option","Card","as","jsxs","Text","size","textOverflow","fontWeight","marginLeft","renderValue","_","tabIndex","RichDateInput","members","schemaType","localMember","member","kind","timezoneMember","timezoneSelectorOpen","setTimezoneSelectorOpen","useState","onClose","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/TimezoneButton.tsx","../src/components/TimezoneSelector.tsx","../src/components/RichDateInput.tsx","../src/schema.ts","../src/index.ts"],"sourcesContent":["import {getTimeZones} from '@vvo/tzdb'\nimport {formatInTimeZone} from 'date-fns-tz'\n\nimport {NormalizedTimeZone} from '../types'\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 = 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 {formatInTimeZone, getTimezoneOffset, zonedTimeToUtc} from 'date-fns-tz'\nimport {type ReactNode, useCallback} from 'react'\nimport {DateTimeInput, FieldProps, FormPatch, PatchEvent, set, unset} from 'sanity'\n\nimport {RichDate} from '../types'\nimport {getConstructedUTCDate, unlocalizeDateTime} from '../utils'\n\ninterface RelativeDateTimePickerProps extends Omit<FieldProps, 'renderDefault'> {\n dateValue?: RichDate\n}\nexport const RelativeDateTimePicker = (props: RelativeDateTimePickerProps): ReactNode => {\n const {\n dateValue: value,\n inputProps: {onChange},\n } = props\n\n const handleDateChange = useCallback(\n (patch: FormPatch | PatchEvent | FormPatch[]) => {\n const timezone = value?.timezone ?? Intl.DateTimeFormat().resolvedOptions().timeZone\n const newDatetime = (patch as unknown as {value: string})?.value\n if (!newDatetime || !('type' in patch) || patch.type !== 'set') {\n onChange(unset())\n return\n }\n\n /* get what time the user \"meant\" to set without tz info\n * right now, newDatetime is the time the user set plus\n * their current offset, not the timezone offset\n */\n const desiredDateTime = unlocalizeDateTime(\n newDatetime,\n Intl.DateTimeFormat().resolvedOptions().timeZone,\n )\n\n const newUtcDateObject = zonedTimeToUtc(desiredDateTime, timezone)\n // offset may have changed based on DST, capture that\n const newOffset = getTimezoneOffset(timezone, newUtcDateObject) / 60 / 1000\n const localDate = formatInTimeZone(newUtcDateObject, timezone, \"yyyy-MM-dd'T'HH:mm:ssXXX\")\n\n const patches = []\n\n patches.push(set(newUtcDateObject.toISOString(), ['utc']))\n patches.push(set(localDate, ['local']))\n\n if (!value?.timezone) {\n patches.push(set(timezone, ['timezone']))\n }\n\n if (value?.offset !== newOffset) {\n patches.push(set(newOffset, ['offset']))\n }\n\n onChange(patches)\n },\n [onChange, value],\n )\n\n // Dynamically calculate the offset for the actual event date to handle DST correctly\n const displayOffset =\n value?.utc && value?.timezone\n ? getTimezoneOffset(value.timezone, new Date(value.utc)) / 60 / 1000\n : (value?.offset ?? 0)\n\n const dateToDisplay = value?.utc ? getConstructedUTCDate(value.utc, displayOffset) : ''\n\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 {EarthAmericasIcon} from '@sanity/icons'\nimport {Button} from '@sanity/ui'\nimport {type ReactNode} from 'react'\n\nimport {allTimezones} from '../utils'\n\ninterface TimezoneButtonProps {\n onClick: () => void\n timezone: string\n}\n\nexport const TimezoneButton = (props: TimezoneButtonProps): ReactNode => {\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.group.includes(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 {SearchIcon} from '@sanity/icons'\nimport {Autocomplete, Box, Card, Text} from '@sanity/ui'\nimport {formatInTimeZone, getTimezoneOffset, zonedTimeToUtc} from 'date-fns-tz'\nimport {type ReactNode, useCallback} from 'react'\nimport {ObjectInputProps, set} from 'sanity'\n\nimport {NormalizedTimeZone, RichDate} from '../types'\nimport {allTimezones, unlocalizeDateTime} from '../utils'\n\ninterface TimezoneSelectorProps {\n onChange: Pick<ObjectInputProps, 'onChange'>['onChange']\n value?: RichDate\n}\n\nexport const TimezoneSelector = (props: TimezoneSelectorProps): ReactNode => {\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 = useCallback(\n (selectedTz: string) => {\n const newTimezone =\n allTimezones.find((tz) => tz.value === selectedTz) ?? (userTz as NormalizedTimeZone)\n\n const timezonePatch = set(newTimezone.name, ['timezone'])\n const patches = [timezonePatch]\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 newUtcDateObject = zonedTimeToUtc(desiredDateTime, newTimezone.name)\n const newOffset = getTimezoneOffset(newTimezone.name, newUtcDateObject) / 60 / 1000\n const newLocalDate = formatInTimeZone(\n newUtcDateObject.toISOString(),\n newTimezone.name,\n \"yyyy-MM-dd'T'HH:mm:ssXXX\",\n )\n patches.push(set(newUtcDateObject.toISOString(), ['utc']))\n patches.push(set(newLocalDate, ['local']))\n patches.push(set(newOffset, ['offset']))\n }\n onChange(patches)\n },\n [onChange, userTz, value],\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 // eslint-disable-next-line react/jsx-no-bind\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 // eslint-disable-next-line react/jsx-no-bind\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 {Box, Dialog, Flex} from '@sanity/ui'\nimport {type ReactNode, useCallback, useState} from 'react'\nimport {ObjectInputMember, ObjectInputProps} from 'sanity'\n\nimport {RichDate} from '../types'\nimport {RelativeDateTimePicker} from './RelativeDateTimePicker'\nimport {TimezoneButton} from './TimezoneButton'\nimport {TimezoneSelector} from './TimezoneSelector'\n\nexport const RichDateInput = (props: ObjectInputProps): ReactNode => {\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 // eslint-disable-next-line react/jsx-no-bind\n renderField={(renderFieldProps) => (\n <RelativeDateTimePicker\n {...renderFieldProps}\n dateValue={value as RichDate}\n schemaType={{...renderFieldProps.schemaType, options}}\n inputProps={{...renderFieldProps.inputProps, onChange: onChange}}\n />\n )}\n />\n )}\n </Box>\n <Box flex={[1]} marginLeft={[2, 2, 3, 4]} marginTop={2}>\n {timezoneMember && (\n <ObjectInputMember\n {...props}\n member={timezoneMember}\n // eslint-disable-next-line react/jsx-no-bind\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 defineField,\n defineType,\n ObjectDefinition,\n ObjectSchemaType,\n} from 'sanity'\n\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'\n\nimport {RichDateDefinition, richDateSchema, 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 {RichDate, RichDateDefinition, RichDateSchemaType}\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","dateValue","inputProps","onChange","handleDateChange","useCallback","patch","Intl","DateTimeFormat","resolvedOptions","timeZone","newDatetime","type","unset","desiredDateTime","newUtcDateObject","zonedTimeToUtc","newOffset","localDate","patches","push","set","displayOffset","dateToDisplay","DateTimeInput","__spreadProps","__spreadValues","TimezoneButton","_b","_c","_d","_e","_f","_g","onClick","currentTimezone","label","find","includes","jsx","Button","fontSize","style","width","justify","icon","EarthAmericasIcon","mode","text","TimezoneSelector","currentTz","userTzName","userTz","handleTimezoneChange","selectedTz","newTimezone","timezonePatch","newLocalDate","Box","padding","children","Autocomplete","SearchIcon","id","openButton","options","placeholder","popover","boundaryElement","document","querySelector","constrainSize","placement","renderOption","option","Card","as","jsxs","Text","size","textOverflow","fontWeight","marginLeft","renderValue","_","tabIndex","RichDateInput","members","schemaType","localMember","member","kind","timezoneMember","timezoneSelectorOpen","setTimezoneSelectorOpen","useState","onClose","onOpen","Fragment","Flex","flex","ObjectInputMember","renderField","renderFieldProps","marginTop","renderInput","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.6",
3
+ "version": "3.0.8",
4
4
  "description": "A timezone-aware datetime type and input component for Sanity Studio",
5
5
  "keywords": [
6
6
  "sanity",
@@ -90,7 +90,7 @@
90
90
  },
91
91
  "peerDependencies": {
92
92
  "react": "^18 || ^19",
93
- "sanity": "^3 || ^4.0.0-0"
93
+ "sanity": "^3 || ^4.0.0-0 || ^5.0.0"
94
94
  },
95
95
  "engines": {
96
96
  "node": ">=14"
@@ -1,15 +1,18 @@
1
1
  import {formatInTimeZone, getTimezoneOffset, zonedTimeToUtc} from 'date-fns-tz'
2
2
  import {type ReactNode, useCallback} from 'react'
3
- import {DateTimeInput, FormPatch, InputProps, PatchEvent, set, unset} from 'sanity'
3
+ import {DateTimeInput, FieldProps, FormPatch, PatchEvent, set, unset} from 'sanity'
4
4
 
5
5
  import {RichDate} from '../types'
6
6
  import {getConstructedUTCDate, unlocalizeDateTime} from '../utils'
7
7
 
8
- interface RelativeDateTimePickerProps extends Omit<InputProps, 'renderDefault'> {
8
+ interface RelativeDateTimePickerProps extends Omit<FieldProps, 'renderDefault'> {
9
9
  dateValue?: RichDate
10
10
  }
11
11
  export const RelativeDateTimePicker = (props: RelativeDateTimePickerProps): ReactNode => {
12
- const {dateValue: value, onChange} = props
12
+ const {
13
+ dateValue: value,
14
+ inputProps: {onChange},
15
+ } = props
13
16
 
14
17
  const handleDateChange = useCallback(
15
18
  (patch: FormPatch | PatchEvent | FormPatch[]) => {
@@ -52,7 +55,13 @@ export const RelativeDateTimePicker = (props: RelativeDateTimePickerProps): Reac
52
55
  [onChange, value],
53
56
  )
54
57
 
55
- const dateToDisplay = value?.utc ? getConstructedUTCDate(value.utc, value.offset) : ''
58
+ // Dynamically calculate the offset for the actual event date to handle DST correctly
59
+ const displayOffset =
60
+ value?.utc && value?.timezone
61
+ ? getTimezoneOffset(value.timezone, new Date(value.utc)) / 60 / 1000
62
+ : (value?.offset ?? 0)
63
+
64
+ const dateToDisplay = value?.utc ? getConstructedUTCDate(value.utc, displayOffset) : ''
56
65
 
57
66
  // @ts-expect-error -- slight mismatch in elementProps and renderDefault, but should line up in practice
58
67
  return <DateTimeInput {...props} onChange={handleDateChange} value={dateToDisplay} />
@@ -27,18 +27,18 @@ export const RichDateInput = (props: ObjectInputProps): ReactNode => {
27
27
  {...props}
28
28
  member={localMember}
29
29
  // eslint-disable-next-line react/jsx-no-bind
30
- renderInput={(renderInputProps) => (
30
+ renderField={(renderFieldProps) => (
31
31
  <RelativeDateTimePicker
32
- {...renderInputProps}
32
+ {...renderFieldProps}
33
33
  dateValue={value as RichDate}
34
- schemaType={{...renderInputProps.schemaType, options}}
35
- onChange={onChange}
34
+ schemaType={{...renderFieldProps.schemaType, options}}
35
+ inputProps={{...renderFieldProps.inputProps, onChange: onChange}}
36
36
  />
37
37
  )}
38
38
  />
39
39
  )}
40
40
  </Box>
41
- <Box flex={[1]} marginLeft={[2, 2, 3, 4]}>
41
+ <Box flex={[1]} marginLeft={[2, 2, 3, 4]} marginTop={2}>
42
42
  {timezoneMember && (
43
43
  <ObjectInputMember
44
44
  {...props}
@@ -15,6 +15,7 @@ export const TimezoneButton = (props: TimezoneButtonProps): ReactNode => {
15
15
 
16
16
  const label =
17
17
  allTimezones.find((tz) => tz.name === timezone)?.abbreviation ??
18
+ allTimezones.find((tz) => tz.group.includes(timezone))?.abbreviation ??
18
19
  allTimezones.find((tz) => tz.name === currentTimezone)?.abbreviation ??
19
20
  allTimezones.find((tz) => tz.group.includes(currentTimezone))?.abbreviation
20
21