Skip to content

Commit c89e34b

Browse files
committed
Maybe cleaner fix with per-file context
Signed-off-by: Marek Aufart <[email protected]>
1 parent 870f5c3 commit c89e34b

File tree

1 file changed

+73
-44
lines changed

1 file changed

+73
-44
lines changed

client/src/app/components/CustomRuleFilesUpload.tsx

Lines changed: 73 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -87,17 +87,16 @@ export const CustomRuleFilesUpload: React.FC<CustomRuleFilesUploadProps> = ({
8787
onAddRuleFiles(newRuleFiles);
8888
})
8989
.then(() => {
90-
// Trigger the upload process for each file automatically
91-
incomingFiles.forEach((file) => {
92-
const ruleFile = {
93-
fileName: file.name,
94-
fullFile: file,
95-
uploadProgress: 0,
96-
status: "starting" as const,
97-
};
98-
// Use setTimeout to ensure the state has been updated before processing
99-
setTimeout(() => readVerifyAndUploadFile(ruleFile, file), 0);
100-
});
90+
// Automatically trigger customFileHandler for each file since PatternFly doesn't do this automatically
91+
// Use setTimeout to ensure state has been updated
92+
setTimeout(() => {
93+
incomingFiles.forEach((file) => {
94+
const ruleFile = ruleFileByName(file.name);
95+
if (ruleFile) {
96+
readVerifyAndUploadFile(ruleFile, file);
97+
}
98+
});
99+
}, 0);
101100
});
102101
};
103102

@@ -151,7 +150,13 @@ export const CustomRuleFilesUpload: React.FC<CustomRuleFilesUploadProps> = ({
151150

152151
// Upload the file to hub!
153152
// TODO: Provide an onUploadProgress handler so the actual upload can be tracked from 20% to 100%
154-
uploadFile(file, taskgroupId);
153+
const updatedRuleFile = {
154+
...ruleFile,
155+
uploadProgress: 20,
156+
status: "validated" as const,
157+
contents: fileContents,
158+
};
159+
uploadFile(file, taskgroupId, updatedRuleFile);
155160
} catch (error) {
156161
onChangeRuleFile({
157162
...ruleFile,
@@ -162,34 +167,26 @@ export const CustomRuleFilesUpload: React.FC<CustomRuleFilesUploadProps> = ({
162167
};
163168

164169
const { uploadFile } = useFileUploader(
165-
(file, hubFile) => {
166-
// Use a timeout to ensure we get the latest state with contents
167-
setTimeout(() => {
168-
const ruleFile = ruleFileByName(file.name);
169-
if (ruleFile) {
170-
onChangeRuleFile({
171-
...ruleFile,
172-
fileId: hubFile?.id,
173-
uploadProgress: 100,
174-
status: "uploaded",
175-
});
176-
}
177-
}, 0);
170+
(file, hubFile, ruleFileContext) => {
171+
if (ruleFileContext) {
172+
onChangeRuleFile({
173+
...ruleFileContext,
174+
fileId: hubFile?.id,
175+
uploadProgress: 100,
176+
status: "uploaded",
177+
});
178+
}
178179
},
179-
(error, file) => {
180+
(error, file, ruleFileContext) => {
180181
const msg = getAxiosErrorMessage(error);
181182

182-
// Use a timeout to ensure we get the latest state with contents
183-
setTimeout(() => {
184-
const ruleFile = ruleFileByName(file.name);
185-
if (ruleFile) {
186-
onChangeRuleFile({
187-
...ruleFile,
188-
loadError: msg,
189-
status: "failed",
190-
});
191-
}
192-
}, 0);
183+
if (ruleFileContext) {
184+
onChangeRuleFile({
185+
...ruleFileContext,
186+
loadError: msg,
187+
status: "failed",
188+
});
189+
}
193190

194191
pushNotification({ title: msg, variant: "danger" });
195192
}
@@ -269,20 +266,52 @@ export const CustomRuleFilesUpload: React.FC<CustomRuleFilesUploadProps> = ({
269266
};
270267

271268
function useFileUploader(
272-
onSuccess: (file: File, hubFile?: HubFile) => void,
273-
onError: (e: AxiosError, file: File) => void
269+
onSuccess: (
270+
file: File,
271+
hubFile?: HubFile,
272+
ruleFileContext?: UploadFile
273+
) => void,
274+
onError: (e: AxiosError, file: File, ruleFileContext?: UploadFile) => void
274275
) {
276+
// Store file context to pass to callbacks
277+
const fileContextRef = React.useRef(new Map<string, UploadFile>());
278+
275279
const { mutate: createRuleFile } = useCreateFileMutation(
276-
(hubFile, file) => onSuccess(file, hubFile),
277-
(e, file) => onError(e, file)
280+
(hubFile, file) => {
281+
const ruleFileContext = fileContextRef.current.get(file.name);
282+
onSuccess(file, hubFile, ruleFileContext);
283+
fileContextRef.current.delete(file.name);
284+
},
285+
(e, file) => {
286+
const ruleFileContext = fileContextRef.current.get(file.name);
287+
onError(e, file, ruleFileContext);
288+
fileContextRef.current.delete(file.name);
289+
}
278290
);
279291

280292
const { mutate: uploadTaskgroupFile } = useUploadTaskgroupFileMutation(
281-
(_, { file }) => onSuccess(file),
282-
(e, { file }) => onError(e, file)
293+
(_, { file }) => {
294+
const ruleFileContext = fileContextRef.current.get(file.name);
295+
onSuccess(file, undefined, ruleFileContext);
296+
fileContextRef.current.delete(file.name);
297+
},
298+
(e, { file }) => {
299+
const ruleFileContext = fileContextRef.current.get(file.name);
300+
onError(e, file, ruleFileContext);
301+
fileContextRef.current.delete(file.name);
302+
}
283303
);
284304

285-
const uploadFile = (file: File, taskgroupId?: number) => {
305+
const uploadFile = (
306+
file: File,
307+
taskgroupId?: number,
308+
ruleFileContext?: UploadFile
309+
) => {
310+
// Store the ruleFile context for retrieval in callbacks
311+
if (ruleFileContext) {
312+
fileContextRef.current.set(file.name, ruleFileContext);
313+
}
314+
286315
if (taskgroupId === undefined) {
287316
createRuleFile({ file });
288317
} else {

0 commit comments

Comments
 (0)