1. 30 Nov, 2025 11 commits
    • Johnny's avatar
      feat(auth): add PKCE support and enhance OAuth security · 1a9bd32c
      Johnny authored
      Implements critical OAuth 2.0 security improvements to protect against authorization code interception attacks and improve provider compatibility:
      
      - Add PKCE (RFC 7636) support with SHA-256 code challenge/verifier
      - Fix access token extraction to use standard field instead of Extra()
      - Add OAuth error parameter handling (access_denied, invalid_scope, etc.)
      - Maintain backward compatibility for non-PKCE flows
      
      This brings the OAuth implementation up to modern security standards as recommended by Auth0, Okta, and the OAuth 2.0 Security Best Current Practice (RFC 8252).
      
      Backend changes:
      - Add code_verifier parameter to ExchangeToken with PKCE support
      - Use token.AccessToken for better provider compatibility
      - Update proto definition with optional code_verifier field
      
      Frontend changes:
      - Generate cryptographically secure PKCE parameters
      - Include code_challenge in authorization requests
      - Handle and display OAuth provider errors gracefully
      - Pass code_verifier during token exchange
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      Co-Authored-By: 's avatarClaude <noreply@anthropic.com>
      1a9bd32c
    • Johnny's avatar
      chore: tweak comments · a6a8997f
      Johnny authored
      a6a8997f
    • Johnny's avatar
      chore: reorganize reaction components · 07072b75
      Johnny authored
      07072b75
    • Johnny's avatar
      chore: enhance MemoView component structure · 6dcf7cc7
      Johnny authored
      6dcf7cc7
    • Johnny's avatar
      7aa8262e
    • Huang Youchuan's avatar
    • Johnny's avatar
      chore: remove goreleaser · ee9d9603
      Johnny authored
      ee9d9603
    • Johnny's avatar
      refactor: clean up MemoView and MemoEditor component architecture · 2516cdf2
      Johnny authored
      This commit refactors MemoView and MemoEditor components for better
      maintainability, introducing React Context, custom hooks, and improved
      folder structure.
      
      MemoView improvements:
      - Introduce MemoViewContext to eliminate prop drilling
      - Reduce MemoHeader props from 18 to 8
      - Reduce MemoBody props from 9 to 4
      - Extract custom hooks: useMemoViewDerivedState, useMemoEditor,
        useMemoHandlers for better separation of concerns
      - Fix React hooks ordering bug in edit mode
      
      MemoEditor improvements:
      - Extract state management into useMemoEditorState hook
      - Extract keyboard handling into useMemoEditorKeyboard hook
      - Extract event handlers into useMemoEditorHandlers hook
      - Extract initialization logic into useMemoEditorInit hook
      - Reduce main component from 461 to 317 lines (31% reduction)
      
      Folder structure cleanup:
      - Move SortableItem to memo-metadata (correct location)
      - Move ErrorBoundary to components folder
      - Flatten Toolbar/InsertMenu structure (remove unnecessary nesting)
      - Consolidate hooks in main hooks folder
      - Consolidate types in main types folder
      
      Benefits:
      - Better separation of concerns
      - Improved testability
      - Easier maintenance
      - Cleaner code organization
      - No functionality changes
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      Co-Authored-By: 's avatarClaude <noreply@anthropic.com>
      2516cdf2
    • Johnny's avatar
      refactor: remove enable link preview setting · bb7e0cdb
      Johnny authored
      - Remove enable_link_preview field from proto definitions
      - Remove setting UI from MemoRelatedSettings component
      - Remove translations from all 33 locale files
      - Regenerate proto files
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      Co-Authored-By: 's avatarClaude <noreply@anthropic.com>
      bb7e0cdb
    • Johnny's avatar
      refactor: remove legacy disable markdown shortcuts setting · 5fb6f8ec
      Johnny authored
      - Remove disable_markdown_shortcuts field from proto definitions
      - Remove setting UI from MemoRelatedSettings component
      - Enable markdown shortcuts permanently in MemoEditor
      - Remove translations from all 32 locale files
      - Fix TypeScript error in useMemoSave hook by using typed translation function
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      Co-Authored-By: 's avatarClaude <noreply@anthropic.com>
      5fb6f8ec
    • Johnny's avatar
      chore: fix linter · 2b7b70eb
      Johnny authored
      2b7b70eb
  2. 29 Nov, 2025 1 commit
    • Johnny's avatar
      refactor: implement MemoView component with subcomponents and hooks · 1ef11f74
      Johnny authored
      - Added MemoView component to display a single memo card with full functionality including creator info, memo content, attachments, reactions, and comments.
      - Created MemoBody and MemoHeader subcomponents to separate concerns and improve maintainability.
      - Introduced custom hooks for managing memo actions, keyboard shortcuts, NSFW content visibility, and image preview.
      - Implemented reaction handling with new ReactionSelector and ReactionView components.
      - Added TypeScript types for better type safety and clarity.
      - Established constants for memo card styling and keyboard shortcuts.
      - Removed legacy ReactionSelector and ReactionView components from the previous structure.
      1ef11f74
  3. 28 Nov, 2025 1 commit
    • Johnny's avatar
      feat: add LocationDialog and related hooks for location management in MemoEditor · 50199fe9
      Johnny authored
      - Implemented LocationDialog component for selecting and entering location coordinates.
      - Created useLocation hook to manage location state and updates.
      - Added LocationState type for managing location data.
      - Introduced useLinkMemo hook for linking memos with search functionality.
      - Added VisibilitySelector component for selecting memo visibility.
      - Refactored MemoEditor to integrate new hooks and components for improved functionality.
      - Removed obsolete handlers and streamlined memo save logic with useMemoSave hook.
      - Enhanced focus mode functionality with dedicated components for overlay and exit button.
      50199fe9
  4. 27 Nov, 2025 1 commit
  5. 26 Nov, 2025 7 commits
  6. 25 Nov, 2025 7 commits
  7. 24 Nov, 2025 6 commits
  8. 23 Nov, 2025 2 commits
    • Johnny's avatar
      60d977c0
    • Johnny's avatar
      refactor(markdown): use Unicode categories for tag validation · b78d4c25
      Johnny authored
      Replace custom character whitelist with Unicode standards-based validation:
      
      - Use unicode.IsLetter/IsNumber/IsSymbol instead of hardcoded lists
      - Remove manual UTF-8 byte checking for CJK punctuation
      - Add proper rune-based length limiting (MAX_TAG_LENGTH = 100)
      - Improve international character support (CJK, Arabic, Cyrillic, etc.)
      - Add emoji support via unicode.IsSymbol
      
      Benefits:
      - Cleaner, more maintainable code (~50 lines removed)
      - Standards-based approach following Unicode categories
      - Better UTF-8 safety with utf8.DecodeRune
      - Consistent validation between Go backend and TypeScript frontend
      
      All existing tests pass with improved Unicode handling.
      b78d4c25
  9. 21 Nov, 2025 2 commits
  10. 19 Nov, 2025 2 commits
    • Steven's avatar
      fix(web): refresh sidebar tags when creating/updating memos · edfbd6b0
      Steven authored
      The sidebar tag list wasn't updating when users created new memos with tags
      or modified existing memo tags. This was because useFilteredMemoStats hook
      only refetched when filter/state/orderBy changed.
      
      Now the hook observes memoStore.state.stateId, which changes whenever memos
      are created, updated, or deleted. This triggers automatic refetch and the
      sidebar updates immediately with the latest tag counts.
      
      Fixes tag refresh issue in sidebar
      edfbd6b0
    • Steven's avatar
      fix(web): resolve Leaflet DOM cleanup error causing app crashes · cabd0d61
      Steven authored
      - Add MapCleanup component to properly remove Leaflet map instances on unmount
      - Fix LocationMarker initialization with useRef to prevent re-initialization
      - Remove problematic key prop in LocationDialog that caused unnecessary remounts
      - Fix goimports formatting in tag parser
      
      Fixes #5260
      cabd0d61