useBdMediaPup.ts 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694
  1. import getMD5 from '@/components/MD5';
  2. import { useAjax } from '@/Hook/useAjax';
  3. import {
  4. bdSysMediaList,
  5. bdSysMediaAdd,
  6. delMedia,
  7. bdSysMediaEdit,
  8. getFileUrl,
  9. getMedia,
  10. configSortApi,
  11. getFolderTree,
  12. editMediaFolder,
  13. bdSysMediaAddsApi,
  14. } from '@/services/launchAdq/material';
  15. import { blobToBase64, dataURLtoFile, videoMessage } from '@/utils/compress';
  16. import { getImgSize } from '@/utils/utils';
  17. import { message } from 'antd';
  18. import { compressAccurately } from 'image-conversion';
  19. import { Dispatch, useCallback, useReducer, useState } from 'react';
  20. import { request } from 'umi';
  21. /**新本地素材弹窗 */
  22. type State = {
  23. fileVisible?: boolean; //文件夹弹窗
  24. imgVisrible?: boolean; //img,voice,video弹窗
  25. imgsVisrible?: boolean,//
  26. newsVisrible?: boolean; //news弹窗
  27. knewsVisrible?: boolean; //客服图文弹窗
  28. fileName?: string; //文件夹名称
  29. sort?: number; // 排序
  30. videoTitle?: string; //video文件名称
  31. videoDescription?: string; //视频描述
  32. belongUser?: any; //0公共本地|1个人本地
  33. mediaType?: 'VIDEO' | 'IMG' | 'PAGE'; // 类型
  34. parentId?: any; //上级目录ID,顶级使用null
  35. url?: string; //素材地址
  36. pathId?: string; //路径ID
  37. selectFile?: number[]; //选中的文件列表
  38. rightClickPup?: any; // /**右键菜单开关 all为全部 id 为目标文件 空为不显示*/
  39. xy?: { x: number; y: number }; // /**鼠标位置 菜单弹窗位置使用*/
  40. delPupId?: any; //按了单个删除存放的id为了让弹窗区分文件
  41. actionItem?: any; //当前选中的Itme
  42. path?: any[]; //个人路径
  43. publicPath?: any[]; //本地路径
  44. file?: File; //素材文件
  45. selectItem?: any[]; //单选素材时存放选中的素材
  46. knewsdefaultData?: any; //k图文编辑时的默认内容
  47. sortVisible?: boolean; //排序弹窗
  48. num?: number; //选择数量
  49. size?: number; // 需要上传素材的大小
  50. upLoadLoading?: boolean;
  51. cloudSize?: any[];
  52. maxSize?: number; //素材最大尺寸
  53. adcreativeTemplateId?: number; //创意模板 id
  54. promotedObjectType?: string; //推广目标类型
  55. promotedObjectId?: string; //推广目标 id
  56. pageType?: string; //落地页类型
  57. canvasType?: string; //原生页类型
  58. siteSet?: string[]; //版位
  59. sourceType?: string; //视频/图片/原生页等素材的创建来源类型
  60. marketingScene?: string; //营销场景
  61. };
  62. export type Action = {
  63. type: 'set' | 'init';
  64. params?: any;
  65. };
  66. const typeEnum = {
  67. IMG: '图片',
  68. VIDEO: '视频',
  69. };
  70. function reducer(state: State, action: Action) {
  71. let { type, params } = action;
  72. let newState = JSON.parse(JSON.stringify(state));
  73. newState.file = state.file;
  74. switch (type) {
  75. case 'set':
  76. Object.keys(params as State).forEach((key: string) => {
  77. newState[key] = (params as State)[key];
  78. });
  79. return newState;
  80. case 'init':
  81. return { ...initData, ...params };
  82. default:
  83. return state;
  84. }
  85. }
  86. const initData: State = {
  87. fileVisible: false,
  88. knewsVisrible: false,
  89. videoTitle: '',
  90. videoDescription: '',
  91. fileName: '',
  92. belongUser: '1',
  93. mediaType: 'IMG',
  94. parentId: null,
  95. selectFile: [],
  96. delPupId: '',
  97. rightClickPup: { id: '' },
  98. publicPath: [{ title: '公共本地', number: '0' }],
  99. path: [{ title: '个人本地', number: '0' }],
  100. imgVisrible: false,
  101. imgsVisrible: false,
  102. newsVisrible: false,
  103. sortVisible: false,
  104. sort: 0,
  105. num: 1,
  106. };
  107. /**本地素材管理器 */
  108. function useBdMediaPup() {
  109. const [state, dispatch]: [State, Dispatch<Action>] = useReducer(reducer, initData);
  110. const {
  111. fileName,
  112. sort,
  113. belongUser,
  114. mediaType,
  115. parentId,
  116. selectFile,
  117. selectItem,
  118. delPupId,
  119. cloudSize,
  120. num,
  121. rightClickPup,
  122. actionItem,
  123. path,
  124. publicPath,
  125. videoTitle,
  126. videoDescription,
  127. size,
  128. maxSize,
  129. adcreativeTemplateId,
  130. promotedObjectType,
  131. promotedObjectId,
  132. pageType,
  133. canvasType,
  134. siteSet,
  135. sourceType,
  136. marketingScene,
  137. } = state;
  138. const list = useAjax((params) => bdSysMediaList(params));
  139. const add = useAjax((params) => bdSysMediaAdd(params), { msgNmae: '新增' });
  140. const del = useAjax((params) => delMedia(params), { msgNmae: '删除' });
  141. const edit = useAjax((params) => bdSysMediaEdit(params), { msgNmae: '编辑' });
  142. const configSort = useAjax((params) => configSortApi(params), { msgNmae: '排序' });
  143. const adds = useAjax((params) => bdSysMediaAddsApi(params), { msgNmae: '新增' })
  144. const get = useAjax((params) => getMedia(params)); //获取图文详情
  145. const get_folder_tree = useAjax((params: any) => getFolderTree(params));
  146. const edit_media_folder = useAjax((params: any) => editMediaFolder(params));
  147. const [isOk, setIsOk] = useState<boolean>(true);
  148. //请求上传地址
  149. const fileUrl = useAjax(
  150. (params: { type: string; fileType: 'video' | 'image' }) => getFileUrl(params),
  151. {
  152. manual: true,
  153. },
  154. );
  155. /**初始化数据 */
  156. const init = useCallback((params: State) => {
  157. console.log('params======>', params);
  158. dispatch({ type: 'init', params });
  159. }, []);
  160. /**设置state */
  161. const set = useCallback((params: State) => {
  162. if (params) {
  163. dispatch({ type: 'set', params });
  164. }
  165. }, []);
  166. /**新增文件夹 */
  167. const addFolder = () => {
  168. if (fileName) {
  169. let obj = {
  170. title: fileName,
  171. mediaType,
  172. folder: true,
  173. parentId,
  174. belongUser: belongUser === '0' ? false : true,
  175. sort,
  176. };
  177. add.run(obj).then((res) => {
  178. get_folder_tree.refresh();
  179. list.refresh();
  180. offEditFile(); //关闭弹窗并清空相关数据
  181. });
  182. }
  183. };
  184. /** 新增图片 视频 */
  185. const addFile = async (data: any) => {
  186. if (data) {
  187. //存在代表素材
  188. if (!data) {
  189. return;
  190. }
  191. if (data?.file) {
  192. let file = data.file;
  193. let fileSize = size || 0;
  194. if (!size) {
  195. if (mediaType === 'IMG') {
  196. fileSize = 307200;
  197. } else {
  198. fileSize = 104857600;
  199. }
  200. }
  201. if (mediaType === 'IMG') {
  202. if (file?.size > fileSize) {
  203. // 大于300kb进入压缩
  204. let bole = await compressAccurately(file, 250);
  205. if (bole?.size > 300000) {
  206. bole = await compressAccurately(file, 200);
  207. }
  208. if (bole?.size > 300000) {
  209. bole = await compressAccurately(file, 150);
  210. }
  211. if (bole?.size > 300000) {
  212. bole = await compressAccurately(file, 100);
  213. }
  214. let newFile = await blobToBase64(bole);
  215. message.warning({
  216. content: `选择的图片大于${fileSize / 1024}KB,图片已压缩`,
  217. duration: 3,
  218. });
  219. file = await dataURLtoFile(newFile, file?.name);
  220. }
  221. } else if (mediaType === 'VIDEO') {
  222. if (file?.size > fileSize) {
  223. // 大于100mb进入压缩
  224. message.error({
  225. content: `选择的视频大于${fileSize / 1024 / 1024}MB,请重新选择提交`,
  226. duration: 3,
  227. });
  228. return;
  229. }
  230. }
  231. set({ upLoadLoading: true });
  232. let width = 0;
  233. let height = 0;
  234. if (mediaType === 'IMG') {
  235. let imgData = await getImgSize(file);
  236. width = imgData.width;
  237. height = imgData.height;
  238. } else if (mediaType === 'VIDEO') {
  239. let videoInfo: any = await videoMessage([file]);
  240. width = videoInfo[0].width;
  241. height = videoInfo[0].height;
  242. }
  243. /**修改文件名以用户设置的文件title命名*/
  244. let newFile = new File(
  245. [file],
  246. data?.title ? data?.title + '.' + file?.name?.split('.')[1] : file?.name,
  247. { type: file?.type },
  248. );
  249. let formData = new FormData();
  250. /**向阿里云请求上传地址*/
  251. fileUrl
  252. .run({ type: newFile.type, fileType: mediaType === 'VIDEO' ? 'video' : 'image' })
  253. .then((res1) => {
  254. Object.keys(res1).forEach((key: string) => {
  255. if (key !== 'url') {
  256. formData.append(key, res1[key]);
  257. }
  258. });
  259. formData.append('file', newFile);
  260. /**向阿里云返回的上传地址上传文件*/
  261. request(res1?.ossUrl, { method: 'post', body: formData })
  262. .then(async (res2: { code: number; data: { url: string } }) => {
  263. if (res2.code === 200) {
  264. message.success('上传成功');
  265. if (data) {
  266. /**取到返回的文件地址向后端发送具体数据*/
  267. if (res2?.data?.url) {
  268. let fileMd5 = await getMD5(newFile);
  269. let obj = {
  270. title: data.title,
  271. mediaType,
  272. folder: false,
  273. parentId,
  274. width,
  275. height,
  276. fileMd5,
  277. belongUser: belongUser === '0' ? false : true,
  278. url: res2?.data?.url,
  279. sort: data?.sort,
  280. fileSize: newFile?.size,
  281. fileMime: newFile.type,
  282. };
  283. if (mediaType === 'VIDEO') {
  284. obj['videoTitle'] = data?.videoTitle || data?.title;
  285. obj['videoDescription'] = data?.videoDescription;
  286. }
  287. if (!obj?.title) {
  288. obj.title = data.file.name
  289. }
  290. if (obj.title.match(RegExp(/[<>&\\'"/\x08\x09\x0A\x0D\x7F]/g))) {
  291. obj.title = obj.title.replace(RegExp(/[<>&\\'"/\x08\x09\x0A\x0D\x7F]/g), '')
  292. }
  293. obj.title = obj.title.replace(/\.(jpg|jpeg|gif|png)$/i, '')
  294. add.run(obj).then((res) => {
  295. list.refresh();
  296. offEditFile(); //关闭弹窗并清空相关数据
  297. set({ upLoadLoading: false });
  298. }).catch(() => set({ upLoadLoading: false }));
  299. }
  300. }
  301. } else {
  302. message.error('上传失败!');
  303. }
  304. })
  305. .catch(() => set({ upLoadLoading: false }));
  306. })
  307. .catch(() => set({ upLoadLoading: false }));
  308. }
  309. }
  310. };
  311. /** 批量新增图片 视频 */
  312. const addFiles = async (data: any) => {
  313. if (data) {//存在代表素材
  314. if (!data) {
  315. return
  316. }
  317. let { files, ...value } = data
  318. let params = files?.map(async (item: any, index: number) => {
  319. let file = item
  320. let fileSize = size || 0
  321. if (mediaType === 'IMG') {
  322. fileSize = value?.fileSize ? value?.fileSize * 1024 : 307200
  323. } else {
  324. fileSize = 104857600
  325. }
  326. if (mediaType === 'IMG') {
  327. let bad = 50
  328. let size = fileSize / 1024
  329. if (size > 10 && size <= 50) {
  330. bad = 5
  331. } else if (size > 50 && size <= 100) {
  332. bad = 10
  333. } else if (size > 100 && size <= 300) {
  334. bad = 20
  335. } else {
  336. bad = 50
  337. }
  338. if (file?.size > fileSize) { // 大于300kb进入压缩
  339. let bole = await compressAccurately(file, fileSize / 1024 - bad)
  340. if (bole?.size > fileSize) {
  341. bole = await compressAccurately(file, fileSize / 1024 - bad * 2)
  342. }
  343. if (bole?.size > fileSize) {
  344. bole = await compressAccurately(file, fileSize / 1024 - bad * 3)
  345. }
  346. if (bole?.size > fileSize) {
  347. bole = await compressAccurately(file, fileSize / 1024 - bad * 4)
  348. }
  349. let newFile = await blobToBase64(bole)
  350. message.warning({
  351. content: `选择的图片大于${fileSize / 1024}KB,图片已压缩`,
  352. duration: 3
  353. })
  354. file = await dataURLtoFile(newFile, file?.name)
  355. }
  356. } else if (mediaType === 'VIDEO') {
  357. if (file?.size > fileSize) { // 大于100mb进入压缩
  358. message.error({
  359. content: `选择的视频大于${fileSize / 1024 / 1024}MB,请重新选择提交`,
  360. duration: 3
  361. })
  362. return
  363. }
  364. }
  365. let width = 0
  366. let height = 0
  367. if (mediaType === 'IMG') {
  368. let imgData = await getImgSize(file)
  369. width = imgData.width
  370. height = imgData.height
  371. } else if (mediaType === "VIDEO") {
  372. let videoInfo: any = await videoMessage([file])
  373. width = videoInfo[0].width
  374. height = videoInfo[0].height
  375. }
  376. /**修改文件名以用户设置的文件title命名*/
  377. let newFile = new File([file], data?.title ? data?.title + index + 1 + '.' + file?.name?.split('.')[1] : file?.name, { type: file?.type })
  378. let formData = new FormData();
  379. set({ upLoadLoading: true })
  380. let res = await getFileUrl({ type: newFile.type, fileType: mediaType === 'VIDEO' ? 'video' : 'image' }).catch(() => set({ upLoadLoading: false }))
  381. let res1 = res.data
  382. Object.keys(res1).forEach((key: string) => {
  383. if (key !== 'url') {
  384. formData.append(key, res1[key])
  385. }
  386. })
  387. formData.append('file', newFile)
  388. /**向阿里云返回的上传地址上传文件*/
  389. let data1: { code: number, data: { url: string } } = await request(res1?.ossUrl, { method: 'post', body: formData }).catch(() => set({ upLoadLoading: false }))
  390. message.success('上传成功')
  391. let fileMd5 = await getMD5(newFile)
  392. let obj = { title: data.title + (index + 1).toString(), folder: false, parentId, width, height, fileMd5, url: data1?.data?.url, sort: data?.sort, fileSize: newFile?.size, fileMime: newFile.type }
  393. if (mediaType === 'VIDEO') {
  394. obj['videoTitle'] = data?.videoTitle || data?.title
  395. obj['videoDescription'] = data?.videoDescription
  396. }
  397. return { ...obj }
  398. })
  399. Promise.all(params).then(res => {
  400. adds.run({ belongUser: belongUser === '0' ? false : true, data: res }).then(response => {
  401. list.refresh()
  402. offEditFile()//关闭弹窗并清空相关数据
  403. set({ upLoadLoading: false })
  404. }).catch(() => set({ upLoadLoading: false }))
  405. })
  406. }
  407. }
  408. /**编辑非图文素材名称*/
  409. const nameOk = useCallback((selectWx: any) => {
  410. if (fileName && actionItem) {
  411. let obj = {
  412. title: fileName,
  413. belongUser: belongUser === '0' ? false : true,
  414. sysMediaId: actionItem?.id,
  415. mediaType: actionItem?.mediaType,
  416. folder: actionItem?.folder,
  417. url: actionItem?.url,
  418. sort,
  419. };
  420. // if (mediaType === 'VIDEO') {
  421. // obj['videoTitle'] = videoTitle;
  422. // obj['videoDescription'] = videoDescription;
  423. // }
  424. edit.run(obj).then((res) => {
  425. list.refresh();
  426. get_folder_tree.refresh()
  427. offEditFile(); //关闭弹窗并清空相关数据
  428. });
  429. }
  430. },
  431. [fileName, actionItem, edit, belongUser, mediaType, videoTitle, videoDescription],
  432. );
  433. /**删除文件 */
  434. const dels = useCallback((id?: any) => {
  435. let arr = typeof id === 'number' ? [id] : selectFile;
  436. let len = arr?.length || 0;
  437. if (len) {
  438. arr?.map((id, index) => {
  439. del.run({ sysMediaId: id, mediaType }).then(() => {
  440. set({ selectFile: selectFile?.filter((i) => i !== id) }); //清理已删除文件
  441. if (index === len - 1) {
  442. list.refresh();
  443. get_folder_tree.refresh();
  444. }
  445. });
  446. });
  447. } else {
  448. message.error('请选择文件')
  449. }
  450. },
  451. [list, selectFile, mediaType],
  452. );
  453. /**获取本地素材数据列表 */
  454. const getList = useCallback(
  455. (props?: any) => {
  456. console.log('getList====>', props);
  457. let obj = {
  458. pageSize: 30,
  459. pageNum: 1,
  460. belongUser: belongUser === '0' ? false : true,
  461. mediaType,
  462. parentId,
  463. sizeQueries: cloudSize,
  464. maxSize,
  465. ...props,
  466. };
  467. if (mediaType === 'PAGE') {
  468. obj = {
  469. ...obj,
  470. adcreativeTemplateId,
  471. promotedObjectType,
  472. promotedObjectId,
  473. pageType,
  474. canvasType,
  475. siteSet,
  476. sourceType,
  477. marketingScene,
  478. };
  479. }
  480. list.run(obj).then((res) => {
  481. setIsOk(true);
  482. });
  483. },
  484. [list, mediaType, belongUser, parentId, cloudSize, maxSize, adcreativeTemplateId, promotedObjectType, promotedObjectId, pageType, canvasType, siteSet, sourceType, marketingScene],
  485. );
  486. /**选中文件 single 开启可单选为了在右键删除选择时只选一个*/
  487. const onFile = useCallback(
  488. (e: any, item: { id: any; folder?: boolean }, isAll?: boolean, single?: boolean) => {
  489. let { id } = item;
  490. e?.stopPropagation();
  491. if (isAll && !single) {
  492. set({ selectFile: [...new Set([...(selectFile as number[]), id])] });
  493. } else {
  494. if (item?.folder && !single) {
  495. //假如是文件不让选择
  496. message.error('不能选择文件夹');
  497. return;
  498. }
  499. set({ selectFile: [item.id], selectItem: [item] });
  500. }
  501. },
  502. [selectFile],
  503. );
  504. /**点击文件夹 */
  505. const fileClick = useCallback(
  506. (item) => {
  507. if (isOk) {
  508. setIsOk(false);
  509. if (belongUser == '1' && path) {
  510. set({ path: [...path, item] });
  511. }
  512. if (belongUser == '0' && publicPath) {
  513. set({ publicPath: [...publicPath, item] });
  514. }
  515. set({ parentId: item.id });
  516. getList({ parentId: item.id }); //请求对应文件夹列表
  517. }
  518. },
  519. [path, publicPath, mediaType, belongUser, isOk],
  520. );
  521. /**点击目录树*/
  522. const treeClick = useCallback(
  523. (item) => {
  524. if (isOk) {
  525. setIsOk(false);
  526. console.log(item, belongUser == '1');
  527. if (belongUser == '1' && path) {
  528. set({ path: [path[0], item] });
  529. }
  530. if (belongUser == '0' && publicPath) {
  531. set({ publicPath: [publicPath[0], item] });
  532. }
  533. set({ parentId: item.id });
  534. getList({ parentId: item.id }); //请求对应文件夹列表
  535. }
  536. },
  537. [path, publicPath, mediaType, belongUser, isOk],
  538. );
  539. /**点击路径 */
  540. const pathClick = useCallback(
  541. (item) => {
  542. let newPath: any[] = [];
  543. if (belongUser == '1') {
  544. path?.forEach((paths, index) => {
  545. //用传入的index和path循环的index对比小于等于index代表该保留的路径
  546. if (index <= item.index) {
  547. newPath.push(paths);
  548. }
  549. });
  550. set({ path: newPath });
  551. } else {
  552. publicPath?.forEach((paths, index) => {
  553. //用传入的index和path循环的index对比小于等于index代表该保留的路径
  554. if (index <= item.index) {
  555. newPath.push(paths);
  556. }
  557. });
  558. set({ publicPath: newPath });
  559. }
  560. set({ parentId: item.parentId });
  561. getList({
  562. pageSize: 30,
  563. pageNum: 1,
  564. mediaType,
  565. belongUser: belongUser === '0' ? false : true,
  566. parentId: item.id,
  567. });
  568. },
  569. [path, mediaType, belongUser, publicPath],
  570. );
  571. /**取消文件 */
  572. const offFile = useCallback(
  573. (e: any, item: { id: any }) => {
  574. let { id } = item;
  575. set({ selectFile: selectFile?.filter((i) => i !== id) });
  576. },
  577. [selectFile],
  578. );
  579. /**判断是取消还是选中文件的操作在点击打钩时使用 */
  580. const changeClickFile = useCallback((e: any, item: { id: any; folder?: boolean, url: string }, isAll?: boolean, noFile?: boolean) => {
  581. let { id, url } = item;
  582. e?.stopPropagation(); //阻止冒泡传递到文件夹被点击事件
  583. let state = selectItem?.some((i) => i.url === url);
  584. if (state) {
  585. //存在就是删除
  586. set({
  587. selectFile: selectFile?.filter((i) => i !== id),
  588. selectItem: selectItem?.filter((i: { url: string }) => i.url !== url),
  589. });
  590. } else {
  591. //否则新增
  592. if (num === 1) {
  593. if (state) {
  594. //存在就是删除
  595. set({ selectFile: selectFile?.filter((i) => i !== id), selectItem: [] });
  596. } else {
  597. //否则新增
  598. set({ selectFile: [id], selectItem: [item] });
  599. }
  600. } else {
  601. if (selectFile && num && selectFile?.length >= num) {
  602. message.error(`只能选择${num}张`);
  603. return;
  604. }
  605. let newSelectItem = selectItem || [];
  606. newSelectItem.push(item);
  607. set({ selectItem: newSelectItem, selectFile: [...(selectFile as number[]), id] });
  608. }
  609. }
  610. // }
  611. },
  612. [selectFile, mediaType, num],
  613. );
  614. /**开启删除弹窗 */
  615. const delPupOn = useCallback((delPupId) => {
  616. set({ delPupId });
  617. }, []);
  618. /**关闭删除弹窗并去除选中 */
  619. const delPupOff = useCallback(() => {
  620. set({ delPupId: '' });
  621. offFile(null, { id: delPupId });
  622. }, [delPupId]);
  623. /**编辑 */
  624. const editFile = useCallback((e?: any) => {
  625. e?.stopPropagation();
  626. onFile(null, rightClickPup, true, true);
  627. let obj = { fileVisible: true, actionItem: { ...rightClickPup, fileType: mediaType }, fileName: rightClickPup.title, sort: rightClickPup.sort };
  628. // if (rightClickPup?.mediaType === "video") {
  629. // obj['videoTitle'] = rightClickPup?.videoTitle || rightClickPup?.title;
  630. // obj['videoDescription'] = rightClickPup?.videoDescription;
  631. // }
  632. set(obj);
  633. },
  634. [rightClickPup],
  635. );
  636. /**取消编辑后清空选中存放的数据并关闭弹窗*/
  637. const offEditFile = useCallback(() => {
  638. set({
  639. fileVisible: false,
  640. imgVisrible: false,
  641. imgsVisrible: false,
  642. sortVisible: false,
  643. actionItem: '',
  644. fileName: '',
  645. selectFile: selectFile?.filter((id) => id !== actionItem?.id),
  646. sort: 0,
  647. });
  648. }, [selectFile, actionItem]);
  649. /**全选反选文件*/
  650. const allFile = useCallback(() => {
  651. let allArr: any[] = [], allFile: any[] = [];
  652. list?.data?.records?.forEach((item: { id: any }) => {
  653. allArr.push(item.id);
  654. allFile.push(item)
  655. });
  656. set({ selectFile: allArr.filter((i) => selectFile?.every((id) => id !== i)), selectItem: allFile.filter((i) => selectItem?.every((item: any) => item.id !== i.id)) });
  657. }, [selectFile, list, mediaType, selectItem]);
  658. return {
  659. state,
  660. init,
  661. set,
  662. addFile,
  663. addFolder,
  664. getList,
  665. dels,
  666. onFile,
  667. changeClickFile,
  668. allFile,
  669. delPupOn,
  670. delPupOff,
  671. editFile,
  672. offEditFile,
  673. nameOk,
  674. fileClick,
  675. treeClick,
  676. pathClick,
  677. addFiles,
  678. configSort,
  679. list,
  680. add,
  681. get,
  682. edit,
  683. typeEnum,
  684. get_folder_tree,
  685. edit_media_folder,
  686. };
  687. }
  688. export default useBdMediaPup;