Browse Source

Add version display to web UI sidebar (v0.36.18)

- Add version footer to sidebar bottom-left with Gitea icon link
- Fetch relay version from NIP-11 relay info document
- Link opens https://next.orly.dev in new tab
- Responsive design hides version text on medium screens

Files modified:
- app/web/src/api.js: Add fetchRelayInfo() function
- app/web/src/Sidebar.svelte: Add version display with Gitea SVG icon
- app/web/src/App.svelte: Add relayVersion state and fetch on init
- pkg/version/version: Bump to v0.36.18

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
main
mleku 3 weeks ago
parent
commit
b6b31cb93f
No known key found for this signature in database
  1. 18
      app/web/src/App.svelte
  2. 56
      app/web/src/Sidebar.svelte
  3. 22
      app/web/src/api.js
  4. 2
      pkg/version/version

18
app/web/src/App.svelte

@ -116,6 +116,9 @@ @@ -116,6 +116,9 @@
// ACL mode
let aclMode = "";
// Relay version
let relayVersion = "";
// Compose tab state
let composeEventJson = "";
let composePublishError = "";
@ -859,6 +862,9 @@ @@ -859,6 +862,9 @@
// Load policy configuration
loadPolicyConfig();
// Load relay version
fetchRelayVersion();
}
function savePersistentState() {
@ -2020,6 +2026,17 @@ @@ -2020,6 +2026,17 @@
}
}
async function fetchRelayVersion() {
try {
const info = await api.fetchRelayInfo();
if (info && info.version) {
relayVersion = info.version;
}
} catch (error) {
console.error("Error fetching relay version:", error);
}
}
// Export functionality
async function exportEvents(pubkeys = []) {
// Skip login check when ACL is "none" (open relay mode)
@ -2737,6 +2754,7 @@ @@ -2737,6 +2754,7 @@
{isDarkTheme}
{tabs}
{selectedTab}
version={relayVersion}
on:selectTab={(e) => selectTab(e.detail)}
on:closeSearchTab={(e) => closeSearchTab(e.detail)}
/>

56
app/web/src/Sidebar.svelte

@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
export let isDarkTheme = false;
export let tabs = [];
export let selectedTab = "";
export let version = "";
import { createEventDispatcher } from "svelte";
const dispatch = createEventDispatcher();
@ -41,6 +42,15 @@ @@ -41,6 +42,15 @@
{/each}
</div>
</div>
{#if version}
<a href="https://next.orly.dev" target="_blank" rel="noopener noreferrer" class="version-link">
<svg class="gitea-icon" viewBox="0 0 640 640" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path d="M395.9 484.2l-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5 21.2-17.9 33.8-11.8 17.2 8.3 27.1 13 27.1 13l-.1-51.6s-.1-30.3 21.7-32.1c-.1 0 74-3 74-3s30.1-1.5 32.1 22.4c0 0 3.9 74.6 3.9 74.6s1.2 22.8-23.2 30c0 0-13.6 3.9-20.6 6-13.6 4.1-26.1-9-24.6-24.6l3.5-42.9-31.3 66.5-31.4 65.2c-4.2 8.7-1.1 18.8 7 24.2l32.9 21.1c11 7 .2 18.2-7.7 37.1l-19.4 48.6z"/>
<path d="M286.1 499.2l127-60.9c12.5-6 17.9-21.3 11.9-33.8l-61-126.9c-6-12.5-21.2-17.9-33.8-11.9-17.2 8.3-27.1 13-27.1 13l.1-51.6s.1-30.3-21.7-32.1c.1 0-74-3-74-3s-30.1-1.5-32.1 22.4c0 0-3.9 74.6-3.9 74.6s-1.2 22.8 23.2 30.1c0 0 13.6 3.9 20.6 5.9 13.6 4.1 26.1-9 24.6-24.6l-3.5-42.9 31.3 66.5 31.4 65.2c4.2 8.8 1 18.8-7 24.2l-32.9 21.1c-11 7.1-.2 18.3 7.7 37.1l19.2 48.6z"/>
</svg>
<span class="version-text">v{version}</span>
</a>
{/if}
</aside>
<style>
@ -152,4 +162,50 @@ @@ -152,4 +162,50 @@
justify-content: flex-start;
}
}
.version-link {
position: absolute;
bottom: 0;
left: 0;
right: 0;
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.75em 1em;
color: var(--muted-foreground);
text-decoration: none;
font-size: 0.8em;
transition: color 0.2s;
}
.version-link:hover {
color: var(--text-color);
}
.gitea-icon {
width: 1.2em;
height: 1.2em;
flex-shrink: 0;
}
.version-text {
white-space: nowrap;
}
@media (max-width: 1280px) {
.version-text {
display: none;
}
.version-link {
justify-content: flex-start;
padding-left: 1.25em;
}
}
@media (max-width: 640px) {
.version-text {
display: inline;
}
}
</style>

22
app/web/src/api.js

@ -319,6 +319,28 @@ export async function fetchPolicyFollows(signer, pubkey) { @@ -319,6 +319,28 @@ export async function fetchPolicyFollows(signer, pubkey) {
return data.follows || [];
}
// ==================== Relay Info API ====================
/**
* Fetch relay info document (NIP-11)
* @returns {Promise<object>} Relay info including version
*/
export async function fetchRelayInfo() {
try {
const response = await fetch(window.location.origin, {
headers: {
Accept: "application/nostr+json",
},
});
if (response.ok) {
return await response.json();
}
} catch (error) {
console.error("Error fetching relay info:", error);
}
return null;
}
// ==================== Export/Import API ====================
/**

2
pkg/version/version

@ -1 +1 @@ @@ -1 +1 @@
v0.36.17
v0.36.18

Loading…
Cancel
Save