/home/altere25/.trash/wp-to-sanity-companion
Edit: /home/altere25/.trash/wp-to-sanity-companion/assets\js\claude-connect.js (6502B)
/**
* Claude Connect UI (Phase D5)
*
* Drives the claude-connect.php template:
* - on load: GET /v2/mcp/config → if a token is already stored, skip
* straight to showing the config + starter prompts; otherwise show the
* mint step
* - mint: POST /v2/mcp/token with the customer-supplied Sanity token
* - copy config JSON to clipboard
* - revoke: POST /v2/mcp/revoke → reset UI to the mint step
*
* Talks to the WP REST endpoint altered-digital/v1/mcp/* which proxies to
* the Worker (so the admin token + tenant id never reach the browser).
*/
(function () {
'use strict';
if (!window.wpToSanity || !window.jQuery) {
return;
}
var $ = window.jQuery;
var restUrl = wpToSanity.restUrl; // altered-digital/v1/
function show(sel) { $(sel).removeClass('ad-cc-hidden'); }
function hide(sel) { $(sel).addClass('ad-cc-hidden'); }
function setError(msg) {
var $err = $('#ad-cc-error');
$err.find('.ad-cc-error-text').text(msg || 'Something went wrong.');
show('#ad-cc-error');
}
function renderConfig(data) {
if (!data || !data.config_snippet) {
setError('Worker returned an incomplete config.');
return;
}
$('#ad-cc-snippet').text(data.config_snippet);
if (data.claude_deep_link) {
$('#ad-cc-deeplink').attr('href', data.claude_deep_link);
}
if (data.starter_prompts && data.starter_prompts.length) {
var $list = $('#ad-cc-prompt-list').empty();
data.starter_prompts.forEach(function (p) {
$list.append('
' + $('').text(p).html() + '');
});
show('#ad-cc-prompts');
}
hide('#ad-cc-mint');
show('#ad-cc-config');
}
// ---- initial state: try fetch_config first ---------------------------
function init() {
if (!$('#ad-cc-mint').length) { return; } // not on claude-connect page
show('#ad-cc-loading');
$.ajax({
url: restUrl + 'mcp/config',
method: 'GET',
beforeSend: function (xhr) { xhr.setRequestHeader('X-WP-Nonce', wpToSanity.restNonce); }
}).done(function (resp) {
hide('#ad-cc-loading');
if (resp && resp.success && resp.data) {
renderConfig(resp.data);
} else {
// no token yet → stay on mint step
show('#ad-cc-mint');
}
}).fail(function (jqXHR) {
hide('#ad-cc-loading');
// 404 = mcp_token_not_set → expected, stay on mint step
if (jqXHR.status === 404) {
show('#ad-cc-mint');
} else {
var msg = (jqXHR.responseJSON && jqXHR.responseJSON.data && jqXHR.responseJSON.data.error) || 'Worker unreachable.';
setError(msg);
}
});
}
// ---- mint ------------------------------------------------------------
$(document).on('click', '#ad-cc-mint-btn', function () {
var token = $('#ad-cc-token-input').val();
if (!token) { return; }
var $btn = $(this);
$btn.prop('disabled', true).text('Connecting…');
$.ajax({
url: restUrl + 'mcp/token',
method: 'POST',
beforeSend: function (xhr) { xhr.setRequestHeader('X-WP-Nonce', wpToSanity.restNonce); },
data: { mcp_token: token }
}).done(function (resp) {
$btn.prop('disabled', false).text('Connect Claude');
if (resp && resp.success && resp.data) {
$('#ad-cc-token-input').val('');
renderConfig(resp.data);
} else {
var msg = (resp && resp.data && resp.data.error) || 'Could not store token.';
setError(msg);
}
}).fail(function (jqXHR) {
$btn.prop('disabled', false).text('Connect Claude');
var msg = (jqXHR.responseJSON && jqXHR.responseJSON.data && jqXHR.responseJSON.data.error) || 'Worker unreachable.';
setError(msg);
});
});
// ---- copy ------------------------------------------------------------
$(document).on('click', '#ad-cc-copy-btn', function () {
var text = $('#ad-cc-snippet').text();
var $msg = $('#ad-cc-copy-msg').text('');
if (!text) { return; }
var done = function () {
$msg.text('Copied!').addClass('ad-cc-ok');
setTimeout(function () { $msg.text('').removeClass('ad-cc-ok'); }, 2500);
};
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(text).then(done, function () { fallbackCopy(text, done); });
} else {
fallbackCopy(text, done);
}
});
function fallbackCopy(text, done) {
var ta = document.createElement('textarea');
ta.value = text;
ta.style.position = 'fixed';
ta.style.opacity = '0';
document.body.appendChild(ta);
ta.select();
try { document.execCommand('copy'); done(); } catch (e) { /* noop */ }
document.body.removeChild(ta);
}
// ---- revoke ----------------------------------------------------------
$(document).on('click', '#ad-cc-revoke-btn', function () {
if (!window.confirm('Revoke the Claude connection? Claude will lose access to your Sanity project. Migration continues unaffected.')) {
return;
}
var $msg = $('#ad-cc-revoke-msg').text('');
$.ajax({
url: restUrl + 'mcp/revoke',
method: 'POST',
beforeSend: function (xhr) { xhr.setRequestHeader('X-WP-Nonce', wpToSanity.restNonce); }
}).done(function (resp) {
if (resp && resp.success) {
hide('#ad-cc-config');
hide('#ad-cc-prompts');
show('#ad-cc-mint');
$msg.text('Connection revoked.').addClass('ad-cc-ok');
setTimeout(function () { $msg.text('').removeClass('ad-cc-ok'); }, 3000);
} else {
$msg.text((resp && resp.data && resp.data.error) || 'Could not revoke.').addClass('ad-cc-err');
}
}).fail(function (jqXHR) {
$msg.text((jqXHR.responseJSON && jqXHR.responseJSON.data && jqXHR.responseJSON.data.error) || 'Worker unreachable.').addClass('ad-cc-err');
});
});
$(init);
})();