import * as React from 'react'; import NewPost from './NewPost'; import SearchFilter from './SearchFilter'; import PostStatusFilter from './PostStatusFilter'; import PostList from './PostList'; import Sidebar from '../common/Sidebar'; import IBoard from '../../interfaces/IBoard'; import ITenantSetting from '../../interfaces/ITenantSetting'; import { PostsState } from '../../reducers/postsReducer'; import { PostStatusesState } from '../../reducers/postStatusesReducer'; import SortByFilter from './SortByFilter'; import { SortByFilterValues } from '../../actions/changeFilters'; interface Props { board: IBoard; isLoggedIn: boolean; isPowerUser: boolean; tenantSetting: ITenantSetting; authenticityToken: string; posts: PostsState; postStatuses: PostStatusesState; requestPosts( boardId: number, page?: number, searchQuery?: string, postStatusIds?: Array, sortBy?: SortByFilterValues, ): void; requestPostStatuses(): void; handleSearchFilterChange(searchQuery: string): void; handlePostStatusFilterChange(postStatusId: number): void; handleSortByFilterChange(sortBy: SortByFilterValues): void; } class BoardP extends React.Component { searchFilterTimeoutId: ReturnType; componentDidMount() { this.props.requestPosts(this.props.board.id, 1, '', null, this.props.posts.filters.sortBy); this.props.requestPostStatuses(); } componentDidUpdate(prevProps: Props) { const { searchQuery } = this.props.posts.filters; const prevSearchQuery = prevProps.posts.filters.searchQuery; const { postStatusIds } = this.props.posts.filters; const prevPostStatusIds = prevProps.posts.filters.postStatusIds; const { sortBy } = this.props.posts.filters; const prevSortBy = prevProps.posts.filters.sortBy; // search filter changed if (searchQuery !== prevSearchQuery) { if (this.searchFilterTimeoutId) clearInterval(this.searchFilterTimeoutId); this.searchFilterTimeoutId = setTimeout(() => ( this.props.requestPosts(this.props.board.id, 1, searchQuery, postStatusIds) ), 500); } // post status filter changed if (postStatusIds.length !== prevPostStatusIds.length) { this.props.requestPosts(this.props.board.id, 1, searchQuery, postStatusIds); } // sort by filter changed if (sortBy !== prevSortBy) { this.props.requestPosts(this.props.board.id, 1, searchQuery, postStatusIds, sortBy); } } render() { const { board, isLoggedIn, isPowerUser, tenantSetting, authenticityToken, posts, postStatuses, requestPosts, handleSearchFilterChange, handlePostStatusFilterChange, handleSortByFilterChange, } = this.props; const { filters } = posts; return (
{ isPowerUser && handleSortByFilterChange(sortBy)} /> } posts.areLoading ? null : requestPosts(board.id, posts.page + 1, filters.searchQuery, filters.postStatusIds) } isLoggedIn={isLoggedIn} authenticityToken={authenticityToken} />
); } } export default BoardP;