Skip to content

Commit b80b850

Browse files
committed
♻️(front) refactor file preview icons
The previous implementation was not using the extension to guess the type of the file. But in somes cases it is required, the grist file were showing up as sql files. Also make the implementation lighter directly based on FilePreviewType. Also remove some dead code.
1 parent c79333c commit b80b850

6 files changed

Lines changed: 30 additions & 61 deletions

File tree

src/frontend/apps/drive/src/features/explorer/components/icons/ItemIcon.tsx

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import {
1414
IconSize,
1515
} from "@gouvfr-lasuite/ui-kit";
1616
import { useMemo } from "react";
17+
import { FilePreviewType } from "@/features/ui/preview/files-preview/FilesPreview";
18+
import { getExtensionFromName } from "../../utils/utils";
1719

1820
type ItemIconProps = {
1921
item: Item;
@@ -95,30 +97,29 @@ export const getItemIcon = (
9597
return ICONS[type][category];
9698
};
9799

98-
export const getIconByMimeType = (
99-
mimeType: string,
100-
type: "mini" | "normal"
101-
) => {
102-
const category = getMimeCategory(mimeType);
103-
return ICONS[type][category];
104-
};
105-
106-
type IconFromMimeTypeProps = {
107-
mimeType: string;
108-
size?: "small" | "medium" | "large" | "xlarge";
109-
type?: "mini" | "normal";
110-
};
111-
112-
export const IconFromMimeType = ({
113-
mimeType,
100+
/**
101+
* Used by the FilePreview component to display the file icon.
102+
* The FilePreview only uses FilePreviewType, not Item, so it needs a
103+
* dedicated component to display the file icon.
104+
*/
105+
export const FileIcon = ({
106+
file,
114107
size = "medium",
115108
type = "normal",
116-
}: IconFromMimeTypeProps) => {
117-
const mimeIcon = getIconByMimeType(mimeType, type);
109+
}: {
110+
file: FilePreviewType;
111+
size?: "small" | "medium" | "large" | "xlarge";
112+
type?: "mini" | "normal";
113+
}) => {
114+
const category = getMimeCategory(
115+
file.mimetype,
116+
getExtensionFromName(file.title)
117+
);
118+
const icon = ICONS[type][category];
118119

119120
return (
120121
<img
121-
src={mimeIcon.src}
122+
src={icon.src}
122123
alt=""
123124
className={`item-icon ${size}`}
124125
draggable="false"

src/frontend/apps/drive/src/features/explorer/utils/mimeTypes.ts

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -41,36 +41,6 @@ export enum MimeCategory {
4141
GRIST = "grist",
4242
}
4343

44-
export const MIME_TO_ICON = {
45-
[MimeCategory.CALC]: mimeCalc,
46-
[MimeCategory.DOC]: mimeDoc,
47-
[MimeCategory.IMAGE]: mimeImage,
48-
[MimeCategory.OTHER]: mimeOther,
49-
[MimeCategory.PDF]: mimePdf,
50-
[MimeCategory.POWERPOINT]: mimePowerpoint,
51-
[MimeCategory.AUDIO]: mimeAudio,
52-
[MimeCategory.VIDEO]: mimeVideo,
53-
[MimeCategory.ARCHIVE]: mimeArchive,
54-
[MimeCategory.SUSPICIOUS]: mimeSuspicious,
55-
[MimeCategory.SQLITE]: mimeSQLite,
56-
[MimeCategory.GRIST]: mimeGrist,
57-
};
58-
59-
export const MIME_TO_ICON_MINI = {
60-
[MimeCategory.CALC]: mimeCalcMini,
61-
[MimeCategory.DOC]: mimeDocMini,
62-
[MimeCategory.IMAGE]: mimeImageMini,
63-
[MimeCategory.OTHER]: mimeOther,
64-
[MimeCategory.PDF]: mimePdfMini,
65-
[MimeCategory.POWERPOINT]: mimePowerpointMini,
66-
[MimeCategory.AUDIO]: mimeAudioMini,
67-
[MimeCategory.VIDEO]: mimeVideoMini,
68-
[MimeCategory.ARCHIVE]: mimeArchiveMini,
69-
[MimeCategory.SUSPICIOUS]: mimeSuspicious,
70-
[MimeCategory.SQLITE]: mimeSQLiteMini,
71-
[MimeCategory.GRIST]: mimeGristMini,
72-
};
73-
7444
export const ICONS = {
7545
mini: {
7646
[MimeCategory.CALC]: mimeCalcMini,

src/frontend/apps/drive/src/features/explorer/utils/utils.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ export const timeAgo = (date: Date) => {
6868
/** TODO: test */
6969
export const getExtension = (item: Item, useTitle = false) => {
7070
const str = useTitle ? item.title : item.filename;
71+
return getExtensionFromName(str);
72+
};
73+
74+
export const getExtensionFromName = (str: string) => {
7175
if (!str) {
7276
return null;
7377
}

src/frontend/apps/drive/src/features/ui/preview/error/ErrorPreview.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { FilePreviewType } from "../files-preview/FilesPreview";
33

44
import { Button } from "@openfun/cunningham-react";
55
import { Icon, IconType } from "@gouvfr-lasuite/ui-kit";
6-
import { IconFromMimeType } from "@/features/explorer/components/icons/ItemIcon";
6+
import { FileIcon } from "@/features/explorer/components/icons/ItemIcon";
77
import { downloadFile } from "@/features/items/utils";
88
import { useCallback } from "react";
99

@@ -21,7 +21,7 @@ export const ErrorPreview = ({ file }: ErrorPreviewProps) => {
2121
return (
2222
<div className="file-preview-error">
2323
<div className="file-preview-error__icon">
24-
<IconFromMimeType mimeType={file.mimetype} size="xlarge" />
24+
<FileIcon file={file} size="xlarge" />
2525
</div>
2626
<div className="file-preview-error__title">
2727
{t("file_preview.error.title")}

src/frontend/apps/drive/src/features/ui/preview/files-preview/FilesPreview.tsx

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { AudioPlayer } from "../audio-player/AudioPlayer";
1212
import { PreviewPdf } from "../pdf-preview/PreviewPdf";
1313

1414
import { NotSupportedPreview } from "../not-supported/NotSupportedPreview";
15-
import { getIconByMimeType } from "@/features/explorer/components/icons/ItemIcon";
15+
import { FileIcon } from "@/features/explorer/components/icons/ItemIcon";
1616
import { useTranslation } from "react-i18next";
1717
import { SuspiciousPreview } from "../suspicious/SuspiciousPreview";
1818
import { WopiEditor } from "../wopi/WopiEditor";
@@ -174,13 +174,7 @@ export const FilePreview = ({
174174
)}
175175

176176
<div className="file-preview-title">
177-
<img
178-
src={getIconByMimeType(currentFile.mimetype, "mini").src}
179-
alt=""
180-
width={24}
181-
className={`item-icon`}
182-
draggable="false"
183-
/>
177+
<FileIcon file={currentFile} type="mini" size="small" />
184178
<h1 className="file-preview-title">
185179
{removeFileExtension(currentFile?.title || title)}
186180
</h1>

src/frontend/apps/drive/src/features/ui/preview/not-supported/NotSupportedPreview.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { FilePreviewType } from "../files-preview/FilesPreview";
33

44
import { Button } from "@openfun/cunningham-react";
55
import { Icon, IconType } from "@gouvfr-lasuite/ui-kit";
6-
import { IconFromMimeType } from "@/features/explorer/components/icons/ItemIcon";
6+
import { FileIcon } from "@/features/explorer/components/icons/ItemIcon";
77
import { useCallback } from "react";
88

99
interface NotSupportedPreviewProps {
@@ -24,7 +24,7 @@ export const NotSupportedPreview = ({
2424
return (
2525
<div className="file-preview-unsupported">
2626
<div className="file-preview-unsupported__icon">
27-
<IconFromMimeType mimeType={file.mimetype} size="xlarge" />
27+
<FileIcon file={file} size="xlarge" />
2828
</div>
2929
<p className="file-preview-unsupported__title">
3030
{t("file_preview.unsupported.title")}

0 commit comments

Comments
 (0)