| 1234567891011 |
- import{a as e,n as t}from"./react-dom-stZKkA6x.js";import{a as n,d as r,r as i}from"./theme-DjPzgo6g.js";import{G as a,i as o,kt as s,n as c,st as ee,t as l}from"./jsx-runtime-dm82oUI8.js";import{o as u}from"./grid-BmaFEMOO.js";import{n as te,t as ne}from"./table-CSW7F8Qw.js";import{n as re,r as ie,t as d}from"./StatusPill-IFsKXy8H.js";import{t as f}from"./descriptions-vs1os_w7.js";import{t as p}from"./form-CvEcrSb3.js";import{t as ae}from"./input-0_Xo22Fl.js";import{t as oe}from"./modal-B8KcNGBa.js";import{t as se}from"./popconfirm-BStiKU4v.js";import{t as ce}from"./switch-CsMGEdLR.js";import{t as le}from"./CopyOutlined-DMc5GYOD.js";import{t as ue}from"./DeleteOutlined-B1WEjJYP.js";import{t as de}from"./EditOutlined-_SvZHznu.js";import{t as m}from"./PlusOutlined-DWXMp6Ds.js";import{t as h}from"./ReloadOutlined-C3S2BDne.js";import{t as fe}from"./ThunderboltOutlined-CbXdMhP9.js";import{_ as pe,b as me,f as he,h as ge,o as _e,p as ve}from"./index-BCIgegZI.js";import{t as g}from"./EmptyState-rI31ioMm.js";import{t as ye}from"./CodeBlock--Yutv0IZ.js";import{n as be,t as xe}from"./navigation-state-ixI_efPF.js";var _=e(t(),1),v=l(),Se=[`sent`,`bounced`,`failed`,`opened`,`clicked`],Ce=[...Se,`received`],we=[`pending`,`processing`,`success`,`dead`];function y({domainId:e,mailboxId:t,domains:l=[],mailboxes:y=[],onCopy:Ae}){let{message:b}=r.useApp(),{t:x}=n(),S=he(),je=ve(),[C,Me]=ge(),Ne=Number(C.get(`domainId`)||0)||void 0,Pe=Number(C.get(`mailboxId`)||0)||void 0,w=Ee(C.get(`webhookId`)),T=De(C.get(`deliveryStatus`)),E=Oe(C.get(`deliveryEvent`)),D=e??Ne,O=t??Pe,Fe=e!=null||t!=null,[k,Ie]=(0,_.useState)([]),[Le,Re]=(0,_.useState)([]),[A,j]=(0,_.useState)([]),[ze,M]=(0,_.useState)(!1),[Be,N]=(0,_.useState)(``),[P,Ve]=(0,_.useState)(l),[He,Ue]=(0,_.useState)(y),[F,We]=(0,_.useState)(!0),[I,L]=(0,_.useState)(``),[Ge,Ke]=(0,_.useState)(!1),[R,z]=(0,_.useState)(null),[B,V]=(0,_.useState)(null),[H]=p.useForm(),U=(0,_.useRef)(0),W=O!=null,G=D!=null||W,K=W?[`received`]:Se,qe=(0,_.useMemo)(()=>new Map(P.map(e=>[e.id,e.domain])),[P]),Je=(0,_.useMemo)(()=>new Map(He.map(e=>[e.id,e.address])),[He]),q=(0,_.useMemo)(()=>w&&k.find(e=>e.id===w)||null,[w,k]),J=(0,_.useCallback)(async()=>{We(!0);try{let e=!l.length||!y.length?[i.domains(),i.inboundMailboxes()]:null,[t,n,r]=await Promise.all([i.webhooks(W?void 0:D??void 0,O),i.webhookDeliveries({limit:100}),e?Promise.all(e):Promise.resolve(null)]);r&&(Ve(r[0].domains||[]),Ue(r[1].mailboxes||[]));let a=(t.webhooks||[]).filter(e=>G||e.mailboxId==null);Ie(a);let o=new Set(a.map(e=>e.id)),s=(n.deliveries||[]).filter(e=>G?o.has(e.webhookId):!0);Re(s)}catch(e){b.error(e instanceof Error?e.message:x(`common.error`))}finally{We(!1)}},[D,l.length,O,W,y.length,b,G,x]);(0,_.useEffect)(()=>{l.length&&Ve(l)},[l]),(0,_.useEffect)(()=>{y.length&&Ue(y)},[y]),(0,_.useEffect)(()=>{J()},[J]);let Ye=(0,_.useMemo)(()=>{let e=new Map;for(let t of Le)e.has(t.webhookId)||e.set(t.webhookId,t);return e},[Le]),Y=(0,_.useCallback)(async()=>{let e=++U.current;if(!w){j([]),N(``),M(!1);return}j([]),N(``),M(!0);try{let t=await i.webhookDeliveries({webhookId:w,status:T===`all`?void 0:T,eventType:E===`all`?void 0:E,limit:200});e===U.current&&j(t.deliveries||[])}catch(t){e===U.current&&N(t instanceof Error?t.message:x(`common.error`))}finally{e===U.current&&M(!1)}},[E,T,w,x]);(0,_.useEffect)(()=>{Y()},[Y]);async function X(e){if(e){if(Ae){Ae(e);return}await navigator.clipboard.writeText(e),b.success(x(`common.copied`))}}function Xe(){z(null),H.setFieldsValue({name:``,url:``,events:[...K],domainId:W?void 0:D??void 0,enabled:!0}),Ke(!0)}function Ze(e){z(e),H.setFieldsValue({name:e.name,url:e.url,events:e.events?.length?[...e.events]:[...K],domainId:e.domainId??void 0,enabled:e.enabled}),Ke(!0)}function Z(){Ke(!1),z(null),H.resetFields()}async function Qe(){let e=await H.validateFields(),t=R?`save:${R.id}`:`create`;L(t);try{let t={name:e.name.trim(),url:e.url.trim(),events:e.events,domainId:W?null:D??e.domainId??null,mailboxId:W?O:null,enabled:e.enabled};if(R)await i.updateWebhook(R.id,t),b.success(x(`actions.webhookUpdated`)),Z(),await J();else{let e=await i.createWebhook(t);b.success(x(`actions.webhookCreated`)),Z(),e.webhook?.secret&&V({webhook:e.webhook,mode:`created`}),await J()}}catch(e){b.error(e instanceof Error?e.message:x(`common.error`))}finally{L(``)}}async function $e(e,t){L(`toggle:${e.id}`);try{await i.updateWebhook(e.id,{enabled:t}),Ie(n=>n.map(n=>n.id===e.id?{...n,enabled:t}:n))}catch(e){b.error(e instanceof Error?e.message:x(`common.error`))}finally{L(``)}}async function et(e){L(`delete:${e.id}`);try{await i.deleteWebhook(e.id),b.success(x(`actions.webhookDeleted`)),w===e.id&&at(),await J()}catch(e){b.error(e instanceof Error?e.message:x(`common.error`))}finally{L(``)}}async function tt(e){L(`rotate:${e.id}`);try{let t=await i.rotateWebhookSecret(e.id);b.success(x(`actions.webhookSecretRotated`)),t.webhook?.secret&&V({webhook:t.webhook,mode:`rotated`}),await J()}catch(e){b.error(e instanceof Error?e.message:x(`common.error`))}finally{L(``)}}async function nt(e){L(`test:${e.id}`);try{await i.testWebhook(e.id),b.success(x(`actions.webhookTestQueued`)),await J(),it(e)}catch(e){b.error(e instanceof Error?e.message:x(`common.error`))}finally{L(``)}}async function rt(e){L(`replay:${e.id}`);try{await i.replayWebhookDelivery(e.id),b.success(x(`actions.webhookDeliveryReplayed`)),await Promise.all([J(),Y()])}catch(e){b.error(e instanceof Error?e.message:x(`common.error`))}finally{L(``)}}function it(e){let t=new URLSearchParams(C);t.set(`webhookId`,String(e.id)),t.delete(`deliveryStatus`),t.delete(`deliveryEvent`),Me(t,{state:xe(`${S.pathname}${S.search}`,1)})}function at(){let e=be(S.state);if(e){je(-e.depth);return}let t=new URLSearchParams(C);t.delete(`webhookId`),t.delete(`deliveryStatus`),t.delete(`deliveryEvent`),Me(t,{replace:!0,state:null})}function ot(e,t){let n=new URLSearchParams(C);t===`all`?n.delete(e):n.set(e,t);let r=be(S.state);if(!r){Me(n,{replace:!0});return}let i=n.toString();je({pathname:S.pathname,search:i?`?${i}`:``},{state:xe(r.listPath,r.depth+1)})}function st(e){if(e.mailboxId!=null){let t=Je.get(e.mailboxId);return t?`${x(`webhooks.scopeMailbox`)} · ${t}`:x(`webhooks.scopeMailbox`)}if(e.domainId==null)return x(`webhooks.scopeAccount`);let t=qe.get(e.domainId);return t?`${x(`webhooks.scopeDomain`)} · ${t}`:x(`webhooks.scopeDomain`)}function Q(e){return e===`sent`?x(`webhooks.eventSent`):e===`bounced`?x(`webhooks.eventBounced`):e===`failed`?x(`webhooks.eventFailed`):e===`opened`?x(`webhooks.eventOpened`):e===`clicked`?x(`webhooks.eventClicked`):e===`received`?x(`webhooks.eventReceived`):e}function $(e){return e===`pending`?x(`webhooks.statusPending`):e===`processing`?x(`webhooks.statusProcessing`):e===`success`?x(`webhooks.statusSuccess`):e===`dead`?x(`webhooks.statusDead`):e}function ct(e){return e===`success`?`success`:e===`pending`?`info`:e===`processing`?`warning`:e===`dead`?`error`:`neutral`}function lt(e){let t=Ye.get(e.id);if(!t)return(0,v.jsx)(c.Text,{type:`secondary`,children:`—`});let n=t.error||(t.responseStatus==null?``:`HTTP ${t.responseStatus}`)||$(String(t.status));return(0,v.jsxs)(o,{size:6,wrap:!0,children:[(0,v.jsx)(d,{tone:ct(String(t.status)),children:$(String(t.status))}),(0,v.jsxs)(c.Text,{type:`secondary`,ellipsis:!0,className:`inline-code-value`,children:[Q(String(t.eventType)),` · `,n]})]})}let ut=[{title:x(`webhooks.name`),dataIndex:`name`,render:(e,t)=>(0,v.jsxs)(o,{direction:`vertical`,size:0,children:[(0,v.jsx)(c.Text,{strong:!0,children:e}),(0,v.jsxs)(c.Text,{type:`secondary`,code:!0,children:[t.secretPrefix,`…`]})]})},{title:x(`webhooks.scope`),render:(e,t)=>st(t)},{title:x(`webhooks.url`),dataIndex:`url`,ellipsis:!0,render:e=>(0,v.jsx)(c.Text,{code:!0,ellipsis:!0,title:e,className:`inline-code-value`,children:Te(e)})},{title:x(`webhooks.events`),dataIndex:`events`,render:e=>(0,v.jsx)(o,{size:[4,4],wrap:!0,children:(e||[]).map(e=>(0,v.jsx)(pe,{children:Q(e)},e))})},{title:x(`webhooks.enabled`),dataIndex:`enabled`,width:100,render:(e,t)=>(0,v.jsx)(ce,{checked:e,loading:I===`toggle:${t.id}`,onChange:e=>void $e(t,e),checkedChildren:x(`webhooks.enabled`),unCheckedChildren:x(`webhooks.disabled`)})},{title:x(`webhooks.lastAttemptAt`),render:(e,t)=>lt(t)},{title:x(`webhooks.actions`),fixed:`right`,width:280,render:(e,t)=>(0,v.jsxs)(o,{wrap:!0,size:4,children:[(0,v.jsx)(s,{size:`small`,icon:(0,v.jsx)(fe,{}),loading:I===`test:${t.id}`,onClick:()=>void nt(t),children:x(`webhooks.test`)}),(0,v.jsx)(s,{size:`small`,onClick:()=>it(t),children:x(`webhooks.viewDeliveries`)}),(0,v.jsx)(s,{size:`small`,icon:(0,v.jsx)(de,{}),onClick:()=>Ze(t)}),(0,v.jsx)(se,{title:x(`webhooks.rotateConfirm`),onConfirm:()=>void tt(t),children:(0,v.jsx)(s,{"aria-label":x(`webhooks.rotateSecret`),size:`small`,icon:(0,v.jsx)(_e,{}),loading:I===`rotate:${t.id}`})}),(0,v.jsx)(se,{title:x(`webhooks.deleteConfirm`),onConfirm:()=>void et(t),children:(0,v.jsx)(s,{"aria-label":x(`common.delete`),size:`small`,danger:!0,icon:(0,v.jsx)(ue,{}),loading:I===`delete:${t.id}`})})]})}],dt=[{title:x(`webhooks.createdAt`),dataIndex:`createdAt`,width:170,render:e=>e?new Date(e).toLocaleString():`—`},{title:x(`webhooks.events`),dataIndex:`eventType`,render:e=>(0,v.jsx)(pe,{children:Q(e)})},{title:x(`common.status`),dataIndex:`status`,render:e=>(0,v.jsx)(d,{tone:ct(e),children:$(e)})},{title:x(`webhooks.attemptCount`),dataIndex:`attemptCount`,width:90},{title:x(`webhooks.responseStatus`),dataIndex:`responseStatus`,width:100,render:e=>e??`—`},{title:x(`webhooks.error`),dataIndex:`error`,ellipsis:!0,render:(e,t)=>e||t.responseBodyPreview||`—`},{title:x(`webhooks.lastAttemptAt`),dataIndex:`lastAttemptAt`,width:170,render:e=>e?new Date(e).toLocaleString():`—`},{title:x(`webhooks.actions`),fixed:`right`,width:110,render:(e,t)=>(0,v.jsx)(s,{size:`small`,disabled:t.status===`processing`,loading:I===`replay:${t.id}`,onClick:()=>void rt(t),children:x(`webhooks.replay`)})}],ft=B?.webhook.secret||``,pt=ke(ft||`whsec_your_secret`);return(0,v.jsxs)(o,{direction:`vertical`,size:20,className:`full-width`,children:[Fe?(0,v.jsxs)(o,{direction:`vertical`,size:12,className:`full-width`,children:[(0,v.jsx)(u,{type:`info`,showIcon:!0,message:x(W?`webhooks.mailboxReceiptHelp`:`webhooks.domainOverrideHelp`)}),(0,v.jsxs)(o,{children:[(0,v.jsx)(s,{icon:(0,v.jsx)(h,{}),onClick:()=>void J(),loading:F,children:x(`common.refresh`)}),(0,v.jsx)(s,{type:`primary`,icon:(0,v.jsx)(m,{}),onClick:Xe,children:x(`webhooks.create`)})]})]}):(0,v.jsx)(ie,{title:x(`webhooks.title`),subtitle:x(`webhooks.subtitle`),extra:(0,v.jsxs)(o,{children:[(0,v.jsx)(s,{icon:(0,v.jsx)(h,{}),onClick:()=>void J(),loading:F,children:x(`common.refresh`)}),(0,v.jsx)(s,{type:`primary`,icon:(0,v.jsx)(m,{}),onClick:Xe,children:x(`webhooks.create`)})]})}),Fe?null:(0,v.jsx)(u,{type:`info`,showIcon:!0,message:x(W?`webhooks.mailboxReceiptHelp`:`webhooks.domainOverrideHelp`)}),(0,v.jsx)(re,{title:x(`webhooks.listTitle`),extra:(0,v.jsx)(d,{tone:`neutral`,children:k.length}),children:k.length?(0,v.jsx)(ne,{rowKey:`id`,columns:ut,dataSource:k,loading:F,scroll:{x:1200},pagination:{pageSize:10}}):(0,v.jsx)(g,{description:x(`webhooks.empty`),action:(0,v.jsx)(s,{icon:(0,v.jsx)(m,{}),onClick:Xe,children:x(`webhooks.create`)})})}),(0,v.jsx)(me,{title:x(R?`webhooks.editTitle`:`webhooks.createTitle`),width:520,open:Ge,onClose:Z,destroyOnHidden:!0,footer:(0,v.jsxs)(`div`,{className:`drawer-footer`,children:[(0,v.jsx)(s,{onClick:Z,children:x(`common.cancel`)}),(0,v.jsx)(s,{type:`primary`,loading:I===`create`||I.startsWith(`save:`),onClick:()=>void Qe(),children:x(R?`common.save`:`webhooks.create`)})]}),children:(0,v.jsxs)(p,{form:H,layout:`vertical`,initialValues:{enabled:!0,events:Se},children:[(0,v.jsx)(p.Item,{name:`name`,label:x(`webhooks.name`),rules:[{required:!0,message:x(`webhooks.nameRequired`)}],children:(0,v.jsx)(ae,{placeholder:x(`webhooks.namePlaceholder`)})}),(0,v.jsx)(p.Item,{name:`url`,label:x(`webhooks.url`),extra:x(`webhooks.urlHint`),rules:[{required:!0,message:x(`webhooks.urlRequired`)}],children:(0,v.jsx)(ae,{placeholder:x(`webhooks.urlPlaceholder`)})}),(0,v.jsx)(p.Item,{name:`events`,label:x(`webhooks.events`),rules:[{required:!0,type:`array`,min:1,message:x(`webhooks.eventsRequired`)}],children:(0,v.jsx)(te.Group,{options:K.map(e=>({value:e,label:Q(e)})),disabled:W})}),G?null:(0,v.jsx)(p.Item,{name:`domainId`,label:x(`webhooks.domain`),extra:x(`webhooks.domainAccount`),children:(0,v.jsx)(a,{allowClear:!0,placeholder:x(`webhooks.domainAccount`),options:P.map(e=>({value:e.id,label:e.domain}))})}),(0,v.jsx)(p.Item,{name:`enabled`,label:x(`webhooks.enabled`),valuePropName:`checked`,children:(0,v.jsx)(ce,{})})]})}),(0,v.jsx)(me,{title:q?`${q.name} · ${x(`webhooks.deliveriesTitle`)}`:x(`webhooks.deliveriesTitle`),width:760,open:!!w,onClose:at,children:F&&!q?(0,v.jsx)(`div`,{role:`status`,"aria-label":x(`webhooks.deliveriesTitle`),children:(0,v.jsx)(ee,{active:!0,paragraph:{rows:8}})}):q?(0,v.jsxs)(o,{direction:`vertical`,size:20,className:`full-width`,children:[(0,v.jsxs)(f,{bordered:!0,column:1,size:`small`,children:[(0,v.jsx)(f.Item,{label:x(`webhooks.url`),children:(0,v.jsx)(c.Text,{code:!0,copyable:{onCopy:()=>void X(q.url)},children:q.url})}),(0,v.jsx)(f.Item,{label:x(`webhooks.scope`),children:st(q)}),(0,v.jsx)(f.Item,{label:x(`webhooks.events`),children:(0,v.jsx)(o,{wrap:!0,children:q.events.map(e=>(0,v.jsx)(pe,{children:Q(e)},e))})}),(0,v.jsx)(f.Item,{label:x(`webhooks.secretPrefix`),children:(0,v.jsxs)(c.Text,{code:!0,children:[q.secretPrefix,`…`]})}),(0,v.jsx)(f.Item,{label:x(`common.status`),children:(0,v.jsx)(d,{tone:q.enabled?`success`:`neutral`,children:q.enabled?x(`webhooks.enabled`):x(`webhooks.disabled`)})})]}),(0,v.jsxs)(o,{wrap:!0,children:[(0,v.jsx)(a,{"aria-label":x(`webhooks.deliveriesFilterStatus`),style:{minWidth:160},value:T,onChange:e=>ot(`deliveryStatus`,e),options:[{value:`all`,label:x(`webhooks.allStatuses`)},...we.map(e=>({value:e,label:$(e)}))]}),(0,v.jsx)(a,{"aria-label":x(`webhooks.deliveriesFilterEvent`),style:{minWidth:160},value:E,onChange:e=>ot(`deliveryEvent`,e),options:[{value:`all`,label:x(`webhooks.allEvents`)},...Ce.map(e=>({value:e,label:Q(e)}))]})]}),Be?(0,v.jsx)(u,{type:`error`,showIcon:!0,message:Be,action:(0,v.jsx)(s,{icon:(0,v.jsx)(h,{}),onClick:()=>void Y(),children:x(`common.refresh`)})}):ze&&!A.length?(0,v.jsx)(`div`,{role:`status`,"aria-label":x(`webhooks.deliveriesTitle`),children:(0,v.jsx)(ee,{active:!0,paragraph:{rows:6}})}):A.length?(0,v.jsx)(ne,{rowKey:`id`,columns:dt,dataSource:A,loading:ze,scroll:{x:920},pagination:{pageSize:10}}):(0,v.jsx)(g,{description:x(`webhooks.deliveriesEmpty`)}),(0,v.jsx)(u,{type:`info`,showIcon:!0,message:x(`webhooks.docsSignature`),description:x(`webhooks.docsEvents`)}),(0,v.jsx)(ye,{value:ke(`whsec_your_secret`),onCopy:X})]}):w?(0,v.jsx)(g,{description:x(`common.notFound`)}):null}),(0,v.jsx)(oe,{title:B?.mode===`rotated`?x(`webhooks.secretRotatedTitle`):x(`webhooks.secretCreatedTitle`),open:!!B,closable:!1,maskClosable:!1,keyboard:!1,destroyOnHidden:!0,footer:[(0,v.jsx)(s,{icon:(0,v.jsx)(le,{}),onClick:()=>void X(ft),children:x(`webhooks.copySecret`)},`copy`),(0,v.jsx)(s,{type:`primary`,onClick:()=>V(null),children:x(`common.confirm`)},`done`)],children:(0,v.jsxs)(o,{direction:`vertical`,size:16,className:`full-width`,children:[(0,v.jsx)(u,{type:`error`,showIcon:!0,message:x(`webhooks.secretCreatedWarning`)}),(0,v.jsxs)(`div`,{children:[(0,v.jsx)(c.Text,{type:`secondary`,children:x(`webhooks.secret`)}),(0,v.jsx)(ye,{value:ft,onCopy:X})]}),(0,v.jsxs)(`div`,{children:[(0,v.jsx)(c.Text,{type:`secondary`,children:x(`webhooks.docsSignature`)}),(0,v.jsx)(ye,{value:pt,onCopy:X})]})]})})]})}function Te(e,t=48){return e?e.length<=t?e:`${e.slice(0,t-1)}…`:``}function Ee(e){let t=Number(e);return Number.isInteger(t)&&t>0?t:null}function De(e){return we.includes(e)?e:`all`}function Oe(e){return Ce.includes(e)?e:`all`}function ke(e){return`// Verify X-MailHub-Signature (Node.js)
- const crypto = require('crypto');
- function verify(rawBody, signatureHeader, secret = ${JSON.stringify(e)}) {
- const parts = Object.fromEntries(
- signatureHeader.split(',').map((p) => p.trim().split('='))
- );
- const signed = \`\${parts.t}.\${rawBody}\`;
- const expected = crypto.createHmac('sha256', secret).update(signed).digest('hex');
- return crypto.timingSafeEqual(Buffer.from(parts.v1, 'hex'), Buffer.from(expected, 'hex'));
- }`}export{y as default};
|