@lets-events/react 12.7.3 → 12.8.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.
@@ -1,6 +1,6 @@
1
1
 
2
2
 
3
- > @lets-events/react@12.7.3 build
3
+ > @lets-events/react@12.8.0 build
4
4
  > tsup src/index.tsx --format esm,cjs --dts --external react
5
5
 
6
6
  CLI Building entry: src/index.tsx
@@ -10,12 +10,12 @@
10
10
  CLI Target: es6
11
11
  ESM Build start
12
12
  CJS Build start
13
- CJS dist/index.js 405.05 KB
14
- CJS ⚡️ Build success in 411ms
15
- ESM dist/index.mjs 389.96 KB
16
- ESM ⚡️ Build success in 412ms
13
+ CJS dist/index.js 409.09 KB
14
+ CJS ⚡️ Build success in 613ms
15
+ ESM dist/index.mjs 393.73 KB
16
+ ESM ⚡️ Build success in 616ms
17
17
  DTS Build start
18
- DTS ⚡️ Build success in 7518ms
19
- DTS dist/index.d.mts 403.02 KB
20
- DTS dist/index.d.ts 403.02 KB
18
+ DTS ⚡️ Build success in 11472ms
19
+ DTS dist/index.d.mts 403.74 KB
20
+ DTS dist/index.d.ts 403.74 KB
21
21
  ⠙
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @lets-events/react
2
2
 
3
+ ## 12.8.0
4
+
5
+ ### Minor Changes
6
+
7
+ - DateAndTimeFormField
8
+
3
9
  ## 12.7.3
4
10
 
5
11
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -15351,6 +15351,18 @@ type TimePickerFormFieldProps = Omit<TimePickerProps, "selected" | "setSelected"
15351
15351
  };
15352
15352
  declare const TimePickerFormField: ({ name, label, required, validate, validationErrorMessage, rules, ...timePickerProps }: TimePickerFormFieldProps) => react_jsx_runtime.JSX.Element;
15353
15353
 
15354
+ type DateAndTimeFormFieldProps = Omit<CalendarProps, "selected" | "setSelected"> & Omit<TimePickerProps, "selected" | "setSelected"> & {
15355
+ name: string;
15356
+ label?: string;
15357
+ required?: boolean;
15358
+ validate?: (value: string | undefined) => boolean | string;
15359
+ validationErrorMessage?: string;
15360
+ rules?: Omit<RegisterOptions<FieldValues, string>, "valueAsNumber" | "valueAsDate" | "setValueAs" | "disabled">;
15361
+ allowPastDates?: boolean;
15362
+ maxYearsFromNow?: number;
15363
+ };
15364
+ declare const DateAndTimeFormField: ({ name, label, required, validate, validationErrorMessage, rules, allowPastDates, maxYearsFromNow, ...props }: DateAndTimeFormFieldProps) => react_jsx_runtime.JSX.Element;
15365
+
15354
15366
  interface UploadConfig {
15355
15367
  apiUrl: string;
15356
15368
  s3Bucket: string;
@@ -15405,4 +15417,4 @@ declare const useImageUpload: (options: UseImageUploadOptions) => {
15405
15417
  reset: () => void;
15406
15418
  };
15407
15419
 
15408
- export { AddressFormFields, Alert, AlertDialogCompleteStyled, AlertDialogDescriptionStyled, AlertDialogRowStyled, AlertDialogSimpleStyled, AlertDialogSubtitleStyled, AlertDialogTitleStyled, AlertDialoghrStyled, type AlertProps, Avatar, type AvatarProps, AvatarStyled, Badge, type BadgeProps, BadgeStyled, BirthDateFormField, Box, Button, ButtonGroup, type ButtonGroupProps, ButtonGroupStyled, ButtonItem, type ButtonItemProps, ButtonItemStyled, type ButtonProps, CNPJFormField, CPFFormField, Calendar, CalendarFormField, type CalendarFormFieldProps, type CalendarProps, Card, type CardProps, CardStyled, CheckboxGroup, CheckboxGroupFormField, type CheckboxGroupFormFieldProps, type CheckboxGroupProps, CheckboxGroupStyled, CheckboxItem, type CheckboxItemProps, Container, type ContainerProps, ContainerStyled, CountryFormField, type DateRange, Divider, DoubleCalendar, DoubleCalendarFormField, type DoubleCalendarFormFieldProps, type DoubleCalendarProps, Drawer, type DrawerProps, DropdownMenu, DropdownMenuItem, type DropdownMenuItemProps, type DropdownMenuProps, EmailFormField, type EmailFormFieldProps, ErrorFormMessage, type ErrorFormMessageProps, Filter, FilterItem, type FilterItemProps, type FilterProps, Flex, type FlexProps, FlexStyled, Form, FormLabel, type FormLabelProps, type FormProps, Grid, type GridProps, GridStyled, Icon, type IconProps, IdentityDocumentNumberFormField, InputStyled, MenuDropdown, type MenuDropdownProps, Modal, type ModalProps, MultiSelect, MultiSelectFormField, type MultiSelectFormFieldProps, type MultiSelectProps, PhoneFormField, type PhoneFormFieldProps, RadioGroup, RadioGroupFormField, type RadioGroupFormFieldProps, type RadioGroupProps, RadioGroupStyled, RadioItem, type RadioItemProps, RichEditor, RichEditorFormField, type RichEditorFormFieldProps, type RichEditorProps, RichTextPresenter, Section, type SectionProps, SectionStyled, SelectFormField, type SelectFormFieldProps, Step, StepContent, StepList, type StepProps, StepStyled, StepTrigger, StepWrapper, Switch, SwitchFormField, type SwitchFormFieldProps, type SwitchProps, SwitchStyled, Text, TextAreaFormField, type TextAreaFormFieldProps, TextField, type TextFieldProps, TextFieldSlot, type TextFieldSlotProps, TextFieldSlotStyled, TextFieldStyled, TextFormField, type TextFormFieldProps, type TextProps, TextStyle, TextareaField, type TextareaFieldProps, TextareaFieldStyle, TimePicker, TimePickerButtonStyled, TimePickerDropdownStyled, TimePickerFooterStyled, TimePickerFormField, type TimePickerFormFieldProps, TimePickerIconButton, type TimePickerProps, TimePickerStyled, TimerPickerContentStyled, type Toast, type ToastComponentProps, type ToastConfig, type ToastContextType, ToastItem, type ToastOptions, ToastProvider, type ToastProviderProps, type ToastType, type ToasterShowOptions, Tooltip, TooltipContent, type TooltipProps, TooltipProvider, TooltipRoot, TooltipTrigger, type UploadConfig, UploadService, isValidCNPJ, maskFormat, maskUnformat, useImageUpload, useToast };
15420
+ export { AddressFormFields, Alert, AlertDialogCompleteStyled, AlertDialogDescriptionStyled, AlertDialogRowStyled, AlertDialogSimpleStyled, AlertDialogSubtitleStyled, AlertDialogTitleStyled, AlertDialoghrStyled, type AlertProps, Avatar, type AvatarProps, AvatarStyled, Badge, type BadgeProps, BadgeStyled, BirthDateFormField, Box, Button, ButtonGroup, type ButtonGroupProps, ButtonGroupStyled, ButtonItem, type ButtonItemProps, ButtonItemStyled, type ButtonProps, CNPJFormField, CPFFormField, Calendar, CalendarFormField, type CalendarFormFieldProps, type CalendarProps, Card, type CardProps, CardStyled, CheckboxGroup, CheckboxGroupFormField, type CheckboxGroupFormFieldProps, type CheckboxGroupProps, CheckboxGroupStyled, CheckboxItem, type CheckboxItemProps, Container, type ContainerProps, ContainerStyled, CountryFormField, DateAndTimeFormField, type DateAndTimeFormFieldProps, type DateRange, Divider, DoubleCalendar, DoubleCalendarFormField, type DoubleCalendarFormFieldProps, type DoubleCalendarProps, Drawer, type DrawerProps, DropdownMenu, DropdownMenuItem, type DropdownMenuItemProps, type DropdownMenuProps, EmailFormField, type EmailFormFieldProps, ErrorFormMessage, type ErrorFormMessageProps, Filter, FilterItem, type FilterItemProps, type FilterProps, Flex, type FlexProps, FlexStyled, Form, FormLabel, type FormLabelProps, type FormProps, Grid, type GridProps, GridStyled, Icon, type IconProps, IdentityDocumentNumberFormField, InputStyled, MenuDropdown, type MenuDropdownProps, Modal, type ModalProps, MultiSelect, MultiSelectFormField, type MultiSelectFormFieldProps, type MultiSelectProps, PhoneFormField, type PhoneFormFieldProps, RadioGroup, RadioGroupFormField, type RadioGroupFormFieldProps, type RadioGroupProps, RadioGroupStyled, RadioItem, type RadioItemProps, RichEditor, RichEditorFormField, type RichEditorFormFieldProps, type RichEditorProps, RichTextPresenter, Section, type SectionProps, SectionStyled, SelectFormField, type SelectFormFieldProps, Step, StepContent, StepList, type StepProps, StepStyled, StepTrigger, StepWrapper, Switch, SwitchFormField, type SwitchFormFieldProps, type SwitchProps, SwitchStyled, Text, TextAreaFormField, type TextAreaFormFieldProps, TextField, type TextFieldProps, TextFieldSlot, type TextFieldSlotProps, TextFieldSlotStyled, TextFieldStyled, TextFormField, type TextFormFieldProps, type TextProps, TextStyle, TextareaField, type TextareaFieldProps, TextareaFieldStyle, TimePicker, TimePickerButtonStyled, TimePickerDropdownStyled, TimePickerFooterStyled, TimePickerFormField, type TimePickerFormFieldProps, TimePickerIconButton, type TimePickerProps, TimePickerStyled, TimerPickerContentStyled, type Toast, type ToastComponentProps, type ToastConfig, type ToastContextType, ToastItem, type ToastOptions, ToastProvider, type ToastProviderProps, type ToastType, type ToasterShowOptions, Tooltip, TooltipContent, type TooltipProps, TooltipProvider, TooltipRoot, TooltipTrigger, type UploadConfig, UploadService, isValidCNPJ, maskFormat, maskUnformat, useImageUpload, useToast };
package/dist/index.d.ts CHANGED
@@ -15351,6 +15351,18 @@ type TimePickerFormFieldProps = Omit<TimePickerProps, "selected" | "setSelected"
15351
15351
  };
15352
15352
  declare const TimePickerFormField: ({ name, label, required, validate, validationErrorMessage, rules, ...timePickerProps }: TimePickerFormFieldProps) => react_jsx_runtime.JSX.Element;
15353
15353
 
15354
+ type DateAndTimeFormFieldProps = Omit<CalendarProps, "selected" | "setSelected"> & Omit<TimePickerProps, "selected" | "setSelected"> & {
15355
+ name: string;
15356
+ label?: string;
15357
+ required?: boolean;
15358
+ validate?: (value: string | undefined) => boolean | string;
15359
+ validationErrorMessage?: string;
15360
+ rules?: Omit<RegisterOptions<FieldValues, string>, "valueAsNumber" | "valueAsDate" | "setValueAs" | "disabled">;
15361
+ allowPastDates?: boolean;
15362
+ maxYearsFromNow?: number;
15363
+ };
15364
+ declare const DateAndTimeFormField: ({ name, label, required, validate, validationErrorMessage, rules, allowPastDates, maxYearsFromNow, ...props }: DateAndTimeFormFieldProps) => react_jsx_runtime.JSX.Element;
15365
+
15354
15366
  interface UploadConfig {
15355
15367
  apiUrl: string;
15356
15368
  s3Bucket: string;
@@ -15405,4 +15417,4 @@ declare const useImageUpload: (options: UseImageUploadOptions) => {
15405
15417
  reset: () => void;
15406
15418
  };
15407
15419
 
15408
- export { AddressFormFields, Alert, AlertDialogCompleteStyled, AlertDialogDescriptionStyled, AlertDialogRowStyled, AlertDialogSimpleStyled, AlertDialogSubtitleStyled, AlertDialogTitleStyled, AlertDialoghrStyled, type AlertProps, Avatar, type AvatarProps, AvatarStyled, Badge, type BadgeProps, BadgeStyled, BirthDateFormField, Box, Button, ButtonGroup, type ButtonGroupProps, ButtonGroupStyled, ButtonItem, type ButtonItemProps, ButtonItemStyled, type ButtonProps, CNPJFormField, CPFFormField, Calendar, CalendarFormField, type CalendarFormFieldProps, type CalendarProps, Card, type CardProps, CardStyled, CheckboxGroup, CheckboxGroupFormField, type CheckboxGroupFormFieldProps, type CheckboxGroupProps, CheckboxGroupStyled, CheckboxItem, type CheckboxItemProps, Container, type ContainerProps, ContainerStyled, CountryFormField, type DateRange, Divider, DoubleCalendar, DoubleCalendarFormField, type DoubleCalendarFormFieldProps, type DoubleCalendarProps, Drawer, type DrawerProps, DropdownMenu, DropdownMenuItem, type DropdownMenuItemProps, type DropdownMenuProps, EmailFormField, type EmailFormFieldProps, ErrorFormMessage, type ErrorFormMessageProps, Filter, FilterItem, type FilterItemProps, type FilterProps, Flex, type FlexProps, FlexStyled, Form, FormLabel, type FormLabelProps, type FormProps, Grid, type GridProps, GridStyled, Icon, type IconProps, IdentityDocumentNumberFormField, InputStyled, MenuDropdown, type MenuDropdownProps, Modal, type ModalProps, MultiSelect, MultiSelectFormField, type MultiSelectFormFieldProps, type MultiSelectProps, PhoneFormField, type PhoneFormFieldProps, RadioGroup, RadioGroupFormField, type RadioGroupFormFieldProps, type RadioGroupProps, RadioGroupStyled, RadioItem, type RadioItemProps, RichEditor, RichEditorFormField, type RichEditorFormFieldProps, type RichEditorProps, RichTextPresenter, Section, type SectionProps, SectionStyled, SelectFormField, type SelectFormFieldProps, Step, StepContent, StepList, type StepProps, StepStyled, StepTrigger, StepWrapper, Switch, SwitchFormField, type SwitchFormFieldProps, type SwitchProps, SwitchStyled, Text, TextAreaFormField, type TextAreaFormFieldProps, TextField, type TextFieldProps, TextFieldSlot, type TextFieldSlotProps, TextFieldSlotStyled, TextFieldStyled, TextFormField, type TextFormFieldProps, type TextProps, TextStyle, TextareaField, type TextareaFieldProps, TextareaFieldStyle, TimePicker, TimePickerButtonStyled, TimePickerDropdownStyled, TimePickerFooterStyled, TimePickerFormField, type TimePickerFormFieldProps, TimePickerIconButton, type TimePickerProps, TimePickerStyled, TimerPickerContentStyled, type Toast, type ToastComponentProps, type ToastConfig, type ToastContextType, ToastItem, type ToastOptions, ToastProvider, type ToastProviderProps, type ToastType, type ToasterShowOptions, Tooltip, TooltipContent, type TooltipProps, TooltipProvider, TooltipRoot, TooltipTrigger, type UploadConfig, UploadService, isValidCNPJ, maskFormat, maskUnformat, useImageUpload, useToast };
15420
+ export { AddressFormFields, Alert, AlertDialogCompleteStyled, AlertDialogDescriptionStyled, AlertDialogRowStyled, AlertDialogSimpleStyled, AlertDialogSubtitleStyled, AlertDialogTitleStyled, AlertDialoghrStyled, type AlertProps, Avatar, type AvatarProps, AvatarStyled, Badge, type BadgeProps, BadgeStyled, BirthDateFormField, Box, Button, ButtonGroup, type ButtonGroupProps, ButtonGroupStyled, ButtonItem, type ButtonItemProps, ButtonItemStyled, type ButtonProps, CNPJFormField, CPFFormField, Calendar, CalendarFormField, type CalendarFormFieldProps, type CalendarProps, Card, type CardProps, CardStyled, CheckboxGroup, CheckboxGroupFormField, type CheckboxGroupFormFieldProps, type CheckboxGroupProps, CheckboxGroupStyled, CheckboxItem, type CheckboxItemProps, Container, type ContainerProps, ContainerStyled, CountryFormField, DateAndTimeFormField, type DateAndTimeFormFieldProps, type DateRange, Divider, DoubleCalendar, DoubleCalendarFormField, type DoubleCalendarFormFieldProps, type DoubleCalendarProps, Drawer, type DrawerProps, DropdownMenu, DropdownMenuItem, type DropdownMenuItemProps, type DropdownMenuProps, EmailFormField, type EmailFormFieldProps, ErrorFormMessage, type ErrorFormMessageProps, Filter, FilterItem, type FilterItemProps, type FilterProps, Flex, type FlexProps, FlexStyled, Form, FormLabel, type FormLabelProps, type FormProps, Grid, type GridProps, GridStyled, Icon, type IconProps, IdentityDocumentNumberFormField, InputStyled, MenuDropdown, type MenuDropdownProps, Modal, type ModalProps, MultiSelect, MultiSelectFormField, type MultiSelectFormFieldProps, type MultiSelectProps, PhoneFormField, type PhoneFormFieldProps, RadioGroup, RadioGroupFormField, type RadioGroupFormFieldProps, type RadioGroupProps, RadioGroupStyled, RadioItem, type RadioItemProps, RichEditor, RichEditorFormField, type RichEditorFormFieldProps, type RichEditorProps, RichTextPresenter, Section, type SectionProps, SectionStyled, SelectFormField, type SelectFormFieldProps, Step, StepContent, StepList, type StepProps, StepStyled, StepTrigger, StepWrapper, Switch, SwitchFormField, type SwitchFormFieldProps, type SwitchProps, SwitchStyled, Text, TextAreaFormField, type TextAreaFormFieldProps, TextField, type TextFieldProps, TextFieldSlot, type TextFieldSlotProps, TextFieldSlotStyled, TextFieldStyled, TextFormField, type TextFormFieldProps, type TextProps, TextStyle, TextareaField, type TextareaFieldProps, TextareaFieldStyle, TimePicker, TimePickerButtonStyled, TimePickerDropdownStyled, TimePickerFooterStyled, TimePickerFormField, type TimePickerFormFieldProps, TimePickerIconButton, type TimePickerProps, TimePickerStyled, TimerPickerContentStyled, type Toast, type ToastComponentProps, type ToastConfig, type ToastContextType, ToastItem, type ToastOptions, ToastProvider, type ToastProviderProps, type ToastType, type ToasterShowOptions, Tooltip, TooltipContent, type TooltipProps, TooltipProvider, TooltipRoot, TooltipTrigger, type UploadConfig, UploadService, isValidCNPJ, maskFormat, maskUnformat, useImageUpload, useToast };
package/dist/index.js CHANGED
@@ -895,6 +895,7 @@ __export(index_exports, {
895
895
  Container: () => Container,
896
896
  ContainerStyled: () => ContainerStyled,
897
897
  CountryFormField: () => CountryFormField,
898
+ DateAndTimeFormField: () => DateAndTimeFormField,
898
899
  Divider: () => Divider,
899
900
  DoubleCalendar: () => DoubleCalendar,
900
901
  DoubleCalendarFormField: () => DoubleCalendarFormField,
@@ -7939,7 +7940,8 @@ var DayPickerWrapperStyled = styled("div", {
7939
7940
  },
7940
7941
  ".rdp-nav": {
7941
7942
  position: "absolute",
7942
- width: "98%",
7943
+ width: "100%",
7944
+ left: "0",
7943
7945
  display: "flex",
7944
7946
  justifyContent: "space-between"
7945
7947
  },
@@ -13250,12 +13252,133 @@ var TimePickerFormField = (_a) => {
13250
13252
  ] });
13251
13253
  };
13252
13254
 
13253
- // src/hooks/useImageUpload.ts
13255
+ // src/components/FormFields/DateAndTimeFormField.tsx
13256
+ var import_react_hook_form16 = require("react-hook-form");
13254
13257
  var import_react28 = require("react");
13258
+ var import_jsx_runtime59 = require("react/jsx-runtime");
13259
+ var DateAndTimeFormField = (_a) => {
13260
+ var _b = _a, {
13261
+ name,
13262
+ label,
13263
+ required,
13264
+ validate,
13265
+ validationErrorMessage = "Este campo \xE9 obrigat\xF3rio.",
13266
+ rules,
13267
+ allowPastDates,
13268
+ maxYearsFromNow = 20
13269
+ } = _b, props = __objRest(_b, [
13270
+ "name",
13271
+ "label",
13272
+ "required",
13273
+ "validate",
13274
+ "validationErrorMessage",
13275
+ "rules",
13276
+ "allowPastDates",
13277
+ "maxYearsFromNow"
13278
+ ]);
13279
+ const handleValidate = (0, import_react28.useCallback)(
13280
+ (value) => {
13281
+ var _a2;
13282
+ if (value === void 0 || value === null || value === "") {
13283
+ if (required) return validationErrorMessage;
13284
+ return true;
13285
+ }
13286
+ return (_a2 = validate == null ? void 0 : validate(value)) != null ? _a2 : true;
13287
+ },
13288
+ [validate, required, validationErrorMessage]
13289
+ );
13290
+ const { field, fieldState } = (0, import_react_hook_form16.useController)({
13291
+ name,
13292
+ rules: __spreadValues({
13293
+ required: required ? validationErrorMessage : false,
13294
+ validate: handleValidate
13295
+ }, rules),
13296
+ defaultValue: ""
13297
+ });
13298
+ const fieldError = fieldState.error;
13299
+ const haveError = !!fieldError;
13300
+ const errorMsg = fieldError == null ? void 0 : fieldError.message;
13301
+ const { value: isoValue, onChange: setIsoValue } = field;
13302
+ const { selectedDate, selectedTime } = (0, import_react28.useMemo)(() => {
13303
+ if (!isoValue) return { selectedDate: void 0, selectedTime: void 0 };
13304
+ try {
13305
+ const date = new Date(isoValue);
13306
+ if (isNaN(date.getTime())) {
13307
+ return { selectedDate: void 0, selectedTime: void 0 };
13308
+ }
13309
+ const hours = String(date.getHours()).padStart(2, "0");
13310
+ const minutes = String(date.getMinutes()).padStart(2, "0");
13311
+ const time = `${hours}:${minutes}`;
13312
+ return { selectedDate: date, selectedTime: time };
13313
+ } catch (e) {
13314
+ return { selectedDate: void 0, selectedTime: void 0 };
13315
+ }
13316
+ }, [isoValue]);
13317
+ const combineDateTime = (0, import_react28.useCallback)(
13318
+ (date, time) => {
13319
+ if (!date || !time) {
13320
+ setIsoValue("");
13321
+ return;
13322
+ }
13323
+ const [hours, minutes] = time.split(":").map(Number);
13324
+ const combined = new Date(date);
13325
+ combined.setHours(hours || 0, minutes || 0, 0, 0);
13326
+ setIsoValue(combined.toISOString());
13327
+ },
13328
+ [setIsoValue]
13329
+ );
13330
+ const handleDateChange = (date) => {
13331
+ combineDateTime(date, selectedTime);
13332
+ };
13333
+ const handleTimeChange = (time) => {
13334
+ combineDateTime(selectedDate, time);
13335
+ };
13336
+ return /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(Flex, { direction: "column", children: [
13337
+ label && /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13338
+ FormLabel,
13339
+ {
13340
+ name,
13341
+ label,
13342
+ required,
13343
+ haveError
13344
+ }
13345
+ ),
13346
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(Flex, { gap: 12, align: "start", children: [
13347
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(Flex, { direction: "column", children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13348
+ Calendar,
13349
+ __spreadValues({
13350
+ selected: selectedDate,
13351
+ setSelected: (date) => {
13352
+ const d = typeof date === "function" ? date(selectedDate) : date;
13353
+ handleDateChange(d);
13354
+ },
13355
+ hasError: haveError,
13356
+ allowPastDates,
13357
+ maxYearsFromNow
13358
+ }, props)
13359
+ ) }),
13360
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(Flex, { direction: "column", children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13361
+ TimePicker,
13362
+ __spreadValues({
13363
+ selected: selectedTime,
13364
+ setSelected: (value) => {
13365
+ const time = typeof value === "function" ? value(selectedTime) : value;
13366
+ handleTimeChange(time);
13367
+ },
13368
+ hasError: haveError
13369
+ }, props)
13370
+ ) })
13371
+ ] }),
13372
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(ErrorFormMessage, { message: errorMsg })
13373
+ ] });
13374
+ };
13375
+
13376
+ // src/hooks/useImageUpload.ts
13377
+ var import_react29 = require("react");
13255
13378
  var useImageUpload = (options) => {
13256
- const [isUploading, setIsUploading] = (0, import_react28.useState)(false);
13257
- const [progress, setProgress] = (0, import_react28.useState)(null);
13258
- const [error, setError] = (0, import_react28.useState)(null);
13379
+ const [isUploading, setIsUploading] = (0, import_react29.useState)(false);
13380
+ const [progress, setProgress] = (0, import_react29.useState)(null);
13381
+ const [error, setError] = (0, import_react29.useState)(null);
13259
13382
  const {
13260
13383
  onSuccess,
13261
13384
  onError,
@@ -13265,7 +13388,7 @@ var useImageUpload = (options) => {
13265
13388
  allowedTypes = ["image/jpeg", "image/png", "image/gif", "image/webp"],
13266
13389
  uploadConfig
13267
13390
  } = options;
13268
- const validateFile = (0, import_react28.useCallback)(
13391
+ const validateFile = (0, import_react29.useCallback)(
13269
13392
  (file) => {
13270
13393
  if (!allowedTypes.includes(file.type)) {
13271
13394
  const errorMsg = "Tipo de arquivo n\xE3o suportado";
@@ -13283,7 +13406,7 @@ var useImageUpload = (options) => {
13283
13406
  },
13284
13407
  [allowedTypes, maxFileSize, onError]
13285
13408
  );
13286
- const uploadFile = (0, import_react28.useCallback)(
13409
+ const uploadFile = (0, import_react29.useCallback)(
13287
13410
  (file) => __async(null, null, function* () {
13288
13411
  if (!validateFile(file)) {
13289
13412
  return null;
@@ -13336,7 +13459,7 @@ var useImageUpload = (options) => {
13336
13459
  }),
13337
13460
  [validateFile, onSuccess, onError, onProgress]
13338
13461
  );
13339
- const reset = (0, import_react28.useCallback)(() => {
13462
+ const reset = (0, import_react29.useCallback)(() => {
13340
13463
  setIsUploading(false);
13341
13464
  setProgress(null);
13342
13465
  setError(null);
@@ -13384,6 +13507,7 @@ var useImageUpload = (options) => {
13384
13507
  Container,
13385
13508
  ContainerStyled,
13386
13509
  CountryFormField,
13510
+ DateAndTimeFormField,
13387
13511
  Divider,
13388
13512
  DoubleCalendar,
13389
13513
  DoubleCalendarFormField,
package/dist/index.mjs CHANGED
@@ -7824,7 +7824,8 @@ var DayPickerWrapperStyled = styled("div", {
7824
7824
  },
7825
7825
  ".rdp-nav": {
7826
7826
  position: "absolute",
7827
- width: "98%",
7827
+ width: "100%",
7828
+ left: "0",
7828
7829
  display: "flex",
7829
7830
  justifyContent: "space-between"
7830
7831
  },
@@ -13144,8 +13145,129 @@ var TimePickerFormField = (_a) => {
13144
13145
  ] });
13145
13146
  };
13146
13147
 
13148
+ // src/components/FormFields/DateAndTimeFormField.tsx
13149
+ import { useController as useController7 } from "react-hook-form";
13150
+ import { useCallback as useCallback8, useMemo as useMemo4 } from "react";
13151
+ import { jsx as jsx59, jsxs as jsxs33 } from "react/jsx-runtime";
13152
+ var DateAndTimeFormField = (_a) => {
13153
+ var _b = _a, {
13154
+ name,
13155
+ label,
13156
+ required,
13157
+ validate,
13158
+ validationErrorMessage = "Este campo \xE9 obrigat\xF3rio.",
13159
+ rules,
13160
+ allowPastDates,
13161
+ maxYearsFromNow = 20
13162
+ } = _b, props = __objRest(_b, [
13163
+ "name",
13164
+ "label",
13165
+ "required",
13166
+ "validate",
13167
+ "validationErrorMessage",
13168
+ "rules",
13169
+ "allowPastDates",
13170
+ "maxYearsFromNow"
13171
+ ]);
13172
+ const handleValidate = useCallback8(
13173
+ (value) => {
13174
+ var _a2;
13175
+ if (value === void 0 || value === null || value === "") {
13176
+ if (required) return validationErrorMessage;
13177
+ return true;
13178
+ }
13179
+ return (_a2 = validate == null ? void 0 : validate(value)) != null ? _a2 : true;
13180
+ },
13181
+ [validate, required, validationErrorMessage]
13182
+ );
13183
+ const { field, fieldState } = useController7({
13184
+ name,
13185
+ rules: __spreadValues({
13186
+ required: required ? validationErrorMessage : false,
13187
+ validate: handleValidate
13188
+ }, rules),
13189
+ defaultValue: ""
13190
+ });
13191
+ const fieldError = fieldState.error;
13192
+ const haveError = !!fieldError;
13193
+ const errorMsg = fieldError == null ? void 0 : fieldError.message;
13194
+ const { value: isoValue, onChange: setIsoValue } = field;
13195
+ const { selectedDate, selectedTime } = useMemo4(() => {
13196
+ if (!isoValue) return { selectedDate: void 0, selectedTime: void 0 };
13197
+ try {
13198
+ const date = new Date(isoValue);
13199
+ if (isNaN(date.getTime())) {
13200
+ return { selectedDate: void 0, selectedTime: void 0 };
13201
+ }
13202
+ const hours = String(date.getHours()).padStart(2, "0");
13203
+ const minutes = String(date.getMinutes()).padStart(2, "0");
13204
+ const time = `${hours}:${minutes}`;
13205
+ return { selectedDate: date, selectedTime: time };
13206
+ } catch (e) {
13207
+ return { selectedDate: void 0, selectedTime: void 0 };
13208
+ }
13209
+ }, [isoValue]);
13210
+ const combineDateTime = useCallback8(
13211
+ (date, time) => {
13212
+ if (!date || !time) {
13213
+ setIsoValue("");
13214
+ return;
13215
+ }
13216
+ const [hours, minutes] = time.split(":").map(Number);
13217
+ const combined = new Date(date);
13218
+ combined.setHours(hours || 0, minutes || 0, 0, 0);
13219
+ setIsoValue(combined.toISOString());
13220
+ },
13221
+ [setIsoValue]
13222
+ );
13223
+ const handleDateChange = (date) => {
13224
+ combineDateTime(date, selectedTime);
13225
+ };
13226
+ const handleTimeChange = (time) => {
13227
+ combineDateTime(selectedDate, time);
13228
+ };
13229
+ return /* @__PURE__ */ jsxs33(Flex, { direction: "column", children: [
13230
+ label && /* @__PURE__ */ jsx59(
13231
+ FormLabel,
13232
+ {
13233
+ name,
13234
+ label,
13235
+ required,
13236
+ haveError
13237
+ }
13238
+ ),
13239
+ /* @__PURE__ */ jsxs33(Flex, { gap: 12, align: "start", children: [
13240
+ /* @__PURE__ */ jsx59(Flex, { direction: "column", children: /* @__PURE__ */ jsx59(
13241
+ Calendar,
13242
+ __spreadValues({
13243
+ selected: selectedDate,
13244
+ setSelected: (date) => {
13245
+ const d = typeof date === "function" ? date(selectedDate) : date;
13246
+ handleDateChange(d);
13247
+ },
13248
+ hasError: haveError,
13249
+ allowPastDates,
13250
+ maxYearsFromNow
13251
+ }, props)
13252
+ ) }),
13253
+ /* @__PURE__ */ jsx59(Flex, { direction: "column", children: /* @__PURE__ */ jsx59(
13254
+ TimePicker,
13255
+ __spreadValues({
13256
+ selected: selectedTime,
13257
+ setSelected: (value) => {
13258
+ const time = typeof value === "function" ? value(selectedTime) : value;
13259
+ handleTimeChange(time);
13260
+ },
13261
+ hasError: haveError
13262
+ }, props)
13263
+ ) })
13264
+ ] }),
13265
+ /* @__PURE__ */ jsx59(ErrorFormMessage, { message: errorMsg })
13266
+ ] });
13267
+ };
13268
+
13147
13269
  // src/hooks/useImageUpload.ts
13148
- import { useState as useState13, useCallback as useCallback8 } from "react";
13270
+ import { useState as useState13, useCallback as useCallback9 } from "react";
13149
13271
  var useImageUpload = (options) => {
13150
13272
  const [isUploading, setIsUploading] = useState13(false);
13151
13273
  const [progress, setProgress] = useState13(null);
@@ -13159,7 +13281,7 @@ var useImageUpload = (options) => {
13159
13281
  allowedTypes = ["image/jpeg", "image/png", "image/gif", "image/webp"],
13160
13282
  uploadConfig
13161
13283
  } = options;
13162
- const validateFile = useCallback8(
13284
+ const validateFile = useCallback9(
13163
13285
  (file) => {
13164
13286
  if (!allowedTypes.includes(file.type)) {
13165
13287
  const errorMsg = "Tipo de arquivo n\xE3o suportado";
@@ -13177,7 +13299,7 @@ var useImageUpload = (options) => {
13177
13299
  },
13178
13300
  [allowedTypes, maxFileSize, onError]
13179
13301
  );
13180
- const uploadFile = useCallback8(
13302
+ const uploadFile = useCallback9(
13181
13303
  (file) => __async(null, null, function* () {
13182
13304
  if (!validateFile(file)) {
13183
13305
  return null;
@@ -13230,7 +13352,7 @@ var useImageUpload = (options) => {
13230
13352
  }),
13231
13353
  [validateFile, onSuccess, onError, onProgress]
13232
13354
  );
13233
- const reset = useCallback8(() => {
13355
+ const reset = useCallback9(() => {
13234
13356
  setIsUploading(false);
13235
13357
  setProgress(null);
13236
13358
  setError(null);
@@ -13277,6 +13399,7 @@ export {
13277
13399
  Container,
13278
13400
  ContainerStyled,
13279
13401
  CountryFormField,
13402
+ DateAndTimeFormField,
13280
13403
  Divider,
13281
13404
  DoubleCalendar,
13282
13405
  DoubleCalendarFormField,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lets-events/react",
3
- "version": "12.7.3",
3
+ "version": "12.8.0",
4
4
  "description": "",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -126,7 +126,8 @@ export const DayPickerWrapperStyled = styled("div", {
126
126
  },
127
127
  ".rdp-nav": {
128
128
  position: "absolute",
129
- width: "98%",
129
+ width: "100%",
130
+ left: "0",
130
131
  display: "flex",
131
132
  justifyContent: "space-between",
132
133
  },
@@ -0,0 +1,154 @@
1
+ import { FieldValues, useController, RegisterOptions } from "react-hook-form";
2
+ import { Flex } from "../Flex";
3
+ import { FormLabel } from "./subComponents/FormLabel";
4
+ import { ErrorFormMessage } from "./subComponents/ErrorFormMessage";
5
+ import { Calendar, CalendarProps } from "../Calendar";
6
+ import { TimePicker, TimePickerProps } from "../TimePicker";
7
+ import { useCallback, useMemo } from "react";
8
+
9
+ export type DateAndTimeFormFieldProps = Omit<
10
+ CalendarProps,
11
+ "selected" | "setSelected"
12
+ > & Omit<
13
+ TimePickerProps,
14
+ "selected" | "setSelected"
15
+ > & {
16
+ name: string;
17
+ label?: string;
18
+ required?: boolean;
19
+ validate?: (value: string | undefined) => boolean | string;
20
+ validationErrorMessage?: string;
21
+ rules?: Omit<
22
+ RegisterOptions<FieldValues, string>,
23
+ "valueAsNumber" | "valueAsDate" | "setValueAs" | "disabled"
24
+ >;
25
+ allowPastDates?: boolean;
26
+ maxYearsFromNow?: number;
27
+ };
28
+
29
+ export const DateAndTimeFormField = ({
30
+ name,
31
+ label,
32
+ required,
33
+ validate,
34
+ validationErrorMessage = "Este campo é obrigatório.",
35
+ rules,
36
+ allowPastDates,
37
+ maxYearsFromNow = 20,
38
+ ...props
39
+ }: DateAndTimeFormFieldProps) => {
40
+ const handleValidate = useCallback(
41
+ (value?: string) => {
42
+ if (value === undefined || value === null || value === "") {
43
+ if (required) return validationErrorMessage;
44
+ return true;
45
+ }
46
+ return validate?.(value) ?? true;
47
+ },
48
+ [validate, required, validationErrorMessage]
49
+ );
50
+
51
+ const { field, fieldState } = useController({
52
+ name,
53
+ rules: {
54
+ required: required ? validationErrorMessage : false,
55
+ validate: handleValidate,
56
+ ...rules,
57
+ },
58
+ defaultValue: "",
59
+ });
60
+
61
+ const fieldError = fieldState.error;
62
+ const haveError = !!fieldError;
63
+ const errorMsg = fieldError?.message;
64
+
65
+ const { value: isoValue, onChange: setIsoValue } = field;
66
+
67
+ const { selectedDate, selectedTime } = useMemo(() => {
68
+ if (!isoValue) return { selectedDate: undefined, selectedTime: undefined };
69
+
70
+ try {
71
+ const date = new Date(isoValue);
72
+ if (isNaN(date.getTime())) {
73
+ return { selectedDate: undefined, selectedTime: undefined };
74
+ }
75
+
76
+ const hours = String(date.getHours()).padStart(2, "0");
77
+ const minutes = String(date.getMinutes()).padStart(2, "0");
78
+ const time = `${hours}:${minutes}`;
79
+
80
+ return { selectedDate: date, selectedTime: time };
81
+ } catch {
82
+ return { selectedDate: undefined, selectedTime: undefined };
83
+ }
84
+ }, [isoValue]);
85
+
86
+ const combineDateTime = useCallback(
87
+ (date?: Date, time?: string) => {
88
+ if (!date || !time) {
89
+ setIsoValue("");
90
+ return;
91
+ }
92
+
93
+ const [hours, minutes] = time.split(":").map(Number);
94
+ const combined = new Date(date);
95
+ combined.setHours(hours || 0, minutes || 0, 0, 0);
96
+
97
+ setIsoValue(combined.toISOString());
98
+ },
99
+ [setIsoValue]
100
+ );
101
+
102
+ const handleDateChange = (date: Date | undefined) => {
103
+ combineDateTime(date, selectedTime);
104
+ };
105
+
106
+ const handleTimeChange = (time: string | undefined) => {
107
+ combineDateTime(selectedDate, time);
108
+ };
109
+
110
+ return (
111
+ <Flex direction="column">
112
+ {label && (
113
+ <FormLabel
114
+ name={name}
115
+ label={label}
116
+ required={required}
117
+ haveError={haveError}
118
+ />
119
+ )}
120
+
121
+ <Flex gap={12} align="start">
122
+ <Flex direction="column">
123
+ <Calendar
124
+ selected={selectedDate}
125
+ setSelected={(date) => {
126
+ const d = typeof date === "function" ? date(selectedDate) : date;
127
+ handleDateChange(d);
128
+ }}
129
+ hasError={haveError}
130
+ allowPastDates={allowPastDates}
131
+ maxYearsFromNow={maxYearsFromNow}
132
+ {...(props as Omit<CalendarProps, "selected" | "setSelected">)}
133
+ />
134
+ </Flex>
135
+
136
+ <Flex direction="column">
137
+ <TimePicker
138
+ selected={selectedTime}
139
+ setSelected={(value) => {
140
+ const time = typeof value === "function" ? value(selectedTime) : value;
141
+ handleTimeChange(time);
142
+ }}
143
+ hasError={haveError}
144
+ {...(props as Omit<TimePickerProps, "selected" | "setSelected">)}
145
+ />
146
+ </Flex>
147
+ </Flex>
148
+
149
+ <ErrorFormMessage message={errorMsg} />
150
+ </Flex>
151
+ );
152
+ };
153
+
154
+ export default DateAndTimeFormField
package/src/index.tsx CHANGED
@@ -60,6 +60,7 @@ export * from "./components/FormFields/RichEditorFormField";
60
60
  export * from "./components/FormFields/CalendarFormField";
61
61
  export * from "./components/FormFields/DoubleCalendarFormField";
62
62
  export * from "./components/FormFields/TimePickerFormField";
63
+ export * from "./components/FormFields/DateAndTimeFormField";
63
64
 
64
65
  // Rich Editor
65
66
  export * from "./components/RichEditor";