feat(mobile): refactor drawer system and session status bar (#494)
* feat(mobile): refactor drawer system with swipe gestures and improved status bar
- Add DrawerContext for centralized drawer state management
- Implement swipe gesture support for left/right drawers
- Refactor MobileSessionStatusBar with token usage indicator
- Update Header component with drawer toggle props
- Improve RightSidebar touch handling
- Add mobile-specific styling improvements
- Update UI store for drawer state management
* feat(mobile): update empty session hint text to clarify swipe gesture area
* fix(mobile): restore MobileAgentButton tap-to-cycle and long-press behavior
- Revert removal of tap-to-cycle agent switching functionality
- Re-add onCycleAgent prop and long-press detection (500ms)
- Click now cycles through primary agents, long-press opens selector panel
- Fixes regression from commit 569cc411
* feat(mobile): add project switcher bar and fix button interactions
- Add ProjectBar component to MobileSessionStatusBar for quick project switching
- Add useProjectStatus hook to track project-level session indicators
- Integrate project store with directory store for project management
- Add project status indicators (running/unread) to session status bar
- Fix MobileAgentButton pointer event handling with preventDefault
- Support horizontal scroll in project bar with touch gesture isolation
* feat(mobile): add long-press to remove projects and filter sessions by project
* fix: improve mobile agent switching UX
* fix: move drawer swipe hook to dedicated file
* refactor(mobile): simplify session status bar, remove More/Less toggle button
* fix: git diff navigation on mobile in sidebar mode
* feat(mobile): add configurable status bar and refine mobile chat controls
---------
Co-authored-by: Jovines <jovines@qq.com>
Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
This commit is contained in:
committed by
GitHub
co-authored by
Jovines
Bohdan Triapitsyn
parent
7a11867a19
commit
25d616f009
@@ -0,0 +1,38 @@
|
||||
import React from 'react';
|
||||
import type { MotionValue } from 'motion/react';
|
||||
|
||||
export interface DrawerContextValue {
|
||||
leftDrawerOpen: boolean;
|
||||
rightDrawerOpen: boolean;
|
||||
toggleLeftDrawer: () => void;
|
||||
toggleRightDrawer: () => void;
|
||||
// Motion values for real-time drawer dragging
|
||||
leftDrawerX: MotionValue<number>;
|
||||
rightDrawerX: MotionValue<number>;
|
||||
leftDrawerWidth: React.MutableRefObject<number>;
|
||||
rightDrawerWidth: React.MutableRefObject<number>;
|
||||
setMobileLeftDrawerOpen: (open: boolean) => void;
|
||||
setRightSidebarOpen: (open: boolean) => void;
|
||||
}
|
||||
|
||||
const DrawerContext = React.createContext<DrawerContextValue | null>(null);
|
||||
|
||||
export const DrawerProvider: React.FC<{
|
||||
children: React.ReactNode;
|
||||
value: DrawerContextValue;
|
||||
}> = ({ children, value }) => {
|
||||
return (
|
||||
<DrawerContext.Provider value={value}>
|
||||
{children}
|
||||
</DrawerContext.Provider>
|
||||
);
|
||||
};
|
||||
|
||||
// eslint-disable-next-line react-refresh/only-export-components
|
||||
export const useDrawer = (): DrawerContextValue => {
|
||||
const context = React.useContext(DrawerContext);
|
||||
if (!context) {
|
||||
throw new Error('useDrawer must be used within a DrawerProvider');
|
||||
}
|
||||
return context;
|
||||
};
|
||||
Reference in New Issue
Block a user