Skip to content

Commit e044714

Browse files
authored
Merge pull request #153 from imagekit-developer/IK-1418
Override upload parameters
2 parents 055685f + c843890 commit e044714

File tree

7 files changed

+179
-103
lines changed

7 files changed

+179
-103
lines changed

README.md

Lines changed: 100 additions & 84 deletions
Large diffs are not rendered by default.

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "imagekitio-react",
3-
"version": "4.0.0",
3+
"version": "4.1.0",
44
"description": "React SDK for ImageKit.io which implements client-side upload and URL generation for use inside a react application.",
55
"scripts": {
66
"build:js": "rollup -c",
@@ -87,4 +87,4 @@
8787
"react": "^16.13.1 || ^17.0.0 || ^18.0.0",
8888
"react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0"
8989
}
90-
}
90+
}

src/components/IKUpload/index.tsx

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React, { forwardRef, useContext, useEffect, useState } from 'react';
22
import { IKContextBaseProps } from "../IKContext/props";
3-
import { IKUploadProps } from "./props";
3+
import { IKUploadProps, OverrideValues } from "./props";
44
import { ImageKitContext } from '../IKContext';
55
import useImageKitComponent from '../ImageKitComponent';
66

@@ -50,6 +50,7 @@ const IKUpload = forwardRef<HTMLInputElement, IKUploadProps & IKContextBaseProps
5050
extensions,
5151
customMetadata,
5252
transformation,
53+
overrideParameters,
5354
...restProps
5455
} = props;
5556

@@ -60,6 +61,7 @@ const IKUpload = forwardRef<HTMLInputElement, IKUploadProps & IKContextBaseProps
6061
const urlEndpoint = props.urlEndpoint || contextOptions.urlEndpoint;
6162

6263
if (!publicKey || publicKey.trim() === "") {
64+
console.error("Missing publicKey");
6365
if (onError && typeof onError === "function") {
6466
onError({
6567
message: "Missing publicKey"
@@ -69,6 +71,7 @@ const IKUpload = forwardRef<HTMLInputElement, IKUploadProps & IKContextBaseProps
6971
}
7072

7173
if (!authenticator) {
74+
console.error("The authenticator function is not provided.");
7275
if (onError && typeof onError === "function") {
7376
onError({
7477
message: "The authenticator function is not provided."
@@ -78,6 +81,7 @@ const IKUpload = forwardRef<HTMLInputElement, IKUploadProps & IKContextBaseProps
7881
}
7982

8083
if (typeof authenticator !== 'function') {
84+
console.error("The provided authenticator is not a function.");
8185
if (onError && typeof onError === "function") {
8286
onError({
8387
message: "The provided authenticator is not a function."
@@ -87,6 +91,7 @@ const IKUpload = forwardRef<HTMLInputElement, IKUploadProps & IKContextBaseProps
8791
}
8892

8993
if (!urlEndpoint || urlEndpoint.trim() === "") {
94+
console.error("Missing urlEndpoint");
9095
if (onError && typeof onError === "function") {
9196
onError({
9297
message: "Missing urlEndpoint"
@@ -110,6 +115,12 @@ const IKUpload = forwardRef<HTMLInputElement, IKUploadProps & IKContextBaseProps
110115
props.onUploadStart(e);
111116
}
112117

118+
let overrideValues: OverrideValues = {};
119+
120+
if (props.overrideParameters && typeof props.overrideParameters === 'function') {
121+
overrideValues = props.overrideParameters(file) || {};
122+
}
123+
113124
const xhr = new XMLHttpRequest();
114125
const progressCb = (e: ProgressEvent<XMLHttpRequestEventTarget>) => {
115126
if (props.onUploadProgress && typeof props.onUploadProgress === 'function') {
@@ -121,25 +132,25 @@ const IKUpload = forwardRef<HTMLInputElement, IKUploadProps & IKContextBaseProps
121132

122133
var params = {
123134
file: file,
124-
fileName: fileName || file.name,
125-
useUniqueFileName,
126-
tags,
127-
folder,
128-
isPrivateFile,
129-
customCoordinates,
135+
fileName: overrideValues.fileName || fileName || file.name,
136+
useUniqueFileName: overrideValues.useUniqueFileName || useUniqueFileName,
137+
tags: overrideValues.tags || tags,
138+
folder: overrideValues.folder || folder,
139+
isPrivateFile: overrideValues.isPrivateFile || isPrivateFile,
140+
customCoordinates: overrideValues.customCoordinates || customCoordinates,
130141
responseFields,
131-
extensions,
132-
webhookUrl,
133-
overwriteFile,
134-
overwriteAITags,
135-
overwriteTags,
136-
overwriteCustomMetadata,
137-
customMetadata,
142+
extensions: overrideValues.extensions || extensions,
143+
webhookUrl: overrideValues.webhookUrl || webhookUrl,
144+
overwriteFile: overrideValues.overwriteFile || overwriteFile,
145+
overwriteAITags: overrideValues.overwriteAITags || overwriteAITags,
146+
overwriteTags: overrideValues.overwriteTags || overwriteTags,
147+
overwriteCustomMetadata: overrideValues.overwriteCustomMetadata || overwriteCustomMetadata,
148+
customMetadata: overrideValues.customMetadata || customMetadata,
138149
signature: '',
139150
expire: 0,
140151
token: '',
141152
xhr,
142-
transformation,
153+
transformation: overrideValues.transformation || transformation,
143154
};
144155

145156
const authPromise = authenticator();

src/components/IKUpload/props.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,26 @@ const Props = {
7070
validateFile: PropTypes.func,
7171
ref: PropTypes.any,
7272
transformation: PropTypes.object,
73+
overrideParameters: PropTypes.func,
7374
}
7475

76+
export type OverrideValues = {
77+
fileName?: IKUploadProps['fileName'];
78+
useUniqueFileName?: IKUploadProps['useUniqueFileName'];
79+
tags?: IKUploadProps['tags'];
80+
folder?: IKUploadProps['folder'];
81+
isPrivateFile?: IKUploadProps['isPrivateFile'];
82+
customCoordinates?: IKUploadProps['customCoordinates'];
83+
extensions?: IKUploadProps['extensions'];
84+
webhookUrl?: IKUploadProps['webhookUrl'];
85+
overwriteFile?: IKUploadProps['overwriteFile'];
86+
overwriteAITags?: IKUploadProps['overwriteAITags'];
87+
overwriteTags?: IKUploadProps['overwriteTags'];
88+
overwriteCustomMetadata?: IKUploadProps['overwriteCustomMetadata'];
89+
customMetadata?: IKUploadProps['customMetadata'];
90+
transformation?: IKUploadProps['transformation'];
91+
};
92+
7593
export type IKUploadProps = Omit<InferProps<typeof Props>, "customMetadata" | "transformation"> & {
7694
useUniqueFileName?: boolean;
7795
tags?: Array<string>;
@@ -92,6 +110,7 @@ export type IKUploadProps = Omit<InferProps<typeof Props>, "customMetadata" | "t
92110
onUploadProgress?: (evt: ProgressEvent<XMLHttpRequestEventTarget>) => void;
93111
validateFile?: (file: File) => boolean;
94112
transformation?: TransformationType;
113+
overrideParameters?: (file: File) => OverrideValues;
95114
} & React.InputHTMLAttributes<HTMLInputElement>;
96115

97116
export default Props;

tests/cypress/integration/IKUpload.cy.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,23 @@ describe('IKUpload Element', () => {
1212
//upload file with attachFile
1313
cy.get('.file-upload-ik').attachFile(p)
1414

15-
// wait for 2 secs
15+
// wait for 4 secs
1616
cy.wait(4000);
1717

1818
//Verify uploaded file
1919
cy.get('.uploaded-img-ik').should('have.attr', 'src');
2020
cy.get('.uploaded-img-ik').invoke('attr', 'src').should('not.equal', '');
21+
22+
23+
// wait for 4 secs
24+
cy.wait(4000);
25+
26+
cy.get('.state-value').invoke('val').then((val) => {
27+
const stateValue = JSON.parse(val);
28+
cy.log(JSON.stringify(stateValue, null, 2));
29+
expect(stateValue.overrideParametersValue.fileNameOnLocalSystem).to.be.eq("sample.jpeg"); // This asserts that the file object was passed to the onOverrideParameters callback
30+
expect(stateValue.uploadedImageSource).contains("sample-folder/overridden-file-name"); // This asserts that onOverrideParameters changed fileName parameter before upload
31+
});
2132
});
2233

2334
it.skip('should upload non-image file and try to get error element', () => {

tests/test-app/src/App.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ function App() {
1919
"height": "300",
2020
"width": "300"
2121
}]);
22+
const [overrideParametersValue, setoverrideParametersValue] = useState();
2223

2324
const path = "default-image.jpg";
2425
const videoUrlEndpoint = 'https://ik.imagekit.io/demo/';
@@ -69,8 +70,25 @@ function App() {
6970
setUploadProgress(e)
7071
}
7172

73+
const onOverrideParameters = (file) => {
74+
setoverrideParametersValue({
75+
fileNameOnLocalSystem: file.name,
76+
})
77+
return {
78+
fileName: 'overridden-file-name.jpg'
79+
}
80+
}
81+
7282
return (
7383
<div className="App">
84+
<input type="text" className="state-value" value={JSON.stringify({
85+
error,
86+
isUploading,
87+
uploadProgress,
88+
uploadedImageSource,
89+
imageTr,
90+
overrideParametersValue
91+
})} style={{ display: 'none' }}></input>
7492
<h1>Hi! This is an ImageKit React SDK Demo!</h1>
7593

7694
<p>Directly using <code>IkImage</code></p>
@@ -185,6 +203,7 @@ function App() {
185203
className="file-upload-ik"
186204
onUploadProgress={onUploadProgress}
187205
onUploadStart={onUploadStart}
206+
overrideParameters={onOverrideParameters}
188207
/>
189208
{isUploading !== null ? <p>{isUploading ? `...Uploading (${uploadProgress ? uploadProgress.type ? (uploadProgress.loaded / uploadProgress.total * 100).toFixed(2) + '%)' : '' : ''}` : 'uploaded'}</p> : <></>}
190209
{isUploading ? <button onClick={() => {

0 commit comments

Comments
 (0)