@payloadcms/ui 3.62.0-internal.ec3a6fa → 3.62.0

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.
Files changed (35) hide show
  1. package/dist/elements/Table/DefaultCell/fields/Date/index.d.ts +3 -1
  2. package/dist/elements/Table/DefaultCell/fields/Date/index.d.ts.map +1 -1
  3. package/dist/elements/Table/DefaultCell/fields/Date/index.js +22 -13
  4. package/dist/elements/Table/DefaultCell/fields/Date/index.js.map +1 -1
  5. package/dist/elements/Table/DefaultCell/fields/index.d.ts +5 -1
  6. package/dist/elements/Table/DefaultCell/fields/index.d.ts.map +1 -1
  7. package/dist/elements/TimezonePicker/index.d.ts.map +1 -1
  8. package/dist/elements/TimezonePicker/index.js +4 -1
  9. package/dist/elements/TimezonePicker/index.js.map +1 -1
  10. package/dist/elements/TimezonePicker/index.scss +1 -0
  11. package/dist/elements/TimezonePicker/types.d.ts +1 -0
  12. package/dist/elements/TimezonePicker/types.d.ts.map +1 -1
  13. package/dist/elements/TimezonePicker/types.js.map +1 -1
  14. package/dist/exports/client/{CodeEditor-WXQZOS3M.js → CodeEditor-IVFMKS4Z.js} +2 -2
  15. package/dist/exports/client/chunk-XUCNM5EK.js +27 -0
  16. package/dist/exports/client/{chunk-PDWTBQPH.js.map → chunk-XUCNM5EK.js.map} +4 -4
  17. package/dist/exports/client/index.js +12 -12
  18. package/dist/exports/client/index.js.map +4 -4
  19. package/dist/fields/DateTime/index.d.ts.map +1 -1
  20. package/dist/fields/DateTime/index.js +9 -2
  21. package/dist/fields/DateTime/index.js.map +1 -1
  22. package/dist/forms/fieldSchemasToFormState/fieldSchemasToFormState.spec.js +1 -8
  23. package/dist/forms/fieldSchemasToFormState/fieldSchemasToFormState.spec.js.map +1 -1
  24. package/dist/hooks/useControllableState.d.ts +5 -1
  25. package/dist/hooks/useControllableState.d.ts.map +1 -1
  26. package/dist/hooks/useControllableState.js +10 -25
  27. package/dist/hooks/useControllableState.js.map +1 -1
  28. package/dist/providers/Config/index.d.ts.map +1 -1
  29. package/dist/providers/Config/index.js +4 -10
  30. package/dist/providers/Config/index.js.map +1 -1
  31. package/dist/styles.css +1 -1
  32. package/dist/utilities/handleLivePreview.d.ts.map +1 -1
  33. package/package.json +5 -5
  34. package/dist/exports/client/chunk-PDWTBQPH.js +0 -27
  35. /package/dist/exports/client/{CodeEditor-WXQZOS3M.js.map → CodeEditor-IVFMKS4Z.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/DateTime/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA4B,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAe5E,OAAO,cAAc,CAAA;AAgMrB,eAAO,MAAM,aAAa;;;;;+EAAwC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/DateTime/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA4B,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAe5E,OAAO,cAAc,CAAA;AA2MrB,eAAO,MAAM,aAAa;;;;;+EAAwC,CAAA"}
@@ -79,13 +79,19 @@ const DateTimeFieldComponent = props => {
79
79
  });
80
80
  const timezonePath = path + '_tz';
81
81
  const timezoneField = useFormFields(([fields, _]) => fields?.[timezonePath]);
82
- const supportedTimezones = config.admin.timezones.supportedTimezones;
82
+ const supportedTimezones = useMemo(() => {
83
+ if (timezone && typeof timezone === 'object' && timezone.supportedTimezones) {
84
+ return timezone.supportedTimezones;
85
+ }
86
+ return config.admin.timezones.supportedTimezones;
87
+ }, [config.admin.timezones.supportedTimezones, timezone]);
83
88
  /**
84
89
  * Date appearance doesn't include timestamps,
85
90
  * which means we need to pin the time to always 12:00 for the selected date
86
91
  */
87
92
  const isDateOnly = ['dayOnly', 'default', 'monthOnly'].includes(pickerAppearance);
88
93
  const selectedTimezone = timezoneField?.value;
94
+ const timezoneRequired = required || timezone && typeof timezone === 'object' && timezone.required;
89
95
  // The displayed value should be the original value, adjusted to the user's timezone
90
96
  const displayedValue = useMemo(() => {
91
97
  if (timezone && selectedTimezone && userTimezone && value_0) {
@@ -173,7 +179,8 @@ const DateTimeFieldComponent = props => {
173
179
  id: `${path}-timezone-picker`,
174
180
  onChange: onChangeTimezone,
175
181
  options: supportedTimezones,
176
- required: required,
182
+ readOnly: readOnly || disabled,
183
+ required: timezoneRequired,
177
184
  selectedTimezone: selectedTimezone
178
185
  }), AfterInput]
179
186
  }), /*#__PURE__*/_jsx(RenderCustomComponent, {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["TZDateMini","TZDate","getTranslation","transpose","useCallback","useMemo","DatePickerField","RenderCustomComponent","TimezonePicker","FieldDescription","FieldError","FieldLabel","useForm","useFormFields","useField","withCondition","useConfig","useTranslation","mergeFieldStyles","fieldBaseClass","baseClass","DateTimeFieldComponent","props","field","admin","className","date","datePickerProps","description","placeholder","label","localized","required","timezone","path","pathFromProps","readOnly","validate","pickerAppearance","userTimezone","Intl","DateTimeFormat","resolvedOptions","timeZone","config","i18n","dispatchFields","setModified","memoizedValidate","value","options","customComponents","AfterInput","BeforeInput","Description","Error","Label","disabled","setValue","showError","potentiallyStalePath","timezonePath","timezoneField","fields","_","supportedTimezones","timezones","isDateOnly","includes","selectedTimezone","displayedValue","DateWithOriginalTz","tz","DateWithUserTz","modifiedDate","withTimeZone","dateWithTimezone","dateWithUserTimezone","toISOString","styles","onChange","incomingDate","TZDateWithSelectedTz","incomingOffset","getTimezoneOffset","originalHour","getHours","setHours","dateToSelectedTz","dateToUserTz","onChangeTimezone","type","_jsxs","filter","Boolean","join","style","_jsx","CustomComponent","Fallback","id","replace","overrides","length","DateTimeField"],"sources":["../../../src/fields/DateTime/index.tsx"],"sourcesContent":["'use client'\nimport type { DateFieldClientComponent, DateFieldValidation } from 'payload'\n\nimport { TZDateMini as TZDate } from '@date-fns/tz/date/mini'\nimport { getTranslation } from '@payloadcms/translations'\nimport { transpose } from 'date-fns'\nimport { useCallback, useMemo } from 'react'\n\nimport { DatePickerField } from '../../elements/DatePicker/index.js'\nimport { RenderCustomComponent } from '../../elements/RenderCustomComponent/index.js'\nimport { TimezonePicker } from '../../elements/TimezonePicker/index.js'\nimport { FieldDescription } from '../../fields/FieldDescription/index.js'\nimport { FieldError } from '../../fields/FieldError/index.js'\nimport { FieldLabel } from '../../fields/FieldLabel/index.js'\nimport { useForm, useFormFields } from '../../forms/Form/context.js'\nimport { useField } from '../../forms/useField/index.js'\nimport './index.scss'\nimport { withCondition } from '../../forms/withCondition/index.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { mergeFieldStyles } from '../mergeFieldStyles.js'\nimport { fieldBaseClass } from '../shared/index.js'\n\nconst baseClass = 'date-time-field'\n\nconst DateTimeFieldComponent: DateFieldClientComponent = (props) => {\n const {\n field,\n field: {\n admin: { className, date: datePickerProps, description, placeholder } = {},\n label,\n localized,\n required,\n timezone,\n },\n path: pathFromProps,\n readOnly,\n validate,\n } = props\n\n const pickerAppearance = datePickerProps?.pickerAppearance || 'default'\n\n // Get the user timezone so we can adjust the displayed value against it\n const userTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone\n\n const { config } = useConfig()\n const { i18n } = useTranslation()\n const { dispatchFields, setModified } = useForm()\n\n const memoizedValidate: DateFieldValidation = useCallback(\n (value, options) => {\n if (typeof validate === 'function') {\n return validate(value, { ...options, required })\n }\n },\n [validate, required],\n )\n\n const {\n customComponents: { AfterInput, BeforeInput, Description, Error, Label } = {},\n disabled,\n path,\n setValue,\n showError,\n value,\n } = useField<string>({\n potentiallyStalePath: pathFromProps,\n validate: memoizedValidate,\n })\n\n const timezonePath = path + '_tz'\n const timezoneField = useFormFields(([fields, _]) => fields?.[timezonePath])\n const supportedTimezones = config.admin.timezones.supportedTimezones\n /**\n * Date appearance doesn't include timestamps,\n * which means we need to pin the time to always 12:00 for the selected date\n */\n const isDateOnly = ['dayOnly', 'default', 'monthOnly'].includes(pickerAppearance)\n const selectedTimezone = timezoneField?.value as string\n\n // The displayed value should be the original value, adjusted to the user's timezone\n const displayedValue = useMemo(() => {\n if (timezone && selectedTimezone && userTimezone && value) {\n // Create TZDate instances for the selected timezone and the user's timezone\n // These instances allow us to transpose the date between timezones while keeping the same time value\n const DateWithOriginalTz = TZDate.tz(selectedTimezone)\n const DateWithUserTz = TZDate.tz(userTimezone)\n\n const modifiedDate = new TZDate(value).withTimeZone(selectedTimezone)\n\n // Transpose the date to the selected timezone\n const dateWithTimezone = transpose(modifiedDate, DateWithOriginalTz)\n\n // Transpose the date to the user's timezone - this is necessary because the react-datepicker component insists on displaying the date in the user's timezone\n const dateWithUserTimezone = transpose(dateWithTimezone, DateWithUserTz)\n\n return dateWithUserTimezone.toISOString()\n }\n\n return value\n }, [timezone, selectedTimezone, value, userTimezone])\n\n const styles = useMemo(() => mergeFieldStyles(field), [field])\n\n const onChange = useCallback(\n (incomingDate: Date) => {\n if (!(readOnly || disabled)) {\n if (timezone && selectedTimezone && incomingDate) {\n // Create TZDate instances for the selected timezone\n const TZDateWithSelectedTz = TZDate.tz(selectedTimezone)\n\n if (isDateOnly) {\n // We need to offset this hardcoded hour offset from the DatePicker elemenent\n // this can be removed in 4.0 when we remove the hardcoded offset as it is a breaking change\n // const tzOffset = incomingDate.getTimezoneOffset() / 60\n const incomingOffset = incomingDate.getTimezoneOffset() / 60\n const originalHour = incomingDate.getHours() + incomingOffset\n incomingDate.setHours(originalHour)\n\n // Convert the original date as picked into the desired timezone.\n const dateToSelectedTz = transpose(incomingDate, TZDateWithSelectedTz)\n\n setValue(dateToSelectedTz.toISOString() || null)\n } else {\n // Creates a TZDate instance for the user's timezone — this is default behaviour of TZDate as it wraps the Date constructor\n const dateToUserTz = new TZDate(incomingDate)\n // Transpose the date to the selected timezone\n const dateWithTimezone = transpose(dateToUserTz, TZDateWithSelectedTz)\n\n setValue(dateWithTimezone.toISOString() || null)\n }\n } else {\n setValue(incomingDate?.toISOString() || null)\n }\n }\n },\n [readOnly, disabled, timezone, selectedTimezone, isDateOnly, setValue],\n )\n\n const onChangeTimezone = useCallback(\n (timezone: string) => {\n if (timezonePath) {\n dispatchFields({\n type: 'UPDATE',\n path: timezonePath,\n value: timezone,\n })\n\n setModified(true)\n }\n },\n [dispatchFields, setModified, timezonePath],\n )\n\n return (\n <div\n className={[\n fieldBaseClass,\n baseClass,\n className,\n showError && `${baseClass}--has-error`,\n (readOnly || disabled) && 'read-only',\n ]\n .filter(Boolean)\n .join(' ')}\n style={styles}\n >\n <RenderCustomComponent\n CustomComponent={Label}\n Fallback={\n <FieldLabel label={label} localized={localized} path={path} required={required} />\n }\n />\n <div className={`${fieldBaseClass}__wrap`} id={`field-${path.replace(/\\./g, '__')}`}>\n <RenderCustomComponent\n CustomComponent={Error}\n Fallback={<FieldError path={path} showError={showError} />}\n />\n {BeforeInput}\n <DatePickerField\n {...datePickerProps}\n onChange={onChange}\n overrides={{\n ...datePickerProps?.overrides,\n }}\n placeholder={getTranslation(placeholder, i18n)}\n readOnly={readOnly || disabled}\n value={displayedValue}\n />\n {timezone && supportedTimezones.length > 0 && (\n <TimezonePicker\n id={`${path}-timezone-picker`}\n onChange={onChangeTimezone}\n options={supportedTimezones}\n required={required}\n selectedTimezone={selectedTimezone}\n />\n )}\n {AfterInput}\n </div>\n <RenderCustomComponent\n CustomComponent={Description}\n Fallback={<FieldDescription description={description} path={path} />}\n />\n </div>\n )\n}\n\nexport const DateTimeField = withCondition(DateTimeFieldComponent)\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["TZDateMini","TZDate","getTranslation","transpose","useCallback","useMemo","DatePickerField","RenderCustomComponent","TimezonePicker","FieldDescription","FieldError","FieldLabel","useForm","useFormFields","useField","withCondition","useConfig","useTranslation","mergeFieldStyles","fieldBaseClass","baseClass","DateTimeFieldComponent","props","field","admin","className","date","datePickerProps","description","placeholder","label","localized","required","timezone","path","pathFromProps","readOnly","validate","pickerAppearance","userTimezone","Intl","DateTimeFormat","resolvedOptions","timeZone","config","i18n","dispatchFields","setModified","memoizedValidate","value","options","customComponents","AfterInput","BeforeInput","Description","Error","Label","disabled","setValue","showError","potentiallyStalePath","timezonePath","timezoneField","fields","_","supportedTimezones","timezones","isDateOnly","includes","selectedTimezone","timezoneRequired","displayedValue","DateWithOriginalTz","tz","DateWithUserTz","modifiedDate","withTimeZone","dateWithTimezone","dateWithUserTimezone","toISOString","styles","onChange","incomingDate","TZDateWithSelectedTz","incomingOffset","getTimezoneOffset","originalHour","getHours","setHours","dateToSelectedTz","dateToUserTz","onChangeTimezone","type","_jsxs","filter","Boolean","join","style","_jsx","CustomComponent","Fallback","id","replace","overrides","length","DateTimeField"],"sources":["../../../src/fields/DateTime/index.tsx"],"sourcesContent":["'use client'\nimport type { DateFieldClientComponent, DateFieldValidation } from 'payload'\n\nimport { TZDateMini as TZDate } from '@date-fns/tz/date/mini'\nimport { getTranslation } from '@payloadcms/translations'\nimport { transpose } from 'date-fns'\nimport { useCallback, useMemo } from 'react'\n\nimport { DatePickerField } from '../../elements/DatePicker/index.js'\nimport { RenderCustomComponent } from '../../elements/RenderCustomComponent/index.js'\nimport { TimezonePicker } from '../../elements/TimezonePicker/index.js'\nimport { FieldDescription } from '../../fields/FieldDescription/index.js'\nimport { FieldError } from '../../fields/FieldError/index.js'\nimport { FieldLabel } from '../../fields/FieldLabel/index.js'\nimport { useForm, useFormFields } from '../../forms/Form/context.js'\nimport { useField } from '../../forms/useField/index.js'\nimport './index.scss'\nimport { withCondition } from '../../forms/withCondition/index.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { mergeFieldStyles } from '../mergeFieldStyles.js'\nimport { fieldBaseClass } from '../shared/index.js'\n\nconst baseClass = 'date-time-field'\n\nconst DateTimeFieldComponent: DateFieldClientComponent = (props) => {\n const {\n field,\n field: {\n admin: { className, date: datePickerProps, description, placeholder } = {},\n label,\n localized,\n required,\n timezone,\n },\n path: pathFromProps,\n readOnly,\n validate,\n } = props\n\n const pickerAppearance = datePickerProps?.pickerAppearance || 'default'\n\n // Get the user timezone so we can adjust the displayed value against it\n const userTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone\n\n const { config } = useConfig()\n const { i18n } = useTranslation()\n const { dispatchFields, setModified } = useForm()\n\n const memoizedValidate: DateFieldValidation = useCallback(\n (value, options) => {\n if (typeof validate === 'function') {\n return validate(value, { ...options, required })\n }\n },\n [validate, required],\n )\n\n const {\n customComponents: { AfterInput, BeforeInput, Description, Error, Label } = {},\n disabled,\n path,\n setValue,\n showError,\n value,\n } = useField<string>({\n potentiallyStalePath: pathFromProps,\n validate: memoizedValidate,\n })\n\n const timezonePath = path + '_tz'\n const timezoneField = useFormFields(([fields, _]) => fields?.[timezonePath])\n\n const supportedTimezones = useMemo(() => {\n if (timezone && typeof timezone === 'object' && timezone.supportedTimezones) {\n return timezone.supportedTimezones\n }\n\n return config.admin.timezones.supportedTimezones\n }, [config.admin.timezones.supportedTimezones, timezone])\n\n /**\n * Date appearance doesn't include timestamps,\n * which means we need to pin the time to always 12:00 for the selected date\n */\n const isDateOnly = ['dayOnly', 'default', 'monthOnly'].includes(pickerAppearance)\n const selectedTimezone = timezoneField?.value as string\n const timezoneRequired =\n required || (timezone && typeof timezone === 'object' && timezone.required)\n\n // The displayed value should be the original value, adjusted to the user's timezone\n const displayedValue = useMemo(() => {\n if (timezone && selectedTimezone && userTimezone && value) {\n // Create TZDate instances for the selected timezone and the user's timezone\n // These instances allow us to transpose the date between timezones while keeping the same time value\n const DateWithOriginalTz = TZDate.tz(selectedTimezone)\n const DateWithUserTz = TZDate.tz(userTimezone)\n\n const modifiedDate = new TZDate(value).withTimeZone(selectedTimezone)\n\n // Transpose the date to the selected timezone\n const dateWithTimezone = transpose(modifiedDate, DateWithOriginalTz)\n\n // Transpose the date to the user's timezone - this is necessary because the react-datepicker component insists on displaying the date in the user's timezone\n const dateWithUserTimezone = transpose(dateWithTimezone, DateWithUserTz)\n\n return dateWithUserTimezone.toISOString()\n }\n\n return value\n }, [timezone, selectedTimezone, value, userTimezone])\n\n const styles = useMemo(() => mergeFieldStyles(field), [field])\n\n const onChange = useCallback(\n (incomingDate: Date) => {\n if (!(readOnly || disabled)) {\n if (timezone && selectedTimezone && incomingDate) {\n // Create TZDate instances for the selected timezone\n const TZDateWithSelectedTz = TZDate.tz(selectedTimezone)\n\n if (isDateOnly) {\n // We need to offset this hardcoded hour offset from the DatePicker elemenent\n // this can be removed in 4.0 when we remove the hardcoded offset as it is a breaking change\n // const tzOffset = incomingDate.getTimezoneOffset() / 60\n const incomingOffset = incomingDate.getTimezoneOffset() / 60\n const originalHour = incomingDate.getHours() + incomingOffset\n incomingDate.setHours(originalHour)\n\n // Convert the original date as picked into the desired timezone.\n const dateToSelectedTz = transpose(incomingDate, TZDateWithSelectedTz)\n\n setValue(dateToSelectedTz.toISOString() || null)\n } else {\n // Creates a TZDate instance for the user's timezone — this is default behaviour of TZDate as it wraps the Date constructor\n const dateToUserTz = new TZDate(incomingDate)\n // Transpose the date to the selected timezone\n const dateWithTimezone = transpose(dateToUserTz, TZDateWithSelectedTz)\n\n setValue(dateWithTimezone.toISOString() || null)\n }\n } else {\n setValue(incomingDate?.toISOString() || null)\n }\n }\n },\n [readOnly, disabled, timezone, selectedTimezone, isDateOnly, setValue],\n )\n\n const onChangeTimezone = useCallback(\n (timezone: string) => {\n if (timezonePath) {\n dispatchFields({\n type: 'UPDATE',\n path: timezonePath,\n value: timezone,\n })\n\n setModified(true)\n }\n },\n [dispatchFields, setModified, timezonePath],\n )\n\n return (\n <div\n className={[\n fieldBaseClass,\n baseClass,\n className,\n showError && `${baseClass}--has-error`,\n (readOnly || disabled) && 'read-only',\n ]\n .filter(Boolean)\n .join(' ')}\n style={styles}\n >\n <RenderCustomComponent\n CustomComponent={Label}\n Fallback={\n <FieldLabel label={label} localized={localized} path={path} required={required} />\n }\n />\n <div className={`${fieldBaseClass}__wrap`} id={`field-${path.replace(/\\./g, '__')}`}>\n <RenderCustomComponent\n CustomComponent={Error}\n Fallback={<FieldError path={path} showError={showError} />}\n />\n {BeforeInput}\n <DatePickerField\n {...datePickerProps}\n onChange={onChange}\n overrides={{\n ...datePickerProps?.overrides,\n }}\n placeholder={getTranslation(placeholder, i18n)}\n readOnly={readOnly || disabled}\n value={displayedValue}\n />\n {timezone && supportedTimezones.length > 0 && (\n <TimezonePicker\n id={`${path}-timezone-picker`}\n onChange={onChangeTimezone}\n options={supportedTimezones}\n readOnly={readOnly || disabled}\n required={timezoneRequired}\n selectedTimezone={selectedTimezone}\n />\n )}\n {AfterInput}\n </div>\n <RenderCustomComponent\n CustomComponent={Description}\n Fallback={<FieldDescription description={description} path={path} />}\n />\n </div>\n )\n}\n\nexport const DateTimeField = withCondition(DateTimeFieldComponent)\n"],"mappings":"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","ignoreList":[]}
@@ -1,5 +1,4 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { fieldSchemasToFormState } from './index.js';
1
+ import fieldSchemasToFormState from './index.js';
3
2
  describe('Form - fieldSchemasToFormState', () => {
4
3
  const defaultValue = 'Default';
5
4
  it('populates default value - normal fields', async () => {
@@ -10,7 +9,6 @@ describe('Form - fieldSchemasToFormState', () => {
10
9
  label: 'Text'
11
10
  }];
12
11
  const state = await fieldSchemasToFormState({
13
- req: {},
14
12
  fields: fieldSchema
15
13
  });
16
14
  expect(state.text.value).toBe(defaultValue);
@@ -27,7 +25,6 @@ describe('Form - fieldSchemasToFormState', () => {
27
25
  label: 'Text'
28
26
  }];
29
27
  const state = await fieldSchemasToFormState({
30
- req: {},
31
28
  data,
32
29
  fields: fieldSchema
33
30
  });
@@ -53,10 +50,6 @@ describe('Form - fieldSchemasToFormState', () => {
53
50
  label: 'Text'
54
51
  }];
55
52
  const state = await fieldSchemasToFormState({
56
- req: {
57
- locale: 'en',
58
- user: {}
59
- },
60
53
  fields: fieldSchema,
61
54
  locale,
62
55
  user
@@ -1 +1 @@
1
- {"version":3,"file":"fieldSchemasToFormState.spec.js","names":["describe","it","expect","fieldSchemasToFormState","defaultValue","fieldSchema","name","type","label","state","req","fields","text","value","toBe","data","user","email","locale","args"],"sources":["../../../src/forms/fieldSchemasToFormState/fieldSchemasToFormState.spec.js"],"sourcesContent":["import { describe, it, expect } from 'vitest'\nimport { fieldSchemasToFormState } from './index.js'\n\ndescribe('Form - fieldSchemasToFormState', () => {\n const defaultValue = 'Default'\n it('populates default value - normal fields', async () => {\n const fieldSchema = [\n {\n name: 'text',\n type: 'text',\n defaultValue,\n label: 'Text',\n },\n ]\n const state = await fieldSchemasToFormState({ req: {}, fields: fieldSchema })\n expect(state.text.value).toBe(defaultValue)\n })\n it('field value overrides defaultValue - normal fields', async () => {\n const value = 'value'\n const data = { text: value }\n const fieldSchema = [\n {\n name: 'text',\n type: 'text',\n defaultValue,\n label: 'Text',\n },\n ]\n const state = await fieldSchemasToFormState({ req: {}, data, fields: fieldSchema })\n expect(state.text.value).toBe(value)\n })\n it('populates default value from a function - normal fields', async () => {\n const user = { email: 'user@example.com' }\n const locale = 'en'\n const fieldSchema = [\n {\n name: 'text',\n type: 'text',\n defaultValue: (args) => {\n if (!args.locale) {\n return 'missing locale'\n }\n if (!args.user) {\n return 'missing user'\n }\n return 'Default'\n },\n label: 'Text',\n },\n ]\n const state = await fieldSchemasToFormState({\n req: { locale: 'en', user: {} },\n fields: fieldSchema,\n locale,\n user,\n })\n expect(state.text.value).toBe(defaultValue)\n })\n})\n"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,EAAE,EAAEC,MAAM,QAAQ;AACrC,SAASC,uBAAuB,QAAQ;AAExCH,QAAA,CAAS,kCAAkC;EACzC,MAAMI,YAAA,GAAe;EACrBH,EAAA,CAAG,2CAA2C;IAC5C,MAAMI,WAAA,GAAc,CAClB;MACEC,IAAA,EAAM;MACNC,IAAA,EAAM;MACNH,YAAA;MACAI,KAAA,EAAO;IACT,EACD;IACD,MAAMC,KAAA,GAAQ,MAAMN,uBAAA,CAAwB;MAAEO,GAAA,EAAK,CAAC;MAAGC,MAAA,EAAQN;IAAY;IAC3EH,MAAA,CAAOO,KAAA,CAAMG,IAAI,CAACC,KAAK,EAAEC,IAAI,CAACV,YAAA;EAChC;EACAH,EAAA,CAAG,sDAAsD;IACvD,MAAMY,KAAA,GAAQ;IACd,MAAME,IAAA,GAAO;MAAEH,IAAA,EAAMC;IAAM;IAC3B,MAAMR,WAAA,GAAc,CAClB;MACEC,IAAA,EAAM;MACNC,IAAA,EAAM;MACNH,YAAA;MACAI,KAAA,EAAO;IACT,EACD;IACD,MAAMC,KAAA,GAAQ,MAAMN,uBAAA,CAAwB;MAAEO,GAAA,EAAK,CAAC;MAAGK,IAAA;MAAMJ,MAAA,EAAQN;IAAY;IACjFH,MAAA,CAAOO,KAAA,CAAMG,IAAI,CAACC,KAAK,EAAEC,IAAI,CAACD,KAAA;EAChC;EACAZ,EAAA,CAAG,2DAA2D;IAC5D,MAAMe,IAAA,GAAO;MAAEC,KAAA,EAAO;IAAmB;IACzC,MAAMC,MAAA,GAAS;IACf,MAAMb,WAAA,GAAc,CAClB;MACEC,IAAA,EAAM;MACNC,IAAA,EAAM;MACNH,YAAA,EAAee,IAAA;QACb,IAAI,CAACA,IAAA,CAAKD,MAAM,EAAE;UAChB,OAAO;QACT;QACA,IAAI,CAACC,IAAA,CAAKH,IAAI,EAAE;UACd,OAAO;QACT;QACA,OAAO;MACT;MACAR,KAAA,EAAO;IACT,EACD;IACD,MAAMC,KAAA,GAAQ,MAAMN,uBAAA,CAAwB;MAC1CO,GAAA,EAAK;QAAEQ,MAAA,EAAQ;QAAMF,IAAA,EAAM,CAAC;MAAE;MAC9BL,MAAA,EAAQN,WAAA;MACRa,MAAA;MACAF;IACF;IACAd,MAAA,CAAOO,KAAA,CAAMG,IAAI,CAACC,KAAK,EAAEC,IAAI,CAACV,YAAA;EAChC;AACF","ignoreList":[]}
1
+ {"version":3,"file":"fieldSchemasToFormState.spec.js","names":["fieldSchemasToFormState","describe","defaultValue","it","fieldSchema","name","type","label","state","fields","expect","text","value","toBe","data","user","email","locale","args"],"sources":["../../../src/forms/fieldSchemasToFormState/fieldSchemasToFormState.spec.js"],"sourcesContent":["import fieldSchemasToFormState from './index.js'\n\ndescribe('Form - fieldSchemasToFormState', () => {\n const defaultValue = 'Default'\n it('populates default value - normal fields', async () => {\n const fieldSchema = [\n {\n name: 'text',\n type: 'text',\n defaultValue,\n label: 'Text',\n },\n ]\n const state = await fieldSchemasToFormState({ fields: fieldSchema })\n expect(state.text.value).toBe(defaultValue)\n })\n it('field value overrides defaultValue - normal fields', async () => {\n const value = 'value'\n const data = { text: value }\n const fieldSchema = [\n {\n name: 'text',\n type: 'text',\n defaultValue,\n label: 'Text',\n },\n ]\n const state = await fieldSchemasToFormState({ data, fields: fieldSchema })\n expect(state.text.value).toBe(value)\n })\n it('populates default value from a function - normal fields', async () => {\n const user = { email: 'user@example.com' }\n const locale = 'en'\n const fieldSchema = [\n {\n name: 'text',\n type: 'text',\n defaultValue: (args) => {\n if (!args.locale) {\n return 'missing locale'\n }\n if (!args.user) {\n return 'missing user'\n }\n return 'Default'\n },\n label: 'Text',\n },\n ]\n const state = await fieldSchemasToFormState({ fields: fieldSchema, locale, user })\n expect(state.text.value).toBe(defaultValue)\n })\n})\n"],"mappings":"AAAA,OAAOA,uBAAA,MAA6B;AAEpCC,QAAA,CAAS,kCAAkC;EACzC,MAAMC,YAAA,GAAe;EACrBC,EAAA,CAAG,2CAA2C;IAC5C,MAAMC,WAAA,GAAc,CAClB;MACEC,IAAA,EAAM;MACNC,IAAA,EAAM;MACNJ,YAAA;MACAK,KAAA,EAAO;IACT,EACD;IACD,MAAMC,KAAA,GAAQ,MAAMR,uBAAA,CAAwB;MAAES,MAAA,EAAQL;IAAY;IAClEM,MAAA,CAAOF,KAAA,CAAMG,IAAI,CAACC,KAAK,EAAEC,IAAI,CAACX,YAAA;EAChC;EACAC,EAAA,CAAG,sDAAsD;IACvD,MAAMS,KAAA,GAAQ;IACd,MAAME,IAAA,GAAO;MAAEH,IAAA,EAAMC;IAAM;IAC3B,MAAMR,WAAA,GAAc,CAClB;MACEC,IAAA,EAAM;MACNC,IAAA,EAAM;MACNJ,YAAA;MACAK,KAAA,EAAO;IACT,EACD;IACD,MAAMC,KAAA,GAAQ,MAAMR,uBAAA,CAAwB;MAAEc,IAAA;MAAML,MAAA,EAAQL;IAAY;IACxEM,MAAA,CAAOF,KAAA,CAAMG,IAAI,CAACC,KAAK,EAAEC,IAAI,CAACD,KAAA;EAChC;EACAT,EAAA,CAAG,2DAA2D;IAC5D,MAAMY,IAAA,GAAO;MAAEC,KAAA,EAAO;IAAmB;IACzC,MAAMC,MAAA,GAAS;IACf,MAAMb,WAAA,GAAc,CAClB;MACEC,IAAA,EAAM;MACNC,IAAA,EAAM;MACNJ,YAAA,EAAegB,IAAA;QACb,IAAI,CAACA,IAAA,CAAKD,MAAM,EAAE;UAChB,OAAO;QACT;QACA,IAAI,CAACC,IAAA,CAAKH,IAAI,EAAE;UACd,OAAO;QACT;QACA,OAAO;MACT;MACAR,KAAA,EAAO;IACT,EACD;IACD,MAAMC,KAAA,GAAQ,MAAMR,uBAAA,CAAwB;MAAES,MAAA,EAAQL,WAAA;MAAaa,MAAA;MAAQF;IAAK;IAChFL,MAAA,CAAOF,KAAA,CAAMG,IAAI,CAACC,KAAK,EAAEC,IAAI,CAACX,YAAA;EAChC;AACF","ignoreList":[]}
@@ -2,7 +2,11 @@
2
2
  * A hook for managing state that can be controlled by props but also overridden locally.
3
3
  * Props always take precedence if they change, but local state can override them temporarily.
4
4
  *
5
+ * @param propValue - The controlled value from props
6
+ * @param fallbackValue - Value to use when propValue is null or undefined
7
+ *
5
8
  * @internal - may change or be removed without a major version bump
6
9
  */
7
- export declare function useControllableState<T>(propValue: T, defaultValue?: T): [T, (value: ((prev: T) => T) | T) => void];
10
+ export declare function useControllableState<T, D>(propValue: T, fallbackValue: D): [T extends NonNullable<T> ? T : D | NonNullable<T>, (value: ((prev: T) => T) | T) => void];
11
+ export declare function useControllableState<T>(propValue: T): [T, (value: ((prev: T) => T) | T) => void];
8
12
  //# sourceMappingURL=useControllableState.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useControllableState.d.ts","sourceRoot":"","sources":["../../src/hooks/useControllableState.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,SAAS,EAAE,CAAC,EACZ,YAAY,CAAC,EAAE,CAAC,GACf,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAkB5C"}
1
+ {"version":3,"file":"useControllableState.d.ts","sourceRoot":"","sources":["../../src/hooks/useControllableState.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,CAAC,EACvC,SAAS,EAAE,CAAC,EACZ,aAAa,EAAE,CAAC,GACf,CAAC,CAAC,SAAS,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAA;AAC7F,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAA"}
@@ -1,16 +1,10 @@
1
1
  'use client';
2
2
 
3
3
  import { c as _c } from "react/compiler-runtime";
4
- import { useCallback, useEffect, useRef, useState } from 'react';
5
- /**
6
- * A hook for managing state that can be controlled by props but also overridden locally.
7
- * Props always take precedence if they change, but local state can override them temporarily.
8
- *
9
- * @internal - may change or be removed without a major version bump
10
- */
11
- export function useControllableState(propValue, defaultValue) {
12
- const $ = _c(6);
13
- const [localValue, setLocalValue] = useState(propValue ?? defaultValue);
4
+ import { useEffect, useRef, useState } from 'react';
5
+ export function useControllableState(propValue, fallbackValue) {
6
+ const $ = _c(5);
7
+ const [localValue, setLocalValue] = useState(propValue);
14
8
  const initialRenderRef = useRef(true);
15
9
  let t0;
16
10
  let t1;
@@ -31,23 +25,14 @@ export function useControllableState(propValue, defaultValue) {
31
25
  t1 = $[2];
32
26
  }
33
27
  useEffect(t0, t1);
34
- let t2;
35
- if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
36
- t2 = value => {
37
- setLocalValue(value);
38
- };
39
- $[3] = t2;
40
- } else {
41
- t2 = $[3];
42
- }
43
- const setValue = t2;
28
+ const t2 = localValue ?? fallbackValue;
44
29
  let t3;
45
- if ($[4] !== localValue) {
46
- t3 = [localValue, setValue];
47
- $[4] = localValue;
48
- $[5] = t3;
30
+ if ($[3] !== t2) {
31
+ t3 = [t2, setLocalValue];
32
+ $[3] = t2;
33
+ $[4] = t3;
49
34
  } else {
50
- t3 = $[5];
35
+ t3 = $[4];
51
36
  }
52
37
  return t3;
53
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useControllableState.js","names":["c","_c","useCallback","useEffect","useRef","useState","useControllableState","propValue","defaultValue","$","localValue","setLocalValue","initialRenderRef","t0","t1","current","t2","Symbol","for","value","setValue","t3"],"sources":["../../src/hooks/useControllableState.ts"],"sourcesContent":["'use client'\nimport { useCallback, useEffect, useRef, useState } from 'react'\n\n/**\n * A hook for managing state that can be controlled by props but also overridden locally.\n * Props always take precedence if they change, but local state can override them temporarily.\n *\n * @internal - may change or be removed without a major version bump\n */\nexport function useControllableState<T>(\n propValue: T,\n defaultValue?: T,\n): [T, (value: ((prev: T) => T) | T) => void] {\n const [localValue, setLocalValue] = useState<T>(propValue ?? defaultValue)\n const initialRenderRef = useRef(true)\n\n useEffect(() => {\n if (initialRenderRef.current) {\n initialRenderRef.current = false\n return\n }\n\n setLocalValue(propValue)\n }, [propValue])\n\n const setValue = useCallback((value: ((prev: T) => T) | T) => {\n setLocalValue(value)\n }, [])\n\n return [localValue, setValue]\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;AACA,SAASC,WAAW,EAAEC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ;AAEzD;;;;;;AAMA,OAAO,SAAAC,qBAAAC,SAAA,EAAAC,YAAA;EAAA,MAAAC,CAAA,GAAAR,EAAA;EAIL,OAAAS,UAAA,EAAAC,aAAA,IAAoCN,QAAA,CAAYE,SAAA,IAAaC,YAAA;EAC7D,MAAAI,gBAAA,GAAyBR,MAAA,KAAO;EAAA,IAAAS,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAL,CAAA,QAAAF,SAAA;IAEtBM,EAAA,GAAAA,CAAA;MAAA,IACJD,gBAAA,CAAAG,OAAA;QACFH,gBAAA,CAAAG,OAAA;QAAA;MAAA;MAIFJ,aAAA,CAAcJ,SAAA;IAAA;IACbO,EAAA,IAACP,SAAA;IAAUE,CAAA,MAAAF,SAAA;IAAAE,CAAA,MAAAI,EAAA;IAAAJ,CAAA,MAAAK,EAAA;EAAA;IAAAD,EAAA,GAAAJ,CAAA;IAAAK,EAAA,GAAAL,CAAA;EAAA;EAPdN,SAAA,CAAUU,EAOV,EAAGC,EAAW;EAAA,IAAAE,EAAA;EAAA,IAAAP,CAAA,QAAAQ,MAAA,CAAAC,GAAA;IAEeF,EAAA,GAAAG,KAAA;MAC3BR,aAAA,CAAcQ,KAAA;IAAA;IAChBV,CAAA,MAAAO,EAAA;EAAA;IAAAA,EAAA,GAAAP,CAAA;EAAA;EAFA,MAAAW,QAAA,GAAiBJ,EAEZ;EAAA,IAAAK,EAAA;EAAA,IAAAZ,CAAA,QAAAC,UAAA;IAEEW,EAAA,IAACX,UAAA,EAAYU,QAAA;IAASX,CAAA,MAAAC,UAAA;IAAAD,CAAA,MAAAY,EAAA;EAAA;IAAAA,EAAA,GAAAZ,CAAA;EAAA;EAAA,OAAtBY,EAAsB;AAAA","ignoreList":[]}
1
+ {"version":3,"file":"useControllableState.js","names":["c","_c","useEffect","useRef","useState","useControllableState","propValue","fallbackValue","$","localValue","setLocalValue","initialRenderRef","t0","t1","current","t2","t3"],"sources":["../../src/hooks/useControllableState.ts"],"sourcesContent":["'use client'\nimport { useEffect, useRef, useState } from 'react'\n\n/**\n * A hook for managing state that can be controlled by props but also overridden locally.\n * Props always take precedence if they change, but local state can override them temporarily.\n *\n * @param propValue - The controlled value from props\n * @param fallbackValue - Value to use when propValue is null or undefined\n *\n * @internal - may change or be removed without a major version bump\n */\nexport function useControllableState<T, D>(\n propValue: T,\n fallbackValue: D,\n): [T extends NonNullable<T> ? T : D | NonNullable<T>, (value: ((prev: T) => T) | T) => void]\nexport function useControllableState<T>(propValue: T): [T, (value: ((prev: T) => T) | T) => void]\nexport function useControllableState<T, D>(\n propValue: T,\n fallbackValue?: D,\n): [T extends NonNullable<T> ? T : D | NonNullable<T>, (value: ((prev: T) => T) | T) => void] {\n const [localValue, setLocalValue] = useState<T>(propValue)\n const initialRenderRef = useRef(true)\n\n useEffect(() => {\n if (initialRenderRef.current) {\n initialRenderRef.current = false\n return\n }\n\n setLocalValue(propValue)\n }, [propValue])\n\n return [localValue ?? fallbackValue, setLocalValue] as [\n T extends NonNullable<T> ? T : D | NonNullable<T>,\n (value: ((prev: T) => T) | T) => void,\n ]\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;AACA,SAASC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ;AAgB5C,OAAO,SAAAC,qBAAAC,SAAA,EAAAC,aAAA;EAAA,MAAAC,CAAA,GAAAP,EAAA;EAIL,OAAAQ,UAAA,EAAAC,aAAA,IAAoCN,QAAA,CAAYE,SAAA;EAChD,MAAAK,gBAAA,GAAyBR,MAAA,KAAO;EAAA,IAAAS,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAL,CAAA,QAAAF,SAAA;IAEtBM,EAAA,GAAAA,CAAA;MAAA,IACJD,gBAAA,CAAAG,OAAA;QACFH,gBAAA,CAAAG,OAAA;QAAA;MAAA;MAIFJ,aAAA,CAAcJ,SAAA;IAAA;IACbO,EAAA,IAACP,SAAA;IAAUE,CAAA,MAAAF,SAAA;IAAAE,CAAA,MAAAI,EAAA;IAAAJ,CAAA,MAAAK,EAAA;EAAA;IAAAD,EAAA,GAAAJ,CAAA;IAAAK,EAAA,GAAAL,CAAA;EAAA;EAPdN,SAAA,CAAUU,EAOV,EAAGC,EAAW;EAEN,MAAAE,EAAA,GAAAN,UAAA,IAAcF,aAAA;EAAA,IAAAS,EAAA;EAAA,IAAAR,CAAA,QAAAO,EAAA;IAAfC,EAAA,IAACD,EAAc,EAAeL,aAAA;IAAcF,CAAA,MAAAO,EAAA;IAAAP,CAAA,MAAAQ,EAAA;EAAA;IAAAA,EAAA,GAAAR,CAAA;EAAA;EAAA,OAA5CQ,EAA4C;AAAA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/Config/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,sBAAsB,EACtB,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,UAAU,EACX,MAAM,SAAS,CAAA;AAEhB,OAAO,KAAgF,MAAM,OAAO,CAAA;AAEpG,KAAK,iBAAiB,GAAG;IAGvB,CAAC,IAAI,EAAE;QAAE,cAAc,EAAE,EAAE,GAAG,cAAc,CAAC;QAAC,UAAU,CAAC,EAAE,KAAK,CAAA;KAAE,GAAG,sBAAsB,CAAA;IAI3F,CAAC,IAAI,EAAE;QAAE,cAAc,CAAC,EAAE,KAAK,CAAC;QAAC,UAAU,EAAE,EAAE,GAAG,UAAU,CAAA;KAAE,GAAG,kBAAkB,CAAA;IAGnF,CAAC,IAAI,EAAE;QACL,cAAc,CAAC,EAAE,EAAE,GAAG,cAAc,CAAA;QACpC,UAAU,CAAC,EAAE,EAAE,GAAG,UAAU,CAAA;KAC7B,GAAG,sBAAsB,GAAG,kBAAkB,GAAG,IAAI,CAAA;CACvD,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,YAAY,CAAA;IACpB;;;;OAIG;IACH,eAAe,EAAE,iBAAiB,CAAA;IAClC,SAAS,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAA;CAC1C,CAAA;AAID,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IAClC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;CAC9B,CAqDA,CAAA;AAED,eAAO,MAAM,SAAS,QAAO,mBAA6C,CAAA;AAE1E;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IAClC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;CAC9B,CAyBA,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/Config/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,sBAAsB,EACtB,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,UAAU,EACX,MAAM,SAAS,CAAA;AAEhB,OAAO,KAA8D,MAAM,OAAO,CAAA;AAIlF,KAAK,iBAAiB,GAAG;IAGvB,CAAC,IAAI,EAAE;QAAE,cAAc,EAAE,EAAE,GAAG,cAAc,CAAC;QAAC,UAAU,CAAC,EAAE,KAAK,CAAA;KAAE,GAAG,sBAAsB,CAAA;IAI3F,CAAC,IAAI,EAAE;QAAE,cAAc,CAAC,EAAE,KAAK,CAAC;QAAC,UAAU,EAAE,EAAE,GAAG,UAAU,CAAA;KAAE,GAAG,kBAAkB,CAAA;IAGnF,CAAC,IAAI,EAAE;QACL,cAAc,CAAC,EAAE,EAAE,GAAG,cAAc,CAAA;QACpC,UAAU,CAAC,EAAE,EAAE,GAAG,UAAU,CAAA;KAC7B,GAAG,sBAAsB,GAAG,kBAAkB,GAAG,IAAI,CAAA;CACvD,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,YAAY,CAAA;IACpB;;;;OAIG;IACH,eAAe,EAAE,iBAAiB,CAAA;IAClC,SAAS,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAA;CAC1C,CAAA;AAID,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IAClC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;CAC9B,CA2CA,CAAA;AAED,eAAO,MAAM,SAAS,QAAO,mBAA6C,CAAA;AAE1E;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IAClC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;CAC9B,CAyBA,CAAA"}
@@ -3,23 +3,17 @@
3
3
 
4
4
  import { c as _c } from "react/compiler-runtime";
5
5
  import { jsx as _jsx } from "react/jsx-runtime";
6
- import React, { createContext, use, useCallback, useEffect, useMemo, useRef, useState } from 'react';
6
+ import React, { createContext, use, useCallback, useEffect, useMemo } from 'react';
7
+ import { useControllableState } from '../../hooks/useControllableState.js';
7
8
  const RootConfigContext = /*#__PURE__*/createContext(undefined);
8
9
  export const ConfigProvider = ({
9
10
  children,
10
11
  config: configFromProps
11
12
  }) => {
12
- const [config, setConfig] = useState(configFromProps);
13
- const isFirstRenderRef = useRef(true);
14
13
  // Need to update local config state if config from props changes, for HMR.
15
14
  // That way, config changes will be updated in the UI immediately without needing a refresh.
16
- useEffect(() => {
17
- if (isFirstRenderRef.current) {
18
- isFirstRenderRef.current = false;
19
- return;
20
- }
21
- setConfig(configFromProps);
22
- }, [configFromProps, setConfig]);
15
+ // useControllableState handles this for us.
16
+ const [config, setConfig] = useControllableState(configFromProps);
23
17
  // Build lookup maps for collections and globals so we can do O(1) lookups by slug
24
18
  const {
25
19
  collectionsBySlug: collectionsBySlug_0,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["c","_c","React","createContext","use","useCallback","useEffect","useMemo","useRef","useState","RootConfigContext","undefined","ConfigProvider","children","config","configFromProps","setConfig","isFirstRenderRef","current","collectionsBySlug","globalsBySlug","collection","collections","slug","global","globals","getEntityConfig","args","collectionSlug","globalSlug","value","_jsx","useConfig","PageConfigProvider","t0","$","rootConfig","setRootConfig","t1","t2","unauthenticated","t3"],"sources":["../../../src/providers/Config/index.tsx"],"sourcesContent":["/* eslint-disable perfectionist/sort-object-types */ // Need to disable this rule because the order of the overloads is important\n'use client'\nimport type {\n ClientCollectionConfig,\n ClientConfig,\n ClientGlobalConfig,\n CollectionSlug,\n GlobalSlug,\n} from 'payload'\n\nimport React, { createContext, use, useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\ntype GetEntityConfigFn = {\n // Overload #1: collectionSlug only\n // @todo remove \"{} |\" in 4.0, which would be a breaking change\n (args: { collectionSlug: {} | CollectionSlug; globalSlug?: never }): ClientCollectionConfig\n\n // Overload #2: globalSlug only\n // @todo remove \"{} |\" in 4.0, which would be a breaking change\n (args: { collectionSlug?: never; globalSlug: {} | GlobalSlug }): ClientGlobalConfig\n\n // Overload #3: both/none (fall back to union | null)\n (args: {\n collectionSlug?: {} | CollectionSlug\n globalSlug?: {} | GlobalSlug\n }): ClientCollectionConfig | ClientGlobalConfig | null\n}\n\nexport type ClientConfigContext = {\n config: ClientConfig\n /**\n * Get a collection or global config by its slug. This is preferred over\n * using `config.collections.find` or `config.globals.find`, because\n * getEntityConfig uses a lookup map for O(1) lookups.\n */\n getEntityConfig: GetEntityConfigFn\n setConfig: (config: ClientConfig) => void\n}\n\nconst RootConfigContext = createContext<ClientConfigContext | undefined>(undefined)\n\nexport const ConfigProvider: React.FC<{\n readonly children: React.ReactNode\n readonly config: ClientConfig\n}> = ({ children, config: configFromProps }) => {\n const [config, setConfig] = useState<ClientConfig>(configFromProps)\n\n const isFirstRenderRef = useRef(true)\n\n // Need to update local config state if config from props changes, for HMR.\n // That way, config changes will be updated in the UI immediately without needing a refresh.\n useEffect(() => {\n if (isFirstRenderRef.current) {\n isFirstRenderRef.current = false\n return\n }\n\n setConfig(configFromProps)\n }, [configFromProps, setConfig])\n\n // Build lookup maps for collections and globals so we can do O(1) lookups by slug\n const { collectionsBySlug, globalsBySlug } = useMemo(() => {\n const collectionsBySlug: Record<string, ClientCollectionConfig> = {}\n const globalsBySlug: Record<string, ClientGlobalConfig> = {}\n\n for (const collection of config.collections) {\n collectionsBySlug[collection.slug] = collection\n }\n\n for (const global of config.globals) {\n globalsBySlug[global.slug] = global\n }\n\n return { collectionsBySlug, globalsBySlug }\n }, [config])\n\n const getEntityConfig = useCallback<GetEntityConfigFn>(\n (args) => {\n if ('collectionSlug' in args) {\n return collectionsBySlug[args.collectionSlug] ?? null\n }\n\n if ('globalSlug' in args) {\n return globalsBySlug[args.globalSlug] ?? null\n }\n\n return null as any\n },\n [collectionsBySlug, globalsBySlug],\n )\n\n const value = useMemo(\n () => ({ config, getEntityConfig, setConfig }),\n [config, getEntityConfig, setConfig],\n )\n\n return <RootConfigContext value={value}>{children}</RootConfigContext>\n}\n\nexport const useConfig = (): ClientConfigContext => use(RootConfigContext)\n\n/**\n * This provider shadows the `ConfigProvider` on the _page_ level, allowing us to\n * update the config when needed, e.g. after authentication.\n * The layout `ConfigProvider` is not updated on page navigation / authentication,\n * as the layout does not re-render in those cases.\n *\n * If the config here has the same reference as the config from the layout, we\n * simply reuse the context from the layout to avoid unnecessary re-renders.\n *\n * @experimental This component is experimental and may change or be removed in future releases. Use at your own risk.\n */\nexport const PageConfigProvider: React.FC<{\n readonly children: React.ReactNode\n readonly config: ClientConfig\n}> = ({ children, config: configFromProps }) => {\n const { config: rootConfig, setConfig: setRootConfig } = useConfig()\n\n /**\n * This `useEffect` is required in order for the _page_ to be able to refresh the client config,\n * which may have been cached on the _layout_ level, where the `ConfigProvider` is managed.\n * Since the layout does not re-render on page navigation / authentication, we need to manually\n * update the config, as the user may have been authenticated in the process, which affects the client config.\n */\n useEffect(() => {\n setRootConfig(configFromProps)\n }, [configFromProps, setRootConfig])\n\n // If this component receives a different config than what is in context from the layout, it is stale.\n // While stale, we instantiate a new context provider that provides the new config until the root context is updated.\n // Unfortunately, referential equality alone does not work bc the reference is lost during server/client serialization,\n // so we need to also compare the `unauthenticated` property.\n if (\n rootConfig !== configFromProps &&\n rootConfig.unauthenticated !== configFromProps.unauthenticated\n ) {\n return <ConfigProvider config={configFromProps}>{children}</ConfigProvider>\n }\n\n return children\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["c","_c","React","createContext","use","useCallback","useEffect","useMemo","useControllableState","RootConfigContext","undefined","ConfigProvider","children","config","configFromProps","setConfig","collectionsBySlug","globalsBySlug","collection","collections","slug","global","globals","getEntityConfig","args","collectionSlug","globalSlug","value","_jsx","useConfig","PageConfigProvider","t0","$","rootConfig","setRootConfig","t1","t2","unauthenticated","t3"],"sources":["../../../src/providers/Config/index.tsx"],"sourcesContent":["/* eslint-disable perfectionist/sort-object-types */ // Need to disable this rule because the order of the overloads is important\n'use client'\nimport type {\n ClientCollectionConfig,\n ClientConfig,\n ClientGlobalConfig,\n CollectionSlug,\n GlobalSlug,\n} from 'payload'\n\nimport React, { createContext, use, useCallback, useEffect, useMemo } from 'react'\n\nimport { useControllableState } from '../../hooks/useControllableState.js'\n\ntype GetEntityConfigFn = {\n // Overload #1: collectionSlug only\n // @todo remove \"{} |\" in 4.0, which would be a breaking change\n (args: { collectionSlug: {} | CollectionSlug; globalSlug?: never }): ClientCollectionConfig\n\n // Overload #2: globalSlug only\n // @todo remove \"{} |\" in 4.0, which would be a breaking change\n (args: { collectionSlug?: never; globalSlug: {} | GlobalSlug }): ClientGlobalConfig\n\n // Overload #3: both/none (fall back to union | null)\n (args: {\n collectionSlug?: {} | CollectionSlug\n globalSlug?: {} | GlobalSlug\n }): ClientCollectionConfig | ClientGlobalConfig | null\n}\n\nexport type ClientConfigContext = {\n config: ClientConfig\n /**\n * Get a collection or global config by its slug. This is preferred over\n * using `config.collections.find` or `config.globals.find`, because\n * getEntityConfig uses a lookup map for O(1) lookups.\n */\n getEntityConfig: GetEntityConfigFn\n setConfig: (config: ClientConfig) => void\n}\n\nconst RootConfigContext = createContext<ClientConfigContext | undefined>(undefined)\n\nexport const ConfigProvider: React.FC<{\n readonly children: React.ReactNode\n readonly config: ClientConfig\n}> = ({ children, config: configFromProps }) => {\n // Need to update local config state if config from props changes, for HMR.\n // That way, config changes will be updated in the UI immediately without needing a refresh.\n // useControllableState handles this for us.\n const [config, setConfig] = useControllableState<ClientConfig>(configFromProps)\n\n // Build lookup maps for collections and globals so we can do O(1) lookups by slug\n const { collectionsBySlug, globalsBySlug } = useMemo(() => {\n const collectionsBySlug: Record<string, ClientCollectionConfig> = {}\n const globalsBySlug: Record<string, ClientGlobalConfig> = {}\n\n for (const collection of config.collections) {\n collectionsBySlug[collection.slug] = collection\n }\n\n for (const global of config.globals) {\n globalsBySlug[global.slug] = global\n }\n\n return { collectionsBySlug, globalsBySlug }\n }, [config])\n\n const getEntityConfig = useCallback<GetEntityConfigFn>(\n (args) => {\n if ('collectionSlug' in args) {\n return collectionsBySlug[args.collectionSlug] ?? null\n }\n\n if ('globalSlug' in args) {\n return globalsBySlug[args.globalSlug] ?? null\n }\n\n return null as any\n },\n [collectionsBySlug, globalsBySlug],\n )\n\n const value = useMemo(\n () => ({ config, getEntityConfig, setConfig }),\n [config, getEntityConfig, setConfig],\n )\n\n return <RootConfigContext value={value}>{children}</RootConfigContext>\n}\n\nexport const useConfig = (): ClientConfigContext => use(RootConfigContext)\n\n/**\n * This provider shadows the `ConfigProvider` on the _page_ level, allowing us to\n * update the config when needed, e.g. after authentication.\n * The layout `ConfigProvider` is not updated on page navigation / authentication,\n * as the layout does not re-render in those cases.\n *\n * If the config here has the same reference as the config from the layout, we\n * simply reuse the context from the layout to avoid unnecessary re-renders.\n *\n * @experimental This component is experimental and may change or be removed in future releases. Use at your own risk.\n */\nexport const PageConfigProvider: React.FC<{\n readonly children: React.ReactNode\n readonly config: ClientConfig\n}> = ({ children, config: configFromProps }) => {\n const { config: rootConfig, setConfig: setRootConfig } = useConfig()\n\n /**\n * This `useEffect` is required in order for the _page_ to be able to refresh the client config,\n * which may have been cached on the _layout_ level, where the `ConfigProvider` is managed.\n * Since the layout does not re-render on page navigation / authentication, we need to manually\n * update the config, as the user may have been authenticated in the process, which affects the client config.\n */\n useEffect(() => {\n setRootConfig(configFromProps)\n }, [configFromProps, setRootConfig])\n\n // If this component receives a different config than what is in context from the layout, it is stale.\n // While stale, we instantiate a new context provider that provides the new config until the root context is updated.\n // Unfortunately, referential equality alone does not work bc the reference is lost during server/client serialization,\n // so we need to also compare the `unauthenticated` property.\n if (\n rootConfig !== configFromProps &&\n rootConfig.unauthenticated !== configFromProps.unauthenticated\n ) {\n return <ConfigProvider config={configFromProps}>{children}</ConfigProvider>\n }\n\n return children\n}\n"],"mappings":"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","ignoreList":[]}