Skip to content

Commit

Permalink
fix: excalidrawAPI.toggleSidebar not switching between tabs correct…
Browse files Browse the repository at this point in the history
  • Loading branch information
dwelle authored Mar 28, 2024
1 parent 7949aa1 commit 65bc500
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 5 deletions.
18 changes: 15 additions & 3 deletions packages/excalidraw/components/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3684,17 +3684,29 @@ class App extends React.Component<AppProps, AppState> {
tab,
force,
}: {
name: SidebarName;
name: SidebarName | null;
tab?: SidebarTabName;
force?: boolean;
}): boolean => {
let nextName;
if (force === undefined) {
nextName = this.state.openSidebar?.name === name ? null : name;
nextName =
this.state.openSidebar?.name === name &&
this.state.openSidebar?.tab === tab
? null
: name;
} else {
nextName = force ? name : null;
}
this.setState({ openSidebar: nextName ? { name: nextName, tab } : null });

const nextState: AppState["openSidebar"] = nextName
? { name: nextName }
: null;
if (nextState && tab) {
nextState.tab = tab;
}

this.setState({ openSidebar: nextState });

return !!nextName;
};
Expand Down
82 changes: 81 additions & 1 deletion packages/excalidraw/components/Sidebar/Sidebar.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ describe("Sidebar", () => {
});
});

it("should toggle sidebar using props.toggleMenu()", async () => {
it("should toggle sidebar using excalidrawAPI.toggleSidebar()", async () => {
const { container } = await render(
<Excalidraw>
<Sidebar name="customSidebar">
Expand Down Expand Up @@ -158,6 +158,20 @@ describe("Sidebar", () => {
const sidebars = container.querySelectorAll(".sidebar");
expect(sidebars.length).toBe(1);
});

// closing sidebar using `{ name: null }`
// -------------------------------------------------------------------------
expect(window.h.app.toggleSidebar({ name: "customSidebar" })).toBe(true);
await waitFor(() => {
const node = container.querySelector("#test-sidebar-content");
expect(node).not.toBe(null);
});

expect(window.h.app.toggleSidebar({ name: null })).toBe(false);
await waitFor(() => {
const node = container.querySelector("#test-sidebar-content");
expect(node).toBe(null);
});
});
});

Expand Down Expand Up @@ -329,4 +343,70 @@ describe("Sidebar", () => {
);
});
});

describe("Sidebar.tab", () => {
it("should toggle sidebars tabs correctly", async () => {
const { container } = await render(
<Excalidraw>
<Sidebar name="custom" docked>
<Sidebar.Tabs>
<Sidebar.Tab tab="library">Library</Sidebar.Tab>
<Sidebar.Tab tab="comments">Comments</Sidebar.Tab>
</Sidebar.Tabs>
</Sidebar>
</Excalidraw>,
);

await withExcalidrawDimensions(
{ width: 1920, height: 1080 },
async () => {
expect(
container.querySelector<HTMLElement>(
"[role=tabpanel][data-testid=library]",
),
).toBeNull();

// open library sidebar
expect(
window.h.app.toggleSidebar({ name: "custom", tab: "library" }),
).toBe(true);
expect(
container.querySelector<HTMLElement>(
"[role=tabpanel][data-testid=library]",
),
).not.toBeNull();

// switch to comments tab
expect(
window.h.app.toggleSidebar({ name: "custom", tab: "comments" }),
).toBe(true);
expect(
container.querySelector<HTMLElement>(
"[role=tabpanel][data-testid=comments]",
),
).not.toBeNull();

// toggle sidebar closed
expect(
window.h.app.toggleSidebar({ name: "custom", tab: "comments" }),
).toBe(false);
expect(
container.querySelector<HTMLElement>(
"[role=tabpanel][data-testid=comments]",
),
).toBeNull();

// toggle sidebar open
expect(
window.h.app.toggleSidebar({ name: "custom", tab: "comments" }),
).toBe(true);
expect(
container.querySelector<HTMLElement>(
"[role=tabpanel][data-testid=comments]",
),
).not.toBeNull();
},
);
});
});
});
2 changes: 1 addition & 1 deletion packages/excalidraw/components/Sidebar/SidebarTab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export const SidebarTab = ({
children: React.ReactNode;
} & React.HTMLAttributes<HTMLDivElement>) => {
return (
<RadixTabs.Content {...rest} value={tab}>
<RadixTabs.Content {...rest} value={tab} data-testid={tab}>
{children}
</RadixTabs.Content>
);
Expand Down

0 comments on commit 65bc500

Please sign in to comment.