openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
205 lines (198 loc) • 11.3 kB
JavaScript
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{_ as t,k as n}from"./control-ui-core-Rwzhj6nO.js";import{K as r,X as i,q as a}from"./lit-runtime-CV_MH99K.js";import{Gt as o,Rt as s,Wt as c,Yt as l,en as u}from"./control-ui-core-vvcQQV2m.js";import{$n as d,Cr as f,Sr as p,er as m,nr as h,xr as g}from"./control-ui-boot-shared-DfZ39Yj9.js";function _(e){return u(e===`limited`?`devices.pairing.limitedAccess`:e===`node`?`devices.pairing.nodeAccessSummary`:`devices.pairing.fullAccessSummary`)}function v(e){if(!e.open)return a;let n=e.lifecycle,r=u(`devices.pairing.title`),o=n.phase===`success`?u(`devices.pairing.pairedTitle`):n.phase===`delivery-uncertain`?u(`devices.pairing.deliveryUncertainTitle`):n.phase===`expired`?u(`devices.pairing.expiredTitle`):u(`devices.pairing.subtitle`),s=u(`devices.pairing.copySetupCode`),l=n.phase===`waiting`?n.setup:null,f=l?.gatewayUrls??(l?[l.gatewayUrl]:[]),m=n.access===`node`,v=m?b:y,S=l?`openclaw node run --pair "oc-pair://${l.setupCode}"`:``,C=!!(l&&l.expiresAtMs<=e.nowMs),w=n.phase!==`success`&&n.phase!==`delivery-uncertain`&&n.phase!==`reconciling`&&(n.phase!==`error`||n.source!==`status`),T=n.phase===`selection`||n.phase===`error`&&n.source===`create`;return i`
<openclaw-modal-dialog label=${r} description=${o} @modal-cancel=${e.onClose}>
<section class="device-pair-setup">
<header class="device-pair-setup__header">
<div class="device-pair-setup__phone" aria-hidden="true">
${m?c.server:c.smartphone}
</div>
<div>
<h2>${r}</h2>
<p>${o}</p>
${n.phase!==`success`&&!m?i`<p class="device-pair-setup__get-apps">
${u(`devices.pairing.noApp`)}
<button type="button" @click=${e.onGetApps}>
${u(`devices.pairing.getApps`)}
</button>
</p>`:a}
</div>
<button
class="btn btn--icon btn--ghost device-pair-setup__close"
type="button"
aria-label=${u(`common.dismiss`)}
@click=${e.onClose}
>
${c.x}
</button>
</header>
<div class="device-pair-setup__body">
${w?i`<fieldset class="device-pair-setup__access" ?disabled=${!T}>
<legend>${u(`devices.pairing.accessTitle`)}</legend>
${x.map(([t,r,a])=>i`<label>
<input
type="radio"
name="device-pair-access"
.checked=${n.access===t}
@change=${()=>e.onAccessChange(t)}
/>
<span>
<strong>${u(r)}</strong>
<small>${u(a)}</small>
</span>
</label>`)}
</fieldset>`:a}
${n.phase===`selection`?i`
<button class="btn primary" type="button" @click=${e.onRefresh}>
${m?c.server:c.smartphone}
${u(`devices.pairing.generateCode`)}
</button>
`:a}
${n.phase===`loading`?i`
<div class="device-pair-setup__loading" role="status" aria-live="polite">
<span class="device-pair-setup__spinner" aria-hidden="true"></span>
<span>${u(`devices.pairing.generating`)}</span>
</div>
`:a}
${n.phase===`reconciling`?i`
<div class="device-pair-setup__loading" role="status" aria-live="polite">
<span class="device-pair-setup__spinner" aria-hidden="true"></span>
<span>${u(`common.loading`)}</span>
</div>
`:a}
${n.phase===`error`?i`
<div class="callout danger device-pair-setup__error" role="alert">
<strong
>${u(n.source===`status`?`devices.pairing.statusFailed`:`devices.pairing.failed`)}</strong
>
<span>${n.message}</span>
</div>
<button class="btn primary" type="button" @click=${e.onRefresh}>
${c.refresh} ${u(`common.reload`)}
</button>
`:a}
${l?i`
${m?i`<div class="device-pair-setup__command">
${C?a:i`<div class="login-gate__command">
<code>${S}</code>
${h(S,u(`connection.help.copyCommand`))}
</div>`}
<p class="device-pair-setup__waiting" role="timer" aria-live="off">
${C?u(`devices.pairing.nodeExpired`):u(`devices.pairing.nodeExpiresIn`,{time:t(l.expiresAtMs,e.nowMs)})}
</p>
</div>`:i`<div class="device-pair-setup__qr-frame">
${l.qrDataUrl?i`<img
class="device-pair-setup__qr"
src=${l.qrDataUrl}
alt=${u(`devices.pairing.qrAlt`)}
width="360"
height="360"
draggable="false"
/>`:i`<div class="device-pair-setup__qr-unavailable">
${u(`devices.pairing.qrUnavailable`)}
</div>`}
</div>`}
<div class="device-pair-setup__meta">
<span class="settings-status settings-status--accent">
<span class="settings-status__dot"></span>
${l.auth}
</span>
<div class="device-pair-setup__gateways">
${f.map(e=>i`
<span class="device-pair-setup__gateway" title=${e}
>${e}</span
>
`)}
</div>
</div>
${l.accessDowngraded?i`
<div class="callout warn device-pair-setup__access-warning" role="status">
<strong>${u(`devices.pairing.transportLimitedTitle`)}</strong>
<span>${u(`devices.pairing.transportLimitedHint`)}</span>
</div>
`:a}
<div class="device-pair-setup__actions">
${m?a:i`<button
class="btn primary"
type="button"
@click=${e=>void d(e,l.setupCode,s)}
>
${c.copy} <span data-copy-label>${s}</span>
</button>`}
<button class="btn" type="button" @click=${e.onRefresh}>
${c.refresh} ${u(`devices.pairing.newCode`)}
</button>
</div>
<details class="device-pair-setup__fallback">
<summary>${u(`devices.pairing.showSetupCode`)}</summary>
<code>${l.setupCode}</code>
</details>
${e.pendingCount>0?i`
<div class="callout warn device-pair-setup__pending">
<span>
${u(`devices.pairing.pending`,{count:String(e.pendingCount)})}
</span>
<button class="btn btn--sm" @click=${e.onManageDevices}>
${u(`devices.pairing.review`)}
</button>
</div>
`:i`<p class="device-pair-setup__waiting">
${u(m?`devices.pairing.nodeWaiting`:`devices.pairing.waiting`)}
</p>`}
`:a}
${n.phase===`success`?i`<div class="device-pair-setup__state" role="status" aria-live="polite">
<div
class="device-pair-setup__state-icon device-pair-setup__state-icon--success"
aria-hidden="true"
>
${c.badgeCheck}
</div>
<h3>${n.deviceName??u(`devices.pairing.pairedTitle`)}</h3>
<p>
${n.deviceName?i`${u(`devices.pairing.pairedTitle`)}
<span aria-hidden="true">·</span> `:a}${_(n.access)}
</p>
<button class="btn primary" type="button" @click=${e.onClose}>
${u(`devices.pairing.done`)}
</button>
</div>`:a}
${n.phase===`delivery-uncertain`?i`<div class="device-pair-setup__state" role="alert">
<div class="device-pair-setup__state-icon" aria-hidden="true">
${c.alertTriangle}
</div>
<h3>${u(`devices.pairing.deliveryUncertainTitle`)}</h3>
<p>${u(`devices.pairing.deliveryUncertainHint`)}</p>
<div class="device-pair-setup__actions">
<button class="btn primary" type="button" @click=${e.onRefresh}>
${c.refresh} ${u(`devices.pairing.generateNewCode`)}
</button>
</div>
</div>`:a}
${n.phase===`expired`?i`<div class="device-pair-setup__state" role="status" aria-live="polite">
<div class="device-pair-setup__state-icon" aria-hidden="true">
${c.refresh}
</div>
<h3>${u(`devices.pairing.expiredTitle`)}</h3>
<button class="btn primary" type="button" @click=${e.onRefresh}>
${c.refresh} ${u(`devices.pairing.generateNewCode`)}
</button>
</div>`:a}
</div>
<footer class="device-pair-setup__footer">
<a
href=${v}
target=${g}
rel=${p()}
aria-label=${u(`devices.pairing.helpNewTab`)}
>
<span>${u(`devices.pairing.help`)}</span>
<span class="device-pair-setup__external-icon" aria-hidden="true"
>${c.externalLink}</span
>
</a>
<button class="btn btn--ghost" type="button" @click=${e.onManageDevices}>
${u(`devices.pairing.manageDevices`)}
</button>
</footer>
</section>
</openclaw-modal-dialog>
`}var y,b,x;function S(){return(S=e((()=>{r(),m(),o(),s(),l(),f(),n(),y=`https://docs.openclaw.ai/channels/pairing#pair-from-the-control-ui-recommended`,b=`https://docs.openclaw.ai/gateway/pairing#one-paste-node-pairing`,x=[[`full`,`devices.pairing.fullAccess`,`devices.pairing.fullAccessHint`],[`limited`,`devices.pairing.limitedAccess`,`devices.pairing.limitedAccessHint`],[`node`,`devices.pairing.nodeAccess`,`devices.pairing.nodeAccessHint`]]})))()}S();export{v as renderDevicePairSetup};
//# sourceMappingURL=view-pairing.runtime-lXzSgb_-.js.map