+
+
diff --git a/apps/web/app/routes/core.ts b/apps/web/app/routes/core.ts
index ccb9d78d378..69d583f04d8 100644
--- a/apps/web/app/routes/core.ts
+++ b/apps/web/app/routes/core.ts
@@ -278,34 +278,6 @@ export const coreRoutes: RouteConfigEntry[] = [
),
]),
- // --------------------------------------------------------------------
- // ACCOUNT SETTINGS
- // --------------------------------------------------------------------
-
- layout("./(all)/[workspaceSlug]/(settings)/settings/account/layout.tsx", [
- route(":workspaceSlug/settings/account", "./(all)/[workspaceSlug]/(settings)/settings/account/page.tsx"),
- route(
- ":workspaceSlug/settings/account/activity",
- "./(all)/[workspaceSlug]/(settings)/settings/account/activity/page.tsx"
- ),
- route(
- ":workspaceSlug/settings/account/preferences",
- "./(all)/[workspaceSlug]/(settings)/settings/account/preferences/page.tsx"
- ),
- route(
- ":workspaceSlug/settings/account/notifications",
- "./(all)/[workspaceSlug]/(settings)/settings/account/notifications/page.tsx"
- ),
- route(
- ":workspaceSlug/settings/account/security",
- "./(all)/[workspaceSlug]/(settings)/settings/account/security/page.tsx"
- ),
- route(
- ":workspaceSlug/settings/account/api-tokens",
- "./(all)/[workspaceSlug]/(settings)/settings/account/api-tokens/page.tsx"
- ),
- ]),
-
// --------------------------------------------------------------------
// PROJECT SETTINGS
// --------------------------------------------------------------------
@@ -363,12 +335,8 @@ export const coreRoutes: RouteConfigEntry[] = [
// PROFILE SETTINGS
// --------------------------------------------------------------------
- layout("./(all)/profile/layout.tsx", [
- route("profile", "./(all)/profile/page.tsx"),
- route("profile/activity", "./(all)/profile/activity/page.tsx"),
- route("profile/appearance", "./(all)/profile/appearance/page.tsx"),
- route("profile/notifications", "./(all)/profile/notifications/page.tsx"),
- route("profile/security", "./(all)/profile/security/page.tsx"),
+ layout("./(all)/settings/profile/layout.tsx", [
+ route("settings/profile/:profileTabId", "./(all)/settings/profile/[profileTabId]/page.tsx"),
]),
]),
@@ -389,7 +357,7 @@ export const coreRoutes: RouteConfigEntry[] = [
route(":workspaceSlug/analytics", "routes/redirects/core/analytics.tsx"),
// API tokens redirect: /:workspaceSlug/settings/api-tokens
- // → /:workspaceSlug/settings/account/api-tokens
+ // → /settings/profile/api-tokens
route(":workspaceSlug/settings/api-tokens", "routes/redirects/core/api-tokens.tsx"),
// Inbox redirect: /:workspaceSlug/projects/:projectId/inbox
@@ -406,4 +374,10 @@ export const coreRoutes: RouteConfigEntry[] = [
// Register redirect
route("register", "routes/redirects/core/register.tsx"),
+
+ // Profile settings redirects
+ route("profile/*", "routes/redirects/core/profile-settings.tsx"),
+
+ // Account settings redirects
+ route(":workspaceSlug/settings/account/*", "routes/redirects/core/workspace-account-settings.tsx"),
] satisfies RouteConfig;
diff --git a/apps/web/app/routes/redirects/core/api-tokens.tsx b/apps/web/app/routes/redirects/core/api-tokens.tsx
index 68007aa4165..d97413084bc 100644
--- a/apps/web/app/routes/redirects/core/api-tokens.tsx
+++ b/apps/web/app/routes/redirects/core/api-tokens.tsx
@@ -1,9 +1,7 @@
import { redirect } from "react-router";
-import type { Route } from "./+types/api-tokens";
-export const clientLoader = ({ params }: Route.ClientLoaderArgs) => {
- const { workspaceSlug } = params;
- throw redirect(`/${workspaceSlug}/settings/account/api-tokens/`);
+export const clientLoader = () => {
+ throw redirect(`/settings/profile/api-tokens/`);
};
export default function ApiTokens() {
diff --git a/apps/web/app/routes/redirects/core/index.ts b/apps/web/app/routes/redirects/core/index.ts
index efd3ae40f8b..480386bf62d 100644
--- a/apps/web/app/routes/redirects/core/index.ts
+++ b/apps/web/app/routes/redirects/core/index.ts
@@ -14,7 +14,7 @@ export const coreRedirectRoutes: RouteConfigEntry[] = [
route(":workspaceSlug/analytics", "routes/redirects/core/analytics.tsx"),
// API tokens redirect: /:workspaceSlug/settings/api-tokens
- // → /:workspaceSlug/settings/account/api-tokens
+ // → /settings/profile/api-tokens
route(":workspaceSlug/settings/api-tokens", "routes/redirects/core/api-tokens.tsx"),
// Inbox redirect: /:workspaceSlug/projects/:projectId/inbox
diff --git a/apps/web/app/routes/redirects/core/profile-settings.tsx b/apps/web/app/routes/redirects/core/profile-settings.tsx
new file mode 100644
index 00000000000..7e8a0c15a2e
--- /dev/null
+++ b/apps/web/app/routes/redirects/core/profile-settings.tsx
@@ -0,0 +1,12 @@
+import { redirect } from "react-router";
+import type { Route } from "./+types/profile-settings";
+
+export const clientLoader = ({ params, request }: Route.ClientLoaderArgs) => {
+ const searchParams = new URL(request.url).searchParams;
+ const splat = params["*"] || "";
+ throw redirect(`/settings/profile/${splat || "general"}?${searchParams.toString()}`);
+};
+
+export default function ProfileSettings() {
+ return null;
+}
diff --git a/apps/web/app/routes/redirects/core/workspace-account-settings.tsx b/apps/web/app/routes/redirects/core/workspace-account-settings.tsx
new file mode 100644
index 00000000000..10d375e9a16
--- /dev/null
+++ b/apps/web/app/routes/redirects/core/workspace-account-settings.tsx
@@ -0,0 +1,12 @@
+import { redirect } from "react-router";
+import type { Route } from "./+types/workspace-account-settings";
+
+export const clientLoader = ({ params, request }: Route.ClientLoaderArgs) => {
+ const searchParams = new URL(request.url).searchParams;
+ const splat = params["*"] || "";
+ throw redirect(`/settings/profile/${splat || "general"}?${searchParams.toString()}`);
+};
+
+export default function WorkspaceAccountSettings() {
+ return null;
+}
diff --git a/apps/web/ce/components/common/modal/global.tsx b/apps/web/ce/components/common/modal/global.tsx
new file mode 100644
index 00000000000..76b859c3e8d
--- /dev/null
+++ b/apps/web/ce/components/common/modal/global.tsx
@@ -0,0 +1,26 @@
+import { lazy, Suspense } from "react";
+import { observer } from "mobx-react";
+
+const ProfileSettingsModal = lazy(() =>
+ import("@/components/settings/profile/modal").then((module) => ({
+ default: module.ProfileSettingsModal,
+ }))
+);
+
+type TGlobalModalsProps = {
+ workspaceSlug: string;
+};
+
+/**
+ * GlobalModals component manages all workspace-level modals across Plane applications.
+ *
+ * This includes:
+ * - Profile settings modal
+ */
+export const GlobalModals = observer(function GlobalModals(_props: TGlobalModalsProps) {
+ return (
+
+
+
+ );
+});
diff --git a/apps/web/ce/components/navigations/top-navigation-root.tsx b/apps/web/ce/components/navigations/top-navigation-root.tsx
index 9035e3147e7..1ee0d9e192a 100644
--- a/apps/web/ce/components/navigations/top-navigation-root.tsx
+++ b/apps/web/ce/components/navigations/top-navigation-root.tsx
@@ -74,7 +74,7 @@ export const TopNavigationRoot = observer(function TopNavigationRoot() {
-
+