fix: favorite improvements (#5307)

This commit is contained in:
Akshita Goyal 2024-08-05 20:17:59 +05:30 committed by GitHub
parent 07574b4222
commit a93dfc1b8d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 218 additions and 193 deletions

View file

@ -111,6 +111,7 @@ export const SidebarProjectsListItem: React.FC<Props> = observer((props) => {
const [publishModalOpen, setPublishModal] = useState(false);
const [isMenuActive, setIsMenuActive] = useState(false);
const [isDragging, setIsDragging] = useState(false);
const [isProjectListOpen, setIsProjectListOpen] = useState(false);
const [instruction, setInstruction] = useState<"DRAG_OVER" | "DRAG_BELOW" | undefined>(undefined);
// refs
const actionSectionRef = useRef<HTMLDivElement | null>(null);
@ -266,12 +267,15 @@ export const SidebarProjectsListItem: React.FC<Props> = observer((props) => {
if (!project) return null;
useEffect(() => {
if (URLProjectId === project.id) setIsProjectListOpen(true);
}, [URLProjectId]);
return (
<>
<PublishProjectModal isOpen={publishModalOpen} project={project} onClose={() => setPublishModal(false)} />
<LeaveProjectModal project={project} isOpen={leaveProjectModalOpen} onClose={() => setLeaveProjectModal(false)} />
<Disclosure key={`${project.id}_${URLProjectId}`} ref={projectRef} defaultOpen={URLProjectId === project.id}>
{({ open }) => (
<Disclosure key={`${project.id}_${URLProjectId}`} ref={projectRef} defaultOpen={isProjectListOpen}>
<div
id={`sidebar-${projectId}-${projectListType}`}
className={cn("relative", {
@ -319,7 +323,11 @@ export const SidebarProjectsListItem: React.FC<Props> = observer((props) => {
"justify-center": isSidebarCollapsed,
})}
>
<Disclosure.Button as="button" className="size-8 aspect-square flex-shrink-0 grid place-items-center">
<Disclosure.Button
as="button"
className="size-8 aspect-square flex-shrink-0 grid place-items-center"
onClick={() => setIsProjectListOpen(!isProjectListOpen)}
>
<div className="size-4 grid place-items-center flex-shrink-0">
<Logo logo={project.logo_props} size={16} />
</div>
@ -340,6 +348,7 @@ export const SidebarProjectsListItem: React.FC<Props> = observer((props) => {
className={cn("flex-grow flex items-center gap-1.5 text-left select-none w-full", {
"justify-center": isSidebarCollapsed,
})}
onClick={() => setIsProjectListOpen(!isProjectListOpen)}
>
<div className="size-4 grid place-items-center flex-shrink-0">
<Logo logo={project.logo_props} size={16} />
@ -367,9 +376,7 @@ export const SidebarProjectsListItem: React.FC<Props> = observer((props) => {
customButtonClassName="grid place-items-center"
placement="bottom-start"
>
<CustomMenu.MenuItem
onClick={project.is_favorite ? handleRemoveFromFavorites : handleAddToFavorites}
>
<CustomMenu.MenuItem onClick={project.is_favorite ? handleRemoveFromFavorites : handleAddToFavorites}>
<span className="flex items-center justify-start gap-2">
<Star
className={cn("h-3.5 w-3.5 ", {
@ -442,10 +449,11 @@ export const SidebarProjectsListItem: React.FC<Props> = observer((props) => {
"inline-block": isMenuActive,
}
)}
onClick={() => setIsProjectListOpen(!isProjectListOpen)}
>
<ChevronRight
className={cn("size-4 flex-shrink-0 text-custom-sidebar-text-400 transition-transform", {
"rotate-90": open,
"rotate-90": isProjectListOpen,
})}
/>
</Disclosure.Button>
@ -453,6 +461,7 @@ export const SidebarProjectsListItem: React.FC<Props> = observer((props) => {
)}
</div>
<Transition
show={isProjectListOpen}
enter="transition duration-100 ease-out"
enterFrom="transform scale-95 opacity-0"
enterTo="transform scale-100 opacity-100"
@ -460,6 +469,7 @@ export const SidebarProjectsListItem: React.FC<Props> = observer((props) => {
leaveFrom="transform scale-100 opacity-100"
leaveTo="transform scale-95 opacity-0"
>
{isProjectListOpen && (
<Disclosure.Panel as="div" className="flex flex-col gap-0.5 mt-1">
{navigation(workspaceSlug?.toString(), project?.id).map((item) => {
if (
@ -498,10 +508,10 @@ export const SidebarProjectsListItem: React.FC<Props> = observer((props) => {
);
})}
</Disclosure.Panel>
)}
</Transition>
{isLastChild && <DropIndicator isVisible={instruction === "DRAG_BELOW"} />}
</div>
)}
</Disclosure>
</>
);

View file

@ -4,7 +4,7 @@ import { useState, FC, useRef, useEffect } from "react";
import { combine } from "@atlaskit/pragmatic-drag-and-drop/combine";
import { autoScrollForElements } from "@atlaskit/pragmatic-drag-and-drop-auto-scroll/element";
import { observer } from "mobx-react";
import { useParams } from "next/navigation";
import { useParams, usePathname } from "next/navigation";
import { Briefcase, ChevronRight, Plus } from "lucide-react";
import { Disclosure, Transition } from "@headlessui/react";
// types
@ -43,6 +43,8 @@ export const SidebarProjectsList: FC = observer(() => {
const { getProjectById, joinedProjectIds: joinedProjects, updateProjectView } = useProject();
// router params
const { workspaceSlug } = useParams();
const pathname = usePathname();
// auth
const isAuthorizedUser = !!currentWorkspaceRole && currentWorkspaceRole >= EUserWorkspaceRoles.MEMBER;
@ -127,7 +129,12 @@ export const SidebarProjectsList: FC = observer(() => {
setIsAllProjectsListOpen(isOpen);
localStorage.setItem("isAllProjectsListOpen", isOpen.toString());
};
useEffect(() => {
if (pathname.includes("projects")) {
setIsAllProjectsListOpen(true);
localStorage.setItem("isAllProjectsListOpen", "true");
}
}, [pathname]);
return (
<>
{workspaceSlug && (

View file

@ -399,6 +399,9 @@ export class FavoriteStore implements IFavoriteStore {
*/
fetchFavorite = async (workspaceSlug: string) => {
try {
this.favoriteIds = [];
this.favoriteMap = {};
this.entityMap = {};
const favorites = await this.favoriteService.getFavorites(workspaceSlug);
runInAction(() => {
favorites.forEach((favorite) => {

View file

@ -53,6 +53,7 @@ export class ProjectPageStore implements IProjectPageStore {
};
// service
service: ProjectPageService;
rootStore: CoreRootStore;
constructor(private store: CoreRootStore) {
makeObservable(this, {
@ -70,6 +71,7 @@ export class ProjectPageStore implements IProjectPageStore {
createPage: action,
removePage: action,
});
this.rootStore = store;
// service
this.service = new ProjectPageService();
// initialize display filters of the current project
@ -257,7 +259,10 @@ export class ProjectPageStore implements IProjectPageStore {
if (!workspaceSlug || !projectId || !pageId) return undefined;
await this.service.remove(workspaceSlug, projectId, pageId);
runInAction(() => unset(this.data, [pageId]));
runInAction(() => {
unset(this.data, [pageId]);
this.rootStore.favorite.removeFavoriteFromStore(pageId);
});
} catch (error) {
runInAction(() => {
this.loader = undefined;