Sync
This commit is contained in:
parent
546f89e970
commit
a18640344e
77 changed files with 8201 additions and 2 deletions
115
src/hooks/use-users.ts
Normal file
115
src/hooks/use-users.ts
Normal file
|
|
@ -0,0 +1,115 @@
|
|||
import useSWR from "swr";
|
||||
|
||||
// API response interface (what we receive from the server)
|
||||
type ApiUserResponse = {
|
||||
uuid: string;
|
||||
username: string;
|
||||
displayname?: string;
|
||||
public_key: string;
|
||||
private_key_hash: string;
|
||||
avatar?: string;
|
||||
storage: number;
|
||||
connected: boolean;
|
||||
createdAt: number;
|
||||
};
|
||||
|
||||
// User interface (what we use in the UI - includes computed displayName)
|
||||
interface User extends ApiUserResponse {
|
||||
displayName: string; // Always provided by our processing
|
||||
}
|
||||
|
||||
// SWR fetcher function
|
||||
const fetcher = (url: string) => fetch(url).then((res) => res.json());
|
||||
|
||||
// Custom hook for checking username availability
|
||||
export const useUsernameAvailability = (username: string) => {
|
||||
const shouldFetch = username && username.length >= 3;
|
||||
const { data, error, isLoading } = useSWR(
|
||||
shouldFetch ? `https://omega.tensamin.net/api/get/id/${username}` : null,
|
||||
fetcher,
|
||||
{
|
||||
revalidateOnFocus: false,
|
||||
dedupingInterval: 5000, // Cache for 5 seconds
|
||||
},
|
||||
);
|
||||
|
||||
return {
|
||||
isAvailable: data?.type === "error", // "error" means username is available
|
||||
isTaken: data?.type === "success", // "success" means username is taken
|
||||
isLoading,
|
||||
error,
|
||||
};
|
||||
};
|
||||
|
||||
// Custom hook for getting users list
|
||||
export const useUsers = () => {
|
||||
const {
|
||||
data,
|
||||
error,
|
||||
isLoading,
|
||||
mutate: refreshUsers,
|
||||
} = useSWR("/api/users/get/", fetcher, {
|
||||
revalidateOnFocus: false,
|
||||
dedupingInterval: 30000, // Cache for 30 seconds
|
||||
});
|
||||
|
||||
// Process the API response to ensure UI compatibility
|
||||
// Check if data is an array before processing
|
||||
const processedUsers = (Array.isArray(data) ? data : []).map(
|
||||
(user: ApiUserResponse) => ({
|
||||
...user,
|
||||
displayName: user.displayname || user.username, // Always provide displayName for UI
|
||||
}),
|
||||
) as User[];
|
||||
|
||||
// Wrapper function that only resolves if refresh succeeds
|
||||
const refreshUsersWithPromise = async () => {
|
||||
try {
|
||||
const result = await refreshUsers();
|
||||
// Check if the result is valid (array of users)
|
||||
if (!Array.isArray(result)) {
|
||||
throw new Error("Failed to load users");
|
||||
}
|
||||
return result;
|
||||
} catch (error) {
|
||||
throw error;
|
||||
}
|
||||
};
|
||||
|
||||
// Function to delete a user
|
||||
const deleteUser = async (uuid: string) => {
|
||||
try {
|
||||
const response = await fetch("/api/users/remove/", {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({ uuid }),
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error("Failed to delete user");
|
||||
}
|
||||
|
||||
const result = await response.json();
|
||||
|
||||
// Refresh the users list after successful deletion
|
||||
await refreshUsersWithPromise();
|
||||
|
||||
return result;
|
||||
} catch (error) {
|
||||
throw error;
|
||||
}
|
||||
};
|
||||
|
||||
return {
|
||||
users: processedUsers,
|
||||
isLoading,
|
||||
error,
|
||||
refreshUsers: refreshUsersWithPromise,
|
||||
deleteUser,
|
||||
};
|
||||
};
|
||||
|
||||
// Export User type for other components to use
|
||||
export type { User };
|
||||
Loading…
Reference in a new issue