Skip to content

Commit 407e90f

Browse files
Support jpg textures (#1114)
* feat: support jpg & jpge textures * feat: support jpg and jpeg for all images inputs * feat: update validation for textures * feat: Update regez to support .jpg and .jpge extensions * feat: fix lint issues * feat: add validation on input change * feat: change regex to pass tests * feat: update validation on component * feat: add error message for invalid URL and stop validating empty field * feat: update message
1 parent 8d0d66b commit 407e90f

File tree

4 files changed

+16
-7
lines changed

4 files changed

+16
-7
lines changed

packages/@dcl/inspector/src/components/EntityInspector/MaterialInspector/Texture/Texture.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,9 @@ function TextureInspector({ label, texture, files, getInputProps }: Props) {
3939
label="Path"
4040
accept={ACCEPTED_FILE_TYPES['image']}
4141
onDrop={handleDrop}
42-
error={!!src.value && files && !isValid}
42+
error={!!src.value && !isValid}
4343
isValidFile={isModel}
44+
acceptURLs
4445
/>
4546
)}
4647
{/* {type.value === Texture.TT_AVATAR_TEXTURE && <TextField label="User ID" {...getInputProps(`${texture}.userId`)} />}*/}

packages/@dcl/inspector/src/components/EntityInspector/MaterialInspector/Texture/utils.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ export const toTexture = (base: string, value?: TextureInput): TextureUnion => {
7777
}
7878
}
7979

80-
export const isTexture = (value: string): boolean => value.endsWith('.png')
80+
export const isTexture = (value: string): boolean =>
81+
value.endsWith('.png') || value.endsWith('.jpg') || value.endsWith('.jpeg')
8182
export const isModel = (node: TreeNode): node is AssetNodeItem => isAssetNode(node) && isTexture(node.name)
8283

8384
export function isValidTexture(value: any, files?: AssetCatalogResponse): boolean {

packages/@dcl/inspector/src/components/ui/FileUploadField/FileUploadField.tsx

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { isAudio } from '../../EntityInspector/AudioSourceInspector/utils'
1414
import { isModel as isTexture } from '../../EntityInspector/MaterialInspector/Texture/utils'
1515
import { TreeNode } from '../../ProjectAssetExplorer/ProjectView'
1616
import { AssetNodeItem } from '../../ProjectAssetExplorer/types'
17+
import { isValidHttpsUrl } from '../../../lib/utils/url'
1718

1819
import { TextField } from '../TextField'
1920
import { Message, MessageType } from '../Message'
@@ -36,9 +37,11 @@ const FileUploadField: React.FC<Props> = ({
3637
onDrop,
3738
onChange,
3839
isValidFile,
40+
acceptURLs = false,
3941
accept = EXTENSIONS
4042
}) => {
4143
const [path, setPath] = useState<string | undefined>(value?.toString())
44+
const [errorMessage, setErrorMessage] = useState<string | undefined>('File not valid.')
4245
const [dropError, setDropError] = useState<boolean>(false)
4346
const inputRef = useRef<HTMLInputElement>(null)
4447
const files = useAppSelector(selectAssetCatalog)
@@ -144,15 +147,18 @@ const FileUploadField: React.FC<Props> = ({
144147
const handleChangeTextField = useCallback(
145148
(event: React.ChangeEvent<HTMLInputElement>) => {
146149
const { value } = event.target
147-
if (value && isValidFileName(value)) {
150+
if (value && (isValidFileName(value) || (acceptURLs && isValidHttpsUrl(value)))) {
148151
setPath(addBase(value))
149152
onChange && onChange(event)
150153
setDropError(false)
151154
} else {
152155
setDropError(true)
156+
setErrorMessage(
157+
acceptURLs && !isValidHttpsUrl(value) ? 'Provide a https URL or a valid file path' : 'File not valid.'
158+
)
153159
}
154160
},
155-
[addBase, setPath, setDropError]
161+
[addBase, setPath, setDropError, acceptURLs, onChange]
156162
)
157163

158164
const hasError = useMemo(() => {
@@ -166,7 +172,7 @@ const FileUploadField: React.FC<Props> = ({
166172
id={id.current}
167173
className="FileUploadInput"
168174
ref={drop}
169-
placeholder="File Path"
175+
placeholder={acceptURLs ? 'https://... or File Path' : 'File Path'}
170176
label={label}
171177
onChange={handleChangeTextField}
172178
value={removeBase(path)}
@@ -182,7 +188,7 @@ const FileUploadField: React.FC<Props> = ({
182188
</button>
183189
)}
184190
</div>
185-
{hasError && <Message text="File not valid." type={MessageType.ERROR} />}
191+
{hasError && <Message text={errorMessage} type={MessageType.ERROR} />}
186192
</div>
187193
)
188194
}

packages/@dcl/inspector/src/components/ui/FileUploadField/types.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@ export type Props = Omit<TextFieldProps, 'accept' | 'type' | 'onDrop'> & {
88
onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void
99
isValidFile?: (node: TreeNode) => boolean
1010
showPreview?: boolean
11+
acceptURLs?: boolean
1112
}
1213

1314
export const ACCEPTED_FILE_TYPES = {
1415
model: ['.gltf', '.glb'],
15-
image: ['.png'],
16+
image: ['.png', '.jpg', '.jpeg'],
1617
audio: ['.mp3', '.wav', '.ogg'],
1718
video: ['.mp4']
1819
}

0 commit comments

Comments
 (0)