|
|
|
|
@ -25,6 +25,7 @@
@@ -25,6 +25,7 @@
|
|
|
|
|
let profileEvent = $state<NostrEvent | null>(null); |
|
|
|
|
let muting = $state(false); |
|
|
|
|
let following = $state(false); |
|
|
|
|
let showJsonModal = $state(false); |
|
|
|
|
|
|
|
|
|
let isLoggedIn = $derived(sessionManager.isLoggedIn()); |
|
|
|
|
let currentUserPubkey = $derived(sessionManager.getCurrentPubkey()); |
|
|
|
|
@ -243,6 +244,18 @@
@@ -243,6 +244,18 @@
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
async function viewJson() { |
|
|
|
|
if (!profileEvent) { |
|
|
|
|
await loadProfileEvent(); |
|
|
|
|
} |
|
|
|
|
showJsonModal = true; |
|
|
|
|
closeMenu(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function closeJsonModal() { |
|
|
|
|
showJsonModal = false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function shareWithAitherboard() { |
|
|
|
|
const url = `${window.location.origin}/profile/${pubkey}`; |
|
|
|
|
navigator.clipboard.writeText(url).then(() => { |
|
|
|
|
@ -331,6 +344,11 @@
@@ -331,6 +344,11 @@
|
|
|
|
|
{/if} |
|
|
|
|
</button> |
|
|
|
|
|
|
|
|
|
<button class="menu-item" onclick={viewJson} role="menuitem" disabled={!profileEvent}> |
|
|
|
|
<span class="menu-item-icon">📄</span> |
|
|
|
|
<span class="menu-item-text">View Json</span> |
|
|
|
|
</button> |
|
|
|
|
|
|
|
|
|
<div class="menu-divider"></div> |
|
|
|
|
|
|
|
|
|
<button class="menu-item" onclick={shareWithAitherboard} role="menuitem"> |
|
|
|
|
@ -379,6 +397,38 @@
@@ -379,6 +397,38 @@
|
|
|
|
|
|
|
|
|
|
</div> |
|
|
|
|
{/if} |
|
|
|
|
|
|
|
|
|
{#if showJsonModal} |
|
|
|
|
<div |
|
|
|
|
class="json-modal-overlay" |
|
|
|
|
role="dialog" |
|
|
|
|
aria-modal="true" |
|
|
|
|
aria-labelledby="json-modal-title" |
|
|
|
|
> |
|
|
|
|
<button |
|
|
|
|
class="json-modal-backdrop" |
|
|
|
|
onclick={closeJsonModal} |
|
|
|
|
onkeydown={(e) => e.key === 'Escape' && closeJsonModal()} |
|
|
|
|
aria-label="Close modal" |
|
|
|
|
></button> |
|
|
|
|
<div |
|
|
|
|
class="json-modal-content" |
|
|
|
|
role="document" |
|
|
|
|
> |
|
|
|
|
<div class="json-modal-header"> |
|
|
|
|
<h3 id="json-modal-title">Profile Event JSON</h3> |
|
|
|
|
<button class="json-modal-close" onclick={closeJsonModal} aria-label="Close">×</button> |
|
|
|
|
</div> |
|
|
|
|
<div class="json-modal-body"> |
|
|
|
|
{#if profileEvent} |
|
|
|
|
<pre class="json-content">{JSON.stringify(profileEvent, null, 2)}</pre> |
|
|
|
|
{:else} |
|
|
|
|
<p class="text-fog-text-light dark:text-fog-dark-text-light">Loading profile event...</p> |
|
|
|
|
{/if} |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
{/if} |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<style> |
|
|
|
|
@ -513,4 +563,144 @@
@@ -513,4 +563,144 @@
|
|
|
|
|
:global(.dark) .menu-divider { |
|
|
|
|
background: var(--fog-dark-border, #374151); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.json-modal-overlay { |
|
|
|
|
position: fixed; |
|
|
|
|
top: 0; |
|
|
|
|
left: 0; |
|
|
|
|
right: 0; |
|
|
|
|
bottom: 0; |
|
|
|
|
z-index: 2000; |
|
|
|
|
display: flex; |
|
|
|
|
align-items: center; |
|
|
|
|
justify-content: center; |
|
|
|
|
padding: 1rem; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.json-modal-backdrop { |
|
|
|
|
position: absolute; |
|
|
|
|
top: 0; |
|
|
|
|
left: 0; |
|
|
|
|
right: 0; |
|
|
|
|
bottom: 0; |
|
|
|
|
background: rgba(0, 0, 0, 0.5); |
|
|
|
|
border: none; |
|
|
|
|
padding: 0; |
|
|
|
|
cursor: pointer; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
:global(.dark) .json-modal-backdrop { |
|
|
|
|
background: rgba(0, 0, 0, 0.7); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.json-modal-content { |
|
|
|
|
position: relative; |
|
|
|
|
z-index: 1; |
|
|
|
|
background: var(--fog-post, #ffffff); |
|
|
|
|
border: 1px solid var(--fog-border, #e5e7eb); |
|
|
|
|
border-radius: 0.5rem; |
|
|
|
|
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2); |
|
|
|
|
max-width: 90vw; |
|
|
|
|
max-height: 90vh; |
|
|
|
|
width: 100%; |
|
|
|
|
display: flex; |
|
|
|
|
flex-direction: column; |
|
|
|
|
overflow: hidden; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
:global(.dark) .json-modal-content { |
|
|
|
|
background: var(--fog-dark-post, #1f2937); |
|
|
|
|
border-color: var(--fog-dark-border, #374151); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.json-modal-header { |
|
|
|
|
display: flex; |
|
|
|
|
align-items: center; |
|
|
|
|
justify-content: space-between; |
|
|
|
|
padding: 1rem; |
|
|
|
|
border-bottom: 1px solid var(--fog-border, #e5e7eb); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
:global(.dark) .json-modal-header { |
|
|
|
|
border-bottom-color: var(--fog-dark-border, #374151); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.json-modal-header h3 { |
|
|
|
|
margin: 0; |
|
|
|
|
font-size: 1.125rem; |
|
|
|
|
font-weight: 600; |
|
|
|
|
color: var(--fog-text, #1f2937); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
:global(.dark) .json-modal-header h3 { |
|
|
|
|
color: var(--fog-dark-text, #f9fafb); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.json-modal-close { |
|
|
|
|
background: none; |
|
|
|
|
border: none; |
|
|
|
|
font-size: 1.5rem; |
|
|
|
|
line-height: 1; |
|
|
|
|
cursor: pointer; |
|
|
|
|
color: var(--fog-text, #1f2937); |
|
|
|
|
padding: 0.25rem 0.5rem; |
|
|
|
|
border-radius: 0.25rem; |
|
|
|
|
transition: background 0.2s; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
:global(.dark) .json-modal-close { |
|
|
|
|
color: var(--fog-dark-text, #f9fafb); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.json-modal-close:hover { |
|
|
|
|
background: var(--fog-highlight, #f3f4f6); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
:global(.dark) .json-modal-close:hover { |
|
|
|
|
background: var(--fog-dark-highlight, #374151); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.json-modal-body { |
|
|
|
|
padding: 1rem; |
|
|
|
|
overflow: auto; |
|
|
|
|
flex: 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.json-content { |
|
|
|
|
margin: 0; |
|
|
|
|
font-family: 'Courier New', monospace; |
|
|
|
|
font-size: 0.875rem; |
|
|
|
|
line-height: 1.5; |
|
|
|
|
color: var(--fog-text, #1f2937); |
|
|
|
|
white-space: pre-wrap; |
|
|
|
|
word-break: break-word; |
|
|
|
|
overflow-wrap: break-word; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
:global(.dark) .json-content { |
|
|
|
|
color: var(--fog-dark-text, #f9fafb); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@media (max-width: 640px) { |
|
|
|
|
.json-modal-content { |
|
|
|
|
max-width: 95vw; |
|
|
|
|
max-height: 95vh; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.json-modal-header { |
|
|
|
|
padding: 0.75rem; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.json-modal-header h3 { |
|
|
|
|
font-size: 1rem; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.json-modal-body { |
|
|
|
|
padding: 0.75rem; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.json-content { |
|
|
|
|
font-size: 0.75rem; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
</style> |
|
|
|
|
|