UNPKG

@replyke/core

Version:

Replyke: Build interactive apps with social features like comments, votes, feeds, user lists, notifications, and more.

64 lines 2.86 kB
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