rebreak-monorepo/apps/rebreak-native/components/OnlinePresenceProvider.tsx
chahinebrini 35a71a9068 feat(presence): Online-Presence-Provider + Hooks
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-21 18:09:42 +02:00

52 lines
1.4 KiB
TypeScript

import { createContext, useContext, useMemo } from 'react';
import { OnlinePresenceContext, useOnlinePresenceNode } from '../hooks/useOnlineUsers';
import { useAuthStore } from '../stores/auth';
import { useLastSeenHeartbeat } from '../hooks/useLastSeenHeartbeat';
import { useFollowing } from '../hooks/useFollowing';
export type PresenceContextExtended = {
onlineUserIds: Set<string>;
isOnline: (userId: string) => boolean;
};
export const PresenceVisibilityContext = createContext<{
presenceVisible: boolean;
setPresenceVisible: (v: boolean) => void;
}>({
presenceVisible: true,
setPresenceVisible: () => {},
});
export function usePresenceVisibility() {
return useContext(PresenceVisibilityContext);
}
type Props = {
children: React.ReactNode;
};
export function OnlinePresenceProvider({ children }: Props) {
const user = useAuthStore((s) => s.user);
const ids = useOnlinePresenceNode(user?.id ?? null);
const following = useFollowing();
useLastSeenHeartbeat(!!user);
const ctx = useMemo(
() => ({
onlineUserIds: ids,
isOnline: (userId: string) => {
if (!user?.id || userId === user.id) return false;
return ids.has(userId) && following.has(userId);
},
}),
[ids, following, user?.id],
);
return (
<OnlinePresenceContext.Provider value={ctx}>
{children}
</OnlinePresenceContext.Provider>
);
}