mirror of
https://github.com/bitsocialnet/5chan.git
synced 2026-08-03 07:41:04 +02:00
Use Zustand selectors with custom equality functions to only subscribe to specific fields needed by components, avoiding unnecessary rerenders when transient state like updatingState changes. Extract offline indicators into separate components to isolate rerenders. Memoize card components in catalog and popular threads views.
31 lines
1.5 KiB
TypeScript
31 lines
1.5 KiB
TypeScript
import { useMemo } from 'react';
|
|
import { useAccount } from '@plebbit/plebbit-react-hooks';
|
|
import { useSubplebbitField } from './use-stable-subplebbit';
|
|
|
|
interface AuthorPrivilegesProps {
|
|
commentAuthorAddress: string;
|
|
subplebbitAddress: string;
|
|
postCid?: string;
|
|
}
|
|
|
|
const useAuthorPrivileges = ({ commentAuthorAddress, subplebbitAddress }: AuthorPrivilegesProps) => {
|
|
const account = useAccount();
|
|
const accountAuthorAddress = account?.author?.address;
|
|
// Only subscribe to roles field to avoid rerenders from updatingState changes
|
|
const roles = useSubplebbitField(subplebbitAddress, (subplebbit) => subplebbit?.roles);
|
|
const { isCommentAuthorMod, isAccountMod, isAccountCommentAuthor, commentAuthorRole, accountAuthorRole } = useMemo(() => {
|
|
const commentAuthorRole = roles?.[commentAuthorAddress]?.role;
|
|
const isCommentAuthorMod = commentAuthorRole === 'admin' || commentAuthorRole === 'owner' || commentAuthorRole === 'moderator';
|
|
const accountAuthorRole = roles?.[accountAuthorAddress]?.role;
|
|
const isAccountMod = accountAuthorRole === 'admin' || accountAuthorRole === 'owner' || accountAuthorRole === 'moderator';
|
|
|
|
const isAccountCommentAuthor = accountAuthorAddress === commentAuthorAddress;
|
|
|
|
return { isCommentAuthorMod, isAccountMod, isAccountCommentAuthor, commentAuthorRole, accountAuthorRole };
|
|
}, [roles, commentAuthorAddress, accountAuthorAddress]);
|
|
|
|
return { isCommentAuthorMod, isAccountMod, isAccountCommentAuthor, commentAuthorRole, accountAuthorRole };
|
|
};
|
|
|
|
export default useAuthorPrivileges;
|