[WEB-1634] dev: update application router to support n-progress. (#4846)

* [WEB-1634] dev: update application router to support n-progress.

* chore: update app router initilization logic.

* fix: lint errors
This commit is contained in:
Prateek Shourya 2024-06-18 11:35:20 +05:30 committed by GitHub
parent 10e67144a0
commit 6828d33c3f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
111 changed files with 480 additions and 374 deletions

View file

@ -2,7 +2,7 @@
import { FC } from "react"; import { FC } from "react";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
import { useParams, usePathname, useRouter } from "next/navigation"; import { useParams, usePathname } from "next/navigation";
// ui // ui
import { ArchiveIcon, Breadcrumbs, Tooltip } from "@plane/ui"; import { ArchiveIcon, Breadcrumbs, Tooltip } from "@plane/ui";
// components // components
@ -12,11 +12,12 @@ import { PROJECT_ARCHIVES_BREADCRUMB_LIST } from "@/constants/archives";
import { EIssuesStoreType } from "@/constants/issue"; import { EIssuesStoreType } from "@/constants/issue";
// hooks // hooks
import { useIssues, useProject } from "@/hooks/store"; import { useIssues, useProject } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
import { usePlatformOS } from "@/hooks/use-platform-os"; import { usePlatformOS } from "@/hooks/use-platform-os";
export const ProjectArchivesHeader: FC = observer(() => { export const ProjectArchivesHeader: FC = observer(() => {
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug, projectId } = useParams(); const { workspaceSlug, projectId } = useParams();
const pathname = usePathname(); const pathname = usePathname();
const activeTab = pathname.split("/").pop(); const activeTab = pathname.split("/").pop();

View file

@ -1,7 +1,7 @@
"use client"; "use client";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
import useSWR from "swr"; import useSWR from "swr";
// components // components
import { EmptyState } from "@/components/common"; import { EmptyState } from "@/components/common";
@ -14,13 +14,14 @@ import { CycleLayoutRoot } from "@/components/issues/issue-layouts";
import { cn } from "@/helpers/common.helper"; import { cn } from "@/helpers/common.helper";
// hooks // hooks
import { useCycle, useProject } from "@/hooks/store"; import { useCycle, useProject } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
import useLocalStorage from "@/hooks/use-local-storage"; import useLocalStorage from "@/hooks/use-local-storage";
// assets // assets
import emptyCycle from "@/public/empty-state/cycle.svg"; import emptyCycle from "@/public/empty-state/cycle.svg";
const CycleDetailPage = observer(() => { const CycleDetailPage = observer(() => {
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug, projectId, cycleId } = useParams(); const { workspaceSlug, projectId, cycleId } = useParams();
// store hooks // store hooks
const { fetchCycleDetails, getCycleById } = useCycle(); const { fetchCycleDetails, getCycleById } = useCycle();

View file

@ -3,7 +3,7 @@
import { useCallback, useState } from "react"; import { useCallback, useState } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import Link from "next/link"; import Link from "next/link";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
// icons // icons
import { ArrowRight, PanelRight } from "lucide-react"; import { ArrowRight, PanelRight } from "lucide-react";
// types // types
@ -33,6 +33,7 @@ import {
useIssues, useIssues,
useCommandPalette, useCommandPalette,
} from "@/hooks/store"; } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
import useLocalStorage from "@/hooks/use-local-storage"; import useLocalStorage from "@/hooks/use-local-storage";
import { usePlatformOS } from "@/hooks/use-platform-os"; import { usePlatformOS } from "@/hooks/use-platform-os";
@ -61,7 +62,7 @@ export const CycleIssuesHeader: React.FC = observer(() => {
// states // states
const [analyticsModal, setAnalyticsModal] = useState(false); const [analyticsModal, setAnalyticsModal] = useState(false);
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug, projectId, cycleId } = useParams() as { const { workspaceSlug, projectId, cycleId } = useParams() as {
workspaceSlug: string; workspaceSlug: string;
projectId: string; projectId: string;

View file

@ -2,7 +2,7 @@
import { FC } from "react"; import { FC } from "react";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
// ui // ui
import { Breadcrumbs, Button, ContrastIcon } from "@plane/ui"; import { Breadcrumbs, Button, ContrastIcon } from "@plane/ui";
// components // components
@ -12,10 +12,11 @@ import { CyclesViewHeader } from "@/components/cycles";
import { EUserProjectRoles } from "@/constants/project"; import { EUserProjectRoles } from "@/constants/project";
// hooks // hooks
import { useCommandPalette, useEventTracker, useProject, useUser } from "@/hooks/store"; import { useCommandPalette, useEventTracker, useProject, useUser } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
export const CyclesListHeader: FC = observer(() => { export const CyclesListHeader: FC = observer(() => {
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug } = useParams(); const { workspaceSlug } = useParams();
// store hooks // store hooks
const { toggleCreateCycleModal } = useCommandPalette(); const { toggleCreateCycleModal } = useCommandPalette();

View file

@ -1,16 +1,17 @@
"use client"; "use client";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
import { X, PenSquare } from "lucide-react"; import { X, PenSquare } from "lucide-react";
// components // components
import { PageHead } from "@/components/core"; import { PageHead } from "@/components/core";
import { DraftIssueLayoutRoot } from "@/components/issues/issue-layouts/roots/draft-issue-layout-root"; import { DraftIssueLayoutRoot } from "@/components/issues/issue-layouts/roots/draft-issue-layout-root";
// hooks // hooks
import { useProject } from "@/hooks/store"; import { useProject } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
const ProjectDraftIssuesPage = observer(() => { const ProjectDraftIssuesPage = observer(() => {
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug, projectId } = useParams(); const { workspaceSlug, projectId } = useParams();
// store // store
const { getProjectById } = useProject(); const { getProjectById } = useProject();

View file

@ -2,7 +2,7 @@
import React, { useEffect } from "react"; import React, { useEffect } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
import { useTheme } from "next-themes"; import { useTheme } from "next-themes";
import useSWR from "swr"; import useSWR from "swr";
// ui // ui
@ -14,12 +14,13 @@ import { IssueDetailRoot } from "@/components/issues";
// hooks // hooks
import { useAppTheme, useIssueDetail, useProject } from "@/hooks/store"; import { useAppTheme, useIssueDetail, useProject } from "@/hooks/store";
// assets // assets
import { useAppRouter } from "@/hooks/use-app-router";
import emptyIssueDark from "@/public/empty-state/search/issues-dark.webp"; import emptyIssueDark from "@/public/empty-state/search/issues-dark.webp";
import emptyIssueLight from "@/public/empty-state/search/issues-light.webp"; import emptyIssueLight from "@/public/empty-state/search/issues-light.webp";
const IssueDetailsPage = observer(() => { const IssueDetailsPage = observer(() => {
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug, projectId, issueId } = useParams(); const { workspaceSlug, projectId, issueId } = useParams();
// hooks // hooks
const { resolvedTheme } = useTheme(); const { resolvedTheme } = useTheme();

View file

@ -1,7 +1,7 @@
"use client"; "use client";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
import { PanelRight } from "lucide-react"; import { PanelRight } from "lucide-react";
// ui // ui
import { Breadcrumbs, LayersIcon } from "@plane/ui"; import { Breadcrumbs, LayersIcon } from "@plane/ui";
@ -12,10 +12,11 @@ import { IssueDetailQuickActions } from "@/components/issues";
import { cn } from "@/helpers/common.helper"; import { cn } from "@/helpers/common.helper";
// hooks // hooks
import { useAppTheme, useIssueDetail, useProject } from "@/hooks/store"; import { useAppTheme, useIssueDetail, useProject } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
export const ProjectIssueDetailsHeader = observer(() => { export const ProjectIssueDetailsHeader = observer(() => {
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug, projectId, issueId } = useParams(); const { workspaceSlug, projectId, issueId } = useParams();
// store hooks // store hooks
const { currentProjectDetails } = useProject(); const { currentProjectDetails } = useProject();

View file

@ -2,7 +2,7 @@
import { useCallback, useState } from "react"; import { useCallback, useState } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
// icons // icons
import { Briefcase, Circle, ExternalLink } from "lucide-react"; import { Briefcase, Circle, ExternalLink } from "lucide-react";
// types // types
@ -30,13 +30,14 @@ import {
useCommandPalette, useCommandPalette,
} from "@/hooks/store"; } from "@/hooks/store";
import { useIssues } from "@/hooks/store/use-issues"; import { useIssues } from "@/hooks/store/use-issues";
import { useAppRouter } from "@/hooks/use-app-router";
import { usePlatformOS } from "@/hooks/use-platform-os"; import { usePlatformOS } from "@/hooks/use-platform-os";
export const ProjectIssuesHeader = observer(() => { export const ProjectIssuesHeader = observer(() => {
// states // states
const [analyticsModal, setAnalyticsModal] = useState(false); const [analyticsModal, setAnalyticsModal] = useState(false);
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug, projectId } = useParams() as { workspaceSlug: string; projectId: string }; const { workspaceSlug, projectId } = useParams() as { workspaceSlug: string; projectId: string };
// store hooks // store hooks
const { const {

View file

@ -1,7 +1,7 @@
"use client"; "use client";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
import useSWR from "swr"; import useSWR from "swr";
// components // components
import { EmptyState } from "@/components/common"; import { EmptyState } from "@/components/common";
@ -12,13 +12,14 @@ import { ModuleAnalyticsSidebar } from "@/components/modules";
import { cn } from "@/helpers/common.helper"; import { cn } from "@/helpers/common.helper";
// hooks // hooks
import { useModule, useProject } from "@/hooks/store"; import { useModule, useProject } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
import useLocalStorage from "@/hooks/use-local-storage"; import useLocalStorage from "@/hooks/use-local-storage";
// assets // assets
import emptyModule from "@/public/empty-state/module.svg"; import emptyModule from "@/public/empty-state/module.svg";
const ModuleIssuesPage = observer(() => { const ModuleIssuesPage = observer(() => {
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug, projectId, moduleId } = useParams(); const { workspaceSlug, projectId, moduleId } = useParams();
// store hooks // store hooks
const { fetchModuleDetails, getModuleById } = useModule(); const { fetchModuleDetails, getModuleById } = useModule();

View file

@ -3,7 +3,7 @@
import { useCallback, useState } from "react"; import { useCallback, useState } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import Link from "next/link"; import Link from "next/link";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
// icons // icons
import { ArrowRight, PanelRight } from "lucide-react"; import { ArrowRight, PanelRight } from "lucide-react";
// types // types
@ -33,6 +33,7 @@ import {
useIssues, useIssues,
useCommandPalette, useCommandPalette,
} from "@/hooks/store"; } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
import { useIssuesActions } from "@/hooks/use-issues-actions"; import { useIssuesActions } from "@/hooks/use-issues-actions";
import useLocalStorage from "@/hooks/use-local-storage"; import useLocalStorage from "@/hooks/use-local-storage";
import { usePlatformOS } from "@/hooks/use-platform-os"; import { usePlatformOS } from "@/hooks/use-platform-os";
@ -64,7 +65,7 @@ export const ModuleIssuesHeader: React.FC = observer(() => {
// states // states
const [analyticsModal, setAnalyticsModal] = useState(false); const [analyticsModal, setAnalyticsModal] = useState(false);
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug, projectId, moduleId } = useParams(); const { workspaceSlug, projectId, moduleId } = useParams();
// hooks // hooks
const { isMobile } = usePlatformOS(); const { isMobile } = usePlatformOS();

View file

@ -1,7 +1,7 @@
"use client"; "use client";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
// ui // ui
import { Breadcrumbs, Button, DiceIcon } from "@plane/ui"; import { Breadcrumbs, Button, DiceIcon } from "@plane/ui";
// components // components
@ -11,10 +11,11 @@ import { ModuleViewHeader } from "@/components/modules";
import { EUserProjectRoles } from "@/constants/project"; import { EUserProjectRoles } from "@/constants/project";
// hooks // hooks
import { useCommandPalette, useEventTracker, useProject, useUser } from "@/hooks/store"; import { useCommandPalette, useEventTracker, useProject, useUser } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
export const ModulesListHeader: React.FC = observer(() => { export const ModulesListHeader: React.FC = observer(() => {
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug } = useParams(); const { workspaceSlug } = useParams();
// store hooks // store hooks
const { toggleCreateModuleModal } = useCommandPalette(); const { toggleCreateModuleModal } = useCommandPalette();

View file

@ -3,7 +3,7 @@
import { useRef, useState } from "react"; import { useRef, useState } from "react";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
import Link from "next/link"; import Link from "next/link";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
import useSWR from "swr"; import useSWR from "swr";
// document-editor // document-editor
import { EditorRefApi, useEditorMarkings } from "@plane/document-editor"; import { EditorRefApi, useEditorMarkings } from "@plane/document-editor";
@ -20,6 +20,7 @@ import { PageEditorBody, PageEditorHeaderRoot } from "@/components/pages";
import { cn } from "@/helpers/common.helper"; import { cn } from "@/helpers/common.helper";
// hooks // hooks
import { usePage, useProjectPages } from "@/hooks/store"; import { usePage, useProjectPages } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
const PageDetailsPage = observer(() => { const PageDetailsPage = observer(() => {
// states // states
@ -30,7 +31,7 @@ const PageDetailsPage = observer(() => {
const editorRef = useRef<EditorRefApi>(null); const editorRef = useRef<EditorRefApi>(null);
const readOnlyEditorRef = useRef<EditorRefApi>(null); const readOnlyEditorRef = useRef<EditorRefApi>(null);
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug, projectId, pageId } = useParams(); const { workspaceSlug, projectId, pageId } = useParams();
// store hooks // store hooks
const { createPage, getPageById } = useProjectPages(); const { createPage, getPageById } = useProjectPages();

View file

@ -1,21 +1,21 @@
"use client"; "use client";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useSearchParams } from "next/navigation"; import { useParams, useSearchParams } from "next/navigation";
// types // types
import { TPageNavigationTabs } from "@plane/types"; import { TPageNavigationTabs } from "@plane/types";
// components // components
import { PageHead } from "@/components/core"; import { PageHead } from "@/components/core";
import { PagesListRoot, PagesListView } from "@/components/pages"; import { PagesListRoot, PagesListView } from "@/components/pages";
// hooks // hooks
import { useAppRouter, useProject } from "@/hooks/store"; import { useProject } from "@/hooks/store";
const ProjectPagesPage = observer(() => { const ProjectPagesPage = observer(() => {
// router // router
const searchParams = useSearchParams(); const searchParams = useSearchParams();
const type = searchParams.get("type"); const type = searchParams.get("type");
const { workspaceSlug, projectId } = useParams();
// store hooks // store hooks
const { workspaceSlug, projectId } = useAppRouter();
const { getProjectById } = useProject(); const { getProjectById } = useProject();
// derived values // derived values
const project = projectId ? getProjectById(projectId.toString()) : undefined; const project = projectId ? getProjectById(projectId.toString()) : undefined;

View file

@ -2,7 +2,7 @@
import { FC } from "react"; import { FC } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
// ui // ui
import { Settings } from "lucide-react"; import { Settings } from "lucide-react";
import { Breadcrumbs, CustomMenu } from "@plane/ui"; import { Breadcrumbs, CustomMenu } from "@plane/ui";
@ -12,10 +12,11 @@ import { BreadcrumbLink, Logo } from "@/components/common";
import { EUserProjectRoles, PROJECT_SETTINGS_LINKS } from "@/constants/project"; import { EUserProjectRoles, PROJECT_SETTINGS_LINKS } from "@/constants/project";
// hooks // hooks
import { useProject, useUser } from "@/hooks/store"; import { useProject, useUser } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
export const ProjectSettingHeader: FC = observer(() => { export const ProjectSettingHeader: FC = observer(() => {
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug, projectId } = useParams(); const { workspaceSlug, projectId } = useParams();
// store hooks // store hooks
const { const {

View file

@ -1,7 +1,7 @@
"use client"; "use client";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
import useSWR from "swr"; import useSWR from "swr";
// components // components
import { EmptyState } from "@/components/common"; import { EmptyState } from "@/components/common";
@ -10,11 +10,12 @@ import { ProjectViewLayoutRoot } from "@/components/issues";
// hooks // hooks
import { useProject, useProjectView } from "@/hooks/store"; import { useProject, useProjectView } from "@/hooks/store";
// assets // assets
import { useAppRouter } from "@/hooks/use-app-router";
import emptyView from "@/public/empty-state/view.svg"; import emptyView from "@/public/empty-state/view.svg";
const ProjectViewIssuesPage = observer(() => { const ProjectViewIssuesPage = observer(() => {
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug, projectId, viewId } = useParams(); const { workspaceSlug, projectId, viewId } = useParams();
// store hooks // store hooks
const { fetchViewDetails, getViewById } = useProjectView(); const { fetchViewDetails, getViewById } = useProjectView();

View file

@ -2,6 +2,7 @@
import { useCallback, useRef, useState } from "react"; import { useCallback, useRef, useState } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams } from "next/navigation";
import { Search, Briefcase, X, ListFilter } from "lucide-react"; import { Search, Briefcase, X, ListFilter } from "lucide-react";
// types // types
import { TProjectFilters } from "@plane/types"; import { TProjectFilters } from "@plane/types";
@ -17,17 +18,18 @@ import { EUserWorkspaceRoles } from "@/constants/workspace";
import { cn } from "@/helpers/common.helper"; import { cn } from "@/helpers/common.helper";
import { calculateTotalFilters } from "@/helpers/filter.helper"; import { calculateTotalFilters } from "@/helpers/filter.helper";
// hooks // hooks
import { useAppRouter, useCommandPalette, useEventTracker, useMember, useProjectFilter, useUser } from "@/hooks/store"; import { useCommandPalette, useEventTracker, useMember, useProjectFilter, useUser } from "@/hooks/store";
import useOutsideClickDetector from "@/hooks/use-outside-click-detector"; import useOutsideClickDetector from "@/hooks/use-outside-click-detector";
export const ProjectsListHeader = observer(() => { export const ProjectsListHeader = observer(() => {
// router
const { workspaceSlug } = useParams();
// states // states
const [isSearchOpen, setIsSearchOpen] = useState(false); const [isSearchOpen, setIsSearchOpen] = useState(false);
// refs // refs
const inputRef = useRef<HTMLInputElement>(null); const inputRef = useRef<HTMLInputElement>(null);
// store hooks // store hooks
const { toggleCreateProjectModal } = useCommandPalette(); const { toggleCreateProjectModal } = useCommandPalette();
const { workspaceSlug } = useAppRouter();
const { setTrackElement } = useEventTracker(); const { setTrackElement } = useEventTracker();
const { const {
membership: { currentWorkspaceRole }, membership: { currentWorkspaceRole },
@ -68,7 +70,7 @@ export const ProjectsListHeader = observer(() => {
} }
} }
updateFilters(workspaceSlug, { [key]: newValues }); updateFilters(workspaceSlug.toString(), { [key]: newValues });
}, },
[filters, updateFilters, workspaceSlug] [filters, updateFilters, workspaceSlug]
); );
@ -144,7 +146,7 @@ export const ProjectsListHeader = observer(() => {
value={displayFilters?.order_by} value={displayFilters?.order_by}
onChange={(val) => { onChange={(val) => {
if (!workspaceSlug || val === displayFilters?.order_by) return; if (!workspaceSlug || val === displayFilters?.order_by) return;
updateDisplayFilters(workspaceSlug, { updateDisplayFilters(workspaceSlug.toString(), {
order_by: val, order_by: val,
}); });
}} }}
@ -161,7 +163,7 @@ export const ProjectsListHeader = observer(() => {
handleFiltersUpdate={handleFilters} handleFiltersUpdate={handleFilters}
handleDisplayFiltersUpdate={(val) => { handleDisplayFiltersUpdate={(val) => {
if (!workspaceSlug) return; if (!workspaceSlug) return;
updateDisplayFilters(workspaceSlug, val); updateDisplayFilters(workspaceSlug.toString(), val);
}} }}
memberIds={workspaceMemberIds ?? undefined} memberIds={workspaceMemberIds ?? undefined}
/> />

View file

@ -1,5 +1,6 @@
import { useCallback } from "react"; import { useCallback } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams } from "next/navigation";
// icons // icons
import { ChevronDown, ListFilter } from "lucide-react"; import { ChevronDown, ListFilter } from "lucide-react";
// types // types
@ -10,9 +11,11 @@ import { ProjectFiltersSelection, ProjectOrderByDropdown } from "@/components/pr
// helpers // helpers
import { calculateTotalFilters } from "@/helpers/filter.helper"; import { calculateTotalFilters } from "@/helpers/filter.helper";
// hooks // hooks
import { useAppRouter, useMember, useProjectFilter } from "@/hooks/store"; import { useMember, useProjectFilter } from "@/hooks/store";
export const ProjectsListMobileHeader = observer(() => { export const ProjectsListMobileHeader = observer(() => {
// router
const { workspaceSlug } = useParams();
const { const {
currentWorkspaceDisplayFilters: displayFilters, currentWorkspaceDisplayFilters: displayFilters,
currentWorkspaceFilters: filters, currentWorkspaceFilters: filters,
@ -20,7 +23,6 @@ export const ProjectsListMobileHeader = observer(() => {
updateFilters, updateFilters,
} = useProjectFilter(); } = useProjectFilter();
const { workspaceSlug } = useAppRouter();
const { const {
workspace: { workspaceMemberIds }, workspace: { workspaceMemberIds },
@ -39,7 +41,7 @@ export const ProjectsListMobileHeader = observer(() => {
if (filters?.[key]?.includes(value)) newValues.splice(newValues.indexOf(value), 1); if (filters?.[key]?.includes(value)) newValues.splice(newValues.indexOf(value), 1);
else newValues.push(value); else newValues.push(value);
} }
updateFilters(workspaceSlug, { [key]: newValues }); updateFilters(workspaceSlug.toString(), { [key]: newValues });
}, },
[filters, updateFilters, workspaceSlug] [filters, updateFilters, workspaceSlug]
); );
@ -52,7 +54,7 @@ export const ProjectsListMobileHeader = observer(() => {
value={displayFilters?.order_by} value={displayFilters?.order_by}
onChange={(val) => { onChange={(val) => {
if (!workspaceSlug || val === displayFilters?.order_by) return; if (!workspaceSlug || val === displayFilters?.order_by) return;
updateDisplayFilters(workspaceSlug, { updateDisplayFilters(workspaceSlug.toString(), {
order_by: val, order_by: val,
}); });
}} }}
@ -78,7 +80,7 @@ export const ProjectsListMobileHeader = observer(() => {
handleFiltersUpdate={handleFilters} handleFiltersUpdate={handleFilters}
handleDisplayFiltersUpdate={(val) => { handleDisplayFiltersUpdate={(val) => {
if (!workspaceSlug) return; if (!workspaceSlug) return;
updateDisplayFilters(workspaceSlug, val); updateDisplayFilters(workspaceSlug.toString(), val);
}} }}
memberIds={workspaceMemberIds ?? undefined} memberIds={workspaceMemberIds ?? undefined}
/> />

View file

@ -2,6 +2,7 @@
import { useCallback } from "react"; import { useCallback } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams } from "next/navigation";
// types // types
import { TProjectAppliedDisplayFilterKeys, TProjectFilters } from "@plane/types"; import { TProjectAppliedDisplayFilterKeys, TProjectFilters } from "@plane/types";
// components // components
@ -10,11 +11,11 @@ import { ProjectAppliedFiltersList, ProjectCardList } from "@/components/project
// helpers // helpers
import { calculateTotalFilters } from "@/helpers/filter.helper"; import { calculateTotalFilters } from "@/helpers/filter.helper";
// hooks // hooks
import { useAppRouter, useProject, useProjectFilter, useWorkspace } from "@/hooks/store"; import { useProject, useProjectFilter, useWorkspace } from "@/hooks/store";
const ProjectsPage = observer(() => { const ProjectsPage = observer(() => {
// store // store
const { workspaceSlug } = useAppRouter(); const { workspaceSlug } = useParams();
const { currentWorkspace } = useWorkspace(); const { currentWorkspace } = useWorkspace();
const { totalProjectIds, filteredProjectIds } = useProject(); const { totalProjectIds, filteredProjectIds } = useProject();
const { const {

View file

@ -1,8 +1,11 @@
import { useParams, usePathname, useRouter } from "next/navigation"; import { useParams, usePathname } from "next/navigation";
// constants
import { WORKSPACE_SETTINGS_LINKS } from "@/constants/workspace"; import { WORKSPACE_SETTINGS_LINKS } from "@/constants/workspace";
// hooks
import { useAppRouter } from "@/hooks/use-app-router";
export const MobileWorkspaceSettingsTabs = () => { export const MobileWorkspaceSettingsTabs = () => {
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug } = useParams(); const { workspaceSlug } = useParams();
const pathname = usePathname(); const pathname = usePathname();
return ( return (

View file

@ -4,7 +4,7 @@ import { FormEvent, useEffect, useMemo, useState } from "react";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
import Image from "next/image"; import Image from "next/image";
import Link from "next/link"; import Link from "next/link";
import { useRouter, useSearchParams } from "next/navigation"; import { useSearchParams } from "next/navigation";
// icons // icons
import { useTheme } from "next-themes"; import { useTheme } from "next-themes";
import { Eye, EyeOff } from "lucide-react"; import { Eye, EyeOff } from "lucide-react";
@ -17,6 +17,7 @@ import { EPageTypes } from "@/helpers/authentication.helper";
import { getPasswordStrength } from "@/helpers/password.helper"; import { getPasswordStrength } from "@/helpers/password.helper";
// hooks // hooks
import { useUser } from "@/hooks/store"; import { useUser } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
// wrappers // wrappers
import { AuthenticationWrapper } from "@/lib/wrappers"; import { AuthenticationWrapper } from "@/lib/wrappers";
// services // services
@ -43,7 +44,7 @@ const authService = new AuthService();
const SetPasswordPage = observer(() => { const SetPasswordPage = observer(() => {
// router // router
const router = useRouter(); const router = useAppRouter();
// search params // search params
const searchParams = useSearchParams(); const searchParams = useSearchParams();
const email = searchParams.get("email"); const email = searchParams.get("email");

View file

@ -4,13 +4,13 @@ import { useState } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import Image from "next/image"; import Image from "next/image";
import Link from "next/link"; import Link from "next/link";
import { useRouter } from "next/navigation";
import { useTheme } from "next-themes"; import { useTheme } from "next-themes";
import { IWorkspace } from "@plane/types"; import { IWorkspace } from "@plane/types";
// components // components
import { CreateWorkspaceForm } from "@/components/workspace"; import { CreateWorkspaceForm } from "@/components/workspace";
// hooks // hooks
import { useUser, useUserProfile } from "@/hooks/store"; import { useUser, useUserProfile } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
// wrappers // wrappers
import { AuthenticationWrapper } from "@/lib/wrappers"; import { AuthenticationWrapper } from "@/lib/wrappers";
// images // images
@ -19,7 +19,7 @@ import WhiteHorizontalLogo from "@/public/plane-logos/white-horizontal-with-blue
const CreateWorkspacePage = observer(() => { const CreateWorkspacePage = observer(() => {
// router // router
const router = useRouter(); const router = useAppRouter();
// store hooks // store hooks
const { data: currentUser } = useUser(); const { data: currentUser } = useUser();
const { updateUserProfile } = useUserProfile(); const { updateUserProfile } = useUserProfile();

View file

@ -2,7 +2,6 @@
// import { useEffect } from "react"; // import { useEffect } from "react";
// import * as Sentry from "@sentry/nextjs"; // import * as Sentry from "@sentry/nextjs";
// import { useRouter } from "next/navigation";
// services // services
import { Button } from "@plane/ui"; import { Button } from "@plane/ui";
// helpers // helpers
@ -24,7 +23,7 @@ import DefaultLayout from "@/layouts/default-layout";
// TODO: adding error sentry logging. // TODO: adding error sentry logging.
// const CustomErrorComponent = ({ error }: props) => { // const CustomErrorComponent = ({ error }: props) => {
const CustomErrorComponent = () => { const CustomErrorComponent = () => {
// const router = useRouter(); // const router = useAppRouter();
// useEffect(() => { // useEffect(() => {
// Sentry.captureException(error); // Sentry.captureException(error);

View file

@ -4,7 +4,7 @@ import React, { useState } from "react";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
import Image from "next/image"; import Image from "next/image";
import Link from "next/link"; import Link from "next/link";
import { useRouter } from "next/navigation";
import { useTheme } from "next-themes"; import { useTheme } from "next-themes";
import useSWR, { mutate } from "swr"; import useSWR, { mutate } from "swr";
// icons // icons
@ -22,7 +22,9 @@ import { ROLE } from "@/constants/workspace";
// helpers // helpers
import { truncateText } from "@/helpers/string.helper"; import { truncateText } from "@/helpers/string.helper";
import { getUserRole } from "@/helpers/user.helper"; import { getUserRole } from "@/helpers/user.helper";
// hooks
import { useEventTracker, useUser, useUserProfile, useWorkspace } from "@/hooks/store"; import { useEventTracker, useUser, useUserProfile, useWorkspace } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
// services // services
import { AuthenticationWrapper } from "@/lib/wrappers"; import { AuthenticationWrapper } from "@/lib/wrappers";
// images // images
@ -38,7 +40,7 @@ const UserInvitationsPage = observer(() => {
const [invitationsRespond, setInvitationsRespond] = useState<string[]>([]); const [invitationsRespond, setInvitationsRespond] = useState<string[]>([]);
const [isJoiningWorkspaces, setIsJoiningWorkspaces] = useState(false); const [isJoiningWorkspaces, setIsJoiningWorkspaces] = useState(false);
// router // router
const router = useRouter(); const router = useAppRouter();
// store hooks // store hooks
const { captureEvent, joinWorkspaceMetricGroup } = useEventTracker(); const { captureEvent, joinWorkspaceMetricGroup } = useEventTracker();
const { data: currentUser } = useUser(); const { data: currentUser } = useUser();

View file

@ -2,7 +2,6 @@
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useRouter } from "next/navigation";
import useSWR from "swr"; import useSWR from "swr";
// types // types
import { TOnboardingSteps, TUserProfile } from "@plane/types"; import { TOnboardingSteps, TUserProfile } from "@plane/types";
@ -16,6 +15,7 @@ import { USER_WORKSPACES_LIST } from "@/constants/fetch-keys";
import { EPageTypes } from "@/helpers/authentication.helper"; import { EPageTypes } from "@/helpers/authentication.helper";
// hooks // hooks
import { useUser, useWorkspace, useUserProfile, useEventTracker } from "@/hooks/store"; import { useUser, useWorkspace, useUserProfile, useEventTracker } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
// wrappers // wrappers
import { AuthenticationWrapper } from "@/lib/wrappers"; import { AuthenticationWrapper } from "@/lib/wrappers";
// services // services
@ -34,7 +34,7 @@ const OnboardingPage = observer(() => {
const [step, setStep] = useState<EOnboardingSteps | null>(null); const [step, setStep] = useState<EOnboardingSteps | null>(null);
const [totalSteps, setTotalSteps] = useState<number | null>(null); const [totalSteps, setTotalSteps] = useState<number | null>(null);
// router // router
const router = useRouter(); const router = useAppRouter();
// store hooks // store hooks
const { captureEvent } = useEventTracker(); const { captureEvent } = useEventTracker();
const { isLoading: userLoader, data: user, updateCurrentUser } = useUser(); const { isLoading: userLoader, data: user, updateCurrentUser } = useUser();

View file

@ -2,7 +2,6 @@
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useRouter } from "next/navigation";
import { Controller, useForm } from "react-hook-form"; import { Controller, useForm } from "react-hook-form";
import { Eye, EyeOff } from "lucide-react"; import { Eye, EyeOff } from "lucide-react";
// ui // ui
@ -17,6 +16,7 @@ import { authErrorHandler } from "@/helpers/authentication.helper";
import { getPasswordStrength } from "@/helpers/password.helper"; import { getPasswordStrength } from "@/helpers/password.helper";
// hooks // hooks
import { useUser } from "@/hooks/store"; import { useUser } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
// services // services
import { AuthService } from "@/services/auth.service"; import { AuthService } from "@/services/auth.service";
import { UserService } from "@/services/user.service"; import { UserService } from "@/services/user.service";
@ -49,7 +49,7 @@ const SecurityPage = observer(() => {
const [isPasswordInputFocused, setIsPasswordInputFocused] = useState(false); const [isPasswordInputFocused, setIsPasswordInputFocused] = useState(false);
const [isRetryPasswordInputFocused, setIsRetryPasswordInputFocused] = useState(false); const [isRetryPasswordInputFocused, setIsRetryPasswordInputFocused] = useState(false);
// router // router
const router = useRouter(); const router = useAppRouter();
const { data: currentUser } = useUser(); const { data: currentUser } = useUser();
// use form // use form
const { const {

View file

@ -2,7 +2,7 @@
import React from "react"; import React from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useRouter, useSearchParams } from "next/navigation"; import { useSearchParams } from "next/navigation";
import useSWR from "swr"; import useSWR from "swr";
import { Boxes, Check, Share2, Star, User2, X } from "lucide-react"; import { Boxes, Check, Share2, Star, User2, X } from "lucide-react";
// components // components
@ -14,6 +14,7 @@ import { WORKSPACE_INVITATION } from "@/constants/fetch-keys";
import { EPageTypes } from "@/helpers/authentication.helper"; import { EPageTypes } from "@/helpers/authentication.helper";
// hooks // hooks
import { useUser } from "@/hooks/store"; import { useUser } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
// wrappers // wrappers
import { AuthenticationWrapper } from "@/lib/wrappers"; import { AuthenticationWrapper } from "@/lib/wrappers";
// services // services
@ -24,7 +25,7 @@ const workspaceService = new WorkspaceService();
const WorkspaceInvitationPage = observer(() => { const WorkspaceInvitationPage = observer(() => {
// router // router
const router = useRouter(); const router = useAppRouter();
// query params // query params
const searchParams = useSearchParams(); const searchParams = useSearchParams();
const invitation_id = searchParams.get("invitation_id"); const invitation_id = searchParams.get("invitation_id");

View file

@ -1,6 +1,6 @@
import React, { FC, useEffect, useState } from "react"; import React, { FC, useEffect, useState } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useRouter, useSearchParams } from "next/navigation"; import { useSearchParams } from "next/navigation";
import { IEmailCheckData } from "@plane/types"; import { IEmailCheckData } from "@plane/types";
// components // components
import { import {
@ -23,6 +23,7 @@ import {
} from "@/helpers/authentication.helper"; } from "@/helpers/authentication.helper";
// hooks // hooks
import { useInstance } from "@/hooks/store"; import { useInstance } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
// services // services
import { AuthService } from "@/services/auth.service"; import { AuthService } from "@/services/auth.service";
@ -34,7 +35,7 @@ type TAuthRoot = {
export const AuthRoot: FC<TAuthRoot> = observer((props) => { export const AuthRoot: FC<TAuthRoot> = observer((props) => {
//router //router
const router = useRouter(); const router = useAppRouter();
const searchParams = useSearchParams(); const searchParams = useSearchParams();
// query params // query params
const emailParam = searchParams.get("email"); const emailParam = searchParams.get("email");

View file

@ -1,13 +1,13 @@
"use client"; "use client";
import React, { useState } from "react"; import React, { useState } from "react";
import { useRouter } from "next/navigation";
import { Trash2 } from "lucide-react"; import { Trash2 } from "lucide-react";
import { Dialog, Transition } from "@headlessui/react"; import { Dialog, Transition } from "@headlessui/react";
// hooks
// ui // ui
import { Button, TOAST_TYPE, setToast } from "@plane/ui"; import { Button, TOAST_TYPE, setToast } from "@plane/ui";
// hooks
import { useUser } from "@/hooks/store"; import { useUser } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
type Props = { type Props = {
isOpen: boolean; isOpen: boolean;
@ -15,7 +15,7 @@ type Props = {
}; };
export const DeactivateAccountModal: React.FC<Props> = (props) => { export const DeactivateAccountModal: React.FC<Props> = (props) => {
const router = useRouter(); const router = useAppRouter();
const { isOpen, onClose } = props; const { isOpen, onClose } = props;
// hooks // hooks
const { deactivateAccount, signOut } = useUser(); const { deactivateAccount, signOut } = useUser();

View file

@ -1,6 +1,6 @@
import { FC } from "react"; import { FC } from "react";
import { useRouter } from "next/router";
import Image from "next/image"; import Image from "next/image";
import { useSearchParams } from "next/navigation";
import { useTheme } from "next-themes"; import { useTheme } from "next-themes";
// helpers // helpers
import { API_BASE_URL } from "@/helpers/common.helper"; import { API_BASE_URL } from "@/helpers/common.helper";
@ -12,14 +12,14 @@ export type GitlabOAuthButtonProps = {
}; };
export const GitlabOAuthButton: FC<GitlabOAuthButtonProps> = (props) => { export const GitlabOAuthButton: FC<GitlabOAuthButtonProps> = (props) => {
const { query } = useRouter(); const searchParams = useSearchParams();
const { next_path } = query; const nextPath = searchParams.get("next_path") || undefined;
const { text } = props; const { text } = props;
// hooks // hooks
const { resolvedTheme } = useTheme(); const { resolvedTheme } = useTheme();
const handleSignIn = () => { const handleSignIn = () => {
window.location.assign(`${API_BASE_URL}/auth/gitlab/${next_path ? `?next_path=${next_path}` : ``}`); window.location.assign(`${API_BASE_URL}/auth/gitlab/${nextPath ? `?next_path=${nextPath}` : ``}`);
}; };
return ( return (

View file

@ -1,12 +1,13 @@
"use client"; "use client";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams } from "next/navigation";
import { TYAxisValues } from "@plane/types"; import { TYAxisValues } from "@plane/types";
import { CustomSelect } from "@plane/ui"; import { CustomSelect } from "@plane/ui";
// constants // constants
import { ANALYTICS_Y_AXIS_VALUES } from "@/constants/analytics"; import { ANALYTICS_Y_AXIS_VALUES } from "@/constants/analytics";
// hooks // hooks
import { useAppRouter, useProjectEstimates } from "@/hooks/store"; import { useProjectEstimates } from "@/hooks/store";
// plane web constants // plane web constants
import { EEstimateSystem } from "@/plane-web/constants/estimates"; import { EEstimateSystem } from "@/plane-web/constants/estimates";
@ -17,7 +18,7 @@ type Props = {
export const SelectYAxis: React.FC<Props> = observer(({ value, onChange }) => { export const SelectYAxis: React.FC<Props> = observer(({ value, onChange }) => {
// hooks // hooks
const { projectId } = useAppRouter(); const { projectId } = useParams();
const { areEstimateEnabledByProjectId, currentActiveEstimateId, estimateById } = useProjectEstimates(); const { areEstimateEnabledByProjectId, currentActiveEstimateId, estimateById } = useProjectEstimates();
const isEstimateEnabled = (analyticsOption: string) => { const isEstimateEnabled = (analyticsOption: string) => {
@ -25,7 +26,7 @@ export const SelectYAxis: React.FC<Props> = observer(({ value, onChange }) => {
if ( if (
projectId && projectId &&
currentActiveEstimateId && currentActiveEstimateId &&
areEstimateEnabledByProjectId(projectId) && areEstimateEnabledByProjectId(projectId.toString()) &&
estimateById(currentActiveEstimateId)?.type === EEstimateSystem.POINTS estimateById(currentActiveEstimateId)?.type === EEstimateSystem.POINTS
) { ) {
return true; return true;

View file

@ -1,11 +1,12 @@
"use client"; "use client";
import { Command } from "cmdk"; import { Command } from "cmdk";
import { useRouter } from "next/navigation"; // types
import { IWorkspaceSearchResults } from "@plane/types"; import { IWorkspaceSearchResults } from "@plane/types";
// helpers // helpers
import { commandGroups } from "@/components/command-palette"; import { commandGroups } from "@/components/command-palette";
// types // hooks
import { useAppRouter } from "@/hooks/use-app-router";
type Props = { type Props = {
closePalette: () => void; closePalette: () => void;
@ -15,7 +16,7 @@ type Props = {
export const CommandPaletteSearchResults: React.FC<Props> = (props) => { export const CommandPaletteSearchResults: React.FC<Props> = (props) => {
const { closePalette, results } = props; const { closePalette, results } = props;
const router = useRouter(); const router = useAppRouter();
return ( return (
<> <>

View file

@ -3,10 +3,12 @@
import { Command } from "cmdk"; import { Command } from "cmdk";
// hooks // hooks
import Link from "next/link"; import Link from "next/link";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
// constants // constants
import { EUserWorkspaceRoles, WORKSPACE_SETTINGS_LINKS } from "@/constants/workspace"; import { EUserWorkspaceRoles, WORKSPACE_SETTINGS_LINKS } from "@/constants/workspace";
// hooks
import { useUser } from "@/hooks/store"; import { useUser } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
type Props = { type Props = {
closePalette: () => void; closePalette: () => void;
@ -15,7 +17,7 @@ type Props = {
export const CommandPaletteWorkspaceSettingsActions: React.FC<Props> = (props) => { export const CommandPaletteWorkspaceSettingsActions: React.FC<Props> = (props) => {
const { closePalette } = props; const { closePalette } = props;
// router // router
const router = useRouter(); const router = useAppRouter();
// router params // router params
const { workspaceSlug } = useParams(); const { workspaceSlug } = useParams();
// mobx store // mobx store

View file

@ -3,7 +3,7 @@
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { Command } from "cmdk"; import { Command } from "cmdk";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
import useSWR from "swr"; import useSWR from "swr";
import { FolderPlus, Search, Settings } from "lucide-react"; import { FolderPlus, Search, Settings } from "lucide-react";
import { Dialog, Transition } from "@headlessui/react"; import { Dialog, Transition } from "@headlessui/react";
@ -26,6 +26,7 @@ import { EmptyState } from "@/components/empty-state";
import { EmptyStateType } from "@/constants/empty-state"; import { EmptyStateType } from "@/constants/empty-state";
import { ISSUE_DETAILS } from "@/constants/fetch-keys"; import { ISSUE_DETAILS } from "@/constants/fetch-keys";
import { useCommandPalette, useEventTracker, useProject } from "@/hooks/store"; import { useCommandPalette, useEventTracker, useProject } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
import useDebounce from "@/hooks/use-debounce"; import useDebounce from "@/hooks/use-debounce";
import { usePlatformOS } from "@/hooks/use-platform-os"; import { usePlatformOS } from "@/hooks/use-platform-os";
// services // services
@ -68,7 +69,7 @@ export const CommandModal: React.FC = observer(() => {
const { setTrackElement } = useEventTracker(); const { setTrackElement } = useEventTracker();
// router // router
const router = useRouter(); const router = useAppRouter();
// router params // router params
const { workspaceSlug, projectId, issueId } = useParams(); const { workspaceSlug, projectId, issueId } = useParams();

View file

@ -2,7 +2,7 @@
import React, { useCallback, useEffect, FC, useMemo } from "react"; import React, { useCallback, useEffect, FC, useMemo } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams, usePathname, useRouter } from "next/navigation"; import { useParams, usePathname } from "next/navigation";
import useSWR from "swr"; import useSWR from "swr";
// ui // ui
import { TOAST_TYPE, setToast } from "@plane/ui"; import { TOAST_TYPE, setToast } from "@plane/ui";
@ -24,6 +24,7 @@ import { EUserWorkspaceRoles } from "@/constants/workspace";
import { copyTextToClipboard } from "@/helpers/string.helper"; import { copyTextToClipboard } from "@/helpers/string.helper";
// hooks // hooks
import { useEventTracker, useIssues, useUser, useAppTheme, useCommandPalette } from "@/hooks/store"; import { useEventTracker, useIssues, useUser, useAppTheme, useCommandPalette } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
import { usePlatformOS } from "@/hooks/use-platform-os"; import { usePlatformOS } from "@/hooks/use-platform-os";
// services // services
import { IssueService } from "@/services/issue"; import { IssueService } from "@/services/issue";
@ -33,7 +34,7 @@ const issueService = new IssueService();
export const CommandPalette: FC = observer(() => { export const CommandPalette: FC = observer(() => {
// router // router
const router = useRouter(); const router = useAppRouter();
// router params // router params
const { workspaceSlug, projectId, issueId, cycleId, moduleId } = useParams(); const { workspaceSlug, projectId, issueId, cycleId, moduleId } = useParams();
// pathname // pathname

View file

@ -1,10 +1,11 @@
"use client"; "use client";
import React, { FC } from "react"; import React, { FC } from "react";
import { useRouter } from "next/navigation";
// ui // ui
import { ControlLink, Tooltip } from "@plane/ui"; import { ControlLink, Tooltip } from "@plane/ui";
// helpers // helpers
import { cn } from "@/helpers/common.helper"; import { cn } from "@/helpers/common.helper";
// hooks
import { useAppRouter } from "@/hooks/use-app-router";
interface IListItemProps { interface IListItemProps {
title: string; title: string;
@ -34,7 +35,7 @@ export const ListItem: FC<IListItemProps> = (props) => {
} = props; } = props;
// router // router
const router = useRouter(); const router = useAppRouter();
// handlers // handlers
const handleControlLinkClick = (e: React.MouseEvent<HTMLAnchorElement>) => { const handleControlLinkClick = (e: React.MouseEvent<HTMLAnchorElement>) => {

View file

@ -3,7 +3,7 @@
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import isEmpty from "lodash/isEmpty"; import isEmpty from "lodash/isEmpty";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
import { Controller, useForm } from "react-hook-form"; import { Controller, useForm } from "react-hook-form";
// icons // icons
import { ArchiveRestoreIcon, LinkIcon, Trash2, ChevronRight, CalendarClock, SquareUser } from "lucide-react"; import { ArchiveRestoreIcon, LinkIcon, Trash2, ChevronRight, CalendarClock, SquareUser } from "lucide-react";
@ -23,6 +23,7 @@ import { findHowManyDaysLeft, getDate, renderFormattedPayloadDate } from "@/help
import { copyUrlToClipboard } from "@/helpers/string.helper"; import { copyUrlToClipboard } from "@/helpers/string.helper";
// hooks // hooks
import { useEventTracker, useCycle, useUser, useMember, useProjectEstimates } from "@/hooks/store"; import { useEventTracker, useCycle, useUser, useMember, useProjectEstimates } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
// plane web constants // plane web constants
import { EEstimateSystem } from "@/plane-web/constants/estimates"; import { EEstimateSystem } from "@/plane-web/constants/estimates";
// services // services
@ -49,7 +50,7 @@ export const CycleDetailsSidebar: React.FC<Props> = observer((props) => {
const [archiveCycleModal, setArchiveCycleModal] = useState(false); const [archiveCycleModal, setArchiveCycleModal] = useState(false);
const [cycleDeleteModal, setCycleDeleteModal] = useState(false); const [cycleDeleteModal, setCycleDeleteModal] = useState(false);
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug, projectId } = useParams(); const { workspaceSlug, projectId } = useParams();
// store hooks // store hooks
const { setTrackElement, captureCycleEvent } = useEventTracker(); const { setTrackElement, captureCycleEvent } = useEventTracker();

View file

@ -1,12 +1,12 @@
"use client"; "use client";
import { useState, Fragment } from "react"; import { useState, Fragment } from "react";
import { useRouter } from "next/navigation";
import { Dialog, Transition } from "@headlessui/react"; import { Dialog, Transition } from "@headlessui/react";
// ui // ui
import { Button, TOAST_TYPE, setToast } from "@plane/ui"; import { Button, TOAST_TYPE, setToast } from "@plane/ui";
// hooks // hooks
import { useCycle } from "@/hooks/store"; import { useCycle } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
type Props = { type Props = {
workspaceSlug: string; workspaceSlug: string;
@ -20,7 +20,7 @@ type Props = {
export const ArchiveCycleModal: React.FC<Props> = (props) => { export const ArchiveCycleModal: React.FC<Props> = (props) => {
const { workspaceSlug, projectId, cycleId, isOpen, handleClose } = props; const { workspaceSlug, projectId, cycleId, isOpen, handleClose } = props;
// router // router
const router = useRouter(); const router = useAppRouter();
// states // states
const [isArchiving, setIsArchiving] = useState(false); const [isArchiving, setIsArchiving] = useState(false);
// store hooks // store hooks

View file

@ -3,7 +3,7 @@
import { FC, MouseEvent, useRef } from "react"; import { FC, MouseEvent, useRef } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import Link from "next/link"; import Link from "next/link";
import { usePathname, useRouter, useSearchParams } from "next/navigation"; import { usePathname, useSearchParams } from "next/navigation";
import { CalendarCheck2, CalendarClock, Info, MoveRight } from "lucide-react"; import { CalendarCheck2, CalendarClock, Info, MoveRight } from "lucide-react";
// types // types
import type { TCycleGroups } from "@plane/types"; import type { TCycleGroups } from "@plane/types";
@ -21,6 +21,7 @@ import { findHowManyDaysLeft, getDate, renderFormattedDate } from "@/helpers/dat
import { generateQueryParams } from "@/helpers/router.helper"; import { generateQueryParams } from "@/helpers/router.helper";
// hooks // hooks
import { useEventTracker, useCycle, useUser, useMember } from "@/hooks/store"; import { useEventTracker, useCycle, useUser, useMember } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
import { usePlatformOS } from "@/hooks/use-platform-os"; import { usePlatformOS } from "@/hooks/use-platform-os";
export interface ICyclesBoardCard { export interface ICyclesBoardCard {
@ -34,7 +35,7 @@ export const CyclesBoardCard: FC<ICyclesBoardCard> = observer((props) => {
// refs // refs
const parentRef = useRef(null); const parentRef = useRef(null);
// router // router
const router = useRouter(); const router = useAppRouter();
const searchParams = useSearchParams(); const searchParams = useSearchParams();
const pathname = usePathname(); const pathname = usePathname();
// store // store

View file

@ -1,9 +1,10 @@
import React, { useEffect } from "react"; import React, { useEffect } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { usePathname, useRouter, useSearchParams } from "next/navigation"; import { usePathname, useSearchParams } from "next/navigation";
// hooks // hooks
import { generateQueryParams } from "@/helpers/router.helper"; import { generateQueryParams } from "@/helpers/router.helper";
import { useCycle } from "@/hooks/store"; import { useCycle } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
// components // components
import { CycleDetailsSidebar } from "./"; import { CycleDetailsSidebar } from "./";
@ -15,7 +16,7 @@ type Props = {
export const CyclePeekOverview: React.FC<Props> = observer(({ projectId, workspaceSlug, isArchived = false }) => { export const CyclePeekOverview: React.FC<Props> = observer(({ projectId, workspaceSlug, isArchived = false }) => {
// router // router
const router = useRouter(); const router = useAppRouter();
const pathname = usePathname(); const pathname = usePathname();
const searchParams = useSearchParams(); const searchParams = useSearchParams();
const peekCycle = searchParams.get("peekCycle"); const peekCycle = searchParams.get("peekCycle");

View file

@ -2,7 +2,7 @@
import { useState } from "react"; import { useState } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams, useRouter, useSearchParams } from "next/navigation"; import { useParams, useSearchParams } from "next/navigation";
// types // types
import { ICycle } from "@plane/types"; import { ICycle } from "@plane/types";
// ui // ui
@ -11,6 +11,7 @@ import { AlertModalCore, TOAST_TYPE, setToast } from "@plane/ui";
import { CYCLE_DELETED } from "@/constants/event-tracker"; import { CYCLE_DELETED } from "@/constants/event-tracker";
// hooks // hooks
import { useEventTracker, useCycle } from "@/hooks/store"; import { useEventTracker, useCycle } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
interface ICycleDelete { interface ICycleDelete {
cycle: ICycle; cycle: ICycle;
@ -28,7 +29,7 @@ export const CycleDeleteModal: React.FC<ICycleDelete> = observer((props) => {
const { captureCycleEvent } = useEventTracker(); const { captureCycleEvent } = useEventTracker();
const { deleteCycle } = useCycle(); const { deleteCycle } = useCycle();
// router // router
const router = useRouter(); const router = useAppRouter();
const { cycleId } = useParams(); const { cycleId } = useParams();
const searchParams = useSearchParams(); const searchParams = useSearchParams();
const peekCycle = searchParams.get("peekCycle"); const peekCycle = searchParams.get("peekCycle");

View file

@ -2,13 +2,14 @@
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import Link from "next/link"; import Link from "next/link";
import { useRouter } from "next/navigation"; import { useParams } from "next/navigation";
// hooks
// ui // ui
import { Tooltip, ContrastIcon } from "@plane/ui"; import { Tooltip, ContrastIcon } from "@plane/ui";
// helpers // helpers
import { renderFormattedDate } from "@/helpers/date-time.helper"; import { renderFormattedDate } from "@/helpers/date-time.helper";
import { useAppRouter, useCycle } from "@/hooks/store"; // hooks
import { useCycle } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
import { usePlatformOS } from "@/hooks/use-platform-os"; import { usePlatformOS } from "@/hooks/use-platform-os";
type Props = { type Props = {
@ -18,9 +19,9 @@ type Props = {
export const CycleGanttBlock: React.FC<Props> = observer((props) => { export const CycleGanttBlock: React.FC<Props> = observer((props) => {
const { cycleId } = props; const { cycleId } = props;
// router // router
const router = useRouter(); const router = useAppRouter();
// store hooks // store hooks
const { workspaceSlug } = useAppRouter(); const { workspaceSlug } = useParams();
const { getCycleById } = useCycle(); const { getCycleById } = useCycle();
// derived values // derived values
const cycleDetails = getCycleById(cycleId); const cycleDetails = getCycleById(cycleId);
@ -35,14 +36,16 @@ export const CycleGanttBlock: React.FC<Props> = observer((props) => {
cycleStatus === "current" cycleStatus === "current"
? "#09a953" ? "#09a953"
: cycleStatus === "upcoming" : cycleStatus === "upcoming"
? "#f7ae59" ? "#f7ae59"
: cycleStatus === "completed" : cycleStatus === "completed"
? "#3f76ff" ? "#3f76ff"
: cycleStatus === "draft" : cycleStatus === "draft"
? "rgb(var(--color-text-200))" ? "rgb(var(--color-text-200))"
: "", : "",
}} }}
onClick={() => router.push(`/${workspaceSlug}/projects/${cycleDetails?.project_id}/cycles/${cycleDetails?.id}`)} onClick={() =>
router.push(`/${workspaceSlug.toString()}/projects/${cycleDetails?.project_id}/cycles/${cycleDetails?.id}`)
}
> >
<div className="absolute left-0 top-0 h-full w-full bg-custom-background-100/50" /> <div className="absolute left-0 top-0 h-full w-full bg-custom-background-100/50" />
<Tooltip <Tooltip
@ -67,7 +70,7 @@ export const CycleGanttBlock: React.FC<Props> = observer((props) => {
export const CycleGanttSidebarBlock: React.FC<Props> = observer((props) => { export const CycleGanttSidebarBlock: React.FC<Props> = observer((props) => {
const { cycleId } = props; const { cycleId } = props;
// store hooks // store hooks
const { workspaceSlug } = useAppRouter(); const { workspaceSlug } = useParams();
const { getCycleById } = useCycle(); const { getCycleById } = useCycle();
// derived values // derived values
const cycleDetails = getCycleById(cycleId); const cycleDetails = getCycleById(cycleId);
@ -77,7 +80,7 @@ export const CycleGanttSidebarBlock: React.FC<Props> = observer((props) => {
return ( return (
<Link <Link
className="relative flex h-full w-full items-center gap-2" className="relative flex h-full w-full items-center gap-2"
href={`/${workspaceSlug}/projects/${cycleDetails?.project_id}/cycles/${cycleDetails?.id}`} href={`/${workspaceSlug.toString()}/projects/${cycleDetails?.project_id}/cycles/${cycleDetails?.id}`}
draggable={false} draggable={false}
> >
<ContrastIcon <ContrastIcon

View file

@ -2,7 +2,7 @@
import { FC, MouseEvent, useRef } from "react"; import { FC, MouseEvent, useRef } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { usePathname, useRouter, useSearchParams } from "next/navigation"; import { usePathname, useSearchParams } from "next/navigation";
// icons // icons
import { Check, Info } from "lucide-react"; import { Check, Info } from "lucide-react";
// types // types
@ -16,6 +16,7 @@ import { CycleListItemAction } from "@/components/cycles/list";
import { generateQueryParams } from "@/helpers/router.helper"; import { generateQueryParams } from "@/helpers/router.helper";
// hooks // hooks
import { useCycle } from "@/hooks/store"; import { useCycle } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
import { usePlatformOS } from "@/hooks/use-platform-os"; import { usePlatformOS } from "@/hooks/use-platform-os";
type TCyclesListItem = { type TCyclesListItem = {
@ -34,7 +35,7 @@ export const CyclesListItem: FC<TCyclesListItem> = observer((props) => {
// refs // refs
const parentRef = useRef(null); const parentRef = useRef(null);
// router // router
const router = useRouter(); const router = useAppRouter();
const searchParams = useSearchParams(); const searchParams = useSearchParams();
const pathname = usePathname(); const pathname = usePathname();
// hooks // hooks

View file

@ -2,7 +2,7 @@
import { useState } from "react"; import { useState } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useRouter } from "next/navigation";
// icons // icons
import { ArchiveRestoreIcon, ExternalLink, LinkIcon, Pencil, Trash2 } from "lucide-react"; import { ArchiveRestoreIcon, ExternalLink, LinkIcon, Pencil, Trash2 } from "lucide-react";
// ui // ui
@ -16,6 +16,7 @@ import { cn } from "@/helpers/common.helper";
import { copyUrlToClipboard } from "@/helpers/string.helper"; import { copyUrlToClipboard } from "@/helpers/string.helper";
// hooks // hooks
import { useCycle, useEventTracker, useUser } from "@/hooks/store"; import { useCycle, useEventTracker, useUser } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
type Props = { type Props = {
parentRef: React.RefObject<HTMLElement>; parentRef: React.RefObject<HTMLElement>;
@ -27,7 +28,7 @@ type Props = {
export const CycleQuickActions: React.FC<Props> = observer((props) => { export const CycleQuickActions: React.FC<Props> = observer((props) => {
const { parentRef, cycleId, projectId, workspaceSlug } = props; const { parentRef, cycleId, projectId, workspaceSlug } = props;
// router // router
const router = useRouter(); const router = useAppRouter();
// states // states
const [updateModal, setUpdateModal] = useState(false); const [updateModal, setUpdateModal] = useState(false);
const [archiveCycleModal, setArchiveCycleModal] = useState(false); const [archiveCycleModal, setArchiveCycleModal] = useState(false);

View file

@ -1,4 +1,5 @@
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
import { useParams } from "next/navigation";
// types // types
import { TWidgetKeys } from "@plane/types"; import { TWidgetKeys } from "@plane/types";
// components // components
@ -14,7 +15,7 @@ import {
WidgetProps, WidgetProps,
} from "@/components/dashboard"; } from "@/components/dashboard";
// hooks // hooks
import { useAppRouter, useDashboard } from "@/hooks/store"; import { useDashboard } from "@/hooks/store";
const WIDGETS_LIST: { const WIDGETS_LIST: {
[key in TWidgetKeys]: { component: React.FC<WidgetProps>; fullWidth: boolean }; [key in TWidgetKeys]: { component: React.FC<WidgetProps>; fullWidth: boolean };
@ -30,8 +31,9 @@ const WIDGETS_LIST: {
}; };
export const DashboardWidgets = observer(() => { export const DashboardWidgets = observer(() => {
// router
const { workspaceSlug } = useParams();
// store hooks // store hooks
const { workspaceSlug } = useAppRouter();
const { homeDashboardId, homeDashboardWidgets } = useDashboard(); const { homeDashboardId, homeDashboardWidgets } = useDashboard();
const doesWidgetExist = (widgetKey: TWidgetKeys) => const doesWidgetExist = (widgetKey: TWidgetKeys) =>
@ -49,10 +51,11 @@ export const DashboardWidgets = observer(() => {
if (widget.fullWidth) if (widget.fullWidth)
return ( return (
<div key={key} className="lg:col-span-2"> <div key={key} className="lg:col-span-2">
<WidgetComponent dashboardId={homeDashboardId} workspaceSlug={workspaceSlug} /> <WidgetComponent dashboardId={homeDashboardId} workspaceSlug={workspaceSlug.toString()} />
</div> </div>
); );
else return <WidgetComponent key={key} dashboardId={homeDashboardId} workspaceSlug={workspaceSlug} />; else
return <WidgetComponent key={key} dashboardId={homeDashboardId} workspaceSlug={workspaceSlug.toString()} />;
})} })}
</div> </div>
); );

View file

@ -1,9 +1,8 @@
import { useEffect } from "react"; import { useEffect } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import Link from "next/link"; import Link from "next/link";
import { useRouter } from "next/navigation"; // types
import { TIssuesByPriorityWidgetFilters, TIssuesByPriorityWidgetResponse } from "@plane/types"; import { TIssuesByPriorityWidgetFilters, TIssuesByPriorityWidgetResponse } from "@plane/types";
// hooks
// components // components
import { import {
DurationFilterDropdown, DurationFilterDropdown,
@ -11,20 +10,21 @@ import {
WidgetLoader, WidgetLoader,
WidgetProps, WidgetProps,
} from "@/components/dashboard/widgets"; } from "@/components/dashboard/widgets";
// helpers
// types
// constants
import { IssuesByPriorityGraph } from "@/components/graphs"; import { IssuesByPriorityGraph } from "@/components/graphs";
// constants
import { EDurationFilters } from "@/constants/dashboard"; import { EDurationFilters } from "@/constants/dashboard";
// helpers
import { getCustomDates } from "@/helpers/dashboard.helper"; import { getCustomDates } from "@/helpers/dashboard.helper";
// hooks
import { useDashboard } from "@/hooks/store"; import { useDashboard } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
const WIDGET_KEY = "issues_by_priority"; const WIDGET_KEY = "issues_by_priority";
export const IssuesByPriorityWidget: React.FC<WidgetProps> = observer((props) => { export const IssuesByPriorityWidget: React.FC<WidgetProps> = observer((props) => {
const { dashboardId, workspaceSlug } = props; const { dashboardId, workspaceSlug } = props;
// router // router
const router = useRouter(); const router = useAppRouter();
// store hooks // store hooks
const { fetchWidgetStats, getWidgetDetails, getWidgetStats, updateDashboardWidgetFilters } = useDashboard(); const { fetchWidgetStats, getWidgetDetails, getWidgetStats, updateDashboardWidgetFilters } = useDashboard();
// derived values // derived values

View file

@ -1,9 +1,9 @@
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import Link from "next/link"; import Link from "next/link";
import { useRouter } from "next/navigation"; // types
import { TIssuesByStateGroupsWidgetFilters, TIssuesByStateGroupsWidgetResponse, TStateGroups } from "@plane/types"; import { TIssuesByStateGroupsWidgetFilters, TIssuesByStateGroupsWidgetResponse, TStateGroups } from "@plane/types";
// hooks // components
import { import {
DurationFilterDropdown, DurationFilterDropdown,
IssuesByStateGroupEmptyState, IssuesByStateGroupEmptyState,
@ -11,14 +11,14 @@ import {
WidgetProps, WidgetProps,
} from "@/components/dashboard/widgets"; } from "@/components/dashboard/widgets";
import { PieGraph } from "@/components/ui"; import { PieGraph } from "@/components/ui";
// constants
import { EDurationFilters, STATE_GROUP_GRAPH_COLORS, STATE_GROUP_GRAPH_GRADIENTS } from "@/constants/dashboard"; import { EDurationFilters, STATE_GROUP_GRAPH_COLORS, STATE_GROUP_GRAPH_GRADIENTS } from "@/constants/dashboard";
import { STATE_GROUPS } from "@/constants/state"; import { STATE_GROUPS } from "@/constants/state";
import { getCustomDates } from "@/helpers/dashboard.helper";
import { useDashboard } from "@/hooks/store";
// components
// helpers // helpers
// types import { getCustomDates } from "@/helpers/dashboard.helper";
// constants // hooks
import { useDashboard } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
const WIDGET_KEY = "issues_by_state_groups"; const WIDGET_KEY = "issues_by_state_groups";
@ -28,7 +28,7 @@ export const IssuesByStateGroupWidget: React.FC<WidgetProps> = observer((props)
const [defaultStateGroup, setDefaultStateGroup] = useState<TStateGroups | null>(null); const [defaultStateGroup, setDefaultStateGroup] = useState<TStateGroups | null>(null);
const [activeStateGroup, setActiveStateGroup] = useState<TStateGroups | null>(null); const [activeStateGroup, setActiveStateGroup] = useState<TStateGroups | null>(null);
// router // router
const router = useRouter(); const router = useAppRouter();
// store hooks // store hooks
const { fetchWidgetStats, getWidgetDetails, getWidgetStats, updateDashboardWidgetFilters } = useDashboard(); const { fetchWidgetStats, getWidgetDetails, getWidgetStats, updateDashboardWidgetFilters } = useDashboard();
// derived values // derived values

View file

@ -3,6 +3,7 @@
import { FC, useEffect, useRef, useState } from "react"; import { FC, useEffect, useRef, useState } from "react";
import { Placement } from "@popperjs/core"; import { Placement } from "@popperjs/core";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams } from "next/navigation";
import { usePopper } from "react-popper"; import { usePopper } from "react-popper";
// components // components
import { Check, Search } from "lucide-react"; import { Check, Search } from "lucide-react";
@ -12,7 +13,7 @@ import { TCycleGroups } from "@plane/types";
// ui // ui
import { ContrastIcon, CycleGroupIcon } from "@plane/ui"; import { ContrastIcon, CycleGroupIcon } from "@plane/ui";
// store hooks // store hooks
import { useAppRouter, useCycle } from "@/hooks/store"; import { useCycle } from "@/hooks/store";
// types // types
type DropdownOptions = type DropdownOptions =
@ -37,7 +38,7 @@ export const CycleOptions: FC<CycleOptionsProps> = observer((props) => {
const [popperElement, setPopperElement] = useState<HTMLDivElement | null>(null); const [popperElement, setPopperElement] = useState<HTMLDivElement | null>(null);
const inputRef = useRef<HTMLInputElement | null>(null); const inputRef = useRef<HTMLInputElement | null>(null);
// store hooks // store hooks
const { workspaceSlug } = useAppRouter(); const { workspaceSlug } = useParams();
const { getProjectCycleIds, fetchAllCycles, getCycleById } = useCycle(); const { getProjectCycleIds, fetchAllCycles, getCycleById } = useCycle();
useEffect(() => { useEffect(() => {
@ -66,7 +67,7 @@ export const CycleOptions: FC<CycleOptionsProps> = observer((props) => {
}); });
const onOpen = () => { const onOpen = () => {
if (workspaceSlug && !cycleIds) fetchAllCycles(workspaceSlug, projectId); if (workspaceSlug && !cycleIds) fetchAllCycles(workspaceSlug.toString(), projectId);
}; };
const searchInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => { const searchInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {

View file

@ -1,5 +1,6 @@
import { Fragment, ReactNode, useRef, useState } from "react"; import { Fragment, ReactNode, useRef, useState } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams } from "next/navigation";
import { usePopper } from "react-popper"; import { usePopper } from "react-popper";
import { Check, ChevronDown, Search, Triangle } from "lucide-react"; import { Check, ChevronDown, Search, Triangle } from "lucide-react";
import { Combobox } from "@headlessui/react"; import { Combobox } from "@headlessui/react";
@ -7,7 +8,6 @@ import { Combobox } from "@headlessui/react";
import { cn } from "@/helpers/common.helper"; import { cn } from "@/helpers/common.helper";
// hooks // hooks
import { import {
useAppRouter,
useEstimate, useEstimate,
useProjectEstimates, useProjectEstimates,
// useEstimate // useEstimate
@ -78,9 +78,9 @@ export const EstimateDropdown: React.FC<Props> = observer((props) => {
}, },
], ],
}); });
// router
const { workspaceSlug } = useParams();
// store hooks // store hooks
const { workspaceSlug } = useAppRouter();
const { currentActiveEstimateId, getProjectEstimates } = useProjectEstimates(); const { currentActiveEstimateId, getProjectEstimates } = useProjectEstimates();
const { estimatePointIds, estimatePointById } = useEstimate( const { estimatePointIds, estimatePointById } = useEstimate(
currentActiveEstimateId ? currentActiveEstimateId : undefined currentActiveEstimateId ? currentActiveEstimateId : undefined
@ -120,7 +120,7 @@ export const EstimateDropdown: React.FC<Props> = observer((props) => {
const selectedEstimate = value && estimatePointById ? estimatePointById(value) : undefined; const selectedEstimate = value && estimatePointById ? estimatePointById(value) : undefined;
const onOpen = async () => { const onOpen = async () => {
if (!currentActiveEstimateId && workspaceSlug && projectId) await getProjectEstimates(workspaceSlug, projectId); if (!currentActiveEstimateId && workspaceSlug && projectId) await getProjectEstimates(workspaceSlug.toString(), projectId);
}; };
const { handleClose, handleKeyDown, handleOnClick, searchInputKeyDown } = useDropdown({ const { handleClose, handleKeyDown, handleOnClick, searchInputKeyDown } = useDropdown({

View file

@ -3,13 +3,14 @@
import { useEffect, useRef, useState } from "react"; import { useEffect, useRef, useState } from "react";
import { Placement } from "@popperjs/core"; import { Placement } from "@popperjs/core";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams } from "next/navigation";
import { usePopper } from "react-popper"; import { usePopper } from "react-popper";
import { Check, Search } from "lucide-react"; import { Check, Search } from "lucide-react";
import { Combobox } from "@headlessui/react"; import { Combobox } from "@headlessui/react";
//components //components
import { Avatar } from "@plane/ui"; import { Avatar } from "@plane/ui";
//store //store
import { useUser, useMember, useAppRouter } from "@/hooks/store"; import { useUser, useMember } from "@/hooks/store";
interface Props { interface Props {
projectId?: string; projectId?: string;
@ -26,7 +27,7 @@ export const MemberOptions = observer((props: Props) => {
// refs // refs
const inputRef = useRef<HTMLInputElement | null>(null); const inputRef = useRef<HTMLInputElement | null>(null);
// store hooks // store hooks
const { workspaceSlug } = useAppRouter(); const { workspaceSlug } = useParams();
const { const {
getUserDetails, getUserDetails,
project: { getProjectMemberIds, fetchProjectMembers }, project: { getProjectMemberIds, fetchProjectMembers },
@ -55,7 +56,7 @@ export const MemberOptions = observer((props: Props) => {
const memberIds = projectId ? getProjectMemberIds(projectId) : workspaceMemberIds; const memberIds = projectId ? getProjectMemberIds(projectId) : workspaceMemberIds;
const onOpen = () => { const onOpen = () => {
if (!memberIds && workspaceSlug && projectId) fetchProjectMembers(workspaceSlug, projectId); if (!memberIds && workspaceSlug && projectId) fetchProjectMembers(workspaceSlug.toString(), projectId);
}; };
const searchInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => { const searchInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {

View file

@ -3,6 +3,7 @@
import { useEffect, useRef, useState } from "react"; import { useEffect, useRef, useState } from "react";
import { Placement } from "@popperjs/core"; import { Placement } from "@popperjs/core";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams } from "next/navigation";
import { usePopper } from "react-popper"; import { usePopper } from "react-popper";
import { Check, Search } from "lucide-react"; import { Check, Search } from "lucide-react";
import { Combobox } from "@headlessui/react"; import { Combobox } from "@headlessui/react";
@ -10,7 +11,7 @@ import { Combobox } from "@headlessui/react";
import { DiceIcon } from "@plane/ui"; import { DiceIcon } from "@plane/ui";
//store //store
import { cn } from "@/helpers/common.helper"; import { cn } from "@/helpers/common.helper";
import { useAppRouter, useModule } from "@/hooks/store"; import { useModule } from "@/hooks/store";
//hooks //hooks
//icon //icon
//types //types
@ -39,7 +40,7 @@ export const ModuleOptions = observer((props: Props) => {
// refs // refs
const inputRef = useRef<HTMLInputElement | null>(null); const inputRef = useRef<HTMLInputElement | null>(null);
// store hooks // store hooks
const { workspaceSlug } = useAppRouter(); const { workspaceSlug } = useParams();
const { getProjectModuleIds, fetchModules, getModuleById } = useModule(); const { getProjectModuleIds, fetchModules, getModuleById } = useModule();
useEffect(() => { useEffect(() => {
@ -66,7 +67,7 @@ export const ModuleOptions = observer((props: Props) => {
const moduleIds = getProjectModuleIds(projectId); const moduleIds = getProjectModuleIds(projectId);
const onOpen = () => { const onOpen = () => {
if (workspaceSlug && !moduleIds) fetchModules(workspaceSlug, projectId); if (workspaceSlug && !moduleIds) fetchModules(workspaceSlug.toString(), projectId);
}; };
const searchInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => { const searchInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {

View file

@ -2,6 +2,7 @@
import { Fragment, ReactNode, useEffect, useRef, useState } from "react"; import { Fragment, ReactNode, useEffect, useRef, useState } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams } from "next/navigation";
import { usePopper } from "react-popper"; import { usePopper } from "react-popper";
import { Check, ChevronDown, Search } from "lucide-react"; import { Check, ChevronDown, Search } from "lucide-react";
import { Combobox } from "@headlessui/react"; import { Combobox } from "@headlessui/react";
@ -10,7 +11,7 @@ import { Spinner, StateGroupIcon } from "@plane/ui";
// helpers // helpers
import { cn } from "@/helpers/common.helper"; import { cn } from "@/helpers/common.helper";
// hooks // hooks
import { useAppRouter, useProjectState } from "@/hooks/store"; import { useProjectState } from "@/hooks/store";
import { useDropdown } from "@/hooks/use-dropdown"; import { useDropdown } from "@/hooks/use-dropdown";
// components // components
import { DropdownButton } from "./buttons"; import { DropdownButton } from "./buttons";
@ -73,7 +74,7 @@ export const StateDropdown: React.FC<Props> = observer((props) => {
], ],
}); });
// store hooks // store hooks
const { workspaceSlug } = useAppRouter(); const { workspaceSlug } = useParams();
const { fetchProjectStates, getProjectStates, getStateById } = useProjectState(); const { fetchProjectStates, getProjectStates, getStateById } = useProjectState();
const statesList = getProjectStates(projectId); const statesList = getProjectStates(projectId);
const defaultState = statesList?.find((state) => state.default); const defaultState = statesList?.find((state) => state.default);
@ -98,7 +99,7 @@ export const StateDropdown: React.FC<Props> = observer((props) => {
const onOpen = async () => { const onOpen = async () => {
if (!statesList && workspaceSlug && projectId) { if (!statesList && workspaceSlug && projectId) {
setStateLoader(true); setStateLoader(true);
await fetchProjectStates(workspaceSlug, projectId); await fetchProjectStates(workspaceSlug.toString(), projectId);
setStateLoader(false); setStateLoader(false);
} }
}; };

View file

@ -2,17 +2,17 @@
import React, { useState } from "react"; import React, { useState } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
import { Dialog, Transition } from "@headlessui/react"; import { Dialog, Transition } from "@headlessui/react";
// types
import { IUser, IImporterService } from "@plane/types"; import { IUser, IImporterService } from "@plane/types";
// hooks // ui
import { Button, CustomSearchSelect, TOAST_TYPE, setToast } from "@plane/ui"; import { Button, CustomSearchSelect, TOAST_TYPE, setToast } from "@plane/ui";
// hooks
import { useProject } from "@/hooks/store"; import { useProject } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
// services // services
import { ProjectExportService } from "@/services/project"; import { ProjectExportService } from "@/services/project";
// ui
// types
type Props = { type Props = {
isOpen: boolean; isOpen: boolean;
@ -31,7 +31,7 @@ export const Exporter: React.FC<Props> = observer((props) => {
const [exportLoading, setExportLoading] = useState(false); const [exportLoading, setExportLoading] = useState(false);
const [isSelectOpen, setIsSelectOpen] = useState(false); const [isSelectOpen, setIsSelectOpen] = useState(false);
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug } = useParams(); const { workspaceSlug } = useParams();
// store hooks // store hooks
const { workspaceProjectIds, getProjectById } = useProject(); const { workspaceProjectIds, getProjectById } = useProject();

View file

@ -4,7 +4,7 @@ import { useState } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import Image from "next/image"; import Image from "next/image";
import Link from "next/link"; import Link from "next/link";
import { useRouter, useParams, useSearchParams } from "next/navigation"; import { useParams, useSearchParams } from "next/navigation";
import useSWR, { mutate } from "swr"; import useSWR, { mutate } from "swr";
// icons // icons
import { MoveLeft, MoveRight, RefreshCw } from "lucide-react"; import { MoveLeft, MoveRight, RefreshCw } from "lucide-react";
@ -20,6 +20,7 @@ import { EXPORT_SERVICES_LIST } from "@/constants/fetch-keys";
import { EXPORTERS_LIST } from "@/constants/workspace"; import { EXPORTERS_LIST } from "@/constants/workspace";
// hooks // hooks
import { useUser } from "@/hooks/store"; import { useUser } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
// services // services
import { IntegrationService } from "@/services/integrations"; import { IntegrationService } from "@/services/integrations";
@ -31,7 +32,7 @@ const IntegrationGuide = observer(() => {
const per_page = 10; const per_page = 10;
const [cursor, setCursor] = useState<string | undefined>(`10:0:0`); const [cursor, setCursor] = useState<string | undefined>(`10:0:0`);
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug } = useParams(); const { workspaceSlug } = useParams();
const searchParams = useSearchParams(); const searchParams = useSearchParams();
const provider = searchParams.get("provider"); const provider = searchParams.get("provider");

View file

@ -2,7 +2,6 @@
import { FC, useCallback, useEffect, useState } from "react"; import { FC, useCallback, useEffect, useState } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useRouter } from "next/navigation";
import { import {
CircleCheck, CircleCheck,
CircleX, CircleX,
@ -33,6 +32,7 @@ import { EInboxIssueStatus } from "@/helpers/inbox.helper";
import { copyUrlToClipboard } from "@/helpers/string.helper"; import { copyUrlToClipboard } from "@/helpers/string.helper";
// hooks // hooks
import { useUser, useProjectInbox, useProject } from "@/hooks/store"; import { useUser, useProjectInbox, useProject } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
// store types // store types
import type { IInboxIssueStore } from "@/store/inbox/inbox-issue.store"; import type { IInboxIssueStore } from "@/store/inbox/inbox-issue.store";
@ -60,7 +60,7 @@ export const InboxIssueActionsHeader: FC<TInboxIssueActionsHeader> = observer((p
membership: { currentProjectRole }, membership: { currentProjectRole },
} = useUser(); } = useUser();
const router = useRouter(); const router = useAppRouter();
const { getProjectById } = useProject(); const { getProjectById } = useProject();
const issue = inboxIssue?.issue; const issue = inboxIssue?.issue;

View file

@ -2,7 +2,6 @@
import React from "react"; import React from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useRouter } from "next/navigation";
import { import {
CircleCheck, CircleCheck,
CircleX, CircleX,
@ -21,6 +20,8 @@ import { InboxIssueStatus } from "@/components/inbox";
import { IssueUpdateStatus } from "@/components/issues"; import { IssueUpdateStatus } from "@/components/issues";
// helpers // helpers
import { cn } from "@/helpers/common.helper"; import { cn } from "@/helpers/common.helper";
// hooks
import { useAppRouter } from "@/hooks/use-app-router";
// store types // store types
import type { IInboxIssueStore } from "@/store/inbox/inbox-issue.store"; import type { IInboxIssueStore } from "@/store/inbox/inbox-issue.store";
@ -64,7 +65,7 @@ export const InboxIssueActionsMobileHeader: React.FC<Props> = observer((props) =
isMobileSidebar, isMobileSidebar,
setIsMobileSidebar, setIsMobileSidebar,
} = props; } = props;
const router = useRouter(); const router = useAppRouter();
const issue = inboxIssue?.issue; const issue = inboxIssue?.issue;
const currentInboxIssueId = issue?.id; const currentInboxIssueId = issue?.id;

View file

@ -2,7 +2,6 @@
import React from "react"; import React from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useRouter } from "next/navigation";
import { CalendarCheck2, CopyPlus, Signal, Tag, Users } from "lucide-react"; import { CalendarCheck2, CopyPlus, Signal, Tag, Users } from "lucide-react";
import { TInboxDuplicateIssueDetails, TIssue } from "@plane/types"; import { TInboxDuplicateIssueDetails, TIssue } from "@plane/types";
import { ControlLink, DoubleCircleIcon, Tooltip } from "@plane/ui"; import { ControlLink, DoubleCircleIcon, Tooltip } from "@plane/ui";
@ -13,6 +12,7 @@ import { IssueLabel, TIssueOperations } from "@/components/issues";
import { getDate, renderFormattedPayloadDate } from "@/helpers/date-time.helper"; import { getDate, renderFormattedPayloadDate } from "@/helpers/date-time.helper";
// hooks // hooks
import { useProject } from "@/hooks/store"; import { useProject } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
type Props = { type Props = {
workspaceSlug: string; workspaceSlug: string;
@ -26,7 +26,7 @@ type Props = {
export const InboxIssueContentProperties: React.FC<Props> = observer((props) => { export const InboxIssueContentProperties: React.FC<Props> = observer((props) => {
const { workspaceSlug, projectId, issue, issueOperations, isEditable, duplicateIssueDetails } = props; const { workspaceSlug, projectId, issue, issueOperations, isEditable, duplicateIssueDetails } = props;
const router = useRouter(); const router = useAppRouter();
// store hooks // store hooks
const { currentProjectDetails } = useProject(); const { currentProjectDetails } = useProject();

View file

@ -1,10 +1,13 @@
import { FC, useEffect, useState } from "react"; import { FC, useEffect, useState } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useRouter } from "next/navigation";
import useSWR from "swr"; import useSWR from "swr";
// components
import { InboxIssueActionsHeader, InboxIssueMainContent } from "@/components/inbox"; import { InboxIssueActionsHeader, InboxIssueMainContent } from "@/components/inbox";
// constants
import { EUserProjectRoles } from "@/constants/project"; import { EUserProjectRoles } from "@/constants/project";
// hooks
import { useProjectInbox, useUser } from "@/hooks/store"; import { useProjectInbox, useUser } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
type TInboxContentRoot = { type TInboxContentRoot = {
workspaceSlug: string; workspaceSlug: string;
@ -17,7 +20,7 @@ type TInboxContentRoot = {
export const InboxContentRoot: FC<TInboxContentRoot> = observer((props) => { export const InboxContentRoot: FC<TInboxContentRoot> = observer((props) => {
const { workspaceSlug, projectId, inboxIssueId, isMobileSidebar, setIsMobileSidebar } = props; const { workspaceSlug, projectId, inboxIssueId, isMobileSidebar, setIsMobileSidebar } = props;
/// router /// router
const router = useRouter(); const router = useAppRouter();
// states // states
const [isSubmitting, setIsSubmitting] = useState<"submitting" | "submitted" | "saved">("saved"); const [isSubmitting, setIsSubmitting] = useState<"submitting" | "submitted" | "saved">("saved");
// hooks // hooks

View file

@ -2,7 +2,7 @@
import { FC, FormEvent, useCallback, useRef, useState } from "react"; import { FC, FormEvent, useCallback, useRef, useState } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { usePathname, useRouter } from "next/navigation"; import { usePathname } from "next/navigation";
// editor // editor
import { EditorRefApi } from "@plane/rich-text-editor"; import { EditorRefApi } from "@plane/rich-text-editor";
// types // types
@ -20,6 +20,7 @@ import { ISSUE_CREATED } from "@/constants/event-tracker";
import { renderFormattedPayloadDate } from "@/helpers/date-time.helper"; import { renderFormattedPayloadDate } from "@/helpers/date-time.helper";
// hooks // hooks
import { useEventTracker, useProjectInbox, useWorkspace } from "@/hooks/store"; import { useEventTracker, useProjectInbox, useWorkspace } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
import useKeypress from "@/hooks/use-keypress"; import useKeypress from "@/hooks/use-keypress";
type TInboxIssueCreateRoot = { type TInboxIssueCreateRoot = {
@ -42,7 +43,7 @@ export const defaultIssueData: Partial<TIssue> = {
export const InboxIssueCreateRoot: FC<TInboxIssueCreateRoot> = observer((props) => { export const InboxIssueCreateRoot: FC<TInboxIssueCreateRoot> = observer((props) => {
const { workspaceSlug, projectId, handleModalClose } = props; const { workspaceSlug, projectId, handleModalClose } = props;
const router = useRouter(); const router = useAppRouter();
const pathname = usePathname(); const pathname = usePathname();
// refs // refs
const descriptionEditorRef = useRef<EditorRefApi>(null); const descriptionEditorRef = useRef<EditorRefApi>(null);

View file

@ -2,7 +2,6 @@
import { FC, useCallback, useRef, useState } from "react"; import { FC, useCallback, useRef, useState } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useRouter } from "next/navigation";
import { TInboxIssueCurrentTab } from "@plane/types"; import { TInboxIssueCurrentTab } from "@plane/types";
import { Loader } from "@plane/ui"; import { Loader } from "@plane/ui";
// components // components
@ -16,6 +15,7 @@ import { cn } from "@/helpers/common.helper";
import { EInboxIssueCurrentTab } from "@/helpers/inbox.helper"; import { EInboxIssueCurrentTab } from "@/helpers/inbox.helper";
// hooks // hooks
import { useProject, useProjectInbox } from "@/hooks/store"; import { useProject, useProjectInbox } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
import { useIntersectionObserver } from "@/hooks/use-intersection-observer"; import { useIntersectionObserver } from "@/hooks/use-intersection-observer";
import { useIssuesStore } from "@/hooks/use-issue-layout-store"; import { useIssuesStore } from "@/hooks/use-issue-layout-store";
@ -56,7 +56,7 @@ export const InboxSidebar: FC<IInboxSidebarProps> = observer((props) => {
issues: { getIssueLoader }, issues: { getIssueLoader },
} = useIssuesStore(); } = useIssuesStore();
const router = useRouter(); const router = useAppRouter();
const fetchNextPages = useCallback(() => { const fetchNextPages = useCallback(() => {
if (!workspaceSlug || !projectId) return; if (!workspaceSlug || !projectId) return;

View file

@ -1,20 +1,17 @@
"use client"; "use client";
import React, { useState } from "react"; import React, { useState } from "react";
import Image from "next/image"; import Image from "next/image";
import Link from "next/link"; import Link from "next/link";
import { useParams, useRouter, useSearchParams } from "next/navigation"; import { useParams, useSearchParams } from "next/navigation";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import useSWR, { mutate } from "swr"; import useSWR, { mutate } from "swr";
// react-hook-form
// services
// components
import { ArrowLeft, Check, List, Settings, UploadCloud, Users } from "lucide-react"; import { ArrowLeft, Check, List, Settings, UploadCloud, Users } from "lucide-react";
// types
import { IGithubRepoCollaborator, IGithubServiceImportFormData } from "@plane/types"; import { IGithubRepoCollaborator, IGithubServiceImportFormData } from "@plane/types";
// ui
import { TOAST_TYPE, setToast } from "@plane/ui"; import { TOAST_TYPE, setToast } from "@plane/ui";
// components
import { import {
GithubImportConfigure, GithubImportConfigure,
GithubImportData, GithubImportData,
@ -22,17 +19,14 @@ import {
GithubImportUsers, GithubImportUsers,
GithubImportConfirm, GithubImportConfirm,
} from "@/components/integration"; } from "@/components/integration";
// icons // fetch keys
// images
import { APP_INTEGRATIONS, IMPORTER_SERVICES_LIST, WORKSPACE_INTEGRATIONS } from "@/constants/fetch-keys"; import { APP_INTEGRATIONS, IMPORTER_SERVICES_LIST, WORKSPACE_INTEGRATIONS } from "@/constants/fetch-keys";
import GithubLogo from "@/public/services/github.png";
import { IntegrationService, GithubIntegrationService } from "@/services/integrations";
// hooks // hooks
// components import { useAppRouter } from "@/hooks/use-app-router";
// icons
// images // images
// types import GithubLogo from "@/public/services/github.png";
// fetch-keys // services
import { IntegrationService, GithubIntegrationService } from "@/services/integrations";
export type TIntegrationSteps = "import-configure" | "import-data" | "repo-details" | "import-users" | "import-confirm"; export type TIntegrationSteps = "import-configure" | "import-data" | "repo-details" | "import-users" | "import-confirm";
export interface IIntegrationData { export interface IIntegrationData {
@ -93,7 +87,7 @@ export const GithubImporterRoot: React.FC = () => {
}); });
const [users, setUsers] = useState<IUserDetails[]>([]); const [users, setUsers] = useState<IUserDetails[]>([]);
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug } = useParams(); const { workspaceSlug } = useParams();
const searchParams = useSearchParams(); const searchParams = useSearchParams();
const provider = searchParams.get("provider"); const provider = searchParams.get("provider");

View file

@ -3,21 +3,24 @@
import React, { useState } from "react"; import React, { useState } from "react";
import Image from "next/image"; import Image from "next/image";
import Link from "next/link"; import Link from "next/link";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
import { FormProvider, useForm } from "react-hook-form"; import { FormProvider, useForm } from "react-hook-form";
import { mutate } from "swr"; import { mutate } from "swr";
// icons // icons
import { ArrowLeft, Check, List, Settings, Users } from "lucide-react"; import { ArrowLeft, Check, List, Settings, Users } from "lucide-react";
// types
import { IJiraImporterForm } from "@plane/types"; import { IJiraImporterForm } from "@plane/types";
// services // ui
// fetch keys
// components
import { Button } from "@plane/ui"; import { Button } from "@plane/ui";
// fetch keys
import { IMPORTER_SERVICES_LIST } from "@/constants/fetch-keys"; import { IMPORTER_SERVICES_LIST } from "@/constants/fetch-keys";
// hooks
import { useAppRouter } from "@/hooks/use-app-router";
// assets // assets
import JiraLogo from "@/public/services/jira.svg"; import JiraLogo from "@/public/services/jira.svg";
// services
import { JiraImporterService } from "@/services/integrations"; import { JiraImporterService } from "@/services/integrations";
// types // components
import { import {
JiraGetImportDetail, JiraGetImportDetail,
JiraProjectDetail, JiraProjectDetail,
@ -64,7 +67,7 @@ export const JiraImporterRoot: React.FC = () => {
}); });
const [disableTopBarAfter, setDisableTopBarAfter] = useState<TJiraIntegrationSteps | null>(null); const [disableTopBarAfter, setDisableTopBarAfter] = useState<TJiraIntegrationSteps | null>(null);
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug } = useParams(); const { workspaceSlug } = useParams();
const methods = useForm<IJiraImporterForm>({ const methods = useForm<IJiraImporterForm>({

View file

@ -2,7 +2,7 @@
import React, { FC, useState } from "react"; import React, { FC, useState } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { usePathname, useRouter } from "next/navigation"; import { usePathname } from "next/navigation";
import { ArchiveIcon, ArchiveRestoreIcon, LinkIcon, Trash2 } from "lucide-react"; import { ArchiveIcon, ArchiveRestoreIcon, LinkIcon, Trash2 } from "lucide-react";
import { TOAST_TYPE, Tooltip, setToast } from "@plane/ui"; import { TOAST_TYPE, Tooltip, setToast } from "@plane/ui";
// components // components
@ -17,6 +17,7 @@ import { cn } from "@/helpers/common.helper";
import { copyTextToClipboard } from "@/helpers/string.helper"; import { copyTextToClipboard } from "@/helpers/string.helper";
// hooks // hooks
import { useEventTracker, useIssueDetail, useIssues, useProjectState, useUser } from "@/hooks/store"; import { useEventTracker, useIssueDetail, useIssues, useProjectState, useUser } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
import { usePlatformOS } from "@/hooks/use-platform-os"; import { usePlatformOS } from "@/hooks/use-platform-os";
type Props = { type Props = {
@ -34,7 +35,7 @@ export const IssueDetailQuickActions: FC<Props> = observer((props) => {
const [isRestoring, setIsRestoring] = useState(false); const [isRestoring, setIsRestoring] = useState(false);
// router // router
const router = useRouter(); const router = useAppRouter();
// hooks // hooks
const { const {

View file

@ -2,7 +2,7 @@
import { FC, useMemo } from "react"; import { FC, useMemo } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { usePathname, useRouter } from "next/navigation"; import { usePathname } from "next/navigation";
// types // types
import { TIssue } from "@plane/types"; import { TIssue } from "@plane/types";
// ui // ui
@ -16,6 +16,7 @@ import { EIssuesStoreType } from "@/constants/issue";
import { EUserProjectRoles } from "@/constants/project"; import { EUserProjectRoles } from "@/constants/project";
// hooks // hooks
import { useAppTheme, useEventTracker, useIssueDetail, useIssues, useUser } from "@/hooks/store"; import { useAppTheme, useEventTracker, useIssueDetail, useIssues, useUser } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
// images // images
import emptyIssue from "@/public/empty-state/issue.svg"; import emptyIssue from "@/public/empty-state/issue.svg";
// local components // local components
@ -57,7 +58,7 @@ export type TIssueDetailRoot = {
export const IssueDetailRoot: FC<TIssueDetailRoot> = observer((props) => { export const IssueDetailRoot: FC<TIssueDetailRoot> = observer((props) => {
const { workspaceSlug, projectId, issueId, swrIssueDetails, is_archived = false } = props; const { workspaceSlug, projectId, issueId, swrIssueDetails, is_archived = false } = props;
// router // router
const router = useRouter(); const router = useAppRouter();
const pathname = usePathname(); const pathname = usePathname();
// hooks // hooks
const { const {

View file

@ -3,13 +3,14 @@
/* eslint-disable react/display-name */ /* eslint-disable react/display-name */
import { useState, useRef, forwardRef } from "react"; import { useState, useRef, forwardRef } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams } from "next/navigation";
import { MoreHorizontal } from "lucide-react"; import { MoreHorizontal } from "lucide-react";
import { TIssue } from "@plane/types"; import { TIssue } from "@plane/types";
// components // components
import { Tooltip, ControlLink } from "@plane/ui"; import { Tooltip, ControlLink } from "@plane/ui";
// hooks // hooks
import { cn } from "@/helpers/common.helper"; import { cn } from "@/helpers/common.helper";
import { useAppRouter, useIssueDetail, useProject, useProjectState } from "@/hooks/store"; import { useIssueDetail, useProject, useProjectState } from "@/hooks/store";
import useOutsideClickDetector from "@/hooks/use-outside-click-detector"; import useOutsideClickDetector from "@/hooks/use-outside-click-detector";
// helpers // helpers
// types // types
@ -31,7 +32,7 @@ export const CalendarIssueBlock = observer(
const blockRef = useRef(null); const blockRef = useRef(null);
const menuActionRef = useRef<HTMLDivElement | null>(null); const menuActionRef = useRef<HTMLDivElement | null>(null);
// hooks // hooks
const { workspaceSlug, projectId } = useAppRouter(); const { workspaceSlug, projectId } = useParams();
const { getProjectIdentifierById } = useProject(); const { getProjectIdentifierById } = useProject();
const { getProjectStates } = useProjectState(); const { getProjectStates } = useProjectState();
const { getIsIssuePeeked, setPeekIssue } = useIssueDetail(); const { getIsIssuePeeked, setPeekIssue } = useIssueDetail();
@ -45,7 +46,7 @@ export const CalendarIssueBlock = observer(
issue.project_id && issue.project_id &&
issue.id && issue.id &&
!getIsIssuePeeked(issue.id) && !getIsIssuePeeked(issue.id) &&
setPeekIssue({ workspaceSlug, projectId: issue.project_id, issueId: issue.id }); setPeekIssue({ workspaceSlug: workspaceSlug.toString(), projectId: issue.project_id, issueId: issue.id });
useOutsideClickDetector(menuActionRef, () => setIsMenuActive(false)); useOutsideClickDetector(menuActionRef, () => setIsMenuActive(false));
@ -69,7 +70,7 @@ export const CalendarIssueBlock = observer(
return ( return (
<ControlLink <ControlLink
id={`issue-${issue.id}`} id={`issue-${issue.id}`}
href={`/${workspaceSlug}/projects/${projectId}/issues/${issue.id}`} href={`/${workspaceSlug.toString()}/projects/${projectId.toString()}/issues/${issue.id}`}
target="_blank" target="_blank"
onClick={() => handleIssuePeekOverview(issue)} onClick={() => handleIssuePeekOverview(issue)}
className="block w-full text-sm text-custom-text-100 rounded border-b md:border-[1px] border-custom-border-200 hover:border-custom-border-400" className="block w-full text-sm text-custom-text-100 rounded border-b md:border-[1px] border-custom-border-200 hover:border-custom-border-400"

View file

@ -1,20 +1,19 @@
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
import { useParams } from "next/navigation";
// components // components
import { EmptyState } from "@/components/empty-state"; import { EmptyState } from "@/components/empty-state";
// constants // constants
import { EMPTY_STATE_DETAILS } from "@/constants/empty-state"; import { EMPTY_STATE_DETAILS } from "@/constants/empty-state";
// hooks
import { useAppRouter } from "@/hooks/store";
// assets // assets
export const ProfileViewEmptyState: React.FC = observer(() => { export const ProfileViewEmptyState: React.FC = observer(() => {
// store hooks // store hooks
const { profileViewId } = useAppRouter(); const { profileViewId } = useParams();
if (!profileViewId) return null; if (!profileViewId) return null;
const emptyStateType = `profile-${profileViewId}`; const emptyStateType = `profile-${profileViewId.toString()}`;
return <EmptyState type={emptyStateType as keyof typeof EMPTY_STATE_DETAILS} size="sm" />; return <EmptyState type={emptyStateType as keyof typeof EMPTY_STATE_DETAILS} size="sm" />;
}); });

View file

@ -3,11 +3,12 @@
import React, { useMemo, useState } from "react"; import React, { useMemo, useState } from "react";
import sortBy from "lodash/sortBy"; import sortBy from "lodash/sortBy";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams } from "next/navigation";
import { TCycleGroups } from "@plane/types"; import { TCycleGroups } from "@plane/types";
// components // components
import { Loader, CycleGroupIcon } from "@plane/ui"; import { Loader, CycleGroupIcon } from "@plane/ui";
import { FilterHeader, FilterOption } from "@/components/issues"; import { FilterHeader, FilterOption } from "@/components/issues";
import { useAppRouter, useCycle } from "@/hooks/store"; import { useCycle } from "@/hooks/store";
// ui // ui
// types // types
@ -21,14 +22,14 @@ export const FilterCycle: React.FC<Props> = observer((props) => {
const { appliedFilters, handleUpdate, searchQuery } = props; const { appliedFilters, handleUpdate, searchQuery } = props;
// hooks // hooks
const { projectId } = useAppRouter(); const { projectId } = useParams();
const { getCycleById, getProjectCycleIds } = useCycle(); const { getCycleById, getProjectCycleIds } = useCycle();
// states // states
const [itemsToRender, setItemsToRender] = useState(5); const [itemsToRender, setItemsToRender] = useState(5);
const [previewEnabled, setPreviewEnabled] = useState(true); const [previewEnabled, setPreviewEnabled] = useState(true);
const cycleIds = projectId ? getProjectCycleIds(projectId) : undefined; const cycleIds = projectId ? getProjectCycleIds(projectId.toString()) : undefined;
const cycles = cycleIds?.map((projectId) => getCycleById(projectId)!) ?? null; const cycles = cycleIds?.map((projectId) => getCycleById(projectId)!) ?? null;
const appliedFiltersCount = appliedFilters?.length ?? 0; const appliedFiltersCount = appliedFilters?.length ?? 0;

View file

@ -1,5 +1,6 @@
import { useState } from "react"; import { useState } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams } from "next/navigation";
import { Search, X } from "lucide-react"; import { Search, X } from "lucide-react";
import { IIssueDisplayFilterOptions, IIssueFilterOptions, IIssueLabel, IState } from "@plane/types"; import { IIssueDisplayFilterOptions, IIssueFilterOptions, IIssueLabel, IState } from "@plane/types";
// hooks // hooks
@ -19,7 +20,6 @@ import {
FilterIssueType, FilterIssueType,
} from "@/components/issues"; } from "@/components/issues";
import { ILayoutDisplayFiltersOptions } from "@/constants/issue"; import { ILayoutDisplayFiltersOptions } from "@/constants/issue";
import { useAppRouter } from "@/hooks/store";
// components // components
// types // types
// constants // constants
@ -51,7 +51,7 @@ export const FilterSelection: React.FC<Props> = observer((props) => {
moduleViewDisabled = false, moduleViewDisabled = false,
} = props; } = props;
// hooks // hooks
const { moduleId, cycleId } = useAppRouter(); const { moduleId, cycleId } = useParams();
// states // states
const [filtersSearchQuery, setFiltersSearchQuery] = useState(""); const [filtersSearchQuery, setFiltersSearchQuery] = useState("");

View file

@ -3,10 +3,11 @@
import React, { useMemo, useState } from "react"; import React, { useMemo, useState } from "react";
import sortBy from "lodash/sortBy"; import sortBy from "lodash/sortBy";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams } from "next/navigation";
// components // components
import { Loader, DiceIcon } from "@plane/ui"; import { Loader, DiceIcon } from "@plane/ui";
import { FilterHeader, FilterOption } from "@/components/issues"; import { FilterHeader, FilterOption } from "@/components/issues";
import { useAppRouter, useModule } from "@/hooks/store"; import { useModule } from "@/hooks/store";
// ui // ui
type Props = { type Props = {
@ -18,14 +19,14 @@ type Props = {
export const FilterModule: React.FC<Props> = observer((props) => { export const FilterModule: React.FC<Props> = observer((props) => {
const { appliedFilters, handleUpdate, searchQuery } = props; const { appliedFilters, handleUpdate, searchQuery } = props;
// hooks // hooks
const { projectId } = useAppRouter(); const { projectId } = useParams();
const { getModuleById, getProjectModuleIds } = useModule(); const { getModuleById, getProjectModuleIds } = useModule();
// states // states
const [itemsToRender, setItemsToRender] = useState(5); const [itemsToRender, setItemsToRender] = useState(5);
const [previewEnabled, setPreviewEnabled] = useState(true); const [previewEnabled, setPreviewEnabled] = useState(true);
const moduleIds = projectId ? getProjectModuleIds(projectId) : undefined; const moduleIds = projectId ? getProjectModuleIds(projectId.toString()) : undefined;
const modules = moduleIds?.map((projectId) => getModuleById(projectId)!) ?? null; const modules = moduleIds?.map((moduleId) => getModuleById(moduleId)!) ?? null;
const appliedFiltersCount = appliedFilters?.length ?? 0; const appliedFiltersCount = appliedFilters?.length ?? 0;
const sortedOptions = useMemo(() => { const sortedOptions = useMemo(() => {

View file

@ -1,12 +1,13 @@
"use client"; "use client";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams } from "next/navigation";
// hooks // hooks
// ui // ui
import { Tooltip, StateGroupIcon, ControlLink } from "@plane/ui"; import { Tooltip, StateGroupIcon, ControlLink } from "@plane/ui";
// helpers // helpers
import { renderFormattedDate } from "@/helpers/date-time.helper"; import { renderFormattedDate } from "@/helpers/date-time.helper";
import { useAppRouter, useIssueDetail, useProject, useProjectState } from "@/hooks/store"; import { useIssueDetail, useProject, useProjectState } from "@/hooks/store";
import { usePlatformOS } from "@/hooks/use-platform-os"; import { usePlatformOS } from "@/hooks/use-platform-os";
type Props = { type Props = {
@ -15,8 +16,10 @@ type Props = {
export const IssueGanttBlock: React.FC<Props> = observer((props) => { export const IssueGanttBlock: React.FC<Props> = observer((props) => {
const { issueId } = props; const { issueId } = props;
// router
const { workspaceSlug: routerWorkspaceSlug } = useParams();
const workspaceSlug = routerWorkspaceSlug?.toString();
// store hooks // store hooks
const { workspaceSlug } = useAppRouter();
const { getProjectStates } = useProjectState(); const { getProjectStates } = useProjectState();
const { const {
issue: { getIssueById }, issue: { getIssueById },
@ -71,10 +74,12 @@ export const IssueGanttBlock: React.FC<Props> = observer((props) => {
// rendering issues on gantt sidebar // rendering issues on gantt sidebar
export const IssueGanttSidebarBlock: React.FC<Props> = observer((props) => { export const IssueGanttSidebarBlock: React.FC<Props> = observer((props) => {
const { issueId } = props; const { issueId } = props;
// router
const { workspaceSlug: routerWorkspaceSlug } = useParams();
const workspaceSlug = routerWorkspaceSlug?.toString();
// store hooks // store hooks
const { getStateById } = useProjectState(); const { getStateById } = useProjectState();
const { getProjectIdentifierById } = useProject(); const { getProjectIdentifierById } = useProject();
const { workspaceSlug } = useAppRouter();
const { const {
issue: { getIssueById }, issue: { getIssueById },
setPeekIssue, setPeekIssue,

View file

@ -4,6 +4,7 @@ import { MutableRefObject, useEffect, useRef, useState } from "react";
import { combine } from "@atlaskit/pragmatic-drag-and-drop/combine"; import { combine } from "@atlaskit/pragmatic-drag-and-drop/combine";
import { draggable, dropTargetForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter"; import { draggable, dropTargetForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
import { useParams } from "next/navigation";
import { TIssue, IIssueDisplayProperties, IIssueMap } from "@plane/types"; import { TIssue, IIssueDisplayProperties, IIssueMap } from "@plane/types";
// hooks // hooks
import { ControlLink, DropIndicator, TOAST_TYPE, Tooltip, setToast } from "@plane/ui"; import { ControlLink, DropIndicator, TOAST_TYPE, Tooltip, setToast } from "@plane/ui";
@ -11,7 +12,7 @@ import RenderIfVisible from "@/components/core/render-if-visible-HOC";
import { HIGHLIGHT_CLASS } from "@/components/issues/issue-layouts/utils"; import { HIGHLIGHT_CLASS } from "@/components/issues/issue-layouts/utils";
import { cn } from "@/helpers/common.helper"; import { cn } from "@/helpers/common.helper";
// hooks // hooks
import { useAppRouter, useIssueDetail, useProject, useKanbanView } from "@/hooks/store"; import { useIssueDetail, useProject, useKanbanView } from "@/hooks/store";
import useOutsideClickDetector from "@/hooks/use-outside-click-detector"; import useOutsideClickDetector from "@/hooks/use-outside-click-detector";
import { usePlatformOS } from "@/hooks/use-platform-os"; import { usePlatformOS } from "@/hooks/use-platform-os";
// components // components
@ -117,8 +118,10 @@ export const KanbanIssueBlock: React.FC<IssueBlockProps> = observer((props) => {
} = props; } = props;
const cardRef = useRef<HTMLAnchorElement | null>(null); const cardRef = useRef<HTMLAnchorElement | null>(null);
// router
const { workspaceSlug: routerWorkspaceSlug } = useParams();
const workspaceSlug = routerWorkspaceSlug?.toString();
// hooks // hooks
const { workspaceSlug } = useAppRouter();
const { getIsIssuePeeked, setPeekIssue } = useIssueDetail(); const { getIsIssuePeeked, setPeekIssue } = useIssueDetail();
const { isMobile } = usePlatformOS(); const { isMobile } = usePlatformOS();

View file

@ -1,18 +1,20 @@
import { observer } from "mobx-react"; import { observer } from "mobx-react";
// hooks // hooks
import { useParams } from "next/navigation";
import { ProjectIssueQuickActions } from "@/components/issues"; import { ProjectIssueQuickActions } from "@/components/issues";
import { EUserProjectRoles } from "@/constants/project"; import { EUserProjectRoles } from "@/constants/project";
import { useAppRouter, useUser } from "@/hooks/store"; import { useUser } from "@/hooks/store";
// components // components
// types // types
// constants // constants
import { BaseKanBanRoot } from "../base-kanban-root"; import { BaseKanBanRoot } from "../base-kanban-root";
export const ProfileIssuesKanBanLayout: React.FC = observer(() => { export const ProfileIssuesKanBanLayout: React.FC = observer(() => {
// router
const { profileViewId } = useParams();
const { const {
membership: { currentWorkspaceAllProjectsRole }, membership: { currentWorkspaceAllProjectsRole },
} = useUser(); } = useUser();
const { profileViewId } = useAppRouter();
const canEditPropertiesBasedOnProject = (projectId: string) => { const canEditPropertiesBasedOnProject = (projectId: string) => {
const currentProjectRole = currentWorkspaceAllProjectsRole && currentWorkspaceAllProjectsRole[projectId]; const currentProjectRole = currentWorkspaceAllProjectsRole && currentWorkspaceAllProjectsRole[projectId];
@ -24,7 +26,7 @@ export const ProfileIssuesKanBanLayout: React.FC = observer(() => {
<BaseKanBanRoot <BaseKanBanRoot
QuickActions={ProjectIssueQuickActions} QuickActions={ProjectIssueQuickActions}
canEditPropertiesBasedOnProject={canEditPropertiesBasedOnProject} canEditPropertiesBasedOnProject={canEditPropertiesBasedOnProject}
viewId={profileViewId} viewId={profileViewId.toString()}
/> />
); );
}); });

View file

@ -4,6 +4,7 @@ import { Dispatch, MouseEvent, SetStateAction, useEffect, useRef } from "react";
import { combine } from "@atlaskit/pragmatic-drag-and-drop/combine"; import { combine } from "@atlaskit/pragmatic-drag-and-drop/combine";
import { draggable } from "@atlaskit/pragmatic-drag-and-drop/element/adapter"; import { draggable } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
import { useParams } from "next/navigation";
import { ChevronRight } from "lucide-react"; import { ChevronRight } from "lucide-react";
// types // types
import { TIssue, IIssueDisplayProperties, TIssueMap } from "@plane/types"; import { TIssue, IIssueDisplayProperties, TIssueMap } from "@plane/types";
@ -15,7 +16,7 @@ import { IssueProperties } from "@/components/issues/issue-layouts/properties";
// helpers // helpers
import { cn } from "@/helpers/common.helper"; import { cn } from "@/helpers/common.helper";
// hooks // hooks
import { useAppRouter, useIssueDetail, useProject } from "@/hooks/store"; import { useIssueDetail, useProject } from "@/hooks/store";
import { TSelectionHelper } from "@/hooks/use-multiple-select"; import { TSelectionHelper } from "@/hooks/use-multiple-select";
import { usePlatformOS } from "@/hooks/use-platform-os"; import { usePlatformOS } from "@/hooks/use-platform-os";
// types // types
@ -59,8 +60,11 @@ export const IssueBlock = observer((props: IssueBlockProps) => {
} = props; } = props;
// ref // ref
const issueRef = useRef<HTMLDivElement | null>(null); const issueRef = useRef<HTMLDivElement | null>(null);
// router
const { workspaceSlug: routerWorkspaceSlug, projectId: routerProjectId } = useParams();
const workspaceSlug = routerWorkspaceSlug?.toString();
const projectId = routerProjectId?.toString();
// hooks // hooks
const { workspaceSlug, projectId } = useAppRouter();
const { getProjectIdentifierById } = useProject(); const { getProjectIdentifierById } = useProject();
const { getIsIssuePeeked, peekIssue, setPeekIssue, subIssues: subIssuesStore } = useIssueDetail(); const { getIsIssuePeeked, peekIssue, setPeekIssue, subIssues: subIssuesStore } = useIssueDetail();

View file

@ -1,21 +1,23 @@
import { FC } from "react"; import { FC } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
// hooks // hooks
import { useParams } from "next/navigation";
import { ProjectIssueQuickActions } from "@/components/issues"; import { ProjectIssueQuickActions } from "@/components/issues";
import { EUserProjectRoles } from "@/constants/project"; import { EUserProjectRoles } from "@/constants/project";
import { useAppRouter, useUser } from "@/hooks/store"; import { useUser } from "@/hooks/store";
// components // components
// types // types
// constants // constants
import { BaseListRoot } from "../base-list-root"; import { BaseListRoot } from "../base-list-root";
export const ProfileIssuesListLayout: FC = observer(() => { export const ProfileIssuesListLayout: FC = observer(() => {
// router
const { profileViewId } = useParams();
// store
const { const {
membership: { currentWorkspaceAllProjectsRole }, membership: { currentWorkspaceAllProjectsRole },
} = useUser(); } = useUser();
const { profileViewId } = useAppRouter();
const canEditPropertiesBasedOnProject = (projectId: string) => { const canEditPropertiesBasedOnProject = (projectId: string) => {
const currentProjectRole = currentWorkspaceAllProjectsRole && currentWorkspaceAllProjectsRole[projectId]; const currentProjectRole = currentWorkspaceAllProjectsRole && currentWorkspaceAllProjectsRole[projectId];
@ -26,7 +28,7 @@ export const ProfileIssuesListLayout: FC = observer(() => {
<BaseListRoot <BaseListRoot
QuickActions={ProjectIssueQuickActions} QuickActions={ProjectIssueQuickActions}
canEditPropertiesBasedOnProject={canEditPropertiesBasedOnProject} canEditPropertiesBasedOnProject={canEditPropertiesBasedOnProject}
viewId={profileViewId} viewId={profileViewId.toString()}
/> />
); );
}); });

View file

@ -3,7 +3,7 @@
import { useCallback, useMemo } from "react"; import { useCallback, useMemo } from "react";
import xor from "lodash/xor"; import xor from "lodash/xor";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams, usePathname, useRouter } from "next/navigation"; import { useParams, usePathname } from "next/navigation";
// icons // icons
import { CalendarCheck2, CalendarClock, Layers, Link, Paperclip } from "lucide-react"; import { CalendarCheck2, CalendarClock, Layers, Link, Paperclip } from "lucide-react";
// types // types
@ -28,6 +28,7 @@ import { getDate, renderFormattedPayloadDate } from "@/helpers/date-time.helper"
import { shouldHighlightIssueDueDate } from "@/helpers/issue.helper"; import { shouldHighlightIssueDueDate } from "@/helpers/issue.helper";
// hooks // hooks
import { useEventTracker, useLabel, useIssues, useProjectState, useProject, useProjectEstimates } from "@/hooks/store"; import { useEventTracker, useLabel, useIssues, useProjectState, useProject, useProjectEstimates } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
import { useIssueStoreType } from "@/hooks/use-issue-layout-store"; import { useIssueStoreType } from "@/hooks/use-issue-layout-store";
import { usePlatformOS } from "@/hooks/use-platform-os"; import { usePlatformOS } from "@/hooks/use-platform-os";
// local components // local components
@ -64,7 +65,7 @@ export const IssueProperties: React.FC<IIssueProperties> = observer((props) => {
const projectDetails = getProjectById(issue.project_id); const projectDetails = getProjectById(issue.project_id);
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug, projectId } = useParams(); const { workspaceSlug, projectId } = useParams();
const pathname = usePathname(); const pathname = usePathname();

View file

@ -3,6 +3,7 @@
import { Fragment, useEffect, useRef, useState } from "react"; import { Fragment, useEffect, useRef, useState } from "react";
import { Placement } from "@popperjs/core"; import { Placement } from "@popperjs/core";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams } from "next/navigation";
import { usePopper } from "react-popper"; import { usePopper } from "react-popper";
import { Check, ChevronDown, Search, Tags } from "lucide-react"; import { Check, ChevronDown, Search, Tags } from "lucide-react";
import { Combobox } from "@headlessui/react"; import { Combobox } from "@headlessui/react";
@ -11,7 +12,7 @@ import { IIssueLabel } from "@plane/types";
// ui // ui
import { Tooltip } from "@plane/ui"; import { Tooltip } from "@plane/ui";
// hooks // hooks
import { useAppRouter, useLabel } from "@/hooks/store"; import { useLabel } from "@/hooks/store";
import { useDropdownKeyDown } from "@/hooks/use-dropdown-key-down"; import { useDropdownKeyDown } from "@/hooks/use-dropdown-key-down";
import useOutsideClickDetector from "@/hooks/use-outside-click-detector"; import useOutsideClickDetector from "@/hooks/use-outside-click-detector";
import { usePlatformOS } from "@/hooks/use-platform-os"; import { usePlatformOS } from "@/hooks/use-platform-os";
@ -50,6 +51,9 @@ export const IssuePropertyLabels: React.FC<IIssuePropertyLabels> = observer((pro
noLabelBorder = false, noLabelBorder = false,
placeholderText, placeholderText,
} = props; } = props;
// router
const { workspaceSlug: routerWorkspaceSlug } = useParams();
const workspaceSlug = routerWorkspaceSlug?.toString();
// states // states
const [query, setQuery] = useState(""); const [query, setQuery] = useState("");
const [isOpen, setIsOpen] = useState(false); const [isOpen, setIsOpen] = useState(false);
@ -61,7 +65,6 @@ export const IssuePropertyLabels: React.FC<IIssuePropertyLabels> = observer((pro
const [popperElement, setPopperElement] = useState<HTMLDivElement | null>(null); const [popperElement, setPopperElement] = useState<HTMLDivElement | null>(null);
const [isLoading, setIsLoading] = useState<boolean>(false); const [isLoading, setIsLoading] = useState<boolean>(false);
// store hooks // store hooks
const { workspaceSlug } = useAppRouter();
const { fetchProjectLabels, getProjectLabels } = useLabel(); const { fetchProjectLabels, getProjectLabels } = useLabel();
const { isMobile } = usePlatformOS(); const { isMobile } = usePlatformOS();
const storeLabels = getProjectLabels(projectId); const storeLabels = getProjectLabels(projectId);

View file

@ -1,12 +1,12 @@
import React from "react"; import React from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useRouter } from "next/navigation"; import { useParams } from "next/navigation";
// types // types
import { TIssue } from "@plane/types"; import { TIssue } from "@plane/types";
// helpers // helpers
import { cn } from "@/helpers/common.helper"; import { cn } from "@/helpers/common.helper";
// hooks // hooks
import { useAppRouter } from "@/hooks/store"; import { useAppRouter } from "@/hooks/use-app-router";
type Props = { type Props = {
issue: TIssue; issue: TIssue;
@ -15,14 +15,14 @@ type Props = {
export const SpreadsheetSubIssueColumn: React.FC<Props> = observer((props: Props) => { export const SpreadsheetSubIssueColumn: React.FC<Props> = observer((props: Props) => {
const { issue } = props; const { issue } = props;
// router // router
const router = useRouter(); const router = useAppRouter();
// hooks // hooks
const { workspaceSlug } = useAppRouter(); const { workspaceSlug } = useParams();
// derived values // derived values
const subIssueCount = issue?.sub_issues_count ?? 0; const subIssueCount = issue?.sub_issues_count ?? 0;
const redirectToIssueDetail = () => { const redirectToIssueDetail = () => {
router.push(`/${workspaceSlug}/projects/${issue.project_id}/${issue.archived_at ? "archives/" : ""}issues/${issue.id}#sub-issues`); router.push(`/${workspaceSlug.toString()}/projects/${issue.project_id}/${issue.archived_at ? "archives/" : ""}issues/${issue.id}#sub-issues`);
}; };
return ( return (

View file

@ -30,14 +30,7 @@ import { renderFormattedPayloadDate, getDate } from "@/helpers/date-time.helper"
import { getChangedIssuefields, getDescriptionPlaceholder } from "@/helpers/issue.helper"; import { getChangedIssuefields, getDescriptionPlaceholder } from "@/helpers/issue.helper";
import { shouldRenderProject } from "@/helpers/project.helper"; import { shouldRenderProject } from "@/helpers/project.helper";
// hooks // hooks
import { import { useProjectEstimates, useInstance, useIssueDetail, useProject, useWorkspace } from "@/hooks/store";
useAppRouter,
useProjectEstimates,
useInstance,
useIssueDetail,
useProject,
useWorkspace,
} from "@/hooks/store";
import useKeypress from "@/hooks/use-keypress"; import useKeypress from "@/hooks/use-keypress";
import { useProjectIssueProperties } from "@/hooks/use-project-issue-properties"; import { useProjectIssueProperties } from "@/hooks/use-project-issue-properties";
// services // services
@ -121,11 +114,10 @@ export const IssueFormRoot: FC<IssueFormProps> = observer((props) => {
const editorRef = useRef<EditorRefApi>(null); const editorRef = useRef<EditorRefApi>(null);
const submitBtnRef = useRef<HTMLButtonElement | null>(null); const submitBtnRef = useRef<HTMLButtonElement | null>(null);
// router // router
const { workspaceSlug } = useParams(); const { workspaceSlug, projectId: routeProjectId } = useParams();
// store hooks // store hooks
const workspaceStore = useWorkspace(); const workspaceStore = useWorkspace();
const workspaceId = workspaceStore.getWorkspaceBySlug(workspaceSlug as string)?.id as string; const workspaceId = workspaceStore.getWorkspaceBySlug(workspaceSlug as string)?.id as string;
const { projectId: routeProjectId } = useAppRouter();
const { config } = useInstance(); const { config } = useInstance();
const { getProjectById } = useProject(); const { getProjectById } = useProject();
const { areEstimateEnabledByProjectId } = useProjectEstimates(); const { areEstimateEnabledByProjectId } = useProjectEstimates();

View file

@ -2,7 +2,7 @@
import React, { useEffect, useRef, useState } from "react"; import React, { useEffect, useRef, useState } from "react";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
import { usePathname } from "next/navigation"; import { useParams, usePathname } from "next/navigation";
// types // types
import type { TIssue } from "@plane/types"; import type { TIssue } from "@plane/types";
// ui // ui
@ -11,15 +11,7 @@ import { EModalPosition, EModalWidth, ModalCore, TOAST_TYPE, setToast } from "@p
import { ISSUE_CREATED, ISSUE_UPDATED } from "@/constants/event-tracker"; import { ISSUE_CREATED, ISSUE_UPDATED } from "@/constants/event-tracker";
import { EIssuesStoreType } from "@/constants/issue"; import { EIssuesStoreType } from "@/constants/issue";
// hooks // hooks
import { import { useEventTracker, useCycle, useIssues, useModule, useProject, useIssueDetail } from "@/hooks/store";
useEventTracker,
useCycle,
useIssues,
useModule,
useProject,
useIssueDetail,
useAppRouter,
} from "@/hooks/store";
import { useIssuesActions } from "@/hooks/use-issues-actions"; import { useIssuesActions } from "@/hooks/use-issues-actions";
import useLocalStorage from "@/hooks/use-local-storage"; import useLocalStorage from "@/hooks/use-local-storage";
// components // components
@ -55,7 +47,7 @@ export const CreateUpdateIssueModal: React.FC<IssuesModalProps> = observer((prop
const [description, setDescription] = useState<string | undefined>(undefined); const [description, setDescription] = useState<string | undefined>(undefined);
// store hooks // store hooks
const { captureIssueEvent } = useEventTracker(); const { captureIssueEvent } = useEventTracker();
const { workspaceSlug, projectId, cycleId, moduleId } = useAppRouter(); const { workspaceSlug, projectId, cycleId, moduleId } = useParams();
const { workspaceProjectIds } = useProject(); const { workspaceProjectIds } = useProject();
const { fetchCycleDetails } = useCycle(); const { fetchCycleDetails } = useCycle();
const { fetchModuleDetails } = useModule(); const { fetchModuleDetails } = useModule();
@ -79,7 +71,7 @@ export const CreateUpdateIssueModal: React.FC<IssuesModalProps> = observer((prop
setDescription(data?.description_html || "<p></p>"); setDescription(data?.description_html || "<p></p>");
return; return;
} }
const response = await fetchIssue(workspaceSlug, projectId, issueId, isDraft ? "DRAFT" : "DEFAULT"); const response = await fetchIssue(workspaceSlug.toString(), projectId.toString(), issueId, isDraft ? "DRAFT" : "DEFAULT");
if (response) setDescription(response?.description_html || "<p></p>"); if (response) setDescription(response?.description_html || "<p></p>");
}; };
@ -104,7 +96,7 @@ export const CreateUpdateIssueModal: React.FC<IssuesModalProps> = observer((prop
// if data is not present, set active project to the project // if data is not present, set active project to the project
// in the url. This has the least priority. // in the url. This has the least priority.
if (workspaceProjectIds && workspaceProjectIds.length > 0 && !activeProjectId) if (workspaceProjectIds && workspaceProjectIds.length > 0 && !activeProjectId)
setActiveProjectId(projectId ?? workspaceProjectIds?.[0]); setActiveProjectId(projectId.toString() ?? workspaceProjectIds?.[0]);
// clearing up the description state when we leave the component // clearing up the description state when we leave the component
return () => setDescription(undefined); return () => setDescription(undefined);
@ -113,15 +105,15 @@ export const CreateUpdateIssueModal: React.FC<IssuesModalProps> = observer((prop
const addIssueToCycle = async (issue: TIssue, cycleId: string) => { const addIssueToCycle = async (issue: TIssue, cycleId: string) => {
if (!workspaceSlug || !issue.project_id) return; if (!workspaceSlug || !issue.project_id) return;
await issues.addIssueToCycle(workspaceSlug, issue.project_id, cycleId, [issue.id]); await issues.addIssueToCycle(workspaceSlug.toString(), issue.project_id, cycleId, [issue.id]);
fetchCycleDetails(workspaceSlug, issue.project_id, cycleId); fetchCycleDetails(workspaceSlug.toString(), issue.project_id, cycleId);
}; };
const addIssueToModule = async (issue: TIssue, moduleIds: string[]) => { const addIssueToModule = async (issue: TIssue, moduleIds: string[]) => {
if (!workspaceSlug || !activeProjectId) return; if (!workspaceSlug || !activeProjectId) return;
await issues.changeModulesInIssue(workspaceSlug, activeProjectId, issue.id, moduleIds, []); await issues.changeModulesInIssue(workspaceSlug.toString(), activeProjectId, issue.id, moduleIds, []);
moduleIds.forEach((moduleId) => fetchModuleDetails(workspaceSlug, activeProjectId, moduleId)); moduleIds.forEach((moduleId) => fetchModuleDetails(workspaceSlug.toString(), activeProjectId, moduleId));
}; };
const handleCreateMoreToggleChange = (value: boolean) => { const handleCreateMoreToggleChange = (value: boolean) => {
@ -133,7 +125,7 @@ export const CreateUpdateIssueModal: React.FC<IssuesModalProps> = observer((prop
// updating the current edited issue data in the local storage // updating the current edited issue data in the local storage
let draftIssues = localStorageDraftIssues ? localStorageDraftIssues : {}; let draftIssues = localStorageDraftIssues ? localStorageDraftIssues : {};
if (workspaceSlug) { if (workspaceSlug) {
draftIssues = { ...draftIssues, [workspaceSlug]: changesMade }; draftIssues = { ...draftIssues, [workspaceSlug.toString()]: changesMade };
setLocalStorageDraftIssue(draftIssues); setLocalStorageDraftIssue(draftIssues);
} }
} }
@ -151,7 +143,7 @@ export const CreateUpdateIssueModal: React.FC<IssuesModalProps> = observer((prop
try { try {
const response = is_draft_issue const response = is_draft_issue
? await draftIssues.createIssue(workspaceSlug, payload.project_id, payload) ? await draftIssues.createIssue(workspaceSlug.toString(), payload.project_id, payload)
: createIssue && (await createIssue(payload.project_id, payload)); : createIssue && (await createIssue(payload.project_id, payload));
if (!response) throw new Error(); if (!response) throw new Error();
@ -193,7 +185,7 @@ export const CreateUpdateIssueModal: React.FC<IssuesModalProps> = observer((prop
try { try {
isDraft isDraft
? await draftIssues.updateIssue(workspaceSlug, payload.project_id, data.id, payload) ? await draftIssues.updateIssue(workspaceSlug.toString(), payload.project_id, data.id, payload)
: updateIssue && (await updateIssue(payload.project_id, data.id, payload)); : updateIssue && (await updateIssue(payload.project_id, data.id, payload));
setToast({ setToast({
@ -249,8 +241,8 @@ export const CreateUpdateIssueModal: React.FC<IssuesModalProps> = observer((prop
data={{ data={{
...data, ...data,
description_html: description, description_html: description,
cycle_id: data?.cycle_id ? data?.cycle_id : cycleId ? cycleId : null, cycle_id: data?.cycle_id ? data?.cycle_id : cycleId ? cycleId.toString() : null,
module_ids: data?.module_ids ? data?.module_ids : moduleId ? [moduleId] : null, module_ids: data?.module_ids ? data?.module_ids : moduleId ? [moduleId.toString()] : null,
}} }}
issueTitleRef={issueTitleRef} issueTitleRef={issueTitleRef}
onChange={handleFormChange} onChange={handleFormChange}
@ -267,8 +259,8 @@ export const CreateUpdateIssueModal: React.FC<IssuesModalProps> = observer((prop
data={{ data={{
...data, ...data,
description_html: description, description_html: description,
cycle_id: data?.cycle_id ? data?.cycle_id : cycleId ? cycleId : null, cycle_id: data?.cycle_id ? data?.cycle_id : cycleId ? cycleId.toString() : null,
module_ids: data?.module_ids ? data?.module_ids : moduleId ? [moduleId] : null, module_ids: data?.module_ids ? data?.module_ids : moduleId ? [moduleId.toString()] : null,
}} }}
onClose={() => handleClose(false)} onClose={() => handleClose(false)}
isCreateMoreToggleEnabled={createMore} isCreateMoreToggleEnabled={createMore}

View file

@ -2,7 +2,7 @@
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
import { Controller, useForm } from "react-hook-form"; import { Controller, useForm } from "react-hook-form";
import { import {
ArchiveRestoreIcon, ArchiveRestoreIcon,
@ -47,6 +47,7 @@ import { getDate, renderFormattedPayloadDate } from "@/helpers/date-time.helper"
import { copyUrlToClipboard } from "@/helpers/string.helper"; import { copyUrlToClipboard } from "@/helpers/string.helper";
// hooks // hooks
import { useModule, useUser, useEventTracker, useProjectEstimates } from "@/hooks/store"; import { useModule, useUser, useEventTracker, useProjectEstimates } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
// plane web constants // plane web constants
import { EEstimateSystem } from "@/plane-web/constants/estimates"; import { EEstimateSystem } from "@/plane-web/constants/estimates";
@ -73,7 +74,7 @@ export const ModuleAnalyticsSidebar: React.FC<Props> = observer((props) => {
const [moduleLinkModal, setModuleLinkModal] = useState(false); const [moduleLinkModal, setModuleLinkModal] = useState(false);
const [selectedLinkToUpdate, setSelectedLinkToUpdate] = useState<ILinkDetails | null>(null); const [selectedLinkToUpdate, setSelectedLinkToUpdate] = useState<ILinkDetails | null>(null);
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug, projectId } = useParams(); const { workspaceSlug, projectId } = useParams();
// store hooks // store hooks

View file

@ -1,12 +1,12 @@
"use client"; "use client";
import { useState, Fragment } from "react"; import { useState, Fragment } from "react";
import { useRouter } from "next/navigation";
import { Dialog, Transition } from "@headlessui/react"; import { Dialog, Transition } from "@headlessui/react";
// ui // ui
import { Button, TOAST_TYPE, setToast } from "@plane/ui"; import { Button, TOAST_TYPE, setToast } from "@plane/ui";
// hooks // hooks
import { useModule } from "@/hooks/store"; import { useModule } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
type Props = { type Props = {
workspaceSlug: string; workspaceSlug: string;
@ -20,7 +20,7 @@ type Props = {
export const ArchiveModuleModal: React.FC<Props> = (props) => { export const ArchiveModuleModal: React.FC<Props> = (props) => {
const { workspaceSlug, projectId, moduleId, isOpen, handleClose } = props; const { workspaceSlug, projectId, moduleId, isOpen, handleClose } = props;
// router // router
const router = useRouter(); const router = useAppRouter();
// states // states
const [isArchiving, setIsArchiving] = useState(false); const [isArchiving, setIsArchiving] = useState(false);
// store hooks // store hooks

View file

@ -2,7 +2,7 @@
import React, { useState } from "react"; import React, { useState } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
// types // types
import type { IModule } from "@plane/types"; import type { IModule } from "@plane/types";
// ui // ui
@ -11,6 +11,7 @@ import { AlertModalCore, TOAST_TYPE, setToast } from "@plane/ui";
import { MODULE_DELETED } from "@/constants/event-tracker"; import { MODULE_DELETED } from "@/constants/event-tracker";
// hooks // hooks
import { useEventTracker, useModule } from "@/hooks/store"; import { useEventTracker, useModule } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
type Props = { type Props = {
data: IModule; data: IModule;
@ -23,7 +24,7 @@ export const DeleteModuleModal: React.FC<Props> = observer((props) => {
// states // states
const [isDeleteLoading, setIsDeleteLoading] = useState(false); const [isDeleteLoading, setIsDeleteLoading] = useState(false);
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug, projectId, moduleId, peekModule } = useParams(); const { workspaceSlug, projectId, moduleId, peekModule } = useParams();
// store hooks // store hooks
const { captureModuleEvent } = useEventTracker(); const { captureModuleEvent } = useEventTracker();

View file

@ -2,7 +2,7 @@
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import Link from "next/link"; import Link from "next/link";
import { useRouter } from "next/navigation"; import { useParams } from "next/navigation";
// hooks // hooks
// ui // ui
import { Tooltip, ModuleStatusIcon } from "@plane/ui"; import { Tooltip, ModuleStatusIcon } from "@plane/ui";
@ -10,7 +10,8 @@ import { Tooltip, ModuleStatusIcon } from "@plane/ui";
import { MODULE_STATUS } from "@/constants/module"; import { MODULE_STATUS } from "@/constants/module";
import { renderFormattedDate } from "@/helpers/date-time.helper"; import { renderFormattedDate } from "@/helpers/date-time.helper";
// constants // constants
import { useAppRouter, useModule } from "@/hooks/store"; import { useModule } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
import { usePlatformOS } from "@/hooks/use-platform-os"; import { usePlatformOS } from "@/hooks/use-platform-os";
type Props = { type Props = {
@ -20,9 +21,9 @@ type Props = {
export const ModuleGanttBlock: React.FC<Props> = observer((props) => { export const ModuleGanttBlock: React.FC<Props> = observer((props) => {
const { moduleId } = props; const { moduleId } = props;
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug } = useParams();
// store hooks // store hooks
const { workspaceSlug } = useAppRouter();
const { getModuleById } = useModule(); const { getModuleById } = useModule();
// derived values // derived values
const moduleDetails = getModuleById(moduleId); const moduleDetails = getModuleById(moduleId);
@ -34,7 +35,7 @@ export const ModuleGanttBlock: React.FC<Props> = observer((props) => {
className="relative flex h-full w-full items-center rounded" className="relative flex h-full w-full items-center rounded"
style={{ backgroundColor: MODULE_STATUS.find((s) => s.value === moduleDetails?.status)?.color }} style={{ backgroundColor: MODULE_STATUS.find((s) => s.value === moduleDetails?.status)?.color }}
onClick={() => onClick={() =>
router.push(`/${workspaceSlug}/projects/${moduleDetails?.project_id}/modules/${moduleDetails?.id}`) router.push(`/${workspaceSlug?.toString()}/projects/${moduleDetails?.project_id}/modules/${moduleDetails?.id}`)
} }
> >
<div className="absolute left-0 top-0 h-full w-full bg-custom-background-100/50" /> <div className="absolute left-0 top-0 h-full w-full bg-custom-background-100/50" />
@ -59,8 +60,8 @@ export const ModuleGanttBlock: React.FC<Props> = observer((props) => {
export const ModuleGanttSidebarBlock: React.FC<Props> = observer((props) => { export const ModuleGanttSidebarBlock: React.FC<Props> = observer((props) => {
const { moduleId } = props; const { moduleId } = props;
const { workspaceSlug } = useParams();
// store hooks // store hooks
const { workspaceSlug } = useAppRouter();
const { getModuleById } = useModule(); const { getModuleById } = useModule();
// derived values // derived values
const moduleDetails = getModuleById(moduleId); const moduleDetails = getModuleById(moduleId);
@ -68,7 +69,7 @@ export const ModuleGanttSidebarBlock: React.FC<Props> = observer((props) => {
return ( return (
<Link <Link
className="relative flex h-full w-full items-center gap-2" className="relative flex h-full w-full items-center gap-2"
href={`/${workspaceSlug}/projects/${moduleDetails?.project_id}/modules/${moduleDetails?.id}`} href={`/${workspaceSlug?.toString()}/projects/${moduleDetails?.project_id}/modules/${moduleDetails?.id}`}
draggable={false} draggable={false}
> >
<ModuleStatusIcon status={moduleDetails?.status ?? "backlog"} height="16px" width="16px" /> <ModuleStatusIcon status={moduleDetails?.status ?? "backlog"} height="16px" width="16px" />

View file

@ -3,7 +3,7 @@
import React, { useRef } from "react"; import React, { useRef } from "react";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
import Link from "next/link"; import Link from "next/link";
import { useParams, usePathname, useRouter, useSearchParams } from "next/navigation"; import { useParams, usePathname, useSearchParams } from "next/navigation";
import { CalendarCheck2, CalendarClock, Info, MoveRight, SquareUser } from "lucide-react"; import { CalendarCheck2, CalendarClock, Info, MoveRight, SquareUser } from "lucide-react";
// ui // ui
import { LayersIcon, Tooltip, setPromiseToast } from "@plane/ui"; import { LayersIcon, Tooltip, setPromiseToast } from "@plane/ui";
@ -20,6 +20,7 @@ import { getDate, renderFormattedDate } from "@/helpers/date-time.helper";
import { generateQueryParams } from "@/helpers/router.helper"; import { generateQueryParams } from "@/helpers/router.helper";
// hooks // hooks
import { useEventTracker, useMember, useModule, useProjectEstimates, useUser } from "@/hooks/store"; import { useEventTracker, useMember, useModule, useProjectEstimates, useUser } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
import { usePlatformOS } from "@/hooks/use-platform-os"; import { usePlatformOS } from "@/hooks/use-platform-os";
// plane web constants // plane web constants
import { EEstimateSystem } from "@/plane-web/constants/estimates"; import { EEstimateSystem } from "@/plane-web/constants/estimates";
@ -33,7 +34,7 @@ export const ModuleCardItem: React.FC<Props> = observer((props) => {
// refs // refs
const parentRef = useRef(null); const parentRef = useRef(null);
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug, projectId } = useParams(); const { workspaceSlug, projectId } = useParams();
const searchParams = useSearchParams(); const searchParams = useSearchParams();
const pathname = usePathname(); const pathname = usePathname();

View file

@ -2,7 +2,7 @@
import React, { useRef } from "react"; import React, { useRef } from "react";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
import { useParams, usePathname, useRouter, useSearchParams } from "next/navigation"; import { useParams, usePathname, useSearchParams } from "next/navigation";
// icons // icons
import { Check, Info } from "lucide-react"; import { Check, Info } from "lucide-react";
// ui // ui
@ -13,7 +13,8 @@ import { ModuleListItemAction } from "@/components/modules";
// helpers // helpers
import { generateQueryParams } from "@/helpers/router.helper"; import { generateQueryParams } from "@/helpers/router.helper";
// hooks // hooks
import { useAppRouter, useModule, useProjectEstimates } from "@/hooks/store"; import { useModule, useProjectEstimates } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
import { usePlatformOS } from "@/hooks/use-platform-os"; import { usePlatformOS } from "@/hooks/use-platform-os";
// plane web constants // plane web constants
import { EEstimateSystem } from "@/plane-web/constants/estimates"; import { EEstimateSystem } from "@/plane-web/constants/estimates";
@ -27,14 +28,13 @@ export const ModuleListItem: React.FC<Props> = observer((props) => {
// refs // refs
const parentRef = useRef(null); const parentRef = useRef(null);
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug } = useParams(); const { workspaceSlug, projectId } = useParams();
const searchParams = useSearchParams(); const searchParams = useSearchParams();
const pathname = usePathname(); const pathname = usePathname();
// store hooks // store hooks
const { getModuleById } = useModule(); const { getModuleById } = useModule();
const { isMobile } = usePlatformOS(); const { isMobile } = usePlatformOS();
const { projectId } = useAppRouter();
const { currentActiveEstimateId, areEstimateEnabledByProjectId, estimateById } = useProjectEstimates(); const { currentActiveEstimateId, areEstimateEnabledByProjectId, estimateById } = useProjectEstimates();
// derived values // derived values
@ -50,7 +50,7 @@ export const ModuleListItem: React.FC<Props> = observer((props) => {
const isEstimateEnabled = const isEstimateEnabled =
projectId && projectId &&
currentActiveEstimateId && currentActiveEstimateId &&
areEstimateEnabledByProjectId(projectId) && areEstimateEnabledByProjectId(projectId?.toString()) &&
estimateById(currentActiveEstimateId)?.type === EEstimateSystem.POINTS; estimateById(currentActiveEstimateId)?.type === EEstimateSystem.POINTS;
const completionPercentage = isEstimateEnabled const completionPercentage = isEstimateEnabled

View file

@ -1,9 +1,10 @@
import React, { useEffect } from "react"; import React, { useEffect } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { usePathname, useRouter, useSearchParams } from "next/navigation"; import { usePathname, useSearchParams } from "next/navigation";
// hooks // hooks
import { generateQueryParams } from "@/helpers/router.helper"; import { generateQueryParams } from "@/helpers/router.helper";
import { useModule } from "@/hooks/store"; import { useModule } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
// components // components
import { ModuleAnalyticsSidebar } from "./"; import { ModuleAnalyticsSidebar } from "./";
@ -15,7 +16,7 @@ type Props = {
export const ModulePeekOverview: React.FC<Props> = observer(({ projectId, workspaceSlug, isArchived = false }) => { export const ModulePeekOverview: React.FC<Props> = observer(({ projectId, workspaceSlug, isArchived = false }) => {
// router // router
const router = useRouter(); const router = useAppRouter();
const pathname = usePathname(); const pathname = usePathname();
const searchParams = useSearchParams(); const searchParams = useSearchParams();
const peekModule = searchParams.get("peekModule"); const peekModule = searchParams.get("peekModule");

View file

@ -2,7 +2,7 @@
import { useState } from "react"; import { useState } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useRouter } from "next/navigation";
// icons // icons
import { ArchiveRestoreIcon, ExternalLink, LinkIcon, Pencil, Trash2 } from "lucide-react"; import { ArchiveRestoreIcon, ExternalLink, LinkIcon, Pencil, Trash2 } from "lucide-react";
// ui // ui
@ -16,6 +16,7 @@ import { cn } from "@/helpers/common.helper";
import { copyUrlToClipboard } from "@/helpers/string.helper"; import { copyUrlToClipboard } from "@/helpers/string.helper";
// hooks // hooks
import { useModule, useEventTracker, useUser } from "@/hooks/store"; import { useModule, useEventTracker, useUser } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
type Props = { type Props = {
parentRef: React.RefObject<HTMLDivElement>; parentRef: React.RefObject<HTMLDivElement>;
@ -27,7 +28,7 @@ type Props = {
export const ModuleQuickActions: React.FC<Props> = observer((props) => { export const ModuleQuickActions: React.FC<Props> = observer((props) => {
const { parentRef, moduleId, projectId, workspaceSlug } = props; const { parentRef, moduleId, projectId, workspaceSlug } = props;
// router // router
const router = useRouter(); const router = useAppRouter();
// states // states
const [editModal, setEditModal] = useState(false); const [editModal, setEditModal] = useState(false);
const [archiveModuleModal, setArchiveModuleModal] = useState(false); const [archiveModuleModal, setArchiveModuleModal] = useState(false);

View file

@ -1,7 +1,7 @@
"use client"; "use client";
import React, { useState } from "react"; import React, { useState } from "react";
import { useRouter } from "next/navigation";
import { useTheme } from "next-themes"; import { useTheme } from "next-themes";
import { ArrowRightLeft } from "lucide-react"; import { ArrowRightLeft } from "lucide-react";
import { Dialog, Transition } from "@headlessui/react"; import { Dialog, Transition } from "@headlessui/react";
@ -9,6 +9,7 @@ import { Dialog, Transition } from "@headlessui/react";
import { Button, TOAST_TYPE, setToast } from "@plane/ui"; import { Button, TOAST_TYPE, setToast } from "@plane/ui";
// hooks // hooks
import { useUser } from "@/hooks/store"; import { useUser } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
type Props = { type Props = {
isOpen: boolean; isOpen: boolean;
@ -20,7 +21,7 @@ export const SwitchAccountModal: React.FC<Props> = (props) => {
// states // states
const [switchingAccount, setSwitchingAccount] = useState(false); const [switchingAccount, setSwitchingAccount] = useState(false);
// router // router
const router = useRouter(); const router = useAppRouter();
// store hooks // store hooks
const { data: userData, signOut } = useUser(); const { data: userData, signOut } = useUser();

View file

@ -1,5 +1,6 @@
import { useEffect } from "react"; import { useEffect } from "react";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
import { useParams } from "next/navigation";
// components // components
import { DashboardWidgets } from "@/components/dashboard"; import { DashboardWidgets } from "@/components/dashboard";
import { EmptyState } from "@/components/empty-state"; import { EmptyState } from "@/components/empty-state";
@ -12,15 +13,7 @@ import { PRODUCT_TOUR_COMPLETED } from "@/constants/event-tracker";
// helpers // helpers
import { cn } from "@/helpers/common.helper"; import { cn } from "@/helpers/common.helper";
// hooks // hooks
import { import { useCommandPalette, useUserProfile, useEventTracker, useDashboard, useProject, useUser } from "@/hooks/store";
useCommandPalette,
useAppRouter,
useUserProfile,
useEventTracker,
useDashboard,
useProject,
useUser,
} from "@/hooks/store";
import useSize from "@/hooks/use-window-size"; import useSize from "@/hooks/use-window-size";
export const WorkspaceDashboardView = observer(() => { export const WorkspaceDashboardView = observer(() => {
@ -30,7 +23,7 @@ export const WorkspaceDashboardView = observer(() => {
setTrackElement, setTrackElement,
} = useEventTracker(); } = useEventTracker();
const { toggleCreateProjectModal } = useCommandPalette(); const { toggleCreateProjectModal } = useCommandPalette();
const { workspaceSlug } = useAppRouter(); const { workspaceSlug } = useParams();
const { data: currentUser } = useUser(); const { data: currentUser } = useUser();
const { data: currentUserProfile, updateTourCompleted } = useUserProfile(); const { data: currentUserProfile, updateTourCompleted } = useUserProfile();
const { captureEvent } = useEventTracker(); const { captureEvent } = useEventTracker();
@ -56,7 +49,7 @@ export const WorkspaceDashboardView = observer(() => {
useEffect(() => { useEffect(() => {
if (!workspaceSlug) return; if (!workspaceSlug) return;
fetchHomeDashboardWidgets(workspaceSlug); fetchHomeDashboardWidgets(workspaceSlug?.toString());
}, [fetchHomeDashboardWidgets, workspaceSlug]); }, [fetchHomeDashboardWidgets, workspaceSlug]);
// TODO: refactor loader implementation // TODO: refactor loader implementation

View file

@ -1,6 +1,7 @@
"use client"; "use client";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams } from "next/navigation";
import { ArchiveRestoreIcon, Clipboard, Copy, Link, Lock, LockOpen } from "lucide-react"; import { ArchiveRestoreIcon, Clipboard, Copy, Link, Lock, LockOpen } from "lucide-react";
// document editor // document editor
import { EditorReadOnlyRefApi, EditorRefApi } from "@plane/document-editor"; import { EditorReadOnlyRefApi, EditorRefApi } from "@plane/document-editor";
@ -9,7 +10,6 @@ import { ArchiveIcon, CustomMenu, TOAST_TYPE, ToggleSwitch, setToast } from "@pl
// helpers // helpers
import { copyTextToClipboard, copyUrlToClipboard } from "@/helpers/string.helper"; import { copyTextToClipboard, copyUrlToClipboard } from "@/helpers/string.helper";
// hooks // hooks
import { useAppRouter } from "@/hooks/store";
import { usePageFilters } from "@/hooks/use-page-filters"; import { usePageFilters } from "@/hooks/use-page-filters";
// store // store
import { IPage } from "@/store/pages/page"; import { IPage } from "@/store/pages/page";
@ -36,7 +36,7 @@ export const PageOptionsDropdown: React.FC<Props> = observer((props) => {
restore, restore,
} = page; } = page;
// store hooks // store hooks
const { workspaceSlug, projectId } = useAppRouter(); const { workspaceSlug, projectId } = useParams();
// page filters // page filters
const { isFullWidth, handleFullWidth } = usePageFilters(); const { isFullWidth, handleFullWidth } = usePageFilters();
const handleArchivePage = async () => const handleArchivePage = async () =>
@ -102,7 +102,7 @@ export const PageOptionsDropdown: React.FC<Props> = observer((props) => {
{ {
key: "copy-page-link", key: "copy-page-link",
action: () => { action: () => {
copyUrlToClipboard(`${workspaceSlug}/projects/${projectId}/pages/${id}`).then(() => copyUrlToClipboard(`${workspaceSlug?.toString()}/projects/${projectId?.toString()}/pages/${id}`).then(() =>
setToast({ setToast({
type: TOAST_TYPE.SUCCESS, type: TOAST_TYPE.SUCCESS,
title: "Success!", title: "Success!",

View file

@ -1,5 +1,5 @@
import { FC, useEffect, useState } from "react"; import { FC, useEffect, useState } from "react";
import { useRouter } from "next/navigation";
// types // types
import { TPage } from "@plane/types"; import { TPage } from "@plane/types";
// ui // ui
@ -11,6 +11,7 @@ import { PAGE_CREATED } from "@/constants/event-tracker";
import { EPageAccess } from "@/constants/page"; import { EPageAccess } from "@/constants/page";
// hooks // hooks
import { useProjectPages, useEventTracker } from "@/hooks/store"; import { useProjectPages, useEventTracker } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
type Props = { type Props = {
workspaceSlug: string; workspaceSlug: string;
@ -30,7 +31,7 @@ export const CreatePageModal: FC<Props> = (props) => {
logo_props: undefined, logo_props: undefined,
}); });
// router // router
const router = useRouter(); const router = useAppRouter();
// store hooks // store hooks
const { createPage } = useProjectPages(); const { createPage } = useProjectPages();
const { capturePageEvent } = useEventTracker(); const { capturePageEvent } = useEventTracker();

View file

@ -3,7 +3,7 @@
import React, { useRef, useState } from "react"; import React, { useRef, useState } from "react";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
import Link from "next/link"; import Link from "next/link";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
import { ArchiveRestoreIcon, Check, ExternalLink, LinkIcon, Lock, Settings, Trash2, UserPlus } from "lucide-react"; import { ArchiveRestoreIcon, Check, ExternalLink, LinkIcon, Lock, Settings, Trash2, UserPlus } from "lucide-react";
// types // types
import type { IProject } from "@plane/types"; import type { IProject } from "@plane/types";
@ -31,6 +31,7 @@ import { renderFormattedDate } from "@/helpers/date-time.helper";
import { copyUrlToClipboard } from "@/helpers/string.helper"; import { copyUrlToClipboard } from "@/helpers/string.helper";
// hooks // hooks
import { useProject } from "@/hooks/store"; import { useProject } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
import { usePlatformOS } from "@/hooks/use-platform-os"; import { usePlatformOS } from "@/hooks/use-platform-os";
type Props = { type Props = {
@ -46,7 +47,7 @@ export const ProjectCard: React.FC<Props> = observer((props) => {
// refs // refs
const projectCardRef = useRef(null); const projectCardRef = useRef(null);
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug } = useParams(); const { workspaceSlug } = useParams();
// store hooks // store hooks
const { addProjectToFavorites, removeProjectFromFavorites } = useProject(); const { addProjectToFavorites, removeProjectFromFavorites } = useProject();

View file

@ -1,18 +1,19 @@
"use client"; "use client";
import React from "react"; import React from "react";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
import { Controller, useForm } from "react-hook-form"; import { Controller, useForm } from "react-hook-form";
import { AlertTriangle } from "lucide-react"; import { AlertTriangle } from "lucide-react";
import { Dialog, Transition } from "@headlessui/react"; import { Dialog, Transition } from "@headlessui/react";
import type { IProject } from "@plane/types";
// hooks
import { Button, Input, TOAST_TYPE, setToast } from "@plane/ui";
import { PROJECT_DELETED } from "@/constants/event-tracker";
import { useEventTracker, useProject } from "@/hooks/store";
// ui
// types // types
import type { IProject } from "@plane/types";
// ui
import { Button, Input, TOAST_TYPE, setToast } from "@plane/ui";
// constants // constants
import { PROJECT_DELETED } from "@/constants/event-tracker";
// hooks
import { useEventTracker, useProject } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
type DeleteProjectModal = { type DeleteProjectModal = {
isOpen: boolean; isOpen: boolean;
@ -31,7 +32,7 @@ export const DeleteProjectModal: React.FC<DeleteProjectModal> = (props) => {
const { captureProjectEvent } = useEventTracker(); const { captureProjectEvent } = useEventTracker();
const { deleteProject } = useProject(); const { deleteProject } = useProject();
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug, projectId } = useParams(); const { workspaceSlug, projectId } = useParams();
// form info // form info
const { const {

View file

@ -1,14 +1,15 @@
"use client"; "use client";
import { useState, Fragment } from "react"; import { useState, Fragment } from "react";
import { useRouter } from "next/navigation";
import { Transition, Dialog } from "@headlessui/react"; import { Transition, Dialog } from "@headlessui/react";
import type { IProject } from "@plane/types";
// hooks
import { Button } from "@plane/ui";
import { useProject, useUser } from "@/hooks/store";
// ui
// types // types
import type { IProject } from "@plane/types";
// ui
import { Button } from "@plane/ui";
// hooks
import { useProject, useUser } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
// type // type
type TJoinProjectModalProps = { type TJoinProjectModalProps = {
@ -28,7 +29,7 @@ export const JoinProjectModal: React.FC<TJoinProjectModalProps> = (props) => {
} = useUser(); } = useUser();
const { fetchProjects } = useProject(); const { fetchProjects } = useProject();
// router // router
const router = useRouter(); const router = useAppRouter();
const handleJoin = () => { const handleJoin = () => {
setIsJoiningLoading(true); setIsJoiningLoading(true);

View file

@ -2,12 +2,12 @@
import { FC, Fragment } from "react"; import { FC, Fragment } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
import { Controller, useForm } from "react-hook-form"; import { Controller, useForm } from "react-hook-form";
// headless ui // headless ui
import { AlertTriangleIcon } from "lucide-react"; import { AlertTriangleIcon } from "lucide-react";
import { Dialog, Transition } from "@headlessui/react"; import { Dialog, Transition } from "@headlessui/react";
// icons // types
import { IProject } from "@plane/types"; import { IProject } from "@plane/types";
// ui // ui
import { Button, Input, TOAST_TYPE, setToast } from "@plane/ui"; import { Button, Input, TOAST_TYPE, setToast } from "@plane/ui";
@ -15,7 +15,7 @@ import { Button, Input, TOAST_TYPE, setToast } from "@plane/ui";
import { PROJECT_MEMBER_LEAVE } from "@/constants/event-tracker"; import { PROJECT_MEMBER_LEAVE } from "@/constants/event-tracker";
// hooks // hooks
import { useEventTracker, useUser } from "@/hooks/store"; import { useEventTracker, useUser } from "@/hooks/store";
// types import { useAppRouter } from "@/hooks/use-app-router";
type FormData = { type FormData = {
projectName: string; projectName: string;
@ -36,7 +36,7 @@ export interface ILeaveProjectModal {
export const LeaveProjectModal: FC<ILeaveProjectModal> = observer((props) => { export const LeaveProjectModal: FC<ILeaveProjectModal> = observer((props) => {
const { project, isOpen, onClose } = props; const { project, isOpen, onClose } = props;
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug } = useParams(); const { workspaceSlug } = useParams();
// store hooks // store hooks
const { captureEvent } = useEventTracker(); const { captureEvent } = useEventTracker();

View file

@ -3,7 +3,7 @@
import { useState } from "react"; import { useState } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import Link from "next/link"; import Link from "next/link";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
// icons // icons
import { ChevronDown, Dot, XCircle } from "lucide-react"; import { ChevronDown, Dot, XCircle } from "lucide-react";
// ui // ui
@ -16,6 +16,7 @@ import { EUserProjectRoles } from "@/constants/project";
import { ROLE } from "@/constants/workspace"; import { ROLE } from "@/constants/workspace";
// hooks // hooks
import { useEventTracker, useMember, useProject, useUser } from "@/hooks/store"; import { useEventTracker, useMember, useProject, useUser } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
import { usePlatformOS } from "@/hooks/use-platform-os"; import { usePlatformOS } from "@/hooks/use-platform-os";
type Props = { type Props = {
@ -27,7 +28,7 @@ export const ProjectMemberListItem: React.FC<Props> = observer((props) => {
// states // states
const [removeMemberModal, setRemoveMemberModal] = useState(false); const [removeMemberModal, setRemoveMemberModal] = useState(false);
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug, projectId } = useParams(); const { workspaceSlug, projectId } = useParams();
// store hooks // store hooks
const { const {

View file

@ -1,12 +1,12 @@
"use client"; "use client";
import { useState, Fragment } from "react"; import { useState, Fragment } from "react";
import { useRouter } from "next/navigation";
import { Dialog, Transition } from "@headlessui/react"; import { Dialog, Transition } from "@headlessui/react";
// ui // ui
import { Button, TOAST_TYPE, setToast } from "@plane/ui"; import { Button, TOAST_TYPE, setToast } from "@plane/ui";
// hooks // hooks
import { useProject } from "@/hooks/store"; import { useProject } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
type Props = { type Props = {
workspaceSlug: string; workspaceSlug: string;
@ -20,7 +20,7 @@ type Props = {
export const ArchiveRestoreProjectModal: React.FC<Props> = (props) => { export const ArchiveRestoreProjectModal: React.FC<Props> = (props) => {
const { workspaceSlug, projectId, isOpen, onClose, archive } = props; const { workspaceSlug, projectId, isOpen, onClose, archive } = props;
// router // router
const router = useRouter(); const router = useAppRouter();
// states // states
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
// store hooks // store hooks

View file

@ -1,11 +1,12 @@
"use client"; "use client";
import React, { FC, useState } from "react"; import React, { FC, useState } from "react";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
// ui // ui
import { AlertModalCore, TOAST_TYPE, setToast } from "@plane/ui"; import { AlertModalCore, TOAST_TYPE, setToast } from "@plane/ui";
// hooks // hooks
import { useWebhook } from "@/hooks/store"; import { useWebhook } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
interface IDeleteWebhook { interface IDeleteWebhook {
isOpen: boolean; isOpen: boolean;
@ -17,7 +18,7 @@ export const DeleteWebhookModal: FC<IDeleteWebhook> = (props) => {
// states // states
const [isDeleting, setIsDeleting] = useState(false); const [isDeleting, setIsDeleting] = useState(false);
// router // router
const router = useRouter(); const router = useAppRouter();
// store hooks // store hooks
const { removeWebhook } = useWebhook(); const { removeWebhook } = useWebhook();

View file

@ -2,8 +2,8 @@
import { Dispatch, SetStateAction, useEffect, useState, FC } from "react"; import { Dispatch, SetStateAction, useEffect, useState, FC } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useRouter } from "next/navigation";
import { Controller, useForm } from "react-hook-form"; import { Controller, useForm } from "react-hook-form";
// types
import { IWorkspace } from "@plane/types"; import { IWorkspace } from "@plane/types";
// ui // ui
import { Button, CustomSelect, Input, TOAST_TYPE, setToast } from "@plane/ui"; import { Button, CustomSelect, Input, TOAST_TYPE, setToast } from "@plane/ui";
@ -12,8 +12,8 @@ import { WORKSPACE_CREATED } from "@/constants/event-tracker";
import { ORGANIZATION_SIZE, RESTRICTED_URLS } from "@/constants/workspace"; import { ORGANIZATION_SIZE, RESTRICTED_URLS } from "@/constants/workspace";
// hooks // hooks
import { useEventTracker, useWorkspace } from "@/hooks/store"; import { useEventTracker, useWorkspace } from "@/hooks/store";
// ui import { useAppRouter } from "@/hooks/use-app-router";
// types // services
import { WorkspaceService } from "@/services/workspace.service"; import { WorkspaceService } from "@/services/workspace.service";
type Props = { type Props = {
@ -48,7 +48,7 @@ export const CreateWorkspaceForm: FC<Props> = observer((props) => {
const [slugError, setSlugError] = useState(false); const [slugError, setSlugError] = useState(false);
const [invalidSlug, setInvalidSlug] = useState(false); const [invalidSlug, setInvalidSlug] = useState(false);
// router // router
const router = useRouter(); const router = useAppRouter();
// store hooks // store hooks
const { captureWorkspaceEvent } = useEventTracker(); const { captureWorkspaceEvent } = useEventTracker();
const { createWorkspace } = useWorkspace(); const { createWorkspace } = useWorkspace();

View file

@ -2,10 +2,10 @@
import React from "react"; import React from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useRouter } from "next/navigation";
import { Controller, useForm } from "react-hook-form"; import { Controller, useForm } from "react-hook-form";
import { AlertTriangle } from "lucide-react"; import { AlertTriangle } from "lucide-react";
import { Dialog, Transition } from "@headlessui/react"; import { Dialog, Transition } from "@headlessui/react";
// types
import type { IWorkspace } from "@plane/types"; import type { IWorkspace } from "@plane/types";
// ui // ui
import { Button, Input, TOAST_TYPE, setToast } from "@plane/ui"; import { Button, Input, TOAST_TYPE, setToast } from "@plane/ui";
@ -13,7 +13,7 @@ import { Button, Input, TOAST_TYPE, setToast } from "@plane/ui";
import { WORKSPACE_DELETED } from "@/constants/event-tracker"; import { WORKSPACE_DELETED } from "@/constants/event-tracker";
// hooks // hooks
import { useEventTracker, useWorkspace } from "@/hooks/store"; import { useEventTracker, useWorkspace } from "@/hooks/store";
// types import { useAppRouter } from "@/hooks/use-app-router";
type Props = { type Props = {
isOpen: boolean; isOpen: boolean;
@ -29,7 +29,7 @@ const defaultValues = {
export const DeleteWorkspaceModal: React.FC<Props> = observer((props) => { export const DeleteWorkspaceModal: React.FC<Props> = observer((props) => {
const { isOpen, data, onClose } = props; const { isOpen, data, onClose } = props;
// router // router
const router = useRouter(); const router = useAppRouter();
// store hooks // store hooks
const { captureWorkspaceEvent } = useEventTracker(); const { captureWorkspaceEvent } = useEventTracker();
const { deleteWorkspace } = useWorkspace(); const { deleteWorkspace } = useWorkspace();

View file

@ -3,7 +3,7 @@
import { FC, useState } from "react"; import { FC, useState } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import Link from "next/link"; import Link from "next/link";
import { useParams, useRouter } from "next/navigation"; import { useParams } from "next/navigation";
// lucide icons // lucide icons
import { ChevronDown, Dot, XCircle } from "lucide-react"; import { ChevronDown, Dot, XCircle } from "lucide-react";
// ui // ui
@ -15,6 +15,7 @@ import { WORKSPACE_MEMBER_LEAVE } from "@/constants/event-tracker";
import { EUserWorkspaceRoles, ROLE } from "@/constants/workspace"; import { EUserWorkspaceRoles, ROLE } from "@/constants/workspace";
// hooks // hooks
import { useEventTracker, useMember, useUser } from "@/hooks/store"; import { useEventTracker, useMember, useUser } from "@/hooks/store";
import { useAppRouter } from "@/hooks/use-app-router";
import { usePlatformOS } from "@/hooks/use-platform-os"; import { usePlatformOS } from "@/hooks/use-platform-os";
type Props = { type Props = {
@ -26,7 +27,7 @@ export const WorkspaceMembersListItem: FC<Props> = observer((props) => {
// states // states
const [removeMemberModal, setRemoveMemberModal] = useState(false); const [removeMemberModal, setRemoveMemberModal] = useState(false);
// router // router
const router = useRouter(); const router = useAppRouter();
const { workspaceSlug } = useParams(); const { workspaceSlug } = useParams();
// store hooks // store hooks
const { const {

Some files were not shown because too many files have changed in this diff Show more