+
setIsDropdownOpen(false)}
>
- {t('navigation.profile')}
+ {t('nav.profile', 'Profile Settings')}
)}
diff --git a/app/frontend/components/Note/NoteDetails.tsx b/frontend/components/Note/NoteDetails.tsx
similarity index 100%
rename from app/frontend/components/Note/NoteDetails.tsx
rename to frontend/components/Note/NoteDetails.tsx
diff --git a/app/frontend/components/Note/NoteModal.tsx b/frontend/components/Note/NoteModal.tsx
similarity index 100%
rename from app/frontend/components/Note/NoteModal.tsx
rename to frontend/components/Note/NoteModal.tsx
diff --git a/app/frontend/components/Notes.tsx b/frontend/components/Notes.tsx
similarity index 100%
rename from app/frontend/components/Notes.tsx
rename to frontend/components/Notes.tsx
diff --git a/app/frontend/components/Profile/ProfileSettings.tsx b/frontend/components/Profile/ProfileSettings.tsx
similarity index 98%
rename from app/frontend/components/Profile/ProfileSettings.tsx
rename to frontend/components/Profile/ProfileSettings.tsx
index 157c5c8..af2f6ec 100644
--- a/app/frontend/components/Profile/ProfileSettings.tsx
+++ b/frontend/components/Profile/ProfileSettings.tsx
@@ -6,6 +6,8 @@ import { useToast } from '../Shared/ToastContext';
interface ProfileSettingsProps {
currentUser: { id: number; email: string };
+ isDarkMode?: boolean;
+ toggleDarkMode?: () => void;
}
interface Profile {
@@ -61,14 +63,14 @@ const formatFrequency = (frequency: string): string => {
* Displays and manages user profile settings including appearance, language,
* timezone, telegram integration, and task summary settings.
*/
-const ProfileSettings: React.FC
= ({ currentUser }) => {
+const ProfileSettings: React.FC = ({ currentUser, isDarkMode, toggleDarkMode }) => {
const { t, i18n } = useTranslation();
const { showSuccessToast, showErrorToast } = useToast();
// State variables
const [profile, setProfile] = useState(null);
const [formData, setFormData] = useState>({
- appearance: 'light',
+ appearance: isDarkMode ? 'dark' : 'light',
language: 'en',
timezone: 'UTC',
avatar_image: '',
@@ -147,6 +149,14 @@ const ProfileSettings: React.FC = ({ currentUser }) => {
const { name, value } = e.target;
setFormData(prev => ({ ...prev, [name]: value }));
+ // Handle appearance change immediately
+ if (name === 'appearance' && toggleDarkMode) {
+ const shouldBeDark = value === 'dark';
+ if (shouldBeDark !== isDarkMode) {
+ toggleDarkMode();
+ }
+ }
+
// Handle language change immediately
if (name === 'language' && value !== i18n.language) {
handleLanguageChange(value);
@@ -231,7 +241,7 @@ const ProfileSettings: React.FC = ({ currentUser }) => {
const data = await response.json();
setProfile(data);
setFormData({
- appearance: data.appearance || 'light',
+ appearance: isDarkMode ? 'dark' : 'light', // Use current app state instead of saved preference
language: data.language || 'en',
timezone: data.timezone || 'UTC',
avatar_image: data.avatar_image || '',
@@ -283,6 +293,11 @@ const ProfileSettings: React.FC = ({ currentUser }) => {
useEffect(() => {
console.log(`Component refreshed with key: ${updateKey}, language: ${i18n.language}`);
}, [updateKey, i18n.language]);
+
+ // Update appearance in form data when dark mode changes
+ useEffect(() => {
+ setFormData(prev => ({ ...prev, appearance: isDarkMode ? 'dark' : 'light' }));
+ }, [isDarkMode]);
useEffect(() => {
const handleLanguageChanged = (lng: string) => {
@@ -314,15 +329,6 @@ const ProfileSettings: React.FC = ({ currentUser }) => {
};
}, []);
- const handleAvatarChange = (e: ChangeEvent) => {
- if (e.target.files && e.target.files[0]) {
- const reader = new FileReader();
- reader.onloadend = () => {
- setFormData((prev) => ({ ...prev, avatar_image: reader.result as string }));
- };
- reader.readAsDataURL(e.target.files[0]);
- }
- };
const handleSetupTelegram = async () => {
setTelegramSetupStatus('loading');
diff --git a/app/frontend/components/Profile/ProfileSettings.tsx.bak b/frontend/components/Profile/ProfileSettings.tsx.bak
similarity index 100%
rename from app/frontend/components/Profile/ProfileSettings.tsx.bak
rename to frontend/components/Profile/ProfileSettings.tsx.bak
diff --git a/app/frontend/components/Profile/ProfileSettings.tsx.clean b/frontend/components/Profile/ProfileSettings.tsx.clean
similarity index 100%
rename from app/frontend/components/Profile/ProfileSettings.tsx.clean
rename to frontend/components/Profile/ProfileSettings.tsx.clean
diff --git a/app/frontend/components/Project/ProjectDetails.tsx b/frontend/components/Project/ProjectDetails.tsx
similarity index 96%
rename from app/frontend/components/Project/ProjectDetails.tsx
rename to frontend/components/Project/ProjectDetails.tsx
index b2318ba..18aab6b 100644
--- a/app/frontend/components/Project/ProjectDetails.tsx
+++ b/frontend/components/Project/ProjectDetails.tsx
@@ -16,6 +16,7 @@ import { PriorityType, Task } from "../../entities/Task";
import { fetchProjectById, updateProject, deleteProject } from "../../utils/projectsService";
import { createTask, updateTask, deleteTask } from "../../utils/tasksService";
import { fetchAreas } from "../../utils/areasService";
+import { isAuthError } from "../../utils/authUtils";
import { CalendarDaysIcon, InformationCircleIcon } from "@heroicons/react/24/solid";
type PriorityStyles = Record & { default: string };
@@ -67,7 +68,7 @@ const ProjectDetails: React.FC = () => {
const handleTaskCreate = async (taskName: string) => {
if (!project) {
console.error("Cannot create task: Project is missing");
- return;
+ throw new Error("Cannot create task: Project is missing");
}
try {
@@ -77,8 +78,13 @@ const ProjectDetails: React.FC = () => {
project_id: project.id,
});
setTasks((prevTasks) => [...prevTasks, newTask]);
- } catch (err) {
+ } catch (err: any) {
console.error("Error creating task:", err);
+ // Check if it's an authentication error
+ if (isAuthError(err)) {
+ return;
+ }
+ throw err; // Re-throw to allow proper error handling by NewTask component
}
};
diff --git a/app/frontend/components/Project/ProjectItem.tsx b/frontend/components/Project/ProjectItem.tsx
similarity index 100%
rename from app/frontend/components/Project/ProjectItem.tsx
rename to frontend/components/Project/ProjectItem.tsx
diff --git a/app/frontend/components/Project/ProjectModal.tsx b/frontend/components/Project/ProjectModal.tsx
similarity index 100%
rename from app/frontend/components/Project/ProjectModal.tsx
rename to frontend/components/Project/ProjectModal.tsx
diff --git a/app/frontend/components/Projects.tsx b/frontend/components/Projects.tsx
similarity index 100%
rename from app/frontend/components/Projects.tsx
rename to frontend/components/Projects.tsx
diff --git a/app/frontend/components/Shared/ConfirmDialog.tsx b/frontend/components/Shared/ConfirmDialog.tsx
similarity index 100%
rename from app/frontend/components/Shared/ConfirmDialog.tsx
rename to frontend/components/Shared/ConfirmDialog.tsx
diff --git a/app/frontend/components/Shared/DarkModeToggle.tsx b/frontend/components/Shared/DarkModeToggle.tsx
similarity index 100%
rename from app/frontend/components/Shared/DarkModeToggle.tsx
rename to frontend/components/Shared/DarkModeToggle.tsx
diff --git a/app/frontend/components/Shared/LoadingScreen.tsx b/frontend/components/Shared/LoadingScreen.tsx
similarity index 100%
rename from app/frontend/components/Shared/LoadingScreen.tsx
rename to frontend/components/Shared/LoadingScreen.tsx
diff --git a/app/frontend/components/Shared/NotFound.tsx b/frontend/components/Shared/NotFound.tsx
similarity index 100%
rename from app/frontend/components/Shared/NotFound.tsx
rename to frontend/components/Shared/NotFound.tsx
diff --git a/app/frontend/components/Shared/PriorityDropdown.tsx b/frontend/components/Shared/PriorityDropdown.tsx
similarity index 100%
rename from app/frontend/components/Shared/PriorityDropdown.tsx
rename to frontend/components/Shared/PriorityDropdown.tsx
diff --git a/app/frontend/components/Shared/StatusDropdown.tsx b/frontend/components/Shared/StatusDropdown.tsx
similarity index 100%
rename from app/frontend/components/Shared/StatusDropdown.tsx
rename to frontend/components/Shared/StatusDropdown.tsx
diff --git a/app/frontend/components/Shared/Switch.tsx b/frontend/components/Shared/Switch.tsx
similarity index 100%
rename from app/frontend/components/Shared/Switch.tsx
rename to frontend/components/Shared/Switch.tsx
diff --git a/app/frontend/components/Shared/ToastContext.tsx b/frontend/components/Shared/ToastContext.tsx
similarity index 100%
rename from app/frontend/components/Shared/ToastContext.tsx
rename to frontend/components/Shared/ToastContext.tsx
diff --git a/app/frontend/components/Sidebar.tsx b/frontend/components/Sidebar.tsx
similarity index 100%
rename from app/frontend/components/Sidebar.tsx
rename to frontend/components/Sidebar.tsx
diff --git a/app/frontend/components/Sidebar/CreateNewDropdownButton.tsx b/frontend/components/Sidebar/CreateNewDropdownButton.tsx
similarity index 97%
rename from app/frontend/components/Sidebar/CreateNewDropdownButton.tsx
rename to frontend/components/Sidebar/CreateNewDropdownButton.tsx
index ee8dbd0..ac6488d 100644
--- a/app/frontend/components/Sidebar/CreateNewDropdownButton.tsx
+++ b/frontend/components/Sidebar/CreateNewDropdownButton.tsx
@@ -71,7 +71,7 @@ const CreateNewDropdownButton: React.FC = ({
className="w-5 h-5 mr-2 text-gray-500 dark:text-gray-400"
aria-hidden="true"
/>
- {t('dropdown.createNew')}
+ {t('dropdown.createNew', 'Create New')}
= ({
role="menuitem"
>
{icon}
- {t(translationKey)}
+ {t(translationKey, label)}
))}
diff --git a/app/frontend/components/Sidebar/SidebarAreas.tsx b/frontend/components/Sidebar/SidebarAreas.tsx
similarity index 100%
rename from app/frontend/components/Sidebar/SidebarAreas.tsx
rename to frontend/components/Sidebar/SidebarAreas.tsx
diff --git a/app/frontend/components/Sidebar/SidebarFooter.tsx b/frontend/components/Sidebar/SidebarFooter.tsx
similarity index 100%
rename from app/frontend/components/Sidebar/SidebarFooter.tsx
rename to frontend/components/Sidebar/SidebarFooter.tsx
diff --git a/app/frontend/components/Sidebar/SidebarHeader.tsx b/frontend/components/Sidebar/SidebarHeader.tsx
similarity index 100%
rename from app/frontend/components/Sidebar/SidebarHeader.tsx
rename to frontend/components/Sidebar/SidebarHeader.tsx
diff --git a/app/frontend/components/Sidebar/SidebarNav.tsx b/frontend/components/Sidebar/SidebarNav.tsx
similarity index 100%
rename from app/frontend/components/Sidebar/SidebarNav.tsx
rename to frontend/components/Sidebar/SidebarNav.tsx
diff --git a/app/frontend/components/Sidebar/SidebarNotes.tsx b/frontend/components/Sidebar/SidebarNotes.tsx
similarity index 100%
rename from app/frontend/components/Sidebar/SidebarNotes.tsx
rename to frontend/components/Sidebar/SidebarNotes.tsx
diff --git a/app/frontend/components/Sidebar/SidebarProjects.tsx b/frontend/components/Sidebar/SidebarProjects.tsx
similarity index 100%
rename from app/frontend/components/Sidebar/SidebarProjects.tsx
rename to frontend/components/Sidebar/SidebarProjects.tsx
diff --git a/app/frontend/components/Sidebar/SidebarTags.tsx b/frontend/components/Sidebar/SidebarTags.tsx
similarity index 100%
rename from app/frontend/components/Sidebar/SidebarTags.tsx
rename to frontend/components/Sidebar/SidebarTags.tsx
diff --git a/app/frontend/components/Tag/TagDetails.tsx b/frontend/components/Tag/TagDetails.tsx
similarity index 100%
rename from app/frontend/components/Tag/TagDetails.tsx
rename to frontend/components/Tag/TagDetails.tsx
diff --git a/app/frontend/components/Tag/TagInput.tsx b/frontend/components/Tag/TagInput.tsx
similarity index 95%
rename from app/frontend/components/Tag/TagInput.tsx
rename to frontend/components/Tag/TagInput.tsx
index e0bf38e..9203393 100644
--- a/app/frontend/components/Tag/TagInput.tsx
+++ b/frontend/components/Tag/TagInput.tsx
@@ -20,21 +20,15 @@ const TagInput: React.FC = ({ initialTags, onTagsChange, availabl
const dropdownRef = useRef(null);
// Update internal tags state when initialTags prop changes
- useEffect(() => {
- console.log("TagInput received initialTags:", initialTags);
-
+ useEffect(() => {
// Set the tags state with the initial tags
if (initialTags && initialTags.length > 0) {
// Simply set our internal state to match the initialTags
setTags(initialTags);
- console.log("Set tags to match initialTags:", initialTags);
}
}, [initialTags]);
- // Clean up effect to notify parent when our tags state changes
useEffect(() => {
- // Notify parent of current state
- console.log("TagInput internal tags state changed to:", tags);
onTagsChange(tags);
}, [tags, onTagsChange]);
diff --git a/app/frontend/components/Tag/TagModal.tsx b/frontend/components/Tag/TagModal.tsx
similarity index 100%
rename from app/frontend/components/Tag/TagModal.tsx
rename to frontend/components/Tag/TagModal.tsx
diff --git a/app/frontend/components/Tags.tsx b/frontend/components/Tags.tsx
similarity index 100%
rename from app/frontend/components/Tags.tsx
rename to frontend/components/Tags.tsx
diff --git a/app/frontend/components/Task/NewTask.tsx b/frontend/components/Task/NewTask.tsx
similarity index 90%
rename from app/frontend/components/Task/NewTask.tsx
rename to frontend/components/Task/NewTask.tsx
index 28844c7..62615ff 100644
--- a/app/frontend/components/Task/NewTask.tsx
+++ b/frontend/components/Task/NewTask.tsx
@@ -4,7 +4,7 @@ import { useTranslation } from 'react-i18next';
import { PlusCircleIcon } from '@heroicons/react/24/outline';
interface NewTaskProps {
- onTaskCreate: (taskName: string) => void;
+ onTaskCreate: (taskName: string) => Promise;
}
const NewTask: React.FC = ({ onTaskCreate }) => {
@@ -18,12 +18,15 @@ const NewTask: React.FC = ({ onTaskCreate }) => {
const handleKeyDown = async (event: React.KeyboardEvent) => {
if (event.key === 'Enter' && taskName.trim()) {
+ const taskText = taskName.trim();
+ setTaskName('');
+
try {
- await onTaskCreate(taskName.trim());
- setTaskName('');
+ await onTaskCreate(taskText);
showSuccessToast(t('success.taskCreated', 'Task created successfully!'));
} catch (error) {
console.error('Error creating task:', error);
+ setTaskName(taskText);
showErrorToast(t('errors.taskCreate', 'Failed to create task.'));
}
}
diff --git a/app/frontend/components/Task/SimplifiedTaskModal.tsx b/frontend/components/Task/SimplifiedTaskModal.tsx
similarity index 91%
rename from app/frontend/components/Task/SimplifiedTaskModal.tsx
rename to frontend/components/Task/SimplifiedTaskModal.tsx
index ac0823f..e7e96b5 100644
--- a/app/frontend/components/Task/SimplifiedTaskModal.tsx
+++ b/frontend/components/Task/SimplifiedTaskModal.tsx
@@ -4,11 +4,12 @@ import { InboxItem } from "../../entities/InboxItem";
import { useToast } from "../Shared/ToastContext";
import { useTranslation } from "react-i18next";
import { createInboxItemWithStore } from "../../utils/inboxService";
+import { isAuthError } from "../../utils/authUtils";
interface SimplifiedTaskModalProps {
isOpen: boolean;
onClose: () => void;
- onSave: (task: Task) => void;
+ onSave: (task: Task) => Promise;
initialText?: string;
editMode?: boolean;
onEdit?: (text: string) => Promise;
@@ -63,12 +64,21 @@ const SimplifiedTaskModal: React.FC = ({
status: "not_started",
};
- onSave(newTask);
- showSuccessToast(t('task.createSuccess'));
- setInputText('');
+ try {
+ await onSave(newTask);
+ showSuccessToast(t('task.createSuccess'));
+ setInputText('');
+ handleClose();
+ } catch (error: any) {
+ // If it's an auth error, don't show error toast (user will be redirected)
+ if (isAuthError(error)) {
+ return;
+ }
+ throw error;
+ }
} else {
try {
- const newItem = await createInboxItemWithStore(inputText.trim());
+ await createInboxItemWithStore(inputText.trim());
showSuccessToast(t('inbox.itemAdded'));
@@ -86,6 +96,7 @@ const SimplifiedTaskModal: React.FC = ({
} else {
showErrorToast(saveMode === 'task' ? t('task.createError') : t('inbox.addError'));
}
+ } finally {
setIsSaving(false);
}
}, [inputText, isSaving, editMode, onEdit, saveMode, onSave, showSuccessToast, showErrorToast, t, onClose]);
diff --git a/app/frontend/components/Task/TaskActions.tsx b/frontend/components/Task/TaskActions.tsx
similarity index 100%
rename from app/frontend/components/Task/TaskActions.tsx
rename to frontend/components/Task/TaskActions.tsx
diff --git a/app/frontend/components/Task/TaskDueDate.tsx b/frontend/components/Task/TaskDueDate.tsx
similarity index 100%
rename from app/frontend/components/Task/TaskDueDate.tsx
rename to frontend/components/Task/TaskDueDate.tsx
diff --git a/app/frontend/components/Task/TaskHeader.tsx b/frontend/components/Task/TaskHeader.tsx
similarity index 100%
rename from app/frontend/components/Task/TaskHeader.tsx
rename to frontend/components/Task/TaskHeader.tsx
diff --git a/app/frontend/components/Task/TaskItem.tsx b/frontend/components/Task/TaskItem.tsx
similarity index 100%
rename from app/frontend/components/Task/TaskItem.tsx
rename to frontend/components/Task/TaskItem.tsx
diff --git a/app/frontend/components/Task/TaskList.tsx b/frontend/components/Task/TaskList.tsx
similarity index 100%
rename from app/frontend/components/Task/TaskList.tsx
rename to frontend/components/Task/TaskList.tsx
diff --git a/app/frontend/components/Task/TaskModal.tsx b/frontend/components/Task/TaskModal.tsx
similarity index 94%
rename from app/frontend/components/Task/TaskModal.tsx
rename to frontend/components/Task/TaskModal.tsx
index 5839d40..2bab10d 100644
--- a/app/frontend/components/Task/TaskModal.tsx
+++ b/frontend/components/Task/TaskModal.tsx
@@ -39,9 +39,10 @@ const TaskModal: React.FC = ({
const modalRef = useRef(null);
const [isClosing, setIsClosing] = useState(false);
const [showConfirmDialog, setShowConfirmDialog] = useState(false);
+ const [localAvailableTags, setLocalAvailableTags] = useState>([]);
+ const [tagsLoaded, setTagsLoaded] = useState(false);
+ const [tagsLoading, setTagsLoading] = useState(false);
const { showSuccessToast, showErrorToast } = useToast();
- const { tagsStore } = useStore();
- const { tags: availableTags, setTags: setAvailableTags, setLoading: setTagsLoading, setError: setTagsError } = tagsStore;
const { t } = useTranslation();
useEffect(() => {
@@ -54,22 +55,26 @@ const TaskModal: React.FC = ({
useEffect(() => {
const loadTags = async () => {
- setTagsLoading(true);
- try {
- if (availableTags.length === 0) {
+ if (isOpen && !tagsLoaded) {
+ setTagsLoading(true);
+ try {
const fetchedTags = await fetchTags();
- setAvailableTags(fetchedTags);
+ setLocalAvailableTags(fetchedTags);
+ setTagsLoaded(true);
+ } catch (error: any) {
+ console.error("Error fetching tags:", error);
+ setTagsLoaded(true); // Mark as loaded even on error to prevent retry loop
+ } finally {
+ setTagsLoading(false);
}
- } catch (error) {
- setTagsError(true);
- console.error("Error fetching tags:", error);
- } finally {
- setTagsLoading(false);
}
};
- loadTags();
- }, [availableTags.length, setAvailableTags, setTagsError, setTagsLoading]);
+ // Only load tags if modal is open
+ if (isOpen) {
+ loadTags();
+ }
+ }, [isOpen, tagsLoaded]);
const handleChange = (
e: React.ChangeEvent
@@ -146,6 +151,7 @@ const TaskModal: React.FC = ({
setTimeout(() => {
onClose();
setIsClosing(false);
+ setTagsLoaded(false); // Reset tags loaded state for next modal open
}, 300);
};
@@ -220,7 +226,7 @@ const TaskModal: React.FC = ({
tag.name) || []}
- availableTags={availableTags}
+ availableTags={localAvailableTags}
/>
diff --git a/app/frontend/components/Task/TaskPriorityIcon.tsx b/frontend/components/Task/TaskPriorityIcon.tsx
similarity index 100%
rename from app/frontend/components/Task/TaskPriorityIcon.tsx
rename to frontend/components/Task/TaskPriorityIcon.tsx
diff --git a/app/frontend/components/Task/TaskStatusBadge.tsx b/frontend/components/Task/TaskStatusBadge.tsx
similarity index 100%
rename from app/frontend/components/Task/TaskStatusBadge.tsx
rename to frontend/components/Task/TaskStatusBadge.tsx
diff --git a/app/frontend/components/Task/TaskTags.tsx b/frontend/components/Task/TaskTags.tsx
similarity index 100%
rename from app/frontend/components/Task/TaskTags.tsx
rename to frontend/components/Task/TaskTags.tsx
diff --git a/app/frontend/components/Task/TasksToday.tsx b/frontend/components/Task/TasksToday.tsx
similarity index 97%
rename from app/frontend/components/Task/TasksToday.tsx
rename to frontend/components/Task/TasksToday.tsx
index e58bb96..a78bc1b 100644
--- a/app/frontend/components/Task/TasksToday.tsx
+++ b/frontend/components/Task/TasksToday.tsx
@@ -15,6 +15,7 @@ import {
} from "@heroicons/react/24/outline";
import { fetchTasks, updateTask, deleteTask } from "../../utils/tasksService";
import { fetchProjects } from "../../utils/projectsService";
+import { loadInboxItemsToStore } from "../../utils/inboxService";
import { Task } from "../../entities/Task";
import { useStore } from "../../store/useStore";
import TaskList from "./TaskList";
@@ -73,6 +74,13 @@ const TasksToday: React.FC = () => {
setIsLoading(true);
setIsError(false);
+ try {
+ // Load inbox items to ensure the notification appears correctly
+ loadInboxItemsToStore();
+ } catch (error) {
+ console.error("Failed to load inbox items:", error);
+ }
+
try {
// Load projects first
const projectsData = await fetchProjects();
diff --git a/app/frontend/components/Task/getDescription.ts b/frontend/components/Task/getDescription.ts
similarity index 100%
rename from app/frontend/components/Task/getDescription.ts
rename to frontend/components/Task/getDescription.ts
diff --git a/app/frontend/components/Task/getTitleAndIcon.ts b/frontend/components/Task/getTitleAndIcon.ts
similarity index 100%
rename from app/frontend/components/Task/getTitleAndIcon.ts
rename to frontend/components/Task/getTitleAndIcon.ts
diff --git a/app/frontend/components/Tasks.tsx b/frontend/components/Tasks.tsx
similarity index 94%
rename from app/frontend/components/Tasks.tsx
rename to frontend/components/Tasks.tsx
index 426e936..afb862f 100644
--- a/app/frontend/components/Tasks.tsx
+++ b/frontend/components/Tasks.tsx
@@ -7,6 +7,7 @@ import { Task } from "../entities/Task";
import { Project } from "../entities/Project";
import { getTitleAndIcon } from "./Task/getTitleAndIcon";
import { getDescription } from "./Task/getDescription";
+import { createTask } from "../utils/tasksService";
import {
TagIcon,
XMarkIcon,
@@ -68,9 +69,9 @@ const Tasks: React.FC = () => {
navigate({
pathname: location.pathname,
search: `?${params.toString()}`,
- });
+ }, { replace: true });
}
- }, [location, navigate]);
+ }, [location.pathname]);
useEffect(() => {
const handleClickOutside = (event: MouseEvent) => {
@@ -134,23 +135,13 @@ const Tasks: React.FC = () => {
const handleTaskCreate = async (taskData: Partial