plugin-ai-chat-file-preview 1.0.5 → 1.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/client/index.js
CHANGED
|
@@ -7,4 +7,4 @@
|
|
|
7
7
|
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@nocobase/plugin-ai/client"),require("@nocobase/client"),require("react"),require("@ant-design/icons"),require("antd")):"function"==typeof define&&define.amd?define("plugin-ai-chat-file-preview",["@nocobase/plugin-ai/client","@nocobase/client","react","@ant-design/icons","antd"],t):"object"==typeof exports?exports["plugin-ai-chat-file-preview"]=t(require("@nocobase/plugin-ai/client"),require("@nocobase/client"),require("react"),require("@ant-design/icons"),require("antd")):e["plugin-ai-chat-file-preview"]=t(e["@nocobase/plugin-ai/client"],e["@nocobase/client"],e.react,e["@ant-design/icons"],e.antd)}(self,function(e,t,n,r,o){return function(){var i,a,u,l,c,s,f={581:function(e){e.exports=function(e,t){return"undefined"!=typeof __deoptimization_sideEffect__&&__deoptimization_sideEffect__(e,t),t}},482:function(e){"use strict";e.exports=r},772:function(e){"use strict";e.exports=t},645:function(t){"use strict";t.exports=e},721:function(e){"use strict";e.exports=o},156:function(e){"use strict";e.exports=n}},d={};function p(e){var t=d[e];if(void 0!==t)return t.exports;var n=d[e]={exports:{}};return f[e](n,n.exports,p),n.exports}p.m=f,p.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return p.d(t,{a:t}),t},p.d=function(e,t){for(var n in t)p.o(t,n)&&!p.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},p.f={},p.e=function(e){return Promise.all(Object.keys(p.f).reduce(function(t,n){return p.f[n](e,t),t},[]))},p.u=function(e){return""+({395:"0ef9cbd6bccd7aff",463:"7e04271656f34237"})[e]+".js"},p.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),p.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i={},a="plugin-ai-chat-file-preview:",p.l=function(e,t,n,r){if(i[e])return void i[e].push(t);if(void 0!==n)for(var o,u,l=document.getElementsByTagName("script"),c=0;c<l.length;c++){var s=l[c];if(s.getAttribute("src")==e||s.getAttribute("data-webpack")==a+n){o=s;break}}o||(u=!0,(o=document.createElement("script")).charset="utf-8",o.timeout=120,p.nc&&o.setAttribute("nonce",p.nc),o.setAttribute("data-webpack",a+n),o.src=e),i[e]=[t];var f=function(t,n){o.onerror=o.onload=null,clearTimeout(d);var r=i[e];if(delete i[e],o.parentNode&&o.parentNode.removeChild(o),r&&r.forEach(function(e){return e(n)}),t)return t(n)},d=setTimeout(f.bind(null,void 0,{type:"timeout",target:o}),12e4);o.onerror=f.bind(null,o.onerror),o.onload=f.bind(null,o.onload),u&&document.head.appendChild(o)},p.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(u=window.__webpack_public_path__||"/").endsWith("/")||(u+="/"),p.p=u+"static/plugins/plugin-ai-chat-file-preview/dist/client/",l={909:0},p.f.j=function(e,t){var n=p.o(l,e)?l[e]:void 0;if(0!==n)if(n)t.push(n[2]);else{var r=new Promise(function(t,r){n=l[e]=[t,r]});t.push(n[2]=r);var o=p.p+p.u(e),i=Error();p.l(o,function(t){if(p.o(l,e)&&(0!==(n=l[e])&&(l[e]=void 0),n)){var r=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;i.message="Loading chunk "+e+" failed.\n("+r+": "+o+")",i.name="ChunkLoadError",i.type=r,i.request=o,n[1](i)}},"chunk-"+e,e)}},c=function(e,t){var n,r,o=t[0],i=t[1],a=t[2],u=0;if(o.some(function(e){return 0!==l[e]})){for(n in i)p.o(i,n)&&(p.m[n]=i[n]);a&&a(p)}for(e&&e(t);u<o.length;u++)r=o[u],p.o(l,r)&&l[r]&&l[r][0](),l[r]=0},(s=self.webpackChunkplugin_ai_chat_file_preview=self.webpackChunkplugin_ai_chat_file_preview||[]).forEach(c.bind(null,0)),s.push=c.bind(null,s.push.bind(s));var v={};return!function(){"use strict";p.r(v),p.d(v,{PluginAIChatFilePreviewClient:function(){return eh},default:function(){return em}});var e=p(772),t=p(156),n=p.n(t),r=p(645),o=p(721),i=p(482);function a(e,t,n,r,o,i,a){try{var u=e[i](a),l=u.value}catch(e){n(e);return}u.done?t(l):Promise.resolve(l).then(r,o)}function u(e){return function(){var t=this,n=arguments;return new Promise(function(r,o){var i=e.apply(t,n);function u(e){a(i,r,o,u,l,"next",e)}function l(e){a(i,r,o,u,l,"throw",e)}u(void 0)})}}function l(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function u(i){return function(u){var l=[i,u];if(n)throw TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&l[0]?r.return:l[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,l[1])).done)return o;switch(r=0,o&&(l=[2&l[0],o.value]),l[0]){case 0:case 1:o=l;break;case 4:return a.label++,{value:l[1],done:!1};case 5:a.label++,r=l[1],l=[0];continue;case 7:l=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===l[0]||2===l[0])){a=0;continue}if(3===l[0]&&(!o||l[1]>o[0]&&l[1]<o[3])){a.label=l[1];break}if(6===l[0]&&a.label<o[1]){a.label=o[1],o=l;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(l);break}o[2]&&a.ops.pop(),a.trys.pop();continue}l=t.call(e,a)}catch(e){l=[6,e],r=0}finally{n=o=0}if(5&l[0])throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}}}var c="blobs";function s(){return new Promise(function(e,t){var n=indexedDB.open("nb-ai-chat-file-preview",1);n.onupgradeneeded=function(){var e=n.result;e.objectStoreNames.contains(c)||e.createObjectStore(c)},n.onsuccess=function(){return e(n.result)},n.onerror=function(){return t(n.error)}})}function f(e,t){return"".concat(e,":").concat(t)}var d={get:function(e,t){return u(function(){var n;return l(this,function(r){switch(r.label){case 0:return[4,s()];case 1:return n=r.sent(),[2,new Promise(function(r,o){var i=n.transaction(c,"readonly").objectStore(c).get(f(e,t));i.onsuccess=function(){return r(i.result||null)},i.onerror=function(){return o(i.error)}})]}})})()},put:function(e,t,n){return u(function(){var r;return l(this,function(o){switch(o.label){case 0:return[4,s()];case 1:return r=o.sent(),[2,new Promise(function(o,i){var a=r.transaction(c,"readwrite");a.objectStore(c).put(n,f(e,t)),a.oncomplete=function(){return o()},a.onerror=function(){return i(a.error)}})]}})})()},delete:function(e,t){return u(function(){var n;return l(this,function(r){switch(r.label){case 0:return[4,s()];case 1:return n=r.sent(),[2,new Promise(function(r,o){var i=n.transaction(c,"readwrite");i.objectStore(c).delete(f(e,t)),i.oncomplete=function(){return r()},i.onerror=function(){return o(i.error)}})]}})})()},clearSession:function(e){return u(function(){var t;return l(this,function(n){switch(n.label){case 0:return[4,s()];case 1:return t=n.sent(),[2,new Promise(function(n,r){var o=t.transaction(c,"readwrite"),i=o.objectStore(c).openCursor();i.onsuccess=function(){var t=i.result;t&&("string"==typeof t.key&&t.key.startsWith("".concat(e,":"))&&t.delete(),t.continue())},o.oncomplete=function(){return n()},o.onerror=function(){return r(o.error)}})]}})})()},clearAll:function(){return u(function(){var e;return l(this,function(t){switch(t.label){case 0:return[4,s()];case 1:return e=t.sent(),[2,new Promise(function(t,n){var r=e.transaction(c,"readwrite");r.objectStore(c).clear(),r.oncomplete=function(){return t()},r.onerror=function(){return n(r.error)}})]}})})()}};function h(){var t=(0,e.useApp)();return{t:function(e){return t.i18n.t(e,{ns:"@nocobase/plugin-ai-chat-file-preview"})}}}var m=p(581);function y(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function b(e,t,n,r,o,i,a){try{var u=e[i](a),l=u.value}catch(e){n(e);return}u.done?t(l):Promise.resolve(l).then(r,o)}function g(e){return function(){var t=this,n=arguments;return new Promise(function(r,o){var i=e.apply(t,n);function a(e){b(i,r,o,a,u,"next",e)}function u(e){b(i,r,o,a,u,"throw",e)}a(void 0)})}}function w(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var i=[],a=!0,u=!1;try{for(o=o.call(e);!(a=(n=o.next()).done)&&(i.push(n.value),!t||i.length!==t);a=!0);}catch(e){u=!0,r=e}finally{try{a||null==o.return||o.return()}finally{if(u)throw r}}return i}}(e,t)||function(e,t){if(e){if("string"==typeof e)return y(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return y(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function x(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function u(i){return function(u){var l=[i,u];if(n)throw TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&l[0]?r.return:l[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,l[1])).done)return o;switch(r=0,o&&(l=[2&l[0],o.value]),l[0]){case 0:case 1:o=l;break;case 4:return a.label++,{value:l[1],done:!1};case 5:a.label++,r=l[1],l=[0];continue;case 7:l=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===l[0]||2===l[0])){a=0;continue}if(3===l[0]&&(!o||l[1]>o[0]&&l[1]<o[3])){a.label=l[1];break}if(6===l[0]&&a.label<o[1]){a.label=o[1],o=l;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(l);break}o[2]&&a.ops.pop(),a.trys.pop();continue}l=t.call(e,a)}catch(e){l=[6,e],r=0}finally{n=o=0}if(5&l[0])throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}}}var S=["application/pdf"],E=["image/png","image/jpeg","image/gif","image/webp","image/svg+xml","image/bmp"],k=["text/plain","text/csv","text/html","text/css","text/javascript","application/json","application/xml","text/xml","text/yaml","application/x-yaml"],j=["application/vnd.openxmlformats-officedocument.wordprocessingml.document"],_=["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/vnd.ms-excel"],C=["pdf"],O=["png","jpg","jpeg","gif","webp","svg","bmp"],P=["txt","csv","html","css","js","json","xml","log","md","yaml","yml","xaml"],L=["docx"],I=["xlsx","xls"];function A(e){var t="string"==typeof e?e:null==e?void 0:e.url;return t?t.startsWith("http://")||t.startsWith("https://")?t:"".concat(location.origin,"/").concat(t.replace(/^\//,"")):""}function R(e,t,n){if((null==e?void 0:e.mimetype)&&t.includes(e.mimetype))return!0;var r,o,i=-1!==(o=(r=("string"==typeof e?e:(null==e?void 0:e.extname)||(null==e?void 0:e.name)||(null==e?void 0:e.filename)||(null==e?void 0:e.url)||"").split("?")[0].split("#")[0]).lastIndexOf("."))?r.slice(o+1).toLowerCase().replace(/^\./,""):"";return!!i&&n.includes(i)}var T=function(e){return R(e,S,C)},F=function(e){return R(e,E,O)},U=function(e){return R(e,k,P)},B=function(e){return R(e,j,L)},q=function(e){return R(e,_,I)};function M(e,t){return D.apply(this,arguments)}function D(){return(D=g(function(e,t){return x(this,function(n){switch(n.label){case 0:return[4,e.axios.get(t,{responseType:"blob"})];case 1:return[2,n.sent().data]}})})).apply(this,arguments)}function N(){return(N=g(function(e,t,n){var r,o,i,a,u,l;return x(this,function(c){switch(c.label){case 0:if(r=A(e),o=String((null==e?void 0:e.id)||(null==e?void 0:e.uid)||r),!(i=(null==e?void 0:e.filename)||(null==e?void 0:e.name)||(null==e?void 0:e.title)))return[3,2];return[4,d.get("local_uploads",i).catch(function(){return null})];case 1:if(a=c.sent())return[2,a];c.label=2;case 2:if(!(n&&o))return[3,4];return[4,d.get(n,o).catch(function(){return null})];case 3:if(u=c.sent())return[2,u];c.label=4;case 4:if(!r)throw Error("No valid URL");return[4,M(t,r)];case 5:return l=c.sent(),n&&o&&d.put(n,o,l).catch(function(){}),[2,l]}})})).apply(this,arguments)}function z(){return(z=g(function(e,t){var n,r,o,i;return x(this,function(a){switch(a.label){case 0:return[4,function(e,t,n){return N.apply(this,arguments)}(e,t,"")];case 1:return n=a.sent(),r=(null==e?void 0:e.title)&&(null==e?void 0:e.extname)?"".concat(e.title).concat(e.extname):(null==e?void 0:e.filename)||(null==e?void 0:e.name)||"download",(o=document.createElement("a")).href=i=URL.createObjectURL(n),o.download=r,document.body.appendChild(o),o.click(),document.body.removeChild(o),setTimeout(function(){return URL.revokeObjectURL(i)},1e3),[2]}})})).apply(this,arguments)}function W(e){var t=e.msg;return n().createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100%",width:"100%"}},n().createElement(o.Spin,{tip:t}))}function H(e){var t=e.msg;return n().createElement("div",{style:{padding:20,textAlign:"center",color:"#ff4d4f"}},t)}function X(e,n,r){var o=w((0,t.useState)(null),2),i=o[0],a=o[1],u=w((0,t.useState)(!0),2),l=u[0],c=u[1],s=w((0,t.useState)(null),2),f=s[0],p=s[1],v=(0,t.useRef)(null),h=(null==e?void 0:e.id)||(null==e?void 0:e.uid)||"",m=A(e);return(0,t.useEffect)(function(){var e=!1;if(!m){c(!1),p("No file URL");return}return c(!0),p(null),g(function(){var t,o,i,u,l;return x(this,function(s){switch(s.label){case 0:if(s.trys.push([0,4,,5]),!(r&&h))return[3,2];return[4,d.get(r,String(h))];case 1:if((t=s.sent())&&!e)return v.current=o=URL.createObjectURL(t),a(o),c(!1),[2];s.label=2;case 2:return[4,M(n,m)];case 3:if(i=s.sent(),e)return[2];return r&&h&&d.put(r,String(h),i).catch(function(){}),v.current=u=URL.createObjectURL(i),a(u),c(!1),[3,5];case 4:if(l=s.sent(),e)return[2];return p(l.message||"Failed to load"),c(!1),[3,5];case 5:return[2]}})})(),function(){e=!0,v.current&&(URL.revokeObjectURL(v.current),v.current=null)}},[m,n,r,h]),{blobUrl:i,loading:l,error:f}}function G(t){var r=t.file,o=t.sessionId,i=(0,e.useAPIClient)(),a=h().t,u=X(r,i,o),l=u.blobUrl,c=u.loading,s=u.error;return c?n().createElement(W,{msg:a("Loading preview...")}):s||!l?n().createElement(H,{msg:a("Failed to load file preview")}):n().createElement("iframe",{src:l,width:"100%",height:"100%",style:{border:"none"}})}function $(t){var r=t.file,o=t.sessionId,i=(0,e.useAPIClient)(),a=h().t,u=X(r,i,o),l=u.blobUrl,c=u.loading,s=u.error;return c?n().createElement(W,{msg:a("Loading preview...")}):s||!l?n().createElement(H,{msg:a("Failed to load file preview")}):n().createElement("img",{src:l,style:{maxWidth:"100%",maxHeight:"100%",objectFit:"contain"},alt:(null==r?void 0:r.filename)||""})}function J(r){var o,i,a,u,l,c,s,f,p,v,m,y=r.file,b=r.sessionId,S=(0,e.useAPIClient)(),E=h().t,k=(i=(o=w((0,t.useState)(null),2))[0],a=o[1],l=(u=w((0,t.useState)(!0),2))[0],c=u[1],f=(s=w((0,t.useState)(null),2))[0],p=s[1],v=(null==y?void 0:y.id)||(null==y?void 0:y.uid)||"",m=A(y),(0,t.useEffect)(function(){var e=!1;if(!m){c(!1),p("No file URL");return}return c(!0),p(null),g(function(){var t,n,r,o;return x(this,function(i){switch(i.label){case 0:if(i.trys.push([0,5,,6]),!(b&&v))return[3,3];return[4,d.get(b,String(v))];case 1:if(!((t=i.sent())&&!e))return[3,3];return[4,t.text()];case 2:return a(i.sent()),c(!1),[2];case 3:return[4,fetchFileAsText(S,m)];case 4:if(n=i.sent(),e)return[2];return b&&v&&(r=new Blob([n],{type:"text/plain"}),d.put(b,String(v),r).catch(function(){})),a(n),c(!1),[3,6];case 5:if(o=i.sent(),e)return[2];return p(o.message||"Failed to load"),c(!1),[3,6];case 6:return[2]}})})(),function(){e=!0}},[m,S,b,v]),{text:i,loading:l,error:f}),j=k.text,_=k.loading,C=k.error;return _?n().createElement(W,{msg:E("Loading preview...")}):C||null===j?n().createElement(H,{msg:E("Failed to load file preview")}):n().createElement("pre",{style:{width:"100%",height:"100%",overflow:"auto",padding:16,margin:0,fontSize:13,lineHeight:1.6,whiteSpace:"pre-wrap",wordWrap:"break-word",background:"#f5f5f5",border:"none"}},j)}function V(r){var o=r.file,i=r.sessionId,a=(0,e.useAPIClient)(),u=h().t,l=(0,t.useRef)(null),c=w((0,t.useState)(!0),2),s=c[0],f=c[1],v=w((0,t.useState)(null),2),y=v[0],b=v[1],S=A(o),E=(null==o?void 0:o.id)||(null==o?void 0:o.uid)||"";return(0,t.useEffect)(function(){var e=!1;if(!S||!l.current){f(!1),b("No file URL");return}return f(!0),b(null),g(function(){var t,n,r,o;return x(this,function(u){switch(u.label){case 0:if(u.trys.push([0,10,,11]),!(i&&E))return[3,5];return[4,d.get(i,String(E))];case 1:if(!((n=u.sent())&&!e))return[3,2];return t=n,[3,4];case 2:return[4,M(a,S)];case 3:if(t=u.sent(),e)return[2];d.put(i,String(E),t).catch(function(){}),u.label=4;case 4:return[3,7];case 5:return[4,M(a,S)];case 6:t=u.sent(),u.label=7;case 7:if(e||!l.current)return[2];return[4,m("imported_-1dm6lbf_component",p.e("395").then(p.bind(p,835)))];case 8:if(r=u.sent(),e||!l.current)return[2];return l.current.innerHTML="",[4,r.renderAsync(t,l.current,void 0,{className:"docx-preview-wrapper",inWrapper:!0,ignoreWidth:!1,ignoreHeight:!1,ignoreFonts:!1,breakPages:!0,ignoreLastRenderedPageBreak:!0,experimental:!1,trimXmlDeclaration:!0,useBase64URL:!0,renderHeaders:!0,renderFooters:!0,renderFootnotes:!0,renderEndnotes:!0})];case 9:return u.sent(),f(!1),[3,11];case 10:if(o=u.sent(),e)return[2];return b(o.message||"Failed to render DOCX"),f(!1),[3,11];case 11:return[2]}})})(),function(){e=!0}},[S,a,i,E]),n().createElement("div",{style:{width:"100%",height:"100%",position:"relative"}},s&&n().createElement(W,{msg:u("Loading preview...")}),y&&n().createElement(H,{msg:u("Failed to load file preview")}),n().createElement("div",{ref:l,style:{width:"100%",height:"100%",overflow:"auto",display:s||y?"none":"block"}}))}function Y(r){var o=r.file,i=r.sessionId,a=(0,e.useAPIClient)(),u=h().t,l=w((0,t.useState)(!0),2),c=l[0],s=l[1],f=w((0,t.useState)(null),2),v=f[0],y=f[1],b=w((0,t.useState)([]),2),S=b[0],E=b[1],k=w((0,t.useState)(""),2),j=k[0],_=k[1],C=w((0,t.useState)({}),2),O=C[0],P=C[1],L=A(o),I=(null==o?void 0:o.id)||(null==o?void 0:o.uid)||"";return(0,t.useEffect)(function(){var e=!1;if(!L){s(!1),y("No file URL");return}return s(!0),y(null),g(function(){var t,n,r,o,u,l,c,f,v,h,b,g,w,S;return x(this,function(x){switch(x.label){case 0:if(x.trys.push([0,10,,11]),!(i&&I))return[3,5];return[4,d.get(i,String(I))];case 1:if(!((n=x.sent())&&!e))return[3,2];return t=n,[3,4];case 2:return[4,M(a,L)];case 3:if(t=x.sent(),e)return[2];d.put(i,String(I),t).catch(function(){}),x.label=4;case 4:return[3,7];case 5:return[4,M(a,L)];case 6:t=x.sent(),x.label=7;case 7:if(e)return[2];return[4,m("imported_-1lj2ifg_component",p.e("463").then(p.bind(p,312)))];case 8:if(r=x.sent(),e)return[2];return[4,t.arrayBuffer()];case 9:if(o=x.sent(),e)return[2];l=(u=r.read(o,{type:"array"})).SheetNames,c={},f=!0,v=!1,h=void 0;try{for(b=l[Symbol.iterator]();!(f=(g=b.next()).done);f=!0)c[w=g.value]=r.utils.sheet_to_html(u.Sheets[w],{id:"xlsx-preview-table"})}catch(e){v=!0,h=e}finally{try{f||null==b.return||b.return()}finally{if(v)throw h}}if(e)return[2];return E(l),_(l[0]||""),P(c),s(!1),[3,11];case 10:if(S=x.sent(),e)return[2];return y(S.message||"Failed to render XLSX"),s(!1),[3,11];case 11:return[2]}})})(),function(){e=!0}},[L,a,i,I]),n().createElement("div",{style:{width:"100%",height:"100%",display:"flex",flexDirection:"column"}},c&&n().createElement(W,{msg:u("Loading preview...")}),v&&n().createElement(H,{msg:u("Failed to load file preview")}),!c&&!v&&n().createElement(n().Fragment,null,S.length>1&&n().createElement("div",{style:{display:"flex",gap:0,borderBottom:"1px solid #e8e8e8",background:"#fafafa",padding:"0 8px",flexShrink:0,overflowX:"auto"}},S.map(function(e){return n().createElement("button",{key:e,onClick:function(){return _(e)},style:{padding:"8px 16px",border:"none",borderBottom:j===e?"2px solid #1890ff":"2px solid transparent",background:j===e?"#fff":"transparent",color:j===e?"#1890ff":"#666",fontWeight:j===e?600:400,cursor:"pointer",fontSize:13,whiteSpace:"nowrap",transition:"all 0.2s"}},e)})),n().createElement("div",{style:{flex:1,overflow:"auto",padding:0},dangerouslySetInnerHTML:{__html:O[j]||""}}),n().createElement("style",null,"\n #xlsx-preview-table { border-collapse: collapse; width: 100%; font-size: 13px; }\n #xlsx-preview-table td, #xlsx-preview-table th {\n border: 1px solid #e8e8e8; padding: 6px 10px; text-align: left;\n max-width: 33vw; white-space: normal; word-break: break-word;\n }\n #xlsx-preview-table tr:first-child td, #xlsx-preview-table tr:first-child th {\n background: #fafafa; font-weight: 600; position: sticky; top: 0; z-index: 1;\n }\n #xlsx-preview-table tr:nth-child(even) { background: #fafafa; }\n #xlsx-preview-table tr:hover { background: #f0f7ff; }\n ")))}var K=function(r){var a=r.open,u=r.file,l=r.sessionId,c=r.onClose,s=(0,e.useAPIClient)(),f=h().t,p=w((0,t.useState)(!1),2),v=p[0],m=p[1],y=(null==u?void 0:u.id)||(null==u?void 0:u.uid)||"",b=(0,t.useCallback)(g(function(){return x(this,function(e){switch(e.label){case 0:if(!u)return[2];m(!0),e.label=1;case 1:return e.trys.push([1,3,4,5]),[4,function(e,t){return z.apply(this,arguments)}(u,s)];case 2:return e.sent(),[3,5];case 3:return e.sent(),o.message.error(f("Failed to download file")),[3,5];case 4:return m(!1),[7];case 5:return[2]}})}),[u,s,f]),S=(0,t.useCallback)(g(function(){return x(this,function(e){switch(e.label){case 0:if(!l||!y)return[2];return[4,d.delete(l,String(y))];case 1:return e.sent(),o.message.success(f("Cache cleared")),[2]}})}),[l,y,f]),E=(0,t.useMemo)(function(){return u?T(u)?G:F(u)?$:U(u)?J:B(u)?V:q(u)?Y:null:null},[u]),k=null!=E,j=(null==u?void 0:u.title)&&(null==u?void 0:u.extname)?"".concat(u.title).concat(u.extname):(null==u?void 0:u.filename)||(null==u?void 0:u.name)||"File";return n().createElement(o.Modal,{open:a,title:j,onCancel:c,destroyOnClose:!0,footer:[l&&y?n().createElement(o.Button,{key:"clear-cache",icon:n().createElement(i.DeleteOutlined,null),onClick:S},f("Clear cache")):null,n().createElement(o.Button,{key:"download",icon:n().createElement(i.DownloadOutlined,null),onClick:b,loading:v},f("Download")),n().createElement(o.Button,{key:"close",onClick:c},f("Close"))].filter(Boolean),width:k?"60vw":520,centered:!0},n().createElement("div",{style:{maxWidth:"100%",maxHeight:k?"calc(100vh - 256px)":"auto",height:k?"70vh":"auto",width:"100%",background:"white",display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",overflowY:"auto"}},k&&u?n().createElement(E,{file:u,sessionId:l}):n().createElement(o.Alert,{type:"info",style:{width:"100%"},description:f("This file type cannot be previewed. Click Download to save the file."),showIcon:!0})))};function Q(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function Z(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function ee(e){return(ee=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function et(e,t){return null!=t&&"undefined"!=typeof Symbol&&t[Symbol.hasInstance]?!!t[Symbol.hasInstance](e):e instanceof t}function en(e,t){return(en=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function er(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var i=[],a=!0,u=!1;try{for(o=o.call(e);!(a=(n=o.next()).done)&&(i.push(n.value),!t||i.length!==t);a=!0);}catch(e){u=!0,r=e}finally{try{a||null==o.return||o.return()}finally{if(u)throw r}}return i}}(e,t)||function(e,t){if(e){if("string"==typeof e)return Q(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Q(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function eo(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(eo=function(){return!!e})()}function ei(e){return{id:e.id,uid:e.uid,url:e.url,filename:e.filename||e.name,name:e.name||e.filename,title:e.title,extname:e.extname,mimetype:e.mimetype,size:e.size}}var ea=function(o){var i=o.children,a=er((0,t.useState)(!1),2),u=a[0],l=a[1],c=er((0,t.useState)(null),2),s=c[0],f=c[1],p=er((0,t.useState)(""),2),v=p[0],h=p[1],m=(0,e.useAPIClient)(),y=r.useChatMessagesStore.use.messages(),b=r.useChatMessagesStore.use.attachments(),g=(0,t.useRef)(y),w=(0,t.useRef)(b);g.current=y,w.current=b;var x=(0,t.useRef)("");(0,t.useEffect)(function(){var e=m.axios.interceptors.request.use(function(e){var t=e.url||"";if(t.includes("aiConversations:getMessages")){var n=t.match(/sessionId=([^&]+)/);n&&(x.current=decodeURIComponent(n[1]))}if(t.includes("aiConversations:sendMessages")&&e.data)try{var r="string"==typeof e.data?JSON.parse(e.data):e.data;(null==r?void 0:r.sessionId)&&(x.current=r.sessionId)}catch(e){}return e});return function(){m.axios.interceptors.request.eject(e)}},[m]),(0,t.useEffect)(function(){var e=function(e){var t;(null==(t=e.dataTransfer)?void 0:t.files)&&Array.from(e.dataTransfer.files).forEach(function(e){e.name&&d.put("local_uploads",e.name,e).catch(function(){})})},t=function(e){var t=e.target;(null==t?void 0:t.type)==="file"&&t.files&&Array.from(t.files).forEach(function(e){e.name&&d.put("local_uploads",e.name,e).catch(function(){})})};return window.addEventListener("drop",e,!0),document.addEventListener("change",t,!0),function(){window.removeEventListener("drop",e,!0),document.removeEventListener("change",t,!0)}},[]),(0,t.useEffect)(function(){(null==b?void 0:b.length)&&b.forEach(function(e){var t=e.originFileObj||e;if(et(t,Blob)||et(t,File)){var n=e.name||e.filename||t.name;n&&d.put("local_uploads",n,t).catch(function(){})}})},[b]),(0,t.useEffect)(function(){var e=document.createElement("style");return e.innerHTML='\n div[class*="attachment-list-card"] {\n position: relative !important;\n cursor: pointer !important;\n }\n /* Prevent pointer events on inner text and icons so the outer div receives the absolute click */\n div[class*="attachment-list-card"] a,\n div[class*="attachment-list-card"] [class*="-icon"],\n div[class*="attachment-list-card"] span {\n pointer-events: none !important;\n }\n /* Re-enable pointer events for the delete button specifically */\n div[class*="attachment-list-card"] [class*="-remove"],\n div[class*="attachment-list-card"] button,\n div[class*="attachment-list-card"] .ant-btn {\n pointer-events: auto !important;\n }\n /* Visual "Preview" badge at the top-left corner */\n div[class*="attachment-list-card"]::after {\n content: \'\uD83D\uDC41️\';\n position: absolute;\n top: 2px;\n left: 2px;\n background: transparent !important;\n color: inherit;\n font-size: 14px;\n line-height: 1;\n padding: 0;\n z-index: 10;\n pointer-events: none;\n box-shadow: none !important;\n opacity: 0.8;\n }\n /* Hide native antd thumbnail icon if we placed an eye so it doesnt look messy */\n div[class*="attachment-list-card"] .ant-upload-list-item-thumbnail {\n opacity: 0.2;\n }\n ',document.head.appendChild(e),function(){e.remove()}},[]),(0,t.useEffect)(function(){var e=function(e){var t,n,r,o=e.target;if(!o||"function"!=typeof o.closest)return;var i=o.closest('[class*="attachment-list-card"]');if(!(!i||o.closest('[class*="-remove"]')||o.closest(".ant-btn"))){var a=(n=i.querySelector('[class*="ellipsis-prefix"]'),r=i.querySelector('[class*="ellipsis-suffix"]'),n&&r?(n.textContent||"")+(r.textContent||""):(null==(t=i.textContent)?void 0:t.trim())||""),u=i.querySelectorAll("a"),c="";u.forEach(function(e){e.href&&(c=e.href)});var s=function(e,t,n){if(!e)return null;var r=!0,o=!1,i=void 0;try{for(var a,u=t[Symbol.iterator]();!(r=(a=u.next()).done);r=!0){var l=a.value,c=l.content||l,s=null==c?void 0:c.attachments;if(null==s?void 0:s.length){var f=!0,d=!1,p=void 0;try{for(var v,h=s[Symbol.iterator]();!(f=(v=h.next()).done);f=!0){var m=v.value;if((m.filename||m.name||"")===e||"".concat(m.title||"").concat(m.extname||"")===e)return ei(m)}}catch(e){d=!0,p=e}finally{try{f||null==h.return||h.return()}finally{if(d)throw p}}}}}catch(e){o=!0,i=e}finally{try{r||null==u.return||u.return()}finally{if(o)throw i}}var y=!0,b=!1,g=void 0;try{for(var w,x=(n||[])[Symbol.iterator]();!(y=(w=x.next()).done);y=!0){var S=w.value;if((S.filename||S.name||"")===e||"".concat(S.title||"").concat(S.extname||"")===e)return ei(S)}}catch(e){b=!0,g=e}finally{try{y||null==x.return||x.return()}finally{if(b)throw g}}return null}(a,g.current,w.current)||function(e,t,n){if(!e)return null;var r=function(e,t){return!!e&&!!t&&e.split("?")[0].replace(location.origin,"").replace(/^\//,"")===t.split("?")[0].replace(location.origin,"").replace(/^\//,"")},o=!0,i=!1,a=void 0;try{for(var u,l=t[Symbol.iterator]();!(o=(u=l.next()).done);o=!0){var c=u.value,s=c.content||c,f=null==s?void 0:s.attachments;if(null==f?void 0:f.length){var d=!0,p=!1,v=void 0;try{for(var h,m=f[Symbol.iterator]();!(d=(h=m.next()).done);d=!0){var y=h.value;if(r(y.url,e)||r(y.preview,e))return ei(y)}}catch(e){p=!0,v=e}finally{try{d||null==m.return||m.return()}finally{if(p)throw v}}}}}catch(e){i=!0,a=e}finally{try{o||null==l.return||l.return()}finally{if(i)throw a}}var b=!0,g=!1,w=void 0;try{for(var x,S=(n||[])[Symbol.iterator]();!(b=(x=S.next()).done);b=!0){var E=x.value;if(r(E.url,e)||r(E.preview,e))return ei(E)}}catch(e){g=!0,w=e}finally{try{b||null==S.return||S.return()}finally{if(g)throw w}}return null}(c,g.current,w.current);s&&(T(s)||F(s)||U(s)||B(s)||q(s))&&(e.preventDefault(),e.stopPropagation(),h(x.current||""),f(s),l(!0))}};return document.addEventListener("click",e,{capture:!0}),function(){return document.removeEventListener("click",e,{capture:!0})}},[]),(0,t.useEffect)(function(){var e=m.axios.interceptors.response.use(function(e){try{var t,n=(null==(t=e.config)?void 0:t.url)||"";if(n.includes("aiConversations:destroy")){var r=n.match(/filterByTk=([^&]+)/);r&&d.clearSession(decodeURIComponent(r[1])).catch(function(){})}}catch(e){}return e});return function(){m.axios.interceptors.response.eject(e)}},[m]);var S=(0,t.useCallback)(function(){l(!1),f(null)},[]);return n().createElement(n().Fragment,null,i,n().createElement(K,{open:u,file:s,sessionId:v,onClose:S}))},eu=function(e){var t,n;if("function"!=typeof e&&null!==e)throw TypeError("Super expression must either be null or a function");function r(e){var t,n,o;if(!(this instanceof r))throw TypeError("Cannot call a class as a function");return n=r,o=[e],n=ee(n),(t=function(e,t){var n;if(t&&("object"==((n=t)&&"undefined"!=typeof Symbol&&n.constructor===Symbol?"symbol":typeof n)||"function"==typeof t))return t;if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this,eo()?Reflect.construct(n,o||[],ee(this).constructor):n.apply(this,o))).state={hasError:!1},t}return r.prototype=Object.create(e&&e.prototype,{constructor:{value:r,writable:!0,configurable:!0}}),e&&en(r,e),n=[{key:"getDerivedStateFromError",value:function(){return{hasError:!0}}}],t=[{key:"render",value:function(){return this.state.hasError,this.props.children}}],Z(r.prototype,t),n&&Z(r,n),r}(n().Component),el=function(e){var t=e.children;return n().createElement(eu,null,n().createElement(ea,null,t))};function ec(e,t,n,r,o,i,a){try{var u=e[i](a),l=u.value}catch(e){n(e);return}u.done?t(l):Promise.resolve(l).then(r,o)}function es(e,t,n){return(es=ev()?Reflect.construct:function(e,t,n){var r=[null];r.push.apply(r,t);var o=new(Function.bind.apply(e,r));return n&&ed(o,n.prototype),o}).apply(null,arguments)}function ef(e){return(ef=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function ed(e,t){return(ed=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function ep(e){var t="function"==typeof Map?new Map:void 0;return(ep=function(e){if(null===e||-1===Function.toString.call(e).indexOf("[native code]"))return e;if("function"!=typeof e)throw TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return es(e,arguments,ef(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),ed(n,e)})(e)}function ev(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(ev=function(){return!!e})()}var eh=function(e){var t;if("function"!=typeof e&&null!==e)throw TypeError("Super expression must either be null or a function");function n(){var e,t;if(!(this instanceof n))throw TypeError("Cannot call a class as a function");return e=n,t=arguments,e=ef(e),function(e,t){var n;if(t&&("object"==((n=t)&&"undefined"!=typeof Symbol&&n.constructor===Symbol?"symbol":typeof n)||"function"==typeof t))return t;if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this,ev()?Reflect.construct(e,t||[],ef(this).constructor):e.apply(this,t))}return n.prototype=Object.create(e&&e.prototype,{constructor:{value:n,writable:!0,configurable:!0}}),e&&ed(n,e),t=[{key:"load",value:function(){var e,t=this;return(e=function(){return function(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function u(i){return function(u){var l=[i,u];if(n)throw TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&l[0]?r.return:l[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,l[1])).done)return o;switch(r=0,o&&(l=[2&l[0],o.value]),l[0]){case 0:case 1:o=l;break;case 4:return a.label++,{value:l[1],done:!1};case 5:a.label++,r=l[1],l=[0];continue;case 7:l=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===l[0]||2===l[0])){a=0;continue}if(3===l[0]&&(!o||l[1]>o[0]&&l[1]<o[3])){a.label=l[1];break}if(6===l[0]&&a.label<o[1]){a.label=o[1],o=l;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(l);break}o[2]&&a.ops.pop(),a.trys.pop();continue}l=t.call(e,a)}catch(e){l=[6,e],r=0}finally{n=o=0}if(5&l[0])throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}}}(this,function(e){return t.app.use(el),[2]})},function(){var t=this,n=arguments;return new Promise(function(r,o){var i=e.apply(t,n);function a(e){ec(i,r,o,a,u,"next",e)}function u(e){ec(i,r,o,a,u,"throw",e)}a(void 0)})})()}}],function(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(n.prototype,t),n}(ep(e.Plugin)),em=eh}(),v}()});
|
|
10
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@nocobase/plugin-ai/client"),require("@nocobase/client"),require("react"),require("@ant-design/icons"),require("antd")):"function"==typeof define&&define.amd?define("plugin-ai-chat-file-preview",["@nocobase/plugin-ai/client","@nocobase/client","react","@ant-design/icons","antd"],t):"object"==typeof exports?exports["plugin-ai-chat-file-preview"]=t(require("@nocobase/plugin-ai/client"),require("@nocobase/client"),require("react"),require("@ant-design/icons"),require("antd")):e["plugin-ai-chat-file-preview"]=t(e["@nocobase/plugin-ai/client"],e["@nocobase/client"],e.react,e["@ant-design/icons"],e.antd)}(self,function(e,t,n,r,o){return function(){var i,a,l,u,c,s,f={581:function(e){e.exports=function(e,t){return"undefined"!=typeof __deoptimization_sideEffect__&&__deoptimization_sideEffect__(e,t),t}},482:function(e){"use strict";e.exports=r},772:function(e){"use strict";e.exports=t},645:function(t){"use strict";t.exports=e},721:function(e){"use strict";e.exports=o},156:function(e){"use strict";e.exports=n}},d={};function p(e){var t=d[e];if(void 0!==t)return t.exports;var n=d[e]={exports:{}};return f[e](n,n.exports,p),n.exports}p.m=f,p.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return p.d(t,{a:t}),t},p.d=function(e,t){for(var n in t)p.o(t,n)&&!p.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},p.f={},p.e=function(e){return Promise.all(Object.keys(p.f).reduce(function(t,n){return p.f[n](e,t),t},[]))},p.u=function(e){return""+({395:"0ef9cbd6bccd7aff",463:"7e04271656f34237"})[e]+".js"},p.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),p.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i={},a="plugin-ai-chat-file-preview:",p.l=function(e,t,n,r){if(i[e])return void i[e].push(t);if(void 0!==n)for(var o,l,u=document.getElementsByTagName("script"),c=0;c<u.length;c++){var s=u[c];if(s.getAttribute("src")==e||s.getAttribute("data-webpack")==a+n){o=s;break}}o||(l=!0,(o=document.createElement("script")).charset="utf-8",o.timeout=120,p.nc&&o.setAttribute("nonce",p.nc),o.setAttribute("data-webpack",a+n),o.src=e),i[e]=[t];var f=function(t,n){o.onerror=o.onload=null,clearTimeout(d);var r=i[e];if(delete i[e],o.parentNode&&o.parentNode.removeChild(o),r&&r.forEach(function(e){return e(n)}),t)return t(n)},d=setTimeout(f.bind(null,void 0,{type:"timeout",target:o}),12e4);o.onerror=f.bind(null,o.onerror),o.onload=f.bind(null,o.onload),l&&document.head.appendChild(o)},p.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(l=window.__webpack_public_path__||"/").endsWith("/")||(l+="/"),p.p=l+"static/plugins/plugin-ai-chat-file-preview/dist/client/",u={909:0},p.f.j=function(e,t){var n=p.o(u,e)?u[e]:void 0;if(0!==n)if(n)t.push(n[2]);else{var r=new Promise(function(t,r){n=u[e]=[t,r]});t.push(n[2]=r);var o=p.p+p.u(e),i=Error();p.l(o,function(t){if(p.o(u,e)&&(0!==(n=u[e])&&(u[e]=void 0),n)){var r=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;i.message="Loading chunk "+e+" failed.\n("+r+": "+o+")",i.name="ChunkLoadError",i.type=r,i.request=o,n[1](i)}},"chunk-"+e,e)}},c=function(e,t){var n,r,o=t[0],i=t[1],a=t[2],l=0;if(o.some(function(e){return 0!==u[e]})){for(n in i)p.o(i,n)&&(p.m[n]=i[n]);a&&a(p)}for(e&&e(t);l<o.length;l++)r=o[l],p.o(u,r)&&u[r]&&u[r][0](),u[r]=0},(s=self.webpackChunkplugin_ai_chat_file_preview=self.webpackChunkplugin_ai_chat_file_preview||[]).forEach(c.bind(null,0)),s.push=c.bind(null,s.push.bind(s));var v={};return!function(){"use strict";p.r(v),p.d(v,{PluginAIChatFilePreviewClient:function(){return eg},default:function(){return ew}});var e=p(772),t=p(156),n=p.n(t),r=p(645),o=p(721),i=p(482);function a(e,t,n,r,o,i,a){try{var l=e[i](a),u=l.value}catch(e){n(e);return}l.done?t(u):Promise.resolve(u).then(r,o)}function l(e){return function(){var t=this,n=arguments;return new Promise(function(r,o){var i=e.apply(t,n);function l(e){a(i,r,o,l,u,"next",e)}function u(e){a(i,r,o,l,u,"throw",e)}l(void 0)})}}function u(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:l(0),throw:l(1),return:l(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function l(i){return function(l){var u=[i,l];if(n)throw TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&u[0]?r.return:u[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,u[1])).done)return o;switch(r=0,o&&(u=[2&u[0],o.value]),u[0]){case 0:case 1:o=u;break;case 4:return a.label++,{value:u[1],done:!1};case 5:a.label++,r=u[1],u=[0];continue;case 7:u=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===u[0]||2===u[0])){a=0;continue}if(3===u[0]&&(!o||u[1]>o[0]&&u[1]<o[3])){a.label=u[1];break}if(6===u[0]&&a.label<o[1]){a.label=o[1],o=u;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(u);break}o[2]&&a.ops.pop(),a.trys.pop();continue}u=t.call(e,a)}catch(e){u=[6,e],r=0}finally{n=o=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}var c="blobs";function s(){return new Promise(function(e,t){var n=indexedDB.open("nb-ai-chat-file-preview",1);n.onupgradeneeded=function(){var e=n.result;e.objectStoreNames.contains(c)||e.createObjectStore(c)},n.onsuccess=function(){return e(n.result)},n.onerror=function(){return t(n.error)}})}function f(e,t){return"".concat(e,":").concat(t)}var d={get:function(e,t){return l(function(){var n;return u(this,function(r){switch(r.label){case 0:return[4,s()];case 1:return n=r.sent(),[2,new Promise(function(r,o){var i=n.transaction(c,"readonly").objectStore(c).get(f(e,t));i.onsuccess=function(){return r(i.result||null)},i.onerror=function(){return o(i.error)}})]}})})()},has:function(e,t){return l(function(){var n;return u(this,function(r){switch(r.label){case 0:return[4,s()];case 1:return n=r.sent(),[2,new Promise(function(r,o){var i=n.transaction(c,"readonly").objectStore(c).count(f(e,t));i.onsuccess=function(){return r(i.result>0)},i.onerror=function(){return o(i.error)}})]}})})()},listLocalUploads:function(){return l(function(){var e;return u(this,function(t){switch(t.label){case 0:return[4,s()];case 1:return e=t.sent(),[2,new Promise(function(t,n){var r=e.transaction(c,"readonly").objectStore(c).getAllKeys();r.onsuccess=function(){t(r.result.filter(function(e){return e.startsWith("local_uploads:")}).map(function(e){return e.replace("local_uploads:","")}))},r.onerror=function(){return n(r.error)}})]}})})()},put:function(e,t,n){return l(function(){var r;return u(this,function(o){switch(o.label){case 0:return[4,s()];case 1:return r=o.sent(),[2,new Promise(function(o,i){var a=r.transaction(c,"readwrite");a.objectStore(c).put(n,f(e,t)),a.oncomplete=function(){return o()},a.onerror=function(){return i(a.error)}})]}})})()},delete:function(e,t){return l(function(){var n;return u(this,function(r){switch(r.label){case 0:return[4,s()];case 1:return n=r.sent(),[2,new Promise(function(r,o){var i=n.transaction(c,"readwrite");i.objectStore(c).delete(f(e,t)),i.oncomplete=function(){return r()},i.onerror=function(){return o(i.error)}})]}})})()},clearSession:function(e){return l(function(){var t;return u(this,function(n){switch(n.label){case 0:return[4,s()];case 1:return t=n.sent(),[2,new Promise(function(n,r){var o=t.transaction(c,"readwrite"),i=o.objectStore(c).openCursor();i.onsuccess=function(){var t=i.result;t&&("string"==typeof t.key&&t.key.startsWith("".concat(e,":"))&&t.delete(),t.continue())},o.oncomplete=function(){return n()},o.onerror=function(){return r(o.error)}})]}})})()},clearAll:function(){return l(function(){var e;return u(this,function(t){switch(t.label){case 0:return[4,s()];case 1:return e=t.sent(),[2,new Promise(function(t,n){var r=e.transaction(c,"readwrite");r.objectStore(c).clear(),r.oncomplete=function(){return t()},r.onerror=function(){return n(r.error)}})]}})})()}};function h(){var t=(0,e.useApp)();return{t:function(e){return t.i18n.t(e,{ns:"@nocobase/plugin-ai-chat-file-preview"})}}}var m=p(581);function y(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function b(e,t,n,r,o,i,a){try{var l=e[i](a),u=l.value}catch(e){n(e);return}l.done?t(u):Promise.resolve(u).then(r,o)}function g(e){return function(){var t=this,n=arguments;return new Promise(function(r,o){var i=e.apply(t,n);function a(e){b(i,r,o,a,l,"next",e)}function l(e){b(i,r,o,a,l,"throw",e)}a(void 0)})}}function w(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var i=[],a=!0,l=!1;try{for(o=o.call(e);!(a=(n=o.next()).done)&&(i.push(n.value),!t||i.length!==t);a=!0);}catch(e){l=!0,r=e}finally{try{a||null==o.return||o.return()}finally{if(l)throw r}}return i}}(e,t)||function(e,t){if(e){if("string"==typeof e)return y(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return y(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function x(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:l(0),throw:l(1),return:l(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function l(i){return function(l){var u=[i,l];if(n)throw TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&u[0]?r.return:u[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,u[1])).done)return o;switch(r=0,o&&(u=[2&u[0],o.value]),u[0]){case 0:case 1:o=u;break;case 4:return a.label++,{value:u[1],done:!1};case 5:a.label++,r=u[1],u=[0];continue;case 7:u=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===u[0]||2===u[0])){a=0;continue}if(3===u[0]&&(!o||u[1]>o[0]&&u[1]<o[3])){a.label=u[1];break}if(6===u[0]&&a.label<o[1]){a.label=o[1],o=u;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(u);break}o[2]&&a.ops.pop(),a.trys.pop();continue}u=t.call(e,a)}catch(e){u=[6,e],r=0}finally{n=o=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}var S=["application/pdf"],E=["image/png","image/jpeg","image/gif","image/webp","image/svg+xml","image/bmp"],k=["text/plain","text/csv","text/html","text/css","text/javascript","application/json","application/xml","text/xml","text/yaml","application/x-yaml"],C=["application/vnd.openxmlformats-officedocument.wordprocessingml.document"],j=["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/vnd.ms-excel"],_=["pdf"],O=["png","jpg","jpeg","gif","webp","svg","bmp"],P=["txt","csv","html","css","js","json","xml","log","md","yaml","yml","xaml"],L=["docx"],A=["xlsx","xls"];function I(e){var t="string"==typeof e?e:null==e?void 0:e.url;return t?t.startsWith("http://")||t.startsWith("https://")?t:"".concat(location.origin,"/").concat(t.replace(/^\//,"")):""}function R(e,t,n){if((null==e?void 0:e.mimetype)&&t.includes(e.mimetype))return!0;var r,o,i=-1!==(o=(r=("string"==typeof e?e:(null==e?void 0:e.extname)||(null==e?void 0:e.name)||(null==e?void 0:e.filename)||(null==e?void 0:e.url)||"").split("?")[0].split("#")[0]).lastIndexOf("."))?r.slice(o+1).toLowerCase().replace(/^\./,""):"";return!!i&&n.includes(i)}var F=function(e){return R(e,S,_)},T=function(e){return R(e,E,O)},U=function(e){return R(e,k,P)},q=function(e){return R(e,C,L)},B=function(e){return R(e,j,A)};function M(e,t){return z.apply(this,arguments)}function z(){return(z=g(function(e,t){return x(this,function(n){switch(n.label){case 0:return[4,e.axios.get(t,{responseType:"blob"})];case 1:return[2,n.sent().data]}})})).apply(this,arguments)}function D(){return(D=g(function(e,t,n){var r,o,i,a,l;return x(this,function(u){switch(u.label){case 0:if(r=I(e),o=String((null==e?void 0:e.id)||(null==e?void 0:e.uid)||r),(i=(null==e?void 0:e.filename)||(null==e?void 0:e.name)||(null==e?void 0:e.title))&&ei.has(i))return[2,ei.get(i)];if((null==e?void 0:e.title)&&ei.has(e.title))return[2,ei.get(e.title)];if(!(n&&o))return[3,2];return[4,d.get(n,o).catch(function(){return null})];case 1:if(a=u.sent())return[2,a];u.label=2;case 2:if(!r)throw Error("No valid URL");return[4,M(t,r)];case 3:return l=u.sent(),n&&o&&d.put(n,o,l).catch(function(){}),[2,l]}})})).apply(this,arguments)}function N(){return(N=g(function(e,t){var n,r,o,i;return x(this,function(a){switch(a.label){case 0:return[4,function(e,t,n){return D.apply(this,arguments)}(e,t,"")];case 1:return n=a.sent(),r=(null==e?void 0:e.title)&&(null==e?void 0:e.extname)?"".concat(e.title).concat(e.extname):(null==e?void 0:e.filename)||(null==e?void 0:e.name)||"download",(o=document.createElement("a")).href=i=URL.createObjectURL(n),o.download=r,document.body.appendChild(o),o.click(),document.body.removeChild(o),setTimeout(function(){return URL.revokeObjectURL(i)},1e3),[2]}})})).apply(this,arguments)}function W(e){var t=e.msg;return n().createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100%",width:"100%"}},n().createElement(o.Spin,{tip:t}))}function H(e){var t=e.msg;return n().createElement("div",{style:{padding:20,textAlign:"center",color:"#ff4d4f"}},t)}function X(e,n,r){var o=w((0,t.useState)(null),2),i=o[0],a=o[1],l=w((0,t.useState)(!0),2),u=l[0],c=l[1],s=w((0,t.useState)(null),2),f=s[0],p=s[1],v=(0,t.useRef)(null),h=(null==e?void 0:e.id)||(null==e?void 0:e.uid)||"",m=I(e);return(0,t.useEffect)(function(){var e=!1;if(!m){c(!1),p("No file URL");return}return c(!0),p(null),g(function(){var t,o,i,l,u;return x(this,function(s){switch(s.label){case 0:if(s.trys.push([0,4,,5]),!(r&&h))return[3,2];return[4,d.get(r,String(h))];case 1:if((t=s.sent())&&!e)return v.current=o=URL.createObjectURL(t),a(o),c(!1),[2];s.label=2;case 2:return[4,M(n,m)];case 3:if(i=s.sent(),e)return[2];return r&&h&&d.put(r,String(h),i).catch(function(){}),v.current=l=URL.createObjectURL(i),a(l),c(!1),[3,5];case 4:if(u=s.sent(),e)return[2];return p(u.message||"Failed to load"),c(!1),[3,5];case 5:return[2]}})})(),function(){e=!0,v.current&&(URL.revokeObjectURL(v.current),v.current=null)}},[m,n,r,h]),{blobUrl:i,loading:u,error:f}}function G(t){var r=t.file,o=t.sessionId,i=(0,e.useAPIClient)(),a=h().t,l=X(r,i,o),u=l.blobUrl,c=l.loading,s=l.error;return c?n().createElement(W,{msg:a("Loading preview...")}):s||!u?n().createElement(H,{msg:a("Failed to load file preview")}):n().createElement("iframe",{src:u,width:"100%",height:"100%",style:{border:"none"}})}function V(t){var r=t.file,o=t.sessionId,i=(0,e.useAPIClient)(),a=h().t,l=X(r,i,o),u=l.blobUrl,c=l.loading,s=l.error;return c?n().createElement(W,{msg:a("Loading preview...")}):s||!u?n().createElement(H,{msg:a("Failed to load file preview")}):n().createElement("img",{src:u,style:{maxWidth:"100%",maxHeight:"100%",objectFit:"contain"},alt:(null==r?void 0:r.filename)||""})}function $(r){var o,i,a,l,u,c,s,f,p,v,m,y=r.file,b=r.sessionId,S=(0,e.useAPIClient)(),E=h().t,k=(i=(o=w((0,t.useState)(null),2))[0],a=o[1],u=(l=w((0,t.useState)(!0),2))[0],c=l[1],f=(s=w((0,t.useState)(null),2))[0],p=s[1],v=(null==y?void 0:y.id)||(null==y?void 0:y.uid)||"",m=I(y),(0,t.useEffect)(function(){var e=!1;if(!m){c(!1),p("No file URL");return}return c(!0),p(null),g(function(){var t,n,r,o;return x(this,function(i){switch(i.label){case 0:if(i.trys.push([0,5,,6]),!(b&&v))return[3,3];return[4,d.get(b,String(v))];case 1:if(!((t=i.sent())&&!e))return[3,3];return[4,t.text()];case 2:return a(i.sent()),c(!1),[2];case 3:return[4,fetchFileAsText(S,m)];case 4:if(n=i.sent(),e)return[2];return b&&v&&(r=new Blob([n],{type:"text/plain"}),d.put(b,String(v),r).catch(function(){})),a(n),c(!1),[3,6];case 5:if(o=i.sent(),e)return[2];return p(o.message||"Failed to load"),c(!1),[3,6];case 6:return[2]}})})(),function(){e=!0}},[m,S,b,v]),{text:i,loading:u,error:f}),C=k.text,j=k.loading,_=k.error;return j?n().createElement(W,{msg:E("Loading preview...")}):_||null===C?n().createElement(H,{msg:E("Failed to load file preview")}):n().createElement("pre",{style:{width:"100%",height:"100%",overflow:"auto",padding:16,margin:0,fontSize:13,lineHeight:1.6,whiteSpace:"pre-wrap",wordWrap:"break-word",background:"#f5f5f5",border:"none"}},C)}function J(r){var o=r.file,i=r.sessionId,a=(0,e.useAPIClient)(),l=h().t,u=(0,t.useRef)(null),c=w((0,t.useState)(!0),2),s=c[0],f=c[1],v=w((0,t.useState)(null),2),y=v[0],b=v[1],S=I(o),E=(null==o?void 0:o.id)||(null==o?void 0:o.uid)||"";return(0,t.useEffect)(function(){var e=!1;if(!S||!u.current){f(!1),b("No file URL");return}return f(!0),b(null),g(function(){var t,n,r,o;return x(this,function(l){switch(l.label){case 0:if(l.trys.push([0,10,,11]),!(i&&E))return[3,5];return[4,d.get(i,String(E))];case 1:if(!((n=l.sent())&&!e))return[3,2];return t=n,[3,4];case 2:return[4,M(a,S)];case 3:if(t=l.sent(),e)return[2];d.put(i,String(E),t).catch(function(){}),l.label=4;case 4:return[3,7];case 5:return[4,M(a,S)];case 6:t=l.sent(),l.label=7;case 7:if(e||!u.current)return[2];return[4,m("imported_-1dm6lbf_component",p.e("395").then(p.bind(p,835)))];case 8:if(r=l.sent(),e||!u.current)return[2];return u.current.innerHTML="",[4,r.renderAsync(t,u.current,void 0,{className:"docx-preview-wrapper",inWrapper:!0,ignoreWidth:!1,ignoreHeight:!1,ignoreFonts:!1,breakPages:!0,ignoreLastRenderedPageBreak:!0,experimental:!1,trimXmlDeclaration:!0,useBase64URL:!0,renderHeaders:!0,renderFooters:!0,renderFootnotes:!0,renderEndnotes:!0})];case 9:return l.sent(),f(!1),[3,11];case 10:if(o=l.sent(),e)return[2];return b(o.message||"Failed to render DOCX"),f(!1),[3,11];case 11:return[2]}})})(),function(){e=!0}},[S,a,i,E]),n().createElement("div",{style:{width:"100%",height:"100%",position:"relative"}},s&&n().createElement(W,{msg:l("Loading preview...")}),y&&n().createElement(H,{msg:l("Failed to load file preview")}),n().createElement("div",{ref:u,style:{width:"100%",height:"100%",overflow:"auto",display:s||y?"none":"block"}}))}function K(r){var o=r.file,i=r.sessionId,a=(0,e.useAPIClient)(),l=h().t,u=w((0,t.useState)(!0),2),c=u[0],s=u[1],f=w((0,t.useState)(null),2),v=f[0],y=f[1],b=w((0,t.useState)([]),2),S=b[0],E=b[1],k=w((0,t.useState)(""),2),C=k[0],j=k[1],_=w((0,t.useState)({}),2),O=_[0],P=_[1],L=I(o),A=(null==o?void 0:o.id)||(null==o?void 0:o.uid)||"";return(0,t.useEffect)(function(){var e=!1;if(!L){s(!1),y("No file URL");return}return s(!0),y(null),g(function(){var t,n,r,o,l,u,c,f,v,h,b,g,w,S;return x(this,function(x){switch(x.label){case 0:if(x.trys.push([0,10,,11]),!(i&&A))return[3,5];return[4,d.get(i,String(A))];case 1:if(!((n=x.sent())&&!e))return[3,2];return t=n,[3,4];case 2:return[4,M(a,L)];case 3:if(t=x.sent(),e)return[2];d.put(i,String(A),t).catch(function(){}),x.label=4;case 4:return[3,7];case 5:return[4,M(a,L)];case 6:t=x.sent(),x.label=7;case 7:if(e)return[2];return[4,m("imported_-1lj2ifg_component",p.e("463").then(p.bind(p,312)))];case 8:if(r=x.sent(),e)return[2];return[4,t.arrayBuffer()];case 9:if(o=x.sent(),e)return[2];u=(l=r.read(o,{type:"array"})).SheetNames,c={},f=!0,v=!1,h=void 0;try{for(b=u[Symbol.iterator]();!(f=(g=b.next()).done);f=!0)c[w=g.value]=r.utils.sheet_to_html(l.Sheets[w],{id:"xlsx-preview-table"})}catch(e){v=!0,h=e}finally{try{f||null==b.return||b.return()}finally{if(v)throw h}}if(e)return[2];return E(u),j(u[0]||""),P(c),s(!1),[3,11];case 10:if(S=x.sent(),e)return[2];return y(S.message||"Failed to render XLSX"),s(!1),[3,11];case 11:return[2]}})})(),function(){e=!0}},[L,a,i,A]),n().createElement("div",{style:{width:"100%",height:"100%",display:"flex",flexDirection:"column"}},c&&n().createElement(W,{msg:l("Loading preview...")}),v&&n().createElement(H,{msg:l("Failed to load file preview")}),!c&&!v&&n().createElement(n().Fragment,null,S.length>1&&n().createElement("div",{style:{display:"flex",gap:0,borderBottom:"1px solid #e8e8e8",background:"#fafafa",padding:"0 8px",flexShrink:0,overflowX:"auto"}},S.map(function(e){return n().createElement("button",{key:e,onClick:function(){return j(e)},style:{padding:"8px 16px",border:"none",borderBottom:C===e?"2px solid #1890ff":"2px solid transparent",background:C===e?"#fff":"transparent",color:C===e?"#1890ff":"#666",fontWeight:C===e?600:400,cursor:"pointer",fontSize:13,whiteSpace:"nowrap",transition:"all 0.2s"}},e)})),n().createElement("div",{style:{flex:1,overflow:"auto",padding:0},dangerouslySetInnerHTML:{__html:O[C]||""}}),n().createElement("style",null,"\n #xlsx-preview-table { border-collapse: collapse; width: 100%; font-size: 13px; }\n #xlsx-preview-table td, #xlsx-preview-table th {\n border: 1px solid #e8e8e8; padding: 6px 10px; text-align: left;\n max-width: 33vw; white-space: normal; word-break: break-word;\n }\n #xlsx-preview-table tr:first-child td, #xlsx-preview-table tr:first-child th {\n background: #fafafa; font-weight: 600; position: sticky; top: 0; z-index: 1;\n }\n #xlsx-preview-table tr:nth-child(even) { background: #fafafa; }\n #xlsx-preview-table tr:hover { background: #f0f7ff; }\n ")))}var Y=function(r){var a=r.open,l=r.file,u=r.sessionId,c=r.onClose,s=(0,e.useAPIClient)(),f=h().t,p=w((0,t.useState)(!1),2),v=p[0],m=p[1],y=(null==l?void 0:l.id)||(null==l?void 0:l.uid)||"",b=(0,t.useCallback)(g(function(){return x(this,function(e){switch(e.label){case 0:if(!l)return[2];m(!0),e.label=1;case 1:return e.trys.push([1,3,4,5]),[4,function(e,t){return N.apply(this,arguments)}(l,s)];case 2:return e.sent(),[3,5];case 3:return e.sent(),o.message.error(f("Failed to download file")),[3,5];case 4:return m(!1),[7];case 5:return[2]}})}),[l,s,f]),S=(0,t.useCallback)(g(function(){return x(this,function(e){switch(e.label){case 0:if(!u||!y)return[2];return[4,d.delete(u,String(y))];case 1:return e.sent(),o.message.success(f("Cache cleared")),[2]}})}),[u,y,f]),E=(0,t.useMemo)(function(){return l?F(l)?G:T(l)?V:U(l)?$:q(l)?J:B(l)?K:null:null},[l]),k=null!=E,C=(null==l?void 0:l.title)&&(null==l?void 0:l.extname)?"".concat(l.title).concat(l.extname):(null==l?void 0:l.filename)||(null==l?void 0:l.name)||"File";return n().createElement(o.Modal,{open:a,title:C,onCancel:c,destroyOnClose:!0,footer:[u&&y?n().createElement(o.Button,{key:"clear-cache",icon:n().createElement(i.DeleteOutlined,null),onClick:S},f("Clear cache")):null,n().createElement(o.Button,{key:"download",icon:n().createElement(i.DownloadOutlined,null),onClick:b,loading:v},f("Download")),n().createElement(o.Button,{key:"close",onClick:c},f("Close"))].filter(Boolean),width:k?"60vw":520,centered:!0},n().createElement("div",{style:{maxWidth:"100%",maxHeight:k?"calc(100vh - 256px)":"auto",height:k?"70vh":"auto",width:"100%",background:"white",display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",overflowY:"auto"}},k&&l?n().createElement(E,{file:l,sessionId:u}):n().createElement(o.Alert,{type:"info",style:{width:"100%"},description:f("This file type cannot be previewed. Click Download to save the file."),showIcon:!0})))};function Q(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function Z(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function ee(e){return(ee=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function et(e,t){return null!=t&&"undefined"!=typeof Symbol&&t[Symbol.hasInstance]?!!t[Symbol.hasInstance](e):e instanceof t}function en(e,t){return(en=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function er(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var i=[],a=!0,l=!1;try{for(o=o.call(e);!(a=(n=o.next()).done)&&(i.push(n.value),!t||i.length!==t);a=!0);}catch(e){l=!0,r=e}finally{try{a||null==o.return||o.return()}finally{if(l)throw r}}return i}}(e,t)||function(e,t){if(e){if("string"==typeof e)return Q(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Q(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function eo(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(eo=function(){return!!e})()}var ei=new Map;function ea(e){var t=e.querySelector('[class*="-name"]');if(null==t?void 0:t.textContent)return t.textContent.trim();for(var n=e.querySelectorAll("a"),r=0;r<n.length;r++){var o,i,a=null==(i=n[r].textContent)?void 0:i.trim();if(a)return a}var l=e.querySelector('[class*="ellipsis-prefix"]'),u=e.querySelector('[class*="ellipsis-suffix"]');return l&&u?(l.textContent||"")+(u.textContent||""):(null==(o=e.textContent)?void 0:o.trim())||""}function el(e){return{id:e.id,uid:e.uid,url:e.url,filename:e.filename||e.name,name:e.name||e.filename,title:e.title,extname:e.extname,mimetype:e.mimetype,size:e.size}}function eu(e,t,n){if(!e)return null;var r=!0,o=!1,i=void 0;try{for(var a,l=t[Symbol.iterator]();!(r=(a=l.next()).done);r=!0){var u=a.value,c=u.content||u,s=null==c?void 0:c.attachments;if(null==s?void 0:s.length){var f=!0,d=!1,p=void 0;try{for(var v,h=s[Symbol.iterator]();!(f=(v=h.next()).done);f=!0){var m=v.value;if((m.filename||m.name||"")===e||"".concat(m.title||"").concat(m.extname||"")===e)return el(m)}}catch(e){d=!0,p=e}finally{try{f||null==h.return||h.return()}finally{if(d)throw p}}}}}catch(e){o=!0,i=e}finally{try{r||null==l.return||l.return()}finally{if(o)throw i}}var y=!0,b=!1,g=void 0;try{for(var w,x=(n||[])[Symbol.iterator]();!(y=(w=x.next()).done);y=!0){var S=w.value;if((S.filename||S.name||"")===e||"".concat(S.title||"").concat(S.extname||"")===e)return el(S)}}catch(e){b=!0,g=e}finally{try{y||null==x.return||x.return()}finally{if(b)throw g}}return null}function ec(e,t,n){if(!e)return null;var r=function(e,t){return!!e&&!!t&&e.split("?")[0].replace(location.origin,"").replace(/^\//,"")===t.split("?")[0].replace(location.origin,"").replace(/^\//,"")},o=!0,i=!1,a=void 0;try{for(var l,u=t[Symbol.iterator]();!(o=(l=u.next()).done);o=!0){var c=l.value,s=c.content||c,f=null==s?void 0:s.attachments;if(null==f?void 0:f.length){var d=!0,p=!1,v=void 0;try{for(var h,m=f[Symbol.iterator]();!(d=(h=m.next()).done);d=!0){var y=h.value;if(r(y.url,e)||r(y.preview,e))return el(y)}}catch(e){p=!0,v=e}finally{try{d||null==m.return||m.return()}finally{if(p)throw v}}}}}catch(e){i=!0,a=e}finally{try{o||null==u.return||u.return()}finally{if(i)throw a}}var b=!0,g=!1,w=void 0;try{for(var x,S=(n||[])[Symbol.iterator]();!(b=(x=S.next()).done);b=!0){var E=x.value;if(r(E.url,e)||r(E.preview,e))return el(E)}}catch(e){g=!0,w=e}finally{try{b||null==S.return||S.return()}finally{if(g)throw w}}return null}var es=function(o){var i=o.children,a=er((0,t.useState)(!1),2),l=a[0],u=a[1],c=er((0,t.useState)(null),2),s=c[0],f=c[1],p=er((0,t.useState)(""),2),v=p[0],h=p[1],m=(0,e.useAPIClient)(),y=r.useChatMessagesStore.use.messages(),b=r.useChatMessagesStore.use.attachments(),g=(0,t.useRef)(y),w=(0,t.useRef)(b);g.current=y,w.current=b;var x=(0,t.useRef)("");(0,t.useEffect)(function(){var e=m.axios.interceptors.request.use(function(e){var t=e.url||"";if(t.includes("aiConversations:getMessages")){var n=t.match(/sessionId=([^&]+)/);n&&(x.current=decodeURIComponent(n[1]))}if(t.includes("aiConversations:sendMessages")&&e.data)try{var r="string"==typeof e.data?JSON.parse(e.data):e.data;(null==r?void 0:r.sessionId)&&(x.current=r.sessionId)}catch(e){}return e});return function(){m.axios.interceptors.request.eject(e)}},[m]),(0,t.useEffect)(function(){var e=function(e){var t;(null==(t=e.dataTransfer)?void 0:t.files)&&Array.from(e.dataTransfer.files).forEach(function(e){e.name&&ei.set(e.name,e)})},t=function(e){var t=e.target;(null==t?void 0:t.type)==="file"&&t.files&&Array.from(t.files).forEach(function(e){e.name&&ei.set(e.name,e)})};return window.addEventListener("drop",e,!0),document.addEventListener("change",t,!0),function(){window.removeEventListener("drop",e,!0),document.removeEventListener("change",t,!0)}},[]),(0,t.useEffect)(function(){var e=FormData.prototype.append;return FormData.prototype.append=function(t,n,r){if(et(n,File)||et(n,Blob)){var o=r||n.name;o&&ei.set(o,n)}return e.call(this,t,n,r)},function(){FormData.prototype.append=e}},[]),(0,t.useEffect)(function(){var e;(null==(e=w.current)?void 0:e.length)&&w.current.forEach(function(e){var t=e.originFileObj||e;if(t&&(et(t,Blob)||et(t,File)||"size"in t)){var n=e.name||e.filename||t.name;n&&ei.set(n,t)}})},[b]),(0,t.useEffect)(function(){var e=setInterval(function(){document.querySelectorAll('div[class*="attachment-list-card"]:not([class*="attachment-list-card-"])').forEach(function(e){var t=ea(e),n=e.querySelectorAll("a"),r="";n.forEach(function(e){e.href&&(r=e.href)});var o=eu(t,g.current,w.current)||ec(r,g.current,w.current),i=(null==o?void 0:o.filename)||(null==o?void 0:o.name)||(null==o?void 0:o.title);(i&&ei.has(i)?i:t&&ei.has(t)?t:null)?e.classList.add("is-cached-previewable"):e.classList.remove("is-cached-previewable")})},1e3);return function(){return clearInterval(e)}},[]),(0,t.useEffect)(function(){var e=document.createElement("style");return e.innerHTML='\n div[class*="attachment-list-card"]:not([class*="attachment-list-card-"]) {\n position: relative !important;\n cursor: pointer !important;\n }\n /* Prevent pointer events on inner text and icons so the outer div receives the absolute click */\n div[class*="attachment-list-card"]:not([class*="attachment-list-card-"]) a,\n div[class*="attachment-list-card"]:not([class*="attachment-list-card-"]) [class*="-icon"],\n div[class*="attachment-list-card"]:not([class*="attachment-list-card-"]) span {\n pointer-events: none !important;\n }\n /* Re-enable pointer events for the delete button specifically */\n div[class*="attachment-list-card"]:not([class*="attachment-list-card-"]) [class*="-remove"],\n div[class*="attachment-list-card"]:not([class*="attachment-list-card-"]) button,\n div[class*="attachment-list-card"]:not([class*="attachment-list-card-"]) .ant-btn {\n pointer-events: auto !important;\n }\n /* Visual "Preview" badge at the top-left corner using proper SVG */\n div[class*="attachment-list-card"]:not([class*="attachment-list-card-"]).is-cached-previewable::after {\n content: \'\';\n background-image: url("data:image/svg+xml,%3Csvg viewBox=\'64 64 896 896\' xmlns=\'http://www.w3.org/2000/svg\' fill=\'rgba(0,0,0,0.65)\'%3E%3Cpath d=\'M942.2 486.2C847.4 286.5 704.1 186 512 186c-192.2 0-335.4 100.5-430.2 300.3a60.3 60.3 0 000 51.5C176.6 737.5 319.9 838 512 838c192.2 0 335.4-100.5 430.2-300.3 7.7-16.2 7.7-35 0-51.5zM512 766c-161.3 0-279.4-81.8-362.7-254C232.6 339.8 350.7 258 512 258c161.3 0 279.4 81.8 362.7 254C791.5 684.2 673.4 766 512 766zm-4-430c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm0 288c-61.9 0-112-50.1-112-112s50.1-112 112-112 112 50.1 112 112-50.1 112-112 112z\'/%3E%3C/svg%3E");\n background-size: contain;\n background-repeat: no-repeat;\n position: absolute;\n top: 6px;\n left: 6px;\n width: 14px;\n height: 14px;\n z-index: 10;\n pointer-events: none;\n }\n /* Hide native antd thumbnail icon if we placed an eye so it doesnt look messy */\n div[class*="attachment-list-card"]:not([class*="attachment-list-card-"]).is-cached-previewable .ant-upload-list-item-thumbnail {\n opacity: 0.2;\n }\n ',document.head.appendChild(e),function(){e.remove()}},[]),(0,t.useEffect)(function(){var e=function(e){var t=e.target;if(!t||"function"!=typeof t.closest)return;var n=t.closest('[class*="attachment-list-card"]:not([class*="attachment-list-card-"])');if(!(!n||t.closest('[class*="-remove"]')||t.closest(".ant-btn"))&&n.classList.contains("is-cached-previewable")){var r=ea(n),o=n.querySelectorAll("a"),i="";o.forEach(function(e){e.href&&(i=e.href)});var a=eu(r,g.current,w.current)||ec(i,g.current,w.current);a&&(F(a)||T(a)||U(a)||q(a)||B(a))&&(e.preventDefault(),e.stopPropagation(),h(x.current||""),f(a),u(!0))}};return document.addEventListener("click",e,{capture:!0}),function(){return document.removeEventListener("click",e,{capture:!0})}},[]),(0,t.useEffect)(function(){var e=m.axios.interceptors.response.use(function(e){try{var t,n=(null==(t=e.config)?void 0:t.url)||"";if(n.includes("aiConversations:destroy")){var r=n.match(/filterByTk=([^&]+)/);r&&d.clearSession(decodeURIComponent(r[1])).catch(function(){})}}catch(e){}return e});return function(){m.axios.interceptors.response.eject(e)}},[m]);var S=(0,t.useCallback)(function(){u(!1),f(null)},[]);return n().createElement(n().Fragment,null,i,n().createElement(Y,{open:l,file:s,sessionId:v,onClose:S}))},ef=function(e){var t,n;if("function"!=typeof e&&null!==e)throw TypeError("Super expression must either be null or a function");function r(e){var t,n,o;if(!(this instanceof r))throw TypeError("Cannot call a class as a function");return n=r,o=[e],n=ee(n),(t=function(e,t){var n;if(t&&("object"==((n=t)&&"undefined"!=typeof Symbol&&n.constructor===Symbol?"symbol":typeof n)||"function"==typeof t))return t;if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this,eo()?Reflect.construct(n,o||[],ee(this).constructor):n.apply(this,o))).state={hasError:!1},t}return r.prototype=Object.create(e&&e.prototype,{constructor:{value:r,writable:!0,configurable:!0}}),e&&en(r,e),n=[{key:"getDerivedStateFromError",value:function(){return{hasError:!0}}}],t=[{key:"render",value:function(){return this.state.hasError,this.props.children}}],Z(r.prototype,t),n&&Z(r,n),r}(n().Component),ed=function(e){var t=e.children;return n().createElement(ef,null,n().createElement(es,null,t))};function ep(e,t,n,r,o,i,a){try{var l=e[i](a),u=l.value}catch(e){n(e);return}l.done?t(u):Promise.resolve(u).then(r,o)}function ev(e,t,n){return(ev=eb()?Reflect.construct:function(e,t,n){var r=[null];r.push.apply(r,t);var o=new(Function.bind.apply(e,r));return n&&em(o,n.prototype),o}).apply(null,arguments)}function eh(e){return(eh=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function em(e,t){return(em=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function ey(e){var t="function"==typeof Map?new Map:void 0;return(ey=function(e){if(null===e||-1===Function.toString.call(e).indexOf("[native code]"))return e;if("function"!=typeof e)throw TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return ev(e,arguments,eh(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),em(n,e)})(e)}function eb(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(eb=function(){return!!e})()}var eg=function(e){var t;if("function"!=typeof e&&null!==e)throw TypeError("Super expression must either be null or a function");function n(){var e,t;if(!(this instanceof n))throw TypeError("Cannot call a class as a function");return e=n,t=arguments,e=eh(e),function(e,t){var n;if(t&&("object"==((n=t)&&"undefined"!=typeof Symbol&&n.constructor===Symbol?"symbol":typeof n)||"function"==typeof t))return t;if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this,eb()?Reflect.construct(e,t||[],eh(this).constructor):e.apply(this,t))}return n.prototype=Object.create(e&&e.prototype,{constructor:{value:n,writable:!0,configurable:!0}}),e&&em(n,e),t=[{key:"load",value:function(){var e,t=this;return(e=function(){return function(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:l(0),throw:l(1),return:l(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function l(i){return function(l){var u=[i,l];if(n)throw TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&u[0]?r.return:u[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,u[1])).done)return o;switch(r=0,o&&(u=[2&u[0],o.value]),u[0]){case 0:case 1:o=u;break;case 4:return a.label++,{value:u[1],done:!1};case 5:a.label++,r=u[1],u=[0];continue;case 7:u=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===u[0]||2===u[0])){a=0;continue}if(3===u[0]&&(!o||u[1]>o[0]&&u[1]<o[3])){a.label=u[1];break}if(6===u[0]&&a.label<o[1]){a.label=o[1],o=u;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(u);break}o[2]&&a.ops.pop(),a.trys.pop();continue}u=t.call(e,a)}catch(e){u=[6,e],r=0}finally{n=o=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}(this,function(e){return t.app.use(ed),[2]})},function(){var t=this,n=arguments;return new Promise(function(r,o){var i=e.apply(t,n);function a(e){ep(i,r,o,a,l,"next",e)}function l(e){ep(i,r,o,a,l,"throw",e)}a(void 0)})})()}}],function(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(n.prototype,t),n}(ey(e.Plugin)),ew=eg}(),v}()});
|
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"description": "Preview uploaded file attachments directly in AI Employee chat with in-browser caching.",
|
|
7
7
|
"description.vi-VN": "Xem trước file đính kèm đã tải lên trực tiếp trong chat AI Employee với bộ nhớ đệm trình duyệt.",
|
|
8
8
|
"description.zh-CN": "在AI员工聊天中直接预览上传的文件附件,支持浏览器缓存。",
|
|
9
|
-
"version": "1.0.
|
|
9
|
+
"version": "1.0.10",
|
|
10
10
|
"main": "dist/server/index.js",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"xlsx": "^0.18.5",
|
|
@@ -13,17 +13,32 @@ import { useChatMessagesStore } from '@nocobase/plugin-ai/client';
|
|
|
13
13
|
import { PreviewModal, PreviewFile, isPreviewableFile } from './PreviewModal';
|
|
14
14
|
import { SessionBlobCache } from './SessionBlobCache';
|
|
15
15
|
|
|
16
|
+
// Define a reliable, context-isolated module-level RAM cache independent of the window object
|
|
17
|
+
export const AppRamCache = new Map<string, File | Blob>();
|
|
18
|
+
|
|
16
19
|
/**
|
|
17
20
|
* Extract displayed filename from a FileListCard DOM element.
|
|
18
|
-
* FileListCard renders: ellipsis-prefix (name without ext) + ellipsis-suffix (.ext)
|
|
19
21
|
*/
|
|
20
22
|
function getDisplayNameFromCard(cardEl: HTMLElement): string {
|
|
23
|
+
// 1. Try antd generic filename classes
|
|
24
|
+
const nameEl = cardEl.querySelector('[class*="-name"]') as HTMLElement;
|
|
25
|
+
if (nameEl?.textContent) return nameEl.textContent.trim();
|
|
26
|
+
|
|
27
|
+
// 2. Try link elements
|
|
28
|
+
const aNodes = cardEl.querySelectorAll('a');
|
|
29
|
+
for (let i = 0; i < aNodes.length; i++) {
|
|
30
|
+
const text = aNodes[i].textContent?.trim();
|
|
31
|
+
if (text) return text;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// 3. Try ellipsis splits
|
|
21
35
|
const prefixEl = cardEl.querySelector('[class*="ellipsis-prefix"]');
|
|
22
36
|
const suffixEl = cardEl.querySelector('[class*="ellipsis-suffix"]');
|
|
23
|
-
|
|
24
37
|
if (prefixEl && suffixEl) {
|
|
25
38
|
return (prefixEl.textContent || '') + (suffixEl.textContent || '');
|
|
26
39
|
}
|
|
40
|
+
|
|
41
|
+
// 4. Last resort (will likely contain file size text like 100KB)
|
|
27
42
|
return cardEl.textContent?.trim() || '';
|
|
28
43
|
}
|
|
29
44
|
|
|
@@ -158,7 +173,7 @@ const ChatFilePreviewInner: React.FC<{ children: React.ReactNode }> = ({ childre
|
|
|
158
173
|
if (e.dataTransfer?.files) {
|
|
159
174
|
Array.from(e.dataTransfer.files).forEach((f) => {
|
|
160
175
|
if (f.name) {
|
|
161
|
-
|
|
176
|
+
AppRamCache.set(f.name, f);
|
|
162
177
|
}
|
|
163
178
|
});
|
|
164
179
|
}
|
|
@@ -169,7 +184,7 @@ const ChatFilePreviewInner: React.FC<{ children: React.ReactNode }> = ({ childre
|
|
|
169
184
|
if (target?.type === 'file' && target.files) {
|
|
170
185
|
Array.from(target.files).forEach((f) => {
|
|
171
186
|
if (f.name) {
|
|
172
|
-
|
|
187
|
+
AppRamCache.set(f.name, f);
|
|
173
188
|
}
|
|
174
189
|
});
|
|
175
190
|
}
|
|
@@ -183,58 +198,107 @@ const ChatFilePreviewInner: React.FC<{ children: React.ReactNode }> = ({ childre
|
|
|
183
198
|
};
|
|
184
199
|
}, []);
|
|
185
200
|
|
|
186
|
-
// Intercept
|
|
201
|
+
// Intercept all file uploads globally purely in RAM memory.
|
|
202
|
+
// This physically catches the true File object the microsecond before hitting the API!
|
|
187
203
|
useEffect(() => {
|
|
188
|
-
|
|
189
|
-
|
|
204
|
+
const originalAppend = FormData.prototype.append;
|
|
205
|
+
FormData.prototype.append = function (name, value: any, filename?: string) {
|
|
206
|
+
if (value instanceof File || value instanceof Blob) {
|
|
207
|
+
const fName = filename || value.name;
|
|
208
|
+
if (fName) {
|
|
209
|
+
AppRamCache.set(fName, value);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return originalAppend.call(this, name, value, filename);
|
|
213
|
+
};
|
|
214
|
+
return () => {
|
|
215
|
+
FormData.prototype.append = originalAppend;
|
|
216
|
+
};
|
|
217
|
+
}, []);
|
|
218
|
+
|
|
219
|
+
// Intercept antd upload origin files via Zustand state store as duplicate safety net
|
|
220
|
+
useEffect(() => {
|
|
221
|
+
if (!pendingAttachmentsRef.current?.length) return;
|
|
222
|
+
pendingAttachmentsRef.current.forEach((att: any) => {
|
|
190
223
|
const fileObj = att.originFileObj || att;
|
|
191
|
-
if (fileObj instanceof Blob || fileObj instanceof File) {
|
|
224
|
+
if (fileObj && (fileObj instanceof Blob || fileObj instanceof File || 'size' in fileObj)) {
|
|
192
225
|
const name = att.name || att.filename || fileObj.name;
|
|
193
226
|
if (name) {
|
|
194
|
-
|
|
227
|
+
AppRamCache.set(name, fileObj);
|
|
195
228
|
}
|
|
196
229
|
}
|
|
197
230
|
});
|
|
198
231
|
}, [pendingAttachments]);
|
|
199
232
|
|
|
233
|
+
// Periodically check pure RAM cache and ONLY mark DOM cards that physically exist in local JS memory.
|
|
234
|
+
// This automatically rules out external database checks and prevents 403s on old un-cached files.
|
|
235
|
+
useEffect(() => {
|
|
236
|
+
const checkInterval = setInterval(() => {
|
|
237
|
+
const cards = document.querySelectorAll('div[class*="attachment-list-card"]:not([class*="attachment-list-card-"])');
|
|
238
|
+
cards.forEach(card => {
|
|
239
|
+
const el = card as HTMLElement;
|
|
240
|
+
const displayName = getDisplayNameFromCard(el);
|
|
241
|
+
const urlNodes = el.querySelectorAll('a');
|
|
242
|
+
let fallbackUrl = '';
|
|
243
|
+
urlNodes.forEach((node) => {
|
|
244
|
+
if (node.href) fallbackUrl = node.href;
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
// Resolve real file name from data store
|
|
248
|
+
const file = findFileByDisplayName(displayName, messagesRef.current, pendingAttachmentsRef.current) ||
|
|
249
|
+
findFileByUrl(fallbackUrl, messagesRef.current, pendingAttachmentsRef.current);
|
|
250
|
+
const realName = file?.filename || file?.name || file?.title;
|
|
251
|
+
|
|
252
|
+
// Strict RAM cache check
|
|
253
|
+
const cacheHitName = realName && AppRamCache.has(realName) ? realName
|
|
254
|
+
: (displayName && AppRamCache.has(displayName) ? displayName : null);
|
|
255
|
+
|
|
256
|
+
if (cacheHitName) {
|
|
257
|
+
el.classList.add('is-cached-previewable');
|
|
258
|
+
} else {
|
|
259
|
+
el.classList.remove('is-cached-previewable');
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
}, 1000);
|
|
263
|
+
return () => clearInterval(checkInterval);
|
|
264
|
+
}, []);
|
|
265
|
+
|
|
200
266
|
// Inject global CSS for explicit UI and native z-index click interception for child texts/tags
|
|
201
267
|
useEffect(() => {
|
|
202
268
|
const style = document.createElement('style');
|
|
203
269
|
style.innerHTML = `
|
|
204
|
-
div[class*="attachment-list-card"] {
|
|
270
|
+
div[class*="attachment-list-card"]:not([class*="attachment-list-card-"]) {
|
|
205
271
|
position: relative !important;
|
|
206
272
|
cursor: pointer !important;
|
|
207
273
|
}
|
|
208
274
|
/* Prevent pointer events on inner text and icons so the outer div receives the absolute click */
|
|
209
|
-
div[class*="attachment-list-card"] a,
|
|
210
|
-
div[class*="attachment-list-card"] [class*="-icon"],
|
|
211
|
-
div[class*="attachment-list-card"] span {
|
|
275
|
+
div[class*="attachment-list-card"]:not([class*="attachment-list-card-"]) a,
|
|
276
|
+
div[class*="attachment-list-card"]:not([class*="attachment-list-card-"]) [class*="-icon"],
|
|
277
|
+
div[class*="attachment-list-card"]:not([class*="attachment-list-card-"]) span {
|
|
212
278
|
pointer-events: none !important;
|
|
213
279
|
}
|
|
214
280
|
/* Re-enable pointer events for the delete button specifically */
|
|
215
|
-
div[class*="attachment-list-card"] [class*="-remove"],
|
|
216
|
-
div[class*="attachment-list-card"] button,
|
|
217
|
-
div[class*="attachment-list-card"] .ant-btn {
|
|
281
|
+
div[class*="attachment-list-card"]:not([class*="attachment-list-card-"]) [class*="-remove"],
|
|
282
|
+
div[class*="attachment-list-card"]:not([class*="attachment-list-card-"]) button,
|
|
283
|
+
div[class*="attachment-list-card"]:not([class*="attachment-list-card-"]) .ant-btn {
|
|
218
284
|
pointer-events: auto !important;
|
|
219
285
|
}
|
|
220
|
-
/* Visual "Preview" badge at the top-left corner */
|
|
221
|
-
div[class*="attachment-list-card"]::after {
|
|
222
|
-
content: '
|
|
286
|
+
/* Visual "Preview" badge at the top-left corner using proper SVG */
|
|
287
|
+
div[class*="attachment-list-card"]:not([class*="attachment-list-card-"]).is-cached-previewable::after {
|
|
288
|
+
content: '';
|
|
289
|
+
background-image: url("data:image/svg+xml,%3Csvg viewBox='64 64 896 896' xmlns='http://www.w3.org/2000/svg' fill='rgba(0,0,0,0.65)'%3E%3Cpath d='M942.2 486.2C847.4 286.5 704.1 186 512 186c-192.2 0-335.4 100.5-430.2 300.3a60.3 60.3 0 000 51.5C176.6 737.5 319.9 838 512 838c192.2 0 335.4-100.5 430.2-300.3 7.7-16.2 7.7-35 0-51.5zM512 766c-161.3 0-279.4-81.8-362.7-254C232.6 339.8 350.7 258 512 258c161.3 0 279.4 81.8 362.7 254C791.5 684.2 673.4 766 512 766zm-4-430c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm0 288c-61.9 0-112-50.1-112-112s50.1-112 112-112 112 50.1 112 112-50.1 112-112 112z'/%3E%3C/svg%3E");
|
|
290
|
+
background-size: contain;
|
|
291
|
+
background-repeat: no-repeat;
|
|
223
292
|
position: absolute;
|
|
224
|
-
top:
|
|
225
|
-
left:
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
font-size: 14px;
|
|
229
|
-
line-height: 1;
|
|
230
|
-
padding: 0;
|
|
293
|
+
top: 6px;
|
|
294
|
+
left: 6px;
|
|
295
|
+
width: 14px;
|
|
296
|
+
height: 14px;
|
|
231
297
|
z-index: 10;
|
|
232
298
|
pointer-events: none;
|
|
233
|
-
box-shadow: none !important;
|
|
234
|
-
opacity: 0.8;
|
|
235
299
|
}
|
|
236
300
|
/* Hide native antd thumbnail icon if we placed an eye so it doesnt look messy */
|
|
237
|
-
div[class*="attachment-list-card"] .ant-upload-list-item-thumbnail {
|
|
301
|
+
div[class*="attachment-list-card"]:not([class*="attachment-list-card-"]).is-cached-previewable .ant-upload-list-item-thumbnail {
|
|
238
302
|
opacity: 0.2;
|
|
239
303
|
}
|
|
240
304
|
`;
|
|
@@ -251,12 +315,16 @@ const ChatFilePreviewInner: React.FC<{ children: React.ReactNode }> = ({ childre
|
|
|
251
315
|
if (!el || typeof el.closest !== 'function') return;
|
|
252
316
|
|
|
253
317
|
// Find closest FileCard element — uses ant-design/x class pattern
|
|
254
|
-
const cardEl = el.closest('[class*="attachment-list-card"]') as HTMLElement;
|
|
318
|
+
const cardEl = el.closest('[class*="attachment-list-card"]:not([class*="attachment-list-card-"])') as HTMLElement;
|
|
255
319
|
if (!cardEl) return;
|
|
256
320
|
|
|
257
321
|
// Skip remove button clicks
|
|
258
322
|
if (el.closest('[class*="-remove"]') || el.closest('.ant-btn')) return;
|
|
259
323
|
|
|
324
|
+
// Ensure we only hijack the click if we VERIFIED the file exists in our cache!
|
|
325
|
+
// This strictly prevents the 403 API fallback scenario.
|
|
326
|
+
if (!cardEl.classList.contains('is-cached-previewable')) return;
|
|
327
|
+
|
|
260
328
|
const displayName = getDisplayNameFromCard(cardEl);
|
|
261
329
|
const urlNodes = cardEl.querySelectorAll('a');
|
|
262
330
|
let fallbackUrl = '';
|
|
@@ -12,6 +12,7 @@ import { Modal, Button, Spin, Alert, message } from 'antd';
|
|
|
12
12
|
import { DownloadOutlined, DeleteOutlined } from '@ant-design/icons';
|
|
13
13
|
import { useAPIClient } from '@nocobase/client';
|
|
14
14
|
import { SessionBlobCache } from './SessionBlobCache';
|
|
15
|
+
import { AppRamCache } from './ChatFilePreviewProvider';
|
|
15
16
|
import { useTranslation } from './locale';
|
|
16
17
|
|
|
17
18
|
// ─── Supported MIME / extension lists ──────────────────────────────
|
|
@@ -86,9 +87,13 @@ async function resolveFileBlob(file: any, apiClient: any, sessionId: string): Pr
|
|
|
86
87
|
const fileId = String(file?.id || file?.uid || fileUrl);
|
|
87
88
|
const name = file?.filename || file?.name || file?.title;
|
|
88
89
|
|
|
89
|
-
if (name) {
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
if (name && AppRamCache.has(name)) {
|
|
91
|
+
return AppRamCache.get(name) as Blob;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Also try display name or fallback
|
|
95
|
+
if (file?.title && AppRamCache.has(file.title)) {
|
|
96
|
+
return AppRamCache.get(file.title) as Blob;
|
|
92
97
|
}
|
|
93
98
|
|
|
94
99
|
if (sessionId && fileId) {
|
|
@@ -41,6 +41,33 @@ export const SessionBlobCache = {
|
|
|
41
41
|
});
|
|
42
42
|
},
|
|
43
43
|
|
|
44
|
+
async has(sessionId: string, fileId: string): Promise<boolean> {
|
|
45
|
+
const db = await openDB();
|
|
46
|
+
return new Promise((resolve, reject) => {
|
|
47
|
+
const tx = db.transaction(STORE_NAME, 'readonly');
|
|
48
|
+
const store = tx.objectStore(STORE_NAME);
|
|
49
|
+
const req = store.count(makeKey(sessionId, fileId));
|
|
50
|
+
req.onsuccess = () => resolve(req.result > 0);
|
|
51
|
+
req.onerror = () => reject(req.error);
|
|
52
|
+
});
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
async listLocalUploads(): Promise<string[]> {
|
|
56
|
+
const db = await openDB();
|
|
57
|
+
return new Promise((resolve, reject) => {
|
|
58
|
+
const tx = db.transaction(STORE_NAME, 'readonly');
|
|
59
|
+
const store = tx.objectStore(STORE_NAME);
|
|
60
|
+
const req = store.getAllKeys();
|
|
61
|
+
req.onsuccess = () => {
|
|
62
|
+
const keys = (req.result as string[])
|
|
63
|
+
.filter((k) => k.startsWith('local_uploads:'))
|
|
64
|
+
.map((k) => k.replace('local_uploads:', ''));
|
|
65
|
+
resolve(keys);
|
|
66
|
+
};
|
|
67
|
+
req.onerror = () => reject(req.error);
|
|
68
|
+
});
|
|
69
|
+
},
|
|
70
|
+
|
|
44
71
|
async put(sessionId: string, fileId: string, blob: Blob): Promise<void> {
|
|
45
72
|
const db = await openDB();
|
|
46
73
|
return new Promise((resolve, reject) => {
|