Skip to content

Commit b092f6b

Browse files
authored
Merge pull request #273 from DevinoSolutions/271-uploading-3d-files-not-working-as-expected
271 uploading 3d files not working as expected
2 parents 481d5b7 + 0f13765 commit b092f6b

File tree

12 files changed

+142
-89
lines changed

12 files changed

+142
-89
lines changed

README.md

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,7 @@ app.post('/api/upload-token', async (req, res) => {
111111
enableAutoCorsConfig,
112112
})
113113

114-
return res.status(200).json({
115-
data: presignedData,
116-
message: 'Upload successful!',
117-
error: false,
118-
})
114+
return res.status(200).json(presignedData)
119115
} catch (error) {
120116
return res.status(500).json({
121117
message: (error as Error).message,

package.json

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "upup-react-file-uploader",
33
"author": "Devino Solutions",
44
"license": "MIT",
5-
"version": "1.1.1",
5+
"version": "1.2.0",
66
"publishConfig": {
77
"access": "public"
88
},
@@ -57,8 +57,8 @@
5757
],
5858
"scripts": {
5959
"start": "pnpm run prebuild && tsdx watch",
60-
"build:browser": "tsdx build --entry ./src/index.browser.ts --tsconfig ./tsconfig.browser.json --format esm,cjs --name browser",
61-
"build:node": "tsdx build --entry ./src/index.node.ts --tsconfig ./tsconfig.node.json --format cjs --name node",
60+
"build:browser": "tsdx build --no-minify --entry ./src/index.browser.ts --tsconfig ./tsconfig.browser.json --format esm,cjs --name browser",
61+
"build:node": "tsdx build --no-minify --entry ./src/index.node.ts --tsconfig ./tsconfig.node.json --format cjs --name node",
6262
"build": "node scripts/build.js",
6363
"test": "jest",
6464
"test:watch": "jest --watch",
@@ -193,7 +193,9 @@
193193
"jsdom": "22.1.0",
194194
"node-notifier": "10.0.1",
195195
"node-fetch": "2.6.7",
196-
"rollup": "^3.29.4"
196+
"rollup": "^3.29.4",
197+
"terser": "^5.39.0",
198+
"rollup-plugin-terser": "7.0.2"
197199
}
198200
}
199201
}

pnpm-lock.yaml

Lines changed: 21 additions & 39 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/__tests__/shared/checkFileType.test.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,22 @@ import checkFileType from '../../shared/lib/checkFileType'
22

33
const JPEGImage = {
44
type: 'image/jpeg',
5+
name: 'test.jpg',
56
} as File
7+
68
const PNGImage = {
79
type: 'image/png',
10+
name: 'test.png',
811
} as File
12+
913
const GIFImage = {
1014
type: 'image/gif',
15+
name: 'test.gif',
1116
} as File
17+
1218
const PDFFile = {
1319
type: 'application/pdf',
20+
name: 'test.pdf',
1421
} as File
1522

1623
describe('checkFileType', () => {

src/frontend/components/FilePreview.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ export default memo(
104104
fileName={fileName}
105105
fileUrl={fileUrl}
106106
showIcon={files.size > 1}
107+
classNames={classNames}
107108
/>
108109
</ShouldRender>
109110
<button

src/frontend/components/FilePreviewThumbnail.tsx

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React, { Dispatch, SetStateAction, memo, useMemo } from 'react'
2-
import { fileGetExtension } from '../lib/file'
2+
import { UpupUploaderPropsClassNames } from '../../shared/types'
3+
import { fileGetExtension, fileIs3D } from '../lib/file'
34
import { cn } from '../lib/tailwind'
45
import FileIcon from './FileIcon'
56
import ShouldRender from './shared/ShouldRender'
@@ -11,6 +12,7 @@ type Props = {
1112
fileName: string
1213
fileUrl: string
1314
showIcon: boolean
15+
classNames: UpupUploaderPropsClassNames
1416
}
1517

1618
export default memo(
@@ -21,12 +23,29 @@ export default memo(
2123
fileName,
2224
fileType,
2325
showIcon,
26+
classNames,
2427
}: Props) {
2528
const extension = useMemo(
2629
() => fileGetExtension(fileType, fileName),
2730
[fileType, fileName],
2831
)
2932

33+
// New check for 3D
34+
const is3D = useMemo(() => {
35+
return fileIs3D(extension?.toLowerCase() || '')
36+
}, [extension])
37+
38+
if (is3D) {
39+
return (
40+
<div className="flex flex-col items-center gap-2">
41+
<FileIcon
42+
extension={extension}
43+
className={classNames.fileIcon}
44+
/>
45+
</div>
46+
)
47+
}
48+
3049
return (
3150
<>
3251
<ShouldRender if={!canPreview}>
@@ -42,12 +61,17 @@ export default memo(
4261
</object>
4362
<FileIcon extension={extension} />
4463
</ShouldRender>
64+
4565
<ShouldRender if={canPreview}>
4666
<FileIcon
4767
extension={extension}
48-
className={cn('@cs/main:hidden', {
49-
hidden: !showIcon,
50-
})}
68+
className={cn(
69+
'@cs/main:hidden',
70+
{
71+
hidden: !showIcon,
72+
},
73+
classNames.fileIcon,
74+
)}
5175
/>
5276
<div
5377
className={cn('relative h-full w-full', {
@@ -69,7 +93,6 @@ export default memo(
6993
</>
7094
)
7195
},
72-
// Custom comparison function for props
7396
(prev, next) =>
7497
prev.canPreview === next.canPreview &&
7598
prev.fileType === next.fileType &&

src/frontend/components/FileViewerUnsupported.tsx

Lines changed: 0 additions & 17 deletions
This file was deleted.

src/frontend/lib/file.ts

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,39 @@ export function fileGetIsImage(fileType: string) {
101101
}
102102

103103
export function fileGetExtension(fileType: string, fileName: string) {
104+
if (!fileType) {
105+
return fileName.split('.').pop()?.toLowerCase() || ''
106+
}
104107
const typeSplit = fileType.split('/')
105108
const nameSplit = fileName.split('.')
109+
const lastNamePart = nameSplit[nameSplit.length - 1]?.toLowerCase() || ''
110+
if (!typeSplit[1]) {
111+
return lastNamePart
112+
}
113+
if (typeSplit[1].includes('.')) {
114+
return lastNamePart
115+
}
116+
return typeSplit[1].toLowerCase()
117+
}
106118

107-
return typeSplit[1]?.includes('.')
108-
? nameSplit[nameSplit.length - 1]
109-
: typeSplit[1]
119+
export function fileIs3D(ext: string) {
120+
const threeDExtensions = [
121+
'3ds',
122+
'3dm',
123+
'blend',
124+
'dxf',
125+
'dwg',
126+
'c4d',
127+
'ma',
128+
'mb',
129+
'ply',
130+
'stl',
131+
'fbx',
132+
'obj',
133+
'dae',
134+
'gltf',
135+
'glb',
136+
'm3',
137+
]
138+
return threeDExtensions.includes(ext.toLowerCase())
110139
}

src/frontend/lib/storage/provider.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,12 +203,12 @@ export class ProviderSDK implements StorageSDK {
203203

204204
if (
205205
accept &&
206-
!/^(\*\/\*|\*|[\w-]+\/[\w+.-]+)(,(\*\/\*|\*|[\w-]+\/[\w+.-]+))*$/.test(
206+
!/^(\*\/\*|\*|[\w-]+\/(?:[\w+.-]+|\*)|\.[\w+.-]+)(,\s*(\*\/\*|\*|[\w-]+\/(?:[\w+.-]+|\*)|\.[\w+.-]+))*$/.test(
207207
accept,
208208
)
209209
) {
210210
throw new UploadError(
211-
`Invalid accept format: ${accept}. Use MIME types, */*, or *`,
211+
`Invalid accept format: ${accept}. Use MIME types, */*, * or extensions (like .fbx)`,
212212
UploadErrorType.FILE_VALIDATION_ERROR,
213213
)
214214
}

0 commit comments

Comments
 (0)