index.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import React, { useCallback, useRef } from "react";
  2. import styles from "./index.module.scss";
  3. import { MessageFu } from "@/utils/message";
  4. import { API_upFile } from "@/store/action/layout";
  5. import { fileDomInitialFu } from "@/utils/domShow";
  6. import { UploadOutlined, DeleteOutlined, EyeOutlined } from "@ant-design/icons";
  7. import store from "@/store";
  8. import MyPopconfirm from "../MyPopconfirm";
  9. export type ZupAudioType = {
  10. fileName: string;
  11. filePath: string;
  12. };
  13. type Props = {
  14. fileInfo: ZupAudioType;
  15. upDataFu: (info: ZupAudioType) => void;
  16. delFu: () => void;
  17. dirCode: string;
  18. myUrl: string;
  19. size?: number;
  20. isLook?: boolean;
  21. };
  22. function ZupAudio({
  23. size = 10,
  24. isLook = false,
  25. fileInfo,
  26. upDataFu,
  27. delFu,
  28. dirCode,
  29. myUrl,
  30. }: Props) {
  31. // 上传 无障碍音频的 点击
  32. const handeUpAudio = useCallback(
  33. async (e: React.ChangeEvent<HTMLInputElement>) => {
  34. if (e.target.files) {
  35. // 拿到files信息
  36. const filesInfo = e.target.files[0];
  37. // console.log("-----", filesInfo);
  38. // 校验格式
  39. const type = ["audio/mpeg"];
  40. if (!type.includes(filesInfo.type)) {
  41. e.target.value = "";
  42. return MessageFu.warning(`只支持.mp3格式!`);
  43. }
  44. // 校验大小
  45. if (filesInfo.size > size * 1024 * 1024) {
  46. e.target.value = "";
  47. return MessageFu.warning(`最大支持${size}M!`);
  48. }
  49. // 创建FormData对象
  50. const fd = new FormData();
  51. fd.append("type", "audio");
  52. fd.append("dirCode", dirCode);
  53. fd.append("file", filesInfo);
  54. e.target.value = "";
  55. try {
  56. const res = await API_upFile(fd, myUrl);
  57. if (res.code === 0) {
  58. MessageFu.success("上传成功!");
  59. // console.log(res);
  60. upDataFu(res.data);
  61. }
  62. fileDomInitialFu();
  63. } catch (error) {
  64. fileDomInitialFu();
  65. }
  66. }
  67. },
  68. [dirCode, myUrl, size, upDataFu]
  69. );
  70. // 上传附近的ref
  71. const myInput = useRef<HTMLInputElement>(null);
  72. return (
  73. <div
  74. className={styles.ZupAudio}
  75. id="upInputAudioBox"
  76. hidden={isLook && !fileInfo.filePath}
  77. >
  78. {/* 上传无障碍音频 */}
  79. <input
  80. id="upInputAudio"
  81. type="file"
  82. accept=".mp3"
  83. onChange={(e) => handeUpAudio(e)}
  84. ref={myInput}
  85. />
  86. {fileInfo.filePath ? (
  87. <div className="ZupAudio2">
  88. <div title={fileInfo.fileName}>{fileInfo.fileName}</div>
  89. <EyeOutlined
  90. title="预览"
  91. onClick={() =>
  92. store.dispatch({
  93. type: "layout/lookDom",
  94. payload: { src: fileInfo.filePath, type: "audio" },
  95. })
  96. }
  97. />
  98. {isLook ? null : (
  99. <>
  100. &nbsp;
  101. <MyPopconfirm
  102. txtK="删除"
  103. onConfirm={delFu}
  104. Dom={
  105. <DeleteOutlined
  106. title="删除"
  107. className="ZTbox2X"
  108. rev={undefined}
  109. />
  110. }
  111. />
  112. </>
  113. )}
  114. </div>
  115. ) : (
  116. <div className="ZupAudio1" onClick={() => myInput.current?.click()}>
  117. <UploadOutlined />
  118. <div className="ZupAudio1_1">
  119. <p>上传无障碍音频</p>
  120. <p>支持{size}MB以下mp3格式</p>
  121. </div>
  122. </div>
  123. )}
  124. </div>
  125. );
  126. }
  127. const MemoZupAudio = React.memo(ZupAudio);
  128. export default MemoZupAudio;