diff --git a/src/components/banner-order-chooser/BannerOrderChooser.tsx b/src/components/banner-order-chooser/BannerOrderChooser.tsx index 990c0b6..d78bbfe 100644 --- a/src/components/banner-order-chooser/BannerOrderChooser.tsx +++ b/src/components/banner-order-chooser/BannerOrderChooser.tsx @@ -19,7 +19,6 @@ const BannerOrderChooser: FC = ({ }) => { const [open, setOpen] = useState(false) const [loadingLocation, setLoadingLocation] = useState(false) - const [currentFilter, setCurrentFilter] = useState(filter) const { t } = useTranslation() useEffect(() => { if (loadingLocation) { @@ -27,7 +26,7 @@ const BannerOrderChooser: FC = ({ (pos) => { setLoadingLocation(false) updateFilter({ - ...currentFilter, + ...filter, orderBy: 'proximityStartPoint', orderDirection: 'ASC', proximityLatitude: pos.coords.latitude, @@ -40,7 +39,7 @@ const BannerOrderChooser: FC = ({ { maximumAge: 0, enableHighAccuracy: true } ) } - }) + }, [loadingLocation, setLoadingLocation, filter]) const show = () => { setOpen(true) @@ -52,7 +51,6 @@ const BannerOrderChooser: FC = ({ } const updateFilter = (newFilter: BannerFilter) => { - setCurrentFilter(newFilter) onFilterChanged(newFilter) } @@ -68,51 +66,51 @@ const BannerOrderChooser: FC = ({ } const onOrderClicked = (type: BannerOrder) => { - if (type !== currentFilter.orderBy) { + if (type !== filter.orderBy) { if (type === 'proximityStartPoint') { setLoadingLocation(true) } else { updateFilter({ - ...currentFilter, + ...filter, orderBy: type, orderDirection: getDefaultDirection(type), proximityLatitude: undefined, proximityLongitude: undefined, }) } - } else if (hasBothDirections(currentFilter.orderBy)) { + } else if (hasBothDirections(filter.orderBy)) { updateFilter({ - ...currentFilter, - orderDirection: currentFilter.orderDirection === 'ASC' ? 'DESC' : 'ASC', + ...filter, + orderDirection: filter.orderDirection === 'ASC' ? 'DESC' : 'ASC', }) } } const onOfficialChanged = (includeUnofficial: boolean) => { updateFilter({ - ...currentFilter, + ...filter, onlyOfficialMissions: includeUnofficial ? undefined : true, }) } const onOnlineChanged = (showOffline: boolean) => { updateFilter({ - ...currentFilter, + ...filter, online: showOffline ? undefined : true, }) } const getButtonClass = (type: BannerOrder) => { let classNames = 'order-button' - if (type === currentFilter.orderBy) { + if (type === filter.orderBy) { classNames += ' selected' } return classNames } const getButtonDirection = (type: BannerOrder) => { - return type === currentFilter.orderBy - ? currentFilter.orderDirection + return type === filter.orderBy + ? filter.orderDirection : getDefaultDirection(type) } @@ -147,16 +145,13 @@ const BannerOrderChooser: FC = ({

{t('order.showOfflineBanners')}

- +
{includeOfficial && (

{t('order.showUnofficialBanners')}

@@ -190,8 +185,8 @@ const BannerOrderChooser: FC = ({ components={{ order: ( ), }} @@ -199,10 +194,10 @@ const BannerOrderChooser: FC = ({ {' / '} )} - {currentFilter.online + {filter.online ? t('order.text.excludeOffline') : t('order.text.includeOffline')} - {currentFilter.onlyOfficialMissions && ( + {filter.onlyOfficialMissions && ( <> {' / '} {t('order.onlyOfficial')} diff --git a/src/components/infinite-banner-list/InfiniteBannerList.tsx b/src/components/infinite-banner-list/InfiniteBannerList.tsx index 8f800c6..47de871 100644 --- a/src/components/infinite-banner-list/InfiniteBannerList.tsx +++ b/src/components/infinite-banner-list/InfiniteBannerList.tsx @@ -1,6 +1,6 @@ -import { FC, useState } from 'react' +import { FC, useEffect, useState } from 'react' import { BannerFilter } from '../../features/banner/filter' -import { useBannerList } from '../../features/banner/hooks' +import { useBannerList, usePrevious } from '../../features/banner/hooks' import BannerList from '../banner-list' import BannerOrderChooser from '../banner-order-chooser' @@ -19,6 +19,10 @@ const InfiniteBannerList: FC = ({ setMaxPages(1) } + useEffect(() => { + onFilterChanged(initialFilter) + }, [initialFilter]) + return (
{ - constructor(props: UserBannerListProps) { - super(props) - this.state = { - filter: { - orderBy: 'listAdded', - orderDirection: 'DESC', - online: undefined, - }, - listType: 'none', - pageBanners: 0, - bannersStatus: 'initial', - } - } - - static getDerivedStateFromProps( - props: Readonly, - state: UserBannerListState - ) { - const { match } = props - const { listType } = state - const newListType = decodeURIComponent(match.params.listType) - - if (listType !== newListType) { - return { - listType: newListType, - pageBanners: 0, - } - } - - return null - } - - componentDidMount() { - const { filter, listType } = this.state - - this.doFetchBanners(listType, filter, 0) - } - - componentDidUpdate( - prevProps: UserBannerListProps, - prevState: UserBannerListState - ) { - const { authenticated: prevAuthenticated } = prevProps - const { authenticated } = this.props - - const { listType: prevListType } = prevState - const { listType, filter } = this.state - - if (prevListType !== listType || prevAuthenticated !== authenticated) { - this.doFetchBanners(listType, filter, 0) - } - } - - onFilterChanged = (filter: BannerFilter) => { - const { listType } = this.state - this.setState({ - filter, - pageBanners: 0, - }) - this.doFetchBanners(listType, filter, 0) - } +import InfiniteBannerList from '../../components/infinite-banner-list/InfiniteBannerList' - onLoadMoreBanners = () => { - const { fetchBanners } = this.props - const { filter, pageBanners, listType } = this.state - this.setState({ pageBanners: pageBanners + 1 }) - return fetchBanners(listType, filter, pageBanners + 1) - } - - getPageTitle() { - const { i18n } = this.props - const { listType } = this.state - return ( - i18n?.t('banners.mine', { type: getBannerListTypeText(listType) }) ?? - `My ${getBannerListTypeText(listType)} Banners` - ) - } - - async doFetchBanners( - listType: BannerListType, - filter: BannerFilter, - pageBanners: number - ) { - const { fetchBanners, authenticated } = this.props - - if (authenticated) { - this.setState({ bannersStatus: 'loading' }) - await fetchBanners(listType, filter, pageBanners) - this.setState({ bannersStatus: 'success' }) - } - } - - render() { - const title: string = this.getPageTitle() - const { bannersStatus, filter, listType } = this.state - const { banners, hasMoreBanners } = this.props +import './user-banner-list.less' - return ( - - - {title} - -
-
- { + const { listType } = useParams<{ listType: BannerListType }>() + const { t } = useTranslation() + const title = t('banners.mine', { type: getBannerListTypeText(listType) }) + + const initialFilter: BannerFilter = { + listTypes: listType, + orderBy: 'listAdded', + orderDirection: 'DESC', + online: undefined, + } + + return ( + + + {title} + +
+
+ + + + - - - - - - - {bannersStatus === 'success' && ( - <> - {banners.length > 0 && ( - <> - - - - - )} - - {banners.length === 0 && ( - <> - - - Mark banners as{' '} - {{ type: getBannerListTypeText(listType) }} to see - see them here. - - - - )} - - )} - - {(bannersStatus === 'initial' || - bannersStatus === 'loading') && ( - Loading... - )} - - -
- +
-
- ) - } -} - -export type UserBannerListProps = { - banners: Array - hasMoreBanners: Boolean - fetchBanners: ( - listType: BannerListType, - filter: BannerFilter, - pageBanners: number - ) => Promise - authenticated: Boolean -} & RouteComponentProps<{ listType: BannerListType }> & - WithTranslationProps - -interface UserBannerListState { - filter: BannerFilter - listType: BannerListType - pageBanners: number - bannersStatus: 'initial' | 'success' | 'loading' | 'error' -} - -const mapStateToProps = (state: RootState) => ({ - banners: getUserBannerListBanners(state), - hasMoreBanners: getHasMoreUserBannerListBanners(state), -}) - -const mapDispatchToProps = { - fetchBanners: loadUserBannerListBannersAction, + +
+ + ) } -export default connect( - mapStateToProps, - mapDispatchToProps -)(withAuthenticated(withRouter(withTranslation()(UserBannerList)))) +export default UserBannerList