mirror of
https://github.com/9technologygroup/patchmon.net.git
synced 2025-11-09 16:37:29 +00:00
fix(frontend): hook does not specify its dependency
This commit is contained in:
@@ -1,5 +1,11 @@
|
|||||||
import { Check, ChevronDown, Edit2, X } from "lucide-react";
|
import { Check, ChevronDown, Edit2, X } from "lucide-react";
|
||||||
import React, { useEffect, useMemo, useRef, useState } from "react";
|
import React, {
|
||||||
|
useCallback,
|
||||||
|
useEffect,
|
||||||
|
useMemo,
|
||||||
|
useRef,
|
||||||
|
useState,
|
||||||
|
} from "react";
|
||||||
|
|
||||||
const InlineGroupEdit = ({
|
const InlineGroupEdit = ({
|
||||||
value,
|
value,
|
||||||
@@ -38,7 +44,7 @@ const InlineGroupEdit = ({
|
|||||||
}, [value, isEditing]);
|
}, [value, isEditing]);
|
||||||
|
|
||||||
// Calculate dropdown position
|
// Calculate dropdown position
|
||||||
const calculateDropdownPosition = () => {
|
const calculateDropdownPosition = useCallback(() => {
|
||||||
if (buttonRef.current) {
|
if (buttonRef.current) {
|
||||||
const rect = buttonRef.current.getBoundingClientRect();
|
const rect = buttonRef.current.getBoundingClientRect();
|
||||||
setDropdownPosition({
|
setDropdownPosition({
|
||||||
@@ -47,7 +53,7 @@ const InlineGroupEdit = ({
|
|||||||
width: rect.width,
|
width: rect.width,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
}, []);
|
||||||
|
|
||||||
// Close dropdown when clicking outside
|
// Close dropdown when clicking outside
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -68,7 +74,7 @@ const InlineGroupEdit = ({
|
|||||||
window.removeEventListener("scroll", calculateDropdownPosition);
|
window.removeEventListener("scroll", calculateDropdownPosition);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}, [isOpen]);
|
}, [isOpen, calculateDropdownPosition]);
|
||||||
|
|
||||||
const handleEdit = () => {
|
const handleEdit = () => {
|
||||||
if (disabled) return;
|
if (disabled) return;
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ import {
|
|||||||
Wrench,
|
Wrench,
|
||||||
X,
|
X,
|
||||||
} from "lucide-react";
|
} from "lucide-react";
|
||||||
import React, { useEffect, useRef, useState } from "react";
|
import React, { useCallback, useEffect, useRef, useState } from "react";
|
||||||
import { Link, useLocation } from "react-router-dom";
|
import { Link, useLocation } from "react-router-dom";
|
||||||
import { useAuth } from "../contexts/AuthContext";
|
import { useAuth } from "../contexts/AuthContext";
|
||||||
import { useUpdateNotification } from "../contexts/UpdateNotificationContext";
|
import { useUpdateNotification } from "../contexts/UpdateNotificationContext";
|
||||||
@@ -242,7 +242,7 @@ const Layout = ({ children }) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Fetch GitHub stars count
|
// Fetch GitHub stars count
|
||||||
const fetchGitHubStars = async () => {
|
const fetchGitHubStars = useCallback(async () => {
|
||||||
try {
|
try {
|
||||||
const response = await fetch(
|
const response = await fetch(
|
||||||
"https://api.github.com/repos/9technologygroup/patchmon.net",
|
"https://api.github.com/repos/9technologygroup/patchmon.net",
|
||||||
@@ -254,7 +254,7 @@ const Layout = ({ children }) => {
|
|||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Failed to fetch GitHub stars:", error);
|
console.error("Failed to fetch GitHub stars:", error);
|
||||||
}
|
}
|
||||||
};
|
}, []);
|
||||||
|
|
||||||
// Short format for navigation area
|
// Short format for navigation area
|
||||||
const formatRelativeTimeShort = (date) => {
|
const formatRelativeTimeShort = (date) => {
|
||||||
@@ -300,7 +300,7 @@ const Layout = ({ children }) => {
|
|||||||
// Fetch GitHub stars on component mount
|
// Fetch GitHub stars on component mount
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
fetchGitHubStars();
|
fetchGitHubStars();
|
||||||
}, []);
|
}, [fetchGitHubStars]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen bg-secondary-50">
|
<div className="min-h-screen bg-secondary-50">
|
||||||
|
|||||||
@@ -26,41 +26,8 @@ export const AuthProvider = ({ children }) => {
|
|||||||
|
|
||||||
const [checkingSetup, setCheckingSetup] = useState(true);
|
const [checkingSetup, setCheckingSetup] = useState(true);
|
||||||
|
|
||||||
// Initialize auth state from localStorage
|
// Define functions first
|
||||||
useEffect(() => {
|
const fetchPermissions = useCallback(async (authToken) => {
|
||||||
const storedToken = localStorage.getItem("token");
|
|
||||||
const storedUser = localStorage.getItem("user");
|
|
||||||
const storedPermissions = localStorage.getItem("permissions");
|
|
||||||
|
|
||||||
if (storedToken && storedUser) {
|
|
||||||
try {
|
|
||||||
setToken(storedToken);
|
|
||||||
setUser(JSON.parse(storedUser));
|
|
||||||
if (storedPermissions) {
|
|
||||||
setPermissions(JSON.parse(storedPermissions));
|
|
||||||
} else {
|
|
||||||
// Fetch permissions if not stored
|
|
||||||
fetchPermissions(storedToken);
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error("Error parsing stored user data:", error);
|
|
||||||
localStorage.removeItem("token");
|
|
||||||
localStorage.removeItem("user");
|
|
||||||
localStorage.removeItem("permissions");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
setIsLoading(false);
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
// Refresh permissions when user logs in (no automatic refresh)
|
|
||||||
useEffect(() => {
|
|
||||||
if (token && user) {
|
|
||||||
// Only refresh permissions once when user logs in
|
|
||||||
refreshPermissions();
|
|
||||||
}
|
|
||||||
}, [token, user]);
|
|
||||||
|
|
||||||
const fetchPermissions = async (authToken) => {
|
|
||||||
try {
|
try {
|
||||||
setPermissionsLoading(true);
|
setPermissionsLoading(true);
|
||||||
const response = await fetch("/api/v1/permissions/user-permissions", {
|
const response = await fetch("/api/v1/permissions/user-permissions", {
|
||||||
@@ -84,15 +51,49 @@ export const AuthProvider = ({ children }) => {
|
|||||||
} finally {
|
} finally {
|
||||||
setPermissionsLoading(false);
|
setPermissionsLoading(false);
|
||||||
}
|
}
|
||||||
};
|
}, []);
|
||||||
|
|
||||||
const refreshPermissions = async () => {
|
const refreshPermissions = useCallback(async () => {
|
||||||
if (token) {
|
if (token) {
|
||||||
const updatedPermissions = await fetchPermissions(token);
|
const updatedPermissions = await fetchPermissions(token);
|
||||||
return updatedPermissions;
|
return updatedPermissions;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
};
|
}, [token, fetchPermissions]);
|
||||||
|
|
||||||
|
// Initialize auth state from localStorage
|
||||||
|
useEffect(() => {
|
||||||
|
const storedToken = localStorage.getItem("token");
|
||||||
|
const storedUser = localStorage.getItem("user");
|
||||||
|
const storedPermissions = localStorage.getItem("permissions");
|
||||||
|
|
||||||
|
if (storedToken && storedUser) {
|
||||||
|
try {
|
||||||
|
setToken(storedToken);
|
||||||
|
setUser(JSON.parse(storedUser));
|
||||||
|
if (storedPermissions) {
|
||||||
|
setPermissions(JSON.parse(storedPermissions));
|
||||||
|
} else {
|
||||||
|
// Use the proper fetchPermissions function
|
||||||
|
fetchPermissions(storedToken);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error parsing stored user data:", error);
|
||||||
|
localStorage.removeItem("token");
|
||||||
|
localStorage.removeItem("user");
|
||||||
|
localStorage.removeItem("permissions");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setIsLoading(false);
|
||||||
|
}, [fetchPermissions]);
|
||||||
|
|
||||||
|
// Refresh permissions when user logs in (no automatic refresh)
|
||||||
|
useEffect(() => {
|
||||||
|
if (token && user) {
|
||||||
|
// Only refresh permissions once when user logs in
|
||||||
|
refreshPermissions();
|
||||||
|
}
|
||||||
|
}, [token, user, refreshPermissions]);
|
||||||
|
|
||||||
const login = async (username, password) => {
|
const login = async (username, password) => {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -1199,6 +1199,7 @@ const Hosts = () => {
|
|||||||
sortField,
|
sortField,
|
||||||
sortDirection,
|
sortDirection,
|
||||||
searchParams,
|
searchParams,
|
||||||
|
hideStale,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
// Group hosts by selected field
|
// Group hosts by selected field
|
||||||
|
|||||||
@@ -186,6 +186,7 @@ const Packages = () => {
|
|||||||
securityFilter,
|
securityFilter,
|
||||||
sortField,
|
sortField,
|
||||||
sortDirection,
|
sortDirection,
|
||||||
|
hostFilter,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
// Get visible columns in order
|
// Get visible columns in order
|
||||||
|
|||||||
Reference in New Issue
Block a user