mirror of
https://github.com/dergigi/boris.git
synced 2026-02-17 21:15:02 +01:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
432715efb6 | ||
|
|
8b2b954dde | ||
|
|
c2d2bd8106 | ||
|
|
a5c3085c59 |
32
CHANGELOG.md
32
CHANGELOG.md
@@ -7,6 +7,35 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [0.6.18] - 2025-10-15
|
||||
|
||||
### Changed
|
||||
|
||||
- Zap split labels simplified and terminology updated
|
||||
- Removed redundant "Weight: xy" label to save space
|
||||
- Changed "Author(s) Share" to "Author's Share" (possessive singular)
|
||||
- Changed "Support Boris" to "Boris' Share" for consistency
|
||||
- Weight value now shown directly in label (e.g., "Your Share: 50")
|
||||
- Share and percentage now displayed on same line for cleaner layout
|
||||
- Zap preset buttons on desktop now expand to match slider width
|
||||
- Added `flex: 1` to buttons for equal width distribution
|
||||
- Buttons still wrap properly on smaller screens
|
||||
- PWA install section now always visible in settings
|
||||
- Section shows regardless of installation or device capability status
|
||||
- Button adapts with proper disabled states and visual feedback
|
||||
- "Installed" state shows checkmark icon and disabled button
|
||||
- Non-installable state shows disabled button
|
||||
|
||||
### Fixed
|
||||
|
||||
- PWA install button now properly disabled when installation is not possible on device
|
||||
- Button only enabled when browser fires `beforeinstallprompt` event
|
||||
- Removed hardcoded testing state that always showed button as installable
|
||||
- App & Airplane Mode section now always visible regardless of PWA status
|
||||
- Image cache and local relay settings always accessible
|
||||
- Previously entire section was hidden if PWA not installable/installed
|
||||
- Only PWA-specific install button is conditionally affected
|
||||
|
||||
## [0.6.17] - 2025-10-15
|
||||
|
||||
### Added
|
||||
@@ -1566,7 +1595,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
- Optimize relay usage following applesauce-relay best practices
|
||||
- Use applesauce-react event models for better profile handling
|
||||
|
||||
[Unreleased]: https://github.com/dergigi/boris/compare/v0.6.17...HEAD
|
||||
[Unreleased]: https://github.com/dergigi/boris/compare/v0.6.18...HEAD
|
||||
[0.6.18]: https://github.com/dergigi/boris/compare/v0.6.17...v0.6.18
|
||||
[0.6.17]: https://github.com/dergigi/boris/compare/v0.6.16...v0.6.17
|
||||
[0.6.16]: https://github.com/dergigi/boris/compare/v0.6.15...v0.6.16
|
||||
[0.6.15]: https://github.com/dergigi/boris/compare/v0.6.14...v0.6.15
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "boris",
|
||||
"version": "0.6.18",
|
||||
"version": "0.6.19",
|
||||
"description": "A minimal nostr client for bookmark management",
|
||||
"homepage": "https://read.withboris.com/",
|
||||
"type": "module",
|
||||
|
||||
@@ -167,6 +167,7 @@ const Bookmarks: React.FC<BookmarksProps> = ({ relayPool, onLogout }) => {
|
||||
activeAccount,
|
||||
accountManager,
|
||||
naddr,
|
||||
externalUrl,
|
||||
currentArticleCoordinate,
|
||||
currentArticleEventId,
|
||||
settings
|
||||
|
||||
@@ -13,6 +13,7 @@ interface UseBookmarksDataParams {
|
||||
activeAccount: IAccount | undefined
|
||||
accountManager: AccountManager
|
||||
naddr?: string
|
||||
externalUrl?: string
|
||||
currentArticleCoordinate?: string
|
||||
currentArticleEventId?: string
|
||||
settings?: UserSettings
|
||||
@@ -23,6 +24,7 @@ export const useBookmarksData = ({
|
||||
activeAccount,
|
||||
accountManager,
|
||||
naddr,
|
||||
externalUrl,
|
||||
currentArticleCoordinate,
|
||||
currentArticleEventId,
|
||||
settings
|
||||
@@ -115,11 +117,13 @@ export const useBookmarksData = ({
|
||||
// Fetch highlights/contacts independently to avoid disturbing bookmarks
|
||||
useEffect(() => {
|
||||
if (!relayPool || !activeAccount) return
|
||||
if (!naddr) {
|
||||
// Only fetch general highlights when not viewing an article (naddr) or external URL
|
||||
// External URLs have their highlights fetched by useExternalUrlLoader
|
||||
if (!naddr && !externalUrl) {
|
||||
handleFetchHighlights()
|
||||
}
|
||||
handleFetchContacts()
|
||||
}, [relayPool, activeAccount, naddr, handleFetchHighlights, handleFetchContacts])
|
||||
}, [relayPool, activeAccount, naddr, externalUrl, handleFetchHighlights, handleFetchContacts])
|
||||
|
||||
return {
|
||||
bookmarks,
|
||||
|
||||
@@ -71,7 +71,7 @@ export function useExternalUrlLoader({
|
||||
// Check if fetchHighlightsForUrl exists, otherwise skip
|
||||
if (typeof fetchHighlightsForUrl === 'function') {
|
||||
const seen = new Set<string>()
|
||||
const highlightsList = await fetchHighlightsForUrl(
|
||||
await fetchHighlightsForUrl(
|
||||
relayPool,
|
||||
url,
|
||||
(highlight) => {
|
||||
@@ -84,9 +84,9 @@ export function useExternalUrlLoader({
|
||||
})
|
||||
}
|
||||
)
|
||||
// Ensure final list is sorted and contains all items
|
||||
setHighlights(highlightsList.sort((a, b) => b.created_at - a.created_at))
|
||||
console.log(`📌 Found ${highlightsList.length} highlights for URL`)
|
||||
// Highlights are already set via the streaming callback
|
||||
// No need to set them again as that could cause a flash/disappearance
|
||||
console.log(`📌 Finished fetching highlights for URL`)
|
||||
} else {
|
||||
console.log('📌 Highlight fetching for URLs not yet implemented')
|
||||
}
|
||||
|
||||
@@ -14,10 +14,11 @@ export const fetchHighlightsForUrl = async (
|
||||
onHighlight?: (highlight: Highlight) => void,
|
||||
settings?: UserSettings
|
||||
): Promise<Highlight[]> => {
|
||||
const seenIds = new Set<string>()
|
||||
const orderedRelaysUrl = prioritizeLocalRelays(RELAYS)
|
||||
const { local: localRelaysUrl, remote: remoteRelaysUrl } = partitionRelays(orderedRelaysUrl)
|
||||
|
||||
try {
|
||||
const seenIds = new Set<string>()
|
||||
const orderedRelaysUrl = prioritizeLocalRelays(RELAYS)
|
||||
const { local: localRelaysUrl, remote: remoteRelaysUrl } = partitionRelays(orderedRelaysUrl)
|
||||
const local$ = localRelaysUrl.length > 0
|
||||
? relayPool
|
||||
.req(localRelaysUrl, { kinds: [9802], '#r': [url] })
|
||||
@@ -45,11 +46,23 @@ export const fetchHighlightsForUrl = async (
|
||||
)
|
||||
: new Observable<NostrEvent>((sub) => sub.complete())
|
||||
const rawEvents: NostrEvent[] = await lastValueFrom(merge(local$, remote$).pipe(toArray()))
|
||||
await rebroadcastEvents(rawEvents, relayPool, settings)
|
||||
|
||||
console.log(`📌 Fetched ${rawEvents.length} highlight events for URL:`, url)
|
||||
|
||||
// Rebroadcast events - but don't let errors here break the highlight display
|
||||
try {
|
||||
await rebroadcastEvents(rawEvents, relayPool, settings)
|
||||
} catch (err) {
|
||||
console.warn('Failed to rebroadcast highlight events:', err)
|
||||
}
|
||||
|
||||
const uniqueEvents = dedupeHighlights(rawEvents)
|
||||
const highlights: Highlight[] = uniqueEvents.map(eventToHighlight)
|
||||
return sortHighlights(highlights)
|
||||
} catch {
|
||||
} catch (err) {
|
||||
console.error('Error fetching highlights for URL:', err)
|
||||
// Return highlights that were already streamed via callback
|
||||
// Don't return empty array as that would clear already-displayed highlights
|
||||
return []
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user