Skip to content

Commit

Permalink
refactor: add use-download-files hook for downloading files on chat (#…
Browse files Browse the repository at this point in the history
…3399)

* feat: add useGetDownloadFileMutation hook for downloading files

This commit adds a new hook called useGetDownloadFileMutation to handle the downloading of files in the frontend. The hook takes in the path and filename as parameters and uses the fetch API to download the file. It then creates a URL object for the downloaded file and sets it as the href of a dynamically created anchor element. Finally, it triggers a click event on the anchor element to initiate the file download. The URL object is revoked after the download is complete.

* feat: add use-download-files hook for downloading files on chat

This commit adds a new hook called use-download-files to handle the downloading of files in the frontend. The hook takes in the path and filename as parameters and uses the fetch API to download the file. It then creates a URL object for the downloaded file and sets it as the href of a dynamically created anchor element. Finally, it triggers a click event on the anchor element to initiate the file download. The URL object is revoked after the download is complete.

* [autofix.ci] apply automated fixes

* feat: refactor file download handling in chat view

Refactor the file download handling in the chat view by introducing a new hook called `use-download-files`. This hook takes in the path and filename as parameters and uses the fetch API to download the file. It creates a URL object for the downloaded file and sets it as the href of a dynamically created anchor element. Finally, it triggers a click event on the anchor element to initiate the file download. The URL object is revoked after the download is complete.

* remove console.log

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Cristhian Zanforlin Lousa <[email protected]>
  • Loading branch information
3 people authored Aug 19, 2024
1 parent 2a27b08 commit 0f2729d
Show file tree
Hide file tree
Showing 7 changed files with 58 additions and 56 deletions.
1 change: 1 addition & 0 deletions src/frontend/src/controllers/API/queries/files/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export * from "./use-download-files";
export * from "./use-get-download-images";
export * from "./use-get-profile-pictures";
export * from "./use-post-upload-file";
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { keepPreviousData } from "@tanstack/react-query";
import {
useMutationFunctionType,
useQueryFunctionType,
} from "../../../../types/api";
import { api } from "../../api";
import { getURL } from "../../helpers/constants";
import { UseRequestProcessor } from "../../services/request-processor";

interface DownloadImagesQueryParams {
path: string;
filename: string;
}

export const useGetDownloadFileMutation: useMutationFunctionType<
DownloadImagesQueryParams
> = (params, options) => {
const { mutate } = UseRequestProcessor();

const getDownloadImagesFn = async () => {
if (!params) return;
// need to use fetch because axios convert blob data to string, and this convertion can corrupt the file
const response = await fetch(`${getURL("FILES")}/download/${params.path}`);
const blob = await response.blob();
const url = URL.createObjectURL(blob);

const link = document.createElement("a");
link.href = url;
link.setAttribute("download", params.filename); // Set the filename
document.body.appendChild(link);
link.click();
document.body.removeChild(link);

URL.revokeObjectURL(url);
return {};
};

const queryResult = mutate(
["useGetDownloadFileMutation", params.path],
getDownloadImagesFn,
options,
);

return queryResult;
};
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,7 @@ export default function FileCardWrapper({
{formatFileName(name, 50)}
<ForwardedIconComponent name={show ? "ChevronDown" : "ChevronRight"} />
</span>
<FileCard
showFile={show}
fileName={name}
fileType={type}
content={path}
/>
<FileCard showFile={show} fileName={name} fileType={type} path={path} />
</div>
);
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { useGetDownloadFileMutation } from "@/controllers/API/queries/files";
import { useState } from "react";
import { ForwardedIconComponent } from "../../../../../components/genericIconComponent";
import { BACKEND_URL, BASE_URL_API } from "../../../../../constants/constants";
Expand All @@ -6,18 +7,20 @@ import { fileCardPropsType } from "../../../../../types/components";
import formatFileName from "../filePreviewChat/utils/format-file-name";
import DownloadButton from "./components/downloadButton/downloadButton";
import getClasses from "./utils/get-classes";
import handleDownload from "./utils/handle-download";

const imgTypes = new Set(["png", "jpg", "jpeg", "gif", "webp", "image"]);

export default function FileCard({
fileName,
content,
path,
fileType,
showFile = true,
}: fileCardPropsType): JSX.Element | undefined {
const [isHovered, setIsHovered] = useState(false);
const currentFlowId = useFlowsManagerStore((state) => state.currentFlowId);
const { mutate } = useGetDownloadFileMutation({
filename: fileName,
path: path,
});
function handleMouseEnter(): void {
setIsHovered(true);
}
Expand All @@ -27,7 +30,7 @@ export default function FileCard({

const fileWrapperClasses = getClasses(isHovered);

const imgSrc = `${BASE_URL_API}files/images/${content}`;
const imgSrc = `${BASE_URL_API}files/images/${path}`;

if (showFile) {
if (imgTypes.has(fileType)) {
Expand All @@ -46,7 +49,7 @@ export default function FileCard({
/>
<DownloadButton
isHovered={isHovered}
handleDownload={() => handleDownload({ fileName, content })}
handleDownload={() => mutate(undefined)}
/>
</div>
</div>
Expand All @@ -56,7 +59,7 @@ export default function FileCard({
return (
<div
className={fileWrapperClasses}
onClick={() => handleDownload({ fileName, content })}
onClick={() => mutate(undefined)}
onMouseEnter={handleMouseEnter}
onMouseLeave={handleMouseLeave}
>
Expand All @@ -69,7 +72,7 @@ export default function FileCard({
</div>
<DownloadButton
isHovered={isHovered}
handleDownload={() => handleDownload({ fileName, content })}
handleDownload={() => mutate(undefined)}
/>
</div>
);
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,6 @@ export default function ChatView({

const is_ai =
sender === "Machine" || sender === null || sender === undefined;

return {
isSend: !is_ai,
message,
Expand Down
2 changes: 1 addition & 1 deletion src/frontend/src/types/components/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -617,7 +617,7 @@ export interface Props {

export type fileCardPropsType = {
fileName: string;
content: string;
path: string;
fileType: string;
showFile?: boolean;
};
Expand Down

0 comments on commit 0f2729d

Please sign in to comment.