fix colliding drawing IDs
This commit is contained in:
@@ -36,6 +36,8 @@ export const Layout: React.FC<LayoutProps> = ({
|
||||
const sidebarRef = useRef<HTMLDivElement>(null);
|
||||
const startXRef = useRef(0);
|
||||
const startWidthRef = useRef(0);
|
||||
const resizeMouseMoveHandlerRef = useRef<((e: MouseEvent) => void) | null>(null);
|
||||
const resizeMouseUpHandlerRef = useRef<(() => void) | null>(null);
|
||||
|
||||
// Handle mouse down on resize handle
|
||||
const handleMouseDown = (e: React.MouseEvent) => {
|
||||
@@ -44,6 +46,13 @@ export const Layout: React.FC<LayoutProps> = ({
|
||||
startXRef.current = e.clientX;
|
||||
startWidthRef.current = sidebarWidth;
|
||||
|
||||
if (resizeMouseMoveHandlerRef.current) {
|
||||
document.removeEventListener('mousemove', resizeMouseMoveHandlerRef.current);
|
||||
}
|
||||
if (resizeMouseUpHandlerRef.current) {
|
||||
document.removeEventListener('mouseup', resizeMouseUpHandlerRef.current);
|
||||
}
|
||||
|
||||
const handleMouseMove = (e: MouseEvent) => {
|
||||
const diff = e.clientX - startXRef.current;
|
||||
const newWidth = Math.max(200, Math.min(600, startWidthRef.current + diff));
|
||||
@@ -54,8 +63,12 @@ export const Layout: React.FC<LayoutProps> = ({
|
||||
setIsResizing(false);
|
||||
document.removeEventListener('mousemove', handleMouseMove);
|
||||
document.removeEventListener('mouseup', handleMouseUp);
|
||||
resizeMouseMoveHandlerRef.current = null;
|
||||
resizeMouseUpHandlerRef.current = null;
|
||||
};
|
||||
|
||||
resizeMouseMoveHandlerRef.current = handleMouseMove;
|
||||
resizeMouseUpHandlerRef.current = handleMouseUp;
|
||||
document.addEventListener('mousemove', handleMouseMove);
|
||||
document.addEventListener('mouseup', handleMouseUp);
|
||||
};
|
||||
@@ -63,8 +76,14 @@ export const Layout: React.FC<LayoutProps> = ({
|
||||
// Cleanup event listeners on unmount
|
||||
useEffect(() => {
|
||||
return () => {
|
||||
document.removeEventListener('mousemove', () => {});
|
||||
document.removeEventListener('mouseup', () => {});
|
||||
if (resizeMouseMoveHandlerRef.current) {
|
||||
document.removeEventListener('mousemove', resizeMouseMoveHandlerRef.current);
|
||||
resizeMouseMoveHandlerRef.current = null;
|
||||
}
|
||||
if (resizeMouseUpHandlerRef.current) {
|
||||
document.removeEventListener('mouseup', resizeMouseUpHandlerRef.current);
|
||||
resizeMouseUpHandlerRef.current = null;
|
||||
}
|
||||
};
|
||||
}, []);
|
||||
|
||||
|
||||
@@ -60,12 +60,10 @@ export const AuthProvider: React.FC<{ children: ReactNode }> = ({ children }) =>
|
||||
return;
|
||||
}
|
||||
} catch {
|
||||
// If status fails (backend down / schema mismatch), avoid locking the UI
|
||||
// behind login. Backend still enforces auth when enabled.
|
||||
setAuthEnabled(false);
|
||||
// If status fails, default to auth-enabled mode to avoid exposing
|
||||
// single-user UI paths accidentally. Backend remains the source of truth.
|
||||
setAuthEnabled(true);
|
||||
setBootstrapRequired(false);
|
||||
setUser(null);
|
||||
return;
|
||||
}
|
||||
|
||||
const storedUser = localStorage.getItem(USER_KEY);
|
||||
|
||||
@@ -73,12 +73,14 @@ export const Dashboard: React.FC = () => {
|
||||
});
|
||||
|
||||
const [isLoading, setIsLoading] = useState(false);
|
||||
const listRequestVersionRef = useRef(0);
|
||||
|
||||
const { uploadFiles } = useUpload();
|
||||
|
||||
const hasMore = drawings.length < totalCount;
|
||||
|
||||
const refreshData = useCallback(async () => {
|
||||
const requestVersion = ++listRequestVersionRef.current;
|
||||
setIsLoading(true);
|
||||
try {
|
||||
const [drawingsRes, collectionsData] = await Promise.all([
|
||||
@@ -90,6 +92,7 @@ export const Dashboard: React.FC = () => {
|
||||
}),
|
||||
api.getCollections()
|
||||
]);
|
||||
if (requestVersion !== listRequestVersionRef.current) return;
|
||||
setDrawings(drawingsRes.drawings);
|
||||
setTotalCount(drawingsRes.totalCount);
|
||||
setCollections(collectionsData);
|
||||
@@ -97,12 +100,15 @@ export const Dashboard: React.FC = () => {
|
||||
} catch (err) {
|
||||
console.error('Failed to fetch data:', err);
|
||||
} finally {
|
||||
setIsLoading(false);
|
||||
if (requestVersion === listRequestVersionRef.current) {
|
||||
setIsLoading(false);
|
||||
}
|
||||
}
|
||||
}, [debouncedSearch, selectedCollectionId, sortConfig.field, sortConfig.direction]);
|
||||
|
||||
const fetchMore = useCallback(async () => {
|
||||
if (isFetchingMore || !hasMore || isLoading) return;
|
||||
const requestVersion = listRequestVersionRef.current;
|
||||
setIsFetchingMore(true);
|
||||
try {
|
||||
const drawingsRes = await api.getDrawings(debouncedSearch, selectedCollectionId, {
|
||||
@@ -111,7 +117,12 @@ export const Dashboard: React.FC = () => {
|
||||
sortField: sortConfig.field,
|
||||
sortDirection: sortConfig.direction,
|
||||
});
|
||||
setDrawings(prev => [...prev, ...drawingsRes.drawings]);
|
||||
if (requestVersion !== listRequestVersionRef.current) return;
|
||||
setDrawings(prev => {
|
||||
const seen = new Set(prev.map((d) => d.id));
|
||||
const nextPage = drawingsRes.drawings.filter((d) => !seen.has(d.id));
|
||||
return [...prev, ...nextPage];
|
||||
});
|
||||
setTotalCount(drawingsRes.totalCount);
|
||||
} catch (err) {
|
||||
console.error('Failed to fetch more data:', err);
|
||||
|
||||
Reference in New Issue
Block a user