diff --git a/CHANGELOG.md b/CHANGELOG.md index b81f5fbb..28cfa708 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,43 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.10.11] - 2025-01-27 + +### Added + +- Clock icon for chronological bookmark view +- Clickable highlight count to open highlights sidebar +- Dynamic bookmark filter titles based on selected filter +- Profile picture moved to first position (left-aligned) with consistent sizing + +### Changed + +- Default bookmark view changed to flat chronological list (newest first) +- Bookmark URL changed from `/me/reading-list` to `/me/bookmarks` +- Router updated to handle `/me/reading-list` → `/me/bookmarks` redirect +- Me.tsx bookmarks tab now uses dynamic filter titles and chronological sorting +- Me.tsx updated to use faClock icon instead of faBars +- Removed bookmark count from section headings for cleaner display +- Hide close/collapse sidebar buttons on mobile for better UX + +### Fixed + +- Bookmark sorting now uses proper display time (created_at || listUpdatedAt) with nulls last +- Robust sorting of merged bookmarks with fallback timestamps +- Corrected bookmark timestamp to use bookmark list creation time, not content creation time +- Preserved content created_at while adding listUpdatedAt for proper sorting +- Removed synthetic added_at field, now uses created_at from bookmark list event +- Consistent chronological sorting with useMemo optimization +- Removed unused faTimes import +- Bookmark timestamps now show sane dates using created_at fallback to listUpdatedAt +- Guarded formatters to prevent timestamp display errors + +### Refactored + +- Removed excessive debug logging for cleaner console output +- Bookmark timestamp handling never defaults to "now", allows nulls and sorts nulls last +- Renders empty when timestamp is missing instead of showing invalid dates + ## [0.10.10] - 2025-10-22 ### Changed @@ -2442,7 +2479,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.10.10...HEAD +[Unreleased]: https://github.com/dergigi/boris/compare/v0.10.11...HEAD +[0.10.11]: https://github.com/dergigi/boris/compare/v0.10.10...v0.10.11 [0.10.10]: https://github.com/dergigi/boris/compare/v0.10.9...v0.10.10 [0.10.9]: https://github.com/dergigi/boris/compare/v0.10.8...v0.10.9 [0.10.8]: https://github.com/dergigi/boris/compare/v0.10.7...v0.10.8 diff --git a/src/components/Explore.tsx b/src/components/Explore.tsx index f40259e4..5f3f75c0 100644 --- a/src/components/Explore.tsx +++ b/src/components/Explore.tsx @@ -1,6 +1,6 @@ import React, { useState, useEffect, useMemo, useCallback, useRef } from 'react' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' -import { faNewspaper, faHighlighter, faUser, faUserGroup, faNetworkWired, faArrowsRotate, faSpinner } from '@fortawesome/free-solid-svg-icons' +import { faPersonHiking, faNewspaper, faHighlighter, faUser, faUserGroup, faNetworkWired, faArrowsRotate, faSpinner } from '@fortawesome/free-solid-svg-icons' import IconButton from './IconButton' import { BlogPostSkeleton, HighlightSkeleton } from './Skeletons' import { Hooks } from 'applesauce-react' @@ -584,7 +584,7 @@ const Explore: React.FC = ({ relayPool, eventStore, settings, acti />

- + Explore

diff --git a/src/components/SidebarHeader.tsx b/src/components/SidebarHeader.tsx index 33a61056..3a33df10 100644 --- a/src/components/SidebarHeader.tsx +++ b/src/components/SidebarHeader.tsx @@ -1,7 +1,7 @@ import React from 'react' import { useNavigate } from 'react-router-dom' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' -import { faChevronRight, faRightFromBracket, faUserCircle, faGear, faHome, faNewspaper } from '@fortawesome/free-solid-svg-icons' +import { faChevronRight, faRightFromBracket, faUserCircle, faGear, faHome, faPersonHiking } from '@fortawesome/free-solid-svg-icons' import { Hooks } from 'applesauce-react' import { useEventModel } from 'applesauce-react/hooks' import { Models } from 'applesauce-core' @@ -58,13 +58,6 @@ const SidebarHeader: React.FC = ({ onToggleCollapse, onLogou ariaLabel="Home" variant="ghost" /> - navigate('/explore')} - title="Explore" - ariaLabel="Explore" - variant="ghost" - /> = ({ onToggleCollapse, onLogou ariaLabel="Settings" variant="ghost" /> + navigate('/explore')} + title="Explore" + ariaLabel="Explore" + variant="ghost" + /> {activeAccount && ( { - const listDate = b.listUpdatedAt ? new Date(b.listUpdatedAt * 1000).toISOString() : 'MISSING' - console.log(` ${i + 1}. listUpdatedAt: ${b.listUpdatedAt} (${listDate})`) - console.log(` content: ${(b.content || '').substring(0, 40)}`) - }) const bookmark: Bookmark = { id: `${activeAccount.pubkey}-bookmarks`, diff --git a/src/services/bookmarkProcessing.ts b/src/services/bookmarkProcessing.ts index ece801fb..774d464a 100644 --- a/src/services/bookmarkProcessing.ts +++ b/src/services/bookmarkProcessing.ts @@ -156,13 +156,6 @@ export async function collectBookmarksFromEvents( const pub = Helpers.getPublicBookmarks(evt) const processedPub = processApplesauceBookmarks(pub, activeAccount, false, evt.created_at) - // DEBUG: Check timestamps - if (processedPub.length > 0) { - const first = processedPub[0] - console.log(`📋 Bookmark list event kind:${evt.kind}`) - console.log(` evt.created_at: ${evt.created_at} (${evt.created_at ? new Date(evt.created_at * 1000).toISOString() : 'MISSING'})`) - console.log(` first bookmark listUpdatedAt: ${first.listUpdatedAt} (${first.listUpdatedAt ? new Date(first.listUpdatedAt * 1000).toISOString() : 'MISSING'})`) - } publicItemsAll.push( ...processedPub.map(i => ({