@herca/rn-kit 0.1.63 → 0.1.65
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 +8 -0
- package/lib/module/DatePicker/DatePicker.js +2 -2
- package/lib/module/DatePicker/DatePicker.js.map +1 -1
- package/lib/module/Input/InputDate.js +170 -0
- package/lib/module/Input/InputDate.js.map +1 -0
- package/lib/module/Input/README_INPUT_DATE.md +265 -0
- package/lib/module/Modal/Modal.js +24 -22
- package/lib/module/Modal/Modal.js.map +1 -1
- package/lib/module/Ui/README_VIEWINSETS.md +126 -0
- package/lib/module/Ui/ViewInsets.js +33 -0
- package/lib/module/Ui/ViewInsets.js.map +1 -0
- package/lib/module/function/README_DATE_FORMATTER.md +397 -0
- package/lib/module/function/dateFormatter.js +38 -0
- package/lib/module/function/dateFormatter.js.map +1 -0
- package/lib/module/index.js +3 -0
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/src/Calendar/CalendarPropsType.d.ts +5 -0
- package/lib/typescript/src/Calendar/CalendarPropsType.d.ts.map +1 -1
- package/lib/typescript/src/Input/InputDate.d.ts +27 -0
- package/lib/typescript/src/Input/InputDate.d.ts.map +1 -0
- package/lib/typescript/src/Modal/Modal.d.ts.map +1 -1
- package/lib/typescript/src/Ui/ViewInsets.d.ts +13 -0
- package/lib/typescript/src/Ui/ViewInsets.d.ts.map +1 -0
- package/lib/typescript/src/function/dateFormatter.d.ts +14 -0
- package/lib/typescript/src/function/dateFormatter.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +4 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/Calendar/CalendarPropsType.tsx +6 -0
- package/src/DatePicker/DatePicker.tsx +2 -2
- package/src/Input/InputDate.tsx +216 -0
- package/src/Input/README_INPUT_DATE.md +265 -0
- package/src/Modal/Modal.tsx +31 -46
- package/src/Ui/README_VIEWINSETS.md +126 -0
- package/src/Ui/ViewInsets.tsx +46 -0
- package/src/function/README_DATE_FORMATTER.md +397 -0
- package/src/function/dateFormatter.ts +54 -0
- package/src/index.tsx +8 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InputDate.d.ts","sourceRoot":"","sources":["../../../../src/Input/InputDate.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EAGV,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACpB,MAAM,eAAe,CAAC;AAMvB,KAAK,eAAe,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,UAAU,CAAC,CAAC;AAC/D,KAAK,8BAA8B,GAAG,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;AAExE,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,8BAA8B,CAAC;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAC/C,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACxB;AAED,KAAK,eAAe,GAAG,SAAS,GAAG;IACjC,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,kBAAkB,CAAC,EAAE,KAAK,CAAC;CAC5B,CAAC;AAEF,KAAK,cAAc,GAAG,SAAS,GAAG;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,kBAAkB,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG,eAAe,GAAG,cAAc,CAAC;AAErD,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAChC,KAAK,EACL,WAA8B,EAC9B,kBAAqC,EACrC,eAAe,EACf,KAAK,EACL,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,IAAe,EACf,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,2CAwIP"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../../../src/Modal/Modal.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../../../src/Modal/Modal.tsx"],"names":[],"mappings":"AACA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAChE,OAAO,EAML,KAAK,cAAc,EAGnB,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAEtB,UAAU,eAAe;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACrC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB;AAED,QAAA,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CA4FzC,CAAC;AA0CF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type ViewProps } from 'react-native';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
interface ViewInsetsProps extends ViewProps {
|
|
4
|
+
children: React.ReactNode;
|
|
5
|
+
useTop?: boolean;
|
|
6
|
+
useBottom?: boolean;
|
|
7
|
+
useLeft?: boolean;
|
|
8
|
+
useRight?: boolean;
|
|
9
|
+
bottomType?: 'inset' | 'tabbar';
|
|
10
|
+
}
|
|
11
|
+
declare const ViewInsets: React.FC<ViewInsetsProps>;
|
|
12
|
+
export default ViewInsets;
|
|
13
|
+
//# sourceMappingURL=ViewInsets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ViewInsets.d.ts","sourceRoot":"","sources":["../../../../src/Ui/ViewInsets.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,KAAkB,MAAM,OAAO,CAAC;AAGvC,UAAU,eAAgB,SAAQ,SAAS;IACzC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CACjC;AAED,QAAA,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CA8BzC,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { DateProps } from '../Calendar/CalendarPropsType';
|
|
2
|
+
interface DateFormatterProps {
|
|
3
|
+
date: Date | DateProps;
|
|
4
|
+
options?: {
|
|
5
|
+
useTime?: boolean;
|
|
6
|
+
useWeekDay?: boolean;
|
|
7
|
+
monthFormat?: Intl.DateTimeFormatOptions['month'];
|
|
8
|
+
language?: 'en' | 'id';
|
|
9
|
+
format?: 'default' | 'iso' | 'localized';
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export declare const dateFormatter: ({ date, options }: DateFormatterProps) => string;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=dateFormatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dateFormatter.d.ts","sourceRoot":"","sources":["../../../../src/function/dateFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE/D,UAAU,kBAAkB;IAC1B,IAAI,EAAE,IAAI,GAAG,SAAS,CAAC;IACvB,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,WAAW,CAAC,EAAE,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAClD,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;QACvB,MAAM,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,WAAW,CAAC;KAC1C,CAAC;CACH;AAED,eAAO,MAAM,aAAa,GAAI,mBAAmB,kBAAkB,WAwClE,CAAC"}
|
|
@@ -50,7 +50,7 @@ export { default as Provider } from './Provider/Provider';
|
|
|
50
50
|
export { default as useFooter } from './Provider/Provider';
|
|
51
51
|
export { default as Drawing } from './Drawing/Drawing';
|
|
52
52
|
export { default as Calendar } from './Calendar/Calendar';
|
|
53
|
-
export type { DateRangeProps } from './Calendar/CalendarPropsType';
|
|
53
|
+
export type { DateRangeProps, DateProps, CalendarModeType, } from './Calendar/CalendarPropsType';
|
|
54
54
|
export { default as DatePicker } from './DatePicker/DatePicker';
|
|
55
55
|
export { default as YearPicker } from './DatePicker/YearPicker';
|
|
56
56
|
export { default as MonthPicker } from './DatePicker/MonthPicker';
|
|
@@ -70,4 +70,7 @@ export { default as BadgeIcon } from './BadgeIcon/BadgeIcon';
|
|
|
70
70
|
export { default as PdfView } from './FileView/PdfView';
|
|
71
71
|
export { default as InputSelect } from './Input/InputSelect';
|
|
72
72
|
export type { ChipValue } from './Chip/type';
|
|
73
|
+
export { default as InputDate } from './Input/InputDate';
|
|
74
|
+
export { dateFormatter } from './function/dateFormatter';
|
|
75
|
+
export { default as ViewInsets } from './Ui/ViewInsets';
|
|
73
76
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -17,6 +17,12 @@ export type DateRangeProps = {
|
|
|
17
17
|
date?: DateProps;
|
|
18
18
|
};
|
|
19
19
|
|
|
20
|
+
export type FormattedDateRangeProps = {
|
|
21
|
+
startDate?: string;
|
|
22
|
+
endDate?: string;
|
|
23
|
+
date?: string;
|
|
24
|
+
};
|
|
25
|
+
|
|
20
26
|
export type CalendarDisabledProp = {
|
|
21
27
|
backgroundColor?: string | undefined;
|
|
22
28
|
textColor?: string | undefined;
|
|
@@ -44,9 +44,9 @@ export default function DatePicker({
|
|
|
44
44
|
date: null,
|
|
45
45
|
});
|
|
46
46
|
|
|
47
|
-
const handleOnChangeCalendar = useCallback((
|
|
47
|
+
const handleOnChangeCalendar = useCallback((val: DateRangeProps) => {
|
|
48
48
|
setMarkDates({});
|
|
49
|
-
setValueDatepicker(
|
|
49
|
+
setValueDatepicker(val);
|
|
50
50
|
setErrorValidate(false);
|
|
51
51
|
}, []);
|
|
52
52
|
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Color,
|
|
3
|
+
DatePicker,
|
|
4
|
+
Icon,
|
|
5
|
+
Typography,
|
|
6
|
+
type CalendarModeType,
|
|
7
|
+
type DateRangeProps,
|
|
8
|
+
} from '@herca/rn-kit';
|
|
9
|
+
import { useState } from 'react';
|
|
10
|
+
import { Pressable, StyleSheet, View } from 'react-native';
|
|
11
|
+
import type { FormattedDateRangeProps } from '../Calendar/CalendarPropsType';
|
|
12
|
+
import { dateFormatter } from '../function/dateFormatter';
|
|
13
|
+
|
|
14
|
+
type DatePickerProps = React.ComponentProps<typeof DatePicker>;
|
|
15
|
+
type DatePickerPropsWithoutOnChange = Omit<DatePickerProps, 'onChange'>;
|
|
16
|
+
|
|
17
|
+
interface BaseProps {
|
|
18
|
+
label: string;
|
|
19
|
+
placeholder: string;
|
|
20
|
+
datePickerProps?: DatePickerPropsWithoutOnChange;
|
|
21
|
+
value?: string;
|
|
22
|
+
valueDateEnd?: string;
|
|
23
|
+
onSelectClick?: () => void;
|
|
24
|
+
onDatePickerClose?: () => void;
|
|
25
|
+
onDateChange?: (value: DateRangeProps) => void;
|
|
26
|
+
mode?: CalendarModeType;
|
|
27
|
+
language?: 'en' | 'id';
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
type SingleModeProps = BaseProps & {
|
|
31
|
+
mode?: 'single';
|
|
32
|
+
placeholderDateEnd?: never;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
type RangeModeProps = BaseProps & {
|
|
36
|
+
mode: 'range';
|
|
37
|
+
placeholderDateEnd: string;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export type Props = SingleModeProps | RangeModeProps;
|
|
41
|
+
|
|
42
|
+
export default function InputDate({
|
|
43
|
+
label,
|
|
44
|
+
placeholder = 'Select here...',
|
|
45
|
+
placeholderDateEnd = 'Select here...',
|
|
46
|
+
datePickerProps,
|
|
47
|
+
value,
|
|
48
|
+
valueDateEnd,
|
|
49
|
+
onSelectClick,
|
|
50
|
+
onDatePickerClose,
|
|
51
|
+
onDateChange,
|
|
52
|
+
mode = 'single',
|
|
53
|
+
language,
|
|
54
|
+
...props
|
|
55
|
+
}: Props) {
|
|
56
|
+
const [isDatePickerOpen, setSelectOpen] = useState<boolean>(false);
|
|
57
|
+
const [dateValue, setDateValue] = useState<FormattedDateRangeProps>();
|
|
58
|
+
const [raw, setRaw] = useState<DateRangeProps>();
|
|
59
|
+
|
|
60
|
+
const handleOpenSelect = () => {
|
|
61
|
+
setSelectOpen(true);
|
|
62
|
+
onSelectClick?.();
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const handleCloseDatePicker = () => {
|
|
66
|
+
setSelectOpen(false);
|
|
67
|
+
onDatePickerClose?.();
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const handleDateChange = (val: any) => {
|
|
71
|
+
onDateChange?.({
|
|
72
|
+
date: val.date ?? null,
|
|
73
|
+
startDate: val.startDate ?? null,
|
|
74
|
+
endDate: val.endDate ?? null,
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
const formattedValue = dateFormatter({
|
|
78
|
+
date: val.date,
|
|
79
|
+
options: {
|
|
80
|
+
language,
|
|
81
|
+
format: language ? 'localized' : 'default',
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
const formattedStartDate = dateFormatter({
|
|
86
|
+
date: val.startDate,
|
|
87
|
+
options: {
|
|
88
|
+
language,
|
|
89
|
+
format: language ? 'localized' : 'default',
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
const formattedEndDate = dateFormatter({
|
|
94
|
+
date: val.endDate,
|
|
95
|
+
options: {
|
|
96
|
+
language,
|
|
97
|
+
format: language ? 'localized' : 'default',
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
setDateValue({
|
|
102
|
+
date: formattedValue,
|
|
103
|
+
startDate: formattedStartDate,
|
|
104
|
+
endDate: formattedEndDate,
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
setRaw(val);
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const startDate = () => {
|
|
111
|
+
if (!value) {
|
|
112
|
+
if (mode === 'single') {
|
|
113
|
+
return dateValue?.date;
|
|
114
|
+
} else if (mode === 'range') {
|
|
115
|
+
return dateValue?.startDate;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return value;
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
const endDate = () => {
|
|
123
|
+
if (mode === 'single') return null;
|
|
124
|
+
|
|
125
|
+
if (!valueDateEnd) {
|
|
126
|
+
return dateValue?.endDate;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return valueDateEnd;
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
const rawValue = () => {
|
|
133
|
+
if (mode === 'single') {
|
|
134
|
+
return {
|
|
135
|
+
date: datePickerProps?.value?.date ?? raw?.date,
|
|
136
|
+
};
|
|
137
|
+
} else {
|
|
138
|
+
return {
|
|
139
|
+
startDate: datePickerProps?.value?.startDate ?? raw?.startDate,
|
|
140
|
+
endDate: datePickerProps?.value?.endDate ?? raw?.endDate,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
return (
|
|
146
|
+
<View style={styles.gap4}>
|
|
147
|
+
<Typography variant="t2" weight="semibold" color={Color.gray[900]}>
|
|
148
|
+
{label}
|
|
149
|
+
</Typography>
|
|
150
|
+
|
|
151
|
+
<View style={styles.wrapper}>
|
|
152
|
+
{/* sart date */}
|
|
153
|
+
<Pressable
|
|
154
|
+
style={[styles.pickerTrigger, value !== '' && styles.hasValue]}
|
|
155
|
+
onPress={handleOpenSelect}
|
|
156
|
+
{...props}
|
|
157
|
+
>
|
|
158
|
+
<Typography variant="t2" color={Color.gray[900]} weight="medium">
|
|
159
|
+
{startDate() ?? placeholder}
|
|
160
|
+
</Typography>
|
|
161
|
+
<Icon name="ArrowDown" size={14} color={Color.gray[700]} />
|
|
162
|
+
</Pressable>
|
|
163
|
+
|
|
164
|
+
{/* end date */}
|
|
165
|
+
{mode === 'range' && (
|
|
166
|
+
<Pressable
|
|
167
|
+
style={[styles.pickerTrigger, value !== '' && styles.hasValue]}
|
|
168
|
+
onPress={handleOpenSelect}
|
|
169
|
+
{...props}
|
|
170
|
+
>
|
|
171
|
+
<Typography variant="t2" color={Color.gray[900]} weight="medium">
|
|
172
|
+
{endDate() ?? placeholderDateEnd}
|
|
173
|
+
</Typography>
|
|
174
|
+
<Icon name="ArrowDown" size={14} color={Color.gray[700]} />
|
|
175
|
+
</Pressable>
|
|
176
|
+
)}
|
|
177
|
+
</View>
|
|
178
|
+
|
|
179
|
+
<DatePicker
|
|
180
|
+
{...datePickerProps}
|
|
181
|
+
mode={mode}
|
|
182
|
+
isOpen={isDatePickerOpen}
|
|
183
|
+
onClose={handleCloseDatePicker}
|
|
184
|
+
value={rawValue()}
|
|
185
|
+
onChange={(val: DateRangeProps) => {
|
|
186
|
+
handleDateChange(val);
|
|
187
|
+
}}
|
|
188
|
+
/>
|
|
189
|
+
</View>
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const styles = StyleSheet.create({
|
|
194
|
+
gap4: {
|
|
195
|
+
gap: 4,
|
|
196
|
+
},
|
|
197
|
+
pickerTrigger: {
|
|
198
|
+
paddingVertical: 10,
|
|
199
|
+
paddingHorizontal: 12,
|
|
200
|
+
borderRadius: 8,
|
|
201
|
+
flexDirection: 'row',
|
|
202
|
+
justifyContent: 'space-between',
|
|
203
|
+
alignItems: 'center',
|
|
204
|
+
borderWidth: 1,
|
|
205
|
+
borderColor: Color.gray[200],
|
|
206
|
+
flex: 1,
|
|
207
|
+
},
|
|
208
|
+
hasValue: {
|
|
209
|
+
borderColor: Color.primary[300],
|
|
210
|
+
},
|
|
211
|
+
wrapper: {
|
|
212
|
+
flexDirection: 'row',
|
|
213
|
+
gap: 8,
|
|
214
|
+
alignItems: 'center',
|
|
215
|
+
},
|
|
216
|
+
});
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
# InputDate Component
|
|
2
|
+
|
|
3
|
+
Komponen React Native untuk input tanggal dengan dukungan mode single date dan date range. Terintegrasi dengan DatePicker dari `@herca/rn-kit` dan menyediakan UI yang user-friendly untuk pemilihan tanggal.
|
|
4
|
+
|
|
5
|
+
## Penggunaan Dasar
|
|
6
|
+
|
|
7
|
+
### Single Date Mode
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import InputDate from './InputDate';
|
|
11
|
+
|
|
12
|
+
function MyForm() {
|
|
13
|
+
const [date, setDate] = useState('');
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<InputDate
|
|
17
|
+
label="Tanggal Lahir"
|
|
18
|
+
placeholder="Pilih tanggal"
|
|
19
|
+
value={date}
|
|
20
|
+
onDateChange={(val) => setDate(val.date)}
|
|
21
|
+
/>
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Date Range Mode
|
|
27
|
+
|
|
28
|
+
```jsx
|
|
29
|
+
import InputDate from './InputDate';
|
|
30
|
+
|
|
31
|
+
function MyForm() {
|
|
32
|
+
const [startDate, setStartDate] = useState('');
|
|
33
|
+
const [endDate, setEndDate] = useState('');
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<InputDate
|
|
37
|
+
mode="range"
|
|
38
|
+
label="Periode"
|
|
39
|
+
placeholder="Tanggal mulai"
|
|
40
|
+
placeholderDateEnd="Tanggal selesai"
|
|
41
|
+
value={startDate}
|
|
42
|
+
valueDateEnd={endDate}
|
|
43
|
+
onDateChange={(val) => {
|
|
44
|
+
setStartDate(val.startDate);
|
|
45
|
+
setEndDate(val.endDate);
|
|
46
|
+
}}
|
|
47
|
+
/>
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Props
|
|
53
|
+
|
|
54
|
+
### Base Props
|
|
55
|
+
|
|
56
|
+
| Prop | Type | Default | Deskripsi |
|
|
57
|
+
| ------------------- | --------------------------------- | ------------------ | -------------------------------------------------- |
|
|
58
|
+
| `label` | `string` | **Required** | Label yang ditampilkan di atas input |
|
|
59
|
+
| `placeholder` | `string` | `"Select here..."` | Placeholder untuk tanggal pertama/single |
|
|
60
|
+
| `value` | `string` | `undefined` | Nilai tanggal terpilih (formatted) |
|
|
61
|
+
| `valueDateEnd` | `string` | `undefined` | Nilai tanggal akhir untuk mode range (formatted) |
|
|
62
|
+
| `datePickerProps` | `DatePickerPropsWithoutOnChange` | `undefined` | Props tambahan untuk DatePicker (kecuali onChange) |
|
|
63
|
+
| `onSelectClick` | `() => void` | `undefined` | Callback ketika input diklik |
|
|
64
|
+
| `onDatePickerClose` | `() => void` | `undefined` | Callback ketika DatePicker ditutup |
|
|
65
|
+
| `onDateChange` | `(value: DateRangeProps) => void` | `undefined` | Callback ketika tanggal berubah |
|
|
66
|
+
| `mode` | `'single' \| 'range'` | `'single'` | Mode pemilihan tanggal |
|
|
67
|
+
| `language` | `'en' \| 'id'` | `undefined` | Bahasa untuk format tanggal |
|
|
68
|
+
|
|
69
|
+
### Single Mode Specific Props
|
|
70
|
+
|
|
71
|
+
Ketika `mode` tidak diset atau `mode="single"`:
|
|
72
|
+
|
|
73
|
+
| Prop | Type | Deskripsi |
|
|
74
|
+
| -------------------- | ------- | ----------------------------- |
|
|
75
|
+
| `placeholderDateEnd` | `never` | Tidak tersedia di single mode |
|
|
76
|
+
|
|
77
|
+
### Range Mode Specific Props
|
|
78
|
+
|
|
79
|
+
Ketika `mode="range"`:
|
|
80
|
+
|
|
81
|
+
| Prop | Type | Deskripsi |
|
|
82
|
+
| -------------------- | -------- | ---------------------------------------------- |
|
|
83
|
+
| `placeholderDateEnd` | `string` | **Required** - Placeholder untuk tanggal akhir |
|
|
84
|
+
|
|
85
|
+
## Return Value dari onDateChange
|
|
86
|
+
|
|
87
|
+
Callback `onDateChange` menerima objek dengan struktur:
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
{
|
|
91
|
+
date: string | null; // Untuk single mode
|
|
92
|
+
startDate: string | null; // Untuk range mode (tanggal mulai)
|
|
93
|
+
endDate: string | null; // Untuk range mode (tanggal selesai)
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Contoh Penggunaan
|
|
98
|
+
|
|
99
|
+
### Single Date dengan Language
|
|
100
|
+
|
|
101
|
+
```jsx
|
|
102
|
+
<InputDate
|
|
103
|
+
label="Select Date"
|
|
104
|
+
placeholder="Choose a date"
|
|
105
|
+
mode="single"
|
|
106
|
+
language="id"
|
|
107
|
+
onDateChange={(val) => console.log(val.date)}
|
|
108
|
+
/>
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Date Range dengan Controlled Values
|
|
112
|
+
|
|
113
|
+
```jsx
|
|
114
|
+
function BookingForm() {
|
|
115
|
+
const [dateRange, setDateRange] = useState({
|
|
116
|
+
start: '',
|
|
117
|
+
end: '',
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
return (
|
|
121
|
+
<InputDate
|
|
122
|
+
mode="range"
|
|
123
|
+
label="Periode Booking"
|
|
124
|
+
placeholder="Check-in"
|
|
125
|
+
placeholderDateEnd="Check-out"
|
|
126
|
+
value={dateRange.start}
|
|
127
|
+
valueDateEnd={dateRange.end}
|
|
128
|
+
onDateChange={(val) => {
|
|
129
|
+
setDateRange({
|
|
130
|
+
start: val.startDate || '',
|
|
131
|
+
end: val.endDate || '',
|
|
132
|
+
});
|
|
133
|
+
}}
|
|
134
|
+
/>
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Dengan Custom DatePicker Props
|
|
140
|
+
|
|
141
|
+
```jsx
|
|
142
|
+
<InputDate
|
|
143
|
+
label="Tanggal Lahir"
|
|
144
|
+
placeholder="Pilih tanggal"
|
|
145
|
+
datePickerProps={{
|
|
146
|
+
minDate: new Date('1900-01-01'),
|
|
147
|
+
maxDate: new Date(),
|
|
148
|
+
value: { date: new Date() },
|
|
149
|
+
}}
|
|
150
|
+
onDateChange={(val) => console.log(val)}
|
|
151
|
+
/>
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Dengan Event Callbacks
|
|
155
|
+
|
|
156
|
+
```jsx
|
|
157
|
+
<InputDate
|
|
158
|
+
label="Appointment Date"
|
|
159
|
+
placeholder="Select date"
|
|
160
|
+
onSelectClick={() => console.log('Picker opened')}
|
|
161
|
+
onDatePickerClose={() => console.log('Picker closed')}
|
|
162
|
+
onDateChange={(val) => {
|
|
163
|
+
console.log('Date changed:', val);
|
|
164
|
+
}}
|
|
165
|
+
/>
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### English Language Format
|
|
169
|
+
|
|
170
|
+
```jsx
|
|
171
|
+
<InputDate
|
|
172
|
+
label="Birth Date"
|
|
173
|
+
placeholder="Select date"
|
|
174
|
+
language="en"
|
|
175
|
+
onDateChange={(val) => console.log(val.date)}
|
|
176
|
+
/>
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Indonesian Language Format
|
|
180
|
+
|
|
181
|
+
```jsx
|
|
182
|
+
<InputDate
|
|
183
|
+
label="Tanggal Lahir"
|
|
184
|
+
placeholder="Pilih tanggal"
|
|
185
|
+
language="id"
|
|
186
|
+
onDateChange={(val) => console.log(val.date)}
|
|
187
|
+
/>
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## Fitur
|
|
191
|
+
|
|
192
|
+
- ✅ Dua mode: Single date dan Date range
|
|
193
|
+
- ✅ Support multi-bahasa (English & Indonesian)
|
|
194
|
+
- ✅ Controlled component dengan value props
|
|
195
|
+
- ✅ Auto-formatting tanggal berdasarkan bahasa
|
|
196
|
+
- ✅ Visual feedback untuk nilai yang sudah dipilih
|
|
197
|
+
- ✅ Terintegrasi dengan DatePicker dari @herca/rn-kit
|
|
198
|
+
- ✅ TypeScript support dengan discriminated unions untuk type safety
|
|
199
|
+
- ✅ Customizable melalui datePickerProps
|
|
200
|
+
- ✅ Event callbacks untuk lifecycle DatePicker
|
|
201
|
+
|
|
202
|
+
## Styling
|
|
203
|
+
|
|
204
|
+
Komponen menggunakan styling internal dengan karakteristik:
|
|
205
|
+
|
|
206
|
+
- Border color berubah ke `primary[300]` ketika ada nilai terpilih
|
|
207
|
+
- Layout responsive dengan flexbox
|
|
208
|
+
- Gap 8px antara input start date dan end date (mode range)
|
|
209
|
+
- Border radius 8px dengan padding yang konsisten
|
|
210
|
+
- Typography menggunakan variant `t2` dari @herca/rn-kit
|
|
211
|
+
|
|
212
|
+
## State Management Internal
|
|
213
|
+
|
|
214
|
+
Komponen mengelola beberapa state internal:
|
|
215
|
+
|
|
216
|
+
- `isDatePickerOpen`: Status buka/tutup DatePicker
|
|
217
|
+
- `dateValue`: Nilai tanggal yang sudah diformat
|
|
218
|
+
- `raw`: Nilai tanggal raw dari DatePicker
|
|
219
|
+
|
|
220
|
+
State internal ini memungkinkan komponen bekerja baik sebagai controlled maupun uncontrolled component.
|
|
221
|
+
|
|
222
|
+
## TypeScript
|
|
223
|
+
|
|
224
|
+
Komponen menggunakan discriminated unions untuk type safety antara single dan range mode:
|
|
225
|
+
|
|
226
|
+
```typescript
|
|
227
|
+
type SingleModeProps = BaseProps & {
|
|
228
|
+
mode?: 'single';
|
|
229
|
+
placeholderDateEnd?: never;
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
type RangeModeProps = BaseProps & {
|
|
233
|
+
mode: 'range';
|
|
234
|
+
placeholderDateEnd: string;
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
export type Props = SingleModeProps | RangeModeProps;
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
Ini memastikan `placeholderDateEnd` hanya required ketika `mode="range"`.
|
|
241
|
+
|
|
242
|
+
## Dependencies
|
|
243
|
+
|
|
244
|
+
- `@herca/rn-kit` - Untuk komponen DatePicker, Icon, Typography, dan Color
|
|
245
|
+
- `react-native` - Core components (View, Pressable, StyleSheet)
|
|
246
|
+
|
|
247
|
+
## Best Practices
|
|
248
|
+
|
|
249
|
+
1. **Selalu provide label yang jelas** untuk accessibility
|
|
250
|
+
2. **Gunakan language prop** untuk konsistensi format tanggal di aplikasi
|
|
251
|
+
3. **Handle onDateChange** untuk update state parent component
|
|
252
|
+
4. **Gunakan controlled values** untuk form validation
|
|
253
|
+
5. **Provide meaningful placeholders** yang menjelaskan expected input
|
|
254
|
+
|
|
255
|
+
## Catatan
|
|
256
|
+
|
|
257
|
+
- Props tambahan akan diteruskan ke Pressable trigger
|
|
258
|
+
- Nilai yang dikembalikan via `onDateChange` selalu dalam format yang sudah diproses menggunakan `dateFormatter`
|
|
259
|
+
- Raw value dari DatePicker tetap tersimpan untuk keperluan internal
|
|
260
|
+
- Komponen dapat bekerja sebagai controlled maupun uncontrolled component
|
|
261
|
+
- Border color otomatis berubah ketika ada nilai terpilih untuk visual feedback
|
|
262
|
+
|
|
263
|
+
## License
|
|
264
|
+
|
|
265
|
+
MIT
|