252 lines
9.2 KiB
HTML
252 lines
9.2 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Embedded NOSTR_LOGIN_LITE</title>
|
|
<style>
|
|
body {
|
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
margin: 0;
|
|
padding: 40px;
|
|
background: white;
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
min-height: 90vh;
|
|
}
|
|
|
|
.container {
|
|
max-width: 400px;
|
|
width: 100%;
|
|
}
|
|
|
|
#login-container {
|
|
/* No styling - let embedded modal blend seamlessly */
|
|
}
|
|
</style>
|
|
</head>
|
|
|
|
<body>
|
|
<div class="container">
|
|
<div id="login-container">
|
|
<!-- Login interface will appear here -->
|
|
</div>
|
|
|
|
<div id="test-section" style="display: none; margin-top: 30px;">
|
|
<h2>Nostr Testing Interface</h2>
|
|
<div id="status" style="margin-bottom: 20px; padding: 10px; background: #f0f0f0; border-radius: 5px;"></div>
|
|
|
|
<div style="display: grid; gap: 15px;">
|
|
<button id="sign-button" style="padding: 12px; font-size: 16px; background: #007bff; color: white; border: none; border-radius: 5px; cursor: pointer;">
|
|
Sign Event
|
|
</button>
|
|
|
|
<button id="nip04-encrypt-button" style="padding: 12px; font-size: 16px; background: #28a745; color: white; border: none; border-radius: 5px; cursor: pointer;">
|
|
NIP-04 Encrypt
|
|
</button>
|
|
|
|
<button id="nip04-decrypt-button" style="padding: 12px; font-size: 16px; background: #28a745; color: white; border: none; border-radius: 5px; cursor: pointer;">
|
|
NIP-04 Decrypt
|
|
</button>
|
|
|
|
<button id="nip44-encrypt-button" style="padding: 12px; font-size: 16px; background: #6f42c1; color: white; border: none; border-radius: 5px; cursor: pointer;">
|
|
NIP-44 Encrypt
|
|
</button>
|
|
|
|
<button id="nip44-decrypt-button" style="padding: 12px; font-size: 16px; background: #6f42c1; color: white; border: none; border-radius: 5px; cursor: pointer;">
|
|
NIP-44 Decrypt
|
|
</button>
|
|
|
|
<button id="get-pubkey-button" style="padding: 12px; font-size: 16px; background: #17a2b8; color: white; border: none; border-radius: 5px; cursor: pointer;">
|
|
Get Public Key
|
|
</button>
|
|
</div>
|
|
|
|
<div id="results" style="margin-top: 20px; padding: 15px; background: #f8f9fa; border-radius: 5px; font-family: monospace; white-space: pre-wrap; max-height: 400px; overflow-y: auto;"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<script src="../lite/nostr.bundle.js"></script>
|
|
<script src="../lite/nostr-lite.js"></script>
|
|
|
|
<script>
|
|
document.addEventListener('DOMContentLoaded', async () => {
|
|
await window.NOSTR_LOGIN_LITE.init({
|
|
theme: 'default',
|
|
methods: {
|
|
extension: true,
|
|
local: true,
|
|
seedphrase:true,
|
|
readonly: true,
|
|
connect: true,
|
|
remote: true,
|
|
otp: true
|
|
},
|
|
floatingTab: {
|
|
enabled: true,
|
|
hPosition: 1, // 0.0-1.0 or '95%' from left
|
|
vPosition: 0, // 0.0-1.0 or '50%' from top
|
|
appearance: {
|
|
style: 'square', // 'pill', 'square', 'circle', 'minimal'
|
|
// icon: '[LOGIN]', // Now uses text-based icons like [LOGIN], [KEY], [NET]
|
|
text: 'Login'
|
|
},
|
|
behavior: {
|
|
hideWhenAuthenticated: false,
|
|
showUserInfo: true,
|
|
autoSlide: true
|
|
},
|
|
animation: {
|
|
slideDirection: 'auto' // 'auto', 'left', 'right', 'up', 'down'
|
|
}
|
|
|
|
}});
|
|
|
|
// Check for existing authentication state on page load
|
|
const authState = getAuthState();
|
|
if (authState && authState.method) {
|
|
console.log('Found existing authentication:', authState.method);
|
|
document.getElementById('status').textContent = `Authenticated with: ${authState.method}`;
|
|
document.getElementById('test-section').style.display = 'block';
|
|
|
|
// Store some test data for encryption/decryption
|
|
window.testCiphertext = null;
|
|
window.testCiphertext44 = null;
|
|
}
|
|
|
|
// Listen for authentication events
|
|
window.addEventListener('nlMethodSelected', (event) => {
|
|
console.log('User authenticated:', event.detail);
|
|
document.getElementById('status').textContent = `Authenticated with: ${event.detail.method}`;
|
|
document.getElementById('test-section').style.display = 'block';
|
|
|
|
// Store some test data for encryption/decryption
|
|
window.testCiphertext = null;
|
|
window.testCiphertext44 = null;
|
|
});
|
|
|
|
window.addEventListener('nlLogout', () => {
|
|
console.log('User logged out');
|
|
document.getElementById('status').textContent = 'Logged out';
|
|
document.getElementById('test-section').style.display = 'none';
|
|
document.getElementById('results').innerHTML = '';
|
|
});
|
|
|
|
// Button event listeners
|
|
document.getElementById('get-pubkey-button').addEventListener('click', testGetPublicKey);
|
|
document.getElementById('sign-button').addEventListener('click', testSigning);
|
|
document.getElementById('nip04-encrypt-button').addEventListener('click', testNip04Encrypt);
|
|
document.getElementById('nip04-decrypt-button').addEventListener('click', testNip04Decrypt);
|
|
document.getElementById('nip44-encrypt-button').addEventListener('click', testNip44Encrypt);
|
|
document.getElementById('nip44-decrypt-button').addEventListener('click', testNip44Decrypt);
|
|
});
|
|
|
|
// Test functions
|
|
async function testGetPublicKey() {
|
|
try {
|
|
updateResults('🔑 Getting public key...');
|
|
const pubkey = await window.nostr.getPublicKey();
|
|
updateResults(`✅ Public Key: ${pubkey}`);
|
|
} catch (error) {
|
|
updateResults(`❌ Get Public Key Error: ${error.message}`);
|
|
}
|
|
}
|
|
|
|
async function testSigning() {
|
|
try {
|
|
updateResults('✍️ Signing event...');
|
|
|
|
const event = {
|
|
kind: 1,
|
|
content: 'Hello from NOSTR_LOGIN_LITE key test! ' + new Date().toISOString(),
|
|
tags: [],
|
|
created_at: Math.floor(Date.now() / 1000)
|
|
};
|
|
|
|
const signedEvent = await window.nostr.signEvent(event);
|
|
updateResults(`✅ Event Signed Successfully:\n${JSON.stringify(signedEvent, null, 2)}`);
|
|
} catch (error) {
|
|
updateResults(`❌ Sign Event Error: ${error.message}`);
|
|
}
|
|
}
|
|
|
|
async function testNip04Encrypt() {
|
|
try {
|
|
updateResults('🔐 Testing NIP-04 encryption...');
|
|
|
|
const pubkey = await window.nostr.getPublicKey();
|
|
const plaintext = 'Secret message for NIP-04 testing! ' + Date.now();
|
|
|
|
const ciphertext = await window.nostr.nip04.encrypt(pubkey, plaintext);
|
|
window.testCiphertext = ciphertext; // Store for decryption test
|
|
|
|
updateResults(`✅ NIP-04 Encrypted:\nPlaintext: ${plaintext}\nCiphertext: ${ciphertext}`);
|
|
} catch (error) {
|
|
updateResults(`❌ NIP-04 Encrypt Error: ${error.message}`);
|
|
}
|
|
}
|
|
|
|
async function testNip04Decrypt() {
|
|
try {
|
|
if (!window.testCiphertext) {
|
|
updateResults('❌ No ciphertext available. Run NIP-04 encrypt first.');
|
|
return;
|
|
}
|
|
|
|
updateResults('🔓 Testing NIP-04 decryption...');
|
|
|
|
const pubkey = await window.nostr.getPublicKey();
|
|
const decrypted = await window.nostr.nip04.decrypt(pubkey, window.testCiphertext);
|
|
|
|
updateResults(`✅ NIP-04 Decrypted:\nCiphertext: ${window.testCiphertext}\nDecrypted: ${decrypted}`);
|
|
} catch (error) {
|
|
updateResults(`❌ NIP-04 Decrypt Error: ${error.message}`);
|
|
}
|
|
}
|
|
|
|
async function testNip44Encrypt() {
|
|
try {
|
|
updateResults('🔐 Testing NIP-44 encryption...');
|
|
|
|
const pubkey = await window.nostr.getPublicKey();
|
|
const plaintext = 'Secret message for NIP-44 testing! ' + Date.now();
|
|
|
|
const ciphertext = await window.nostr.nip44.encrypt(pubkey, plaintext);
|
|
window.testCiphertext44 = ciphertext; // Store for decryption test
|
|
|
|
updateResults(`✅ NIP-44 Encrypted:\nPlaintext: ${plaintext}\nCiphertext: ${ciphertext}`);
|
|
} catch (error) {
|
|
updateResults(`❌ NIP-44 Encrypt Error: ${error.message}`);
|
|
}
|
|
}
|
|
|
|
async function testNip44Decrypt() {
|
|
try {
|
|
if (!window.testCiphertext44) {
|
|
updateResults('❌ No ciphertext available. Run NIP-44 encrypt first.');
|
|
return;
|
|
}
|
|
|
|
updateResults('🔓 Testing NIP-44 decryption...');
|
|
|
|
const pubkey = await window.nostr.getPublicKey();
|
|
const decrypted = await window.nostr.nip44.decrypt(pubkey, window.testCiphertext44);
|
|
|
|
updateResults(`✅ NIP-44 Decrypted:\nCiphertext: ${window.testCiphertext44}\nDecrypted: ${decrypted}`);
|
|
} catch (error) {
|
|
updateResults(`❌ NIP-44 Decrypt Error: ${error.message}`);
|
|
}
|
|
}
|
|
|
|
function updateResults(message) {
|
|
const results = document.getElementById('results');
|
|
const timestamp = new Date().toLocaleTimeString();
|
|
results.textContent += `[${timestamp}] ${message}\n\n`;
|
|
results.scrollTop = results.scrollHeight;
|
|
}
|
|
</script>
|
|
</body>
|
|
|
|
</html> |