@herca/rn-kit 0.1.48 → 0.1.50

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.
@@ -7,7 +7,7 @@ import Color from "../Color/Color.js";
7
7
  import LabelForm from "../LabelForm/LabelForm.js";
8
8
  import Typography from "../Typography/Typography.js";
9
9
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
- const Input = ({
10
+ const Input = /*#__PURE__*/React.forwardRef(({
11
11
  icon,
12
12
  iconRight,
13
13
  label,
@@ -22,8 +22,9 @@ const Input = ({
22
22
  secureTextEntry = false,
23
23
  iconRightColor,
24
24
  prefix,
25
+ required = false,
25
26
  ...rest
26
- }) => {
27
+ }, ref) => {
27
28
  const [inputValue, setInputValue] = useState(value || '');
28
29
  const handleClear = () => {
29
30
  setInputValue('');
@@ -42,7 +43,8 @@ const Input = ({
42
43
  return /*#__PURE__*/_jsxs(View, {
43
44
  style: styles.gap,
44
45
  children: [label ? /*#__PURE__*/_jsx(LabelForm, {
45
- title: label
46
+ title: label,
47
+ required: required
46
48
  }) : null, /*#__PURE__*/_jsxs(View, {
47
49
  style: [styles.container, {
48
50
  borderColor: hasError ? Color.danger[500] : Color.gray[100]
@@ -60,6 +62,7 @@ const Input = ({
60
62
  children: prefix
61
63
  }), /*#__PURE__*/_jsx(TextInput, {
62
64
  ...rest,
65
+ ref: ref,
63
66
  style: [styles.input, style],
64
67
  secureTextEntry: secureTextEntry,
65
68
  value: inputValue,
@@ -92,7 +95,7 @@ const Input = ({
92
95
  children: hint
93
96
  }) : null]
94
97
  });
95
- };
98
+ });
96
99
  const styles = StyleSheet.create({
97
100
  gap: {
98
101
  gap: 4
@@ -1 +1 @@
1
- {"version":3,"names":["React","useEffect","useState","TextInput","View","StyleSheet","TouchableOpacity","Icon","Color","LabelForm","Typography","jsx","_jsx","jsxs","_jsxs","Input","icon","iconRight","label","style","value","clearButton","hasError","hint","onChangeText","onPressIconLeft","onPressIconRight","secureTextEntry","iconRightColor","prefix","rest","inputValue","setInputValue","handleClear","handleChange","text","showRightIcons","undefined","styles","gap","children","title","container","borderColor","danger","gray","onPress","hitSlop","name","size","color","prefixContainer","input","placeholderTextColor","rightContainer","mr8","variant","weight","create","position","height","borderRadius","paddingHorizontal","borderWidth","backgroundColor","base","white100","justifyContent","flexDirection","alignItems","paddingTop","paddingBottom","fontSize","flex","marginRight"],"sourceRoot":"../../../src","sources":["Input/Input.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","useEffect","useState","TextInput","View","StyleSheet","TouchableOpacity","Icon","Color","LabelForm","Typography","jsx","_jsx","jsxs","_jsxs","Input","forwardRef","icon","iconRight","label","style","value","clearButton","hasError","hint","onChangeText","onPressIconLeft","onPressIconRight","secureTextEntry","iconRightColor","prefix","required","rest","ref","inputValue","setInputValue","handleClear","handleChange","text","showRightIcons","undefined","styles","gap","children","title","container","borderColor","danger","gray","onPress","hitSlop","name","size","color","prefixContainer","input","placeholderTextColor","rightContainer","mr8","variant","weight","create","position","height","borderRadius","paddingHorizontal","borderWidth","backgroundColor","base","white100","justifyContent","flexDirection","alignItems","paddingTop","paddingBottom","fontSize","flex","marginRight"],"sourceRoot":"../../../src","sources":["Input/Input.tsx"],"mappings":"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","ignoreList":[]}
@@ -6,22 +6,23 @@ Komponen `Input` ini adalah komponen input teks yang dapat dikustomisasi dengan
6
6
 
7
7
  ## 🔧 Props
8
8
 
9
- | Prop | Tipe | Deskripsi |
10
- | ------------------ | ------------------------- | --------------------------------------------------------------------- |
11
- | `label` | `string` | Label yang ditampilkan di atas input |
12
- | `value` | `string` | Nilai dari input (kontrol dari luar) |
13
- | `onChange` | `(value: string) => void` | Fungsi yang dipanggil saat nilai berubah |
14
- | `icon` | `string` | Nama ikon (kiri) dari library `Icon` |
15
- | `iconRight` | `string` | Nama ikon kanan dari library `Icon` |
16
- | `clearButton` | `boolean` | Menampilkan tombol `x` untuk menghapus input |
17
- | `hasError` | `boolean` | Menandai input error, border akan berubah merah |
18
- | `hint` | `string` | Menampilkan teks kecil di bawah input, bisa untuk error atau petunjuk |
19
- | `onPressIconLeft` | `() => void` | Fungsi saat ikon kiri diklik |
20
- | `onPressIconRight` | `() => void` | Fungsi saat ikon kanan diklik |
21
- | `secureTextEntry` | `boolean` | Jika `true`, menyembunyikan input (untuk password) |
22
- | `style` | `ViewStyle` | Style tambahan untuk input |
23
- | `prefix` | `React.ReactNode` | Slot `react node` yang bisa diisi oleh seluruh komponen react |
24
- | `...rest` | `TextInputProps` | Props lain dari React Native `TextInput` |
9
+ | Prop | Tipe | Deskripsi |
10
+ | ------------------ | ------------------------- | ---------------------------------------------------------------------- |
11
+ | `label` | `string` | Label yang ditampilkan di atas input |
12
+ | `value` | `string` | Nilai dari input (kontrol dari luar) |
13
+ | `onChange` | `(value: string) => void` | Fungsi yang dipanggil saat nilai berubah |
14
+ | `icon` | `string` | Nama ikon (kiri) dari library `Icon` |
15
+ | `iconRight` | `string` | Nama ikon kanan dari library `Icon` |
16
+ | `clearButton` | `boolean` | Menampilkan tombol `x` untuk menghapus input |
17
+ | `hasError` | `boolean` | Menandai input error, border akan berubah merah |
18
+ | `hint` | `string` | Menampilkan teks kecil di bawah input, bisa untuk error atau petunjuk |
19
+ | `onPressIconLeft` | `() => void` | Fungsi saat ikon kiri diklik |
20
+ | `onPressIconRight` | `() => void` | Fungsi saat ikon kanan diklik |
21
+ | `secureTextEntry` | `boolean` | Jika `true`, menyembunyikan input (untuk password) |
22
+ | `style` | `ViewStyle` | Style tambahan untuk input |
23
+ | `prefix` | `React.ReactNode` | Slot `react node` yang bisa diisi oleh seluruh komponen react |
24
+ | `required` | `boolean` | Jika `true` maka akan menampilkan bintang berwarna merah setelah label |
25
+ | `...rest` | `TextInputProps` | Props lain dari React Native `TextInput` |
25
26
 
26
27
  ---
27
28
 
@@ -2,15 +2,22 @@
2
2
 
3
3
  import { View } from 'react-native';
4
4
  import Typography from "../Typography/Typography.js";
5
- import { jsx as _jsx } from "react/jsx-runtime";
5
+ import Color from "../Color/Color.js";
6
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
6
7
  export default function LabelForm({
7
- title
8
+ title,
9
+ required
8
10
  }) {
9
11
  return /*#__PURE__*/_jsx(View, {
10
- children: /*#__PURE__*/_jsx(Typography, {
12
+ children: /*#__PURE__*/_jsxs(Typography, {
11
13
  variant: "t2",
12
14
  weight: "semibold",
13
- children: title
15
+ children: [title, ' ', required && /*#__PURE__*/_jsx(Typography, {
16
+ variant: "t2",
17
+ weight: "semibold",
18
+ color: Color.danger[500],
19
+ children: "*"
20
+ })]
14
21
  })
15
22
  });
16
23
  }
@@ -1 +1 @@
1
- {"version":3,"names":["View","Typography","jsx","_jsx","LabelForm","title","children","variant","weight"],"sourceRoot":"../../../src","sources":["LabelForm/LabelForm.tsx"],"mappings":";;AAAA,SAASA,IAAI,QAAQ,cAAc;AACnC,OAAOC,UAAU,MAAM,6BAA0B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAElD,eAAe,SAASC,SAASA,CAAC;EAAEC;AAAyB,CAAC,EAAE;EAC9D,oBACEF,IAAA,CAACH,IAAI;IAAAM,QAAA,eACHH,IAAA,CAACF,UAAU;MAACM,OAAO,EAAC,IAAI;MAACC,MAAM,EAAC,UAAU;MAAAF,QAAA,EACvCD;IAAK,CACI;EAAC,CACT,CAAC;AAEX","ignoreList":[]}
1
+ {"version":3,"names":["View","Typography","Color","jsx","_jsx","jsxs","_jsxs","LabelForm","title","required","children","variant","weight","color","danger"],"sourceRoot":"../../../src","sources":["LabelForm/LabelForm.tsx"],"mappings":";;AAAA,SAASA,IAAI,QAAQ,cAAc;AACnC,OAAOC,UAAU,MAAM,6BAA0B;AACjD,OAAOC,KAAK,MAAM,mBAAgB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAOnC,eAAe,SAASC,SAASA,CAAC;EAAEC,KAAK;EAAEC;AAAgB,CAAC,EAAE;EAC5D,oBACEL,IAAA,CAACJ,IAAI;IAAAU,QAAA,eACHJ,KAAA,CAACL,UAAU;MAACU,OAAO,EAAC,IAAI;MAACC,MAAM,EAAC,UAAU;MAAAF,QAAA,GACvCF,KAAK,EAAE,GAAG,EACVC,QAAQ,iBACPL,IAAA,CAACH,UAAU;QAACU,OAAO,EAAC,IAAI;QAACC,MAAM,EAAC,UAAU;QAACC,KAAK,EAAEX,KAAK,CAACY,MAAM,CAAC,GAAG,CAAE;QAAAJ,QAAA,EAAC;MAErE,CAAY,CACb;IAAA,CACS;EAAC,CACT,CAAC;AAEX","ignoreList":[]}
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
 
3
- import { StyleSheet, SafeAreaView } from 'react-native';
4
- import { useFooter } from "./Provider.js";
5
3
  import React from 'react';
4
+ import { StyleSheet, View } from 'react-native';
6
5
  import Color from "../Color/Color.js";
6
+ import { useFooter } from "./Provider.js";
7
7
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
8
8
  export default function LayoutWithFooter({
9
9
  children
@@ -11,9 +11,9 @@ export default function LayoutWithFooter({
11
11
  const {
12
12
  footer
13
13
  } = useFooter();
14
- return /*#__PURE__*/_jsxs(SafeAreaView, {
14
+ return /*#__PURE__*/_jsxs(View, {
15
15
  style: styles.container,
16
- children: [/*#__PURE__*/_jsx(SafeAreaView, {
16
+ children: [/*#__PURE__*/_jsx(View, {
17
17
  style: [styles.content, footer && styles.footer],
18
18
  children: children
19
19
  }), footer]
@@ -1 +1 @@
1
- {"version":3,"names":["StyleSheet","SafeAreaView","useFooter","React","Color","jsx","_jsx","jsxs","_jsxs","LayoutWithFooter","children","footer","style","styles","container","content","create","flex","backgroundColor","base","white100","marginBottom"],"sourceRoot":"../../../src","sources":["Provider/LayoutWithFooter.tsx"],"mappings":";;AAAA,SAASA,UAAU,EAAEC,YAAY,QAAQ,cAAc;AACvD,SAASC,SAAS,QAAQ,eAAY;AACtC,OAAOC,KAAK,MAAM,OAAO;AACzB,OAAOC,KAAK,MAAM,mBAAgB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAEnC,eAAe,SAASC,gBAAgBA,CAAC;EACvCC;AAGF,CAAC,EAAE;EACD,MAAM;IAAEC;EAAO,CAAC,GAAGT,SAAS,CAAC,CAAC;EAE9B,oBACEM,KAAA,CAACP,YAAY;IAACW,KAAK,EAAEC,MAAM,CAACC,SAAU;IAAAJ,QAAA,gBACpCJ,IAAA,CAACL,YAAY;MAACW,KAAK,EAAE,CAACC,MAAM,CAACE,OAAO,EAAEJ,MAAM,IAAIE,MAAM,CAACF,MAAM,CAAE;MAAAD,QAAA,EAC5DA;IAAQ,CACG,CAAC,EACdC,MAAM;EAAA,CACK,CAAC;AAEnB;AAEA,MAAME,MAAM,GAAGb,UAAU,CAACgB,MAAM,CAAC;EAC/BF,SAAS,EAAE;IAAEG,IAAI,EAAE,CAAC;IAAEC,eAAe,EAAEd,KAAK,CAACe,IAAI,CAACC;EAAS,CAAC;EAC5DL,OAAO,EAAE;IAAEE,IAAI,EAAE;EAAE,CAAC;EACpBN,MAAM,EAAE;IAAEU,YAAY,EAAE;EAAG;AAC7B,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["React","StyleSheet","View","Color","useFooter","jsx","_jsx","jsxs","_jsxs","LayoutWithFooter","children","footer","style","styles","container","content","create","flex","backgroundColor","base","white100","marginBottom"],"sourceRoot":"../../../src","sources":["Provider/LayoutWithFooter.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,UAAU,EAAEC,IAAI,QAAQ,cAAc;AAC/C,OAAOC,KAAK,MAAM,mBAAgB;AAClC,SAASC,SAAS,QAAQ,eAAY;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAEvC,eAAe,SAASC,gBAAgBA,CAAC;EACvCC;AAGF,CAAC,EAAE;EACD,MAAM;IAAEC;EAAO,CAAC,GAAGP,SAAS,CAAC,CAAC;EAE9B,oBACEI,KAAA,CAACN,IAAI;IAACU,KAAK,EAAEC,MAAM,CAACC,SAAU;IAAAJ,QAAA,gBAC5BJ,IAAA,CAACJ,IAAI;MAACU,KAAK,EAAE,CAACC,MAAM,CAACE,OAAO,EAAEJ,MAAM,IAAIE,MAAM,CAACF,MAAM,CAAE;MAAAD,QAAA,EAAEA;IAAQ,CAAO,CAAC,EACxEC,MAAM;EAAA,CACH,CAAC;AAEX;AAEA,MAAME,MAAM,GAAGZ,UAAU,CAACe,MAAM,CAAC;EAC/BF,SAAS,EAAE;IAAEG,IAAI,EAAE,CAAC;IAAEC,eAAe,EAAEf,KAAK,CAACgB,IAAI,CAACC;EAAS,CAAC;EAC5DL,OAAO,EAAE;IAAEE,IAAI,EAAE;EAAE,CAAC;EACpBN,MAAM,EAAE;IAAEU,YAAY,EAAE;EAAG;AAC7B,CAAC,CAAC","ignoreList":[]}
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
+ import { TextInput } from 'react-native';
2
3
  import type { InputProps } from './type';
3
- declare const Input: React.FC<InputProps>;
4
+ declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<TextInput>>;
4
5
  export default Input;
5
6
  //# sourceMappingURL=Input.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../../../src/Input/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAMnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEzC,QAAA,MAAM,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU,CAkG/B,CAAC;AAuCF,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../../../src/Input/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,SAAS,EAAsC,MAAM,cAAc,CAAC;AAK7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEzC,QAAA,MAAM,KAAK,8EA0GV,CAAC;AAuCF,eAAe,KAAK,CAAC"}
@@ -13,6 +13,7 @@ export interface InputProps extends TextInputProps {
13
13
  secureTextEntry?: boolean;
14
14
  iconRightColor?: string;
15
15
  prefix?: React.ReactNode;
16
+ required?: boolean;
16
17
  }
17
18
  export interface TextAreaProps extends InputProps {
18
19
  height?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../../../src/Input/type.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,MAAM,WAAW,UAAW,SAAQ,cAAc;IAChD,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACxD,gBAAgB,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACzD,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B;AAED,MAAM,WAAW,aAAc,SAAQ,UAAU;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
1
+ {"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../../../src/Input/type.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,MAAM,WAAW,UAAW,SAAQ,cAAc;IAChD,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACxD,gBAAgB,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACzD,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAc,SAAQ,UAAU;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
@@ -1,4 +1,7 @@
1
- export default function LabelForm({ title }: {
1
+ interface Props {
2
2
  title: string;
3
- }): import("react/jsx-runtime").JSX.Element;
3
+ required?: boolean;
4
+ }
5
+ export default function LabelForm({ title, required }: Props): import("react/jsx-runtime").JSX.Element;
6
+ export {};
4
7
  //# sourceMappingURL=LabelForm.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LabelForm.d.ts","sourceRoot":"","sources":["../../../../src/LabelForm/LabelForm.tsx"],"names":[],"mappings":"AAGA,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,2CAQ7D"}
1
+ {"version":3,"file":"LabelForm.d.ts","sourceRoot":"","sources":["../../../../src/LabelForm/LabelForm.tsx"],"names":[],"mappings":"AAIA,UAAU,KAAK;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,KAAK,2CAa3D"}
@@ -1 +1 @@
1
- {"version":3,"file":"LayoutWithFooter.d.ts","sourceRoot":"","sources":["../../../../src/Provider/LayoutWithFooter.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EACvC,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,2CAWA"}
1
+ {"version":3,"file":"LayoutWithFooter.d.ts","sourceRoot":"","sources":["../../../../src/Provider/LayoutWithFooter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EACvC,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,2CASA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@herca/rn-kit",
3
- "version": "0.1.48",
3
+ "version": "0.1.50",
4
4
  "description": "React Native UI Kit",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",
@@ -6,105 +6,113 @@ import LabelForm from '../LabelForm/LabelForm';
6
6
  import Typography from '../Typography/Typography';
7
7
  import type { InputProps } from './type';
8
8
 
9
- const Input: React.FC<InputProps> = ({
10
- icon,
11
- iconRight,
12
- label,
13
- style,
14
- value,
15
- clearButton = false,
16
- hasError = false,
17
- hint,
18
- onChangeText,
19
- onPressIconLeft,
20
- onPressIconRight,
21
- secureTextEntry = false,
22
- iconRightColor,
23
- prefix,
24
- ...rest
25
- }) => {
26
- const [inputValue, setInputValue] = useState(value || '');
9
+ const Input = React.forwardRef<TextInput, InputProps>(
10
+ (
11
+ {
12
+ icon,
13
+ iconRight,
14
+ label,
15
+ style,
16
+ value,
17
+ clearButton = false,
18
+ hasError = false,
19
+ hint,
20
+ onChangeText,
21
+ onPressIconLeft,
22
+ onPressIconRight,
23
+ secureTextEntry = false,
24
+ iconRightColor,
25
+ prefix,
26
+ required = false,
27
+ ...rest
28
+ },
29
+ ref
30
+ ) => {
31
+ const [inputValue, setInputValue] = useState(value || '');
27
32
 
28
- const handleClear = () => {
29
- setInputValue('');
30
- onChangeText?.('');
31
- };
33
+ const handleClear = () => {
34
+ setInputValue('');
35
+ onChangeText?.('');
36
+ };
32
37
 
33
- const handleChange = (text: string) => {
34
- setInputValue(text);
35
- onChangeText?.(text);
36
- };
38
+ const handleChange = (text: string) => {
39
+ setInputValue(text);
40
+ onChangeText?.(text);
41
+ };
37
42
 
38
- const showRightIcons = (clearButton && inputValue !== '') || iconRight;
43
+ const showRightIcons = (clearButton && inputValue !== '') || iconRight;
39
44
 
40
- useEffect(() => {
41
- if (value !== undefined) {
42
- setInputValue(value);
43
- }
44
- }, [value]);
45
- return (
46
- <View style={styles.gap}>
47
- {label ? <LabelForm title={label} /> : null}
45
+ useEffect(() => {
46
+ if (value !== undefined) {
47
+ setInputValue(value);
48
+ }
49
+ }, [value]);
48
50
 
49
- <View
50
- style={[
51
- styles.container,
52
- {
53
- borderColor: hasError ? Color.danger[500] : Color.gray[100],
54
- },
55
- ]}
56
- >
57
- {icon && (
58
- <TouchableOpacity onPress={onPressIconLeft} hitSlop={10}>
59
- <Icon name={icon} size={20} color="#888" />
60
- </TouchableOpacity>
61
- )}
51
+ return (
52
+ <View style={styles.gap}>
53
+ {label ? <LabelForm title={label} required={required} /> : null}
62
54
 
63
- {prefix && <View style={styles.prefixContainer}>{prefix}</View>}
55
+ <View
56
+ style={[
57
+ styles.container,
58
+ {
59
+ borderColor: hasError ? Color.danger[500] : Color.gray[100],
60
+ },
61
+ ]}
62
+ >
63
+ {icon && (
64
+ <TouchableOpacity onPress={onPressIconLeft} hitSlop={10}>
65
+ <Icon name={icon} size={20} color="#888" />
66
+ </TouchableOpacity>
67
+ )}
68
+
69
+ {prefix && <View style={styles.prefixContainer}>{prefix}</View>}
64
70
 
65
- <TextInput
66
- {...rest}
67
- style={[styles.input, style]}
68
- secureTextEntry={secureTextEntry}
69
- value={inputValue}
70
- onChangeText={handleChange}
71
- placeholderTextColor={Color.gray[400]}
72
- />
71
+ <TextInput
72
+ {...rest}
73
+ ref={ref}
74
+ style={[styles.input, style]}
75
+ secureTextEntry={secureTextEntry}
76
+ value={inputValue}
77
+ onChangeText={handleChange}
78
+ placeholderTextColor={Color.gray[400]}
79
+ />
73
80
 
74
- {showRightIcons && (
75
- <View style={styles.rightContainer}>
76
- {clearButton && inputValue !== '' && (
77
- <TouchableOpacity
78
- onPress={handleClear}
79
- style={iconRight && styles.mr8}
80
- >
81
- <Icon name="x-circle" size={20} color="#aaa" />
82
- </TouchableOpacity>
83
- )}
84
- {iconRight && (
85
- <TouchableOpacity onPress={onPressIconRight} hitSlop={10}>
86
- <Icon
87
- name={iconRight}
88
- size={20}
89
- color={iconRightColor ?? '#888'}
90
- />
91
- </TouchableOpacity>
92
- )}
93
- </View>
94
- )}
81
+ {showRightIcons && (
82
+ <View style={styles.rightContainer}>
83
+ {clearButton && inputValue !== '' && (
84
+ <TouchableOpacity
85
+ onPress={handleClear}
86
+ style={iconRight && styles.mr8}
87
+ >
88
+ <Icon name="x-circle" size={20} color="#aaa" />
89
+ </TouchableOpacity>
90
+ )}
91
+ {iconRight && (
92
+ <TouchableOpacity onPress={onPressIconRight} hitSlop={10}>
93
+ <Icon
94
+ name={iconRight}
95
+ size={20}
96
+ color={iconRightColor ?? '#888'}
97
+ />
98
+ </TouchableOpacity>
99
+ )}
100
+ </View>
101
+ )}
102
+ </View>
103
+ {hint ? (
104
+ <Typography
105
+ color={hasError ? Color.danger[500] : Color.gray[700]}
106
+ variant="t3"
107
+ weight="medium"
108
+ >
109
+ {hint}
110
+ </Typography>
111
+ ) : null}
95
112
  </View>
96
- {hint ? (
97
- <Typography
98
- color={hasError ? Color.danger[500] : Color.gray[700]}
99
- variant="t3"
100
- weight="medium"
101
- >
102
- {hint}
103
- </Typography>
104
- ) : null}
105
- </View>
106
- );
107
- };
113
+ );
114
+ }
115
+ );
108
116
 
109
117
  const styles = StyleSheet.create({
110
118
  gap: {
@@ -6,22 +6,23 @@ Komponen `Input` ini adalah komponen input teks yang dapat dikustomisasi dengan
6
6
 
7
7
  ## 🔧 Props
8
8
 
9
- | Prop | Tipe | Deskripsi |
10
- | ------------------ | ------------------------- | --------------------------------------------------------------------- |
11
- | `label` | `string` | Label yang ditampilkan di atas input |
12
- | `value` | `string` | Nilai dari input (kontrol dari luar) |
13
- | `onChange` | `(value: string) => void` | Fungsi yang dipanggil saat nilai berubah |
14
- | `icon` | `string` | Nama ikon (kiri) dari library `Icon` |
15
- | `iconRight` | `string` | Nama ikon kanan dari library `Icon` |
16
- | `clearButton` | `boolean` | Menampilkan tombol `x` untuk menghapus input |
17
- | `hasError` | `boolean` | Menandai input error, border akan berubah merah |
18
- | `hint` | `string` | Menampilkan teks kecil di bawah input, bisa untuk error atau petunjuk |
19
- | `onPressIconLeft` | `() => void` | Fungsi saat ikon kiri diklik |
20
- | `onPressIconRight` | `() => void` | Fungsi saat ikon kanan diklik |
21
- | `secureTextEntry` | `boolean` | Jika `true`, menyembunyikan input (untuk password) |
22
- | `style` | `ViewStyle` | Style tambahan untuk input |
23
- | `prefix` | `React.ReactNode` | Slot `react node` yang bisa diisi oleh seluruh komponen react |
24
- | `...rest` | `TextInputProps` | Props lain dari React Native `TextInput` |
9
+ | Prop | Tipe | Deskripsi |
10
+ | ------------------ | ------------------------- | ---------------------------------------------------------------------- |
11
+ | `label` | `string` | Label yang ditampilkan di atas input |
12
+ | `value` | `string` | Nilai dari input (kontrol dari luar) |
13
+ | `onChange` | `(value: string) => void` | Fungsi yang dipanggil saat nilai berubah |
14
+ | `icon` | `string` | Nama ikon (kiri) dari library `Icon` |
15
+ | `iconRight` | `string` | Nama ikon kanan dari library `Icon` |
16
+ | `clearButton` | `boolean` | Menampilkan tombol `x` untuk menghapus input |
17
+ | `hasError` | `boolean` | Menandai input error, border akan berubah merah |
18
+ | `hint` | `string` | Menampilkan teks kecil di bawah input, bisa untuk error atau petunjuk |
19
+ | `onPressIconLeft` | `() => void` | Fungsi saat ikon kiri diklik |
20
+ | `onPressIconRight` | `() => void` | Fungsi saat ikon kanan diklik |
21
+ | `secureTextEntry` | `boolean` | Jika `true`, menyembunyikan input (untuk password) |
22
+ | `style` | `ViewStyle` | Style tambahan untuk input |
23
+ | `prefix` | `React.ReactNode` | Slot `react node` yang bisa diisi oleh seluruh komponen react |
24
+ | `required` | `boolean` | Jika `true` maka akan menampilkan bintang berwarna merah setelah label |
25
+ | `...rest` | `TextInputProps` | Props lain dari React Native `TextInput` |
25
26
 
26
27
  ---
27
28
 
@@ -14,6 +14,7 @@ export interface InputProps extends TextInputProps {
14
14
  secureTextEntry?: boolean;
15
15
  iconRightColor?: string;
16
16
  prefix?: React.ReactNode;
17
+ required?: boolean;
17
18
  }
18
19
 
19
20
  export interface TextAreaProps extends InputProps {
@@ -1,11 +1,22 @@
1
1
  import { View } from 'react-native';
2
2
  import Typography from '../Typography/Typography';
3
+ import Color from '../Color/Color';
3
4
 
4
- export default function LabelForm({ title }: { title: string }) {
5
+ interface Props {
6
+ title: string;
7
+ required?: boolean;
8
+ }
9
+
10
+ export default function LabelForm({ title, required }: Props) {
5
11
  return (
6
12
  <View>
7
13
  <Typography variant="t2" weight="semibold">
8
- {title}
14
+ {title}{' '}
15
+ {required && (
16
+ <Typography variant="t2" weight="semibold" color={Color.danger[500]}>
17
+ *
18
+ </Typography>
19
+ )}
9
20
  </Typography>
10
21
  </View>
11
22
  );
@@ -1,7 +1,7 @@
1
- import { StyleSheet, SafeAreaView } from 'react-native';
2
- import { useFooter } from './Provider';
3
1
  import React from 'react';
2
+ import { StyleSheet, View } from 'react-native';
4
3
  import Color from '../Color/Color';
4
+ import { useFooter } from './Provider';
5
5
 
6
6
  export default function LayoutWithFooter({
7
7
  children,
@@ -11,12 +11,10 @@ export default function LayoutWithFooter({
11
11
  const { footer } = useFooter();
12
12
 
13
13
  return (
14
- <SafeAreaView style={styles.container}>
15
- <SafeAreaView style={[styles.content, footer && styles.footer]}>
16
- {children}
17
- </SafeAreaView>
14
+ <View style={styles.container}>
15
+ <View style={[styles.content, footer && styles.footer]}>{children}</View>
18
16
  {footer}
19
- </SafeAreaView>
17
+ </View>
20
18
  );
21
19
  }
22
20