Compare commits

...

5 Commits

Author SHA1 Message Date
Prateek Shourya b91aab1ae7 fix: update cardRef type from HTMLDivElement to HTMLAnchorElement in KanbanIssueBlock 2025-09-06 01:46:58 +05:30
Aaron Reisman 4abc5333d6 chore: use propel tooltip so we can remove blueprint 2025-09-03 16:07:47 -07:00
Aaron Reisman 74a88620f3 chore: turn off eslint and tsc during next.js build 2025-09-03 15:47:11 -07:00
Aaron Reisman 500cca8875 wip: refactor react types 2025-09-03 15:46:47 -07:00
Aaron Reisman 5b3133573d chore: update @types/* 2025-09-03 15:37:01 -07:00
1095 changed files with 2137 additions and 3876 deletions
+1 -2
View File
@@ -1,5 +1,4 @@
"use client";
import { FC } from "react";
import { useForm } from "react-hook-form";
import { Lightbulb } from "lucide-react";
import { IFormattedInstanceConfiguration, TInstanceAIConfigurationKeys } from "@plane/types";
@@ -15,7 +14,7 @@ type IInstanceAIForm = {
type AIFormValues = Record<TInstanceAIConfigurationKeys, string>;
export const InstanceAIForm: FC<IInstanceAIForm> = (props) => {
export const InstanceAIForm: React.FC<IInstanceAIForm> = (props) => {
const { config } = props;
// store
const { updateInstanceConfigurations } = useInstance();
@@ -1,10 +1,9 @@
import { ReactNode } from "react";
import { Metadata } from "next";
export const metadata: Metadata = {
title: "Artificial Intelligence Settings - God Mode",
};
export default function AILayout({ children }: { children: ReactNode }) {
export default function AILayout({ children }: { children: React.ReactNode }) {
return <>{children}</>;
}
@@ -1,6 +1,6 @@
"use client";
import { FC, useState } from "react";
import { useState } from "react";
import isEmpty from "lodash/isEmpty";
import Link from "next/link";
import { useForm } from "react-hook-form";
@@ -23,7 +23,7 @@ type Props = {
type GithubConfigFormValues = Record<TInstanceGithubAuthenticationConfigurationKeys, string>;
export const InstanceGithubConfigForm: FC<Props> = (props) => {
export const InstanceGithubConfigForm: React.FC<Props> = (props) => {
const { config } = props;
// states
const [isDiscardChangesModalOpen, setIsDiscardChangesModalOpen] = useState(false);
@@ -1,10 +1,9 @@
import { ReactNode } from "react";
import { Metadata } from "next";
export const metadata: Metadata = {
title: "GitHub Authentication - God Mode",
};
export default function GitHubAuthenticationLayout({ children }: { children: ReactNode }) {
export default function GitHubAuthenticationLayout({ children }: { children: React.ReactNode }) {
return <>{children}</>;
}
@@ -1,4 +1,4 @@
import { FC, useState } from "react";
import { useState } from "react";
import isEmpty from "lodash/isEmpty";
import Link from "next/link";
import { useForm } from "react-hook-form";
@@ -21,7 +21,7 @@ type Props = {
type GitlabConfigFormValues = Record<TInstanceGitlabAuthenticationConfigurationKeys, string>;
export const InstanceGitlabConfigForm: FC<Props> = (props) => {
export const InstanceGitlabConfigForm: React.FC<Props> = (props) => {
const { config } = props;
// states
const [isDiscardChangesModalOpen, setIsDiscardChangesModalOpen] = useState(false);
@@ -1,10 +1,9 @@
import { ReactNode } from "react";
import { Metadata } from "next";
export const metadata: Metadata = {
title: "GitLab Authentication - God Mode",
};
export default function GitlabAuthenticationLayout({ children }: { children: ReactNode }) {
export default function GitlabAuthenticationLayout({ children }: { children: React.ReactNode }) {
return <>{children}</>;
}
@@ -1,5 +1,5 @@
"use client";
import { FC, useState } from "react";
import { useState } from "react";
import isEmpty from "lodash/isEmpty";
import Link from "next/link";
import { useForm } from "react-hook-form";
@@ -22,7 +22,7 @@ type Props = {
type GoogleConfigFormValues = Record<TInstanceGoogleAuthenticationConfigurationKeys, string>;
export const InstanceGoogleConfigForm: FC<Props> = (props) => {
export const InstanceGoogleConfigForm: React.FC<Props> = (props) => {
const { config } = props;
// states
const [isDiscardChangesModalOpen, setIsDiscardChangesModalOpen] = useState(false);
@@ -1,10 +1,9 @@
import { ReactNode } from "react";
import { Metadata } from "next";
export const metadata: Metadata = {
title: "Google Authentication - God Mode",
};
export default function GoogleAuthenticationLayout({ children }: { children: ReactNode }) {
export default function GoogleAuthenticationLayout({ children }: { children: React.ReactNode }) {
return <>{children}</>;
}
@@ -1,10 +1,9 @@
import { ReactNode } from "react";
import { Metadata } from "next";
export const metadata: Metadata = {
title: "Authentication Settings - Plane Web",
};
export default function AuthenticationLayout({ children }: { children: ReactNode }) {
export default function AuthenticationLayout({ children }: { children: React.ReactNode }) {
return <>{children}</>;
}
@@ -1,6 +1,6 @@
"use client";
import React, { FC, useMemo, useState } from "react";
import { useMemo, useState } from "react";
import { useForm } from "react-hook-form";
// types
import { IFormattedInstanceConfiguration, TInstanceEmailConfigurationKeys } from "@plane/types";
@@ -27,7 +27,7 @@ const EMAIL_SECURITY_OPTIONS: { [key in TEmailSecurityKeys]: string } = {
NONE: "No email security",
};
export const InstanceEmailForm: FC<IInstanceEmailForm> = (props) => {
export const InstanceEmailForm: React.FC<IInstanceEmailForm> = (props) => {
const { config } = props;
// states
const [isSendTestEmailModalOpen, setIsSendTestEmailModalOpen] = useState(false);
@@ -1,8 +1,7 @@
import { ReactNode } from "react";
import { Metadata } from "next";
interface EmailLayoutProps {
children: ReactNode;
children: React.ReactNode;
}
export const metadata: Metadata = {
@@ -1,4 +1,4 @@
import React, { FC, useEffect, useState } from "react";
import { Fragment, useEffect, useState } from "react";
import { Dialog, Transition } from "@headlessui/react";
// plane imports
import { InstanceService } from "@plane/services";
@@ -18,7 +18,7 @@ enum ESendEmailSteps {
const instanceService = new InstanceService();
export const SendTestEmailModal: FC<Props> = (props) => {
export const SendTestEmailModal: React.FC<Props> = (props) => {
const { isOpen, handleClose } = props;
// state
@@ -60,10 +60,10 @@ export const SendTestEmailModal: FC<Props> = (props) => {
};
return (
<Transition.Root show={isOpen} as={React.Fragment}>
<Transition.Root show={isOpen} as={Fragment}>
<Dialog as="div" className="relative z-20" onClose={handleClose}>
<Transition.Child
as={React.Fragment}
as={Fragment}
enter="ease-out duration-300"
enterFrom="opacity-0"
enterTo="opacity-100"
@@ -76,7 +76,7 @@ export const SendTestEmailModal: FC<Props> = (props) => {
<div className="fixed inset-0 z-20 overflow-y-auto">
<div className="my-10 flex justify-center p-4 text-center sm:p-0 md:my-20">
<Transition.Child
as={React.Fragment}
as={Fragment}
enter="ease-out duration-300"
enterFrom="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
enterTo="opacity-100 translate-y-0 sm:scale-100"
@@ -1,5 +1,4 @@
"use client";
import { FC } from "react";
import { observer } from "mobx-react";
import { Controller, useForm } from "react-hook-form";
import { Telescope } from "lucide-react";
@@ -18,7 +17,7 @@ export interface IGeneralConfigurationForm {
instanceAdmins: IInstanceAdmin[];
}
export const GeneralConfigurationForm: FC<IGeneralConfigurationForm> = observer((props) => {
export const GeneralConfigurationForm: React.FC<IGeneralConfigurationForm> = observer((props) => {
const { instance, instanceAdmins } = props;
// hooks
const { instanceConfigurations, updateInstanceInfo, updateInstanceConfigurations } = useInstance();
@@ -1,6 +1,6 @@
"use client";
import { FC, useState } from "react";
import { useState } from "react";
import { observer } from "mobx-react";
import useSWR from "swr";
import { MessageSquare } from "lucide-react";
@@ -13,7 +13,7 @@ type TIntercomConfig = {
isTelemetryEnabled: boolean;
};
export const IntercomConfig: FC<TIntercomConfig> = observer((props) => {
export const IntercomConfig: React.FC<TIntercomConfig> = observer((props) => {
const { isTelemetryEnabled } = props;
// hooks
const { instanceConfigurations, updateInstanceConfigurations, fetchInstanceConfigurations } = useInstance();
@@ -1,10 +1,9 @@
import { ReactNode } from "react";
import { Metadata } from "next";
export const metadata: Metadata = {
title: "General Settings - God Mode",
};
export default function GeneralLayout({ children }: { children: ReactNode }) {
export default function GeneralLayout({ children }: { children: React.ReactNode }) {
return <>{children}</>;
}
+2 -3
View File
@@ -1,6 +1,5 @@
"use client";
import { FC } from "react";
import { observer } from "mobx-react";
import { usePathname } from "next/navigation";
import { Menu, Settings } from "lucide-react";
@@ -11,7 +10,7 @@ import { BreadcrumbLink } from "@/components/common/breadcrumb-link";
// hooks
import { useTheme } from "@/hooks/store";
export const HamburgerToggle: FC = observer(() => {
export const HamburgerToggle: React.FC = observer(() => {
const { isSidebarCollapsed, toggleSidebar } = useTheme();
return (
<div
@@ -23,7 +22,7 @@ export const HamburgerToggle: FC = observer(() => {
);
});
export const AdminHeader: FC = observer(() => {
export const AdminHeader: React.FC = observer(() => {
const pathName = usePathname();
const getHeaderTitle = (pathName: string) => {
@@ -1,5 +1,4 @@
"use client";
import { FC } from "react";
import { useForm } from "react-hook-form";
import { IFormattedInstanceConfiguration, TInstanceImageConfigurationKeys } from "@plane/types";
import { Button, TOAST_TYPE, setToast } from "@plane/ui";
@@ -14,7 +13,7 @@ type IInstanceImageConfigForm = {
type ImageConfigFormValues = Record<TInstanceImageConfigurationKeys, string>;
export const InstanceImageConfigForm: FC<IInstanceImageConfigForm> = (props) => {
export const InstanceImageConfigForm: React.FC<IInstanceImageConfigForm> = (props) => {
const { config } = props;
// store hooks
const { updateInstanceConfigurations } = useInstance();
@@ -1,8 +1,7 @@
import { ReactNode } from "react";
import { Metadata } from "next";
interface ImageLayoutProps {
children: ReactNode;
children: React.ReactNode;
}
export const metadata: Metadata = {
+3 -3
View File
@@ -1,6 +1,6 @@
"use client";
import { FC, ReactNode, useEffect } from "react";
import { useEffect } from "react";
import { observer } from "mobx-react";
import { useRouter } from "next/navigation";
// components
@@ -13,10 +13,10 @@ import { AdminHeader } from "./header";
import { AdminSidebar } from "./sidebar";
type TAdminLayout = {
children: ReactNode;
children: React.ReactNode;
};
const AdminLayout: FC<TAdminLayout> = (props) => {
const AdminLayout: React.FC<TAdminLayout> = (props) => {
const { children } = props;
// router
const router = useRouter();
@@ -1,6 +1,6 @@
"use client";
import { FC, useState, useRef } from "react";
import { useState, useRef } from "react";
import { observer } from "mobx-react";
import Link from "next/link";
import { ExternalLink, FileText, HelpCircle, MoveLeft } from "lucide-react";
@@ -34,7 +34,7 @@ const helpOptions = [
},
];
export const AdminSidebarHelpSection: FC = observer(() => {
export const AdminSidebarHelpSection: React.FC = observer(() => {
// states
const [isNeedHelpOpen, setIsNeedHelpOpen] = useState(false);
// store
+2 -2
View File
@@ -1,6 +1,6 @@
"use client";
import { FC, useEffect, useRef } from "react";
import { useEffect, useRef } from "react";
import { observer } from "mobx-react";
// plane helpers
import { useOutsideClickDetector } from "@plane/hooks";
@@ -11,7 +11,7 @@ import { AdminSidebarDropdown } from "./sidebar-dropdown";
import { AdminSidebarHelpSection } from "./sidebar-help-section";
import { AdminSidebarMenu } from "./sidebar-menu";
export const AdminSidebar: FC = observer(() => {
export const AdminSidebar: React.FC = observer(() => {
// store
const { isSidebarCollapsed, toggleSidebar } = useTheme();
@@ -1,10 +1,9 @@
import { ReactNode } from "react";
import { Metadata } from "next";
export const metadata: Metadata = {
title: "Workspace Management - God Mode",
};
export default function WorkspaceManagementLayout({ children }: { children: ReactNode }) {
export default function WorkspaceManagementLayout({ children }: { children: React.ReactNode }) {
return <>{children}</>;
}
+1 -2
View File
@@ -1,4 +1,3 @@
import { FC } from "react";
import { Info, X } from "lucide-react";
// plane constants
import { TAdminAuthErrorInfo } from "@plane/constants";
@@ -8,7 +7,7 @@ type TAuthBanner = {
handleBannerData?: (bannerData: TAdminAuthErrorInfo | undefined) => void;
};
export const AuthBanner: FC<TAuthBanner> = (props) => {
export const AuthBanner: React.FC<TAuthBanner> = (props) => {
const { bannerData, handleBannerData } = props;
if (!bannerData) return <></>;
+1 -2
View File
@@ -1,4 +1,3 @@
import { ReactNode } from "react";
import Image from "next/image";
import Link from "next/link";
import { KeyRound, Mails } from "lucide-react";
@@ -27,7 +26,7 @@ export enum EErrorAlertType {
}
const errorCodeMessages: {
[key in EAdminAuthErrorCodes]: { title: string; message: (email?: string | undefined) => ReactNode };
[key in EAdminAuthErrorCodes]: { title: string; message: (email?: string | undefined) => React.ReactNode };
} = {
// admin
[EAdminAuthErrorCodes.ADMIN_ALREADY_EXIST]: {
+2 -2
View File
@@ -1,6 +1,6 @@
"use client";
import { FC, useEffect, useMemo, useState } from "react";
import { useEffect, useMemo, useState } from "react";
import { useSearchParams } from "next/navigation";
import { Eye, EyeOff } from "lucide-react";
// plane internal packages
@@ -43,7 +43,7 @@ const defaultFromData: TFormData = {
password: "",
};
export const InstanceSignInForm: FC = () => {
export const InstanceSignInForm: React.FC = () => {
// search params
const searchParams = useSearchParams();
const emailParam = searchParams.get("email") || undefined;
+2 -3
View File
@@ -1,14 +1,13 @@
import { FC, ReactNode } from "react";
import { observer } from "mobx-react";
import useSWR from "swr";
// hooks
import { useInstance } from "@/hooks/store";
type InstanceProviderProps = {
children: ReactNode;
children: React.ReactNode;
};
export const InstanceProvider: FC<InstanceProviderProps> = observer((props) => {
export const InstanceProvider: React.FC<InstanceProviderProps> = observer((props) => {
const { children } = props;
// store hooks
const { fetchInstanceInfo } = useInstance();
+2 -2
View File
@@ -1,6 +1,6 @@
"use client";
import { ReactNode, createContext } from "react";
import { createContext } from "react";
// plane admin store
import { RootStore } from "@/plane-admin/store/root.store";
@@ -23,7 +23,7 @@ function initializeStore(initialData = {}) {
}
export type StoreProviderProps = {
children: ReactNode;
children: React.ReactNode;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
initialState?: any;
};
+3 -3
View File
@@ -1,16 +1,16 @@
"use client";
import { FC, ReactNode, useEffect } from "react";
import { useEffect } from "react";
import { observer } from "mobx-react";
import useSWR from "swr";
// hooks
import { useInstance, useTheme, useUser } from "@/hooks/store";
interface IUserProvider {
children: ReactNode;
children: React.ReactNode;
}
export const UserProvider: FC<IUserProvider> = observer(({ children }) => {
export const UserProvider: React.FC<IUserProvider> = observer(({ children }) => {
// hooks
const { isSidebarCollapsed, toggleSidebar } = useTheme();
const { currentUser, fetchCurrentUser } = useUser();
+1 -2
View File
@@ -1,4 +1,3 @@
import { ReactNode } from "react";
import { Metadata } from "next";
// plane imports
import { ADMIN_BASE_PATH } from "@plane/constants";
@@ -22,7 +21,7 @@ export const metadata: Metadata = {
},
};
export default function RootLayout({ children }: { children: ReactNode }) {
export default function RootLayout({ children }: { children: React.ReactNode }) {
const ASSET_PREFIX = ADMIN_BASE_PATH;
return (
<html lang="en">
@@ -1,6 +1,5 @@
"use client";
import React from "react";
// icons
import { SquareArrowOutUpRight } from "lucide-react";
// plane internal packages
@@ -1,6 +1,5 @@
"use client";
import { FC } from "react";
// helpers
import { cn } from "@plane/utils";
@@ -14,7 +13,7 @@ type Props = {
unavailable?: boolean;
};
export const AuthenticationMethodCard: FC<Props> = (props) => {
export const AuthenticationMethodCard: React.FC<Props> = (props) => {
const { name, description, icon, config, disabled = false, withBorder = true, unavailable = false } = props;
return (
@@ -1,6 +1,5 @@
"use client";
import React from "react";
import { observer } from "mobx-react";
// hooks
import { TInstanceAuthenticationMethodKeys } from "@plane/types";
@@ -1,6 +1,5 @@
"use client";
import React from "react";
import { observer } from "mobx-react";
import Link from "next/link";
// icons
@@ -1,6 +1,5 @@
"use client";
import React from "react";
import { observer } from "mobx-react";
import Link from "next/link";
// icons
@@ -1,6 +1,5 @@
"use client";
import React from "react";
import { observer } from "mobx-react";
import Link from "next/link";
// icons
@@ -1,6 +1,5 @@
"use client";
import React from "react";
import { observer } from "mobx-react";
// hooks
import { TInstanceAuthenticationMethodKeys } from "@plane/types";
+1 -2
View File
@@ -1,4 +1,3 @@
import { FC } from "react";
import { AlertCircle, CheckCircle2 } from "lucide-react";
type TBanner = {
@@ -6,7 +5,7 @@ type TBanner = {
message: string;
};
export const Banner: FC<TBanner> = (props) => {
export const Banner: React.FC<TBanner> = (props) => {
const { type, message } = props;
return (
@@ -1,6 +1,6 @@
"use client";
import React from "react";
import { Fragment } from "react";
import Link from "next/link";
// headless ui
import { Dialog, Transition } from "@headlessui/react";
@@ -17,10 +17,10 @@ export const ConfirmDiscardModal: React.FC<Props> = (props) => {
const { isOpen, handleClose, onDiscardHref } = props;
return (
<Transition.Root show={isOpen} as={React.Fragment}>
<Transition.Root show={isOpen} as={Fragment}>
<Dialog as="div" className="relative z-50" onClose={handleClose}>
<Transition.Child
as={React.Fragment}
as={Fragment}
enter="ease-out duration-300"
enterFrom="opacity-0"
enterTo="opacity-100"
@@ -33,7 +33,7 @@ export const ConfirmDiscardModal: React.FC<Props> = (props) => {
<div className="fixed inset-0 z-10 overflow-y-auto">
<div className="my-10 flex items-center justify-center p-4 text-center sm:p-0 md:my-32">
<Transition.Child
as={React.Fragment}
as={Fragment}
enter="ease-out duration-300"
enterFrom="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
enterTo="opacity-100 translate-y-0 sm:scale-100"
@@ -1,6 +1,6 @@
"use client";
import React, { useState } from "react";
import { useState } from "react";
import { Controller, Control } from "react-hook-form";
// icons
import { Eye, EyeOff } from "lucide-react";
@@ -1,6 +1,5 @@
"use client";
import React from "react";
// ui
import { Copy } from "lucide-react";
import { Button, TOAST_TYPE, setToast } from "@plane/ui";
@@ -1,6 +1,5 @@
"use client";
import React from "react";
import Image from "next/image";
import { Button } from "@plane/ui";
@@ -1,5 +1,4 @@
"use client";
import { FC } from "react";
import { observer } from "mobx-react";
import Image from "next/image";
import { useTheme } from "next-themes";
@@ -9,7 +8,7 @@ import { AuthHeader } from "@/app/(all)/(home)/auth-header";
import InstanceFailureDarkImage from "@/public/instance/instance-failure-dark.svg";
import InstanceFailureImage from "@/public/instance/instance-failure.svg";
export const InstanceFailureView: FC = observer(() => {
export const InstanceFailureView: React.FC = observer(() => {
const { resolvedTheme } = useTheme();
const instanceImage = resolvedTheme === "dark" ? InstanceFailureDarkImage : InstanceFailureImage;
@@ -1,13 +1,12 @@
"use client";
import { FC } from "react";
import Image from "next/image";
import Link from "next/link";
import { Button } from "@plane/ui";
// assets
import PlaneTakeOffImage from "@/public/images/plane-takeoff.png";
export const InstanceNotReady: FC = () => (
export const InstanceNotReady: React.FC = () => (
<div className="h-full w-full relative container px-5 mx-auto flex justify-center items-center">
<div className="w-auto max-w-2xl relative space-y-8 py-10">
<div className="relative flex flex-col justify-center items-center space-y-4">
@@ -1,6 +1,6 @@
"use client";
import { FC, useEffect, useMemo, useState } from "react";
import { useEffect, useMemo, useState } from "react";
import { useSearchParams } from "next/navigation";
// icons
import { Eye, EyeOff } from "lucide-react";
@@ -52,7 +52,7 @@ const defaultFromData: TFormData = {
is_telemetry_enabled: true,
};
export const InstanceSetupForm: FC = (props) => {
export const InstanceSetupForm: React.FC = (props) => {
const {} = props;
// search params
const searchParams = useSearchParams();
@@ -1,6 +1,5 @@
"use client";
import React from "react";
import { observer } from "mobx-react";
import Image from "next/image";
import Link from "next/link";
+6
View File
@@ -24,6 +24,12 @@ const nextConfig = {
"@plane/utils",
],
},
eslint: {
ignoreDuringBuilds: true,
},
typescript: {
ignoreBuildErrors: true,
},
};
module.exports = nextConfig;
+1 -2
View File
@@ -46,10 +46,9 @@
"@plane/tailwind-config": "workspace:*",
"@plane/typescript-config": "workspace:*",
"@types/lodash": "catalog:",
"@types/node": "18.16.1",
"@types/node": "catalog:",
"@types/react": "catalog:",
"@types/react-dom": "catalog:",
"@types/uuid": "^9.0.8",
"typescript": "catalog:"
}
}
+6 -7
View File
@@ -48,13 +48,12 @@
"devDependencies": {
"@plane/eslint-config": "workspace:*",
"@plane/typescript-config": "workspace:*",
"@types/compression": "1.8.1",
"@types/cors": "^2.8.17",
"@types/express": "^4.17.23",
"@types/express-ws": "^3.0.5",
"@types/node": "^20.14.9",
"@types/pino-http": "^5.8.4",
"@types/uuid": "^9.0.1",
"@types/compression": "catalog:",
"@types/cors": "catalog:",
"@types/express": "catalog:",
"@types/express-ws": "catalog:",
"@types/node": "catalog:",
"@types/pino-http": "catalog:",
"concurrently": "^9.0.1",
"nodemon": "^3.1.7",
"ts-node": "^10.9.2",
+6 -6
View File
@@ -44,7 +44,7 @@ export const getExtensions: () => Promise<Extension[]> = async () => {
}
resolve(fetchedData);
} catch (error) {
manualLogger.error("Error in fetching document", error);
manualLogger.error({ err: error }, "Error in fetching document");
}
});
},
@@ -70,7 +70,7 @@ export const getExtensions: () => Promise<Extension[]> = async () => {
});
}
} catch (error) {
manualLogger.error("Error in updating document:", error);
manualLogger.error({ err: error }, "Error in updating document:");
}
});
},
@@ -89,8 +89,8 @@ export const getExtensions: () => Promise<Extension[]> = async () => {
redisClient.disconnect();
}
manualLogger.warn(
`Redis Client wasn't able to connect, continuing without Redis (you won't be able to sync data between multiple plane live servers)`,
error
{ err: error },
`Redis Client wasn't able to connect, continuing without Redis (you won't be able to sync data between multiple plane live servers)`
);
reject(error);
});
@@ -103,8 +103,8 @@ export const getExtensions: () => Promise<Extension[]> = async () => {
});
} catch (error) {
manualLogger.warn(
`Redis Client wasn't able to connect, continuing without Redis (you won't be able to sync data between multiple plane live servers)`,
error
{ err: error },
`Redis Client wasn't able to connect, continuing without Redis (you won't be able to sync data between multiple plane live servers)`
);
}
} else {
+1 -1
View File
@@ -17,7 +17,7 @@ export const handleAuthentication = async (props: Props) => {
try {
response = await userService.currentUser(cookie);
} catch (error) {
manualLogger.error("Failed to fetch current user:", error);
manualLogger.error({ err: error }, "Failed to fetch current user:");
throw error;
}
if (response.id !== userId) {
+3 -3
View File
@@ -29,7 +29,7 @@ export const updatePageDescription = async (
await pageService.updateDescription(workspaceSlug, projectId, pageId, payload, cookie);
} catch (error) {
manualLogger.error("Update error:", error);
manualLogger.error({ err: error }, "Update error:");
throw error;
}
};
@@ -47,7 +47,7 @@ const fetchDescriptionHTMLAndTransform = async (
const { contentBinary } = getBinaryDataFromHTMLString(pageDetails.description_html ?? "<p></p>");
return contentBinary;
} catch (error) {
manualLogger.error("Error while transforming from HTML to Uint8Array", error);
manualLogger.error({ err: error }, "Error while transforming from HTML to Uint8Array");
throw error;
}
};
@@ -74,7 +74,7 @@ export const fetchPageDescriptionBinary = async (
return binaryData;
} catch (error) {
manualLogger.error("Fetch error:", error);
manualLogger.error({ err: error }, "Fetch error:");
throw error;
}
};
+5 -5
View File
@@ -44,7 +44,7 @@ export class Server {
private async setupHocusPocus() {
this.hocuspocusServer = await getHocusPocusServer().catch((err) => {
manualLogger.error("Failed to initialize HocusPocusServer:", err);
manualLogger.error({ err }, "Failed to initialize HocusPocusServer:");
process.exit(1);
});
}
@@ -58,7 +58,7 @@ export class Server {
try {
this.hocuspocusServer.handleConnection(ws, req);
} catch (err) {
manualLogger.error("WebSocket connection error:", err);
manualLogger.error({ err }, "WebSocket connection error:");
ws.close();
}
});
@@ -81,7 +81,7 @@ export class Server {
description_binary,
});
} catch (error) {
manualLogger.error("Error in /convert-document endpoint:", error);
manualLogger.error({ err: error }, "Error in /convert-document endpoint:");
res.status(500).json({
message: `Internal server error.`,
});
@@ -118,14 +118,14 @@ server.listen();
// Graceful shutdown on unhandled rejection
process.on("unhandledRejection", async (err: any) => {
manualLogger.info("Unhandled Rejection: ", err);
manualLogger.info({ err }, "Unhandled Rejection:");
manualLogger.info(`UNHANDLED REJECTION! 💥 Shutting down...`);
await server.destroy();
});
// Graceful shutdown on uncaught exception
process.on("uncaughtException", async (err: any) => {
manualLogger.info("Uncaught Exception: ", err);
manualLogger.info({ err }, "Uncaught Exception:");
manualLogger.info(`UNCAUGHT EXCEPTION! 💥 Shutting down...`);
await server.destroy();
});
+2 -3
View File
@@ -1,6 +1,5 @@
"use client";
import { FC, ReactNode } from "react";
import { ThemeProvider } from "next-themes";
// components
import { TranslationProvider } from "@plane/i18n";
@@ -9,10 +8,10 @@ import { StoreProvider } from "@/lib/store-provider";
import { ToastProvider } from "@/lib/toast-provider";
interface IAppProvider {
children: ReactNode;
children: React.ReactNode;
}
export const AppProvider: FC<IAppProvider> = (props) => {
export const AppProvider: React.FC<IAppProvider> = (props) => {
const { children } = props;
return (
@@ -1,6 +1,5 @@
"use client";
import { FC } from "react";
import { Info, X } from "lucide-react";
// helpers
import { TAuthErrorInfo } from "@/helpers/authentication.helper";
@@ -10,7 +9,7 @@ type TAuthBanner = {
handleBannerData?: (bannerData: TAuthErrorInfo | undefined) => void;
};
export const AuthBanner: FC<TAuthBanner> = (props) => {
export const AuthBanner: React.FC<TAuthBanner> = (props) => {
const { bannerData, handleBannerData } = props;
if (!bannerData) return <></>;
@@ -1,6 +1,5 @@
"use client";
import { FC } from "react";
// helpers
import { EAuthModes } from "@/types/auth";
@@ -28,7 +27,7 @@ const Titles: TAuthHeaderDetails = {
},
};
export const AuthHeader: FC<TAuthHeader> = (props) => {
export const AuthHeader: React.FC<TAuthHeader> = (props) => {
const { authMode } = props;
const getHeaderSubHeader = (mode: EAuthModes | null): TAuthHeaderContent => {
@@ -1,6 +1,6 @@
"use client";
import React, { FC, useEffect, useState } from "react";
import { useEffect, useState } from "react";
import { observer } from "mobx-react";
import Image from "next/image";
import { useSearchParams } from "next/navigation";
@@ -37,7 +37,7 @@ import { AuthUniqueCodeForm } from "./unique-code";
const authService = new SitesAuthService();
export const AuthRoot: FC = observer(() => {
export const AuthRoot: React.FC = observer(() => {
// router params
const searchParams = useSearchParams();
const emailParam = searchParams.get("email") || undefined;
@@ -1,6 +1,6 @@
"use client";
import { FC, FormEvent, useMemo, useRef, useState } from "react";
import { useMemo, useRef, useState } from "react";
import { observer } from "mobx-react";
// icons
import { CircleAlert, XCircle } from "lucide-react";
@@ -17,7 +17,7 @@ type TAuthEmailForm = {
onSubmit: (data: IEmailCheckData) => Promise<void>;
};
export const AuthEmailForm: FC<TAuthEmailForm> = observer((props) => {
export const AuthEmailForm: React.FC<TAuthEmailForm> = observer((props) => {
const { onSubmit, defaultEmail } = props;
// states
const [isSubmitting, setIsSubmitting] = useState(false);
@@ -28,7 +28,7 @@ export const AuthEmailForm: FC<TAuthEmailForm> = observer((props) => {
[email]
);
const handleFormSubmit = async (event: FormEvent<HTMLFormElement>) => {
const handleFormSubmit = async (event: React.FormEvent<HTMLFormElement>) => {
event.preventDefault();
setIsSubmitting(true);
const payload: IEmailCheckData = {
@@ -1,6 +1,6 @@
"use client";
import React, { useEffect, useMemo, useRef, useState } from "react";
import { useEffect, useMemo, useRef, useState } from "react";
import { observer } from "mobx-react";
import { Eye, EyeOff, XCircle } from "lucide-react";
// plane imports
@@ -1,6 +1,6 @@
"use client";
import React, { useEffect, useState } from "react";
import { useEffect, useState } from "react";
import { CircleCheck, XCircle } from "lucide-react";
// plane imports
import { API_BASE_URL } from "@plane/constants";
@@ -1,13 +1,12 @@
"use client";
import React, { FC } from "react";
import Link from "next/link";
type Props = {
isSignUp?: boolean;
};
export const TermsAndConditions: FC<Props> = (props) => {
export const TermsAndConditions: React.FC<Props> = (props) => {
const { isSignUp = false } = props;
return (
<span className="flex items-center justify-center py-6">
@@ -1,6 +1,5 @@
"use client";
import { FC } from "react";
import { WEBSITE_URL } from "@plane/constants";
// assets
import { PlaneLogo } from "@plane/ui";
@@ -9,7 +8,7 @@ type TPoweredBy = {
disabled?: boolean;
};
export const PoweredBy: FC<TPoweredBy> = (props) => {
export const PoweredBy: React.FC<TPoweredBy> = (props) => {
// props
const { disabled = false } = props;
@@ -1,5 +1,5 @@
import React from "react";
// plane imports
import { forwardRef } from "react";
import { type EditorRefApi, type ILiteTextEditorProps, LiteTextEditorWithRef, type TFileHandler } from "@plane/editor";
import type { MakeOptional } from "@plane/types";
import { cn, isCommentEmpty } from "@plane/utils";
@@ -28,7 +28,7 @@ type LiteTextEditorWrapperProps = MakeOptional<
}
);
export const LiteTextEditor = React.forwardRef<EditorRefApi, LiteTextEditorWrapperProps>((props, ref) => {
export const LiteTextEditor = forwardRef<EditorRefApi, LiteTextEditorWrapperProps>((props, ref) => {
const {
anchor,
containerClassName,
@@ -39,12 +39,12 @@ export const LiteTextEditor = React.forwardRef<EditorRefApi, LiteTextEditorWrapp
workspaceId,
...rest
} = props;
function isMutableRefObject<T>(ref: React.ForwardedRef<T>): ref is React.MutableRefObject<T | null> {
function isRefObject<T>(ref: React.ForwardedRef<T>) {
return !!ref && typeof ref === "object" && "current" in ref;
}
// derived values
const isEmpty = isCommentEmpty(props.initialValue);
const editorRef = isMutableRefObject<EditorRefApi>(ref) ? ref.current : null;
const editorRef = isRefObject(ref) ? ref.current : null;
const { liteText: liteTextEditorExtensions } = useEditorFlagging(anchor);
return (
@@ -60,7 +60,7 @@ export const LiteTextEditor = React.forwardRef<EditorRefApi, LiteTextEditorWrapp
workspaceId,
})}
mentionHandler={{
renderComponent: (props) => <EditorMentionsRoot {...props} />,
renderComponent: EditorMentionsRoot,
}}
extendedEditorProps={{}}
{...rest}
@@ -1,4 +1,4 @@
import React, { forwardRef } from "react";
import { forwardRef } from "react";
// plane imports
import { type EditorRefApi, type IRichTextEditorProps, RichTextEditorWithRef, type TFileHandler } from "@plane/editor";
import type { MakeOptional } from "@plane/types";
@@ -42,7 +42,7 @@ export const RichTextEditor = forwardRef<EditorRefApi, RichTextEditorWrapperProp
return (
<RichTextEditorWithRef
mentionHandler={{
renderComponent: (props) => <EditorMentionsRoot {...props} />,
renderComponent: EditorMentionsRoot,
getMentionedEntityDetails: (id: string) => ({
display_name: getMemberById(id)?.member__display_name ?? "",
}),
@@ -1,6 +1,6 @@
"use client";
import React, { useEffect, useState, useCallback } from "react";
import { useEffect, useState, useCallback } from "react";
// plane imports
import { TOOLBAR_ITEMS, type ToolbarMenuItem, type EditorRefApi } from "@plane/editor";
import { Tooltip } from "@plane/propel/tooltip";
@@ -1,6 +1,5 @@
"use client";
import { FC } from "react";
import Image from "next/image";
import { useTheme } from "next-themes";
import { Button } from "@plane/ui";
@@ -8,7 +7,7 @@ import { Button } from "@plane/ui";
import InstanceFailureDarkImage from "public/instance/instance-failure-dark.svg";
import InstanceFailureImage from "public/instance/instance-failure.svg";
export const InstanceFailureView: FC = () => {
export const InstanceFailureView: React.FC = () => {
const { resolvedTheme } = useTheme();
const instanceImage = resolvedTheme === "dark" ? InstanceFailureDarkImage : InstanceFailureImage;
@@ -1,6 +1,6 @@
"use client";
import { FC, useCallback } from "react";
import { useCallback } from "react";
import cloneDeep from "lodash/cloneDeep";
import { observer } from "mobx-react";
import { useRouter } from "next/navigation";
@@ -15,7 +15,7 @@ type TIssueAppliedFilters = {
anchor: string;
};
export const IssueAppliedFilters: FC<TIssueAppliedFilters> = observer((props) => {
export const IssueAppliedFilters: React.FC<TIssueAppliedFilters> = observer((props) => {
const { anchor } = props;
// router
const router = useRouter();
@@ -1,6 +1,6 @@
"use client";
import React, { Fragment, useState } from "react";
import { Fragment, useState } from "react";
import { Placement } from "@popperjs/core";
import { usePopper } from "react-popper";
import { Popover, Transition } from "@headlessui/react";
@@ -30,7 +30,7 @@ export const FiltersDropdown: React.FC<Props> = (props) => {
}
return (
<>
<Popover.Button as={React.Fragment}>
<Popover.Button as={Fragment}>
<Button ref={setReferenceElement} variant="neutral-primary" size="sm">
<div className={`${open ? "text-custom-text-100" : "text-custom-text-200"}`}>
<span>{title}</span>
@@ -1,6 +1,5 @@
"use client";
import React from "react";
// lucide icons
import { ChevronDown, ChevronUp } from "lucide-react";
@@ -1,6 +1,5 @@
"use client";
import React from "react";
// lucide icons
import { Check } from "lucide-react";
@@ -1,6 +1,6 @@
"use client";
import React, { useState } from "react";
import { useState } from "react";
// plane imports
import { Loader } from "@plane/ui";
// types
@@ -1,6 +1,6 @@
"use client";
import React, { useState } from "react";
import { useState } from "react";
import { observer } from "mobx-react";
// plane imports
import { ISSUE_PRIORITY_FILTERS } from "@plane/constants";
@@ -1,6 +1,6 @@
"use client";
import { FC, useCallback } from "react";
import { useCallback } from "react";
import cloneDeep from "lodash/cloneDeep";
import { observer } from "mobx-react";
import { useRouter } from "next/navigation";
@@ -20,7 +20,7 @@ type IssueFiltersDropdownProps = {
anchor: string;
};
export const IssueFiltersDropdown: FC<IssueFiltersDropdownProps> = observer((props) => {
export const IssueFiltersDropdown: React.FC<IssueFiltersDropdownProps> = observer((props) => {
const { anchor } = props;
// router
const router = useRouter();
@@ -1,6 +1,6 @@
"use client";
import React, { useState } from "react";
import { useState } from "react";
import { observer } from "mobx-react";
import { Search, X } from "lucide-react";
// types
@@ -1,6 +1,6 @@
"use client";
import React, { useState } from "react";
import { useState } from "react";
import { observer } from "mobx-react";
// ui
import { EIconSize } from "@plane/constants";
@@ -1,6 +1,5 @@
"use client";
import { MutableRefObject } from "react";
import { observer } from "mobx-react";
import Link from "next/link";
import { useParams, useSearchParams } from "next/navigation";
@@ -28,7 +27,7 @@ interface IssueBlockProps {
groupId: string;
subGroupId: string;
displayProperties: IIssueDisplayProperties | undefined;
scrollableContainerRef?: MutableRefObject<HTMLDivElement | null>;
scrollableContainerRef?: React.RefObject<HTMLDivElement | null>;
}
interface IssueDetailsBlockProps {
@@ -1,4 +1,3 @@
import { MutableRefObject } from "react";
import { observer } from "mobx-react";
//types
import { IIssueDisplayProperties } from "@plane/types";
@@ -10,7 +9,7 @@ interface IssueBlocksListProps {
groupId: string;
issueIds: string[];
displayProperties: IIssueDisplayProperties | undefined;
scrollableContainerRef?: MutableRefObject<HTMLDivElement | null>;
scrollableContainerRef?: React.RefObject<HTMLDivElement | null>;
}
export const KanbanIssueBlocksList: React.FC<IssueBlocksListProps> = observer((props) => {
@@ -1,4 +1,3 @@
import { MutableRefObject } from "react";
import isNil from "lodash/isNil";
import { observer } from "mobx-react";
// types
@@ -38,7 +37,7 @@ export interface IKanBan {
) => number | undefined;
getPaginationData: (groupId: string | undefined, subGroupId: string | undefined) => TPaginationData | undefined;
getIssueLoader: (groupId?: string | undefined, subGroupId?: string | undefined) => TLoader;
scrollableContainerRef?: MutableRefObject<HTMLDivElement | null>;
scrollableContainerRef?: React.RefObject<HTMLDivElement | null>;
showEmptyGroup?: boolean;
}
@@ -1,6 +1,5 @@
"use client";
import React, { FC } from "react";
import { observer } from "mobx-react";
import { Circle } from "lucide-react";
// types
@@ -13,7 +12,7 @@ interface IHeaderGroupByCard {
count: number;
}
export const HeaderGroupByCard: FC<IHeaderGroupByCard> = observer((props) => {
export const HeaderGroupByCard: React.FC<IHeaderGroupByCard> = observer((props) => {
const { icon, title, count } = props;
return (
@@ -1,4 +1,3 @@
import React, { FC } from "react";
import { observer } from "mobx-react";
import { Circle, ChevronDown, ChevronUp } from "lucide-react";
// mobx
@@ -11,7 +10,7 @@ interface IHeaderSubGroupByCard {
toggleExpanded: () => void;
}
export const HeaderSubGroupByCard: FC<IHeaderSubGroupByCard> = observer((props) => {
export const HeaderSubGroupByCard: React.FC<IHeaderSubGroupByCard> = observer((props) => {
const { icon, title, count, isExpanded, toggleExpanded } = props;
return (
<div
@@ -1,6 +1,6 @@
"use client";
import { MutableRefObject, forwardRef, useCallback, useRef, useState } from "react";
import { forwardRef, useCallback, useRef, useState } from "react";
import { observer } from "mobx-react";
//types
import type {
@@ -31,7 +31,7 @@ interface IKanbanGroup {
) => number | undefined;
getPaginationData: (groupId: string | undefined, subGroupId: string | undefined) => TPaginationData | undefined;
getIssueLoader: (groupId?: string | undefined, subGroupId?: string | undefined) => TLoader;
scrollableContainerRef?: MutableRefObject<HTMLDivElement | null>;
scrollableContainerRef?: React.RefObject<HTMLDivElement | null>;
}
// Loader components
@@ -1,4 +1,4 @@
import { MutableRefObject, useState } from "react";
import { useState } from "react";
import { observer } from "mobx-react";
// types
import {
@@ -38,7 +38,7 @@ export interface IKanBanSwimLanes {
getPaginationData: (groupId: string | undefined, subGroupId: string | undefined) => TPaginationData | undefined;
getIssueLoader: (groupId?: string | undefined, subGroupId?: string | undefined) => TLoader;
showEmptyGroup: boolean;
scrollableContainerRef?: MutableRefObject<HTMLDivElement | null>;
scrollableContainerRef?: React.RefObject<HTMLDivElement | null>;
orderBy: TIssueOrderByOptions | undefined;
}
@@ -157,7 +157,7 @@ interface ISubGroupSwimlane extends ISubGroupSwimlaneHeader {
) => number | undefined;
getPaginationData: (groupId: string | undefined, subGroupId: string | undefined) => TPaginationData | undefined;
getIssueLoader: (groupId?: string | undefined, subGroupId?: string | undefined) => TLoader;
scrollableContainerRef?: MutableRefObject<HTMLDivElement | null>;
scrollableContainerRef?: React.RefObject<HTMLDivElement | null>;
loadMoreIssues: (groupId?: string, subGroupId?: string) => void;
}
@@ -214,7 +214,7 @@ interface ISubGroup {
) => number | undefined;
getPaginationData: (groupId: string | undefined, subGroupId: string | undefined) => TPaginationData | undefined;
getIssueLoader: (groupId?: string | undefined, subGroupId?: string | undefined) => TLoader;
scrollableContainerRef?: MutableRefObject<HTMLDivElement | null>;
scrollableContainerRef?: React.RefObject<HTMLDivElement | null>;
loadMoreIssues: (groupId?: string, subGroupId?: string) => void;
}
@@ -1,4 +1,3 @@
import { FC, MutableRefObject } from "react";
// types
import { IIssueDisplayProperties } from "@plane/types";
import { IssueBlock } from "./block";
@@ -7,10 +6,10 @@ interface Props {
issueIds: string[] | undefined;
groupId: string;
displayProperties?: IIssueDisplayProperties;
containerRef: MutableRefObject<HTMLDivElement | null>;
containerRef: React.RefObject<HTMLDivElement | null>;
}
export const IssueBlocksList: FC<Props> = (props) => {
export const IssueBlocksList: React.FC<Props> = (props) => {
const { issueIds = [], groupId, displayProperties } = props;
return (
@@ -1,6 +1,6 @@
"use client";
import { Fragment, MutableRefObject, forwardRef, useRef, useState } from "react";
import { Fragment, forwardRef, useRef, useState } from "react";
import { observer } from "mobx-react";
import { useTranslation } from "@plane/i18n";
// plane types
@@ -18,7 +18,7 @@ interface Props {
group: IGroupByColumn;
groupBy: TIssueGroupByOptions | undefined;
displayProperties: IIssueDisplayProperties | undefined;
containerRef: MutableRefObject<HTMLDivElement | null>;
containerRef: React.RefObject<HTMLDivElement | null>;
showEmptyGroup?: boolean;
loadMoreIssues: (groupId?: string) => void;
getGroupIssueCount: (
@@ -1,6 +1,6 @@
"use client";
import { FC, useEffect } from "react";
import { useEffect } from "react";
import { observer } from "mobx-react";
import useSWR from "swr";
// components
@@ -22,7 +22,7 @@ type Props = {
publishSettings: PublishStore;
};
export const IssuesLayoutsRoot: FC<Props> = observer((props) => {
export const IssuesLayoutsRoot: React.FC<Props> = observer((props) => {
const { peekId, publishSettings } = props;
// store hooks
const { getIssueFilters } = useIssueFilter();
@@ -1,4 +1,3 @@
import { ReactNode } from "react";
import { observer } from "mobx-react";
// plane imports
import type { IIssueDisplayProperties } from "@plane/types";
@@ -7,7 +6,7 @@ interface IWithDisplayPropertiesHOC {
displayProperties: IIssueDisplayProperties;
shouldRenderProperty?: (displayProperties: IIssueDisplayProperties) => boolean;
displayPropertyKey: keyof IIssueDisplayProperties | (keyof IIssueDisplayProperties)[];
children: ReactNode;
children: React.ReactNode;
}
export const WithDisplayPropertiesHOC = observer(
@@ -1,6 +1,6 @@
"use client";
import { useEffect, FC } from "react";
import { useEffect } from "react";
import { observer } from "mobx-react";
import { useRouter, useSearchParams } from "next/navigation";
// components
@@ -24,7 +24,7 @@ export type NavbarControlsProps = {
publishSettings: PublishStore;
};
export const NavbarControls: FC<NavbarControlsProps> = observer((props) => {
export const NavbarControls: React.FC<NavbarControlsProps> = observer((props) => {
// props
const { publishSettings } = props;
// router
@@ -1,6 +1,5 @@
"use client";
import { FC } from "react";
import { observer } from "mobx-react";
import { useRouter, useSearchParams } from "next/navigation";
// ui
@@ -20,7 +19,7 @@ type Props = {
anchor: string;
};
export const IssuesLayoutSelection: FC<Props> = observer((props) => {
export const IssuesLayoutSelection: React.FC<Props> = observer((props) => {
const { anchor } = props;
// hooks
const { t } = useTranslation();
@@ -1,6 +1,5 @@
"use client";
import { FC } from "react";
import { observer } from "mobx-react";
import { Briefcase } from "lucide-react";
// components
@@ -14,7 +13,7 @@ type Props = {
publishSettings: PublishStore;
};
export const IssuesNavbarRoot: FC<Props> = observer((props) => {
export const IssuesNavbarRoot: React.FC<Props> = observer((props) => {
const { publishSettings } = props;
// hooks
const { project_details } = publishSettings;
@@ -1,6 +1,6 @@
"use client";
import { FC, Fragment, useEffect, useState } from "react";
import { Fragment, useEffect, useState } from "react";
import { observer } from "mobx-react";
import Link from "next/link";
import { usePathname, useSearchParams } from "next/navigation";
@@ -19,7 +19,7 @@ import { useUser } from "@/hooks/store/use-user";
const authService = new AuthService();
export const UserAvatar: FC = observer(() => {
export const UserAvatar: React.FC = observer(() => {
const pathName = usePathname();
const searchParams = useSearchParams();
// query params
@@ -1,6 +1,6 @@
"use client";
import React, { useRef, useState } from "react";
import { useRef, useState } from "react";
import { observer } from "mobx-react";
import { useForm, Controller } from "react-hook-form";
// plane imports
@@ -1,4 +1,4 @@
import React, { useRef, useState } from "react";
import { Fragment, useRef, useState } from "react";
import { observer } from "mobx-react";
import { Controller, useForm } from "react-hook-form";
import { Check, MessageSquare, MoreVertical, X } from "lucide-react";
@@ -168,7 +168,7 @@ export const CommentCard: React.FC<Props> = observer((props) => {
</Menu.Button>
<Transition
as={React.Fragment}
as={Fragment}
enter="transition ease-out duration-100"
enterFrom="transform opacity-0 scale-95"
enterTo="transform opacity-100 scale-100"
@@ -1,6 +1,5 @@
"use client";
import React from "react";
import { observer } from "mobx-react";
import { usePathname, useRouter, useSearchParams } from "next/navigation";
import { Tooltip } from "@plane/propel/tooltip";
@@ -1,6 +1,6 @@
"use client";
import React from "react";
import { Fragment } from "react";
import { observer } from "mobx-react";
import { Link2, MoveRight } from "lucide-react";
import { Listbox, Transition } from "@headlessui/react";
@@ -79,7 +79,7 @@ export const PeekOverviewHeader: React.FC<Props> = observer((props) => {
</Listbox.Button>
<Transition
as={React.Fragment}
as={Fragment}
enter="transition ease-out duration-100"
enterFrom="transform opacity-0 scale-95"
enterTo="transform opacity-100 scale-100"
@@ -1,6 +1,5 @@
"use client";
import React from "react";
import { observer } from "mobx-react";
import Link from "next/link";
import { usePathname } from "next/navigation";
@@ -1,6 +1,6 @@
"use client";
import { FC, Fragment, useEffect, useState } from "react";
import { Fragment, useEffect, useState } from "react";
import { observer } from "mobx-react";
import { useRouter, useSearchParams } from "next/navigation";
import { Dialog, Transition } from "@headlessui/react";
@@ -16,7 +16,7 @@ type TIssuePeekOverview = {
handlePeekClose?: () => void;
};
export const IssuePeekOverview: FC<TIssuePeekOverview> = observer((props) => {
export const IssuePeekOverview: React.FC<TIssuePeekOverview> = observer((props) => {
const { anchor, peekId, handlePeekClose } = props;
const router = useRouter();
const searchParams = useSearchParams();
@@ -47,14 +47,13 @@ export const IssuePeekOverview: FC<TIssuePeekOverview> = observer((props) => {
}
issueDetailStore.setPeekId(null);
let queryParams: any = {
board,
};
let queryParams: Record<string, string> = {};
if (board) queryParams = { ...queryParams, board };
if (priority && priority.length > 0) queryParams = { ...queryParams, priority: priority };
if (state && state.length > 0) queryParams = { ...queryParams, state: state };
if (labels && labels.length > 0) queryParams = { ...queryParams, labels: labels };
queryParams = new URLSearchParams(queryParams).toString();
router.push(`/issues/${anchor}?${queryParams}`);
const qs = new URLSearchParams(queryParams).toString();
router.push(`/issues/${anchor}?${qs}`);
};
useEffect(() => {
-2
View File
@@ -1,5 +1,3 @@
import React from "react";
type Props = {
iconName: string;
className?: string;
@@ -1,6 +1,5 @@
"use client";
import React from "react";
import Image from "next/image";
// images
import Image404 from "@/public/404.svg";
@@ -1,6 +1,5 @@
"use client";
import React from "react";
import Link from "next/link";
import { PlaneLockup } from "@plane/ui";
@@ -1,14 +1,14 @@
import { RefObject, useEffect } from "react";
import { useEffect } from "react";
export type UseIntersectionObserverProps = {
containerRef: RefObject<HTMLDivElement | null> | undefined;
containerRef: React.RefObject<HTMLDivElement | null> | undefined;
elementRef: HTMLElement | null;
callback: () => void;
rootMargin?: string;
};
export const useIntersectionObserver = (
containerRef: RefObject<HTMLDivElement | null>,
containerRef: React.RefObject<HTMLDivElement | null>,
elementRef: HTMLElement | null,
callback: (() => void) | undefined,
rootMargin?: string
+2 -4
View File
@@ -8,12 +8,10 @@ export const useMention = () => {
const userService = new UserService();
const { data: user, isLoading: userDataLoading } = useSWR("currentUser", async () => userService.me());
const userRef = useRef<IUser | undefined>();
const userRef = useRef<IUser | undefined>(undefined);
useEffect(() => {
if (userRef) {
userRef.current = user;
}
userRef.current = user;
}, [user]);
const waitForUserDate = async () =>

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