feat(FN-1301): add Projects action to mobile more sheet

- Add a Projects entry with icon and test id in the mobile More sheet actions
- Extend MobileNavBar props with onViewAllProjects and trigger it via the shared more-sheet action handler
- Wire App to pass handleViewAllProjects into MobileNavBar so the new action opens project selection
- Add test coverage for rendering the Projects item and invoking its callback while closing the sheet
This commit is contained in:
gsxdsm
2026-04-08 12:30:24 -07:00
parent 754cebb641
commit 686b1e3f8a
3 changed files with 27 additions and 0 deletions

View File

@@ -337,6 +337,7 @@ function AppInner() {
onResumePlanning={modalManager.resumePlanning}
activePlanningSessionCount={bgPlanningSessions.length}
onOpenUsage={modalManager.openUsage}
onViewAllProjects={handleViewAllProjects}
onRunScript={modalManager.runScript}
projectId={currentProject?.id}
/>

View File

@@ -5,6 +5,7 @@ import {
Clock,
Folder,
GitBranch,
Grid3X3,
LayoutGrid,
Lightbulb,
Mail,
@@ -44,6 +45,7 @@ export interface MobileNavBarProps {
onOpenUsage?: () => void;
onRunScript?: (name: string, command: string) => void;
projectId?: string;
onViewAllProjects?: () => void;
}
function GitHubLogo({ size = 20 }: { size?: number }) {
@@ -84,6 +86,7 @@ export function MobileNavBar({
onResumePlanning,
activePlanningSessionCount = 0,
onOpenUsage,
onViewAllProjects,
}: MobileNavBarProps) {
const mode = useViewportMode();
const [isMoreOpen, setIsMoreOpen] = useState(false);
@@ -297,6 +300,16 @@ export function MobileNavBar({
<span>Usage</span>
</button>
<button
type="button"
className="mobile-more-item"
data-testid="mobile-more-item-projects"
onClick={() => handleMoreAction(onViewAllProjects)}
>
<Grid3X3 />
<span>Projects</span>
</button>
<div className="mobile-more-separator" />
<button

View File

@@ -40,6 +40,7 @@ const createDefaultProps = () => ({
onResumePlanning: vi.fn(),
activePlanningSessionCount: 0,
onOpenUsage: vi.fn(),
onViewAllProjects: vi.fn(),
onRunScript: vi.fn(),
projectId: "proj_1",
});
@@ -125,6 +126,7 @@ describe("MobileNavBar", () => {
expect(screen.getByTestId("mobile-more-item-schedules")).toBeDefined();
expect(screen.getByTestId("mobile-more-item-github")).toBeDefined();
expect(screen.getByTestId("mobile-more-item-usage")).toBeDefined();
expect(screen.getByTestId("mobile-more-item-projects")).toBeDefined();
expect(screen.getByTestId("mobile-more-item-settings")).toBeDefined();
});
@@ -139,6 +141,17 @@ describe("MobileNavBar", () => {
expect(props.onOpenSettings).toHaveBeenCalledOnce();
});
it("calls onViewAllProjects from the Projects more-sheet item", () => {
const props = createDefaultProps();
const { container } = render(<MobileNavBar {...props} />);
fireEvent.click(screen.getByTestId("mobile-nav-tab-more"));
fireEvent.click(screen.getByTestId("mobile-more-item-projects"));
expect(container.querySelector(".mobile-more-sheet")).toBeNull();
expect(props.onViewAllProjects).toHaveBeenCalledOnce();
});
it("closes sheet on backdrop click", () => {
const { container } = render(<MobileNavBar {...createDefaultProps()} />);