diff --git a/web/app/[workspaceSlug]/(pages)/pages/[pageId]/header.tsx b/web/app/[workspaceSlug]/(pages)/pages/[pageId]/header.tsx index 6e7715ffe7..d647dc6a83 100644 --- a/web/app/[workspaceSlug]/(pages)/pages/[pageId]/header.tsx +++ b/web/app/[workspaceSlug]/(pages)/pages/[pageId]/header.tsx @@ -30,7 +30,7 @@ export const PageDetailsHeader = observer(() => { // params const { workspaceSlug, pageId } = useParams(); // store hooks - const { anchor, isCurrentUserOwner, name, logo_props, updatePageLogo } = useWorkspacePageDetails( + const { anchor, isCurrentUserOwner, name, logo_props, updatePageLogo, isContentEditable } = useWorkspacePageDetails( pageId?.toString() ?? "" ); const { fetchWorkspacePagePublishSettings, getPagePublishSettings, publishWorkspacePage, unpublishWorkspacePage } = @@ -130,6 +130,7 @@ export const PageDetailsHeader = observer(() => { ? EmojiIconPickerTypes.EMOJI : EmojiIconPickerTypes.ICON } + disabled={!isContentEditable} /> } /> diff --git a/web/app/[workspaceSlug]/(projects)/teams/(detail)/[teamId]/pages/(detail)/header.tsx b/web/app/[workspaceSlug]/(projects)/teams/(detail)/[teamId]/pages/(detail)/header.tsx index 68e3873aed..6174be8609 100644 --- a/web/app/[workspaceSlug]/(projects)/teams/(detail)/[teamId]/pages/(detail)/header.tsx +++ b/web/app/[workspaceSlug]/(projects)/teams/(detail)/[teamId]/pages/(detail)/header.tsx @@ -1,10 +1,24 @@ "use client"; +import { useState } from "react"; import { observer } from "mobx-react"; import { useParams } from "next/navigation"; import { FileText } from "lucide-react"; +// plane types +import { TLogoProps } from "@plane/types"; // ui -import { Breadcrumbs, Header, Loader, TeamsIcon } from "@plane/ui"; +import { + Breadcrumbs, + EmojiIconPicker, + EmojiIconPickerTypes, + Header, + Loader, + setToast, + TeamsIcon, + TOAST_TYPE, +} from "@plane/ui"; +// plane uitls +import { convertHexEmojiToDecimal } from "@plane/utils"; // components import { BreadcrumbLink, Logo } from "@/components/common"; import { PageEditInformationPopover } from "@/components/pages"; @@ -14,16 +28,38 @@ import { getPageName } from "@/helpers/page.helper"; import { useTeams, useTeamPages } from "@/plane-web/hooks/store"; export const TeamPageDetailHeader: React.FC = observer(() => { + // states + const [isOpen, setIsOpen] = useState(false); // router const { workspaceSlug, teamId, pageId } = useParams(); // store hooks const { loader, getTeamById } = useTeams(); - const { getTeamPagesLoader, getPageById } = useTeamPages(); + const { getPageById } = useTeamPages(); // derived values const team = getTeamById(teamId?.toString()); - const teamPageLoader = getTeamPagesLoader(teamId?.toString()); const page = team && pageId ? getPageById(team.id, pageId.toString()) : null; + const handlePageLogoUpdate = async (data: TLogoProps) => { + if (data) { + page + ?.updatePageLogo(data) + .then(() => { + setToast({ + type: TOAST_TYPE.SUCCESS, + title: "Success!", + message: "Logo Updated successfully.", + }); + }) + .catch(() => { + setToast({ + type: TOAST_TYPE.ERROR, + title: "Error!", + message: "Something went wrong. Please try again.", + }); + }); + } + }; + if (!workspaceSlug) return; return (
@@ -70,22 +106,52 @@ export const TeamPageDetailHeader: React.FC = observer(() => { - {teamPageLoader === "init-loader" && !page ? ( - - ) : page ? ( - - ) : ( - - ) + setIsOpen(val)} + className="flex items-center justify-center" + buttonClassName="flex items-center justify-center" + label={ + <> + {page?.logo_props?.in_use ? ( + + ) : ( + + )} + } + onChange={(val) => { + let logoValue = {}; + + if (val?.type === "emoji") + logoValue = { + value: convertHexEmojiToDecimal(val.value.unified), + url: val.value.imageUrl, + }; + else if (val?.type === "icon") logoValue = val.value; + + handlePageLogoUpdate({ + in_use: val?.type, + [val?.type]: logoValue, + }).finally(() => setIsOpen(false)); + }} + defaultIconColor={ + page?.logo_props?.in_use && page.logo_props.in_use === "icon" + ? page.logo_props?.icon?.color + : undefined + } + defaultOpen={ + page?.logo_props?.in_use && page.logo_props?.in_use === "emoji" + ? EmojiIconPickerTypes.EMOJI + : EmojiIconPickerTypes.ICON + } + disabled={!page?.isContentEditable} /> - ) : null} - + } + /> } />