Files
5chan/src/hooks/use-account-community-addresses.ts
T

46 lines
1.7 KiB
TypeScript
Raw Normal View History

2026-04-27 14:59:24 +07:00
import useAccountsStore from '@bitsocial/bitsocial-react-hooks/dist/stores/accounts/index.js';
import { getEquivalentCommunityAddressGroupKey, pickPreferredEquivalentCommunityAddress } from '@bitsocial/bitsocial-react-hooks/dist/lib/community-address.js';
2026-04-27 14:59:24 +07:00
type AccountWithCommunities = {
communities?: Record<string, unknown>;
};
2026-04-27 14:59:24 +07:00
type AccountsStoreState = {
activeAccountId?: string;
accounts: Record<string, AccountWithCommunities | undefined>;
};
const EMPTY_ACCOUNT_COMMUNITY_ADDRESSES: string[] = [];
const areStringArraysEqual = (previous: string[], next: string[]) => {
if (previous === next) {
return true;
}
if (previous.length !== next.length) {
return false;
}
return previous.every((value, index) => value === next[index]);
};
const getAccountCommunityAddresses = (state: AccountsStoreState): string[] => {
const accountCommunities = state.activeAccountId ? state.accounts[state.activeAccountId]?.communities : undefined;
if (!accountCommunities) {
return EMPTY_ACCOUNT_COMMUNITY_ADDRESSES;
}
const groupedAddresses = new Map<string, string[]>();
for (const communityAddress of Object.keys(accountCommunities)) {
const groupKey = getEquivalentCommunityAddressGroupKey(communityAddress);
const addresses = groupedAddresses.get(groupKey);
if (addresses) {
addresses.push(communityAddress);
} else {
groupedAddresses.set(groupKey, [communityAddress]);
}
}
return [...groupedAddresses.values()].map((addresses) => pickPreferredEquivalentCommunityAddress(addresses)).sort();
};
export const useAccountCommunityAddresses = (): string[] => useAccountsStore(getAccountCommunityAddresses, areStringArraysEqual);