aport-tools 4.2.5 → 4.2.7

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.
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ interface InputAttachProps {
3
+ name: string;
4
+ type?: string[];
5
+ amount?: number;
6
+ disabled?: boolean;
7
+ placeholder?: string;
8
+ }
9
+ declare const InputAttach: React.FC<InputAttachProps>;
10
+ export default InputAttach;
@@ -4,3 +4,4 @@ export { default as TextArea } from './TextArea';
4
4
  export { default as Label } from './Label';
5
5
  export { default as ErrorList } from './ErrorList';
6
6
  export { InputList } from './InputList';
7
+ export { default as InputAttach } from './InputAttach';
package/dist/index.esm.js CHANGED
@@ -1,7 +1,8 @@
1
- /*! aport-tools v4.2.5 | ISC */
1
+ /*! aport-tools v4.2.7 | ISC */
2
2
  import React, { useContext, useState, createContext, useCallback, useMemo } from 'react';
3
- import { StyleSheet, Text as Text$1, View, TextInput, TouchableOpacity, Modal, Pressable, FlatList, Keyboard, ActivityIndicator, Platform } from 'react-native';
3
+ import { StyleSheet, Text as Text$1, View, TextInput, TouchableOpacity, Modal, Pressable, FlatList, Keyboard, Image, Alert, ActivityIndicator, Platform } from 'react-native';
4
4
  import { ThemeContext } from 'aport-themes';
5
+ import * as ImagePicker from 'expo-image-picker';
5
6
 
6
7
  /******************************************************************************
7
8
  Copyright (c) Microsoft Corporation.
@@ -230,23 +231,23 @@ var ErrorList = function ErrorList(_a) {
230
231
  var theme = useContext(ThemeContext).theme;
231
232
  var colors = theme.colors;
232
233
  return /*#__PURE__*/React.createElement(View, {
233
- style: styles$6.container
234
+ style: styles$7.container
234
235
  }, errors.map(function (error, index) {
235
236
  return /*#__PURE__*/React.createElement(View, {
236
237
  key: index,
237
- style: styles$6.errorItem
238
+ style: styles$7.errorItem
238
239
  }, /*#__PURE__*/React.createElement(Text, {
239
- style: [styles$6.bullet, {
240
+ style: [styles$7.bullet, {
240
241
  color: colors.error.hex
241
242
  }]
242
243
  }, "\u2022"), /*#__PURE__*/React.createElement(Text, {
243
- style: [styles$6.errorText, {
244
+ style: [styles$7.errorText, {
244
245
  color: colors.error.hex
245
246
  }]
246
247
  }, error));
247
248
  }));
248
249
  };
249
- var styles$6 = StyleSheet.create({
250
+ var styles$7 = StyleSheet.create({
250
251
  container: {
251
252
  marginTop: 4
252
253
  },
@@ -324,13 +325,13 @@ var Input = function Input(_a) {
324
325
  setFormValue(name, formattedText);
325
326
  };
326
327
  return /*#__PURE__*/React.createElement(View, {
327
- style: styles$5.container
328
+ style: styles$6.container
328
329
  }, /*#__PURE__*/React.createElement(Text, {
329
- style: [styles$5.label, {
330
+ style: [styles$6.label, {
330
331
  color: colors.text.hex
331
332
  }]
332
333
  }, label), /*#__PURE__*/React.createElement(TextInput, __assign({
333
- style: [styles$5.input, {
334
+ style: [styles$6.input, {
334
335
  backgroundColor: colors.body.hex,
335
336
  borderColor: formErrors[name] ? colors.error.hex : "#CCC",
336
337
  color: colors.text.hex
@@ -343,7 +344,7 @@ var Input = function Input(_a) {
343
344
  errors: formErrors[name]
344
345
  })));
345
346
  };
346
- var styles$5 = StyleSheet.create({
347
+ var styles$6 = StyleSheet.create({
347
348
  container: {
348
349
  marginBottom: 16
349
350
  },
@@ -374,11 +375,11 @@ var TextArea = function TextArea(_a) {
374
375
  setFormValue(name, text);
375
376
  };
376
377
  return /*#__PURE__*/React.createElement(View, {
377
- style: styles$4.container
378
+ style: styles$5.container
378
379
  }, /*#__PURE__*/React.createElement(Text, {
379
- style: styles$4.label
380
+ style: styles$5.label
380
381
  }, label), /*#__PURE__*/React.createElement(TextInput, __assign({
381
- style: [styles$4.textArea, style],
382
+ style: [styles$5.textArea, style],
382
383
  value: formValues[name] || '',
383
384
  onChangeText: handleChange,
384
385
  placeholder: label,
@@ -391,7 +392,7 @@ var TextArea = function TextArea(_a) {
391
392
  errors: formErrors[name]
392
393
  })));
393
394
  };
394
- var styles$4 = StyleSheet.create({
395
+ var styles$5 = StyleSheet.create({
395
396
  container: {
396
397
  marginBottom: 16
397
398
  },
@@ -420,12 +421,12 @@ var Label = function Label(_a) {
420
421
  var theme = useContext(ThemeContext).theme;
421
422
  var colors = theme.colors;
422
423
  return /*#__PURE__*/React.createElement(Text, {
423
- style: [styles$3.label, style, {
424
+ style: [styles$4.label, style, {
424
425
  color: colors.text.hex
425
426
  }]
426
427
  }, text);
427
428
  };
428
- var styles$3 = StyleSheet.create({
429
+ var styles$4 = StyleSheet.create({
429
430
  label: {
430
431
  marginBottom: 4,
431
432
  fontWeight: '500'
@@ -538,9 +539,9 @@ var InputList = function InputList(_a) {
538
539
  });
539
540
  };
540
541
  return /*#__PURE__*/React.createElement(View, {
541
- style: [styles$2.container, style]
542
+ style: [styles$3.container, style]
542
543
  }, /*#__PURE__*/React.createElement(TouchableOpacity, {
543
- style: styles$2.inputContainer,
544
+ style: styles$3.inputContainer,
544
545
  onPress: toggleDropdown,
545
546
  disabled: disabled
546
547
  }, /*#__PURE__*/React.createElement(Text$1, {
@@ -552,10 +553,10 @@ var InputList = function InputList(_a) {
552
553
  transparent: true,
553
554
  animationType: "fade"
554
555
  }, /*#__PURE__*/React.createElement(Pressable, {
555
- style: styles$2.overlay,
556
+ style: styles$3.overlay,
556
557
  onPress: handleCloseDropdown
557
558
  }), /*#__PURE__*/React.createElement(View, {
558
- style: [styles$2.dropdownContainer, {
559
+ style: [styles$3.dropdownContainer, {
559
560
  backgroundColor: colors.body.hex
560
561
  }]
561
562
  }, /*#__PURE__*/React.createElement(FlatList, {
@@ -573,27 +574,29 @@ var InputList = function InputList(_a) {
573
574
  onPress: function onPress() {
574
575
  return handleSelectOption(item);
575
576
  },
576
- style: [styles$2.optionItem, isSelected ? {
577
+ style: [styles$3.optionItem, isSelected ? {
577
578
  backgroundColor: colors.primary.hex
578
- } : {}, isDisabled ? styles$2.disabledItem : {}],
579
+ } : {}, isDisabled ? {
580
+ backgroundColor: colors.placeHolder.hex
581
+ } : {}],
579
582
  disabled: !!isDisabled
580
583
  }, /*#__PURE__*/React.createElement(Text$1, {
581
584
  style: [isSelected ? {
582
585
  color: colors.background.hex
583
586
  } : {
584
587
  color: colors.text.hex
585
- }, isDisabled ? styles$2.disabledText : {}]
588
+ }, isDisabled ? styles$3.disabledText : {}]
586
589
  }, item.label));
587
590
  },
588
591
  ItemSeparatorComponent: function ItemSeparatorComponent() {
589
592
  return separator ? /*#__PURE__*/React.createElement(View, {
590
- style: styles$2.separator
593
+ style: styles$3.separator
591
594
  }) : null;
592
595
  },
593
596
  scrollEnabled: !closeOnScroll
594
597
  }))));
595
598
  };
596
- var styles$2 = StyleSheet.create({
599
+ var styles$3 = StyleSheet.create({
597
600
  container: {
598
601
  padding: 8
599
602
  },
@@ -617,9 +620,6 @@ var styles$2 = StyleSheet.create({
617
620
  optionItem: {
618
621
  padding: 12
619
622
  },
620
- disabledItem: {
621
- backgroundColor: '#f0f0f0'
622
- },
623
623
  disabledText: {
624
624
  color: '#999'
625
625
  },
@@ -634,6 +634,175 @@ var styles$2 = StyleSheet.create({
634
634
  }
635
635
  });
636
636
 
637
+ // src/components/InputAttach.tsx
638
+ var InputAttach = function InputAttach(_a) {
639
+ var name = _a.name,
640
+ _b = _a.type,
641
+ type = _b === void 0 ? ["png", "jpg", "jpeg"] : _b,
642
+ _c = _a.amount,
643
+ amount = _c === void 0 ? 1 : _c,
644
+ _d = _a.disabled,
645
+ disabled = _d === void 0 ? false : _d,
646
+ _e = _a.placeholder,
647
+ placeholder = _e === void 0 ? "Upload an image" : _e;
648
+ var _f = useFormContext(),
649
+ setFormValue = _f.setFormValue;
650
+ _f.formValues;
651
+ var errors = _f.errors;
652
+ var _g = useState([]),
653
+ selectedFiles = _g[0],
654
+ setSelectedFiles = _g[1];
655
+ var pickImage = function pickImage() {
656
+ return __awaiter(void 0, void 0, void 0, function () {
657
+ var permissionResult, result, selectedAssets, newFiles, invalidFiles, updatedFiles;
658
+ return __generator(this, function (_a) {
659
+ switch (_a.label) {
660
+ case 0:
661
+ if (disabled) return [2 /*return*/];
662
+ return [4 /*yield*/, ImagePicker.requestMediaLibraryPermissionsAsync()];
663
+ case 1:
664
+ permissionResult = _a.sent();
665
+ if (!permissionResult.granted) {
666
+ Alert.alert("Permission Required", "We need access to your photos to upload images.");
667
+ return [2 /*return*/];
668
+ }
669
+ return [4 /*yield*/, ImagePicker.launchImageLibraryAsync({
670
+ mediaTypes: ImagePicker.MediaTypeOptions.Images,
671
+ allowsMultipleSelection: amount > 1,
672
+ quality: 1
673
+ })];
674
+ case 2:
675
+ result = _a.sent();
676
+ if (!result.canceled) {
677
+ selectedAssets = result.assets || [result];
678
+ newFiles = selectedAssets.map(function (asset) {
679
+ return {
680
+ uri: asset.uri,
681
+ name: asset.fileName || "unknown.jpg",
682
+ type: asset.mimeType || "image/jpeg"
683
+ };
684
+ });
685
+ invalidFiles = newFiles.filter(function (file) {
686
+ return !type.some(function (ext) {
687
+ return file.name.toLowerCase().endsWith(ext);
688
+ });
689
+ });
690
+ if (invalidFiles.length > 0) {
691
+ Alert.alert("Invalid File Type", "Please upload files of type: ".concat(type.join(", ")));
692
+ return [2 /*return*/];
693
+ }
694
+ // Check max amount
695
+ if (selectedFiles.length + newFiles.length > amount) {
696
+ Alert.alert("Limit Exceeded", "You can upload up to ".concat(amount, " files."));
697
+ return [2 /*return*/];
698
+ }
699
+ updatedFiles = __spreadArray(__spreadArray([], selectedFiles, true), newFiles, true).slice(0, amount);
700
+ setSelectedFiles(updatedFiles);
701
+ setFormValue(name, updatedFiles); // Update form context
702
+ }
703
+ return [2 /*return*/];
704
+ }
705
+ });
706
+ });
707
+ };
708
+ var removeFile = function removeFile(index) {
709
+ var updatedFiles = selectedFiles.filter(function (_, i) {
710
+ return i !== index;
711
+ });
712
+ setSelectedFiles(updatedFiles);
713
+ setFormValue(name, updatedFiles); // Update form context
714
+ };
715
+ return /*#__PURE__*/React.createElement(View, {
716
+ style: styles$2.container
717
+ }, /*#__PURE__*/React.createElement(Text$1, {
718
+ style: styles$2.label
719
+ }, placeholder), /*#__PURE__*/React.createElement(View, {
720
+ style: styles$2.fileContainer
721
+ }, selectedFiles.map(function (file, index) {
722
+ return /*#__PURE__*/React.createElement(View, {
723
+ key: index,
724
+ style: styles$2.fileItem
725
+ }, /*#__PURE__*/React.createElement(Image, {
726
+ source: {
727
+ uri: file.uri
728
+ },
729
+ style: styles$2.imagePreview
730
+ }), /*#__PURE__*/React.createElement(TouchableOpacity, {
731
+ onPress: function onPress() {
732
+ return removeFile(index);
733
+ },
734
+ style: styles$2.removeButton
735
+ }, /*#__PURE__*/React.createElement(Text$1, {
736
+ style: styles$2.removeButtonText
737
+ }, "X")));
738
+ }), selectedFiles.length < amount && (/*#__PURE__*/React.createElement(TouchableOpacity, {
739
+ onPress: pickImage,
740
+ style: styles$2.addButton,
741
+ disabled: disabled
742
+ }, /*#__PURE__*/React.createElement(Text$1, {
743
+ style: styles$2.addButtonText
744
+ }, "+")))), errors[name] && /*#__PURE__*/React.createElement(Text$1, {
745
+ style: styles$2.error
746
+ }, errors[name].join(", ")));
747
+ };
748
+ var styles$2 = StyleSheet.create({
749
+ container: {
750
+ marginVertical: 10
751
+ },
752
+ label: {
753
+ fontSize: 16,
754
+ marginBottom: 5,
755
+ color: "#333"
756
+ },
757
+ fileContainer: {
758
+ flexDirection: "row",
759
+ flexWrap: "wrap",
760
+ gap: 10
761
+ },
762
+ fileItem: {
763
+ position: "relative",
764
+ width: 100,
765
+ height: 100,
766
+ marginRight: 10
767
+ },
768
+ imagePreview: {
769
+ width: "100%",
770
+ height: "100%",
771
+ borderRadius: 5
772
+ },
773
+ removeButton: {
774
+ position: "absolute",
775
+ top: 0,
776
+ right: 0,
777
+ backgroundColor: "red",
778
+ width: 20,
779
+ height: 20,
780
+ justifyContent: "center",
781
+ alignItems: "center",
782
+ borderRadius: 10
783
+ },
784
+ removeButtonText: {
785
+ color: "#fff",
786
+ fontWeight: "bold"
787
+ },
788
+ addButton: {
789
+ width: 100,
790
+ height: 100,
791
+ justifyContent: "center",
792
+ alignItems: "center",
793
+ backgroundColor: "#f0f0f0",
794
+ borderRadius: 5
795
+ },
796
+ addButtonText: {
797
+ fontSize: 24,
798
+ color: "#aaa"
799
+ },
800
+ error: {
801
+ color: "red",
802
+ marginTop: 5
803
+ }
804
+ });
805
+
637
806
  // src/components/Button.tsx
638
807
  /**
639
808
  * Determines the styles based on the button type and whether it is disabled.
@@ -812,5 +981,5 @@ var styles = StyleSheet.create({
812
981
  }
813
982
  });
814
983
 
815
- export { Button, Card, ErrorList, Form, Input, InputList, Label, Text, TextArea, useFormContext };
984
+ export { Button, Card, ErrorList, Form, Input, InputAttach, InputList, Label, Text, TextArea, useFormContext };
816
985
  //# sourceMappingURL=index.esm.js.map