@replyke/core
Version:
Replyke: Build interactive apps with social features like comments, votes, feeds, user lists, notifications, and more.
64 lines • 2.86 kB
JavaScript
import { useEffect, useMemo, useCallback } from "react";
import { useReplykeDispatch, useReplykeSelector } from "../../store/hooks";
import { setProjectContext, selectUser, selectUserLoading, selectUserUpdating, selectCurrentProjectId, selectUserError, } from "../../store/slices/userSlice";
import { useUserActions } from "./useUserActions";
import useProject from "../projects/useProject";
import { selectUser as selectAuthUser } from "../../store/slices/authSlice";
/**
* Redux-powered hook that provides comprehensive user management
* This replaces useUserData and provides the same interface with Redux state management
*/
function useUser(_ = {}) {
const dispatch = useReplykeDispatch();
// Get external context
const { projectId } = useProject();
// Get Redux state
const user = useReplykeSelector(selectUser);
const authUser = useReplykeSelector(selectAuthUser); // Fallback to auth user
const loading = useReplykeSelector(selectUserLoading);
const updating = useReplykeSelector(selectUserUpdating);
const error = useReplykeSelector(selectUserError);
const currentProjectId = useReplykeSelector(selectCurrentProjectId);
// Get actions
const { setUser, updateUser: updateUserAction, clearError, } = useUserActions();
// Update Redux state when project changes
useEffect(() => {
if (projectId && projectId !== currentProjectId) {
dispatch(setProjectContext(projectId));
}
}, [dispatch, projectId, currentProjectId]);
// Sync auth user to user slice when auth user changes and we don't have a user yet
// IMPORTANT: Only sync if authUser has valid data (has an id) to prevent empty objects from being set
useEffect(() => {
if (authUser && authUser.id && !user) {
setUser(authUser);
}
}, [authUser, user, setUser]);
// Current user operations with projectId included automatically
const handleUpdateUser = useCallback(async (update) => {
if (!user) {
throw new Error("No user available to update");
}
if (!projectId) {
throw new Error("No projectId available");
}
// Pass current user for optimistic update reversion if needed
return await updateUserAction({
projectId,
userId: user.id,
update,
currentUser: user,
});
}, [updateUserAction, user, projectId]);
// Return focused interface for current user management
return useMemo(() => ({
user: user || authUser, // Fallback to auth user if user slice is empty
loading,
updating,
error,
updateUser: handleUpdateUser,
clearError,
}), [user, authUser, loading, updating, error, handleUpdateUser, clearError]);
}
export default useUser;
//# sourceMappingURL=useUser.js.map