useBdMediaPup.ts 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690
  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. add
  288. .run(obj)
  289. .then((res) => {
  290. list.refresh();
  291. offEditFile(); //关闭弹窗并清空相关数据
  292. set({ upLoadLoading: false });
  293. })
  294. .catch(() => set({ upLoadLoading: false }));
  295. }
  296. }
  297. } else {
  298. message.error('上传失败!');
  299. }
  300. })
  301. .catch(() => set({ upLoadLoading: false }));
  302. })
  303. .catch(() => set({ upLoadLoading: false }));
  304. }
  305. }
  306. };
  307. /** 批量新增图片 视频 */
  308. const addFiles = async (data: any) => {
  309. if (data) {//存在代表素材
  310. if (!data) {
  311. return
  312. }
  313. let { files, ...value } = data
  314. let params = files?.map(async (item: any, index: number) => {
  315. let file = item
  316. let fileSize = size || 0
  317. if (mediaType === 'IMG') {
  318. fileSize = value?.fileSize ? value?.fileSize * 1024 : 307200
  319. } else {
  320. fileSize = 104857600
  321. }
  322. if (mediaType === 'IMG') {
  323. let bad = 50
  324. let size = fileSize / 1024
  325. if (size > 10 && size <= 50) {
  326. bad = 5
  327. } else if (size > 50 && size <= 100) {
  328. bad = 10
  329. } else if (size > 100 && size <= 300) {
  330. bad = 20
  331. } else {
  332. bad = 50
  333. }
  334. if (file?.size > fileSize) { // 大于300kb进入压缩
  335. let bole = await compressAccurately(file, fileSize / 1024 - bad)
  336. if (bole?.size > fileSize) {
  337. bole = await compressAccurately(file, fileSize / 1024 - bad * 2)
  338. }
  339. if (bole?.size > fileSize) {
  340. bole = await compressAccurately(file, fileSize / 1024 - bad * 3)
  341. }
  342. if (bole?.size > fileSize) {
  343. bole = await compressAccurately(file, fileSize / 1024 - bad * 4)
  344. }
  345. let newFile = await blobToBase64(bole)
  346. message.warning({
  347. content: `选择的图片大于${fileSize / 1024}KB,图片已压缩`,
  348. duration: 3
  349. })
  350. file = await dataURLtoFile(newFile, file?.name)
  351. }
  352. } else if (mediaType === 'VIDEO') {
  353. if (file?.size > fileSize) { // 大于100mb进入压缩
  354. message.error({
  355. content: `选择的视频大于${fileSize / 1024 / 1024}MB,请重新选择提交`,
  356. duration: 3
  357. })
  358. return
  359. }
  360. }
  361. let width = 0
  362. let height = 0
  363. if (mediaType === 'IMG') {
  364. let imgData = await getImgSize(file)
  365. width = imgData.width
  366. height = imgData.height
  367. } else if (mediaType === "VIDEO") {
  368. let videoInfo: any = await videoMessage([file])
  369. width = videoInfo[0].width
  370. height = videoInfo[0].height
  371. }
  372. /**修改文件名以用户设置的文件title命名*/
  373. let newFile = new File([file], data?.title ? data?.title + index + 1 + '.' + file?.name?.split('.')[1] : file?.name, { type: file?.type })
  374. let formData = new FormData();
  375. set({ upLoadLoading: true })
  376. let res = await getFileUrl({ type: newFile.type, fileType: mediaType === 'VIDEO' ? 'video' : 'image' }).catch(() => set({ upLoadLoading: false }))
  377. let res1 = res.data
  378. Object.keys(res1).forEach((key: string) => {
  379. if (key !== 'url') {
  380. formData.append(key, res1[key])
  381. }
  382. })
  383. formData.append('file', newFile)
  384. /**向阿里云返回的上传地址上传文件*/
  385. let data1: { code: number, data: { url: string } } = await request(res1?.ossUrl, { method: 'post', body: formData }).catch(() => set({ upLoadLoading: false }))
  386. message.success('上传成功')
  387. let fileMd5 = await getMD5(newFile)
  388. 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 }
  389. if (mediaType === 'VIDEO') {
  390. obj['videoTitle'] = data?.videoTitle || data?.title
  391. obj['videoDescription'] = data?.videoDescription
  392. }
  393. return { ...obj }
  394. })
  395. Promise.all(params).then(res => {
  396. adds.run({ belongUser: belongUser === '0' ? false : true, data: res }).then(response => {
  397. list.refresh()
  398. offEditFile()//关闭弹窗并清空相关数据
  399. set({ upLoadLoading: false })
  400. }).catch(() => set({ upLoadLoading: false }))
  401. })
  402. }
  403. }
  404. /**编辑非图文素材名称*/
  405. const nameOk = useCallback((selectWx: any) => {
  406. if (fileName && actionItem) {
  407. let obj = {
  408. title: fileName,
  409. belongUser: belongUser === '0' ? false : true,
  410. sysMediaId: actionItem?.id,
  411. mediaType: actionItem?.mediaType,
  412. folder: actionItem?.folder,
  413. url: actionItem?.url,
  414. sort,
  415. };
  416. // if (mediaType === 'VIDEO') {
  417. // obj['videoTitle'] = videoTitle;
  418. // obj['videoDescription'] = videoDescription;
  419. // }
  420. edit.run(obj).then((res) => {
  421. list.refresh();
  422. offEditFile(); //关闭弹窗并清空相关数据
  423. });
  424. }
  425. },
  426. [fileName, actionItem, edit, belongUser, mediaType, videoTitle, videoDescription],
  427. );
  428. /**删除文件 */
  429. const dels = useCallback((id?: any) => {
  430. let arr = typeof id === 'number' ? [id] : selectFile;
  431. let len = arr?.length || 0;
  432. if (len) {
  433. arr?.map((id, index) => {
  434. del.run({ sysMediaId: id, mediaType }).then(() => {
  435. set({ selectFile: selectFile?.filter((i) => i !== id) }); //清理已删除文件
  436. if (index === len - 1) {
  437. list.refresh();
  438. get_folder_tree.refresh();
  439. }
  440. });
  441. });
  442. } else {
  443. message.error('请选择文件')
  444. }
  445. },
  446. [list, selectFile, mediaType],
  447. );
  448. /**获取本地素材数据列表 */
  449. const getList = useCallback(
  450. (props?: any) => {
  451. console.log('getList====>', props);
  452. let obj = {
  453. pageSize: 30,
  454. pageNum: 1,
  455. belongUser: belongUser === '0' ? false : true,
  456. mediaType,
  457. parentId,
  458. sizeQueries: cloudSize,
  459. maxSize,
  460. ...props,
  461. };
  462. if (mediaType === 'PAGE') {
  463. obj = {
  464. ...obj,
  465. adcreativeTemplateId,
  466. promotedObjectType,
  467. promotedObjectId,
  468. pageType,
  469. canvasType,
  470. siteSet,
  471. sourceType,
  472. marketingScene,
  473. };
  474. }
  475. list.run(obj).then((res) => {
  476. setIsOk(true);
  477. });
  478. },
  479. [list, mediaType, belongUser, parentId, cloudSize, maxSize, adcreativeTemplateId, promotedObjectType, promotedObjectId, pageType, canvasType, siteSet, sourceType, marketingScene],
  480. );
  481. /**选中文件 single 开启可单选为了在右键删除选择时只选一个*/
  482. const onFile = useCallback(
  483. (e: any, item: { id: any; folder?: boolean }, isAll?: boolean, single?: boolean) => {
  484. let { id } = item;
  485. e?.stopPropagation();
  486. if (isAll && !single) {
  487. set({ selectFile: [...new Set([...(selectFile as number[]), id])] });
  488. } else {
  489. if (item?.folder && !single) {
  490. //假如是文件不让选择
  491. message.error('不能选择文件夹');
  492. return;
  493. }
  494. set({ selectFile: [item.id], selectItem: [item] });
  495. }
  496. },
  497. [selectFile],
  498. );
  499. /**点击文件夹 */
  500. const fileClick = useCallback(
  501. (item) => {
  502. if (isOk) {
  503. setIsOk(false);
  504. if (belongUser == '1' && path) {
  505. set({ path: [...path, item] });
  506. }
  507. if (belongUser == '0' && publicPath) {
  508. set({ publicPath: [...publicPath, item] });
  509. }
  510. set({ parentId: item.id });
  511. getList({ parentId: item.id }); //请求对应文件夹列表
  512. }
  513. },
  514. [path, publicPath, mediaType, belongUser, isOk],
  515. );
  516. /**点击目录树*/
  517. const treeClick = useCallback(
  518. (item) => {
  519. if (isOk) {
  520. setIsOk(false);
  521. console.log(item, belongUser == '1');
  522. if (belongUser == '1' && path) {
  523. set({ path: [path[0], item] });
  524. }
  525. if (belongUser == '0' && publicPath) {
  526. set({ publicPath: [publicPath[0], item] });
  527. }
  528. set({ parentId: item.id });
  529. getList({ parentId: item.id }); //请求对应文件夹列表
  530. }
  531. },
  532. [path, publicPath, mediaType, belongUser, isOk],
  533. );
  534. /**点击路径 */
  535. const pathClick = useCallback(
  536. (item) => {
  537. let newPath: any[] = [];
  538. if (belongUser == '1') {
  539. path?.forEach((paths, index) => {
  540. //用传入的index和path循环的index对比小于等于index代表该保留的路径
  541. if (index <= item.index) {
  542. newPath.push(paths);
  543. }
  544. });
  545. set({ path: newPath });
  546. } else {
  547. publicPath?.forEach((paths, index) => {
  548. //用传入的index和path循环的index对比小于等于index代表该保留的路径
  549. if (index <= item.index) {
  550. newPath.push(paths);
  551. }
  552. });
  553. set({ publicPath: newPath });
  554. }
  555. set({ parentId: item.parentId });
  556. getList({
  557. pageSize: 30,
  558. pageNum: 1,
  559. mediaType,
  560. belongUser: belongUser === '0' ? false : true,
  561. parentId: item.id,
  562. });
  563. },
  564. [path, mediaType, belongUser, publicPath],
  565. );
  566. /**取消文件 */
  567. const offFile = useCallback(
  568. (e: any, item: { id: any }) => {
  569. let { id } = item;
  570. set({ selectFile: selectFile?.filter((i) => i !== id) });
  571. },
  572. [selectFile],
  573. );
  574. /**判断是取消还是选中文件的操作在点击打钩时使用 */
  575. const changeClickFile = useCallback(
  576. (e: any, item: { id: any; folder?: boolean, url: string }, isAll?: boolean, noFile?: boolean) => {
  577. let { id, url } = item;
  578. e?.stopPropagation(); //阻止冒泡传递到文件夹被点击事件
  579. let state = selectItem?.some((i) => i.url === url);
  580. if (state) {
  581. //存在就是删除
  582. set({
  583. selectFile: selectFile?.filter((i) => i !== id),
  584. selectItem: selectItem?.filter((i: { url: string }) => i.url !== url),
  585. });
  586. } else {
  587. //否则新增
  588. if (num === 1) {
  589. if (state) {
  590. //存在就是删除
  591. set({ selectFile: selectFile?.filter((i) => i !== id), selectItem: [] });
  592. } else {
  593. //否则新增
  594. set({ selectFile: [id], selectItem: [item] });
  595. }
  596. } else {
  597. if (selectFile && num && selectFile?.length >= num) {
  598. message.error(`只能选择${num}张`);
  599. return;
  600. }
  601. let newSelectItem = selectItem || [];
  602. newSelectItem.push(item);
  603. set({ selectItem: newSelectItem, selectFile: [...(selectFile as number[]), id] });
  604. }
  605. }
  606. // }
  607. },
  608. [selectFile, mediaType, num],
  609. );
  610. /**开启删除弹窗 */
  611. const delPupOn = useCallback((delPupId) => {
  612. set({ delPupId });
  613. }, []);
  614. /**关闭删除弹窗并去除选中 */
  615. const delPupOff = useCallback(() => {
  616. set({ delPupId: '' });
  617. offFile(null, { id: delPupId });
  618. }, [delPupId]);
  619. /**编辑 */
  620. const editFile = useCallback((e?: any) => {
  621. e?.stopPropagation();
  622. onFile(null, rightClickPup, true, true);
  623. let obj = { fileVisible: true, actionItem: { ...rightClickPup, fileType: mediaType }, fileName: rightClickPup.title, sort: rightClickPup.sort };
  624. // if (rightClickPup?.mediaType === "video") {
  625. // obj['videoTitle'] = rightClickPup?.videoTitle || rightClickPup?.title;
  626. // obj['videoDescription'] = rightClickPup?.videoDescription;
  627. // }
  628. set(obj);
  629. },
  630. [rightClickPup],
  631. );
  632. /**取消编辑后清空选中存放的数据并关闭弹窗*/
  633. const offEditFile = useCallback(() => {
  634. set({
  635. fileVisible: false,
  636. imgVisrible: false,
  637. imgsVisrible: false,
  638. sortVisible: false,
  639. actionItem: '',
  640. fileName: '',
  641. selectFile: selectFile?.filter((id) => id !== actionItem?.id),
  642. sort: 0,
  643. });
  644. }, [selectFile, actionItem]);
  645. /**全选反选文件*/
  646. const allFile = useCallback(() => {
  647. let allArr: any[] = [], allFile: any[] = [];
  648. list?.data?.records?.forEach((item: { id: any }) => {
  649. allArr.push(item.id);
  650. allFile.push(item)
  651. });
  652. set({ selectFile: allArr.filter((i) => selectFile?.every((id) => id !== i)), selectItem: allFile.filter((i) => selectItem?.every((item: any) => item.id !== i.id)) });
  653. }, [selectFile, list, mediaType, selectItem]);
  654. return {
  655. state,
  656. init,
  657. set,
  658. addFile,
  659. addFolder,
  660. getList,
  661. dels,
  662. onFile,
  663. changeClickFile,
  664. allFile,
  665. delPupOn,
  666. delPupOff,
  667. editFile,
  668. offEditFile,
  669. nameOk,
  670. fileClick,
  671. treeClick,
  672. pathClick,
  673. addFiles,
  674. configSort,
  675. list,
  676. add,
  677. get,
  678. edit,
  679. typeEnum,
  680. get_folder_tree,
  681. edit_media_folder,
  682. };
  683. }
  684. export default useBdMediaPup;