From 377f0c739f487d07c49a20c7850a7a5425a6149d Mon Sep 17 00:00:00 2001 From: Sepehr Ramezani Date: Wed, 1 Apr 2026 21:34:22 +0200 Subject: [PATCH] fix: disable mobile drag, replace window.location.reload with router.refresh, use semantic icons - Disable Muuri drag on mobile devices to prevent scroll conflicts - Replace all remaining window.location.reload() with router.refresh() in settings/data, settings/general, and note-editor - Replace duplicate X icons with semantic icons (Trash2 for fused badge, LogOut for leave share) Co-Authored-By: Claude Opus 4.5 --- keep-notes/app/(main)/settings/data/page.tsx | 6 ++++-- keep-notes/app/(main)/settings/general/page.tsx | 6 ++++-- keep-notes/components/masonry-grid.tsx | 2 +- keep-notes/components/note-card.tsx | 6 +++--- keep-notes/components/note-editor.tsx | 3 +-- 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/keep-notes/app/(main)/settings/data/page.tsx b/keep-notes/app/(main)/settings/data/page.tsx index 011f4cc..7d8c301 100644 --- a/keep-notes/app/(main)/settings/data/page.tsx +++ b/keep-notes/app/(main)/settings/data/page.tsx @@ -6,9 +6,11 @@ import { Button } from '@/components/ui/button' import { Download, Upload, Trash2, Loader2 } from 'lucide-react' import { toast } from 'sonner' import { useLanguage } from '@/lib/i18n' +import { useRouter } from 'next/navigation' export default function DataSettingsPage() { const { t } = useLanguage() + const router = useRouter() const [isExporting, setIsExporting] = useState(false) const [isImporting, setIsImporting] = useState(false) const [isDeleting, setIsDeleting] = useState(false) @@ -54,7 +56,7 @@ export default function DataSettingsPage() { if (response.ok) { const result = await response.json() toast.success(t('dataManagement.import.success', { count: result.count })) - window.location.reload() + router.refresh() } else { throw new Error('Import failed') } @@ -77,7 +79,7 @@ export default function DataSettingsPage() { const response = await fetch('/api/notes/delete-all', { method: 'POST' }) if (response.ok) { toast.success(t('dataManagement.delete.success')) - window.location.reload() + router.refresh() } } catch (error) { console.error('Delete error:', error) diff --git a/keep-notes/app/(main)/settings/general/page.tsx b/keep-notes/app/(main)/settings/general/page.tsx index fd01e26..1b47e58 100644 --- a/keep-notes/app/(main)/settings/general/page.tsx +++ b/keep-notes/app/(main)/settings/general/page.tsx @@ -5,9 +5,11 @@ import { SettingsNav, SettingsSection, SettingToggle, SettingSelect } from '@/co import { useLanguage } from '@/lib/i18n' import { updateAISettings, getAISettings } from '@/app/actions/ai-settings' import { toast } from 'sonner' +import { useRouter } from 'next/navigation' export default function GeneralSettingsPage() { const { t, setLanguage: setContextLanguage } = useLanguage() + const router = useRouter() const [language, setLanguage] = useState('auto') const [emailNotifications, setEmailNotifications] = useState(false) const [desktopNotifications, setDesktopNotifications] = useState(false) @@ -45,8 +47,8 @@ export default function GeneralSettingsPage() { toast.success(t('profile.languageUpdateSuccess') || "Language updated") } - // 3. Force reload to ensure all components update (server components, metadata, etc.) - setTimeout(() => window.location.reload(), 500) + // 3. Refresh server components to ensure all components update (metadata, etc.) + setTimeout(() => router.refresh(), 500) } const handleEmailNotificationsChange = async (enabled: boolean) => { diff --git a/keep-notes/components/masonry-grid.tsx b/keep-notes/components/masonry-grid.tsx index 597f9d3..bc98973 100644 --- a/keep-notes/components/masonry-grid.tsx +++ b/keep-notes/components/masonry-grid.tsx @@ -183,7 +183,7 @@ export function MasonryGrid({ notes, onEdit }: MasonryGridProps) { const layoutOptions = { - dragEnabled: true, + dragEnabled: !isMobile, // Use drag handle for mobile devices to allow smooth scrolling // On desktop, whole card is draggable (no handle needed) dragHandle: isMobile ? '.muuri-drag-handle' : undefined, diff --git a/keep-notes/components/note-card.tsx b/keep-notes/components/note-card.tsx index 6a18642..d6e0fa4 100644 --- a/keep-notes/components/note-card.tsx +++ b/keep-notes/components/note-card.tsx @@ -10,7 +10,7 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' -import { Pin, Bell, GripVertical, X, Link2, FolderOpen, StickyNote, LucideIcon, Folder, Briefcase, FileText, Zap, BarChart3, Globe, Sparkles, Book, Heart, Crown, Music, Building2 } from 'lucide-react' +import { Pin, Bell, GripVertical, X, Link2, FolderOpen, StickyNote, LucideIcon, Folder, Briefcase, FileText, Zap, BarChart3, Globe, Sparkles, Book, Heart, Crown, Music, Building2, LogOut, Trash2 } from 'lucide-react' import { useState, useEffect, useTransition, useOptimistic, memo } from 'react' import { useSession } from 'next-auth/react' import { useRouter, useSearchParams } from 'next/navigation' @@ -444,7 +444,7 @@ export const NoteCard = memo(function NoteCard({ className="ml-1 opacity-0 group-hover/badge:opacity-100 hover:opacity-100 transition-opacity" title={t('notes.remove') || 'Remove'} > - + )} @@ -499,7 +499,7 @@ export const NoteCard = memo(function NoteCard({ handleLeaveShare() }} > - + {t('notes.leaveShare')} diff --git a/keep-notes/components/note-editor.tsx b/keep-notes/components/note-editor.tsx index 4df82bf..2d0b0d3 100644 --- a/keep-notes/components/note-editor.tsx +++ b/keep-notes/components/note-editor.tsx @@ -528,9 +528,8 @@ export function NoteEditor({ note, readOnly = false, onClose }: NoteEditorProps) size: size, }) toast.success(t('notes.copySuccess')) + triggerRefresh() onClose() - // Force refresh to show the new note - window.location.reload() } catch (error) { console.error('Failed to copy note:', error) toast.error(t('notes.copyFailed'))