import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react'; import {FormattedMessage} from 'react-intl'; import {Virtuoso} from 'react-virtuoso'; import {useSelector} from 'react-redux'; import {systemEmojis} from 'mattermost-redux/actions/emojis'; import {BadgeID, AllBadgesBadge} from '../../types/badges'; import Client from '../../client/api'; import {RHSState} from '../../types/general'; import {IMAGE_TYPE_EMOJI, RHS_STATE_DETAIL, RHS_STATE_TYPES} from '../../constants'; import {isCreateBadgeModalVisible, getEditBadgeModalData} from '../../selectors'; import AllBadgesRow from './all_badges_row'; import './all_badges.scss'; type Props = { filterTypeId?: number | null; filterTypeName?: string | null; actions: { setRHSView: (view: RHSState) => void; setRHSBadge: (badge: BadgeID | null) => void; getCustomEmojisByName: (names: string[]) => void; openCreateBadgeModal: () => void; }; } const AllBadges: React.FC = ({filterTypeId, filterTypeName, actions}) => { const [loading, setLoading] = useState(true); const [badges, setBadges] = useState([]); const isFiltered = filterTypeId != null; const createBadgeVisible = useSelector(isCreateBadgeModalVisible); const editBadgeData = useSelector(getEditBadgeModalData); const isModalOpen = createBadgeVisible || editBadgeData !== null; const wasModalOpen = useRef(false); const fetchBadges = useCallback(() => { const client = new Client(); client.getAllBadges().then((data) => { setBadges(data); setLoading(false); const names: string[] = []; data.forEach((badge) => { if (badge.image_type === IMAGE_TYPE_EMOJI) { names.push(badge.image); } }); const toLoad = names.filter((v) => !systemEmojis.has(v)); actions.getCustomEmojisByName(toLoad); }); }, []); // eslint-disable-line react-hooks/exhaustive-deps useEffect(() => { fetchBadges(); }, [fetchBadges]); useEffect(() => { if (wasModalOpen.current && !isModalOpen) { fetchBadges(); } wasModalOpen.current = isModalOpen; }, [isModalOpen, fetchBadges]); const displayBadges = useMemo(() => { if (!isFiltered) { return badges; } return badges.filter((b) => b.type === filterTypeId); }, [badges, isFiltered, filterTypeId]); const onBadgeClick = useCallback((badge: AllBadgesBadge) => { actions.setRHSBadge(badge.id); actions.setRHSView(RHS_STATE_DETAIL); }, [actions]); if (loading) { return (
); } const isEmpty = !isFiltered && (!badges || badges.length === 0); return ( <> {isFiltered && (
{filterTypeName}
)} {isEmpty && (
)} {!isEmpty && displayBadges.length === 0 && (
)} {!isEmpty && displayBadges.length > 0 && ( ( )} /> )} ); }; export default AllBadges;