aport-tools 4.2.6 → 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.6 | 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,7 +574,7 @@ 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
579
  } : {}, isDisabled ? {
579
580
  backgroundColor: colors.placeHolder.hex
@@ -584,18 +585,18 @@ var InputList = function InputList(_a) {
584
585
  color: colors.background.hex
585
586
  } : {
586
587
  color: colors.text.hex
587
- }, isDisabled ? styles$2.disabledText : {}]
588
+ }, isDisabled ? styles$3.disabledText : {}]
588
589
  }, item.label));
589
590
  },
590
591
  ItemSeparatorComponent: function ItemSeparatorComponent() {
591
592
  return separator ? /*#__PURE__*/React.createElement(View, {
592
- style: styles$2.separator
593
+ style: styles$3.separator
593
594
  }) : null;
594
595
  },
595
596
  scrollEnabled: !closeOnScroll
596
597
  }))));
597
598
  };
598
- var styles$2 = StyleSheet.create({
599
+ var styles$3 = StyleSheet.create({
599
600
  container: {
600
601
  padding: 8
601
602
  },
@@ -633,6 +634,175 @@ var styles$2 = StyleSheet.create({
633
634
  }
634
635
  });
635
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
+
636
806
  // src/components/Button.tsx
637
807
  /**
638
808
  * Determines the styles based on the button type and whether it is disabled.
@@ -811,5 +981,5 @@ var styles = StyleSheet.create({
811
981
  }
812
982
  });
813
983
 
814
- export { Button, Card, ErrorList, Form, Input, InputList, Label, Text, TextArea, useFormContext };
984
+ export { Button, Card, ErrorList, Form, Input, InputAttach, InputList, Label, Text, TextArea, useFormContext };
815
985
  //# sourceMappingURL=index.esm.js.map