@lmb-it/kitsconcerto-native 0.1.289 → 0.1.290
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/apps/mobile/src/Core/Dropdown/index.cjs +1 -0
- package/apps/mobile/src/Core/Dropdown/index.cjs.map +1 -1
- package/apps/mobile/src/Core/Dropdown/index.js +1 -0
- package/apps/mobile/src/Core/Dropdown/index.js.map +1 -1
- package/apps/mobile/src/Core/Trees/components/CoreToolbar.cjs +1 -0
- package/apps/mobile/src/Core/Trees/components/CoreToolbar.cjs.map +1 -1
- package/apps/mobile/src/Core/Trees/components/CoreToolbar.js +1 -0
- package/apps/mobile/src/Core/Trees/components/CoreToolbar.js.map +1 -1
- package/apps/mobile/src/Factory/ResponsiveElement.cjs +1 -0
- package/apps/mobile/src/Factory/ResponsiveElement.cjs.map +1 -1
- package/apps/mobile/src/Factory/ResponsiveElement.js +1 -0
- package/apps/mobile/src/Factory/ResponsiveElement.js.map +1 -1
- package/apps/mobile/src/Factory/helpers/cssVarMap.cjs +1 -0
- package/apps/mobile/src/Factory/helpers/cssVarMap.cjs.map +1 -1
- package/apps/mobile/src/Factory/helpers/cssVarMap.js +1 -0
- package/apps/mobile/src/Factory/helpers/cssVarMap.js.map +1 -1
- package/apps/mobile/src/Factory/helpers/style.cjs +1 -0
- package/apps/mobile/src/Factory/helpers/style.cjs.map +1 -1
- package/apps/mobile/src/Factory/helpers/style.js +1 -0
- package/apps/mobile/src/Factory/helpers/style.js.map +1 -1
- package/apps/mobile/src/Factory/useSeparator.cjs +1 -0
- package/apps/mobile/src/Factory/useSeparator.cjs.map +1 -1
- package/apps/mobile/src/Factory/useSeparator.js +1 -0
- package/apps/mobile/src/Factory/useSeparator.js.map +1 -1
- package/components/Accordion/accordion.cjs +1 -0
- package/components/Accordion/accordion.cjs.map +1 -1
- package/components/Accordion/accordion.js +1 -0
- package/components/Accordion/accordion.js.map +1 -1
- package/components/Badge/index.cjs +1 -0
- package/components/Badge/index.cjs.map +1 -1
- package/components/Badge/index.js +1 -0
- package/components/Badge/index.js.map +1 -1
- package/components/BottomTabBar/index.cjs +1 -0
- package/components/BottomTabBar/index.cjs.map +1 -1
- package/components/BottomTabBar/index.js +1 -0
- package/components/BottomTabBar/index.js.map +1 -1
- package/components/Button/Button.cjs +1 -0
- package/components/Button/Button.cjs.map +1 -1
- package/components/Button/Button.js +1 -0
- package/components/Button/Button.js.map +1 -1
- package/components/MessageComposer/index.cjs +1 -0
- package/components/MessageComposer/index.cjs.map +1 -1
- package/components/MessageComposer/index.js +1 -0
- package/components/MessageComposer/index.js.map +1 -1
- package/components/SegmentedControl/index.cjs +1 -0
- package/components/SegmentedControl/index.cjs.map +1 -1
- package/components/SegmentedControl/index.js +1 -0
- package/components/SegmentedControl/index.js.map +1 -1
- package/components/SkeletonText/index.cjs +1 -0
- package/components/SkeletonText/index.cjs.map +1 -1
- package/components/SkeletonText/index.js +1 -0
- package/components/SkeletonText/index.js.map +1 -1
- package/components/Tabs/index.cjs +3 -2
- package/components/Tabs/index.cjs.map +1 -1
- package/components/Tabs/index.js +3 -2
- package/components/Tabs/index.js.map +1 -1
- package/contexts/Locale/index.cjs +1 -0
- package/contexts/Locale/index.cjs.map +1 -1
- package/contexts/Locale/index.js +1 -0
- package/contexts/Locale/index.js.map +1 -1
- package/contexts/Main/index.cjs +1 -0
- package/contexts/Main/index.cjs.map +1 -1
- package/contexts/Main/index.js +1 -0
- package/contexts/Main/index.js.map +1 -1
- package/contexts/Theme/index.cjs +1 -0
- package/contexts/Theme/index.cjs.map +1 -1
- package/contexts/Theme/index.js +1 -0
- package/contexts/Theme/index.js.map +1 -1
- package/data/DataView/Pagination/index.cjs +1 -0
- package/data/DataView/Pagination/index.cjs.map +1 -1
- package/data/DataView/Pagination/index.js +1 -0
- package/data/DataView/Pagination/index.js.map +1 -1
- package/data/TreeView/index.cjs +1 -0
- package/data/TreeView/index.cjs.map +1 -1
- package/data/TreeView/index.js +1 -0
- package/data/TreeView/index.js.map +1 -1
- package/form/controls/Checkbox/checkbox.cjs +1 -0
- package/form/controls/Checkbox/checkbox.cjs.map +1 -1
- package/form/controls/Checkbox/checkbox.js +1 -0
- package/form/controls/Checkbox/checkbox.js.map +1 -1
- package/form/controls/RadioButton/radiobutton.cjs +1 -0
- package/form/controls/RadioButton/radiobutton.cjs.map +1 -1
- package/form/controls/RadioButton/radiobutton.js +1 -0
- package/form/controls/RadioButton/radiobutton.js.map +1 -1
- package/form/controls/SelectButton/index.cjs +1 -0
- package/form/controls/SelectButton/index.cjs.map +1 -1
- package/form/controls/SelectButton/index.js +1 -0
- package/form/controls/SelectButton/index.js.map +1 -1
- package/form/controls/TriStateCheckbox/index.cjs +1 -0
- package/form/controls/TriStateCheckbox/index.cjs.map +1 -1
- package/form/controls/TriStateCheckbox/index.js +1 -0
- package/form/controls/TriStateCheckbox/index.js.map +1 -1
- package/form/file-pickers/MainUploader/index.cjs +1 -0
- package/form/file-pickers/MainUploader/index.cjs.map +1 -1
- package/form/file-pickers/MainUploader/index.js +1 -0
- package/form/file-pickers/MainUploader/index.js.map +1 -1
- package/form/helpers/ErrorMessage/errormessage.cjs +1 -0
- package/form/helpers/ErrorMessage/errormessage.cjs.map +1 -1
- package/form/helpers/ErrorMessage/errormessage.js +1 -0
- package/form/helpers/ErrorMessage/errormessage.js.map +1 -1
- package/form/helpers/FormContainer/index.cjs +1 -0
- package/form/helpers/FormContainer/index.cjs.map +1 -1
- package/form/helpers/FormContainer/index.js +1 -0
- package/form/helpers/FormContainer/index.js.map +1 -1
- package/form/helpers/Label/label.cjs +1 -0
- package/form/helpers/Label/label.cjs.map +1 -1
- package/form/helpers/Label/label.js +1 -0
- package/form/helpers/Label/label.js.map +1 -1
- package/form/inputs/InputMask/index.cjs +1 -0
- package/form/inputs/InputMask/index.cjs.map +1 -1
- package/form/inputs/InputMask/index.js +1 -0
- package/form/inputs/InputMask/index.js.map +1 -1
- package/form/inputs/InputNumber/index.cjs +1 -0
- package/form/inputs/InputNumber/index.cjs.map +1 -1
- package/form/inputs/InputNumber/index.js +1 -0
- package/form/inputs/InputNumber/index.js.map +1 -1
- package/form/inputs/InputPassword/index.cjs +1 -0
- package/form/inputs/InputPassword/index.cjs.map +1 -1
- package/form/inputs/InputPassword/index.js +1 -0
- package/form/inputs/InputPassword/index.js.map +1 -1
- package/form/inputs/InputSwitch/index.cjs +1 -0
- package/form/inputs/InputSwitch/index.cjs.map +1 -1
- package/form/inputs/InputSwitch/index.js +1 -0
- package/form/inputs/InputSwitch/index.js.map +1 -1
- package/form/inputs/InputText/index.cjs +1 -0
- package/form/inputs/InputText/index.cjs.map +1 -1
- package/form/inputs/InputText/index.js +1 -0
- package/form/inputs/InputText/index.js.map +1 -1
- package/form/inputs/InputTextarea/index.cjs +1 -0
- package/form/inputs/InputTextarea/index.cjs.map +1 -1
- package/form/inputs/InputTextarea/index.js +1 -0
- package/form/inputs/InputTextarea/index.js.map +1 -1
- package/form/inputs/PhoneInput/index.cjs +1 -0
- package/form/inputs/PhoneInput/index.cjs.map +1 -1
- package/form/inputs/PhoneInput/index.js +1 -0
- package/form/inputs/PhoneInput/index.js.map +1 -1
- package/form/inputs/RadiusPicker/components/NumericRadiusInput.cjs +1 -0
- package/form/inputs/RadiusPicker/components/NumericRadiusInput.cjs.map +1 -1
- package/form/inputs/RadiusPicker/components/NumericRadiusInput.js +1 -0
- package/form/inputs/RadiusPicker/components/NumericRadiusInput.js.map +1 -1
- package/form/selects/AutoComplete/index.cjs +1 -0
- package/form/selects/AutoComplete/index.cjs.map +1 -1
- package/form/selects/AutoComplete/index.js +1 -0
- package/form/selects/AutoComplete/index.js.map +1 -1
- package/form/selects/Dropdown/index.cjs +1 -0
- package/form/selects/Dropdown/index.cjs.map +1 -1
- package/form/selects/Dropdown/index.js +1 -0
- package/form/selects/Dropdown/index.js.map +1 -1
- package/form/selects/ListBox/index.cjs +1 -0
- package/form/selects/ListBox/index.cjs.map +1 -1
- package/form/selects/ListBox/index.js +1 -0
- package/form/selects/ListBox/index.js.map +1 -1
- package/form/selects/MultiSelect/index.cjs +1 -0
- package/form/selects/MultiSelect/index.cjs.map +1 -1
- package/form/selects/MultiSelect/index.js +1 -0
- package/form/selects/MultiSelect/index.js.map +1 -1
- package/form/selects/TreeSelect/index.cjs +1 -0
- package/form/selects/TreeSelect/index.cjs.map +1 -1
- package/form/selects/TreeSelect/index.js +1 -0
- package/form/selects/TreeSelect/index.js.map +1 -1
- package/form/selects/helpers/SelectPopupOverlay.cjs +1 -0
- package/form/selects/helpers/SelectPopupOverlay.cjs.map +1 -1
- package/form/selects/helpers/SelectPopupOverlay.js +1 -0
- package/form/selects/helpers/SelectPopupOverlay.js.map +1 -1
- package/form-renderer/components/layout/FieldWrapper.cjs +1 -0
- package/form-renderer/components/layout/FieldWrapper.cjs.map +1 -1
- package/form-renderer/components/layout/FieldWrapper.js +1 -0
- package/form-renderer/components/layout/FieldWrapper.js.map +1 -1
- package/hooks/shadowPresets.cjs +1 -0
- package/hooks/shadowPresets.cjs.map +1 -1
- package/hooks/shadowPresets.js +1 -0
- package/hooks/shadowPresets.js.map +1 -1
- package/hooks/useFocusStyles.cjs +1 -0
- package/hooks/useFocusStyles.cjs.map +1 -1
- package/hooks/useFocusStyles.js +1 -0
- package/hooks/useFocusStyles.js.map +1 -1
- package/index.cjs +2 -0
- package/index.cjs.map +1 -1
- package/index.d.ts +35 -3
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/layout/Center/index.cjs +1 -0
- package/layout/Center/index.cjs.map +1 -1
- package/layout/Center/index.js +1 -0
- package/layout/Center/index.js.map +1 -1
- package/layout/Container/container.cjs +1 -0
- package/layout/Container/container.cjs.map +1 -1
- package/layout/Container/container.js +1 -0
- package/layout/Container/container.js.map +1 -1
- package/layout/Flex/index.cjs +1 -0
- package/layout/Flex/index.cjs.map +1 -1
- package/layout/Flex/index.js +1 -0
- package/layout/Flex/index.js.map +1 -1
- package/layout/HStack/index.cjs +1 -0
- package/layout/HStack/index.cjs.map +1 -1
- package/layout/HStack/index.js +1 -0
- package/layout/HStack/index.js.map +1 -1
- package/layout/List/index.cjs +1 -0
- package/layout/List/index.cjs.map +1 -1
- package/layout/List/index.js +1 -0
- package/layout/List/index.js.map +1 -1
- package/layout/ListItem/index.cjs +1 -0
- package/layout/ListItem/index.cjs.map +1 -1
- package/layout/ListItem/index.js +1 -0
- package/layout/ListItem/index.js.map +1 -1
- package/layout/ScrollView/index.cjs +1 -0
- package/layout/ScrollView/index.cjs.map +1 -1
- package/layout/ScrollView/index.js +1 -0
- package/layout/ScrollView/index.js.map +1 -1
- package/layout/VStack/index.cjs +1 -0
- package/layout/VStack/index.cjs.map +1 -1
- package/layout/VStack/index.js +1 -0
- package/layout/VStack/index.js.map +1 -1
- package/package.json +1 -1
- package/packages/types/src/Theme/resolvers.cjs +2 -55
- package/packages/types/src/Theme/resolvers.cjs.map +1 -1
- package/packages/types/src/Theme/resolvers.js +2 -55
- package/packages/types/src/Theme/resolvers.js.map +1 -1
- package/packages/types/src/Theme/semanticTokenNames.cjs +64 -0
- package/packages/types/src/Theme/semanticTokenNames.cjs.map +1 -0
- package/packages/types/src/Theme/semanticTokenNames.js +62 -0
- package/packages/types/src/Theme/semanticTokenNames.js.map +1 -0
- package/primitives/Box/index.cjs +1 -0
- package/primitives/Box/index.cjs.map +1 -1
- package/primitives/Box/index.js +1 -0
- package/primitives/Box/index.js.map +1 -1
- package/primitives/Card/index.cjs +1 -0
- package/primitives/Card/index.cjs.map +1 -1
- package/primitives/Card/index.js +1 -0
- package/primitives/Card/index.js.map +1 -1
- package/primitives/Divider/index.cjs +1 -0
- package/primitives/Divider/index.cjs.map +1 -1
- package/primitives/Divider/index.js +1 -0
- package/primitives/Divider/index.js.map +1 -1
- package/primitives/Heading/index.cjs +1 -0
- package/primitives/Heading/index.cjs.map +1 -1
- package/primitives/Heading/index.js +1 -0
- package/primitives/Heading/index.js.map +1 -1
- package/primitives/Image/index.cjs +1 -0
- package/primitives/Image/index.cjs.map +1 -1
- package/primitives/Image/index.js +1 -0
- package/primitives/Image/index.js.map +1 -1
- package/primitives/Skeleton/index.cjs +1 -0
- package/primitives/Skeleton/index.cjs.map +1 -1
- package/primitives/Skeleton/index.js +1 -0
- package/primitives/Skeleton/index.js.map +1 -1
- package/primitives/Svg/index.cjs +1 -0
- package/primitives/Svg/index.cjs.map +1 -1
- package/primitives/Svg/index.js +1 -0
- package/primitives/Svg/index.js.map +1 -1
- package/primitives/Text/index.cjs +1 -0
- package/primitives/Text/index.cjs.map +1 -1
- package/primitives/Text/index.js +1 -0
- package/primitives/Text/index.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../../src/form/file-pickers/MainUploader/index.native.tsx"],"sourcesContent":["import React, {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport DocumentPicker, { type DocumentPickerOptions } from \"react-native-document-picker\";\nimport { launchImageLibrary } from \"react-native-image-picker\";\nimport RNFS from \"react-native-fs\";\n\nimport {type IFileUploader, type File, type IMemes, toMemes} from \"@lmb-it/kitsconcerto-types\";\nimport { getType } from \"@lmb-it/kitsconcerto-types\";\nimport { Flex } from \"../../../_compat\";\n\nimport SingleFileUploader from \"../SingleFileUploader\";\nimport MultipleFileUploader from \"../MultipleFileUploader\";\nimport SingleImageUploader from \"../SingleImageUploader\";\nimport MultipleImageUploader from \"../MultipleImageUploader\";\nimport {AnyFile} from \"../../../utils\";\n\ntype Base64Item = { filename: string; base64: string; type: string };\n\ninterface IFileUploaderContextValues {\n onChangeAnyFileUploader(files: File[]): void;\n onPick(): void;\n removeFile(fileIndex: number): () => void;\n onInvalidInput(errors: any): void;\n\n selectedFiles: File[];\n selectedInitialFiles: string[];\n\n placeholder?: string;\n disabled?: boolean;\n isClassicUploader: boolean;\n limit: number;\n acceptedMemes: string[]; // mime list\n files: { name: string; ext: string; shortName: string; file: { uri: string } | string }[];\n id: string;\n isImage: boolean;\n}\n\nexport const FileUploaderContext = createContext<IFileUploaderContextValues>({\n onChangeAnyFileUploader: () => {\n },\n onPick: () => {},\n removeFile: () => () => {},\n onInvalidInput: () => {},\n disabled: false,\n limit: 1,\n isClassicUploader: true,\n selectedInitialFiles: [],\n selectedFiles: [],\n acceptedMemes: [],\n files: [],\n id: \"\",\n isImage: false,\n});\n\nconst stripExt = (name: string) => name.replace(/\\.[^/.]+$/, \"\");\nconst getExt = (name: string) => (name.split(\".\").pop() ?? \"\").toLowerCase();\n\nconst readFileAsBase64 = async (uri: string) => {\n // DocumentPicker returns fileCopyUri when copyTo is used; use that when possible\n // RNFS expects file paths without \"file://\"\n const path = uri.startsWith(\"file://\") ? uri.replace(\"file://\", \"\") : uri;\n return RNFS.readFile(path, \"base64\");\n};\n\nconst MainUploader = (props: IFileUploader) => {\n const {\n acceptedTypes,\n type,\n classicUploader = true,\n limit = 1,\n onError,\n onFocus,\n placeholder,\n defaultValue,\n multiple,\n isJsonOutput = true,\n onChange,\n value,\n name,\n disabled,\n maxFileSize,\n minFileSize,\n children,\n } = props;\n\n const initialValueSynced = useRef(false);\n\n const [selectedFiles, setSelectedFiles] = useState<File[]>([]);\n const [selectedInitialFiles, setSelectedInitialFiles] = useState<string[]>([]);\n const [selectedFilesAsBase64, setSelectedFilesAsBase64] = useState<Base64Item[]>([]);\n\n const isImage = type === \"Image\";\n const isOneFile = !multiple || limit < 2;\n\n const onInvalidInput = (err: any) => onError?.(err);\n\n const acceptedMemes = useMemo(() => {\n return acceptedTypes ? toMemes(acceptedTypes) : toMemes(['allFiles']);\n }, [acceptedTypes]);\n\n const validateSize = (sizeBytes?: number) => {\n if (!sizeBytes) return true;\n const sizeKB = sizeBytes / 1000;\n if (maxFileSize && sizeKB > maxFileSize) return false;\n return !(minFileSize && sizeKB < minFileSize);\n\n };\n\n const pickDocuments = async () => {\n try {\n const types:DocumentPickerOptions = {\n allowMultiSelection: !isOneFile,\n // copy to cache so we can read base64 reliably\n copyTo: \"cachesDirectory\",\n // DocumentPicker supports mime list; if empty let OS choose anything\n type: acceptedMemes.length ? acceptedMemes : [DocumentPicker.types.allFiles],\n }\n\n const res = await DocumentPicker.pick(types);\n\n const docs = (Array.isArray(res) ? res : [res]).map((d) => ({\n uri: (d.fileCopyUri || d.uri) as string,\n name: d.name || \"file\",\n type: d.type || undefined,\n size: d.size || undefined,\n }));\n\n const filtered = docs.filter((d) => {\n const ok = validateSize(d.size);\n if (!ok) {\n onInvalidInput(`File \"${d.name}\" size is not allowed`);\n }\n return ok;\n });\n\n if (!filtered.length) return;\n setSelectedFiles((prev) => {\n if (isOneFile) {\n const [first] = filtered;\n return first ? [first] : prev;\n }\n return [...prev, ...filtered];\n });\n onInvalidInput(\"clear\");\n } catch (e: any) {\n if (DocumentPicker.isCancel(e)) return;\n onInvalidInput(e);\n }\n };\n\n const pickImages = async () => {\n try {\n const res = await launchImageLibrary({\n mediaType: \"photo\",\n selectionLimit: isOneFile ? 1 : limit,\n includeBase64: true,\n });\n\n if (res.didCancel) return;\n if (res.errorCode) {\n onInvalidInput(res.errorMessage || res.errorCode);\n return;\n }\n\n const assets = res.assets || [];\n const mapped: File[] = assets\n .filter((a) => !!a.uri)\n .map((a) => ({\n uri: a.uri!,\n name: a.fileName || \"image\",\n type: a.type || \"image/jpeg\",\n size: a.fileSize,\n }))\n .filter((f) => {\n const ok = validateSize(f.size);\n if (!ok) onInvalidInput(`File \"${f.name}\" size is not allowed`);\n return ok;\n });\n\n if (!mapped.length) return;\n\n setSelectedFiles((prev) => {\n if (isOneFile) {\n const [first] = mapped;\n return first ? [first] : prev;\n }\n return [...prev, ...mapped];\n });\n\n onInvalidInput(\"clear\");\n\n // for images, we already have base64 in the picker response; store it immediately\n const b64: Base64Item[] = assets\n .filter((a) => !!a.base64)\n .map((a) => ({\n filename: stripExt(a.fileName || \"image\"),\n base64: a.base64!,\n type: a.type || \"image/jpeg\",\n }));\n\n // keep order aligned with selectedFiles: for single this is OK; for multi, append\n setSelectedFilesAsBase64((prev) => (isOneFile ? b64.slice(0, 1) : [...prev, ...b64]));\n } catch (e: any) {\n onInvalidInput(e);\n }\n };\n\n const onChangeAnyFileUploader = (files: File[]) => {\n if (disabled) {\n return;\n }\n const filesList: any[] = [];\n\n setSelectedFilesAsBase64([]);\n for (let i = 0; i < files.length; i++) {\n const f = files[i];\n if (f) {\n // @ts-ignore\n const fileSize = f.size / 1000; // size in KB\n\n if ((!maxFileSize || fileSize <= maxFileSize) && (!minFileSize || fileSize >= minFileSize)) {\n filesList.push(f);\n onInvalidInput('clear')\n } else {\n let message = `File \"${f.name}\" is `;\n\n if (maxFileSize && fileSize > maxFileSize) {\n message += `too large. Maximum allowed is ${maxFileSize/1000} MB.`;\n } else if (minFileSize && fileSize < minFileSize) {\n message += `too small. Minimum allowed is ${minFileSize/1000} MB.`;\n }\n\n console.log(message)\n onInvalidInput(message);\n }\n }\n }\n\n if (!isOneFile) {\n setSelectedFiles(prevState => {\n return [...prevState, ...filesList];\n });\n } else {\n if (filesList.length)\n setSelectedFiles(filesList.slice(0, 1));\n }\n };\n const onPick = async () => {\n if (disabled) return;\n if (isImage) return pickImages();\n return pickDocuments();\n };\n\n const removeFile = (fileIndex: number) => () => {\n if (fileIndex < selectedInitialFiles.length) {\n setSelectedInitialFiles((prev) => prev.filter((_, i) => i !== fileIndex));\n return;\n }\n\n const editIndex = fileIndex - selectedInitialFiles.length;\n setSelectedFiles((prev) => prev.filter((_, i) => i !== editIndex));\n setSelectedFilesAsBase64((prev) => prev.filter((_, i) => i !== editIndex));\n };\n\n // Convert picked documents to base64 (images handled by picker includeBase64)\n useEffect(() => {\n if (isImage) return;\n\n const run = async () => {\n try {\n const next: Base64Item[] = [];\n for (const f of selectedFiles) {\n // only for documents; images might not be readable via RNFS content URIs\n const b64 = await readFileAsBase64(f.uri);\n next.push({\n filename: stripExt(f.name),\n base64: b64,\n type: f.type || getType(getExt(f.name) as any) || \"application/octet-stream\",\n });\n }\n setSelectedFilesAsBase64(next);\n } catch (e) {\n onInvalidInput(e);\n }\n };\n\n run().then(r => {\n\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedFiles, isImage]);\n\n // Emit onChange\n useEffect(() => {\n if (disabled) return;\n\n if (!selectedFiles.length && !selectedInitialFiles.length) {\n onChange?.([], []);\n return;\n }\n\n // Respect isJsonOutput (web behavior):\n // - when true: use base64Data output\n // - when false: still return picked files list (native file objects)\n // Output shape is platform-specific via types.native.ts\n if (isJsonOutput) {\n if (selectedFilesAsBase64.length === selectedFiles.length || isImage) {\n onChange?.(selectedFiles as any, selectedFilesAsBase64);\n }\n } else {\n onChange?.(selectedFiles as any, selectedFilesAsBase64);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedFilesAsBase64, selectedInitialFiles, selectedFiles]);\n\n // defaultValue + controlled value sync\n useEffect(() => {\n if (defaultValue) {\n setSelectedInitialFiles(Array.isArray(defaultValue) ? defaultValue : [defaultValue]);\n }\n }, [defaultValue]);\n\n useEffect(() => {\n if (initialValueSynced.current) return;\n if (value) {\n setSelectedInitialFiles(Array.isArray(value) ? value : [value]);\n }\n initialValueSynced.current = true;\n }, [value]);\n\n const display = useMemo(() => {\n const fromInitial = selectedInitialFiles.map((uri) => ({\n name: uri.split(\"/\").pop() ?? uri,\n shortName:AnyFile.shortName(uri),\n ext: getExt(uri),\n file: { uri },\n }));\n\n const fromPicked = selectedFiles.map((f) => ({\n name: f.name,\n shortName:AnyFile.shortName(f.name),\n ext: getExt(f.name),\n file: { uri: f.uri },\n }));\n\n return [...fromInitial, ...fromPicked];\n }, [selectedFiles, selectedInitialFiles]);\n\n /** Replace entire file selection (for template's update callback) */\n const updateFiles = (files: File | File[]) => {\n const arr = Array.isArray(files) ? files : [files];\n setSelectedFiles(arr);\n setSelectedInitialFiles([]);\n setSelectedFilesAsBase64([]);\n };\n\n const contextValue = {\n onChangeAnyFileUploader,\n onPick,\n removeFile,\n onInvalidInput,\n selectedFiles,\n selectedInitialFiles,\n disabled,\n limit,\n placeholder,\n isClassicUploader: classicUploader,\n acceptedMemes,\n files: display,\n id: name ?? \"\",\n isImage,\n };\n\n return (\n <FileUploaderContext.Provider value={contextValue}>\n <Flex onFocus={onFocus as any} w={\"full\"} >\n {children ? children({\n values: selectedFiles,\n browse: onPick,\n update: updateFiles,\n remove: (index: number) => removeFile(index)(),\n type: isImage ? 'image' : 'file',\n isMultiple: !isOneFile,\n }) : (\n <>\n {isImage && isOneFile && <SingleImageUploader />}\n {!isImage && isOneFile && <SingleFileUploader />}\n {!isImage && !isOneFile && <MultipleFileUploader />}\n {isImage && !isOneFile && <MultipleImageUploader />}\n </>\n )}\n </Flex>\n </FileUploaderContext.Provider>\n );\n};\n\nexport default MainUploader;\nexport const useUploader = () => useContext(FileUploaderContext);\n"],"names":["createContext","useRef","useState","useMemo","toMemes","launchImageLibrary","useEffect","getType","AnyFile","jsx","Flex","jsxs","Fragment","SingleImageUploader","SingleFileUploader","MultipleFileUploader","MultipleImageUploader","useContext"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../../src/form/file-pickers/MainUploader/index.native.tsx"],"sourcesContent":["import React, {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport DocumentPicker, { type DocumentPickerOptions } from \"react-native-document-picker\";\nimport { launchImageLibrary } from \"react-native-image-picker\";\nimport RNFS from \"react-native-fs\";\n\nimport {type IFileUploader, type File, type IMemes, toMemes} from \"@lmb-it/kitsconcerto-types\";\nimport { getType } from \"@lmb-it/kitsconcerto-types\";\nimport { Flex } from \"../../../_compat\";\n\nimport SingleFileUploader from \"../SingleFileUploader\";\nimport MultipleFileUploader from \"../MultipleFileUploader\";\nimport SingleImageUploader from \"../SingleImageUploader\";\nimport MultipleImageUploader from \"../MultipleImageUploader\";\nimport {AnyFile} from \"../../../utils\";\n\ntype Base64Item = { filename: string; base64: string; type: string };\n\ninterface IFileUploaderContextValues {\n onChangeAnyFileUploader(files: File[]): void;\n onPick(): void;\n removeFile(fileIndex: number): () => void;\n onInvalidInput(errors: any): void;\n\n selectedFiles: File[];\n selectedInitialFiles: string[];\n\n placeholder?: string;\n disabled?: boolean;\n isClassicUploader: boolean;\n limit: number;\n acceptedMemes: string[]; // mime list\n files: { name: string; ext: string; shortName: string; file: { uri: string } | string }[];\n id: string;\n isImage: boolean;\n}\n\nexport const FileUploaderContext = createContext<IFileUploaderContextValues>({\n onChangeAnyFileUploader: () => {\n },\n onPick: () => {},\n removeFile: () => () => {},\n onInvalidInput: () => {},\n disabled: false,\n limit: 1,\n isClassicUploader: true,\n selectedInitialFiles: [],\n selectedFiles: [],\n acceptedMemes: [],\n files: [],\n id: \"\",\n isImage: false,\n});\n\nconst stripExt = (name: string) => name.replace(/\\.[^/.]+$/, \"\");\nconst getExt = (name: string) => (name.split(\".\").pop() ?? \"\").toLowerCase();\n\nconst readFileAsBase64 = async (uri: string) => {\n // DocumentPicker returns fileCopyUri when copyTo is used; use that when possible\n // RNFS expects file paths without \"file://\"\n const path = uri.startsWith(\"file://\") ? uri.replace(\"file://\", \"\") : uri;\n return RNFS.readFile(path, \"base64\");\n};\n\nconst MainUploader = (props: IFileUploader) => {\n const {\n acceptedTypes,\n type,\n classicUploader = true,\n limit = 1,\n onError,\n onFocus,\n placeholder,\n defaultValue,\n multiple,\n isJsonOutput = true,\n onChange,\n value,\n name,\n disabled,\n maxFileSize,\n minFileSize,\n children,\n } = props;\n\n const initialValueSynced = useRef(false);\n\n const [selectedFiles, setSelectedFiles] = useState<File[]>([]);\n const [selectedInitialFiles, setSelectedInitialFiles] = useState<string[]>([]);\n const [selectedFilesAsBase64, setSelectedFilesAsBase64] = useState<Base64Item[]>([]);\n\n const isImage = type === \"Image\";\n const isOneFile = !multiple || limit < 2;\n\n const onInvalidInput = (err: any) => onError?.(err);\n\n const acceptedMemes = useMemo(() => {\n return acceptedTypes ? toMemes(acceptedTypes) : toMemes(['allFiles']);\n }, [acceptedTypes]);\n\n const validateSize = (sizeBytes?: number) => {\n if (!sizeBytes) return true;\n const sizeKB = sizeBytes / 1000;\n if (maxFileSize && sizeKB > maxFileSize) return false;\n return !(minFileSize && sizeKB < minFileSize);\n\n };\n\n const pickDocuments = async () => {\n try {\n const types:DocumentPickerOptions = {\n allowMultiSelection: !isOneFile,\n // copy to cache so we can read base64 reliably\n copyTo: \"cachesDirectory\",\n // DocumentPicker supports mime list; if empty let OS choose anything\n type: acceptedMemes.length ? acceptedMemes : [DocumentPicker.types.allFiles],\n }\n\n const res = await DocumentPicker.pick(types);\n\n const docs = (Array.isArray(res) ? res : [res]).map((d) => ({\n uri: (d.fileCopyUri || d.uri) as string,\n name: d.name || \"file\",\n type: d.type || undefined,\n size: d.size || undefined,\n }));\n\n const filtered = docs.filter((d) => {\n const ok = validateSize(d.size);\n if (!ok) {\n onInvalidInput(`File \"${d.name}\" size is not allowed`);\n }\n return ok;\n });\n\n if (!filtered.length) return;\n setSelectedFiles((prev) => {\n if (isOneFile) {\n const [first] = filtered;\n return first ? [first] : prev;\n }\n return [...prev, ...filtered];\n });\n onInvalidInput(\"clear\");\n } catch (e: any) {\n if (DocumentPicker.isCancel(e)) return;\n onInvalidInput(e);\n }\n };\n\n const pickImages = async () => {\n try {\n const res = await launchImageLibrary({\n mediaType: \"photo\",\n selectionLimit: isOneFile ? 1 : limit,\n includeBase64: true,\n });\n\n if (res.didCancel) return;\n if (res.errorCode) {\n onInvalidInput(res.errorMessage || res.errorCode);\n return;\n }\n\n const assets = res.assets || [];\n const mapped: File[] = assets\n .filter((a) => !!a.uri)\n .map((a) => ({\n uri: a.uri!,\n name: a.fileName || \"image\",\n type: a.type || \"image/jpeg\",\n size: a.fileSize,\n }))\n .filter((f) => {\n const ok = validateSize(f.size);\n if (!ok) onInvalidInput(`File \"${f.name}\" size is not allowed`);\n return ok;\n });\n\n if (!mapped.length) return;\n\n setSelectedFiles((prev) => {\n if (isOneFile) {\n const [first] = mapped;\n return first ? [first] : prev;\n }\n return [...prev, ...mapped];\n });\n\n onInvalidInput(\"clear\");\n\n // for images, we already have base64 in the picker response; store it immediately\n const b64: Base64Item[] = assets\n .filter((a) => !!a.base64)\n .map((a) => ({\n filename: stripExt(a.fileName || \"image\"),\n base64: a.base64!,\n type: a.type || \"image/jpeg\",\n }));\n\n // keep order aligned with selectedFiles: for single this is OK; for multi, append\n setSelectedFilesAsBase64((prev) => (isOneFile ? b64.slice(0, 1) : [...prev, ...b64]));\n } catch (e: any) {\n onInvalidInput(e);\n }\n };\n\n const onChangeAnyFileUploader = (files: File[]) => {\n if (disabled) {\n return;\n }\n const filesList: any[] = [];\n\n setSelectedFilesAsBase64([]);\n for (let i = 0; i < files.length; i++) {\n const f = files[i];\n if (f) {\n // @ts-ignore\n const fileSize = f.size / 1000; // size in KB\n\n if ((!maxFileSize || fileSize <= maxFileSize) && (!minFileSize || fileSize >= minFileSize)) {\n filesList.push(f);\n onInvalidInput('clear')\n } else {\n let message = `File \"${f.name}\" is `;\n\n if (maxFileSize && fileSize > maxFileSize) {\n message += `too large. Maximum allowed is ${maxFileSize/1000} MB.`;\n } else if (minFileSize && fileSize < minFileSize) {\n message += `too small. Minimum allowed is ${minFileSize/1000} MB.`;\n }\n\n console.log(message)\n onInvalidInput(message);\n }\n }\n }\n\n if (!isOneFile) {\n setSelectedFiles(prevState => {\n return [...prevState, ...filesList];\n });\n } else {\n if (filesList.length)\n setSelectedFiles(filesList.slice(0, 1));\n }\n };\n const onPick = async () => {\n if (disabled) return;\n if (isImage) return pickImages();\n return pickDocuments();\n };\n\n const removeFile = (fileIndex: number) => () => {\n if (fileIndex < selectedInitialFiles.length) {\n setSelectedInitialFiles((prev) => prev.filter((_, i) => i !== fileIndex));\n return;\n }\n\n const editIndex = fileIndex - selectedInitialFiles.length;\n setSelectedFiles((prev) => prev.filter((_, i) => i !== editIndex));\n setSelectedFilesAsBase64((prev) => prev.filter((_, i) => i !== editIndex));\n };\n\n // Convert picked documents to base64 (images handled by picker includeBase64)\n useEffect(() => {\n if (isImage) return;\n\n const run = async () => {\n try {\n const next: Base64Item[] = [];\n for (const f of selectedFiles) {\n // only for documents; images might not be readable via RNFS content URIs\n const b64 = await readFileAsBase64(f.uri);\n next.push({\n filename: stripExt(f.name),\n base64: b64,\n type: f.type || getType(getExt(f.name) as any) || \"application/octet-stream\",\n });\n }\n setSelectedFilesAsBase64(next);\n } catch (e) {\n onInvalidInput(e);\n }\n };\n\n run().then(r => {\n\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedFiles, isImage]);\n\n // Emit onChange\n useEffect(() => {\n if (disabled) return;\n\n if (!selectedFiles.length && !selectedInitialFiles.length) {\n onChange?.([], []);\n return;\n }\n\n // Respect isJsonOutput (web behavior):\n // - when true: use base64Data output\n // - when false: still return picked files list (native file objects)\n // Output shape is platform-specific via types.native.ts\n if (isJsonOutput) {\n if (selectedFilesAsBase64.length === selectedFiles.length || isImage) {\n onChange?.(selectedFiles as any, selectedFilesAsBase64);\n }\n } else {\n onChange?.(selectedFiles as any, selectedFilesAsBase64);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedFilesAsBase64, selectedInitialFiles, selectedFiles]);\n\n // defaultValue + controlled value sync\n useEffect(() => {\n if (defaultValue) {\n setSelectedInitialFiles(Array.isArray(defaultValue) ? defaultValue : [defaultValue]);\n }\n }, [defaultValue]);\n\n useEffect(() => {\n if (initialValueSynced.current) return;\n if (value) {\n setSelectedInitialFiles(Array.isArray(value) ? value : [value]);\n }\n initialValueSynced.current = true;\n }, [value]);\n\n const display = useMemo(() => {\n const fromInitial = selectedInitialFiles.map((uri) => ({\n name: uri.split(\"/\").pop() ?? uri,\n shortName:AnyFile.shortName(uri),\n ext: getExt(uri),\n file: { uri },\n }));\n\n const fromPicked = selectedFiles.map((f) => ({\n name: f.name,\n shortName:AnyFile.shortName(f.name),\n ext: getExt(f.name),\n file: { uri: f.uri },\n }));\n\n return [...fromInitial, ...fromPicked];\n }, [selectedFiles, selectedInitialFiles]);\n\n /** Replace entire file selection (for template's update callback) */\n const updateFiles = (files: File | File[]) => {\n const arr = Array.isArray(files) ? files : [files];\n setSelectedFiles(arr);\n setSelectedInitialFiles([]);\n setSelectedFilesAsBase64([]);\n };\n\n const contextValue = {\n onChangeAnyFileUploader,\n onPick,\n removeFile,\n onInvalidInput,\n selectedFiles,\n selectedInitialFiles,\n disabled,\n limit,\n placeholder,\n isClassicUploader: classicUploader,\n acceptedMemes,\n files: display,\n id: name ?? \"\",\n isImage,\n };\n\n return (\n <FileUploaderContext.Provider value={contextValue}>\n <Flex onFocus={onFocus as any} w={\"full\"} >\n {children ? children({\n values: selectedFiles,\n browse: onPick,\n update: updateFiles,\n remove: (index: number) => removeFile(index)(),\n type: isImage ? 'image' : 'file',\n isMultiple: !isOneFile,\n }) : (\n <>\n {isImage && isOneFile && <SingleImageUploader />}\n {!isImage && isOneFile && <SingleFileUploader />}\n {!isImage && !isOneFile && <MultipleFileUploader />}\n {isImage && !isOneFile && <MultipleImageUploader />}\n </>\n )}\n </Flex>\n </FileUploaderContext.Provider>\n );\n};\n\nexport default MainUploader;\nexport const useUploader = () => useContext(FileUploaderContext);\n"],"names":["createContext","useRef","useState","useMemo","toMemes","launchImageLibrary","useEffect","getType","AnyFile","jsx","Flex","jsxs","Fragment","SingleImageUploader","SingleFileUploader","MultipleFileUploader","MultipleImageUploader","useContext"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA2CO,MAAM,sBAAsBA,mBAAA,CAA0C;AAAA,EACzE,yBAAyB,MAAM;AAAA,EAC/B,CAAA;AAAA,EACA,QAAQ,MAAM;AAAA,EAAC,CAAA;AAAA,EACf,UAAA,EAAY,MAAM,MAAM;AAAA,EAAC,CAAA;AAAA,EACzB,gBAAgB,MAAM;AAAA,EAAC,CAAA;AAAA,EACvB,QAAA,EAAU,KAAA;AAAA,EACV,KAAA,EAAO,CAAA;AAAA,EACP,iBAAA,EAAmB,IAAA;AAAA,EACnB,sBAAsB,EAAC;AAAA,EACvB,eAAe,EAAC;AAAA,EAChB,eAAe,EAAC;AAAA,EAChB,OAAO,EAAC;AAAA,EACR,EAAA,EAAI,EAAA;AAAA,EACJ,OAAA,EAAS;AACb,CAAC;AAED,MAAM,WAAW,CAAC,IAAA,KAAiB,IAAA,CAAK,OAAA,CAAQ,aAAa,EAAE,CAAA;AAC/D,MAAM,MAAA,GAAS,CAAC,IAAA,KAAA,CAAkB,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,IAAK,EAAA,EAAI,WAAA,EAAY;AAE3E,MAAM,gBAAA,GAAmB,OAAO,GAAA,KAAgB;AAG5C,EAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,SAAS,IAAI,GAAA,CAAI,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA,GAAI,GAAA;AACtE,EAAA,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,QAAQ,CAAA;AACvC,CAAA;AAEA,MAAM,YAAA,GAAe,CAAC,KAAA,KAAyB;AAC3C,EAAA,MAAM;AAAA,IACF,aAAA;AAAA,IACA,IAAA;AAAA,IACA,eAAA,GAAkB,IAAA;AAAA,IAClB,KAAA,GAAQ,CAAA;AAAA,IACR,OAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA,GAAe,IAAA;AAAA,IACf,QAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACJ,GAAI,KAAA;AAEJ,EAAA,MAAM,kBAAA,GAAqBC,aAAO,KAAK,CAAA;AAEvC,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIC,cAAA,CAAiB,EAAE,CAAA;AAC7D,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAIA,cAAA,CAAmB,EAAE,CAAA;AAC7E,EAAA,MAAM,CAAC,qBAAA,EAAuB,wBAAwB,CAAA,GAAIA,cAAA,CAAuB,EAAE,CAAA;AAEnF,EAAA,MAAM,UAAU,IAAA,KAAS,OAAA;AACzB,EAAA,MAAM,SAAA,GAAY,CAAC,QAAA,IAAY,KAAA,GAAQ,CAAA;AAEvC,EAAA,MAAM,cAAA,GAAiB,CAAC,GAAA,KAAa,OAAA,GAAU,GAAG,CAAA;AAElD,EAAA,MAAM,aAAA,GAAgBC,cAAQ,MAAM;AAChC,IAAA,OAAO,gBAAgBC,kBAAA,CAAQ,aAAa,IAAIA,kBAAA,CAAQ,CAAC,UAAU,CAAC,CAAA;AAAA,EACxE,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,MAAM,YAAA,GAAe,CAAC,SAAA,KAAuB;AACzC,IAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AACvB,IAAA,MAAM,SAAS,SAAA,GAAY,GAAA;AAC3B,IAAA,IAAI,WAAA,IAAe,MAAA,GAAS,WAAA,EAAa,OAAO,KAAA;AAChD,IAAA,OAAO,EAAE,eAAe,MAAA,GAAS,WAAA,CAAA;AAAA,EAErC,CAAA;AAEA,EAAA,MAAM,gBAAgB,YAAY;AAC9B,IAAA,IAAI;AACA,MAAA,MAAM,KAAA,GAA8B;AAAA,QAChC,qBAAqB,CAAC,SAAA;AAAA;AAAA,QAEtB,MAAA,EAAQ,iBAAA;AAAA;AAAA,QAER,MAAM,aAAA,CAAc,MAAA,GAAS,gBAAgB,CAAC,cAAA,CAAe,MAAM,QAAQ;AAAA,OAC/E;AAEA,MAAA,MAAM,GAAA,GAAM,MAAM,cAAA,CAAe,IAAA,CAAK,KAAK,CAAA;AAE3C,MAAA,MAAM,IAAA,GAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,GAAA,GAAM,CAAC,GAAG,CAAA,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACxD,GAAA,EAAM,CAAA,CAAE,WAAA,IAAe,CAAA,CAAE,GAAA;AAAA,QACzB,IAAA,EAAM,EAAE,IAAA,IAAQ,MAAA;AAAA,QAChB,IAAA,EAAM,EAAE,IAAA,IAAQ,KAAA,CAAA;AAAA,QAChB,IAAA,EAAM,EAAE,IAAA,IAAQ,KAAA;AAAA,OACpB,CAAE,CAAA;AAEF,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM;AAChC,QAAA,MAAM,EAAA,GAAK,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AAC9B,QAAA,IAAI,CAAC,EAAA,EAAI;AACL,UAAA,cAAA,CAAe,CAAA,MAAA,EAAS,CAAA,CAAE,IAAI,CAAA,qBAAA,CAAuB,CAAA;AAAA,QACzD;AACA,QAAA,OAAO,EAAA;AAAA,MACX,CAAC,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AACtB,MAAA,gBAAA,CAAiB,CAAC,IAAA,KAAS;AACvB,QAAA,IAAI,SAAA,EAAW;AACX,UAAA,MAAM,CAAC,KAAK,CAAA,GAAI,QAAA;AAChB,UAAA,OAAO,KAAA,GAAQ,CAAC,KAAK,CAAA,GAAI,IAAA;AAAA,QAC7B;AACA,QAAA,OAAO,CAAC,GAAG,IAAA,EAAM,GAAG,QAAQ,CAAA;AAAA,MAChC,CAAC,CAAA;AACD,MAAA,cAAA,CAAe,OAAO,CAAA;AAAA,IAC1B,SAAS,CAAA,EAAQ;AACb,MAAA,IAAI,cAAA,CAAe,QAAA,CAAS,CAAC,CAAA,EAAG;AAChC,MAAA,cAAA,CAAe,CAAC,CAAA;AAAA,IACpB;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,aAAa,YAAY;AAC3B,IAAA,IAAI;AACA,MAAA,MAAM,GAAA,GAAM,MAAMC,yCAAA,CAAmB;AAAA,QACjC,SAAA,EAAW,OAAA;AAAA,QACX,cAAA,EAAgB,YAAY,CAAA,GAAI,KAAA;AAAA,QAChC,aAAA,EAAe;AAAA,OAClB,CAAA;AAED,MAAA,IAAI,IAAI,SAAA,EAAW;AACnB,MAAA,IAAI,IAAI,SAAA,EAAW;AACf,QAAA,cAAA,CAAe,GAAA,CAAI,YAAA,IAAgB,GAAA,CAAI,SAAS,CAAA;AAChD,QAAA;AAAA,MACJ;AAEA,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,IAAU,EAAC;AAC9B,MAAA,MAAM,MAAA,GAAiB,MAAA,CAClB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA,CAAE,GAAG,CAAA,CACrB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACT,KAAK,CAAA,CAAE,GAAA;AAAA,QACP,IAAA,EAAM,EAAE,QAAA,IAAY,OAAA;AAAA,QACpB,IAAA,EAAM,EAAE,IAAA,IAAQ,YAAA;AAAA,QAChB,MAAM,CAAA,CAAE;AAAA,OACZ,CAAE,CAAA,CACD,MAAA,CAAO,CAAC,CAAA,KAAM;AACX,QAAA,MAAM,EAAA,GAAK,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AAC9B,QAAA,IAAI,CAAC,EAAA,EAAI,cAAA,CAAe,CAAA,MAAA,EAAS,CAAA,CAAE,IAAI,CAAA,qBAAA,CAAuB,CAAA;AAC9D,QAAA,OAAO,EAAA;AAAA,MACX,CAAC,CAAA;AAEL,MAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAEpB,MAAA,gBAAA,CAAiB,CAAC,IAAA,KAAS;AACvB,QAAA,IAAI,SAAA,EAAW;AACX,UAAA,MAAM,CAAC,KAAK,CAAA,GAAI,MAAA;AAChB,UAAA,OAAO,KAAA,GAAQ,CAAC,KAAK,CAAA,GAAI,IAAA;AAAA,QAC7B;AACA,QAAA,OAAO,CAAC,GAAG,IAAA,EAAM,GAAG,MAAM,CAAA;AAAA,MAC9B,CAAC,CAAA;AAED,MAAA,cAAA,CAAe,OAAO,CAAA;AAGtB,MAAA,MAAM,GAAA,GAAoB,MAAA,CACrB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA,CAAE,MAAM,CAAA,CACxB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACT,QAAA,EAAU,QAAA,CAAS,CAAA,CAAE,QAAA,IAAY,OAAO,CAAA;AAAA,QACxC,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,IAAA,EAAM,EAAE,IAAA,IAAQ;AAAA,OACpB,CAAE,CAAA;AAGN,MAAA,wBAAA,CAAyB,CAAC,IAAA,KAAU,SAAA,GAAY,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,GAAI,CAAC,GAAG,IAAA,EAAM,GAAG,GAAG,CAAE,CAAA;AAAA,IACxF,SAAS,CAAA,EAAQ;AACb,MAAA,cAAA,CAAe,CAAC,CAAA;AAAA,IACpB;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,uBAAA,GAA0B,CAAC,KAAA,KAAkB;AAC/C,IAAA,IAAI,QAAA,EAAU;AACV,MAAA;AAAA,IACJ;AACA,IAAA,MAAM,YAAmB,EAAC;AAE1B,IAAA,wBAAA,CAAyB,EAAE,CAAA;AAC3B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACnC,MAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,MAAA,IAAI,CAAA,EAAG;AAEH,QAAA,MAAM,QAAA,GAAW,EAAE,IAAA,GAAO,GAAA;AAE1B,QAAA,IAAA,CAAK,CAAC,WAAA,IAAe,QAAA,IAAY,iBAAiB,CAAC,WAAA,IAAe,YAAY,WAAA,CAAA,EAAc;AACxF,UAAA,SAAA,CAAU,KAAK,CAAC,CAAA;AAChB,UAAA,cAAA,CAAe,OAAO,CAAA;AAAA,QAC1B,CAAA,MAAO;AACH,UAAA,IAAI,OAAA,GAAU,CAAA,MAAA,EAAS,CAAA,CAAE,IAAI,CAAA,KAAA,CAAA;AAE7B,UAAA,IAAI,WAAA,IAAe,WAAW,WAAA,EAAa;AACvC,YAAA,OAAA,IAAW,CAAA,8BAAA,EAAiC,cAAY,GAAI,CAAA,IAAA,CAAA;AAAA,UAChE,CAAA,MAAA,IAAW,WAAA,IAAe,QAAA,GAAW,WAAA,EAAa;AAC9C,YAAA,OAAA,IAAW,CAAA,8BAAA,EAAiC,cAAY,GAAI,CAAA,IAAA,CAAA;AAAA,UAChE;AAEA,UAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AACnB,UAAA,cAAA,CAAe,OAAO,CAAA;AAAA,QAC1B;AAAA,MACJ;AAAA,IACJ;AAEA,IAAA,IAAI,CAAC,SAAA,EAAW;AACZ,MAAA,gBAAA,CAAiB,CAAA,SAAA,KAAa;AAC1B,QAAA,OAAO,CAAC,GAAG,SAAA,EAAW,GAAG,SAAS,CAAA;AAAA,MACtC,CAAC,CAAA;AAAA,IACL,CAAA,MAAO;AACH,MAAA,IAAI,SAAA,CAAU,MAAA;AACV,QAAA,gBAAA,CAAiB,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,IAC9C;AAAA,EACJ,CAAA;AACA,EAAA,MAAM,SAAS,YAAY;AACvB,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,IAAI,OAAA,SAAgB,UAAA,EAAW;AAC/B,IAAA,OAAO,aAAA,EAAc;AAAA,EACzB,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,SAAA,KAAsB,MAAM;AAC5C,IAAA,IAAI,SAAA,GAAY,qBAAqB,MAAA,EAAQ;AACzC,MAAA,uBAAA,CAAwB,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,KAAM,SAAS,CAAC,CAAA;AACxE,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,SAAA,GAAY,YAAY,oBAAA,CAAqB,MAAA;AACnD,IAAA,gBAAA,CAAiB,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,KAAM,SAAS,CAAC,CAAA;AACjE,IAAA,wBAAA,CAAyB,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,KAAM,SAAS,CAAC,CAAA;AAAA,EAC7E,CAAA;AAGA,EAAAC,eAAA,CAAU,MAAM;AACZ,IAAA,IAAI,OAAA,EAAS;AAEb,IAAA,MAAM,MAAM,YAAY;AACpB,MAAA,IAAI;AACA,QAAA,MAAM,OAAqB,EAAC;AAC5B,QAAA,KAAA,MAAW,KAAK,aAAA,EAAe;AAE3B,UAAA,MAAM,GAAA,GAAM,MAAM,gBAAA,CAAiB,CAAA,CAAE,GAAG,CAAA;AACxC,UAAA,IAAA,CAAK,IAAA,CAAK;AAAA,YACN,QAAA,EAAU,QAAA,CAAS,CAAA,CAAE,IAAI,CAAA;AAAA,YACzB,MAAA,EAAQ,GAAA;AAAA,YACR,IAAA,EAAM,EAAE,IAAA,IAAQC,kBAAA,CAAQ,OAAO,CAAA,CAAE,IAAI,CAAQ,CAAA,IAAK;AAAA,WACrD,CAAA;AAAA,QACL;AACA,QAAA,wBAAA,CAAyB,IAAI,CAAA;AAAA,MACjC,SAAS,CAAA,EAAG;AACR,QAAA,cAAA,CAAe,CAAC,CAAA;AAAA,MACpB;AAAA,IACJ,CAAA;AAEA,IAAA,GAAA,EAAI,CAAE,KAAK,CAAA,CAAA,KAAK;AAAA,IAEhB,CAAC,CAAA;AAAA,EAEL,CAAA,EAAG,CAAC,aAAA,EAAe,OAAO,CAAC,CAAA;AAG3B,EAAAD,eAAA,CAAU,MAAM;AACZ,IAAA,IAAI,QAAA,EAAU;AAEd,IAAA,IAAI,CAAC,aAAA,CAAc,MAAA,IAAU,CAAC,qBAAqB,MAAA,EAAQ;AACvD,MAAA,QAAA,GAAW,EAAC,EAAG,EAAE,CAAA;AACjB,MAAA;AAAA,IACJ;AAMA,IAAA,IAAI,YAAA,EAAc;AACd,MAAA,IAAI,qBAAA,CAAsB,MAAA,KAAW,aAAA,CAAc,MAAA,IAAU,OAAA,EAAS;AAClE,QAAA,QAAA,GAAW,eAAsB,qBAAqB,CAAA;AAAA,MAC1D;AAAA,IACJ,CAAA,MAAO;AACH,MAAA,QAAA,GAAW,eAAsB,qBAAqB,CAAA;AAAA,IAC1D;AAAA,EAEJ,CAAA,EAAG,CAAC,qBAAA,EAAuB,oBAAA,EAAsB,aAAa,CAAC,CAAA;AAG/D,EAAAA,eAAA,CAAU,MAAM;AACZ,IAAA,IAAI,YAAA,EAAc;AACd,MAAA,uBAAA,CAAwB,MAAM,OAAA,CAAQ,YAAY,IAAI,YAAA,GAAe,CAAC,YAAY,CAAC,CAAA;AAAA,IACvF;AAAA,EACJ,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAAA,eAAA,CAAU,MAAM;AACZ,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAChC,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,uBAAA,CAAwB,MAAM,OAAA,CAAQ,KAAK,IAAI,KAAA,GAAQ,CAAC,KAAK,CAAC,CAAA;AAAA,IAClE;AACA,IAAA,kBAAA,CAAmB,OAAA,GAAU,IAAA;AAAA,EACjC,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,OAAA,GAAUH,cAAQ,MAAM;AAC1B,IAAA,MAAM,WAAA,GAAc,oBAAA,CAAqB,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MACnD,MAAM,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,GAAA;AAAA,MAC9B,SAAA,EAAUK,YAAA,CAAQ,SAAA,CAAU,GAAG,CAAA;AAAA,MAC/B,GAAA,EAAK,OAAO,GAAG,CAAA;AAAA,MACf,IAAA,EAAM,EAAE,GAAA;AAAI,KAChB,CAAE,CAAA;AAEF,IAAA,MAAM,UAAA,GAAa,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACzC,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,SAAA,EAAUA,YAAA,CAAQ,SAAA,CAAU,CAAA,CAAE,IAAI,CAAA;AAAA,MAClC,GAAA,EAAK,MAAA,CAAO,CAAA,CAAE,IAAI,CAAA;AAAA,MAClB,IAAA,EAAM,EAAE,GAAA,EAAK,CAAA,CAAE,GAAA;AAAI,KACvB,CAAE,CAAA;AAEF,IAAA,OAAO,CAAC,GAAG,WAAA,EAAa,GAAG,UAAU,CAAA;AAAA,EACzC,CAAA,EAAG,CAAC,aAAA,EAAe,oBAAoB,CAAC,CAAA;AAGxC,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAyB;AAC1C,IAAA,MAAM,MAAM,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AACjD,IAAA,gBAAA,CAAiB,GAAG,CAAA;AACpB,IAAA,uBAAA,CAAwB,EAAE,CAAA;AAC1B,IAAA,wBAAA,CAAyB,EAAE,CAAA;AAAA,EAC/B,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe;AAAA,IACjB,uBAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,oBAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,iBAAA,EAAmB,eAAA;AAAA,IACnB,aAAA;AAAA,IACA,KAAA,EAAO,OAAA;AAAA,IACP,IAAI,IAAA,IAAQ,EAAA;AAAA,IACZ;AAAA,GACJ;AAEA,EAAA,uBACIC,cAAA,CAAC,mBAAA,CAAoB,QAAA,EAApB,EAA6B,KAAA,EAAO,YAAA,EACjC,QAAA,kBAAAA,cAAA,CAACC,aAAA,EAAA,EAAK,OAAA,EAAyB,CAAA,EAAG,MAAA,EAC7B,QAAA,EAAA,QAAA,GAAW,QAAA,CAAS;AAAA,IACjB,MAAA,EAAQ,aAAA;AAAA,IACR,MAAA,EAAQ,MAAA;AAAA,IACR,MAAA,EAAQ,WAAA;AAAA,IACR,MAAA,EAAQ,CAAC,KAAA,KAAkB,UAAA,CAAW,KAAK,CAAA,EAAE;AAAA,IAC7C,IAAA,EAAM,UAAU,OAAA,GAAU,MAAA;AAAA,IAC1B,YAAY,CAAC;AAAA,GAChB,oBACGC,eAAA,CAAAC,mBAAA,EAAA,EACK,QAAA,EAAA;AAAA,IAAA,OAAA,IAAW,SAAA,mCAAcC,oBAAA,EAAA,EAAoB,CAAA;AAAA,IAC7C,CAAC,OAAA,IAAW,SAAA,oBAAaJ,cAAA,CAACK,sBAAA,EAAA,EAAmB,CAAA;AAAA,IAC7C,CAAC,OAAA,IAAW,CAAC,SAAA,mCAAcC,sBAAA,EAAA,EAAqB,CAAA;AAAA,IAChD,OAAA,IAAW,CAAC,SAAA,oBAAaN,cAAA,CAACO,sBAAA,EAAA,EAAsB;AAAA,GAAA,EACrD,GAER,CAAA,EACJ,CAAA;AAER;AAGO,MAAM,WAAA,GAAc,MAAMC,gBAAA,CAAW,mBAAmB;;;;;;"}
|
|
@@ -11,6 +11,7 @@ import 'yup';
|
|
|
11
11
|
import '../../../packages/types/src/Css/map/index.js';
|
|
12
12
|
import '../../../packages/types/src/Theme/shadows.js';
|
|
13
13
|
import '../../../packages/types/src/Theme/defaultTheme.js';
|
|
14
|
+
import '../../../packages/types/src/Theme/resolvers.js';
|
|
14
15
|
import '../../../packages/types/src/Theme/alphaColors.js';
|
|
15
16
|
import SingleFileUploader from '../SingleFileUploader/index.js';
|
|
16
17
|
import MultipleFileUploader from '../MultipleFileUploader/index.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../src/form/file-pickers/MainUploader/index.native.tsx"],"sourcesContent":["import React, {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport DocumentPicker, { type DocumentPickerOptions } from \"react-native-document-picker\";\nimport { launchImageLibrary } from \"react-native-image-picker\";\nimport RNFS from \"react-native-fs\";\n\nimport {type IFileUploader, type File, type IMemes, toMemes} from \"@lmb-it/kitsconcerto-types\";\nimport { getType } from \"@lmb-it/kitsconcerto-types\";\nimport { Flex } from \"../../../_compat\";\n\nimport SingleFileUploader from \"../SingleFileUploader\";\nimport MultipleFileUploader from \"../MultipleFileUploader\";\nimport SingleImageUploader from \"../SingleImageUploader\";\nimport MultipleImageUploader from \"../MultipleImageUploader\";\nimport {AnyFile} from \"../../../utils\";\n\ntype Base64Item = { filename: string; base64: string; type: string };\n\ninterface IFileUploaderContextValues {\n onChangeAnyFileUploader(files: File[]): void;\n onPick(): void;\n removeFile(fileIndex: number): () => void;\n onInvalidInput(errors: any): void;\n\n selectedFiles: File[];\n selectedInitialFiles: string[];\n\n placeholder?: string;\n disabled?: boolean;\n isClassicUploader: boolean;\n limit: number;\n acceptedMemes: string[]; // mime list\n files: { name: string; ext: string; shortName: string; file: { uri: string } | string }[];\n id: string;\n isImage: boolean;\n}\n\nexport const FileUploaderContext = createContext<IFileUploaderContextValues>({\n onChangeAnyFileUploader: () => {\n },\n onPick: () => {},\n removeFile: () => () => {},\n onInvalidInput: () => {},\n disabled: false,\n limit: 1,\n isClassicUploader: true,\n selectedInitialFiles: [],\n selectedFiles: [],\n acceptedMemes: [],\n files: [],\n id: \"\",\n isImage: false,\n});\n\nconst stripExt = (name: string) => name.replace(/\\.[^/.]+$/, \"\");\nconst getExt = (name: string) => (name.split(\".\").pop() ?? \"\").toLowerCase();\n\nconst readFileAsBase64 = async (uri: string) => {\n // DocumentPicker returns fileCopyUri when copyTo is used; use that when possible\n // RNFS expects file paths without \"file://\"\n const path = uri.startsWith(\"file://\") ? uri.replace(\"file://\", \"\") : uri;\n return RNFS.readFile(path, \"base64\");\n};\n\nconst MainUploader = (props: IFileUploader) => {\n const {\n acceptedTypes,\n type,\n classicUploader = true,\n limit = 1,\n onError,\n onFocus,\n placeholder,\n defaultValue,\n multiple,\n isJsonOutput = true,\n onChange,\n value,\n name,\n disabled,\n maxFileSize,\n minFileSize,\n children,\n } = props;\n\n const initialValueSynced = useRef(false);\n\n const [selectedFiles, setSelectedFiles] = useState<File[]>([]);\n const [selectedInitialFiles, setSelectedInitialFiles] = useState<string[]>([]);\n const [selectedFilesAsBase64, setSelectedFilesAsBase64] = useState<Base64Item[]>([]);\n\n const isImage = type === \"Image\";\n const isOneFile = !multiple || limit < 2;\n\n const onInvalidInput = (err: any) => onError?.(err);\n\n const acceptedMemes = useMemo(() => {\n return acceptedTypes ? toMemes(acceptedTypes) : toMemes(['allFiles']);\n }, [acceptedTypes]);\n\n const validateSize = (sizeBytes?: number) => {\n if (!sizeBytes) return true;\n const sizeKB = sizeBytes / 1000;\n if (maxFileSize && sizeKB > maxFileSize) return false;\n return !(minFileSize && sizeKB < minFileSize);\n\n };\n\n const pickDocuments = async () => {\n try {\n const types:DocumentPickerOptions = {\n allowMultiSelection: !isOneFile,\n // copy to cache so we can read base64 reliably\n copyTo: \"cachesDirectory\",\n // DocumentPicker supports mime list; if empty let OS choose anything\n type: acceptedMemes.length ? acceptedMemes : [DocumentPicker.types.allFiles],\n }\n\n const res = await DocumentPicker.pick(types);\n\n const docs = (Array.isArray(res) ? res : [res]).map((d) => ({\n uri: (d.fileCopyUri || d.uri) as string,\n name: d.name || \"file\",\n type: d.type || undefined,\n size: d.size || undefined,\n }));\n\n const filtered = docs.filter((d) => {\n const ok = validateSize(d.size);\n if (!ok) {\n onInvalidInput(`File \"${d.name}\" size is not allowed`);\n }\n return ok;\n });\n\n if (!filtered.length) return;\n setSelectedFiles((prev) => {\n if (isOneFile) {\n const [first] = filtered;\n return first ? [first] : prev;\n }\n return [...prev, ...filtered];\n });\n onInvalidInput(\"clear\");\n } catch (e: any) {\n if (DocumentPicker.isCancel(e)) return;\n onInvalidInput(e);\n }\n };\n\n const pickImages = async () => {\n try {\n const res = await launchImageLibrary({\n mediaType: \"photo\",\n selectionLimit: isOneFile ? 1 : limit,\n includeBase64: true,\n });\n\n if (res.didCancel) return;\n if (res.errorCode) {\n onInvalidInput(res.errorMessage || res.errorCode);\n return;\n }\n\n const assets = res.assets || [];\n const mapped: File[] = assets\n .filter((a) => !!a.uri)\n .map((a) => ({\n uri: a.uri!,\n name: a.fileName || \"image\",\n type: a.type || \"image/jpeg\",\n size: a.fileSize,\n }))\n .filter((f) => {\n const ok = validateSize(f.size);\n if (!ok) onInvalidInput(`File \"${f.name}\" size is not allowed`);\n return ok;\n });\n\n if (!mapped.length) return;\n\n setSelectedFiles((prev) => {\n if (isOneFile) {\n const [first] = mapped;\n return first ? [first] : prev;\n }\n return [...prev, ...mapped];\n });\n\n onInvalidInput(\"clear\");\n\n // for images, we already have base64 in the picker response; store it immediately\n const b64: Base64Item[] = assets\n .filter((a) => !!a.base64)\n .map((a) => ({\n filename: stripExt(a.fileName || \"image\"),\n base64: a.base64!,\n type: a.type || \"image/jpeg\",\n }));\n\n // keep order aligned with selectedFiles: for single this is OK; for multi, append\n setSelectedFilesAsBase64((prev) => (isOneFile ? b64.slice(0, 1) : [...prev, ...b64]));\n } catch (e: any) {\n onInvalidInput(e);\n }\n };\n\n const onChangeAnyFileUploader = (files: File[]) => {\n if (disabled) {\n return;\n }\n const filesList: any[] = [];\n\n setSelectedFilesAsBase64([]);\n for (let i = 0; i < files.length; i++) {\n const f = files[i];\n if (f) {\n // @ts-ignore\n const fileSize = f.size / 1000; // size in KB\n\n if ((!maxFileSize || fileSize <= maxFileSize) && (!minFileSize || fileSize >= minFileSize)) {\n filesList.push(f);\n onInvalidInput('clear')\n } else {\n let message = `File \"${f.name}\" is `;\n\n if (maxFileSize && fileSize > maxFileSize) {\n message += `too large. Maximum allowed is ${maxFileSize/1000} MB.`;\n } else if (minFileSize && fileSize < minFileSize) {\n message += `too small. Minimum allowed is ${minFileSize/1000} MB.`;\n }\n\n console.log(message)\n onInvalidInput(message);\n }\n }\n }\n\n if (!isOneFile) {\n setSelectedFiles(prevState => {\n return [...prevState, ...filesList];\n });\n } else {\n if (filesList.length)\n setSelectedFiles(filesList.slice(0, 1));\n }\n };\n const onPick = async () => {\n if (disabled) return;\n if (isImage) return pickImages();\n return pickDocuments();\n };\n\n const removeFile = (fileIndex: number) => () => {\n if (fileIndex < selectedInitialFiles.length) {\n setSelectedInitialFiles((prev) => prev.filter((_, i) => i !== fileIndex));\n return;\n }\n\n const editIndex = fileIndex - selectedInitialFiles.length;\n setSelectedFiles((prev) => prev.filter((_, i) => i !== editIndex));\n setSelectedFilesAsBase64((prev) => prev.filter((_, i) => i !== editIndex));\n };\n\n // Convert picked documents to base64 (images handled by picker includeBase64)\n useEffect(() => {\n if (isImage) return;\n\n const run = async () => {\n try {\n const next: Base64Item[] = [];\n for (const f of selectedFiles) {\n // only for documents; images might not be readable via RNFS content URIs\n const b64 = await readFileAsBase64(f.uri);\n next.push({\n filename: stripExt(f.name),\n base64: b64,\n type: f.type || getType(getExt(f.name) as any) || \"application/octet-stream\",\n });\n }\n setSelectedFilesAsBase64(next);\n } catch (e) {\n onInvalidInput(e);\n }\n };\n\n run().then(r => {\n\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedFiles, isImage]);\n\n // Emit onChange\n useEffect(() => {\n if (disabled) return;\n\n if (!selectedFiles.length && !selectedInitialFiles.length) {\n onChange?.([], []);\n return;\n }\n\n // Respect isJsonOutput (web behavior):\n // - when true: use base64Data output\n // - when false: still return picked files list (native file objects)\n // Output shape is platform-specific via types.native.ts\n if (isJsonOutput) {\n if (selectedFilesAsBase64.length === selectedFiles.length || isImage) {\n onChange?.(selectedFiles as any, selectedFilesAsBase64);\n }\n } else {\n onChange?.(selectedFiles as any, selectedFilesAsBase64);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedFilesAsBase64, selectedInitialFiles, selectedFiles]);\n\n // defaultValue + controlled value sync\n useEffect(() => {\n if (defaultValue) {\n setSelectedInitialFiles(Array.isArray(defaultValue) ? defaultValue : [defaultValue]);\n }\n }, [defaultValue]);\n\n useEffect(() => {\n if (initialValueSynced.current) return;\n if (value) {\n setSelectedInitialFiles(Array.isArray(value) ? value : [value]);\n }\n initialValueSynced.current = true;\n }, [value]);\n\n const display = useMemo(() => {\n const fromInitial = selectedInitialFiles.map((uri) => ({\n name: uri.split(\"/\").pop() ?? uri,\n shortName:AnyFile.shortName(uri),\n ext: getExt(uri),\n file: { uri },\n }));\n\n const fromPicked = selectedFiles.map((f) => ({\n name: f.name,\n shortName:AnyFile.shortName(f.name),\n ext: getExt(f.name),\n file: { uri: f.uri },\n }));\n\n return [...fromInitial, ...fromPicked];\n }, [selectedFiles, selectedInitialFiles]);\n\n /** Replace entire file selection (for template's update callback) */\n const updateFiles = (files: File | File[]) => {\n const arr = Array.isArray(files) ? files : [files];\n setSelectedFiles(arr);\n setSelectedInitialFiles([]);\n setSelectedFilesAsBase64([]);\n };\n\n const contextValue = {\n onChangeAnyFileUploader,\n onPick,\n removeFile,\n onInvalidInput,\n selectedFiles,\n selectedInitialFiles,\n disabled,\n limit,\n placeholder,\n isClassicUploader: classicUploader,\n acceptedMemes,\n files: display,\n id: name ?? \"\",\n isImage,\n };\n\n return (\n <FileUploaderContext.Provider value={contextValue}>\n <Flex onFocus={onFocus as any} w={\"full\"} >\n {children ? children({\n values: selectedFiles,\n browse: onPick,\n update: updateFiles,\n remove: (index: number) => removeFile(index)(),\n type: isImage ? 'image' : 'file',\n isMultiple: !isOneFile,\n }) : (\n <>\n {isImage && isOneFile && <SingleImageUploader />}\n {!isImage && isOneFile && <SingleFileUploader />}\n {!isImage && !isOneFile && <MultipleFileUploader />}\n {isImage && !isOneFile && <MultipleImageUploader />}\n </>\n )}\n </Flex>\n </FileUploaderContext.Provider>\n );\n};\n\nexport default MainUploader;\nexport const useUploader = () => useContext(FileUploaderContext);\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../src/form/file-pickers/MainUploader/index.native.tsx"],"sourcesContent":["import React, {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport DocumentPicker, { type DocumentPickerOptions } from \"react-native-document-picker\";\nimport { launchImageLibrary } from \"react-native-image-picker\";\nimport RNFS from \"react-native-fs\";\n\nimport {type IFileUploader, type File, type IMemes, toMemes} from \"@lmb-it/kitsconcerto-types\";\nimport { getType } from \"@lmb-it/kitsconcerto-types\";\nimport { Flex } from \"../../../_compat\";\n\nimport SingleFileUploader from \"../SingleFileUploader\";\nimport MultipleFileUploader from \"../MultipleFileUploader\";\nimport SingleImageUploader from \"../SingleImageUploader\";\nimport MultipleImageUploader from \"../MultipleImageUploader\";\nimport {AnyFile} from \"../../../utils\";\n\ntype Base64Item = { filename: string; base64: string; type: string };\n\ninterface IFileUploaderContextValues {\n onChangeAnyFileUploader(files: File[]): void;\n onPick(): void;\n removeFile(fileIndex: number): () => void;\n onInvalidInput(errors: any): void;\n\n selectedFiles: File[];\n selectedInitialFiles: string[];\n\n placeholder?: string;\n disabled?: boolean;\n isClassicUploader: boolean;\n limit: number;\n acceptedMemes: string[]; // mime list\n files: { name: string; ext: string; shortName: string; file: { uri: string } | string }[];\n id: string;\n isImage: boolean;\n}\n\nexport const FileUploaderContext = createContext<IFileUploaderContextValues>({\n onChangeAnyFileUploader: () => {\n },\n onPick: () => {},\n removeFile: () => () => {},\n onInvalidInput: () => {},\n disabled: false,\n limit: 1,\n isClassicUploader: true,\n selectedInitialFiles: [],\n selectedFiles: [],\n acceptedMemes: [],\n files: [],\n id: \"\",\n isImage: false,\n});\n\nconst stripExt = (name: string) => name.replace(/\\.[^/.]+$/, \"\");\nconst getExt = (name: string) => (name.split(\".\").pop() ?? \"\").toLowerCase();\n\nconst readFileAsBase64 = async (uri: string) => {\n // DocumentPicker returns fileCopyUri when copyTo is used; use that when possible\n // RNFS expects file paths without \"file://\"\n const path = uri.startsWith(\"file://\") ? uri.replace(\"file://\", \"\") : uri;\n return RNFS.readFile(path, \"base64\");\n};\n\nconst MainUploader = (props: IFileUploader) => {\n const {\n acceptedTypes,\n type,\n classicUploader = true,\n limit = 1,\n onError,\n onFocus,\n placeholder,\n defaultValue,\n multiple,\n isJsonOutput = true,\n onChange,\n value,\n name,\n disabled,\n maxFileSize,\n minFileSize,\n children,\n } = props;\n\n const initialValueSynced = useRef(false);\n\n const [selectedFiles, setSelectedFiles] = useState<File[]>([]);\n const [selectedInitialFiles, setSelectedInitialFiles] = useState<string[]>([]);\n const [selectedFilesAsBase64, setSelectedFilesAsBase64] = useState<Base64Item[]>([]);\n\n const isImage = type === \"Image\";\n const isOneFile = !multiple || limit < 2;\n\n const onInvalidInput = (err: any) => onError?.(err);\n\n const acceptedMemes = useMemo(() => {\n return acceptedTypes ? toMemes(acceptedTypes) : toMemes(['allFiles']);\n }, [acceptedTypes]);\n\n const validateSize = (sizeBytes?: number) => {\n if (!sizeBytes) return true;\n const sizeKB = sizeBytes / 1000;\n if (maxFileSize && sizeKB > maxFileSize) return false;\n return !(minFileSize && sizeKB < minFileSize);\n\n };\n\n const pickDocuments = async () => {\n try {\n const types:DocumentPickerOptions = {\n allowMultiSelection: !isOneFile,\n // copy to cache so we can read base64 reliably\n copyTo: \"cachesDirectory\",\n // DocumentPicker supports mime list; if empty let OS choose anything\n type: acceptedMemes.length ? acceptedMemes : [DocumentPicker.types.allFiles],\n }\n\n const res = await DocumentPicker.pick(types);\n\n const docs = (Array.isArray(res) ? res : [res]).map((d) => ({\n uri: (d.fileCopyUri || d.uri) as string,\n name: d.name || \"file\",\n type: d.type || undefined,\n size: d.size || undefined,\n }));\n\n const filtered = docs.filter((d) => {\n const ok = validateSize(d.size);\n if (!ok) {\n onInvalidInput(`File \"${d.name}\" size is not allowed`);\n }\n return ok;\n });\n\n if (!filtered.length) return;\n setSelectedFiles((prev) => {\n if (isOneFile) {\n const [first] = filtered;\n return first ? [first] : prev;\n }\n return [...prev, ...filtered];\n });\n onInvalidInput(\"clear\");\n } catch (e: any) {\n if (DocumentPicker.isCancel(e)) return;\n onInvalidInput(e);\n }\n };\n\n const pickImages = async () => {\n try {\n const res = await launchImageLibrary({\n mediaType: \"photo\",\n selectionLimit: isOneFile ? 1 : limit,\n includeBase64: true,\n });\n\n if (res.didCancel) return;\n if (res.errorCode) {\n onInvalidInput(res.errorMessage || res.errorCode);\n return;\n }\n\n const assets = res.assets || [];\n const mapped: File[] = assets\n .filter((a) => !!a.uri)\n .map((a) => ({\n uri: a.uri!,\n name: a.fileName || \"image\",\n type: a.type || \"image/jpeg\",\n size: a.fileSize,\n }))\n .filter((f) => {\n const ok = validateSize(f.size);\n if (!ok) onInvalidInput(`File \"${f.name}\" size is not allowed`);\n return ok;\n });\n\n if (!mapped.length) return;\n\n setSelectedFiles((prev) => {\n if (isOneFile) {\n const [first] = mapped;\n return first ? [first] : prev;\n }\n return [...prev, ...mapped];\n });\n\n onInvalidInput(\"clear\");\n\n // for images, we already have base64 in the picker response; store it immediately\n const b64: Base64Item[] = assets\n .filter((a) => !!a.base64)\n .map((a) => ({\n filename: stripExt(a.fileName || \"image\"),\n base64: a.base64!,\n type: a.type || \"image/jpeg\",\n }));\n\n // keep order aligned with selectedFiles: for single this is OK; for multi, append\n setSelectedFilesAsBase64((prev) => (isOneFile ? b64.slice(0, 1) : [...prev, ...b64]));\n } catch (e: any) {\n onInvalidInput(e);\n }\n };\n\n const onChangeAnyFileUploader = (files: File[]) => {\n if (disabled) {\n return;\n }\n const filesList: any[] = [];\n\n setSelectedFilesAsBase64([]);\n for (let i = 0; i < files.length; i++) {\n const f = files[i];\n if (f) {\n // @ts-ignore\n const fileSize = f.size / 1000; // size in KB\n\n if ((!maxFileSize || fileSize <= maxFileSize) && (!minFileSize || fileSize >= minFileSize)) {\n filesList.push(f);\n onInvalidInput('clear')\n } else {\n let message = `File \"${f.name}\" is `;\n\n if (maxFileSize && fileSize > maxFileSize) {\n message += `too large. Maximum allowed is ${maxFileSize/1000} MB.`;\n } else if (minFileSize && fileSize < minFileSize) {\n message += `too small. Minimum allowed is ${minFileSize/1000} MB.`;\n }\n\n console.log(message)\n onInvalidInput(message);\n }\n }\n }\n\n if (!isOneFile) {\n setSelectedFiles(prevState => {\n return [...prevState, ...filesList];\n });\n } else {\n if (filesList.length)\n setSelectedFiles(filesList.slice(0, 1));\n }\n };\n const onPick = async () => {\n if (disabled) return;\n if (isImage) return pickImages();\n return pickDocuments();\n };\n\n const removeFile = (fileIndex: number) => () => {\n if (fileIndex < selectedInitialFiles.length) {\n setSelectedInitialFiles((prev) => prev.filter((_, i) => i !== fileIndex));\n return;\n }\n\n const editIndex = fileIndex - selectedInitialFiles.length;\n setSelectedFiles((prev) => prev.filter((_, i) => i !== editIndex));\n setSelectedFilesAsBase64((prev) => prev.filter((_, i) => i !== editIndex));\n };\n\n // Convert picked documents to base64 (images handled by picker includeBase64)\n useEffect(() => {\n if (isImage) return;\n\n const run = async () => {\n try {\n const next: Base64Item[] = [];\n for (const f of selectedFiles) {\n // only for documents; images might not be readable via RNFS content URIs\n const b64 = await readFileAsBase64(f.uri);\n next.push({\n filename: stripExt(f.name),\n base64: b64,\n type: f.type || getType(getExt(f.name) as any) || \"application/octet-stream\",\n });\n }\n setSelectedFilesAsBase64(next);\n } catch (e) {\n onInvalidInput(e);\n }\n };\n\n run().then(r => {\n\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedFiles, isImage]);\n\n // Emit onChange\n useEffect(() => {\n if (disabled) return;\n\n if (!selectedFiles.length && !selectedInitialFiles.length) {\n onChange?.([], []);\n return;\n }\n\n // Respect isJsonOutput (web behavior):\n // - when true: use base64Data output\n // - when false: still return picked files list (native file objects)\n // Output shape is platform-specific via types.native.ts\n if (isJsonOutput) {\n if (selectedFilesAsBase64.length === selectedFiles.length || isImage) {\n onChange?.(selectedFiles as any, selectedFilesAsBase64);\n }\n } else {\n onChange?.(selectedFiles as any, selectedFilesAsBase64);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedFilesAsBase64, selectedInitialFiles, selectedFiles]);\n\n // defaultValue + controlled value sync\n useEffect(() => {\n if (defaultValue) {\n setSelectedInitialFiles(Array.isArray(defaultValue) ? defaultValue : [defaultValue]);\n }\n }, [defaultValue]);\n\n useEffect(() => {\n if (initialValueSynced.current) return;\n if (value) {\n setSelectedInitialFiles(Array.isArray(value) ? value : [value]);\n }\n initialValueSynced.current = true;\n }, [value]);\n\n const display = useMemo(() => {\n const fromInitial = selectedInitialFiles.map((uri) => ({\n name: uri.split(\"/\").pop() ?? uri,\n shortName:AnyFile.shortName(uri),\n ext: getExt(uri),\n file: { uri },\n }));\n\n const fromPicked = selectedFiles.map((f) => ({\n name: f.name,\n shortName:AnyFile.shortName(f.name),\n ext: getExt(f.name),\n file: { uri: f.uri },\n }));\n\n return [...fromInitial, ...fromPicked];\n }, [selectedFiles, selectedInitialFiles]);\n\n /** Replace entire file selection (for template's update callback) */\n const updateFiles = (files: File | File[]) => {\n const arr = Array.isArray(files) ? files : [files];\n setSelectedFiles(arr);\n setSelectedInitialFiles([]);\n setSelectedFilesAsBase64([]);\n };\n\n const contextValue = {\n onChangeAnyFileUploader,\n onPick,\n removeFile,\n onInvalidInput,\n selectedFiles,\n selectedInitialFiles,\n disabled,\n limit,\n placeholder,\n isClassicUploader: classicUploader,\n acceptedMemes,\n files: display,\n id: name ?? \"\",\n isImage,\n };\n\n return (\n <FileUploaderContext.Provider value={contextValue}>\n <Flex onFocus={onFocus as any} w={\"full\"} >\n {children ? children({\n values: selectedFiles,\n browse: onPick,\n update: updateFiles,\n remove: (index: number) => removeFile(index)(),\n type: isImage ? 'image' : 'file',\n isMultiple: !isOneFile,\n }) : (\n <>\n {isImage && isOneFile && <SingleImageUploader />}\n {!isImage && isOneFile && <SingleFileUploader />}\n {!isImage && !isOneFile && <MultipleFileUploader />}\n {isImage && !isOneFile && <MultipleImageUploader />}\n </>\n )}\n </Flex>\n </FileUploaderContext.Provider>\n );\n};\n\nexport default MainUploader;\nexport const useUploader = () => useContext(FileUploaderContext);\n"],"names":[],"mappings":"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"}
|
|
@@ -61,6 +61,7 @@ require('yup');
|
|
|
61
61
|
require('../../../packages/types/src/Css/map/index.cjs');
|
|
62
62
|
require('../../../packages/types/src/Theme/shadows.cjs');
|
|
63
63
|
require('../../../packages/types/src/Theme/defaultTheme.cjs');
|
|
64
|
+
require('../../../packages/types/src/Theme/resolvers.cjs');
|
|
64
65
|
require('../../../packages/types/src/Theme/alphaColors.cjs');
|
|
65
66
|
require('../../../apps/mobile/src/Factory/helpers/cssVarMap.cjs');
|
|
66
67
|
require('../../../apps/mobile/src/Factory/DimensionsContext.cjs');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errormessage.cjs","sources":["../../../../../src/form/helpers/ErrorMessage/errormessage.native.tsx"],"sourcesContent":["import React, { type FC } from 'react';\nimport type { IKitsContainer } from '@lmb-it/kitsconcerto-types';\nimport {Alert, AlertText, FormControlError, FormControlErrorIcon, FormControlErrorText} from '@lmb-it/kitsconcertomobile';\nimport {isObject} from \"lodash\";\nimport {AlertCircleIcon} from \"lucide-react-native\";\nimport useThemedFont from '../../../hooks/useThemedFont';\n\nconst ErrorMessage: FC<Omit<IKitsContainer, 'id'> & { style?: Record<string, any> }> = ({ errors, invalid, style }) => {\n const font = useThemedFont('body');\n if (!errors || !invalid) return null;\n\n const renderMessage = (message: string, index?: number) => (\n <FormControlError key={index} style={style || undefined}>\n <FormControlErrorIcon as={AlertCircleIcon} className=\"text-red-500\"/>\n <FormControlErrorText className=\"text-red-500\" style={{...(font ? {fontFamily: font} : {}), ...(style || {})}}>\n {message}\n </FormControlErrorText>\n </FormControlError>\n );\n\n if (typeof errors === 'string') {\n return renderMessage(errors);\n }\n\n if (Array.isArray(errors)) {\n return (\n <>\n {errors.map((err, i) => renderMessage(err, i))}\n </>\n );\n }\n\n if (isObject(errors) && !('type' in errors)) {\n return (\n <>\n {Object.values(errors).map(\n (err: any, i) =>\n err?.message && renderMessage(err.message, i),\n )}\n </>\n );\n }\n\n return null;\n};\n\nexport default ErrorMessage;\n"],"names":["useThemedFont","index","FormControlError","jsx","FormControlErrorIcon","AlertCircleIcon","FormControlErrorText","Fragment","isObject"],"mappings":"
|
|
1
|
+
{"version":3,"file":"errormessage.cjs","sources":["../../../../../src/form/helpers/ErrorMessage/errormessage.native.tsx"],"sourcesContent":["import React, { type FC } from 'react';\nimport type { IKitsContainer } from '@lmb-it/kitsconcerto-types';\nimport {Alert, AlertText, FormControlError, FormControlErrorIcon, FormControlErrorText} from '@lmb-it/kitsconcertomobile';\nimport {isObject} from \"lodash\";\nimport {AlertCircleIcon} from \"lucide-react-native\";\nimport useThemedFont from '../../../hooks/useThemedFont';\n\nconst ErrorMessage: FC<Omit<IKitsContainer, 'id'> & { style?: Record<string, any> }> = ({ errors, invalid, style }) => {\n const font = useThemedFont('body');\n if (!errors || !invalid) return null;\n\n const renderMessage = (message: string, index?: number) => (\n <FormControlError key={index} style={style || undefined}>\n <FormControlErrorIcon as={AlertCircleIcon} className=\"text-red-500\"/>\n <FormControlErrorText className=\"text-red-500\" style={{...(font ? {fontFamily: font} : {}), ...(style || {})}}>\n {message}\n </FormControlErrorText>\n </FormControlError>\n );\n\n if (typeof errors === 'string') {\n return renderMessage(errors);\n }\n\n if (Array.isArray(errors)) {\n return (\n <>\n {errors.map((err, i) => renderMessage(err, i))}\n </>\n );\n }\n\n if (isObject(errors) && !('type' in errors)) {\n return (\n <>\n {Object.values(errors).map(\n (err: any, i) =>\n err?.message && renderMessage(err.message, i),\n )}\n </>\n );\n }\n\n return null;\n};\n\nexport default ErrorMessage;\n"],"names":["useThemedFont","index","FormControlError","jsx","FormControlErrorIcon","AlertCircleIcon","FormControlErrorText","Fragment","isObject"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,MAAM,eAAiF,CAAC,EAAE,MAAA,EAAQ,OAAA,EAAS,OAAM,KAAM;AACnH,EAAA,MAAM,IAAA,GAAOA,sBAAc,MAAM,CAAA;AACjC,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,OAAA,EAAS,OAAO,IAAA;AAEhC,EAAA,MAAM,aAAA,GAAgB,CAAC,OAAA,EAAiBC,OAAA,qCACnCC,sBAAA,EAAA,EAA6B,KAAA,EAAO,SAAS,MAAA,EAC1C,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAACC,0BAAA,EAAA,EAAqB,EAAA,EAAIC,iCAAA,EAAiB,SAAA,EAAU,cAAA,EAAc,CAAA;AAAA,mCAClEC,0BAAA,EAAA,EAAqB,SAAA,EAAU,gBAAe,KAAA,EAAO,EAAC,GAAI,IAAA,GAAO,EAAC,YAAY,IAAA,EAAI,GAAI,EAAC,EAAI,GAAI,SAAS,EAAC,IACrG,QAAA,EAAA,OAAA,EACL;AAAA,GAAA,EAAA,EAJmBL,OAKvB,CAAA;AAGJ,EAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC5B,IAAA,OAAO,cAAc,MAAM,CAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACvB,IAAA,uBACIE,cAAA,CAAAI,mBAAA,EAAA,EACK,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,EAAK,MAAM,aAAA,CAAc,GAAA,EAAK,CAAC,CAAC,CAAA,EACjD,CAAA;AAAA,EAER;AAEA,EAAA,IAAIC,UAAA,CAAS,MAAM,CAAA,IAAK,EAAE,UAAU,MAAA,CAAA,EAAS;AACzC,IAAA,uBACIL,cAAA,CAAAI,mBAAA,EAAA,EACK,QAAA,EAAA,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,CAAE,GAAA;AAAA,MACnB,CAAC,KAAU,CAAA,KACP,GAAA,EAAK,WAAW,aAAA,CAAc,GAAA,CAAI,SAAS,CAAC;AAAA,KACpD,EACJ,CAAA;AAAA,EAER;AAEA,EAAA,OAAO,IAAA;AACX;;;;"}
|
|
@@ -57,6 +57,7 @@ import 'yup';
|
|
|
57
57
|
import '../../../packages/types/src/Css/map/index.js';
|
|
58
58
|
import '../../../packages/types/src/Theme/shadows.js';
|
|
59
59
|
import '../../../packages/types/src/Theme/defaultTheme.js';
|
|
60
|
+
import '../../../packages/types/src/Theme/resolvers.js';
|
|
60
61
|
import '../../../packages/types/src/Theme/alphaColors.js';
|
|
61
62
|
import '../../../apps/mobile/src/Factory/helpers/cssVarMap.js';
|
|
62
63
|
import '../../../apps/mobile/src/Factory/DimensionsContext.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errormessage.js","sources":["../../../../../src/form/helpers/ErrorMessage/errormessage.native.tsx"],"sourcesContent":["import React, { type FC } from 'react';\nimport type { IKitsContainer } from '@lmb-it/kitsconcerto-types';\nimport {Alert, AlertText, FormControlError, FormControlErrorIcon, FormControlErrorText} from '@lmb-it/kitsconcertomobile';\nimport {isObject} from \"lodash\";\nimport {AlertCircleIcon} from \"lucide-react-native\";\nimport useThemedFont from '../../../hooks/useThemedFont';\n\nconst ErrorMessage: FC<Omit<IKitsContainer, 'id'> & { style?: Record<string, any> }> = ({ errors, invalid, style }) => {\n const font = useThemedFont('body');\n if (!errors || !invalid) return null;\n\n const renderMessage = (message: string, index?: number) => (\n <FormControlError key={index} style={style || undefined}>\n <FormControlErrorIcon as={AlertCircleIcon} className=\"text-red-500\"/>\n <FormControlErrorText className=\"text-red-500\" style={{...(font ? {fontFamily: font} : {}), ...(style || {})}}>\n {message}\n </FormControlErrorText>\n </FormControlError>\n );\n\n if (typeof errors === 'string') {\n return renderMessage(errors);\n }\n\n if (Array.isArray(errors)) {\n return (\n <>\n {errors.map((err, i) => renderMessage(err, i))}\n </>\n );\n }\n\n if (isObject(errors) && !('type' in errors)) {\n return (\n <>\n {Object.values(errors).map(\n (err: any, i) =>\n err?.message && renderMessage(err.message, i),\n )}\n </>\n );\n }\n\n return null;\n};\n\nexport default ErrorMessage;\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errormessage.js","sources":["../../../../../src/form/helpers/ErrorMessage/errormessage.native.tsx"],"sourcesContent":["import React, { type FC } from 'react';\nimport type { IKitsContainer } from '@lmb-it/kitsconcerto-types';\nimport {Alert, AlertText, FormControlError, FormControlErrorIcon, FormControlErrorText} from '@lmb-it/kitsconcertomobile';\nimport {isObject} from \"lodash\";\nimport {AlertCircleIcon} from \"lucide-react-native\";\nimport useThemedFont from '../../../hooks/useThemedFont';\n\nconst ErrorMessage: FC<Omit<IKitsContainer, 'id'> & { style?: Record<string, any> }> = ({ errors, invalid, style }) => {\n const font = useThemedFont('body');\n if (!errors || !invalid) return null;\n\n const renderMessage = (message: string, index?: number) => (\n <FormControlError key={index} style={style || undefined}>\n <FormControlErrorIcon as={AlertCircleIcon} className=\"text-red-500\"/>\n <FormControlErrorText className=\"text-red-500\" style={{...(font ? {fontFamily: font} : {}), ...(style || {})}}>\n {message}\n </FormControlErrorText>\n </FormControlError>\n );\n\n if (typeof errors === 'string') {\n return renderMessage(errors);\n }\n\n if (Array.isArray(errors)) {\n return (\n <>\n {errors.map((err, i) => renderMessage(err, i))}\n </>\n );\n }\n\n if (isObject(errors) && !('type' in errors)) {\n return (\n <>\n {Object.values(errors).map(\n (err: any, i) =>\n err?.message && renderMessage(err.message, i),\n )}\n </>\n );\n }\n\n return null;\n};\n\nexport default ErrorMessage;\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,MAAM,eAAiF,CAAC,EAAE,MAAA,EAAQ,OAAA,EAAS,OAAM,KAAM;AACnH,EAAA,MAAM,IAAA,GAAO,cAAc,MAAM,CAAA;AACjC,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,OAAA,EAAS,OAAO,IAAA;AAEhC,EAAA,MAAM,aAAA,GAAgB,CAAC,OAAA,EAAiB,KAAA,0BACnC,gBAAA,EAAA,EAA6B,KAAA,EAAO,SAAS,MAAA,EAC1C,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,oBAAA,EAAA,EAAqB,EAAA,EAAI,eAAA,EAAiB,SAAA,EAAU,cAAA,EAAc,CAAA;AAAA,wBAClE,oBAAA,EAAA,EAAqB,SAAA,EAAU,gBAAe,KAAA,EAAO,EAAC,GAAI,IAAA,GAAO,EAAC,YAAY,IAAA,EAAI,GAAI,EAAC,EAAI,GAAI,SAAS,EAAC,IACrG,QAAA,EAAA,OAAA,EACL;AAAA,GAAA,EAAA,EAJmB,KAKvB,CAAA;AAGJ,EAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC5B,IAAA,OAAO,cAAc,MAAM,CAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACvB,IAAA,uBACI,GAAA,CAAA,QAAA,EAAA,EACK,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,EAAK,MAAM,aAAA,CAAc,GAAA,EAAK,CAAC,CAAC,CAAA,EACjD,CAAA;AAAA,EAER;AAEA,EAAA,IAAI,QAAA,CAAS,MAAM,CAAA,IAAK,EAAE,UAAU,MAAA,CAAA,EAAS;AACzC,IAAA,uBACI,GAAA,CAAA,QAAA,EAAA,EACK,QAAA,EAAA,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,CAAE,GAAA;AAAA,MACnB,CAAC,KAAU,CAAA,KACP,GAAA,EAAK,WAAW,aAAA,CAAc,GAAA,CAAI,SAAS,CAAC;AAAA,KACpD,EACJ,CAAA;AAAA,EAER;AAEA,EAAA,OAAO,IAAA;AACX;;;;"}
|
|
@@ -65,6 +65,7 @@ require('yup');
|
|
|
65
65
|
require('../../../packages/types/src/Css/map/index.cjs');
|
|
66
66
|
require('../../../packages/types/src/Theme/shadows.cjs');
|
|
67
67
|
require('../../../packages/types/src/Theme/defaultTheme.cjs');
|
|
68
|
+
require('../../../packages/types/src/Theme/resolvers.cjs');
|
|
68
69
|
require('../../../packages/types/src/Theme/alphaColors.cjs');
|
|
69
70
|
require('../../../apps/mobile/src/Factory/helpers/cssVarMap.cjs');
|
|
70
71
|
require('i18next');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../../src/form/helpers/FormContainer/index.native.tsx"],"sourcesContent":["import React, { type FC, type PropsWithChildren, useMemo } from \"react\";\nimport { View } from \"react-native\";\nimport { uniqueId } from \"lodash\";\nimport ErrorMessage from \"../ErrorMessage\";\nimport type {IKitsContainer} from \"@lmb-it/kitsconcerto-types\";\nimport {\n FormControl,\n FormControlHelper,\n FormControlHelperText,\n style as resolveStyle,\n} from \"@lmb-it/kitsconcertomobile\"\nimport { Label, Text, useKitsTheme } from \"../../../_compat\";\nimport {useResolvedElementStyles, useThemedFont} from \"@lmb-it/kitsconcerto/hooks\";\n\n/**\n * KitsContainer (native) — wraps all form inputs with label, addons, helper\n * text, and errors. Mirror of the web variant: a pure renderer that does NO\n * independent theme lookup. Every slot style comes from `elementStyles`\n * passed by the parent input (already merged through the\n * FormElement < Input/Select < InputText/DropdownSelect/… < per-instance slots\n * chain by the parent's `useComponentDefaults` call).\n *\n * Addon rendering is inlined here (matches web FormContainer). There is NO\n * `Addons` component on either platform anymore — the previous native Addons\n * helper re-resolved tokens and hardcoded `borderRadius / borderWidth /\n * padding / backgroundColor / borderColor` defaults that clobbered\n * `kitsTheme.components.*.leftAddon.style` overrides. Both bugs are fixed by\n * deleting the indirection.\n *\n * Element slots applied here (identical contract to web):\n * container → outer FormControl wrapper\n * label → Label component (plain Text path on native — see Label.native)\n * inputGroup → input group wrapper (around addons + input). On native this\n * wrapper carries the visual border that web gets from the\n * `.p-inputgroup` CSS class.\n * leftAddon → left addon View\n * rightAddon → right addon View\n * helperText → helper text below the group\n * error → error message below the group\n *\n * The `root` slot is NOT applied here — it is applied by the parent form\n * input component directly to the inner Input/Textarea element.\n */\nconst KitsContainer: FC<PropsWithChildren<IKitsContainer>> = (props) => {\n const {\n id,\n helperText,\n children,\n rightAddon,\n leftAddon,\n errors,\n invalid,\n required,\n hideError,\n label,\n isFloatedLabel,\n containerStyle,\n disabled,\n bare,\n elementStyles: parentElementStyles,\n elementProps: parentElementProps,\n } = props;\n\n // Pure renderer: resolve the elementStyles passed in by the parent.\n // No `useComponentDefaults('FormContainer', …)` lookup — that key is\n // intentionally not part of the consumer-facing theme contract.\n const elStyles = useResolvedElementStyles(parentElementStyles || {});\n // Slot `props` — the web twin of this spreads them onto the DOM nodes.\n // On native `className` has no meaning, so it is dropped here; everything\n // else (testID, accessibility*, pointerEvents, …) is a legitimate View\n // prop and is forwarded. Same slot contract, honest about the platform.\n const elProps = parentElementProps || {};\n const stripClassName = (slot?: Record<string, any>) => {\n if (!slot) return {};\n const {className: _ignoredOnNative, ...rest} = slot;\n return rest;\n };\n const containerSlotProps = stripClassName(elProps.container);\n const inputGroupSlotProps = stripClassName(elProps.inputGroup);\n const { resolveToken } = useKitsTheme();\n const themedFont = useThemedFont('body');\n\n // Generate a unique element ID (for parity with web; not used in native labels)\n const elementId = id ? `${id}_element` : uniqueId(\"element_\");\n\n // Derive label placement from the label prop\n const placement = useMemo(() => {\n if (label && typeof label === 'object' && 'placement' in label) {\n return label.placement; // \"RL\" | \"B\" | \"T\"\n }\n return \"T\"; // default: top\n }, [label]);\n\n // Determine layout direction based on placement\n // T = top (column, label first), B = bottom (column-reverse), RL = side-by-side (row)\n const isHorizontal = placement === \"RL\";\n const isBottom = placement === \"B\";\n\n // Label uses the plain Text path (NOT the FormControlLabel path) because\n // @lmb-it/kitsconcertomobile's FormControlLabelText strips arbitrary\n // inline styles, which broke `kitsTheme.components.Input.label.style`\n // overrides on native. The plain Text path forwards `style` directly.\n const labelElement = !isFloatedLabel ? (\n <Label label={label} elementId={elementId} required={required} style={elStyles.label || undefined} />\n ) : null;\n\n /**\n * Inline addon renderer. Mirrors the dispatch web uses in FormContainer\n * (string → text, ReactElement → element) AND adds the function-arg\n * branch native needs because lucide-react-native icons are passed as\n * functions `(props) => <Icon …/>`. The function-arg branch never runs\n * on web (web never goes through this code) so it cannot affect web.\n */\n const renderAddon = (\n addon: IKitsContainer[\"leftAddon\"] | IKitsContainer[\"rightAddon\"],\n ) => {\n if (!addon) return null;\n if (typeof addon === \"string\" || typeof addon === \"number\") {\n return <Text fontSize={14}>{addon}</Text>;\n }\n if (typeof addon === \"function\") {\n return (addon as (args: { size: number }) => React.ReactNode)({ size: 16 });\n }\n if (React.isValidElement(addon)) {\n return addon;\n }\n return null;\n };\n\n // Resolved inputGroup wrapper style. The default theme provides\n // `Input.inputGroup.style.{borderColor, borderRadius, borderWidth, height}`\n // — these are what give the group its visual frame. Defaults are layered\n // *under* the user's resolved style, so a per-instance override always wins.\n //\n // The `invalid` border color is applied as a fallback default (after\n // theme defaults, before user `inputGroup.borderColor` override). When\n // `bare` is set, the whole frame is suppressed (matches web's\n // `bareInputGroupStyle`).\n const inputGroupStyle = useMemo(() => {\n if (bare) {\n // Bare mode (FilePicker, Radio, Checkbox group, …): drop ALL\n // inputGroup chrome including `height: 52` from the theme. Web's\n // FormContainer does the same — it passes `style={{}}` when\n // bare (see helpers/FormContainer/index.web.tsx, the bare\n // branch of the row Flex). Without this, the non-classic file\n // uploader's 200px dashed drop zone was being squashed to 52px.\n return {\n width: \"100%\" as const,\n borderWidth: 0,\n borderRadius: 0,\n overflow: \"visible\" as const,\n };\n }\n const userStyle = elStyles.inputGroup || {};\n const userOverrodeBorderColor = \"borderColor\" in userStyle;\n return {\n width: \"100%\" as const,\n flexDirection: \"row\" as const,\n alignItems: \"stretch\" as const,\n overflow: \"hidden\" as const,\n ...userStyle,\n ...(invalid && !userOverrodeBorderColor\n ? { borderColor: resolveToken(\"danger\") }\n : {}),\n };\n }, [bare, elStyles.inputGroup, invalid, resolveToken]);\n\n // Addon baseline chrome — mirrors what PrimeReact's `.p-inputgroup-addon`\n // CSS class gives web addons (gray fill + horizontal padding + 1px\n // separator border on the input-facing edge). On web these defaults\n // come from CSS; on native we must apply them inline. Theme overrides\n // (`elStyles.leftAddon` / `rightAddon`) are spread LAST so per-instance\n // values always win. The separator border colour falls back to the\n // inputGroup border colour for visual continuity.\n const addonSeparatorColor = (\n (elStyles.inputGroup && elStyles.inputGroup.borderColor) ||\n resolveToken(\"border\")\n );\n const addonBaseStyle = {\n alignItems: \"center\" as const,\n justifyContent: \"center\" as const,\n paddingHorizontal: 12,\n paddingVertical: 8,\n backgroundColor: resolveToken(\"bg-input\"),\n };\n\n const contentElement = (\n <View style={inputGroupStyle} {...inputGroupSlotProps}>\n {leftAddon ? (\n <View\n style={{\n ...addonBaseStyle,\n borderEndWidth: 1,\n borderEndColor: addonSeparatorColor,\n ...(elStyles.leftAddon || {}),\n }}\n >\n {renderAddon(leftAddon)}\n </View>\n ) : null}\n\n {/* `justifyContent: 'center'` vertically centres the inner Input\n inside the 52px-tall inputGroup (matching web, where flex\n items default to vertical alignment via the inputGroup row\n + the input's intrinsic line-box centring). Without this,\n placeholders and selected values sat near the top edge of\n the input. Tall children that already fill the height\n (textarea) are unaffected because `justifyContent: 'center'`\n is a no-op on items that match the parent's cross-axis. */}\n <View style={{ flex: 1, justifyContent: 'center' }}>{children}</View>\n\n {rightAddon ? (\n <View\n style={{\n ...addonBaseStyle,\n borderStartWidth: 1,\n borderStartColor: addonSeparatorColor,\n ...(elStyles.rightAddon || {}),\n }}\n >\n {renderAddon(rightAddon)}\n </View>\n ) : null}\n </View>\n );\n\n const containerRnStyle = useMemo(\n () => (containerStyle && Object.keys(containerStyle).length ? resolveStyle(containerStyle) : {}),\n [containerStyle],\n );\n\n return(\n <FormControl\n isInvalid={invalid}\n size=\"md\"\n isDisabled={disabled}\n isReadOnly={disabled}\n isRequired={required}\n {...containerSlotProps}\n style={{\n width:'100%', gap: 4,\n // `bare` strips the container's DEFAULT frame, but must not\n // override an explicit `container` slot. Spread it FIRST so a\n // user's borderRadius / borderWidth / overflow (e.g. an Object\n // or Group styled as a card) wins over the reset.\n ...(bare ? { borderWidth: 0, borderRadius: 0, overflow: 'visible' } : {}),\n ...(elStyles.container || {}),\n ...(containerRnStyle || {}),\n }}\n >\n {isHorizontal ? (\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 8, width: '100%' }}>\n {labelElement}\n <View style={{ flex: 1 }}>{contentElement}</View>\n </View>\n ) : isBottom ? (\n <>\n {contentElement}\n {labelElement}\n </>\n ) : (\n <>\n {labelElement}\n {contentElement}\n </>\n )}\n {helperText && typeof helperText !== \"function\" && <FormControlHelper>\n <FormControlHelperText style={{...(themedFont ? {fontFamily: themedFont} : {}), ...(elStyles.helperText || {})}}>\n {helperText}\n </FormControlHelperText>\n </FormControlHelper>}\n\n {!hideError && <ErrorMessage invalid={invalid} errors={errors} style={elStyles.error || undefined} />}\n </FormControl>\n )\n};\n\nexport default KitsContainer;\n"],"names":["useResolvedElementStyles","useKitsTheme","useThemedFont","uniqueId","useMemo","jsx","Label","Text","jsxs","View","resolveStyle","FormControl","Fragment","FormControlHelper","FormControlHelperText","ErrorMessage"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../../src/form/helpers/FormContainer/index.native.tsx"],"sourcesContent":["import React, { type FC, type PropsWithChildren, useMemo } from \"react\";\nimport { View } from \"react-native\";\nimport { uniqueId } from \"lodash\";\nimport ErrorMessage from \"../ErrorMessage\";\nimport type {IKitsContainer} from \"@lmb-it/kitsconcerto-types\";\nimport {\n FormControl,\n FormControlHelper,\n FormControlHelperText,\n style as resolveStyle,\n} from \"@lmb-it/kitsconcertomobile\"\nimport { Label, Text, useKitsTheme } from \"../../../_compat\";\nimport {useResolvedElementStyles, useThemedFont} from \"@lmb-it/kitsconcerto/hooks\";\n\n/**\n * KitsContainer (native) — wraps all form inputs with label, addons, helper\n * text, and errors. Mirror of the web variant: a pure renderer that does NO\n * independent theme lookup. Every slot style comes from `elementStyles`\n * passed by the parent input (already merged through the\n * FormElement < Input/Select < InputText/DropdownSelect/… < per-instance slots\n * chain by the parent's `useComponentDefaults` call).\n *\n * Addon rendering is inlined here (matches web FormContainer). There is NO\n * `Addons` component on either platform anymore — the previous native Addons\n * helper re-resolved tokens and hardcoded `borderRadius / borderWidth /\n * padding / backgroundColor / borderColor` defaults that clobbered\n * `kitsTheme.components.*.leftAddon.style` overrides. Both bugs are fixed by\n * deleting the indirection.\n *\n * Element slots applied here (identical contract to web):\n * container → outer FormControl wrapper\n * label → Label component (plain Text path on native — see Label.native)\n * inputGroup → input group wrapper (around addons + input). On native this\n * wrapper carries the visual border that web gets from the\n * `.p-inputgroup` CSS class.\n * leftAddon → left addon View\n * rightAddon → right addon View\n * helperText → helper text below the group\n * error → error message below the group\n *\n * The `root` slot is NOT applied here — it is applied by the parent form\n * input component directly to the inner Input/Textarea element.\n */\nconst KitsContainer: FC<PropsWithChildren<IKitsContainer>> = (props) => {\n const {\n id,\n helperText,\n children,\n rightAddon,\n leftAddon,\n errors,\n invalid,\n required,\n hideError,\n label,\n isFloatedLabel,\n containerStyle,\n disabled,\n bare,\n elementStyles: parentElementStyles,\n elementProps: parentElementProps,\n } = props;\n\n // Pure renderer: resolve the elementStyles passed in by the parent.\n // No `useComponentDefaults('FormContainer', …)` lookup — that key is\n // intentionally not part of the consumer-facing theme contract.\n const elStyles = useResolvedElementStyles(parentElementStyles || {});\n // Slot `props` — the web twin of this spreads them onto the DOM nodes.\n // On native `className` has no meaning, so it is dropped here; everything\n // else (testID, accessibility*, pointerEvents, …) is a legitimate View\n // prop and is forwarded. Same slot contract, honest about the platform.\n const elProps = parentElementProps || {};\n const stripClassName = (slot?: Record<string, any>) => {\n if (!slot) return {};\n const {className: _ignoredOnNative, ...rest} = slot;\n return rest;\n };\n const containerSlotProps = stripClassName(elProps.container);\n const inputGroupSlotProps = stripClassName(elProps.inputGroup);\n const { resolveToken } = useKitsTheme();\n const themedFont = useThemedFont('body');\n\n // Generate a unique element ID (for parity with web; not used in native labels)\n const elementId = id ? `${id}_element` : uniqueId(\"element_\");\n\n // Derive label placement from the label prop\n const placement = useMemo(() => {\n if (label && typeof label === 'object' && 'placement' in label) {\n return label.placement; // \"RL\" | \"B\" | \"T\"\n }\n return \"T\"; // default: top\n }, [label]);\n\n // Determine layout direction based on placement\n // T = top (column, label first), B = bottom (column-reverse), RL = side-by-side (row)\n const isHorizontal = placement === \"RL\";\n const isBottom = placement === \"B\";\n\n // Label uses the plain Text path (NOT the FormControlLabel path) because\n // @lmb-it/kitsconcertomobile's FormControlLabelText strips arbitrary\n // inline styles, which broke `kitsTheme.components.Input.label.style`\n // overrides on native. The plain Text path forwards `style` directly.\n const labelElement = !isFloatedLabel ? (\n <Label label={label} elementId={elementId} required={required} style={elStyles.label || undefined} />\n ) : null;\n\n /**\n * Inline addon renderer. Mirrors the dispatch web uses in FormContainer\n * (string → text, ReactElement → element) AND adds the function-arg\n * branch native needs because lucide-react-native icons are passed as\n * functions `(props) => <Icon …/>`. The function-arg branch never runs\n * on web (web never goes through this code) so it cannot affect web.\n */\n const renderAddon = (\n addon: IKitsContainer[\"leftAddon\"] | IKitsContainer[\"rightAddon\"],\n ) => {\n if (!addon) return null;\n if (typeof addon === \"string\" || typeof addon === \"number\") {\n return <Text fontSize={14}>{addon}</Text>;\n }\n if (typeof addon === \"function\") {\n return (addon as (args: { size: number }) => React.ReactNode)({ size: 16 });\n }\n if (React.isValidElement(addon)) {\n return addon;\n }\n return null;\n };\n\n // Resolved inputGroup wrapper style. The default theme provides\n // `Input.inputGroup.style.{borderColor, borderRadius, borderWidth, height}`\n // — these are what give the group its visual frame. Defaults are layered\n // *under* the user's resolved style, so a per-instance override always wins.\n //\n // The `invalid` border color is applied as a fallback default (after\n // theme defaults, before user `inputGroup.borderColor` override). When\n // `bare` is set, the whole frame is suppressed (matches web's\n // `bareInputGroupStyle`).\n const inputGroupStyle = useMemo(() => {\n if (bare) {\n // Bare mode (FilePicker, Radio, Checkbox group, …): drop ALL\n // inputGroup chrome including `height: 52` from the theme. Web's\n // FormContainer does the same — it passes `style={{}}` when\n // bare (see helpers/FormContainer/index.web.tsx, the bare\n // branch of the row Flex). Without this, the non-classic file\n // uploader's 200px dashed drop zone was being squashed to 52px.\n return {\n width: \"100%\" as const,\n borderWidth: 0,\n borderRadius: 0,\n overflow: \"visible\" as const,\n };\n }\n const userStyle = elStyles.inputGroup || {};\n const userOverrodeBorderColor = \"borderColor\" in userStyle;\n return {\n width: \"100%\" as const,\n flexDirection: \"row\" as const,\n alignItems: \"stretch\" as const,\n overflow: \"hidden\" as const,\n ...userStyle,\n ...(invalid && !userOverrodeBorderColor\n ? { borderColor: resolveToken(\"danger\") }\n : {}),\n };\n }, [bare, elStyles.inputGroup, invalid, resolveToken]);\n\n // Addon baseline chrome — mirrors what PrimeReact's `.p-inputgroup-addon`\n // CSS class gives web addons (gray fill + horizontal padding + 1px\n // separator border on the input-facing edge). On web these defaults\n // come from CSS; on native we must apply them inline. Theme overrides\n // (`elStyles.leftAddon` / `rightAddon`) are spread LAST so per-instance\n // values always win. The separator border colour falls back to the\n // inputGroup border colour for visual continuity.\n const addonSeparatorColor = (\n (elStyles.inputGroup && elStyles.inputGroup.borderColor) ||\n resolveToken(\"border\")\n );\n const addonBaseStyle = {\n alignItems: \"center\" as const,\n justifyContent: \"center\" as const,\n paddingHorizontal: 12,\n paddingVertical: 8,\n backgroundColor: resolveToken(\"bg-input\"),\n };\n\n const contentElement = (\n <View style={inputGroupStyle} {...inputGroupSlotProps}>\n {leftAddon ? (\n <View\n style={{\n ...addonBaseStyle,\n borderEndWidth: 1,\n borderEndColor: addonSeparatorColor,\n ...(elStyles.leftAddon || {}),\n }}\n >\n {renderAddon(leftAddon)}\n </View>\n ) : null}\n\n {/* `justifyContent: 'center'` vertically centres the inner Input\n inside the 52px-tall inputGroup (matching web, where flex\n items default to vertical alignment via the inputGroup row\n + the input's intrinsic line-box centring). Without this,\n placeholders and selected values sat near the top edge of\n the input. Tall children that already fill the height\n (textarea) are unaffected because `justifyContent: 'center'`\n is a no-op on items that match the parent's cross-axis. */}\n <View style={{ flex: 1, justifyContent: 'center' }}>{children}</View>\n\n {rightAddon ? (\n <View\n style={{\n ...addonBaseStyle,\n borderStartWidth: 1,\n borderStartColor: addonSeparatorColor,\n ...(elStyles.rightAddon || {}),\n }}\n >\n {renderAddon(rightAddon)}\n </View>\n ) : null}\n </View>\n );\n\n const containerRnStyle = useMemo(\n () => (containerStyle && Object.keys(containerStyle).length ? resolveStyle(containerStyle) : {}),\n [containerStyle],\n );\n\n return(\n <FormControl\n isInvalid={invalid}\n size=\"md\"\n isDisabled={disabled}\n isReadOnly={disabled}\n isRequired={required}\n {...containerSlotProps}\n style={{\n width:'100%', gap: 4,\n // `bare` strips the container's DEFAULT frame, but must not\n // override an explicit `container` slot. Spread it FIRST so a\n // user's borderRadius / borderWidth / overflow (e.g. an Object\n // or Group styled as a card) wins over the reset.\n ...(bare ? { borderWidth: 0, borderRadius: 0, overflow: 'visible' } : {}),\n ...(elStyles.container || {}),\n ...(containerRnStyle || {}),\n }}\n >\n {isHorizontal ? (\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 8, width: '100%' }}>\n {labelElement}\n <View style={{ flex: 1 }}>{contentElement}</View>\n </View>\n ) : isBottom ? (\n <>\n {contentElement}\n {labelElement}\n </>\n ) : (\n <>\n {labelElement}\n {contentElement}\n </>\n )}\n {helperText && typeof helperText !== \"function\" && <FormControlHelper>\n <FormControlHelperText style={{...(themedFont ? {fontFamily: themedFont} : {}), ...(elStyles.helperText || {})}}>\n {helperText}\n </FormControlHelperText>\n </FormControlHelper>}\n\n {!hideError && <ErrorMessage invalid={invalid} errors={errors} style={elStyles.error || undefined} />}\n </FormControl>\n )\n};\n\nexport default KitsContainer;\n"],"names":["useResolvedElementStyles","useKitsTheme","useThemedFont","uniqueId","useMemo","jsx","Label","Text","jsxs","View","resolveStyle","FormControl","Fragment","FormControlHelper","FormControlHelperText","ErrorMessage"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,MAAM,aAAA,GAAuD,CAAC,KAAA,KAAU;AACpE,EAAA,MAAM;AAAA,IACF,EAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,aAAA,EAAe,mBAAA;AAAA,IACf,YAAA,EAAc;AAAA,GAClB,GAAI,KAAA;AAKJ,EAAA,MAAM,QAAA,GAAWA,gCAAA,CAAyB,mBAAA,IAAuB,EAAE,CAAA;AAKnE,EAAA,MAAM,OAAA,GAAU,sBAAsB,EAAC;AACvC,EAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,KAA+B;AACnD,IAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAC;AACnB,IAAA,MAAM,EAAC,SAAA,EAAW,gBAAA,EAAkB,GAAG,MAAI,GAAI,IAAA;AAC/C,IAAA,OAAO,IAAA;AAAA,EACX,CAAA;AACA,EAAA,MAAM,kBAAA,GAAqB,cAAA,CAAe,OAAA,CAAQ,SAAS,CAAA;AAC3D,EAAA,MAAM,mBAAA,GAAsB,cAAA,CAAe,OAAA,CAAQ,UAAU,CAAA;AAC7D,EAAA,MAAM,EAAE,YAAA,EAAa,GAAIC,qCAAA,EAAa;AACtC,EAAA,MAAM,UAAA,GAAaC,sBAAc,MAAM,CAAA;AAGvC,EAAA,MAAM,YAAY,EAAA,GAAK,CAAA,EAAG,EAAE,CAAA,QAAA,CAAA,GAAaC,WAAS,UAAU,CAAA;AAG5D,EAAA,MAAM,SAAA,GAAYC,cAAQ,MAAM;AAC5B,IAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,eAAe,KAAA,EAAO;AAC5D,MAAA,OAAO,KAAA,CAAM,SAAA;AAAA,IACjB;AACA,IAAA,OAAO,GAAA;AAAA,EACX,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAIV,EAAA,MAAM,eAAe,SAAA,KAAc,IAAA;AACnC,EAAA,MAAM,WAAW,SAAA,KAAc,GAAA;AAM/B,EAAA,MAAM,YAAA,GAAe,CAAC,cAAA,mBAClBC,cAAA,CAACC,oBAAA,EAAA,EAAM,KAAA,EAAc,SAAA,EAAsB,QAAA,EAAoB,KAAA,EAAO,QAAA,CAAS,KAAA,IAAS,MAAA,EAAW,CAAA,GACnG,IAAA;AASJ,EAAA,MAAM,WAAA,GAAc,CAChB,KAAA,KACC;AACD,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,UAAU,QAAA,EAAU;AACxD,MAAA,uBAAOD,cAAA,CAACE,oBAAA,EAAA,EAAK,QAAA,EAAU,EAAA,EAAK,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IACtC;AACA,IAAA,IAAI,OAAO,UAAU,UAAA,EAAY;AAC7B,MAAA,OAAQ,KAAA,CAAsD,EAAE,IAAA,EAAM,EAAA,EAAI,CAAA;AAAA,IAC9E;AACA,IAAA,IAAI,KAAA,CAAM,cAAA,CAAe,KAAK,CAAA,EAAG;AAC7B,MAAA,OAAO,KAAA;AAAA,IACX;AACA,IAAA,OAAO,IAAA;AAAA,EACX,CAAA;AAWA,EAAA,MAAM,eAAA,GAAkBH,cAAQ,MAAM;AAClC,IAAA,IAAI,IAAA,EAAM;AAON,MAAA,OAAO;AAAA,QACH,KAAA,EAAO,MAAA;AAAA,QACP,WAAA,EAAa,CAAA;AAAA,QACb,YAAA,EAAc,CAAA;AAAA,QACd,QAAA,EAAU;AAAA,OACd;AAAA,IACJ;AACA,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,UAAA,IAAc,EAAC;AAC1C,IAAA,MAAM,0BAA0B,aAAA,IAAiB,SAAA;AACjD,IAAA,OAAO;AAAA,MACH,KAAA,EAAO,MAAA;AAAA,MACP,aAAA,EAAe,KAAA;AAAA,MACf,UAAA,EAAY,SAAA;AAAA,MACZ,QAAA,EAAU,QAAA;AAAA,MACV,GAAG,SAAA;AAAA,MACH,GAAI,OAAA,IAAW,CAAC,uBAAA,GACV,EAAE,aAAa,YAAA,CAAa,QAAQ,CAAA,EAAE,GACtC;AAAC,KACX;AAAA,EACJ,GAAG,CAAC,IAAA,EAAM,SAAS,UAAA,EAAY,OAAA,EAAS,YAAY,CAAC,CAAA;AASrD,EAAA,MAAM,sBACD,QAAA,CAAS,UAAA,IAAc,SAAS,UAAA,CAAW,WAAA,IAC5C,aAAa,QAAQ,CAAA;AAEzB,EAAA,MAAM,cAAA,GAAiB;AAAA,IACnB,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,iBAAA,EAAmB,EAAA;AAAA,IACnB,eAAA,EAAiB,CAAA;AAAA,IACjB,eAAA,EAAiB,aAAa,UAAU;AAAA,GAC5C;AAEA,EAAA,MAAM,iCACFI,eAAA,CAACC,gBAAA,EAAA,EAAK,KAAA,EAAO,eAAA,EAAkB,GAAG,mBAAA,EAC7B,QAAA,EAAA;AAAA,IAAA,SAAA,mBACGJ,cAAA;AAAA,MAACI,gBAAA;AAAA,MAAA;AAAA,QACG,KAAA,EAAO;AAAA,UACH,GAAG,cAAA;AAAA,UACH,cAAA,EAAgB,CAAA;AAAA,UAChB,cAAA,EAAgB,mBAAA;AAAA,UAChB,GAAI,QAAA,CAAS,SAAA,IAAa;AAAC,SAC/B;AAAA,QAEC,sBAAY,SAAS;AAAA;AAAA,KAC1B,GACA,IAAA;AAAA,oBAUJJ,cAAA,CAACI,oBAAK,KAAA,EAAO,EAAE,MAAM,CAAA,EAAG,cAAA,EAAgB,QAAA,EAAS,EAAI,QAAA,EAAS,CAAA;AAAA,IAE7D,UAAA,mBACGJ,cAAA;AAAA,MAACI,gBAAA;AAAA,MAAA;AAAA,QACG,KAAA,EAAO;AAAA,UACH,GAAG,cAAA;AAAA,UACH,gBAAA,EAAkB,CAAA;AAAA,UAClB,gBAAA,EAAkB,mBAAA;AAAA,UAClB,GAAI,QAAA,CAAS,UAAA,IAAc;AAAC,SAChC;AAAA,QAEC,sBAAY,UAAU;AAAA;AAAA,KAC3B,GACA;AAAA,GAAA,EACR,CAAA;AAGJ,EAAA,MAAM,gBAAA,GAAmBL,aAAA;AAAA,IACrB,MAAO,cAAA,IAAkB,MAAA,CAAO,IAAA,CAAK,cAAc,EAAE,MAAA,GAASM,WAAA,CAAa,cAAc,CAAA,GAAI,EAAC;AAAA,IAC9F,CAAC,cAAc;AAAA,GACnB;AAEA,EAAA,uBACIF,eAAA;AAAA,IAACG,iBAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAW,OAAA;AAAA,MACX,IAAA,EAAK,IAAA;AAAA,MACL,UAAA,EAAY,QAAA;AAAA,MACZ,UAAA,EAAY,QAAA;AAAA,MACZ,UAAA,EAAY,QAAA;AAAA,MACX,GAAG,kBAAA;AAAA,MACJ,KAAA,EAAO;AAAA,QACH,KAAA,EAAM,MAAA;AAAA,QAAQ,GAAA,EAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAKnB,GAAI,IAAA,GAAO,EAAE,WAAA,EAAa,CAAA,EAAG,cAAc,CAAA,EAAG,QAAA,EAAU,SAAA,EAAU,GAAI,EAAC;AAAA,QACvE,GAAI,QAAA,CAAS,SAAA,IAAa,EAAC;AAAA,QAC3B,GAAI,oBAAoB;AAAC,OAC7B;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,YAAA,mBACGH,eAAA,CAACC,gBAAA,EAAA,EAAK,KAAA,EAAO,EAAE,aAAA,EAAe,KAAA,EAAO,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,MAAA,EAAO,EAC5E,QAAA,EAAA;AAAA,UAAA,YAAA;AAAA,yCACAA,gBAAA,EAAA,EAAK,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,IAAM,QAAA,EAAA,cAAA,EAAe;AAAA,SAAA,EAC9C,CAAA,GACA,2BACAD,eAAA,CAAAI,mBAAA,EAAA,EACK,QAAA,EAAA;AAAA,UAAA,cAAA;AAAA,UACA;AAAA,SAAA,EACL,oBAEAJ,eAAA,CAAAI,mBAAA,EAAA,EACK,QAAA,EAAA;AAAA,UAAA,YAAA;AAAA,UACA;AAAA,SAAA,EACL,CAAA;AAAA,QAEH,UAAA,IAAc,OAAO,UAAA,KAAe,UAAA,oBAAcP,cAAA,CAACQ,2BAChD,QAAA,kBAAAR,cAAA,CAACS,2BAAA,EAAA,EAAsB,KAAA,EAAO,EAAC,GAAI,UAAA,GAAa,EAAC,UAAA,EAAY,UAAA,EAAU,GAAI,EAAC,EAAI,GAAI,QAAA,CAAS,UAAA,IAAc,EAAC,EAAE,EACzG,QAAA,EAAA,UAAA,EACL,CAAA,EACJ,CAAA;AAAA,QAEC,CAAC,6BAAaT,cAAA,CAACU,2BAAA,EAAA,EAAa,SAAkB,MAAA,EAAgB,KAAA,EAAO,QAAA,CAAS,KAAA,IAAS,MAAA,EAAW;AAAA;AAAA;AAAA,GACvG;AAER;;;;"}
|
|
@@ -61,6 +61,7 @@ import 'yup';
|
|
|
61
61
|
import '../../../packages/types/src/Css/map/index.js';
|
|
62
62
|
import '../../../packages/types/src/Theme/shadows.js';
|
|
63
63
|
import '../../../packages/types/src/Theme/defaultTheme.js';
|
|
64
|
+
import '../../../packages/types/src/Theme/resolvers.js';
|
|
64
65
|
import '../../../packages/types/src/Theme/alphaColors.js';
|
|
65
66
|
import '../../../apps/mobile/src/Factory/helpers/cssVarMap.js';
|
|
66
67
|
import 'i18next';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../src/form/helpers/FormContainer/index.native.tsx"],"sourcesContent":["import React, { type FC, type PropsWithChildren, useMemo } from \"react\";\nimport { View } from \"react-native\";\nimport { uniqueId } from \"lodash\";\nimport ErrorMessage from \"../ErrorMessage\";\nimport type {IKitsContainer} from \"@lmb-it/kitsconcerto-types\";\nimport {\n FormControl,\n FormControlHelper,\n FormControlHelperText,\n style as resolveStyle,\n} from \"@lmb-it/kitsconcertomobile\"\nimport { Label, Text, useKitsTheme } from \"../../../_compat\";\nimport {useResolvedElementStyles, useThemedFont} from \"@lmb-it/kitsconcerto/hooks\";\n\n/**\n * KitsContainer (native) — wraps all form inputs with label, addons, helper\n * text, and errors. Mirror of the web variant: a pure renderer that does NO\n * independent theme lookup. Every slot style comes from `elementStyles`\n * passed by the parent input (already merged through the\n * FormElement < Input/Select < InputText/DropdownSelect/… < per-instance slots\n * chain by the parent's `useComponentDefaults` call).\n *\n * Addon rendering is inlined here (matches web FormContainer). There is NO\n * `Addons` component on either platform anymore — the previous native Addons\n * helper re-resolved tokens and hardcoded `borderRadius / borderWidth /\n * padding / backgroundColor / borderColor` defaults that clobbered\n * `kitsTheme.components.*.leftAddon.style` overrides. Both bugs are fixed by\n * deleting the indirection.\n *\n * Element slots applied here (identical contract to web):\n * container → outer FormControl wrapper\n * label → Label component (plain Text path on native — see Label.native)\n * inputGroup → input group wrapper (around addons + input). On native this\n * wrapper carries the visual border that web gets from the\n * `.p-inputgroup` CSS class.\n * leftAddon → left addon View\n * rightAddon → right addon View\n * helperText → helper text below the group\n * error → error message below the group\n *\n * The `root` slot is NOT applied here — it is applied by the parent form\n * input component directly to the inner Input/Textarea element.\n */\nconst KitsContainer: FC<PropsWithChildren<IKitsContainer>> = (props) => {\n const {\n id,\n helperText,\n children,\n rightAddon,\n leftAddon,\n errors,\n invalid,\n required,\n hideError,\n label,\n isFloatedLabel,\n containerStyle,\n disabled,\n bare,\n elementStyles: parentElementStyles,\n elementProps: parentElementProps,\n } = props;\n\n // Pure renderer: resolve the elementStyles passed in by the parent.\n // No `useComponentDefaults('FormContainer', …)` lookup — that key is\n // intentionally not part of the consumer-facing theme contract.\n const elStyles = useResolvedElementStyles(parentElementStyles || {});\n // Slot `props` — the web twin of this spreads them onto the DOM nodes.\n // On native `className` has no meaning, so it is dropped here; everything\n // else (testID, accessibility*, pointerEvents, …) is a legitimate View\n // prop and is forwarded. Same slot contract, honest about the platform.\n const elProps = parentElementProps || {};\n const stripClassName = (slot?: Record<string, any>) => {\n if (!slot) return {};\n const {className: _ignoredOnNative, ...rest} = slot;\n return rest;\n };\n const containerSlotProps = stripClassName(elProps.container);\n const inputGroupSlotProps = stripClassName(elProps.inputGroup);\n const { resolveToken } = useKitsTheme();\n const themedFont = useThemedFont('body');\n\n // Generate a unique element ID (for parity with web; not used in native labels)\n const elementId = id ? `${id}_element` : uniqueId(\"element_\");\n\n // Derive label placement from the label prop\n const placement = useMemo(() => {\n if (label && typeof label === 'object' && 'placement' in label) {\n return label.placement; // \"RL\" | \"B\" | \"T\"\n }\n return \"T\"; // default: top\n }, [label]);\n\n // Determine layout direction based on placement\n // T = top (column, label first), B = bottom (column-reverse), RL = side-by-side (row)\n const isHorizontal = placement === \"RL\";\n const isBottom = placement === \"B\";\n\n // Label uses the plain Text path (NOT the FormControlLabel path) because\n // @lmb-it/kitsconcertomobile's FormControlLabelText strips arbitrary\n // inline styles, which broke `kitsTheme.components.Input.label.style`\n // overrides on native. The plain Text path forwards `style` directly.\n const labelElement = !isFloatedLabel ? (\n <Label label={label} elementId={elementId} required={required} style={elStyles.label || undefined} />\n ) : null;\n\n /**\n * Inline addon renderer. Mirrors the dispatch web uses in FormContainer\n * (string → text, ReactElement → element) AND adds the function-arg\n * branch native needs because lucide-react-native icons are passed as\n * functions `(props) => <Icon …/>`. The function-arg branch never runs\n * on web (web never goes through this code) so it cannot affect web.\n */\n const renderAddon = (\n addon: IKitsContainer[\"leftAddon\"] | IKitsContainer[\"rightAddon\"],\n ) => {\n if (!addon) return null;\n if (typeof addon === \"string\" || typeof addon === \"number\") {\n return <Text fontSize={14}>{addon}</Text>;\n }\n if (typeof addon === \"function\") {\n return (addon as (args: { size: number }) => React.ReactNode)({ size: 16 });\n }\n if (React.isValidElement(addon)) {\n return addon;\n }\n return null;\n };\n\n // Resolved inputGroup wrapper style. The default theme provides\n // `Input.inputGroup.style.{borderColor, borderRadius, borderWidth, height}`\n // — these are what give the group its visual frame. Defaults are layered\n // *under* the user's resolved style, so a per-instance override always wins.\n //\n // The `invalid` border color is applied as a fallback default (after\n // theme defaults, before user `inputGroup.borderColor` override). When\n // `bare` is set, the whole frame is suppressed (matches web's\n // `bareInputGroupStyle`).\n const inputGroupStyle = useMemo(() => {\n if (bare) {\n // Bare mode (FilePicker, Radio, Checkbox group, …): drop ALL\n // inputGroup chrome including `height: 52` from the theme. Web's\n // FormContainer does the same — it passes `style={{}}` when\n // bare (see helpers/FormContainer/index.web.tsx, the bare\n // branch of the row Flex). Without this, the non-classic file\n // uploader's 200px dashed drop zone was being squashed to 52px.\n return {\n width: \"100%\" as const,\n borderWidth: 0,\n borderRadius: 0,\n overflow: \"visible\" as const,\n };\n }\n const userStyle = elStyles.inputGroup || {};\n const userOverrodeBorderColor = \"borderColor\" in userStyle;\n return {\n width: \"100%\" as const,\n flexDirection: \"row\" as const,\n alignItems: \"stretch\" as const,\n overflow: \"hidden\" as const,\n ...userStyle,\n ...(invalid && !userOverrodeBorderColor\n ? { borderColor: resolveToken(\"danger\") }\n : {}),\n };\n }, [bare, elStyles.inputGroup, invalid, resolveToken]);\n\n // Addon baseline chrome — mirrors what PrimeReact's `.p-inputgroup-addon`\n // CSS class gives web addons (gray fill + horizontal padding + 1px\n // separator border on the input-facing edge). On web these defaults\n // come from CSS; on native we must apply them inline. Theme overrides\n // (`elStyles.leftAddon` / `rightAddon`) are spread LAST so per-instance\n // values always win. The separator border colour falls back to the\n // inputGroup border colour for visual continuity.\n const addonSeparatorColor = (\n (elStyles.inputGroup && elStyles.inputGroup.borderColor) ||\n resolveToken(\"border\")\n );\n const addonBaseStyle = {\n alignItems: \"center\" as const,\n justifyContent: \"center\" as const,\n paddingHorizontal: 12,\n paddingVertical: 8,\n backgroundColor: resolveToken(\"bg-input\"),\n };\n\n const contentElement = (\n <View style={inputGroupStyle} {...inputGroupSlotProps}>\n {leftAddon ? (\n <View\n style={{\n ...addonBaseStyle,\n borderEndWidth: 1,\n borderEndColor: addonSeparatorColor,\n ...(elStyles.leftAddon || {}),\n }}\n >\n {renderAddon(leftAddon)}\n </View>\n ) : null}\n\n {/* `justifyContent: 'center'` vertically centres the inner Input\n inside the 52px-tall inputGroup (matching web, where flex\n items default to vertical alignment via the inputGroup row\n + the input's intrinsic line-box centring). Without this,\n placeholders and selected values sat near the top edge of\n the input. Tall children that already fill the height\n (textarea) are unaffected because `justifyContent: 'center'`\n is a no-op on items that match the parent's cross-axis. */}\n <View style={{ flex: 1, justifyContent: 'center' }}>{children}</View>\n\n {rightAddon ? (\n <View\n style={{\n ...addonBaseStyle,\n borderStartWidth: 1,\n borderStartColor: addonSeparatorColor,\n ...(elStyles.rightAddon || {}),\n }}\n >\n {renderAddon(rightAddon)}\n </View>\n ) : null}\n </View>\n );\n\n const containerRnStyle = useMemo(\n () => (containerStyle && Object.keys(containerStyle).length ? resolveStyle(containerStyle) : {}),\n [containerStyle],\n );\n\n return(\n <FormControl\n isInvalid={invalid}\n size=\"md\"\n isDisabled={disabled}\n isReadOnly={disabled}\n isRequired={required}\n {...containerSlotProps}\n style={{\n width:'100%', gap: 4,\n // `bare` strips the container's DEFAULT frame, but must not\n // override an explicit `container` slot. Spread it FIRST so a\n // user's borderRadius / borderWidth / overflow (e.g. an Object\n // or Group styled as a card) wins over the reset.\n ...(bare ? { borderWidth: 0, borderRadius: 0, overflow: 'visible' } : {}),\n ...(elStyles.container || {}),\n ...(containerRnStyle || {}),\n }}\n >\n {isHorizontal ? (\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 8, width: '100%' }}>\n {labelElement}\n <View style={{ flex: 1 }}>{contentElement}</View>\n </View>\n ) : isBottom ? (\n <>\n {contentElement}\n {labelElement}\n </>\n ) : (\n <>\n {labelElement}\n {contentElement}\n </>\n )}\n {helperText && typeof helperText !== \"function\" && <FormControlHelper>\n <FormControlHelperText style={{...(themedFont ? {fontFamily: themedFont} : {}), ...(elStyles.helperText || {})}}>\n {helperText}\n </FormControlHelperText>\n </FormControlHelper>}\n\n {!hideError && <ErrorMessage invalid={invalid} errors={errors} style={elStyles.error || undefined} />}\n </FormControl>\n )\n};\n\nexport default KitsContainer;\n"],"names":["resolveStyle"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../src/form/helpers/FormContainer/index.native.tsx"],"sourcesContent":["import React, { type FC, type PropsWithChildren, useMemo } from \"react\";\nimport { View } from \"react-native\";\nimport { uniqueId } from \"lodash\";\nimport ErrorMessage from \"../ErrorMessage\";\nimport type {IKitsContainer} from \"@lmb-it/kitsconcerto-types\";\nimport {\n FormControl,\n FormControlHelper,\n FormControlHelperText,\n style as resolveStyle,\n} from \"@lmb-it/kitsconcertomobile\"\nimport { Label, Text, useKitsTheme } from \"../../../_compat\";\nimport {useResolvedElementStyles, useThemedFont} from \"@lmb-it/kitsconcerto/hooks\";\n\n/**\n * KitsContainer (native) — wraps all form inputs with label, addons, helper\n * text, and errors. Mirror of the web variant: a pure renderer that does NO\n * independent theme lookup. Every slot style comes from `elementStyles`\n * passed by the parent input (already merged through the\n * FormElement < Input/Select < InputText/DropdownSelect/… < per-instance slots\n * chain by the parent's `useComponentDefaults` call).\n *\n * Addon rendering is inlined here (matches web FormContainer). There is NO\n * `Addons` component on either platform anymore — the previous native Addons\n * helper re-resolved tokens and hardcoded `borderRadius / borderWidth /\n * padding / backgroundColor / borderColor` defaults that clobbered\n * `kitsTheme.components.*.leftAddon.style` overrides. Both bugs are fixed by\n * deleting the indirection.\n *\n * Element slots applied here (identical contract to web):\n * container → outer FormControl wrapper\n * label → Label component (plain Text path on native — see Label.native)\n * inputGroup → input group wrapper (around addons + input). On native this\n * wrapper carries the visual border that web gets from the\n * `.p-inputgroup` CSS class.\n * leftAddon → left addon View\n * rightAddon → right addon View\n * helperText → helper text below the group\n * error → error message below the group\n *\n * The `root` slot is NOT applied here — it is applied by the parent form\n * input component directly to the inner Input/Textarea element.\n */\nconst KitsContainer: FC<PropsWithChildren<IKitsContainer>> = (props) => {\n const {\n id,\n helperText,\n children,\n rightAddon,\n leftAddon,\n errors,\n invalid,\n required,\n hideError,\n label,\n isFloatedLabel,\n containerStyle,\n disabled,\n bare,\n elementStyles: parentElementStyles,\n elementProps: parentElementProps,\n } = props;\n\n // Pure renderer: resolve the elementStyles passed in by the parent.\n // No `useComponentDefaults('FormContainer', …)` lookup — that key is\n // intentionally not part of the consumer-facing theme contract.\n const elStyles = useResolvedElementStyles(parentElementStyles || {});\n // Slot `props` — the web twin of this spreads them onto the DOM nodes.\n // On native `className` has no meaning, so it is dropped here; everything\n // else (testID, accessibility*, pointerEvents, …) is a legitimate View\n // prop and is forwarded. Same slot contract, honest about the platform.\n const elProps = parentElementProps || {};\n const stripClassName = (slot?: Record<string, any>) => {\n if (!slot) return {};\n const {className: _ignoredOnNative, ...rest} = slot;\n return rest;\n };\n const containerSlotProps = stripClassName(elProps.container);\n const inputGroupSlotProps = stripClassName(elProps.inputGroup);\n const { resolveToken } = useKitsTheme();\n const themedFont = useThemedFont('body');\n\n // Generate a unique element ID (for parity with web; not used in native labels)\n const elementId = id ? `${id}_element` : uniqueId(\"element_\");\n\n // Derive label placement from the label prop\n const placement = useMemo(() => {\n if (label && typeof label === 'object' && 'placement' in label) {\n return label.placement; // \"RL\" | \"B\" | \"T\"\n }\n return \"T\"; // default: top\n }, [label]);\n\n // Determine layout direction based on placement\n // T = top (column, label first), B = bottom (column-reverse), RL = side-by-side (row)\n const isHorizontal = placement === \"RL\";\n const isBottom = placement === \"B\";\n\n // Label uses the plain Text path (NOT the FormControlLabel path) because\n // @lmb-it/kitsconcertomobile's FormControlLabelText strips arbitrary\n // inline styles, which broke `kitsTheme.components.Input.label.style`\n // overrides on native. The plain Text path forwards `style` directly.\n const labelElement = !isFloatedLabel ? (\n <Label label={label} elementId={elementId} required={required} style={elStyles.label || undefined} />\n ) : null;\n\n /**\n * Inline addon renderer. Mirrors the dispatch web uses in FormContainer\n * (string → text, ReactElement → element) AND adds the function-arg\n * branch native needs because lucide-react-native icons are passed as\n * functions `(props) => <Icon …/>`. The function-arg branch never runs\n * on web (web never goes through this code) so it cannot affect web.\n */\n const renderAddon = (\n addon: IKitsContainer[\"leftAddon\"] | IKitsContainer[\"rightAddon\"],\n ) => {\n if (!addon) return null;\n if (typeof addon === \"string\" || typeof addon === \"number\") {\n return <Text fontSize={14}>{addon}</Text>;\n }\n if (typeof addon === \"function\") {\n return (addon as (args: { size: number }) => React.ReactNode)({ size: 16 });\n }\n if (React.isValidElement(addon)) {\n return addon;\n }\n return null;\n };\n\n // Resolved inputGroup wrapper style. The default theme provides\n // `Input.inputGroup.style.{borderColor, borderRadius, borderWidth, height}`\n // — these are what give the group its visual frame. Defaults are layered\n // *under* the user's resolved style, so a per-instance override always wins.\n //\n // The `invalid` border color is applied as a fallback default (after\n // theme defaults, before user `inputGroup.borderColor` override). When\n // `bare` is set, the whole frame is suppressed (matches web's\n // `bareInputGroupStyle`).\n const inputGroupStyle = useMemo(() => {\n if (bare) {\n // Bare mode (FilePicker, Radio, Checkbox group, …): drop ALL\n // inputGroup chrome including `height: 52` from the theme. Web's\n // FormContainer does the same — it passes `style={{}}` when\n // bare (see helpers/FormContainer/index.web.tsx, the bare\n // branch of the row Flex). Without this, the non-classic file\n // uploader's 200px dashed drop zone was being squashed to 52px.\n return {\n width: \"100%\" as const,\n borderWidth: 0,\n borderRadius: 0,\n overflow: \"visible\" as const,\n };\n }\n const userStyle = elStyles.inputGroup || {};\n const userOverrodeBorderColor = \"borderColor\" in userStyle;\n return {\n width: \"100%\" as const,\n flexDirection: \"row\" as const,\n alignItems: \"stretch\" as const,\n overflow: \"hidden\" as const,\n ...userStyle,\n ...(invalid && !userOverrodeBorderColor\n ? { borderColor: resolveToken(\"danger\") }\n : {}),\n };\n }, [bare, elStyles.inputGroup, invalid, resolveToken]);\n\n // Addon baseline chrome — mirrors what PrimeReact's `.p-inputgroup-addon`\n // CSS class gives web addons (gray fill + horizontal padding + 1px\n // separator border on the input-facing edge). On web these defaults\n // come from CSS; on native we must apply them inline. Theme overrides\n // (`elStyles.leftAddon` / `rightAddon`) are spread LAST so per-instance\n // values always win. The separator border colour falls back to the\n // inputGroup border colour for visual continuity.\n const addonSeparatorColor = (\n (elStyles.inputGroup && elStyles.inputGroup.borderColor) ||\n resolveToken(\"border\")\n );\n const addonBaseStyle = {\n alignItems: \"center\" as const,\n justifyContent: \"center\" as const,\n paddingHorizontal: 12,\n paddingVertical: 8,\n backgroundColor: resolveToken(\"bg-input\"),\n };\n\n const contentElement = (\n <View style={inputGroupStyle} {...inputGroupSlotProps}>\n {leftAddon ? (\n <View\n style={{\n ...addonBaseStyle,\n borderEndWidth: 1,\n borderEndColor: addonSeparatorColor,\n ...(elStyles.leftAddon || {}),\n }}\n >\n {renderAddon(leftAddon)}\n </View>\n ) : null}\n\n {/* `justifyContent: 'center'` vertically centres the inner Input\n inside the 52px-tall inputGroup (matching web, where flex\n items default to vertical alignment via the inputGroup row\n + the input's intrinsic line-box centring). Without this,\n placeholders and selected values sat near the top edge of\n the input. Tall children that already fill the height\n (textarea) are unaffected because `justifyContent: 'center'`\n is a no-op on items that match the parent's cross-axis. */}\n <View style={{ flex: 1, justifyContent: 'center' }}>{children}</View>\n\n {rightAddon ? (\n <View\n style={{\n ...addonBaseStyle,\n borderStartWidth: 1,\n borderStartColor: addonSeparatorColor,\n ...(elStyles.rightAddon || {}),\n }}\n >\n {renderAddon(rightAddon)}\n </View>\n ) : null}\n </View>\n );\n\n const containerRnStyle = useMemo(\n () => (containerStyle && Object.keys(containerStyle).length ? resolveStyle(containerStyle) : {}),\n [containerStyle],\n );\n\n return(\n <FormControl\n isInvalid={invalid}\n size=\"md\"\n isDisabled={disabled}\n isReadOnly={disabled}\n isRequired={required}\n {...containerSlotProps}\n style={{\n width:'100%', gap: 4,\n // `bare` strips the container's DEFAULT frame, but must not\n // override an explicit `container` slot. Spread it FIRST so a\n // user's borderRadius / borderWidth / overflow (e.g. an Object\n // or Group styled as a card) wins over the reset.\n ...(bare ? { borderWidth: 0, borderRadius: 0, overflow: 'visible' } : {}),\n ...(elStyles.container || {}),\n ...(containerRnStyle || {}),\n }}\n >\n {isHorizontal ? (\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 8, width: '100%' }}>\n {labelElement}\n <View style={{ flex: 1 }}>{contentElement}</View>\n </View>\n ) : isBottom ? (\n <>\n {contentElement}\n {labelElement}\n </>\n ) : (\n <>\n {labelElement}\n {contentElement}\n </>\n )}\n {helperText && typeof helperText !== \"function\" && <FormControlHelper>\n <FormControlHelperText style={{...(themedFont ? {fontFamily: themedFont} : {}), ...(elStyles.helperText || {})}}>\n {helperText}\n </FormControlHelperText>\n </FormControlHelper>}\n\n {!hideError && <ErrorMessage invalid={invalid} errors={errors} style={elStyles.error || undefined} />}\n </FormControl>\n )\n};\n\nexport default KitsContainer;\n"],"names":["resolveStyle"],"mappings":"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"}
|
|
@@ -61,6 +61,7 @@ require('yup');
|
|
|
61
61
|
require('../../../packages/types/src/Css/map/index.cjs');
|
|
62
62
|
require('../../../packages/types/src/Theme/shadows.cjs');
|
|
63
63
|
require('../../../packages/types/src/Theme/defaultTheme.cjs');
|
|
64
|
+
require('../../../packages/types/src/Theme/resolvers.cjs');
|
|
64
65
|
require('../../../packages/types/src/Theme/alphaColors.cjs');
|
|
65
66
|
require('../../../apps/mobile/src/Factory/helpers/cssVarMap.cjs');
|
|
66
67
|
require('../../../apps/mobile/src/Factory/DimensionsContext.cjs');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"label.cjs","sources":["../../../../../src/form/helpers/Label/label.native.tsx"],"sourcesContent":["import React, { type FunctionComponent, isValidElement, useMemo } from \"react\";\nimport { Text } from \"../../../_compat\";\nimport { useLanguage } from \"../../../_compat\";\nimport type {ILabelProps} from \"@lmb-it/kitsconcerto-types\";\nimport {FormControlLabel, FormControlLabelText} from \"@lmb-it/kitsconcertomobile\";\nimport useThemedFont from \"../../../hooks/useThemedFont\";\n\n\n\nconst Label: FunctionComponent<ILabelProps> = ({ label, className, isFormControl = false, elementId, required, style }) => {\n const { isRTL } = useLanguage();\n const labelFont = useThemedFont('body');\n\n const renderLabel = useMemo(() => {\n if (!label) return \"\";\n\n if (isValidElement(label) || typeof label === \"string\") {\n return label;\n }\n\n if (\"element\" in label && label.element) {\n return label.element;\n }\n\n if (\"text\" in label && label.text) {\n return label.text;\n }\n\n return \"\";\n }, [label]);\n\n const labelClasses = useMemo(() => {\n const classes: string[] = [\"label-position\", \"w-full\"];\n\n if(className){\n classes.push(className)\n }\n // NOTE: `text-right` used to be pushed via className for RTL labels,\n // but the underlying Text primitive does not process NativeWind class\n // names on native — the class was silently dropped. Direction is now\n // applied via inline `textAlign` below so it actually renders.\n if (label && typeof label !== \"string\" && \"placement\" in label) {\n if (label.placement === \"RL\") classes.push(\"RL\");\n if (label.placement === \"B\") classes.push(\"B\");\n if (label.placement === \"T\") classes.push(\"T\");\n }\n\n return classes.join(\" \");\n }, [label, className]);\n\n // Inline style — applied on top of any consumer-supplied `style` so per-\n // element overrides still win, but a global RTL/LTR alignment is always\n // present. textAlign='auto' fails on iOS for short standalone labels\n // because RN cannot detect script when the string is too short — so we\n // pick explicit left/right based on the active locale.\n const directionStyle = useMemo(\n () => ({\n textAlign: (isRTL ? \"right\" : \"left\") as \"right\" | \"left\",\n writingDirection: (isRTL ? \"rtl\" : \"ltr\") as \"rtl\" | \"ltr\",\n }),\n [isRTL],\n );\n\n if (!label) return null;\n\n // If the resolved label is already a ReactElement, render it directly without wrapping in Text\n if (isValidElement(renderLabel)) {\n return <>{renderLabel}</>;\n }\n\n if(!isFormControl){\n return(\n <Text\n className={labelClasses}\n style={{ ...directionStyle, ...(style || {}) }}\n // htmlFor does not exist on native; we keep the prop name out completely.\n >\n {renderLabel}\n </Text>\n )\n }\n return(\n <FormControlLabel className={labelClasses} style={{padding:0, ...directionStyle, ...(style || {})}}>\n <FormControlLabelText style={{padding:0, ...(labelFont ? {fontFamily: labelFont} : {}), ...directionStyle, ...(style || {})}}>{renderLabel}</FormControlLabelText>\n </FormControlLabel>\n )\n};\n\nexport default Label;\n"],"names":["useLanguage","useThemedFont","useMemo","isValidElement","jsx","Text","FormControlLabel","FormControlLabelText"],"mappings":"
|
|
1
|
+
{"version":3,"file":"label.cjs","sources":["../../../../../src/form/helpers/Label/label.native.tsx"],"sourcesContent":["import React, { type FunctionComponent, isValidElement, useMemo } from \"react\";\nimport { Text } from \"../../../_compat\";\nimport { useLanguage } from \"../../../_compat\";\nimport type {ILabelProps} from \"@lmb-it/kitsconcerto-types\";\nimport {FormControlLabel, FormControlLabelText} from \"@lmb-it/kitsconcertomobile\";\nimport useThemedFont from \"../../../hooks/useThemedFont\";\n\n\n\nconst Label: FunctionComponent<ILabelProps> = ({ label, className, isFormControl = false, elementId, required, style }) => {\n const { isRTL } = useLanguage();\n const labelFont = useThemedFont('body');\n\n const renderLabel = useMemo(() => {\n if (!label) return \"\";\n\n if (isValidElement(label) || typeof label === \"string\") {\n return label;\n }\n\n if (\"element\" in label && label.element) {\n return label.element;\n }\n\n if (\"text\" in label && label.text) {\n return label.text;\n }\n\n return \"\";\n }, [label]);\n\n const labelClasses = useMemo(() => {\n const classes: string[] = [\"label-position\", \"w-full\"];\n\n if(className){\n classes.push(className)\n }\n // NOTE: `text-right` used to be pushed via className for RTL labels,\n // but the underlying Text primitive does not process NativeWind class\n // names on native — the class was silently dropped. Direction is now\n // applied via inline `textAlign` below so it actually renders.\n if (label && typeof label !== \"string\" && \"placement\" in label) {\n if (label.placement === \"RL\") classes.push(\"RL\");\n if (label.placement === \"B\") classes.push(\"B\");\n if (label.placement === \"T\") classes.push(\"T\");\n }\n\n return classes.join(\" \");\n }, [label, className]);\n\n // Inline style — applied on top of any consumer-supplied `style` so per-\n // element overrides still win, but a global RTL/LTR alignment is always\n // present. textAlign='auto' fails on iOS for short standalone labels\n // because RN cannot detect script when the string is too short — so we\n // pick explicit left/right based on the active locale.\n const directionStyle = useMemo(\n () => ({\n textAlign: (isRTL ? \"right\" : \"left\") as \"right\" | \"left\",\n writingDirection: (isRTL ? \"rtl\" : \"ltr\") as \"rtl\" | \"ltr\",\n }),\n [isRTL],\n );\n\n if (!label) return null;\n\n // If the resolved label is already a ReactElement, render it directly without wrapping in Text\n if (isValidElement(renderLabel)) {\n return <>{renderLabel}</>;\n }\n\n if(!isFormControl){\n return(\n <Text\n className={labelClasses}\n style={{ ...directionStyle, ...(style || {}) }}\n // htmlFor does not exist on native; we keep the prop name out completely.\n >\n {renderLabel}\n </Text>\n )\n }\n return(\n <FormControlLabel className={labelClasses} style={{padding:0, ...directionStyle, ...(style || {})}}>\n <FormControlLabelText style={{padding:0, ...(labelFont ? {fontFamily: labelFont} : {}), ...directionStyle, ...(style || {})}}>{renderLabel}</FormControlLabelText>\n </FormControlLabel>\n )\n};\n\nexport default Label;\n"],"names":["useLanguage","useThemedFont","useMemo","isValidElement","jsx","Text","FormControlLabel","FormControlLabelText"],"mappings":"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"}
|
|
@@ -57,6 +57,7 @@ import 'yup';
|
|
|
57
57
|
import '../../../packages/types/src/Css/map/index.js';
|
|
58
58
|
import '../../../packages/types/src/Theme/shadows.js';
|
|
59
59
|
import '../../../packages/types/src/Theme/defaultTheme.js';
|
|
60
|
+
import '../../../packages/types/src/Theme/resolvers.js';
|
|
60
61
|
import '../../../packages/types/src/Theme/alphaColors.js';
|
|
61
62
|
import '../../../apps/mobile/src/Factory/helpers/cssVarMap.js';
|
|
62
63
|
import '../../../apps/mobile/src/Factory/DimensionsContext.js';
|