diff --git a/packages/form-upload/package.json b/packages/form-upload/package.json index 4530640ed8..8ca4f540b9 100644 --- a/packages/form-upload/package.json +++ b/packages/form-upload/package.json @@ -32,7 +32,7 @@ "devDependencies": { "@availity/api-axios": "^10.0.3", "@availity/form": "workspace:*", - "@availity/upload-core": "^7.1.1", + "@availity/upload-core": "^8.1.0", "formik": "^2.4.6", "nock": "^13.5.6", "react": "^18.3.1", @@ -46,7 +46,7 @@ "peerDependencies": { "@availity/api-axios": "^10.0.3", "@availity/form": "^1.9.3", - "@availity/upload-core": "^7.0.0", + "@availity/upload-core": "^8.0.0", "formik": "^2.4.6", "react": "^18.0.0", "react-dropzone": "^11.7.1", diff --git a/packages/form-upload/src/Upload.d.ts b/packages/form-upload/src/Upload.d.ts index c3a5183629..49db546d85 100644 --- a/packages/form-upload/src/Upload.d.ts +++ b/packages/form-upload/src/Upload.d.ts @@ -27,6 +27,7 @@ export interface UploadProps { name?: string; showFileDrop?: boolean; getDropRejectionMessage?: (errors: FileError[], file: File) => string; + customHeaders?: object; } declare const Upload: (props: UploadProps) => JSX.Element; diff --git a/packages/form-upload/src/Upload.js b/packages/form-upload/src/Upload.js index 4c30bcda8d..5dff7b7dd3 100644 --- a/packages/form-upload/src/Upload.js +++ b/packages/form-upload/src/Upload.js @@ -49,6 +49,7 @@ const Upload = ({ showFileDrop = false, fallback = dropzoneFallback, isCloud, + customHeaders, }) => { const [field, metadata] = useField(name); const { errors, isSubmitting, isValidating, setFieldError, setFieldValue, setFieldTouched } = useFormikContext(); @@ -197,6 +198,7 @@ const Upload = ({ fileTypes: allowedFileTypes, maxSize, allowedFileNameCharacters, + customHeaders, }; if (isCloud) options.endpoint = CLOUD_URL; @@ -382,6 +384,8 @@ Upload.propTypes = { onFileUpload: PropTypes.func, /** Set as true to show a drag and drop file upload option instead of a button (file explorer still available on click). */ showFileDrop: PropTypes.bool, + /** Set custom headers on the upload request */ + customHeaders: PropTypes.object, }; export default Upload; diff --git a/packages/form-upload/tests/Upload.test.tsx b/packages/form-upload/tests/Upload.test.tsx index b4cc68940e..59318ddcc4 100644 --- a/packages/form-upload/tests/Upload.test.tsx +++ b/packages/form-upload/tests/Upload.test.tsx @@ -335,6 +335,46 @@ describe('Upload', () => { }); }); + test('passes customHeaders to UploadCore options', async () => { + const customHeaders = { 'X-Custom-Header': 'test-value' }; + const mockFn = jest.fn(); + const onFileUploadMock = jest.fn(); + + render( +
+ ); + + const file: UploadFile = Buffer.from('hello world'); + file.name = 'fileName.png'; + const fileEvent = { target: { files: [file] } }; + + const inputNode = screen.getByTestId('file-picker') as HTMLInputElement; + + act(() => { + fireEvent.change(inputNode, fileEvent); + }); + + await waitFor(() => { + expect(onFileUploadMock).toHaveBeenCalled(); + }); + + act(() => { + fireEvent.click(screen.getByText('click')); + }); + + await waitFor(() => { + expect(mockFn).toHaveBeenCalledWith(customHeaders); + }); + }); + describe('dropzone', () => { // start msw server beforeAll(() => server.listen()); diff --git a/packages/link/package.json b/packages/link/package.json index 63b1dd8e6d..a44eba3e60 100644 --- a/packages/link/package.json +++ b/packages/link/package.json @@ -25,7 +25,7 @@ "publish:canary": "yarn npm publish --access public --tag canary" }, "dependencies": { - "@availity/resolve-url": "^3.0.3", + "@availity/resolve-url": "^4.0.0", "classnames": "^2.5.1", "prop-types": "^15.8.1" }, diff --git a/packages/upload/package.json b/packages/upload/package.json index a28f157221..f799af13f1 100644 --- a/packages/upload/package.json +++ b/packages/upload/package.json @@ -29,14 +29,14 @@ "prop-types": "^15.8.1" }, "devDependencies": { - "@availity/upload-core": "^7.1.1", + "@availity/upload-core": "^8.1.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-dropzone": "^11.7.1", "reactstrap": "^8.10.1" }, "peerDependencies": { - "@availity/upload-core": "^7.0.0", + "@availity/upload-core": "^8.0.0", "react": "^18.0.0", "react-dom": "^18.0.0", "react-dropzone": "^11.7.1", diff --git a/packages/upload/src/Upload.js b/packages/upload/src/Upload.js index 02125e12bc..bfb728cfd0 100644 --- a/packages/upload/src/Upload.js +++ b/packages/upload/src/Upload.js @@ -62,6 +62,7 @@ class Upload extends Component { maxSize: this.props.maxSize, onPreStart: this.props.onFilePreUpload || [], allowedFileNameCharacters: this.props.allowedFileNameCharacters, + headers: this.props.customHeaders, }; if (this.props.endpoint) options.endpoint = this.props.endpoint; @@ -288,6 +289,8 @@ Upload.propTypes = { isCloud: PropTypes.bool, /** Override the endpoint used for uploading the file(s) */ endpoint: PropTypes.string, + /** Set custom headers on the upload request */ + customHeaders: PropTypes.object, }; Upload.defaultProps = { diff --git a/packages/upload/tests/Upload.test.js b/packages/upload/tests/Upload.test.js index 424680f9b5..3d56b6287c 100644 --- a/packages/upload/tests/Upload.test.js +++ b/packages/upload/tests/Upload.test.js @@ -298,4 +298,37 @@ describe('Upload', () => { expect(mockFn).toHaveBeenCalledWith('http://localhost/test/foo'); }); }); + + test('passes customHeaders to UploadCore options', async () => { + const customHeaders = { 'X-Custom-Header': 'test-value' }; + const mockFn = jest.fn(); + + render( +