@livelike/react-native
Version:
LiveLike React Native package
59 lines (50 loc) • 1.71 kB
text/typescript
import { useMemo } from 'react';
import { IUserReactionCountDetail } from '@livelike/javascript';
import { UserReactionsForTargetId, userReactionStore } from '../store';
import { useReactionPacks } from './useReactionPacks';
import { useSelectedFieldStore } from './useSelectedFieldStore';
export type UserReactionState = IUserReactionCountDetail & {
imageSrc: string;
};
export type UserReactionsForTargetIdState = {
[key: string]: UserReactionState;
};
export type UseUserReactionsArg = {
reactionSpaceId: string;
targetId: string;
};
const initialUserReactionValue: UserReactionsForTargetId = {};
export function useUserReactions({
reactionSpaceId,
targetId,
}: UseUserReactionsArg) {
const targetIdUserReactions = useSelectedFieldStore(
userReactionStore,
() =>
userReactionStore.get()?.[reactionSpaceId]?.[targetId] ||
initialUserReactionValue
);
const { reactionPacks } = useReactionPacks({ reactionSpaceId });
const validUserReactions: UserReactionsForTargetIdState = useMemo(() => {
if (!reactionPacks.length || !Object.keys(targetIdUserReactions).length) {
return initialUserReactionValue as UserReactionsForTargetIdState;
}
return reactionPacks.reduce<UserReactionsForTargetIdState>(
(_allReactions, pack) => {
pack.emojis.forEach((emoji) => {
if (targetIdUserReactions[emoji.id]) {
_allReactions[emoji.id] = {
...targetIdUserReactions[emoji.id],
imageSrc: emoji.file,
};
}
});
return _allReactions;
},
{}
);
}, [targetIdUserReactions, reactionPacks]);
return {
userReactions: validUserReactions,
};
}