mirror of
https://github.com/hexastack/hexabot
synced 2025-06-26 18:27:28 +00:00
fix: apply feedback
This commit is contained in:
parent
19a073fec0
commit
2be7be6af7
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user