@remit/web-client-dist 0.0.351 → 0.0.352
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/assets/{BriefPane-D5U_FMo6.js → BriefPane-p-hSuFHs.js} +1 -1
- package/assets/{ErrorState-DrA1RdFM.js → ErrorState-DZuvygoB.js} +1 -1
- package/assets/{FlaggedPane-CD0MhkHu.js → FlaggedPane-hgkHMzJs.js} +1 -1
- package/assets/MailListHeader-ChgoSBi9.js +52 -0
- package/assets/{MailViewChrome-wpRug1Q0.js → MailViewChrome-Bmclnv4Y.js} +1 -1
- package/assets/MailboxPane-BMQDZJjp.js +1 -0
- package/assets/{NavMenuButton-Dy0q8FiJ.js → NavMenuButton-BMHaKadd.js} +1 -1
- package/assets/{OnboardingWizard-DxBnC5ZI.js → OnboardingWizard-D_CKlYeE.js} +1 -1
- package/assets/OutboxPane-CZaWhBtj.js +1 -0
- package/assets/_mailboxId-CFnhtqtO.js +1 -0
- package/assets/_messageId-BGy2iRwR.js +1 -0
- package/assets/_messageId-C5W69cMm.js +1 -0
- package/assets/_messageId-Coqf3iOq.js +1 -0
- package/assets/_outboxMessageId-BPomNqIM.js +1 -0
- package/assets/_threadId-BeFC5p1-.js +1 -0
- package/assets/_threadId-C4vJmEsZ.js +1 -0
- package/assets/_threadId-CuZmFZv-.js +1 -0
- package/assets/{account-form-helpers-D1exxHT6.js → account-form-helpers-BfY-Ea9J.js} +1 -1
- package/assets/accounts-L7qmNB9J.js +1 -0
- package/assets/{advanced-BY_XBoCx.js → advanced-BJY8Omuf.js} +2 -2
- package/assets/{appearance-BszRkKRP.js → appearance-DpQj7mfH.js} +1 -1
- package/assets/{avatar-lbydjrIt.js → avatar-BFQ0qcwg.js} +1 -1
- package/assets/{bottom-sheet-BZM-qnW9.js → bottom-sheet-B093xbW6.js} +1 -1
- package/assets/brief-BRJwDJxo.js +1 -0
- package/assets/{brief-DAZY-yDt.js → brief-DDFdGXoV.js} +1 -1
- package/assets/{browser-ponyfill-1mYU3VEo.js → browser-ponyfill-B6ZDdJ1B.js} +1 -1
- package/assets/{bug-LK0uYJOc.js → bug-J1y1e9ln.js} +1 -1
- package/assets/{circle-check-BO9xAEiG.js → circle-check-Cc5r3mNv.js} +1 -1
- package/assets/{circle-check-big-xK5jTBa2.js → circle-check-big-CbFDK_1e.js} +1 -1
- package/assets/{circle-help-D-5uStGy.js → circle-help-CP-9GEES.js} +1 -1
- package/assets/{clock-CdRZkrpV.js → clock-96u1OlQy.js} +1 -1
- package/assets/{confirm-dialog-DZ3dfzvC.js → confirm-dialog-D9ePPVOy.js} +1 -1
- package/assets/{download-BRZRRebx.js → download-D7nu5tCC.js} +1 -1
- package/assets/{filters-CJtRXFIT.js → filters-DNNLGo5R.js} +1 -1
- package/assets/flagged-B9fZ1GqU.js +1 -0
- package/assets/{flagged-B4b0rbUr.js → flagged-W35-YQH1.js} +1 -1
- package/assets/{folders-CMjuCzAd.js → folders-TMV5XV0z.js} +1 -1
- package/assets/index-1WA7SdKy.js +1 -0
- package/assets/{index-Bo-p3LpF.js → index-BDlRWNu5.js} +63 -63
- package/assets/index-BGy2iRwR.js +1 -0
- package/assets/index-BMYggitW.js +1 -0
- package/assets/index-BV0ZMlSc.js +1 -0
- package/assets/index-BrDwfz9a.js +1 -0
- package/assets/index-BtDSe1NC.js +1 -0
- package/assets/index-C5W69cMm.js +1 -0
- package/assets/index-D60Mtde_.js +1 -0
- package/assets/{kbd-0M4qAi49.js → kbd-Nj3PirXE.js} +1 -1
- package/assets/{labels-CuC6gcyn.js → labels-BTNthaM_.js} +1 -1
- package/assets/mail-D33vNQBN.js +1 -0
- package/assets/{menu-vnrvhz9W.js → menu-Cge3eG3G.js} +1 -1
- package/assets/{move-options-_eZlt0v0.js → move-options-_Jvq5Spv.js} +1 -1
- package/assets/{nav-link-BC-lpJt4.js → nav-link-ChkTofbC.js} +1 -1
- package/assets/{onboarding-B1ncdxiJ.js → onboarding-Bzi09G3e.js} +1 -1
- package/assets/outbox-rJugUzue.js +1 -0
- package/assets/{pencil-7SyIHZVc.js → pencil-CAWN6ewF.js} +1 -1
- package/assets/{rich-text-DbpnpZXL.js → rich-text-Dp3cktQa.js} +1 -1
- package/assets/{rich-text-spellcheck-worker-provider-LftNISS3.js → rich-text-spellcheck-worker-provider-D7aFt0ey.js} +1 -1
- package/assets/{rotate-ccw-CKKgjGEq.js → rotate-ccw-CUMpjKIx.js} +1 -1
- package/assets/{row-actions-7xv7AJ82.js → row-actions-DRYVYMB6.js} +1 -1
- package/assets/search-token-index-BCcAcKHl.js +1 -0
- package/assets/{search-view-CB5G4Kva.js → search-view-DaSWxA7w.js} +1 -1
- package/assets/{senders-O9M02K_2.js → senders-DhbxI1sv.js} +1 -1
- package/assets/settings-cYD6emkb.js +1 -0
- package/assets/{settings-screen-CjdCNCJ8.js → settings-screen-CJpNRhuf.js} +1 -1
- package/assets/{shield-check-C48_fmzW.js → shield-check-wZ0xR1_v.js} +1 -1
- package/assets/{suggested-vips-BXGwlIUy.js → suggested-vips-ByzIj3y1.js} +1 -1
- package/assets/{use-match-media-jqJ95ElE.js → use-match-media-C-UI0_qJ.js} +1 -1
- package/assets/{useDebouncedValue-bAON8Yph.js → useDebouncedValue-BCfUYA_a.js} +1 -1
- package/assets/{useFilters-D_O09QB6.js → useFilters-DnPMMAYI.js} +1 -1
- package/assets/{useLabels-wgL9c4lv.js → useLabels-BCPsJjR6.js} +1 -1
- package/assets/{useRefreshControl-hxsw2pLp.js → useRefreshControl-CkuN__QT.js} +1 -1
- package/assets/{useSearchMirror-DylRqxaA.js → useSearchMirror-sL1Jjp51.js} +1 -1
- package/assets/useSearchTokenContext-CD-tKLIr.js +84 -0
- package/assets/{useSemanticSearch-BXCI_0Rt.js → useSemanticSearch-DOYK8s17.js} +1 -1
- package/assets/useSignature-CeeqBJpG.js +1 -0
- package/index.html +1 -1
- package/package.json +1 -1
- package/assets/MailListHeader-BJ9doZxm.js +0 -52
- package/assets/MailboxPane-CUVIV3ip.js +0 -1
- package/assets/OutboxPane-DD3Oj-FL.js +0 -1
- package/assets/_mailboxId-BTlxhtzs.js +0 -1
- package/assets/_messageId-CUwYB2GP.js +0 -1
- package/assets/_messageId-DFuKJd0-.js +0 -1
- package/assets/_messageId-DOJy3_kq.js +0 -1
- package/assets/_outboxMessageId-DkVUQAXG.js +0 -1
- package/assets/_threadId-D6AYslSV.js +0 -1
- package/assets/_threadId-JDDKxHld.js +0 -1
- package/assets/_threadId-oY_n41uG.js +0 -1
- package/assets/accounts-CZkcoZsJ.js +0 -1
- package/assets/brief-BAvH751q.js +0 -1
- package/assets/flagged-Cj1lkP-D.js +0 -1
- package/assets/index-72yU2-kn.js +0 -1
- package/assets/index-BfJZRVVj.js +0 -1
- package/assets/index-BxygYghU.js +0 -1
- package/assets/index-CUwYB2GP.js +0 -1
- package/assets/index-DFS5aq3D.js +0 -1
- package/assets/index-DKsFKmu0.js +0 -1
- package/assets/index-DOJy3_kq.js +0 -1
- package/assets/index-nszVYODK.js +0 -1
- package/assets/mail-DEw6NSuJ.js +0 -1
- package/assets/outbox-C-BbuTN9.js +0 -1
- package/assets/search-token-index-sLIcvT6p.js +0 -1
- package/assets/settings-CI2VbWFc.js +0 -1
- package/assets/useSearchTokenContext-Bb3YnI52.js +0 -84
- package/assets/useSignature-sSo464BG.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as m,
|
|
1
|
+
import{r as m,ae as b,cM as E,x as M,cN as D,cz as x,cO as P,s as C,cP as F,cQ as N,cR as z,cS as L}from"./index-BDlRWNu5.js";import{u as T,D as w}from"./use-match-media-C-UI0_qJ.js";const Y=()=>T(w),G=(e,t)=>{if(e.state==="Expired")return"Expired";if(e.scope!=="Temporary"||!e.expiresAt)return"Active";const r=Date.parse(e.expiresAt);return Number.isNaN(r)?"Active":r<=t?"Expired":"Active"},X=e=>{if(!e)return;const t=Date.parse(e);if(!Number.isNaN(t))return new Date(t).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})},O=(e,t=new Date)=>{if(!e)return;const r=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e);if(!r)return;const[,a,i,n]=r,s=new Date(Number(a),Number(i)-1,Number(n),23,59,59,0);if(Number.isNaN(s.getTime()))return;const o=-t.getTimezoneOffset(),d=o>=0?"+":"-",c=Math.abs(o),l=String(Math.floor(c/60)).padStart(2,"0"),f=String(c%60).padStart(2,"0"),u=p=>String(p).padStart(2,"0");return`${s.getFullYear()}-${u(s.getMonth()+1)}-${u(s.getDate())}T${u(s.getHours())}:${u(s.getMinutes())}:${u(s.getSeconds())}${d}${l}:${f}`},h="None",Z=e=>!e.literalClauses.some(t=>t.field==="HasWords"),y=e=>({...e.anchorMessageId?{anchorMessageId:e.anchorMessageId}:{},matchOperator:e.matchOperator,literalClauses:e.literalClauses,actionLabelId:e.labelId??h,actionMailboxId:e.moveMailboxId??h}),ee=({mode:e,ruleScope:t})=>t==="standing"?"standing":t==="until"?"temporary":e==="selected"?"just-these":"all-like-these",te=({mode:e,ruleScope:t,anchorMessageId:r,clauses:a,matchOperator:i,moveMailboxId:n,until:s})=>({...e==="similar"&&r?{anchorMessageId:r}:{},matchOperator:i==="all"?"And":"Or",literalClauses:a.map(o=>({field:o.field,value:o.value})),moveMailboxId:n,expiresAt:t==="until"?O(s??""):void 0}),S=(e,t,r)=>({name:r,scope:t==="standing"?"Standing":"Temporary",...t==="temporary"&&e.expiresAt?{expiresAt:e.expiresAt}:{},matchOperator:e.matchOperator,literalClauses:e.literalClauses,actionLabelId:e.labelId??h,actionMailboxId:e.moveMailboxId??h,...e.anchorMessageId?{anchorMessageId:e.anchorMessageId}:{}}),_=new Set(["Complete","Failed"]),v=e=>e!==void 0&&_.has(e),R=1e3,k=15e3,J=e=>{const t=Math.max(0,e),r=R*2**t;return Math.min(r,k)},$=(e,t,r)=>{if(e)return{kind:r?"restartFailed":"startFailed",error:e};if(t)return{kind:"statusUnreadable",error:t}},re=e=>{const[t,r]=m.useState(),a=b({...E(),onSuccess:g=>r(g.organizeJobId)}),{mutate:i}=a,n=M({...D({path:{accountId:e??"",organizeJobId:t??""}}),enabled:!!e&&!!t,refetchInterval:g=>{const I=g.state.data?.state;return v(I)?!1:J(g.state.dataUpdateCount)}}),s=m.useCallback(g=>{e&&i({path:{accountId:e},body:y(g)})},[e,i]),{refetch:o}=n,d=m.useCallback(()=>{o()},[o]),c=n.data,l=a.isPending?void 0:c,f=l?.state??a.data?.state,u=v(l?.state),p={state:f,matchedCount:l?.matchedCount??0,appliedCount:l?.appliedCount??0,failedCount:l?.failedCount??0,errorMessage:l?.errorMessage??""};return{start:s,refreshStatus:d,progress:p,isStarting:a.isPending,isRunning:!!t&&!u,isDone:u,failure:$(a.error,n.error,!!c)}},se=["From","Subject","HasWords","ListId","FromDomain"],Q=e=>{const t=e.trim(),r=t.match(/<([^>]+)>/);return(r?r[1]:t).trim().toLowerCase()},ae=(e,t)=>e==="ListId"?Q(t):t.trim(),U=e=>e==="all"?"And":"Or",j=(e,t)=>{const r=e.widen!==void 0&&!e.widen.inactive,a=e.clauses.map(i=>({field:i.field,value:i.value}));return{...r&&t?{anchorMessageId:t}:{},matchOperator:U(e.matchOperator),literalClauses:a}},q=e=>e.anchorMessageId!==void 0||!e.literalClauses.some(t=>t.field==="HasWords"),H=e=>JSON.stringify({anchor:e.anchorMessageId??null,operator:e.matchOperator,clauses:e.literalClauses.map(t=>`${t.field} ${t.value}`)}),ne=(e,t)=>{const r=j(e,t);return{...r.anchorMessageId?{anchorMessageId:r.anchorMessageId}:{},matchOperator:r.matchOperator,literalClauses:r.literalClauses,moveMailboxId:e.moveMailboxId,labelId:e.labelId,expiresAt:e.scope==="until"?O(e.until??""):void 0}},K=(e,t)=>e.error!==void 0&&e.errorSignature===t?{status:"error",reason:e.error}:e.count===void 0?{status:"loading"}:e.previewedSignature===t?{status:"ready",count:e.count}:{status:"ready",count:e.count,stale:!0},W=350,ie=(e,t,r)=>{const a=b(x()),{mutateAsync:i}=a,n=H(t),[s,o]=m.useState(()=>({})),d=m.useRef(t);d.current=t;const c=m.useRef(n),l=q(t);return m.useEffect(()=>{if(!e||!l||n===s.previewedSignature||n===s.errorSignature)return;const f=setTimeout(()=>{const u=n;c.current=u,i({path:{accountId:e},body:y({...d.current})}).then(p=>{c.current===u&&o({count:p.matchedCount,matchedIds:p.messageIds,previewedSignature:u})}).catch(p=>{c.current===u&&o(g=>({...g,error:p instanceof Error?p.message:"Couldn't count matches.",errorSignature:u}))})},W);return()=>clearTimeout(f)},[e,l,n,s.previewedSignature,s.errorSignature,i]),l?{count:K(s,n),matchedIds:s.previewedSignature===n?s.matchedIds??[]:[]}:{count:{status:"error",reason:P},matchedIds:[]}},A=e=>N({path:{accountId:e}}),oe=e=>{const t=M({...z({path:{accountId:e??""}}),enabled:!!e});return{filters:t.data?.items??[],isPending:t.isPending,isError:t.isError,error:t.error,refetch:t.refetch}},ue=e=>{const t=C(),r=b({...F(),onSuccess:()=>{e&&t.invalidateQueries({queryKey:A(e)})}}),{mutate:a,mutateAsync:i}=r,n=m.useCallback((o,d,c)=>{e&&a({path:{accountId:e},body:S(o,d,c)})},[e,a]),s=m.useCallback(async(o,d,c)=>e?i({path:{accountId:e},body:S(o,d,c)}).then(()=>!0,()=>!1):!1,[e,i]);return{createFilter:n,createFilterAsync:s,isPending:r.isPending,isSuccess:r.isSuccess,isError:r.isError,error:r.error,reset:r.reset}},ce=e=>{const t=C(),r=b({...L(),onSuccess:()=>{e&&t.invalidateQueries({queryKey:A(e)})}}),{mutate:a}=r;return{deleteFilter:m.useCallback(n=>{e&&a({path:{accountId:e,filterId:n}})},[e,a]),isPending:r.isPending,deletingFilterId:r.isPending?r.variables?.path.filterId:void 0}};export{h as N,se as S,re as a,A as b,ne as c,Y as d,X as e,G as f,oe as g,ce as h,y as i,ue as j,te as k,Z as l,ae as n,ee as o,O as p,j as r,ie as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{x as L,
|
|
1
|
+
import{x as L,bA as p,s as n,ae as l,bB as d,r as o,bC as y,bD as c,bE as g}from"./index-BDlRWNu5.js";const u=e=>y({path:{accountId:e}}),f=e=>{const s=L({...p({path:{accountId:e??""}}),enabled:!!e});return{labels:s.data?.items??[],isPending:s.isPending,isError:s.isError,error:s.error,refetch:s.refetch}},m=e=>{const s=n(),t=l({...d(),onSuccess:()=>{e&&s.invalidateQueries({queryKey:u(e)})}}),{mutateAsync:r}=t;return{createLabel:o.useCallback((a,i="Default")=>e?r({path:{accountId:e},body:{name:a,color:i}}):Promise.reject(new Error("No account")),[e,r]),isPending:t.isPending,isError:t.isError,error:t.error,reset:t.reset}},C=e=>{const s=n(),t=l({...c(),onSuccess:()=>{e&&s.invalidateQueries({queryKey:u(e)})}}),{mutate:r}=t;return{updateLabel:o.useCallback((a,i)=>{e&&r({path:{accountId:e,labelId:a},body:i})},[e,r]),isPending:t.isPending,updatingLabelId:t.isPending?t.variables?.path.labelId:void 0}},h=e=>{const s=n(),t=l({...g(),onSuccess:()=>{e&&s.invalidateQueries({queryKey:u(e)})}}),{mutate:r}=t;return{deleteLabel:o.useCallback(a=>{e&&r({path:{accountId:e,labelId:a}})},[e,r]),isPending:t.isPending,deletingLabelId:t.isPending?t.variables?.path.labelId:void 0}};export{f as a,C as b,h as c,m as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as
|
|
1
|
+
import{j as w,e as q,b as j,B as D,r as i,v as C,aE as R,s as P,o as K,a1 as Q,P as A,N as $,Q as z,R as B}from"./index-BDlRWNu5.js";import{C as G}from"./circle-check-big-CbFDK_1e.js";import{R as H}from"./search-token-index-BCcAcKHl.js";function oe({state:e,onRefresh:t,label:s,errorMessage:a,hasUpdate:n,size:u="sm",className:c}){const o=e==="refreshing",f=e==="error",h=e==="success",g=f?w.jsx(q,{className:"size-4 text-danger"}):h?w.jsx(G,{className:"size-4 text-positive"}):w.jsx(H,{className:j("size-4",o&&"animate-spin")}),y=f?`${s} — failed: ${a??"try again"}`:o?`${s} — refreshing`:h?`${s} — up to date`:n?`${s} — new mail`:s;return w.jsxs("div",{className:"relative inline-flex",children:[w.jsx(D,{variant:"ghost",size:u,icon:g,onClick:t,disabled:o,"aria-label":y,"aria-busy":o||void 0,title:f?a:s,className:c}),e==="idle"&&n&&w.jsx("span",{"aria-hidden":"true",className:"absolute right-1 top-1 size-1.5 rounded-full bg-accent-2"})]})}const U=new Set(["discovering_mailboxes","syncing_inbox","syncing_others"]);function N(e){return!!e&&U.has(e)}const _=3e3,W=_*2,v={syncing:!1,resolved:!1,synced:0,total:0};function ie(e,t){const s=e.join(","),[a,n]=i.useState(!1),[u,c]=i.useState(!1);i.useEffect(()=>{n(!1),c(!1)},[s,t]),i.useEffect(()=>{if(!t)return;const r=setTimeout(()=>c(!0),W);return()=>clearTimeout(r)},[s,t]);const o=C({queries:e.map(r=>({...R({path:{accountId:r}}),enabled:t&&!a,refetchInterval:_,meta:{softError:!0}}))}),f=o.every(r=>r.isSuccess||r.isError),h=o.length===0||f||u;let g=!1,y=0,E=0;for(const r of o)if(N(r.data?.syncPhase)){g=!0;for(const l of r.data?.mailboxes??[])y+=l.messagesSynced,E+=l.messagesTotal}const S=t&&h&&!g;return i.useEffect(()=>{S&&n(!0)},[S]),!t||!h?v:{syncing:g,resolved:!0,synced:y,total:E}}const M=6e4,I=new Set(["sent","drafts","trash","archive"]),k=(e,t)=>{const s=new Map;for(const a of e){const n=t.get(a.mailboxId)?.role;n&&I.has(n)||s.set(a.mailboxId,a.messagesTotal)}return s},X=(e,t)=>{for(const[s,a]of t)if(a>(e.get(s)??0))return!0;return!1},F=i.createContext(null),J=()=>{const e=i.useContext(F);if(!e)throw new Error("useMailFreshness must be used inside <MailFreshnessProvider>");return e};function ce({accountIds:e,children:t}){const s=P(),{resultFolderIndex:a}=K(),n=i.useRef(new Map),u=i.useRef(new Set),[c,o]=i.useState(new Set),f=C({queries:e.map(r=>({...R({path:{accountId:r}}),refetchInterval:M,staleTime:M,meta:{softError:!0}}))}),h=f.map(r=>r.dataUpdatedAt).join(","),g=e.join(",");i.useEffect(()=>{let r=!1;const l=new Set(c);e.forEach((d,x)=>{const p=f[x]?.data;if(!p)return;const m=k(p.mailboxes??[],a);if(!u.current.has(d)){u.current.add(d),n.current.set(d,m);return}if(l.has(d))return;const T=n.current.get(d)??new Map;X(T,m)&&(l.add(d),r=!0)}),r&&o(l)},[g,h]);const y=i.useCallback(r=>r.some(l=>c.has(l)),[c]),E=i.useCallback(r=>{o(l=>{if(r.every(x=>!l.has(x)))return l;const d=new Set(l);for(const x of r)d.delete(x);return d});for(const l of r){const d=s.getQueryData(R({path:{accountId:l}}).queryKey);n.current.set(l,k(d?.mailboxes??[],a)),u.current.add(l)}},[s,a]),S=i.useMemo(()=>({hasNewMail:y,acknowledge:E}),[y,E]);return w.jsx(F.Provider,{value:S,children:t})}const V=2e3,Y=45e3,Z=e=>new Promise(t=>setTimeout(t,e)),b=e=>e instanceof Error&&e.message?e.message:"Something went wrong",ee=e=>{z(e,{softError:!0})&&B(e)},L=e=>e.reduce((t,s)=>Math.max(t,s.lastSyncedAt??0),0),O=(e,t)=>e.fetchQuery({...R({path:{accountId:t}}),staleTime:0}),se=async(e,t,s,a)=>{let n=!1;for(;;){const u=await O(e,t).then(f=>({ok:!0,data:f})).catch(f=>({ok:!1,error:f}));if(!u.ok)return{accountId:t,message:b(u.error)};const{syncPhase:c,mailboxes:o}=u.data;if(N(c))n=!0;else if(n||L(o??[])>s)return c==="error"?{accountId:t,message:"Sync failed for this account"}:void 0;if(Date.now()>=a)return{accountId:t,message:"Refresh is taking longer than usual"};await Z(V)}},te=async(e,t,s,a)=>{const n=await O(e,s).then(o=>({ok:!0,maxLastSynced:L(o.mailboxes??[])})).catch(o=>({ok:!1,error:o}));if(!n.ok)return{accountId:s,enqueued:!1,ok:!1,message:b(n.error)};const u=await $({path:{accountId:s},throwOnError:!0}).then(()=>({ok:!0})).catch(o=>({ok:!1,error:o}));if(!u.ok)return ee(u.error),{accountId:s,enqueued:!1,ok:!1,message:b(u.error)};t.recordEvent("sync.triggered");const c=await se(e,s,n.maxLastSynced,a);return c?{accountId:s,enqueued:!0,ok:!1,message:c.message}:{accountId:s,enqueued:!0,ok:!0}},ue=(e,t={})=>{const s=P(),a=Q(),{acknowledge:n}=J(),[u,c]=i.useState("idle"),[o,f]=i.useState(),h=i.useRef(0),g=i.useRef(e);g.current=e;const y=i.useRef(t);y.current=t,i.useEffect(()=>{if(u!=="success")return;const S=setTimeout(()=>c("idle"),2e3);return()=>clearTimeout(S)},[u]);const E=i.useCallback(()=>{const S=g.current;if(S.length===0){c("error"),f("Nothing to refresh yet");return}const r=++h.current;c("refreshing"),f(void 0),(async()=>{const l=Date.now()+Y,d=await Promise.all(S.map(m=>te(s,a,m,l)));if(h.current!==r)return;const x=d.filter(m=>m.enqueued).map(m=>m.accountId);for(const m of x)s.invalidateQueries({queryKey:A({path:{accountId:m}})});x.length>0&&(y.current.onSettled?.(),n(x));const p=d.filter(m=>!m.ok);p.length===0?c("success"):(c("error"),f(p[0]?.message))})()},[n,s,a]);return{state:u,errorMessage:o,refresh:E}};export{ce as M,oe as R,ue as a,ie as b,N as i,J as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{p as y,o as d,
|
|
1
|
+
import{p as y,o as d,V as x,r as h}from"./index-BDlRWNu5.js";import{b as Q}from"./nav-link-ChkTofbC.js";import{b}from"./search-view-DaSWxA7w.js";function M(o){const a=y(),{searchInput:c,searchQuery:r}=d(),{q:i=""}=x({from:"/mail"}),n=Q({select:l=>l.location.pathname}),s=h.useRef(i);s.current=i;const{to:e}=o,t="params"in o?o.params.mailboxId:void 0,m=t?`/mail/${t}`:e;h.useEffect(()=>{if(!b({searchInput:c,committedQuery:r,urlQuery:s.current,pathname:n,listPath:m}))return;const p=!!r&&s.current!==r,u=f=>({...f,q:r||void 0});if(!p){a({to:".",search:u,hash:!0,replace:!0});return}if(e==="/mail/$mailboxId"){if(!t)return;a({to:e,params:{mailboxId:t},search:u,hash:!0,replace:!0});return}a({to:e,search:u,hash:!0,replace:!0})},[c,r,a,e,t,m,n])}export{M as u};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import{c2 as Z,r as g,j as a,b as x,I as J,a1 as ee,n as _,s as B,x as te,cq as $,cp as se,ac as re,ae as ne,af as ae,bc as oe,e as ie,X as ce,o as le}from"./index-BDlRWNu5.js";import{K as A}from"./kbd-Nj3PirXE.js";import{M as D}from"./enums-CCxx0t2v.js";import{b as de,f as ue}from"./nav-link-ChkTofbC.js";const me=(e,t)=>{const r=e==="newsletter"||e==="marketing"||t;return{framed:r,isPlain:!r}},fe=()=>`
|
|
2
|
+
/* Zero the UA default body margin and clamp the document to the iframe width so
|
|
3
|
+
wide author markup can't push the body (and the page) past the viewport. */
|
|
4
|
+
html, body {
|
|
5
|
+
margin: 0;
|
|
6
|
+
padding: 0;
|
|
7
|
+
max-width: 100%;
|
|
8
|
+
}
|
|
9
|
+
body {
|
|
10
|
+
overflow-wrap: anywhere;
|
|
11
|
+
word-break: break-word;
|
|
12
|
+
}
|
|
13
|
+
/* Media never wider than the frame; keep aspect ratio when width is capped. */
|
|
14
|
+
img, video, iframe, svg, canvas {
|
|
15
|
+
max-width: 100% !important;
|
|
16
|
+
height: auto;
|
|
17
|
+
}
|
|
18
|
+
/* Fixed-width author tables (\`<table width="600">\`) collapse to fit. */
|
|
19
|
+
table {
|
|
20
|
+
max-width: 100% !important;
|
|
21
|
+
table-layout: auto;
|
|
22
|
+
}
|
|
23
|
+
/* Cells carry the fixed widths in real newsletters (\`<td width="600">\`);
|
|
24
|
+
cap them too or the table can't actually shrink. */
|
|
25
|
+
td, th {
|
|
26
|
+
max-width: 100% !important;
|
|
27
|
+
}
|
|
28
|
+
/* \`max-width\` alone can't beat an inline \`min-width\`; zeroing the min lets
|
|
29
|
+
flex / grid / table children actually collapse to the clamped width. */
|
|
30
|
+
* {
|
|
31
|
+
min-width: 0;
|
|
32
|
+
}
|
|
33
|
+
/* An author \`nowrap\` assumes a viewport as wide as the line. The frame is the
|
|
34
|
+
pane's width whatever the mail is, so a pinned paragraph turns reading one
|
|
35
|
+
sentence into a sideways drag — and inside an author \`overflow:hidden\` it is
|
|
36
|
+
cut mid-character with nothing left to scroll at all. Flowing text wraps. The
|
|
37
|
+
\`i\` flag is load-bearing: Outlook and older generators emit \`WHITE-SPACE:
|
|
38
|
+
NOWRAP\`, and an attribute value match is case-sensitive without it. */
|
|
39
|
+
[nowrap]:not(pre, code, pre *, code *),
|
|
40
|
+
[style*="nowrap" i]:not(pre, code, pre *, code *) {
|
|
41
|
+
white-space: normal !important;
|
|
42
|
+
}
|
|
43
|
+
/* Long unbroken strings (URLs, tokens) wrap instead of forcing a wide line. */
|
|
44
|
+
pre, code {
|
|
45
|
+
white-space: pre-wrap;
|
|
46
|
+
overflow-wrap: anywhere;
|
|
47
|
+
word-break: break-word;
|
|
48
|
+
}
|
|
49
|
+
/* Preformatted text keeps its spacing even where a nowrap is declared — on the
|
|
50
|
+
block or on a span inside it. \`normal\` would collapse the runs of spaces that
|
|
51
|
+
are the entire content of a \`pre\`, and the un-important rule above cannot
|
|
52
|
+
defend an inline style, so this wraps to \`pre-wrap\` instead of unwrapping. */
|
|
53
|
+
:is(pre, code, pre *, code *):is([nowrap], [style*="nowrap" i]) {
|
|
54
|
+
white-space: pre-wrap !important;
|
|
55
|
+
}
|
|
56
|
+
`,he=e=>{const t=new Map;for(const s of e){if(!s.contentId||s.contentUrl.length===0)continue;const r=s.contentId.replace(/^<|>$/g,"");t.set(r,s.contentUrl)}return s=>t.get(s.replace(/^<|>$/g,""))},ge=/^(none|transparent|inherit|initial|unset)\s*$/i,O=e=>{const t=[],s=/<style[^>]*>([\s\S]*?)<\/style>/gi;let r;for(r=s.exec(e);r!==null;)t.push(r[1]),r=s.exec(e);return t},pe=e=>{const t=/background(?:-color)?\s*:\s*([^;}\n]+)/gi;let s;for(s=t.exec(e);s!==null;){const r=s[1].trim();if(!ge.test(r))return!0;s=t.exec(e)}return!1},ye=e=>{if(/\bstyle\s*=\s*["'][^"']*background/i.test(e)||/\bbgcolor\s*=/i.test(e))return!0;for(const t of O(e))if(pe(t))return!0;return!1},be=new Set(["auto","none","initial","inherit","unset","revert","revert-layer"]),xe=new RegExp(`(?<![-\\w])(?:padding|margin)(?:-(top|right|bottom|left|block|inline)(?:-(?:start|end))?)?\\s*:\\s*([^;}"']+)`,"gi"),we=new Set(["top","bottom","block"]),I=e=>e.replace(/\/\*[\s\S]*?\*\//g,""),C=e=>{const t=e.toLowerCase();if(!t||be.has(t)||t.startsWith("-"))return!1;const s=/^\+?(\d*\.?\d+)[a-z%]*$/.exec(t);return s?Number.parseFloat(s[1])!==0:!0},ve=e=>{const t=e.split(/\s+/).filter(Boolean);return t.length<2?t:t.length<4?[t[1]]:[t[1],t[3]]},ke=(e,t)=>{if(e&&we.has(e))return!1;const s=t.replace(/!\s*important/gi,"").trim();return s?e?s.split(/\s+/).some(C):ve(s).some(C):!1},N=e=>{for(const t of I(e).matchAll(xe))if(ke(t[1],t[2]))return!0;return!1},z=new Set(["blockquote"]),Ae=e=>e.replace(/<!--[\s\S]*?-->/g,""),Se=e=>{const t=[],s=/<([a-zA-Z][\w:-]*)((?:"[^"]*"|'[^']*'|[^>"'])*)>/g,r=/\bstyle\s*=\s*(?:"([^"]*)"|'([^']*)')/gi;for(const[,n,o]of e.matchAll(s))for(const c of o.matchAll(r))t.push({tag:n.toLowerCase(),style:c[1]??c[2]??""});return t},Ee=e=>[...I(e).matchAll(/([^{}]*)\{([^{}]*)\}/g)].map(t=>({selector:t[1].trim(),body:t[2]})),Te=e=>{const t=e.trim().split(/[\s>+~]+/).pop()??"";return(/^[a-zA-Z][\w-]*/.exec(t)?.[0]??"").toLowerCase()},Ce=e=>e.split(",").every(t=>z.has(Te(t))),Ne=e=>{const t=O(e),s=Ae(e);if(/\bcellpadding\s*=\s*["']?(?!0["'\s>])\d/i.test(s))return!0;for(const{tag:r,style:n}of Se(s))if(!z.has(r)&&N(n))return!0;for(const r of t)for(const n of Ee(r))if(!Ce(n.selector)&&N(n.body))return!0;return!1},Re=["script","iframe","object","embed","form","input","button","textarea","select","meta","link","base"],je=["onerror","onload","onclick","onmouseover","onmouseout","onfocus","onblur","onsubmit","onkeydown","onkeyup","formaction","xlink:href","data-bind"],Le="data:image/svg+xml,"+encodeURIComponent(`
|
|
57
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
|
|
58
|
+
<rect fill="#f0f0f0" width="100" height="100"/>
|
|
59
|
+
<text x="50" y="50" text-anchor="middle" dy=".3em" fill="#999" font-size="12">
|
|
60
|
+
Image blocked
|
|
61
|
+
</text>
|
|
62
|
+
</svg>
|
|
63
|
+
`),Me=e=>e.replace(/url\s*\([^)]*\)/gi,"none").replace(/expression\s*\([^)]*\)/gi,"").replace(/-moz-binding\s*:[^;]*/gi,""),_e=e=>e.replace(/@import[^;]*;/gi,"/* @import blocked */").replace(/url\s*\([^)]*\)/gi,"none").replace(/expression\s*\([^)]*\)/gi,"").replace(/-moz-binding\s*:[^;]*/gi,""),Be=(e={})=>{const t=Z(),s={FORBID_TAGS:Re,FORBID_ATTR:je,ALLOW_DATA_ATTR:!1,ALLOW_UNKNOWN_PROTOCOLS:!1};return t.addHook("afterSanitizeAttributes",r=>{if(r.tagName==="IMG"){const n=r.getAttribute("src")||"";if(n.startsWith("data:"))return;if(n.startsWith("cid:")){const c=n.slice(4).replace(/^<|>$/g,""),m=e.resolveCid?.(c);m&&(r.setAttribute("src",m),r.classList.add("inline-content"));return}e.allowExternalImages||(r.setAttribute("data-blocked-src",n),r.setAttribute("src",Le),r.setAttribute("alt","[Blocked image]"),r.classList.add("blocked-image"))}if(r.tagName==="A"){const n=r.getAttribute("href")||"";if(/^(javascript|data):/i.test(n)){r.removeAttribute("href");return}r.setAttribute("target","_blank"),r.setAttribute("rel","noopener noreferrer nofollow"),r.classList.add("external-link")}if(r.hasAttribute("style")){const n=r.getAttribute("style")||"";r.setAttribute("style",Me(n))}}),t.addHook("uponSanitizeElement",(r,n)=>{if(n.tagName==="style"){const o=r.textContent||"";r.textContent=_e(o)}}),r=>{const n=ye(r),o=Ne(r),c=t.sanitize(r,s);return{html:`<style>${fe()}</style>${c}`,hasAuthorBackground:n,hasAuthorSpacing:o}}},$e='"Geist Variable", "Geist", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',k={light:{fg:"oklch(0.3 0.025 235)",canvas:"oklch(0.96 0.015 90)",accent:"oklch(0.55 0.14 150)"},dark:{fg:"oklch(0.88 0.02 90)",canvas:"oklch(0.22 0.025 220)",accent:"oklch(0.78 0.16 150)"}},De={background:!1,spacing:!1},Oe="16px",Ie=()=>`html{padding:0}body{padding:${Oe};box-sizing:border-box}`,ze=()=>"html{overflow:hidden}body{overflow-x:auto}",Fe=/prefers-color-scheme\s*:\s*dark|color-scheme\s*:\s*[^;}"']*\bdark\b/i,Ke='<meta name="viewport" content="width=device-width, initial-scale=1">',Pe=e=>{const t=e?k.dark:k.light;return`
|
|
64
|
+
/* Plain-email base: UI font-stack + theme-aware colors (#424) */
|
|
65
|
+
html, body {
|
|
66
|
+
font-family: ${$e};
|
|
67
|
+
font-size: 14px;
|
|
68
|
+
line-height: 1.6;
|
|
69
|
+
color: ${t.fg};
|
|
70
|
+
background-color: ${t.canvas};
|
|
71
|
+
margin: 0;
|
|
72
|
+
padding: 0;
|
|
73
|
+
}
|
|
74
|
+
/* Strip author unreadable text colors and element backgrounds, scoped to body
|
|
75
|
+
descendants so the themed html/body surface above survives this reset. */
|
|
76
|
+
body * {
|
|
77
|
+
color: inherit !important;
|
|
78
|
+
background-color: transparent !important;
|
|
79
|
+
}
|
|
80
|
+
a, a:visited {
|
|
81
|
+
color: ${t.accent} !important;
|
|
82
|
+
text-decoration: underline;
|
|
83
|
+
}
|
|
84
|
+
`},E="invert(0.92) hue-rotate(180deg)",R=`img,picture,video,svg,canvas,[style*='background-image'],[background]{filter:${E}}`,Ue=(e,t,s)=>{const r=e?k.dark.canvas:k.light.canvas;return s?e?t?`html,body{margin:0;background-color:${r};color-scheme:dark light}`:`html{margin:0;background-color:#ffffff;filter:${E}}body{margin:0}${R}`:"html,body{margin:0;background-color:#ffffff;color-scheme:light}":e?t?`html,body{margin:0;background-color:${r};color-scheme:dark light}`:`html{margin:0;background-color:${r}}body{margin:0;filter:${E}}${R}`:`html,body{margin:0;background-color:${r};color-scheme:light}`},He=(e,t,s,r=De)=>{const n=t==="plain"?Pe(s):Ue(s,Fe.test(e),r.background),o=r.spacing?"":Ie();return`${Ke}<style>${n}</style>${e}<style>${ze()}${o}</style>`},We=5e4,Ge="allow-same-origin allow-popups allow-popups-to-escape-sandbox",Qe=(e,t,s)=>Math.min(Math.ceil(Math.max(e,t)),s),qe=new Set(["Enter","Escape","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Home","End"]),Ve=e=>e===" "?!1:e.length===1?!0:qe.has(e),S=e=>{if(e.metaKey||e.ctrlKey||e.altKey||!Ve(e.key))return;const t=e.currentTarget??e.target,s=t?.defaultView?.parent;!s||s===t?.defaultView||s.dispatchEvent(new KeyboardEvent("keydown",{key:e.key,code:e.code,shiftKey:e.shiftKey,bubbles:!0,cancelable:!0}))},j=({html:e,variant:t="framed",isDark:s=!1,declares:r,className:n})=>{const o=g.useRef(null),[c,m]=g.useState(0),d=g.useMemo(()=>He(e,t,s,r),[e,t,s,r]);return g.useEffect(()=>{const l=o.current;if(!l)return;const h=()=>{const i=l.contentDocument;if(!i?.body)return;const p=i.documentElement,b=Qe(i.body.scrollHeight,p?.scrollHeight??0,We);m(v=>v===b?v:b)};let u,f;const y=()=>{h(),u?.disconnect(),u=void 0,f?.removeEventListener("keydown",S),f?.removeEventListener("load",h,!0),f=void 0;const i=l.contentDocument;i?.body&&(u=new ResizeObserver(h),u.observe(i.body),i.documentElement&&u.observe(i.documentElement),i.addEventListener("load",h,!0),i.fonts?.ready.then(h),i.addEventListener("keydown",S),f=i)};return l.addEventListener("load",y),()=>{l.removeEventListener("load",y),f?.removeEventListener("keydown",S),f?.removeEventListener("load",h,!0),u?.disconnect()}},[]),a.jsx("iframe",{ref:o,title:"Email content",sandbox:Ge,srcDoc:d,className:n,style:{width:"100%",border:"none",display:"block",height:c===0?"1px":`${c}px`,colorScheme:"normal"}})},L=()=>a.jsx("p",{className:"text-fg-muted text-sm italic",children:"This message has no body content."}),Bt=({className:e,children:t})=>a.jsx("div",{className:x("[&_.message-body-frame]:-mx-2 lg:[&_.message-body-frame]:-mx-4",e),children:t}),Ye=({html:e,text:t,isDark:s=!1,category:r,allowImages:n=!1,resolveCid:o,className:c,renderBlockedNotice:m})=>{const d=g.useMemo(()=>!e||typeof document>"u"?null:Be({allowExternalImages:n,resolveCid:o})(e),[e,n,o]),l=d?.html??null,{framed:h,isPlain:u}=me(r,d?.hasAuthorBackground??!1),f=g.useMemo(()=>({background:d?.hasAuthorBackground??!1,spacing:d?.hasAuthorSpacing??!1}),[d?.hasAuthorBackground,d?.hasAuthorSpacing]),y=g.useMemo(()=>!l||n?0:(l.match(/data-blocked-src/g)||[]).length,[l,n]);return!l&&!t?a.jsx("div",{className:x("message-body",c),children:a.jsx(L,{})}):a.jsxs("div",{className:x("message-body",c),children:[y>0&&a.jsx("div",{children:m?.(y)}),l?a.jsx("div",{className:"message-body-frame",children:h?a.jsx("div",{className:"w-full max-w-full",children:a.jsx(j,{html:l,variant:"framed",isDark:s,declares:f})}):a.jsx("div",{className:"max-w-full lg:max-w-2xl",children:a.jsx(j,{html:l,variant:u?"plain":"framed",isDark:s,declares:f})})}):t?a.jsx("pre",{className:"email-text whitespace-pre-wrap text-sm leading-relaxed",children:t}):a.jsx(L,{})]})};function $t({message:e="Select a thread to read",icon:t,showHints:s=!0,className:r}){return a.jsxs("div",{className:x("flex flex-1 flex-col items-center justify-center text-center",r),children:[t??a.jsx(J,{className:"size-10 text-fg-subtle"}),a.jsx("p",{className:"mt-3 text-sm text-fg-muted",children:e}),s&&a.jsxs("p",{className:"text-2xs text-fg-subtle",children:[a.jsx(A,{children:"j"})," / ",a.jsx(A,{children:"k"})," to move, ",a.jsx(A,{children:"Enter"})," to open"]})]})}function F(e){const t=[];let s=-1,r=!1;for(let n=0;n<e.length;n++){const o=e[n];if(o==='"'){r=!r,s<0&&(s=n);continue}if(!r&&/\s/.test(o)){s>=0&&t.push({raw:e.slice(s,n),start:s,end:n}),s=-1;continue}s<0&&(s=n)}return s>=0&&t.push({raw:e.slice(s),start:s,end:e.length}),t}const Xe=e=>{if(!e.startsWith('"'))return e;const t=e.slice(1);return t.endsWith('"')?t.slice(0,-1):t};function Ze(e){const t=e.indexOf(":");if(t<=0)return;const s=e.slice(t+1);return{name:e.slice(0,t).toLowerCase(),value:Xe(s),rawValue:s}}const Je=e=>/[\s"]/.test(e),et=e=>Je(e)?`"${e.replace(/"/g,"")}"`:e,Dt=(e,t)=>`${e}:${et(t)}`,tt=e=>{const t=e.filter(n=>!n.isMultipart&&n.disposition!=="attachment"&&n.mediaType==="TEXT"&&n.contentUrl.length>0),s=t.find(n=>n.mediaSubtype.toUpperCase()==="HTML");if(s)return{kind:"html",contentUrl:s.contentUrl};const r=t.find(n=>n.mediaSubtype.toUpperCase()==="PLAIN");return r?{kind:"text",contentUrl:r.contentUrl}:null},T={all:["messages"],detail:e=>[...T.all,"detail",e],body:e=>[...T.detail(e),"body"]};class w extends Error{reason;status;retryAfterSeconds;constructor(t,s,r,n){super(s),this.name="BodyFetchError",this.reason=t,this.status=r,this.retryAfterSeconds=n}}const st=e=>{const t=Number.parseInt(e??"",10);return!Number.isFinite(t)||t<=0?1:Math.min(t,30)},rt=8,nt="x-remit-403-reason",at=(e,t)=>{const s=t?.trim()??"";return e===401?"auth":e===403?s.length>0?"auth":"body-missing":e===404?"body-missing":"generic"},ot=(e,t)=>(t??"").toLowerCase().startsWith("text/html")?/<div\s+id=["']root["']/i.test(e):!1,it=(e,t)=>{const s=(t??"").toLowerCase();return!!(e==="text"&&s.startsWith("text/html"))},ct=async(e,t,s=async()=>null)=>{const r={},n=await s();n&&(r.Authorization=`Bearer ${n}`);const o=await se(e,{headers:r});if(o.status===202)throw new w("not-ready","Message body is still syncing",202,st(o.headers.get("Retry-After")));if(!o.ok){const d=o.headers.get(nt),l=at(o.status,d);throw new w(l,`Failed to load message body (${o.status} ${o.statusText})`,o.status)}const c=o.headers.get("content-type");if(it(t,c))throw new w("content-type-mismatch",`Refusing to render message body — expected ${t}, got Content-Type ${c}`);const m=await o.text();if(ot(m,c))throw new w("spa-shell-leak","Refusing to render message body — response looks like the SPA shell (CloudFront 403/404 fallback leaked through to /content/*)");return m},lt=async(e,t)=>(t.isRetryAfterNotReady&&await e.refetchDescribeMessage(),e.fetchContent(t.contentUrl,t.kind)),dt=({messageId:e,bodyParts:t,enabled:s=!0})=>{const r=t?tt(t):null,n=ee(),{getToken:o}=_(),c=g.useRef(null),m=B(),d=g.useRef(!1),l=g.useRef(null),h=e&&r?`${e}:${r.contentUrl}`:null;l.current!==h&&(l.current=h,d.current=!1);const u=te({queryKey:e?[...T.body(e),r?.contentUrl??null]:["messages","body","noop"],queryFn:()=>{if(!r)throw new Error("No renderable body part");if(!e)throw new Error("No messageId");const i=d.current;return d.current=!1,lt({fetchContent:(p,b)=>ct(p,b,o),refetchDescribeMessage:()=>m.refetchQueries({queryKey:$({path:{messageId:e}})})},{contentUrl:r.contentUrl,kind:r.kind,isRetryAfterNotReady:i})},enabled:s&&!!e&&!!r,staleTime:300*1e3,gcTime:1800*1e3,retry:(i,p)=>p instanceof w&&p.reason==="not-ready"?i<rt:i<1,retryDelay:(i,p)=>p instanceof w&&p.reason==="not-ready"?(d.current=!0,(p.retryAfterSeconds??1)*1e3):1e3,meta:{softError:!0}}),f=u.isLoading&&!!r;g.useEffect(()=>{f&&(c.current=performance.now())},[f]),g.useEffect(()=>{u.isSuccess&&c.current!==null&&(n.recordTiming("message.body.load",Math.round(performance.now()-c.current)),c.current=null)},[u.isSuccess,n]);const y=u.data&&r?{kind:r.kind,body:u.data}:void 0;return{picked:r,data:y,isLoading:f,isError:u.isError,error:u.error,refetch:u.refetch}},K=(e,t=Date.now())=>({value:e,setAt:t}),ut=(e,t,s,r)=>{if(e.addressId!==t)return e;const n={...e.flags??{}};return s?n.trusted=K(!0,r):delete n.trusted,{...e,flags:n}},mt=(e,t,s,r)=>{const n=o=>o.map(c=>ut(c,t,s,r));return{...e,envelope:{...e.envelope,from:n(e.envelope.from),to:n(e.envelope.to),cc:n(e.envelope.cc),bcc:n(e.envelope.bcc),replyTo:n(e.envelope.replyTo)}}},ft=({messageId:e})=>{const t=B(),{pushError:s}=re(),{mutate:r,isPending:n,error:o,reset:c}=ne({...oe(),onMutate:async d=>{const l=d.path.addressId,u=d.body.flags?.trusted?.value===!0,f=$({path:{messageId:e}});await t.cancelQueries({queryKey:f});const y=t.getQueriesData({queryKey:f}).filter(i=>i[1]!==void 0).map(([i,p])=>({queryKey:i,data:p}));return t.setQueriesData({queryKey:f},i=>i&&mt(i,l,u)),{describePrefix:f,previous:y}},onError:(d,l,h)=>{if(h)for(const u of h.previous)t.setQueryData(u.queryKey,u.data);s(ae("Couldn't trust sender","The change wasn't saved.",d))},onSettled:(d,l,h,u)=>{u&&t.invalidateQueries({queryKey:u.describePrefix})}});return{toggleTrusted:(d,l)=>{r({path:{addressId:d},body:{flags:{trusted:K(!l)}}})},isPending:n,error:o,reset:c}},ht=()=>{const[e,t]=g.useState(()=>typeof document<"u"&&document.documentElement.classList.contains("dark"));return g.useEffect(()=>{const s=document.documentElement,r=new MutationObserver(()=>{t(s.classList.contains("dark"))});return r.observe(s,{attributes:!0,attributeFilter:["class"]}),()=>r.disconnect()},[]),e},gt=({blockedImageCount:e,canAlwaysTrust:t,isTrustPending:s,onLoadOnce:r,onAlwaysTrust:n})=>a.jsxs("div",{className:"mb-3 flex items-center justify-between rounded-md bg-surface-sunken/50 px-3 py-2 text-sm",children:[a.jsxs("span",{className:"text-fg-muted",children:[e," image",e>1?"s":""," blocked for privacy"]}),a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("button",{type:"button",onClick:r,className:"text-accent hover:underline",children:"Load once"}),t&&a.jsx("button",{type:"button",onClick:n,"aria-busy":s,className:"text-accent hover:underline aria-busy:opacity-50",children:s?"Trusting…":"Always trust"})]})]}),pt=(e,t)=>{switch(e){case"auth":return{title:"Your session expired",detail:"Sign in again to reload the message body. Other parts of the app may also stop responding until you do."};case"body-missing":return{title:"Message body is missing in storage",detail:"A sync failure may have left this message without its body bytes. Contact support, or run the reconcile script to refetch from the upstream IMAP server."};case"content-type-mismatch":return{title:"Couldn't load message body",detail:"The server returned an unexpected content type for this part. The message body has not been rendered to keep you safe."};case"spa-shell-leak":return{title:"Couldn't load message body",detail:"The server returned the app shell instead of the message body. This is an infrastructure bug — please report it."};case"not-ready":return{title:"Message body is still syncing",detail:"This message's body hasn't finished downloading from the mail server yet. It should appear shortly — reopen the message to try again."};default:return{title:"Couldn't load message body",detail:t}}},yt=e=>e instanceof w?e.reason:"generic",bt=e=>e instanceof Error?e.message:typeof e=="string"?e:"An unexpected error occurred while loading the message body.",xt=({error:e,onRetry:t})=>{const s=yt(e),r=bt(e),{title:n,detail:o}=pt(s,r),[c,m]=g.useState(!1),{Account:d}=_();return c?null:a.jsxs("div",{role:"alert","data-testid":"message-body-error-banner","data-reason":s,className:"flex items-start gap-2 rounded-md border border-danger/40 bg-danger-soft px-3 py-2 text-sm",children:[a.jsx(ie,{className:"size-4 shrink-0 text-danger mt-0.5","aria-hidden":"true"}),a.jsxs("div",{className:"flex-1 min-w-0",children:[a.jsx("p",{className:"font-medium text-danger",children:n}),a.jsx("p",{className:"text-fg-muted mt-1 break-words",children:o})]}),a.jsxs("div",{className:"flex shrink-0 items-center gap-3",children:[s==="auth"&&a.jsx(d,{children:({signOut:l})=>a.jsx("button",{type:"button",onClick:()=>l(),className:"text-sm font-medium text-accent hover:underline",children:"Sign in again"})}),t&&a.jsx("button",{type:"button",onClick:t,className:"text-sm font-medium text-accent hover:underline",children:"Retry"}),a.jsx("button",{type:"button",onClick:()=>m(!0),"aria-label":"Dismiss message body error",className:"rounded-md p-1 text-fg-muted hover:bg-surface-raised hover:text-fg transition-colors",children:a.jsx(ce,{className:"size-4","aria-hidden":"true"})})]})]})},wt=()=>a.jsxs("div",{className:"animate-pulse space-y-2",role:"status","aria-label":"Loading message body",children:[a.jsx("div",{className:"h-4 bg-surface-sunken rounded w-full"}),a.jsx("div",{className:"h-4 bg-surface-sunken rounded w-11/12"}),a.jsx("div",{className:"h-4 bg-surface-sunken rounded w-3/4"}),a.jsx("div",{className:"h-4 bg-surface-sunken rounded w-5/6"})]}),M=()=>a.jsx("p",{className:"text-fg-muted text-sm italic",children:"This message has no body content."}),Ot=({bodyParts:e,html:t,text:s,isTrusted:r=!1,messageId:n,fromAddressId:o,category:c,className:m})=>{const[d,l]=g.useState(!1),h=r||d,u=ht(),{toggleTrusted:f,isPending:y}=ft({messageId:n??""}),i=!!e&&e.length>0,{picked:p,data:b,isLoading:v,isError:U,error:H,refetch:W}=dt({messageId:n,bodyParts:e,enabled:i}),G=g.useMemo(()=>he(e??[]),[e]),Q=i&&b?.kind==="html"?b.body:t,q=i&&b?.kind==="text"?b.body:s;if(i){if(v)return a.jsx("div",{className:x("message-body",m),children:a.jsx(wt,{})});if(U)return a.jsx("div",{className:x("message-body",m),children:a.jsx(xt,{error:H,onRetry:()=>W()})});if(!p)return a.jsx("div",{className:x("message-body",m),children:a.jsx(M,{})})}else if(!t&&!s)return a.jsx("div",{className:x("message-body",m),children:a.jsx(M,{})});const V=!!(o&&n),Y=()=>{!o||y||(l(!0),f(o,!1))};return a.jsx(Ye,{className:m,html:Q,text:q,isDark:u,category:c,allowImages:h,resolveCid:G,renderBlockedNotice:X=>a.jsx(gt,{blockedImageCount:X,canAlwaysTrust:V,isTrustPending:y,onLoadOnce:()=>l(!0),onAlwaysTrust:Y})})},P={personal:"Personal",uncategorized:"Unclassified",transactional:"Transactional",newsletter:"Newsletter",marketing:"Marketing",social:"Social",automated:"Automated"},vt=Object.values(D).map(e=>({value:e,label:P[e]})),kt={unclassified:"uncategorized"},At=[{name:"from",label:"Sender",values:"contact"},{name:"subject",label:"Subject",values:"text"},{name:"category",label:"Category",values:"fixed",options:vt},{name:"is",label:"State",values:"fixed",options:[{value:"unread",label:"Unread"},{value:"read",label:"Read"},{value:"starred",label:"Starred"}]},{name:"has",label:"Contents",values:"fixed",options:[{value:"attachment",label:"Has attachment"}]},{name:"in",label:"Folder",values:"mailbox"},{name:"account",label:"Account",values:"account"},{name:"after",label:"Sent on or after",values:"date"},{name:"before",label:"Sent before",values:"date"}],St=new Map(At.map(e=>[e.name,e])),It=e=>St.get(e.toLowerCase()),Et=/^\d{4}-\d{2}-\d{2}$/;function Tt(e,t,s){if(!Et.test(s))return;const r=Date.parse(`${s}T00:00:00Z`);if(!Number.isNaN(r))return{type:e,raw:t,value:s,epochSeconds:Math.floor(r/1e3)}}function Ct(e){const t=e.toLowerCase(),s=kt[t];return s||Object.values(D).find(n=>n===t)}function Nt(e,t){switch(t.toLowerCase()){case"unread":return{type:"isUnread",raw:e};case"read":return{type:"isRead",raw:e};case"starred":case"flagged":return{type:"isStarred",raw:e};default:return}}function Rt(e,t){const s=Ze(e);if(!s||s.value.length===0)return;const{name:r,value:n}=s;switch(r){case"from":return{type:"from",raw:e,value:n};case"subject":return{type:"subject",raw:e,value:n};case"category":{const o=Ct(n);return o?{type:"category",raw:e,value:n,category:o}:void 0}case"is":return Nt(e,n);case"has":return n.toLowerCase()==="attachment"?{type:"hasAttachment",raw:e}:void 0;case"before":case"after":return Tt(r,e,n);case"in":{const o=t.mailboxesByName?.get(n.toLowerCase());return o?{type:"in",raw:e,value:n,mailboxId:o}:void 0}case"account":{const o=t.accountsByName?.get(n.toLowerCase());return o?{type:"account",raw:e,value:n,accountId:o}:void 0}default:return}}function zt(e,t={}){const s=[],r=[];for(const n of F(e)){const o=Rt(n.raw,t);o?s.push(o):r.push(n.raw)}return{freeText:r.join(" "),tokens:s}}function Ft(e,t){return F(e).filter(s=>s.raw!==t.raw).map(s=>s.raw).join(" ")}function Kt(e){switch(e.type){case"from":return`From: ${e.value}`;case"subject":return`Subject: ${e.value}`;case"category":return`Category: ${P[e.category]}`;case"hasAttachment":return"Has attachment";case"isUnread":return"Unread";case"isRead":return"Read";case"isStarred":return"Starred";case"before":return`Before ${e.value}`;case"after":return`After ${e.value}`;case"in":return`In: ${e.value}`;case"account":return`Account: ${e.value}`}}function Pt(){const{mailboxNameIndex:e,accountNameIndex:t}=le();return{...de({select:r=>ue(r.matches)})?{}:{mailboxesByName:e},accountsByName:t}}export{Bt as M,$t as R,At as S,F as a,Ze as b,Ye as c,dt as d,ft as e,at as f,Ot as g,Kt as h,It as i,zt as p,Ft as r,Dt as s,Pt as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as L,
|
|
1
|
+
import{s as L,ac as C,ae as k,bu as I,bv as E,r as x,j as p,bw as h,bx as A,by as j,o as R,x as Q,bz as z}from"./index-BDlRWNu5.js";import{ai as D,aj as O,ak as _,al as N,am as P}from"./MailListHeader-ChgoSBi9.js";import{a as q}from"./useLabels-BCPsJjR6.js";import{M as w}from"./enums-CCxx0t2v.js";import{b as U,s as B}from"./nav-link-ChkTofbC.js";import{n as F}from"./search-query-Cr_ZXBCp.js";import{u as G,p as K}from"./useSearchTokenContext-CD-tKLIr.js";const V=t=>{const{mailboxId:s,messages:i}=t,l=L(),{pushError:c}=C(),{mutateAsync:r,isPending:a}=k({...E(),onError:(o,u)=>{c({title:u.body.action==="Remove"?"Couldn't remove label":"Couldn't apply label",detail:I(o),error:o})},onSettled:(o,u,m)=>{D(l,O(_(m.body.messageIds??[],i??[],s)))}});return{applyLabel:x.useCallback((o,u,m)=>{o.length!==0&&N(o,d=>r({body:{messageIds:d,labelId:u,action:m}}))},[r]),isPending:a}};function oe({accountId:t,mailboxId:s,messageIds:i}){const{labels:l}=q(t),{applyLabel:c}=V({mailboxId:s}),r=x.useMemo(()=>l.map(a=>({key:a.labelId,label:a.name,icon:p.jsx("span",{className:`size-2.5 rounded-full ${A(a.color)?h[a.color]:h.Default}`}),onSelect:()=>c(i,a.labelId,"Apply")})),[l,i,c]);return r.length===0?null:p.jsx(P,{triggerLabel:"Apply label to selected messages",triggerIcon:p.jsx(j,{className:"size-4 text-fg-subtle"}),triggerText:"Apply label",items:r,align:"start",nested:!0,touch:!1,triggerClassName:"min-h-11 w-full justify-start gap-3 px-4 py-2.5 text-sm font-normal text-fg"})}const $=20,H=new Set(Object.values(w)),J=t=>t!==void 0&&H.has(t)?t:void 0,W=t=>{if(t.some(s=>s.type==="isUnread"))return!1;if(t.some(s=>s.type==="isRead"))return!0};function ne({mailboxId:t,filterCategory:s}={}){const{searchQuery:i}=R(),l=G(),c=U({select:e=>e.matches}),r=F(i),{freeText:a,tokens:n}=K(r,l),o=a.length>0,u=n.find(e=>e.type==="category"),m=J(s)??u?.category,d=n.some(e=>e.type==="hasAttachment")?!0:void 0,b=n.some(e=>e.type==="isStarred")?!0:void 0,y=W(n),f=n.find(e=>e.type==="after"),g=n.find(e=>e.type==="before"),S=n.find(e=>e.type==="in"),v=B({matches:c,callerMailboxId:t,inTokenMailboxId:S?.mailboxId}),{data:M,isLoading:T}=Q({...z({query:{query:a,mailboxId:v,limit:$,...m!==void 0?{category:m}:{},...d!==void 0?{hasAttachment:d}:{},...b!==void 0?{hasStars:b}:{},...y!==void 0?{isRead:y}:{},...f?{sentDateFrom:f.epochSeconds}:{},...g?{sentDateTo:g.epochSeconds}:{}}}),enabled:o,staleTime:6e4});return{hits:M?.items??[],isLoading:o&&T}}export{oe as L,ne as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{s as l,ac as f,x as p,Y as m,r,ae as y,af as T,a0 as x,ag as E}from"./index-BDlRWNu5.js";const i={html:"",plainText:""},d=e=>{const u=l(),{pushError:o}=f(),{data:n}=p({...m(),staleTime:1/0}),c=r.useMemo(()=>{if(!e||!n)return i;const t=n.accounts.find(s=>s.accountId===e);return t?{html:t.signatureHtml??"",plainText:t.signaturePlainText??""}:i},[e,n]),a=y({...E(),onSuccess:()=>{u.invalidateQueries({queryKey:x()})},onError:t=>{o(T("Couldn't save signature","The signature wasn't saved.",t))}}),g=r.useCallback((t,s)=>{e&&a.mutate({path:{accountId:e},body:{signatureHtml:t,signaturePlainText:s}})},[e,a]);return{signature:c,setSignature:g,isSaving:a.isPending}};export{d as u};
|
package/index.html
CHANGED
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
} catch (_) {}
|
|
39
39
|
})();
|
|
40
40
|
</script>
|
|
41
|
-
<script type="module" crossorigin src="/assets/index-
|
|
41
|
+
<script type="module" crossorigin src="/assets/index-BDlRWNu5.js"></script>
|
|
42
42
|
<link rel="stylesheet" crossorigin href="/assets/index-DivxHcM7.css">
|
|
43
43
|
</head>
|
|
44
44
|
<body>
|