@herca/rn-kit 0.1.64 → 0.1.66

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 (83) hide show
  1. package/README.md +8 -0
  2. package/lib/module/DatePicker/DatePicker.js +2 -2
  3. package/lib/module/DatePicker/DatePicker.js.map +1 -1
  4. package/lib/module/DropDown/DropDown.js +8 -6
  5. package/lib/module/DropDown/DropDown.js.map +1 -1
  6. package/lib/module/DropDown/README.md +19 -18
  7. package/lib/module/Icon/Icon.js +13 -1
  8. package/lib/module/Icon/Icon.js.map +1 -1
  9. package/lib/module/Icon/README.md +6 -0
  10. package/lib/module/Icon/icons/BriefcaseFillBulk.js +27 -0
  11. package/lib/module/Icon/icons/BriefcaseFillBulk.js.map +1 -0
  12. package/lib/module/Icon/icons/CarOutline.js +22 -0
  13. package/lib/module/Icon/icons/CarOutline.js.map +1 -0
  14. package/lib/module/Icon/icons/CommentFill.js +22 -0
  15. package/lib/module/Icon/icons/CommentFill.js.map +1 -0
  16. package/lib/module/Icon/icons/LocationPinOutline.js +21 -0
  17. package/lib/module/Icon/icons/LocationPinOutline.js.map +1 -0
  18. package/lib/module/Icon/icons/MoneyDown.js +22 -0
  19. package/lib/module/Icon/icons/MoneyDown.js.map +1 -0
  20. package/lib/module/Icon/icons/ShareUp.js +25 -0
  21. package/lib/module/Icon/icons/ShareUp.js.map +1 -0
  22. package/lib/module/Input/InputDate.js +170 -0
  23. package/lib/module/Input/InputDate.js.map +1 -0
  24. package/lib/module/Input/README_INPUT_DATE.md +265 -0
  25. package/lib/module/Ui/README_VIEWINSETS.md +126 -0
  26. package/lib/module/Ui/ViewInsets.js +33 -0
  27. package/lib/module/Ui/ViewInsets.js.map +1 -0
  28. package/lib/module/function/README_DATE_FORMATTER.md +397 -0
  29. package/lib/module/function/dateFormatter.js +38 -0
  30. package/lib/module/function/dateFormatter.js.map +1 -0
  31. package/lib/module/index.js +3 -0
  32. package/lib/module/index.js.map +1 -1
  33. package/lib/typescript/src/Calendar/CalendarPropsType.d.ts +5 -0
  34. package/lib/typescript/src/Calendar/CalendarPropsType.d.ts.map +1 -1
  35. package/lib/typescript/src/DropDown/DropDown.d.ts +1 -1
  36. package/lib/typescript/src/DropDown/DropDown.d.ts.map +1 -1
  37. package/lib/typescript/src/DropDown/type.d.ts +2 -0
  38. package/lib/typescript/src/DropDown/type.d.ts.map +1 -1
  39. package/lib/typescript/src/Icon/Icon.d.ts.map +1 -1
  40. package/lib/typescript/src/Icon/icons/BriefcaseFillBulk.d.ts +10 -0
  41. package/lib/typescript/src/Icon/icons/BriefcaseFillBulk.d.ts.map +1 -0
  42. package/lib/typescript/src/Icon/icons/CarOutline.d.ts +9 -0
  43. package/lib/typescript/src/Icon/icons/CarOutline.d.ts.map +1 -0
  44. package/lib/typescript/src/Icon/icons/CommentFill.d.ts +9 -0
  45. package/lib/typescript/src/Icon/icons/CommentFill.d.ts.map +1 -0
  46. package/lib/typescript/src/Icon/icons/LocationPinOutline.d.ts +8 -0
  47. package/lib/typescript/src/Icon/icons/LocationPinOutline.d.ts.map +1 -0
  48. package/lib/typescript/src/Icon/icons/MoneyDown.d.ts +9 -0
  49. package/lib/typescript/src/Icon/icons/MoneyDown.d.ts.map +1 -0
  50. package/lib/typescript/src/Icon/icons/ShareUp.d.ts +9 -0
  51. package/lib/typescript/src/Icon/icons/ShareUp.d.ts.map +1 -0
  52. package/lib/typescript/src/Icon/type.d.ts +1 -1
  53. package/lib/typescript/src/Icon/type.d.ts.map +1 -1
  54. package/lib/typescript/src/Input/InputDate.d.ts +27 -0
  55. package/lib/typescript/src/Input/InputDate.d.ts.map +1 -0
  56. package/lib/typescript/src/Ui/ViewInsets.d.ts +13 -0
  57. package/lib/typescript/src/Ui/ViewInsets.d.ts.map +1 -0
  58. package/lib/typescript/src/function/dateFormatter.d.ts +14 -0
  59. package/lib/typescript/src/function/dateFormatter.d.ts.map +1 -0
  60. package/lib/typescript/src/index.d.ts +4 -1
  61. package/lib/typescript/src/index.d.ts.map +1 -1
  62. package/package.json +1 -1
  63. package/src/Calendar/CalendarPropsType.tsx +6 -0
  64. package/src/DatePicker/DatePicker.tsx +2 -2
  65. package/src/DropDown/DropDown.tsx +9 -3
  66. package/src/DropDown/README.md +19 -18
  67. package/src/DropDown/type.tsx +2 -0
  68. package/src/Icon/Icon.tsx +12 -0
  69. package/src/Icon/README.md +6 -0
  70. package/src/Icon/icons/BriefcaseFillBulk.tsx +30 -0
  71. package/src/Icon/icons/CarOutline.tsx +23 -0
  72. package/src/Icon/icons/CommentFill.tsx +19 -0
  73. package/src/Icon/icons/LocationPinOutline.tsx +22 -0
  74. package/src/Icon/icons/MoneyDown.tsx +19 -0
  75. package/src/Icon/icons/ShareUp.tsx +22 -0
  76. package/src/Icon/type.tsx +6 -0
  77. package/src/Input/InputDate.tsx +216 -0
  78. package/src/Input/README_INPUT_DATE.md +265 -0
  79. package/src/Ui/README_VIEWINSETS.md +126 -0
  80. package/src/Ui/ViewInsets.tsx +46 -0
  81. package/src/function/README_DATE_FORMATTER.md +397 -0
  82. package/src/function/dateFormatter.ts +54 -0
  83. package/src/index.tsx +8 -1
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+
3
+ import { Color, DatePicker, Icon, Typography } from '@herca/rn-kit';
4
+ import { useState } from 'react';
5
+ import { Pressable, StyleSheet, View } from 'react-native';
6
+ import { dateFormatter } from "../function/dateFormatter.js";
7
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
8
+ export default function InputDate({
9
+ label,
10
+ placeholder = 'Select here...',
11
+ placeholderDateEnd = 'Select here...',
12
+ datePickerProps,
13
+ value,
14
+ valueDateEnd,
15
+ onSelectClick,
16
+ onDatePickerClose,
17
+ onDateChange,
18
+ mode = 'single',
19
+ language,
20
+ ...props
21
+ }) {
22
+ const [isDatePickerOpen, setSelectOpen] = useState(false);
23
+ const [dateValue, setDateValue] = useState();
24
+ const [raw, setRaw] = useState();
25
+ const handleOpenSelect = () => {
26
+ setSelectOpen(true);
27
+ onSelectClick?.();
28
+ };
29
+ const handleCloseDatePicker = () => {
30
+ setSelectOpen(false);
31
+ onDatePickerClose?.();
32
+ };
33
+ const handleDateChange = val => {
34
+ onDateChange?.({
35
+ date: val.date ?? null,
36
+ startDate: val.startDate ?? null,
37
+ endDate: val.endDate ?? null
38
+ });
39
+ const formattedValue = dateFormatter({
40
+ date: val.date,
41
+ options: {
42
+ language,
43
+ format: language ? 'localized' : 'default'
44
+ }
45
+ });
46
+ const formattedStartDate = dateFormatter({
47
+ date: val.startDate,
48
+ options: {
49
+ language,
50
+ format: language ? 'localized' : 'default'
51
+ }
52
+ });
53
+ const formattedEndDate = dateFormatter({
54
+ date: val.endDate,
55
+ options: {
56
+ language,
57
+ format: language ? 'localized' : 'default'
58
+ }
59
+ });
60
+ setDateValue({
61
+ date: formattedValue,
62
+ startDate: formattedStartDate,
63
+ endDate: formattedEndDate
64
+ });
65
+ setRaw(val);
66
+ };
67
+ const startDate = () => {
68
+ if (!value) {
69
+ if (mode === 'single') {
70
+ return dateValue?.date;
71
+ } else if (mode === 'range') {
72
+ return dateValue?.startDate;
73
+ }
74
+ }
75
+ return value;
76
+ };
77
+ const endDate = () => {
78
+ if (mode === 'single') return null;
79
+ if (!valueDateEnd) {
80
+ return dateValue?.endDate;
81
+ }
82
+ return valueDateEnd;
83
+ };
84
+ const rawValue = () => {
85
+ if (mode === 'single') {
86
+ return {
87
+ date: datePickerProps?.value?.date ?? raw?.date
88
+ };
89
+ } else {
90
+ return {
91
+ startDate: datePickerProps?.value?.startDate ?? raw?.startDate,
92
+ endDate: datePickerProps?.value?.endDate ?? raw?.endDate
93
+ };
94
+ }
95
+ };
96
+ return /*#__PURE__*/_jsxs(View, {
97
+ style: styles.gap4,
98
+ children: [/*#__PURE__*/_jsx(Typography, {
99
+ variant: "t2",
100
+ weight: "semibold",
101
+ color: Color.gray[900],
102
+ children: label
103
+ }), /*#__PURE__*/_jsxs(View, {
104
+ style: styles.wrapper,
105
+ children: [/*#__PURE__*/_jsxs(Pressable, {
106
+ style: [styles.pickerTrigger, value !== '' && styles.hasValue],
107
+ onPress: handleOpenSelect,
108
+ ...props,
109
+ children: [/*#__PURE__*/_jsx(Typography, {
110
+ variant: "t2",
111
+ color: Color.gray[900],
112
+ weight: "medium",
113
+ children: startDate() ?? placeholder
114
+ }), /*#__PURE__*/_jsx(Icon, {
115
+ name: "ArrowDown",
116
+ size: 14,
117
+ color: Color.gray[700]
118
+ })]
119
+ }), mode === 'range' && /*#__PURE__*/_jsxs(Pressable, {
120
+ style: [styles.pickerTrigger, value !== '' && styles.hasValue],
121
+ onPress: handleOpenSelect,
122
+ ...props,
123
+ children: [/*#__PURE__*/_jsx(Typography, {
124
+ variant: "t2",
125
+ color: Color.gray[900],
126
+ weight: "medium",
127
+ children: endDate() ?? placeholderDateEnd
128
+ }), /*#__PURE__*/_jsx(Icon, {
129
+ name: "ArrowDown",
130
+ size: 14,
131
+ color: Color.gray[700]
132
+ })]
133
+ })]
134
+ }), /*#__PURE__*/_jsx(DatePicker, {
135
+ ...datePickerProps,
136
+ mode: mode,
137
+ isOpen: isDatePickerOpen,
138
+ onClose: handleCloseDatePicker,
139
+ value: rawValue(),
140
+ onChange: val => {
141
+ handleDateChange(val);
142
+ }
143
+ })]
144
+ });
145
+ }
146
+ const styles = StyleSheet.create({
147
+ gap4: {
148
+ gap: 4
149
+ },
150
+ pickerTrigger: {
151
+ paddingVertical: 10,
152
+ paddingHorizontal: 12,
153
+ borderRadius: 8,
154
+ flexDirection: 'row',
155
+ justifyContent: 'space-between',
156
+ alignItems: 'center',
157
+ borderWidth: 1,
158
+ borderColor: Color.gray[200],
159
+ flex: 1
160
+ },
161
+ hasValue: {
162
+ borderColor: Color.primary[300]
163
+ },
164
+ wrapper: {
165
+ flexDirection: 'row',
166
+ gap: 8,
167
+ alignItems: 'center'
168
+ }
169
+ });
170
+ //# sourceMappingURL=InputDate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Color","DatePicker","Icon","Typography","useState","Pressable","StyleSheet","View","dateFormatter","jsx","_jsx","jsxs","_jsxs","InputDate","label","placeholder","placeholderDateEnd","datePickerProps","value","valueDateEnd","onSelectClick","onDatePickerClose","onDateChange","mode","language","props","isDatePickerOpen","setSelectOpen","dateValue","setDateValue","raw","setRaw","handleOpenSelect","handleCloseDatePicker","handleDateChange","val","date","startDate","endDate","formattedValue","options","format","formattedStartDate","formattedEndDate","rawValue","style","styles","gap4","children","variant","weight","color","gray","wrapper","pickerTrigger","hasValue","onPress","name","size","isOpen","onClose","onChange","create","gap","paddingVertical","paddingHorizontal","borderRadius","flexDirection","justifyContent","alignItems","borderWidth","borderColor","flex","primary"],"sourceRoot":"../../../src","sources":["Input/InputDate.tsx"],"mappings":"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","ignoreList":[]}
@@ -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
@@ -0,0 +1,126 @@
1
+ # ViewInsets Component
2
+
3
+ Komponen React Native yang menyediakan padding otomatis berdasarkan safe area insets untuk menghindari area sistem seperti notch, status bar, dan navigation bar.
4
+
5
+ ## Instalasi
6
+
7
+ Komponen ini membutuhkan dependency berikut:
8
+
9
+ ```bash
10
+ npm install react-native-safe-area-context
11
+ # atau
12
+ yarn add react-native-safe-area-context
13
+ ```
14
+
15
+ Pastikan untuk membungkus aplikasi Anda dengan `SafeAreaProvider`:
16
+
17
+ ```jsx
18
+ import { SafeAreaProvider } from 'react-native-safe-area-context';
19
+
20
+ function App() {
21
+ return <SafeAreaProvider>{/* Konten aplikasi Anda */}</SafeAreaProvider>;
22
+ }
23
+ ```
24
+
25
+ ## Penggunaan Dasar
26
+
27
+ ```jsx
28
+ import ViewInsets from './ViewInsets';
29
+
30
+ function MyScreen() {
31
+ return (
32
+ <ViewInsets useTop useBottom>
33
+ {/* Konten Anda */}
34
+ </ViewInsets>
35
+ );
36
+ }
37
+ ```
38
+
39
+ ## Props
40
+
41
+ | Prop | Type | Default | Deskripsi |
42
+ | ----------- | ---------------------- | ------------ | ------------------------------------------------------- |
43
+ | `children` | `React.ReactNode` | **Required** | Konten yang akan ditampilkan di dalam container |
44
+ | `useTop` | `boolean` | `false` | Menambahkan padding top sesuai safe area inset atas |
45
+ | `useBottom` | `boolean` | `false` | Menambahkan padding bottom sesuai safe area inset bawah |
46
+ | `useLeft` | `boolean` | `false` | Menambahkan padding left sesuai safe area inset kiri |
47
+ | `useRight` | `boolean` | `false` | Menambahkan padding right sesuai safe area inset kanan |
48
+ | `style` | `StyleProp<ViewStyle>` | `undefined` | Style tambahan untuk container |
49
+ | `...rest` | `ViewProps` | - | Props lainnya akan diteruskan ke komponen View |
50
+
51
+ ## Contoh Penggunaan
52
+
53
+ ### Layar dengan Safe Area Atas dan Bawah
54
+
55
+ ```jsx
56
+ <ViewInsets useTop useBottom>
57
+ <Text>Konten aman dari notch dan navigation bar</Text>
58
+ </ViewInsets>
59
+ ```
60
+
61
+ ### Layar dengan Safe Area Atas Saja
62
+
63
+ ```jsx
64
+ <ViewInsets useTop>
65
+ <Text>Konten aman dari status bar/notch</Text>
66
+ </ViewInsets>
67
+ ```
68
+
69
+ ### Layar dengan Safe Area di Semua Sisi
70
+
71
+ ```jsx
72
+ <ViewInsets useTop useBottom useLeft useRight>
73
+ <Text>Konten aman dari semua area sistem</Text>
74
+ </ViewInsets>
75
+ ```
76
+
77
+ ### Dengan Custom Style
78
+
79
+ ```jsx
80
+ <ViewInsets
81
+ useTop
82
+ useBottom
83
+ style={{ backgroundColor: '#fff', paddingHorizontal: 16 }}
84
+ >
85
+ <Text>Konten dengan style tambahan</Text>
86
+ </ViewInsets>
87
+ ```
88
+
89
+ ### Dengan Props View Lainnya
90
+
91
+ ```jsx
92
+ <ViewInsets useTop useBottom testID="main-container" accessible={true}>
93
+ <Text>Konten dengan props accessibility</Text>
94
+ </ViewInsets>
95
+ ```
96
+
97
+ ## Fitur
98
+
99
+ - ✅ Otomatis menangani safe area insets
100
+ - ✅ Kontrol granular untuk setiap sisi (atas, bawah, kiri, kanan)
101
+ - ✅ Performa optimal dengan `useMemo` untuk menghindari re-render tidak perlu
102
+ - ✅ Mendukung semua props dari komponen View React Native
103
+ - ✅ TypeScript support dengan type definitions lengkap
104
+ - ✅ Default `flex: 1` untuk kemudahan layout
105
+
106
+ ## Catatan
107
+
108
+ - Komponen ini secara default menggunakan `flex: 1` pada container
109
+ - Safe area insets akan disesuaikan secara otomatis berdasarkan perangkat
110
+ - Berguna untuk menghindari area yang tertutup oleh notch, status bar, home indicator, dll
111
+ - Dapat dikombinasikan dengan style custom untuk kebutuhan layout yang lebih kompleks
112
+
113
+ ## TypeScript
114
+
115
+ Komponen ini sudah dilengkapi dengan TypeScript definitions. Interface `ViewInsetsProps` extends dari `ViewProps` sehingga mendukung semua props dari View React Native.
116
+
117
+ ```typescript
118
+ interface ViewInsetsProps extends ViewProps {
119
+ children: React.ReactNode;
120
+ useTop?: boolean;
121
+ useBottom?: boolean;
122
+ useLeft?: boolean;
123
+ useRight?: boolean;
124
+ bottomType?: 'inset' | 'tabbar'; // Prop ini didefinisikan tapi belum diimplementasikan
125
+ }
126
+ ```
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+
3
+ import { StyleSheet, View } from 'react-native';
4
+ import React, { useMemo } from 'react';
5
+ import { useSafeAreaInsets } from 'react-native-safe-area-context';
6
+ import { jsx as _jsx } from "react/jsx-runtime";
7
+ const ViewInsets = ({
8
+ children,
9
+ style,
10
+ useTop = false,
11
+ useBottom = false,
12
+ useLeft = false,
13
+ useRight = false,
14
+ ...rest
15
+ }) => {
16
+ const insets = useSafeAreaInsets();
17
+ const defaultStyle = useMemo(() => StyleSheet.create({
18
+ container: {
19
+ paddingTop: useTop ? insets.top : 0,
20
+ paddingBottom: useBottom ? insets.bottom : 0,
21
+ paddingLeft: useLeft ? insets.left : 0,
22
+ paddingRight: useRight ? insets.right : 0,
23
+ flex: 1
24
+ }
25
+ }), [insets, useTop, useBottom, useLeft, useRight]);
26
+ return /*#__PURE__*/_jsx(View, {
27
+ style: [defaultStyle.container, style],
28
+ ...rest,
29
+ children: children
30
+ });
31
+ };
32
+ export default ViewInsets;
33
+ //# sourceMappingURL=ViewInsets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["StyleSheet","View","React","useMemo","useSafeAreaInsets","jsx","_jsx","ViewInsets","children","style","useTop","useBottom","useLeft","useRight","rest","insets","defaultStyle","create","container","paddingTop","top","paddingBottom","bottom","paddingLeft","left","paddingRight","right","flex"],"sourceRoot":"../../../src","sources":["Ui/ViewInsets.tsx"],"mappings":";;AAAA,SAASA,UAAU,EAAEC,IAAI,QAAwB,cAAc;AAC/D,OAAOC,KAAK,IAAIC,OAAO,QAAQ,OAAO;AACtC,SAASC,iBAAiB,QAAQ,gCAAgC;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAWnE,MAAMC,UAAqC,GAAGA,CAAC;EAC7CC,QAAQ;EACRC,KAAK;EACLC,MAAM,GAAG,KAAK;EACdC,SAAS,GAAG,KAAK;EACjBC,OAAO,GAAG,KAAK;EACfC,QAAQ,GAAG,KAAK;EAChB,GAAGC;AACL,CAAC,KAAK;EACJ,MAAMC,MAAM,GAAGX,iBAAiB,CAAC,CAAC;EAElC,MAAMY,YAAY,GAAGb,OAAO,CAC1B,MACEH,UAAU,CAACiB,MAAM,CAAC;IAChBC,SAAS,EAAE;MACTC,UAAU,EAAET,MAAM,GAAGK,MAAM,CAACK,GAAG,GAAG,CAAC;MACnCC,aAAa,EAAEV,SAAS,GAAGI,MAAM,CAACO,MAAM,GAAG,CAAC;MAC5CC,WAAW,EAAEX,OAAO,GAAGG,MAAM,CAACS,IAAI,GAAG,CAAC;MACtCC,YAAY,EAAEZ,QAAQ,GAAGE,MAAM,CAACW,KAAK,GAAG,CAAC;MACzCC,IAAI,EAAE;IACR;EACF,CAAC,CAAC,EACJ,CAACZ,MAAM,EAAEL,MAAM,EAAEC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,CAC/C,CAAC;EAED,oBACEP,IAAA,CAACL,IAAI;IAACQ,KAAK,EAAE,CAACO,YAAY,CAACE,SAAS,EAAET,KAAK,CAAE;IAAA,GAAKK,IAAI;IAAAN,QAAA,EACnDA;EAAQ,CACL,CAAC;AAEX,CAAC;AAED,eAAeD,UAAU","ignoreList":[]}