fix: apply feedback

This commit is contained in:
abdou6666 2025-04-18 14:11:15 +01:00
parent 19a073fec0
commit 2be7be6af7

View File

@ -14,6 +14,39 @@ import { Direction, TMessage } from "../../types/message.types";
import FileIcon from "../icons/FileIcon"; import FileIcon from "../icons/FileIcon";
import "./FileMessage.scss"; import "./FileMessage.scss";
const getFileMessageType = (
message: TMessage,
): "image" | "audio" | "video" | "file" | "unknown" => {
if (!("type" in message.data)) {
throw new Error("Unable to detect type for file message");
}
const type = message.data.type;
if (type === "unknown") {
return "unknown";
}
if (["image", "audio", "video", "file"].includes(type)) {
return type as "image" | "audio" | "video" | "file";
}
throw new Error("Unknown type for file message");
};
const hasUrl = (
message: TMessage,
): message is TMessage & { data: { url: string } } => {
return (
typeof message === "object" &&
message !== null &&
"data" in message &&
typeof message.data === "object" &&
message.data !== null &&
"url" in message.data &&
typeof message.data.url === "string"
);
};
interface FileMessageProps { interface FileMessageProps {
message: TMessage; message: TMessage;
} }
@ -25,11 +58,9 @@ const FileMessage: React.FC<FileMessageProps> = ({ message }) => {
const [videoErrored, setVideoErrored] = useState(false); const [videoErrored, setVideoErrored] = useState(false);
const [audioErrored, setAudioErrored] = useState(false); const [audioErrored, setAudioErrored] = useState(false);
const [imageErrored, setImageErrored] = useState(false); const [imageErrored, setImageErrored] = useState(false);
const type = getFileMessageType(message);
if (!("type" in message.data)) { if (type === "unknown") {
throw new Error("Unable to detect type for file message");
}
if (message.data.type === "unknown") {
return ( return (
<div <div
className="sc-message--file" className="sc-message--file"
@ -44,15 +75,6 @@ const FileMessage: React.FC<FileMessageProps> = ({ message }) => {
</div> </div>
); );
} }
if (
message.data &&
message.data.type !== "image" &&
message.data.type !== "audio" &&
message.data.type !== "video" &&
message.data.type !== "file"
) {
throw new Error("Unknown type for file message");
}
return ( return (
<div <div
@ -62,7 +84,7 @@ const FileMessage: React.FC<FileMessageProps> = ({ message }) => {
backgroundColor: colors.bg, backgroundColor: colors.bg,
}} }}
> >
{message.data.type === "image" && ( {type === "image" && (
<div className="sc-message--file-icon"> <div className="sc-message--file-icon">
{imageErrored ? ( {imageErrored ? (
<p <p
@ -76,14 +98,14 @@ const FileMessage: React.FC<FileMessageProps> = ({ message }) => {
) : ( ) : (
<img <img
onError={() => setImageErrored(true)} onError={() => setImageErrored(true)}
src={message?.data?.url} src={hasUrl(message) ? message.data.url : ""}
className="sc-image" className="sc-image"
alt="File" alt="File"
/> />
)} )}
</div> </div>
)} )}
{message.data.type === "audio" && ( {type === "audio" && (
<div className="sc-message--file-audio"> <div className="sc-message--file-audio">
{audioErrored ? ( {audioErrored ? (
<p <p
@ -96,12 +118,12 @@ const FileMessage: React.FC<FileMessageProps> = ({ message }) => {
</p> </p>
) : ( ) : (
<audio controls onError={() => setAudioErrored(true)}> <audio controls onError={() => setAudioErrored(true)}>
<source src={message.data.url} /> <source src={hasUrl(message) ? message.data.url : ""} />
</audio> </audio>
)} )}
</div> </div>
)} )}
{message.data.type === "video" && ( {type === "video" && (
<div className="sc-message--file-video"> <div className="sc-message--file-video">
{videoErrored ? ( {videoErrored ? (
<p <p
@ -114,13 +136,13 @@ const FileMessage: React.FC<FileMessageProps> = ({ message }) => {
</p> </p>
) : ( ) : (
<video controls width="100%" onError={() => setVideoErrored(true)}> <video controls width="100%" onError={() => setVideoErrored(true)}>
<source src={message.data.url} /> <source src={hasUrl(message) ? message.data.url : ""} />
{t("messages.file_message.browser_video_unsupport")} {t("messages.file_message.browser_video_unsupport")}
</video> </video>
)} )}
</div> </div>
)} )}
{message.data.type === "file" && ( {type === "file" && (
<div <div
className="sc-message--file-download" className="sc-message--file-download"
style={{ style={{
@ -128,13 +150,13 @@ const FileMessage: React.FC<FileMessageProps> = ({ message }) => {
backgroundColor: colors.bg, backgroundColor: colors.bg,
}} }}
> >
{!message?.data?.url ? ( {!hasUrl(message) ? (
<p className="error-message" style={{ padding: 0 }}> <p className="error-message" style={{ padding: 0 }}>
{t("messages.file_message.file_error")} {t("messages.file_message.file_error")}
</p> </p>
) : ( ) : (
<a <a
href={message.data.url ? message.data.url : "#"} href={hasUrl(message) ? message.data.url : "#"}
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
download download