// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-3.0-or-later // @source: https://gitlab.com/soapbox-pub/ditto/-/tree/f0a3877c import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{Bi as t,Et as n,F as r,Fi as i,Ft as a,Kn as o,Oi as s,a as c,h as l,ni as u,qi as d,r as ee}from"./lucide-icons-BdRF0moN.js";import{t as f}from"./jsx-runtime-By8HlURe.js";import{t as te}from"./useAppContext-Ughdk2-Z.js";import{o as p,r as m}from"./react-intl-eZirkCBg.js";import{s as h}from"./useCurrentUser-C6OJJlWo.js";import{t as g}from"./button-Cs26nq0r.js";import{t as _}from"./input-CM5Fnyvy.js";import{t as v}from"./esplora-CScU9uce.js";import{c as y,n as b,t as x}from"./dialog-C3CFmras.js";import{t as S}from"./textarea-B93xm6Zg.js";import{t as C}from"./badge-eEdLlpTp.js";import{n as w,t as T}from"./card-CthSADjg.js";import{t as ne}from"./label-BBIj2Nkw.js";import{t as E}from"./separator-CWY6Ovdb.js";import{$ as re}from"./index-CYEZWNq6.js";import{t as ie}from"./useWallet-K4u1NkjW.js";var D=e(d(),1),O=f();function k(){let e=p(),[d,f]=(0,D.useState)(!1),[k,A]=(0,D.useState)(``),[j,M]=(0,D.useState)(``),[N,P]=(0,D.useState)(!1),{connections:F,activeConnection:I,connectionInfo:L,addConnection:R,removeConnection:z,setActiveConnection:B}=re(),{webln:V}=ie(),H=F.length>0&&F.some(e=>e.isConnected),{toast:U}=h(),{config:W,updateConfig:G}=te(),K=W.esploraApis,[q,J]=(0,D.useState)(``),Y=e=>{let t=e.trim();try{return new URL(t).toString().replace(/\/+$/,``)}catch{try{return new URL(`https://${t}`).toString().replace(/\/+$/,``)}catch{return t}}},ae=e=>{let t=Y(e);try{let e=new URL(t);return e.protocol===`https:`||e.protocol===`http:`}catch{return!1}},X=e=>{G(t=>({...t,esploraApis:e}))},Z=()=>{if(!ae(q)){U({title:e.formatMessage({id:`settings.wallet.invalidApiUrl`,defaultMessage:`Invalid API URL`}),description:e.formatMessage({id:`settings.wallet.invalidApiUrlDescription`,defaultMessage:`Enter a valid HTTPS URL (e.g. https://mempool.space/api)`}),variant:`destructive`});return}let t=Y(q);if(K.includes(t)){U({title:e.formatMessage({id:`settings.wallet.alreadyInList`,defaultMessage:`Already in the list`}),variant:`destructive`});return}X([...K,t]),J(``)},oe=t=>{if(K.length<=1){U({title:e.formatMessage({id:`settings.wallet.oneApiRequired`,defaultMessage:`At least one API is required`}),description:e.formatMessage({id:`settings.wallet.oneApiRequiredDescription`,defaultMessage:`Add another endpoint before removing this one, or restore the defaults.`}),variant:`destructive`});return}X(K.filter(e=>e!==t))},Q=(e,t)=>{let n=e+t;if(n<0||n>=K.length)return;let r=[...K];[r[e],r[n]]=[r[n],r[e]],X(r)},se=()=>{X([...v]),U({title:e.formatMessage({id:`settings.wallet.apisRestored`,defaultMessage:`Bitcoin APIs restored to defaults`})})},$=K.length===v.length&&K.every((e,t)=>e===v[t]),ce=e=>{try{let t=new URL(e);return t.host+(t.pathname===`/`?``:t.pathname)}catch{return e}},le=async()=>{if(!k.trim()){U({title:e.formatMessage({id:`settings.wallet.connectionUriRequired`,defaultMessage:`Connection URI required`}),description:e.formatMessage({id:`settings.wallet.connectionUriRequiredDescription`,defaultMessage:`Please enter a valid NWC connection URI.`}),variant:`destructive`});return}P(!0);try{await R(k.trim(),j.trim()||void 0)&&(A(``),M(``),f(!1))}finally{P(!1)}},ue=e=>{z(e)},de=t=>{B(t),U({title:e.formatMessage({id:`settings.wallet.activeWalletChanged`,defaultMessage:`Active wallet changed`}),description:e.formatMessage({id:`settings.wallet.activeWalletChangedDescription`,defaultMessage:`The selected wallet is now active for zaps.`})})};return(0,O.jsxs)(O.Fragment,{children:[(0,O.jsxs)(`div`,{className:`space-y-6`,children:[(0,O.jsxs)(`div`,{className:`space-y-3`,children:[(0,O.jsx)(`h2`,{className:`text-sm font-semibold text-muted-foreground uppercase tracking-wide px-1`,children:(0,O.jsx)(m,{id:`settings.wallet.status`,defaultMessage:`Status`})}),(0,O.jsxs)(`div`,{className:`grid gap-3`,children:[(0,O.jsx)(T,{className:`overflow-hidden`,children:(0,O.jsxs)(w,{className:`flex items-center justify-between p-4`,children:[(0,O.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,O.jsx)(`div`,{className:`flex items-center justify-center size-9 rounded-full bg-secondary`,children:(0,O.jsx)(o,{className:`size-4 text-muted-foreground`})}),(0,O.jsxs)(`div`,{children:[(0,O.jsx)(`p`,{className:`text-sm font-medium`,children:`WebLN`}),(0,O.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:(0,O.jsx)(m,{id:`settings.wallet.weblnDescription`,defaultMessage:`Browser extension`})})]})]}),(0,O.jsxs)(`div`,{className:`flex items-center gap-2`,children:[V&&(0,O.jsx)(u,{className:`size-4 text-green-500`}),(0,O.jsx)(C,{variant:V?`default`:`secondary`,className:`text-xs`,children:V?(0,O.jsx)(m,{id:`settings.wallet.ready`,defaultMessage:`Ready`}):(0,O.jsx)(m,{id:`settings.wallet.notFound`,defaultMessage:`Not Found`})})]})]})}),(0,O.jsx)(T,{className:`overflow-hidden`,children:(0,O.jsxs)(w,{className:`flex items-center justify-between p-4`,children:[(0,O.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,O.jsx)(`div`,{className:`flex items-center justify-center size-9 rounded-full bg-secondary`,children:(0,O.jsx)(l,{className:`size-4 text-muted-foreground`})}),(0,O.jsxs)(`div`,{children:[(0,O.jsx)(`p`,{className:`text-sm font-medium`,children:`Nostr Wallet Connect`}),(0,O.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:F.length>0?(0,O.jsx)(m,{id:`settings.wallet.walletsConnected`,defaultMessage:`{count, plural, one {{count} wallet connected} other {{count} wallets connected}}`,values:{count:F.length}}):(0,O.jsx)(m,{id:`settings.wallet.remoteWalletConnection`,defaultMessage:`Remote wallet connection`})})]})]}),(0,O.jsxs)(`div`,{className:`flex items-center gap-2`,children:[H&&(0,O.jsx)(u,{className:`size-4 text-green-500`}),(0,O.jsx)(C,{variant:H?`default`:`secondary`,className:`text-xs`,children:H?(0,O.jsx)(m,{id:`settings.wallet.ready`,defaultMessage:`Ready`}):(0,O.jsx)(m,{id:`settings.wallet.none`,defaultMessage:`None`})})]})]})})]})]}),(0,O.jsx)(E,{}),(0,O.jsxs)(`div`,{className:`space-y-4`,children:[(0,O.jsxs)(`div`,{className:`flex items-center justify-between px-1`,children:[(0,O.jsx)(`h2`,{className:`text-sm font-semibold text-muted-foreground uppercase tracking-wide`,children:`Nostr Wallet Connect`}),(0,O.jsxs)(g,{size:`sm`,variant:`outline`,onClick:()=>f(!0),className:`rounded-full`,children:[(0,O.jsx)(a,{className:`size-4 mr-1`}),(0,O.jsx)(m,{id:`common.add`,defaultMessage:`Add`})]})]}),F.length===0?(0,O.jsx)(T,{className:`border-dashed`,children:(0,O.jsxs)(w,{className:`py-10 text-center`,children:[(0,O.jsx)(l,{className:`size-8 mx-auto mb-3 text-muted-foreground/50`}),(0,O.jsx)(`p`,{className:`text-sm text-muted-foreground mb-1`,children:(0,O.jsx)(m,{id:`settings.wallet.noWallets`,defaultMessage:`No wallets connected`})}),(0,O.jsx)(`p`,{className:`text-xs text-muted-foreground/70`,children:(0,O.jsx)(m,{id:`settings.wallet.noWalletsDescription`,defaultMessage:`Add an NWC connection to enable instant zaps.`})})]})}):(0,O.jsx)(`div`,{className:`space-y-2`,children:F.map(t=>{let n=L[t.connectionString],i=I===t.connectionString;return(0,O.jsx)(T,{className:i?`ring-2 ring-primary`:``,children:(0,O.jsxs)(w,{className:`flex items-center justify-between p-4`,children:[(0,O.jsxs)(`div`,{className:`flex items-center gap-3 min-w-0`,children:[(0,O.jsx)(`div`,{className:`flex items-center justify-center size-9 rounded-full bg-secondary shrink-0`,children:(0,O.jsx)(l,{className:`size-4 text-muted-foreground`})}),(0,O.jsxs)(`div`,{className:`min-w-0`,children:[(0,O.jsx)(`p`,{className:`text-sm font-medium truncate`,children:t.alias||n?.alias||(0,O.jsx)(m,{id:`settings.wallet.lightningWallet`,defaultMessage:`Lightning Wallet`})}),(0,O.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:i?(0,O.jsx)(m,{id:`settings.wallet.active`,defaultMessage:`Active`}):(0,O.jsx)(m,{id:`settings.wallet.nwcConnection`,defaultMessage:`NWC Connection`})})]})]}),(0,O.jsxs)(`div`,{className:`flex items-center gap-1 shrink-0`,children:[i&&(0,O.jsx)(u,{className:`size-4 text-green-500 mr-1`}),!i&&(0,O.jsx)(g,{size:`sm`,variant:`ghost`,onClick:()=>de(t.connectionString),className:`rounded-full`,title:e.formatMessage({id:`settings.wallet.setAsActive`,defaultMessage:`Set as active`}),children:(0,O.jsx)(ee,{className:`size-3.5`})}),(0,O.jsx)(g,{size:`sm`,variant:`ghost`,onClick:()=>ue(t.connectionString),className:`rounded-full text-muted-foreground hover:text-destructive`,title:e.formatMessage({id:`settings.wallet.removeWallet`,defaultMessage:`Remove wallet`}),children:(0,O.jsx)(r,{className:`size-3.5`})})]})]})},t.connectionString)})})]}),!V&&F.length===0&&(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(E,{}),(0,O.jsx)(`div`,{className:`text-center py-4 space-y-2 px-4`,children:(0,O.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:(0,O.jsx)(m,{id:`settings.wallet.installHelp`,defaultMessage:`Install a WebLN browser extension or connect a NWC wallet to send zaps.`})})})]}),(0,O.jsx)(E,{}),(0,O.jsxs)(`div`,{className:`space-y-4`,children:[(0,O.jsxs)(`div`,{className:`flex items-center justify-between px-1`,children:[(0,O.jsx)(`h2`,{className:`text-sm font-semibold text-muted-foreground uppercase tracking-wide`,children:(0,O.jsx)(m,{id:`settings.wallet.bitcoinApis`,defaultMessage:`Bitcoin APIs`})}),(0,O.jsxs)(g,{size:`sm`,variant:`ghost`,onClick:se,disabled:$,className:`rounded-full text-xs h-7`,title:e.formatMessage({id:`settings.wallet.restoreDefaultsTitle`,defaultMessage:`Restore the default mempool.space → mempool.emzy.de → blockstream.info list`}),children:[(0,O.jsx)(n,{className:`size-3.5 mr-1`}),(0,O.jsx)(m,{id:`settings.wallet.restoreDefaults`,defaultMessage:`Restore defaults`})]})]}),(0,O.jsx)(`p`,{className:`text-xs text-muted-foreground px-1`,children:(0,O.jsx)(m,{id:`settings.wallet.bitcoinApisDescription`,defaultMessage:`Esplora-compatible Bitcoin REST endpoints used by the wallet, on-chain zaps, and tx/address pages. Tried in order — if the top one is rate-limited or down, the next is tried automatically. Reorder so your preferred endpoint is first.`})}),(0,O.jsx)(`div`,{className:`space-y-2`,children:K.map((n,a)=>(0,O.jsx)(T,{children:(0,O.jsxs)(w,{className:`flex items-center justify-between gap-2 p-3`,children:[(0,O.jsxs)(`div`,{className:`flex items-center gap-3 min-w-0 flex-1`,children:[(0,O.jsx)(`div`,{className:`flex items-center justify-center size-9 rounded-full bg-secondary shrink-0`,children:(0,O.jsx)(s,{className:`size-4 text-muted-foreground`})}),(0,O.jsxs)(`div`,{className:`min-w-0`,children:[(0,O.jsx)(`p`,{className:`text-sm font-mono truncate`,title:n,children:ce(n)}),(0,O.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:a===0?(0,O.jsx)(m,{id:`settings.wallet.primary`,defaultMessage:`Primary`}):(0,O.jsx)(m,{id:`settings.wallet.fallback`,defaultMessage:`Fallback {index}`,values:{index:a}})})]})]}),(0,O.jsxs)(`div`,{className:`flex items-center gap-0.5 shrink-0`,children:[(0,O.jsx)(g,{size:`sm`,variant:`ghost`,onClick:()=>Q(a,-1),disabled:a===0,className:`rounded-full size-8 p-0`,title:e.formatMessage({id:`settings.wallet.moveUp`,defaultMessage:`Move up`}),children:(0,O.jsx)(i,{className:`size-3.5`})}),(0,O.jsx)(g,{size:`sm`,variant:`ghost`,onClick:()=>Q(a,1),disabled:a===K.length-1,className:`rounded-full size-8 p-0`,title:e.formatMessage({id:`settings.wallet.moveDown`,defaultMessage:`Move down`}),children:(0,O.jsx)(t,{className:`size-3.5`})}),(0,O.jsx)(g,{size:`sm`,variant:`ghost`,onClick:()=>oe(n),disabled:K.length<=1,className:`rounded-full size-8 p-0 text-muted-foreground hover:text-destructive`,title:K.length<=1?e.formatMessage({id:`settings.wallet.oneApiRequired`,defaultMessage:`At least one API is required`}):e.formatMessage({id:`settings.wallet.remove`,defaultMessage:`Remove`}),children:(0,O.jsx)(r,{className:`size-3.5`})})]})]})},n))}),(0,O.jsxs)(`div`,{className:`flex gap-2 px-1`,children:[(0,O.jsxs)(`div`,{className:`flex-1`,children:[(0,O.jsx)(ne,{htmlFor:`new-esplora-url`,className:`sr-only`,children:(0,O.jsx)(m,{id:`settings.wallet.bitcoinApiUrlLabel`,defaultMessage:`Bitcoin API URL`})}),(0,O.jsx)(_,{id:`new-esplora-url`,value:q,onChange:e=>J(e.target.value),onKeyDown:e=>{e.key===`Enter`&&Z()},placeholder:`https://mempool.space/api`,className:`h-9 text-base md:text-sm font-mono`})]}),(0,O.jsxs)(g,{onClick:Z,disabled:!q.trim(),variant:`outline`,size:`sm`,className:`h-9 shrink-0 text-xs`,children:[(0,O.jsx)(a,{className:`h-3.5 w-3.5 mr-1.5`}),(0,O.jsx)(m,{id:`common.add`,defaultMessage:`Add`})]})]})]})]}),(0,O.jsx)(x,{open:d,onOpenChange:f,children:(0,O.jsxs)(b,{className:`max-w-[520px] rounded-2xl p-0 gap-0 border-border overflow-hidden [&>button]:hidden`,children:[(0,O.jsxs)(`div`,{className:`flex items-center justify-between px-4 h-12`,children:[(0,O.jsx)(y,{className:`text-base font-semibold`,children:(0,O.jsx)(m,{id:`settings.wallet.connectDialogTitle`,defaultMessage:`Connect NWC Wallet`})}),(0,O.jsx)(`button`,{onClick:()=>f(!1),className:`p-1.5 -mr-1.5 rounded-full text-muted-foreground hover:text-foreground hover:bg-secondary/60 transition-colors`,children:(0,O.jsx)(c,{className:`size-5`})})]}),(0,O.jsx)(`p`,{className:`px-4 -mt-1 mb-2 text-sm text-muted-foreground`,children:(0,O.jsx)(m,{id:`settings.wallet.connectDialogDescription`,defaultMessage:`Paste a connection string from your NWC-compatible wallet.`})}),(0,O.jsxs)(`div`,{className:`px-4 space-y-4`,children:[(0,O.jsx)(_,{placeholder:e.formatMessage({id:`settings.wallet.walletNamePlaceholder`,defaultMessage:`Wallet name (optional)`}),value:j,onChange:e=>M(e.target.value),className:`bg-transparent`}),(0,O.jsx)(S,{placeholder:`nostr+walletconnect://...`,value:k,onChange:e=>A(e.target.value),rows:3,className:`bg-transparent resize-none`})]}),(0,O.jsx)(`div`,{className:`flex items-center justify-end px-4 py-3`,children:(0,O.jsx)(g,{onClick:le,disabled:N||!k.trim(),className:`rounded-full px-5 font-bold`,size:`sm`,children:N?(0,O.jsx)(m,{id:`settings.wallet.connecting`,defaultMessage:`Connecting...`}):(0,O.jsx)(m,{id:`settings.wallet.connect`,defaultMessage:`Connect`})})})]})})]})}export{k as t}; // @license-end