feat: scaffold useDragManager hook with types and state
This commit is contained in:
@@ -0,0 +1,54 @@
|
|||||||
|
import { useState, useCallback, useEffect, type RefObject } from 'react';
|
||||||
|
|
||||||
|
export type DragType = 'channel' | 'category' | 'voiceUser';
|
||||||
|
|
||||||
|
export interface DragState {
|
||||||
|
type: DragType;
|
||||||
|
dragId: string;
|
||||||
|
sourceId?: string; // only for voiceUser — originating channelId
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface DropTarget {
|
||||||
|
targetId: string;
|
||||||
|
position: 'before' | 'after';
|
||||||
|
targetType: 'channel' | 'category';
|
||||||
|
}
|
||||||
|
|
||||||
|
interface UseDragManagerOpts {
|
||||||
|
scrollContainerRef: RefObject<HTMLElement | null>;
|
||||||
|
canManage: boolean;
|
||||||
|
canMoveMembers: boolean;
|
||||||
|
onChannelDrop: (dragId: string, target: DropTarget) => void;
|
||||||
|
onCategoryDrop: (dragId: string, target: DropTarget) => void;
|
||||||
|
onVoiceUserDrop: (userId: string, fromChannelId: string, toChannelId: string) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useDragManager(opts: UseDragManagerOpts) {
|
||||||
|
const { scrollContainerRef, canManage, canMoveMembers, onChannelDrop, onCategoryDrop, onVoiceUserDrop } = opts;
|
||||||
|
|
||||||
|
const [activeDrag, setActiveDrag] = useState<DragState | null>(null);
|
||||||
|
const [dropTarget, setDropTarget] = useState<DropTarget | null>(null);
|
||||||
|
const [voiceHoverChannelId, setVoiceHoverChannelId] = useState<string | null>(null);
|
||||||
|
|
||||||
|
const clearState = useCallback(() => {
|
||||||
|
setActiveDrag(null);
|
||||||
|
setDropTarget(null);
|
||||||
|
setVoiceHoverChannelId(null);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
// Handler factories added in subsequent stages...
|
||||||
|
|
||||||
|
// Suppress unused variable warnings for incremental build
|
||||||
|
void scrollContainerRef;
|
||||||
|
void canManage;
|
||||||
|
void canMoveMembers;
|
||||||
|
void onChannelDrop;
|
||||||
|
void onCategoryDrop;
|
||||||
|
void onVoiceUserDrop;
|
||||||
|
void clearState;
|
||||||
|
|
||||||
|
return {
|
||||||
|
activeDrag,
|
||||||
|
dropTarget,
|
||||||
|
};
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user