@replyke/core
Version:
Replyke: Build interactive apps with social features like comments, votes, feeds, user lists, notifications, and more.
43 lines • 2.16 kB
JavaScript
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
import { useEffect, useState } from "react";
import { Provider } from "react-redux";
import { replykeStore } from "../store";
import { useReplykeDispatch, useReplykeSelector } from "../store/hooks";
import { initializeAuthThunk } from "../store/slices/authThunks";
import { selectAccountsReady, selectAccountManagerRegistered, } from "../store/slices/accountsSlice";
/**
* Component that initializes auth state in Redux
* Must be inside the Redux Provider to dispatch actions
*/
const AuthInitializer = ({ children, projectId, signedToken }) => {
const dispatch = useReplykeDispatch();
const accountsReady = useReplykeSelector(selectAccountsReady);
const accountManagerRegistered = useReplykeSelector(selectAccountManagerRegistered);
const [hasWaitedForManager, setHasWaitedForManager] = useState(false);
// Give AccountManager one microtask to register itself
useEffect(() => {
Promise.resolve().then(() => setHasWaitedForManager(true));
}, []);
useEffect(() => {
// Still waiting for the microtask check
if (!hasWaitedForManager)
return;
// If an AccountManager registered, wait until it signals ready
if (accountManagerRegistered && !accountsReady)
return;
// Either: no AccountManager (core-only user) OR AccountManager is ready
dispatch(initializeAuthThunk({ projectId, signedToken }));
}, [dispatch, projectId, signedToken, hasWaitedForManager, accountManagerRegistered, accountsReady]);
return _jsx(_Fragment, { children: children });
};
/**
* Redux store provider for Replyke
* This component provides the Redux store and initializes auth state
*/
export const ReplykeStoreProvider = ({ children, projectId, signedToken }) => {
return (_jsx(Provider, { store: replykeStore, children: _jsx(AuthInitializer, { projectId: projectId, signedToken: signedToken, children: children }) }));
};
// Clean Redux-only architecture
// Always integrated with ReplykeProvider
export default ReplykeStoreProvider;
//# sourceMappingURL=replyke-store-context.js.map