2025-12-08 22:40:16 +01:00
|
|
|
import { useEffect } from 'react';
|
|
|
|
|
import { useLocation } from 'react-router-dom';
|
|
|
|
|
import useFeedCacheStore, { CachedFeed } from '../../stores/use-feed-cache-store';
|
|
|
|
|
import { getFeedCacheKey, getFeedType, isFeedRoute } from '../../lib/utils/route-utils';
|
2026-04-18 15:58:27 +07:00
|
|
|
import { TIME_FILTER_QUERY_PARAM } from '../../lib/utils/time-filter-utils';
|
2025-12-08 22:40:16 +01:00
|
|
|
import Board from '../../views/board';
|
|
|
|
|
import Catalog from '../../views/catalog';
|
|
|
|
|
import styles from './feed-cache-container.module.css';
|
|
|
|
|
|
|
|
|
|
interface FeedContextFromKey {
|
|
|
|
|
viewType: 'all' | 'subs' | 'mod' | 'board';
|
|
|
|
|
boardIdentifier?: string;
|
2026-04-18 15:58:27 +07:00
|
|
|
timeFilterName?: string;
|
2025-12-08 22:40:16 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const parseFeedKey = (key: string): FeedContextFromKey => {
|
2026-04-18 15:58:27 +07:00
|
|
|
const [pathname, search = ''] = key.split('?');
|
|
|
|
|
const segments = pathname.split('/').filter(Boolean);
|
|
|
|
|
const timeFilterName = new URLSearchParams(search).get(TIME_FILTER_QUERY_PARAM) || undefined;
|
2025-12-08 22:40:16 +01:00
|
|
|
|
|
|
|
|
const filteredSegments = segments.filter((s) => s !== 'catalog');
|
|
|
|
|
if (filteredSegments[0] === 'all') {
|
2026-04-18 15:58:27 +07:00
|
|
|
return { viewType: 'all', timeFilterName };
|
2025-12-08 22:40:16 +01:00
|
|
|
}
|
|
|
|
|
if (filteredSegments[0] === 'subs') {
|
2026-04-18 15:58:27 +07:00
|
|
|
return { viewType: 'subs', timeFilterName };
|
2025-12-08 22:40:16 +01:00
|
|
|
}
|
|
|
|
|
if (filteredSegments[0] === 'mod') {
|
2026-04-18 15:58:27 +07:00
|
|
|
return { viewType: 'mod', timeFilterName };
|
2025-12-08 22:40:16 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
viewType: 'board',
|
|
|
|
|
boardIdentifier: filteredSegments[0],
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
interface CachedFeedWrapperProps {
|
|
|
|
|
feed: CachedFeed;
|
|
|
|
|
isVisible: boolean;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const CachedFeedWrapper = ({ feed, isVisible }: CachedFeedWrapperProps) => {
|
|
|
|
|
const context = parseFeedKey(feed.key);
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<div className={isVisible ? styles.visible : styles.hidden}>
|
|
|
|
|
{feed.type === 'catalog' ? (
|
2026-04-18 15:58:27 +07:00
|
|
|
<Catalog
|
|
|
|
|
feedCacheKey={feed.key}
|
|
|
|
|
viewType={context.viewType}
|
|
|
|
|
boardIdentifier={context.boardIdentifier}
|
|
|
|
|
timeFilterNameFromCache={context.timeFilterName}
|
|
|
|
|
isVisible={isVisible}
|
|
|
|
|
/>
|
2025-12-08 22:40:16 +01:00
|
|
|
) : (
|
2026-04-18 15:58:27 +07:00
|
|
|
<Board
|
|
|
|
|
feedCacheKey={feed.key}
|
|
|
|
|
viewType={context.viewType}
|
|
|
|
|
boardIdentifier={context.boardIdentifier}
|
|
|
|
|
timeFilterNameFromCache={context.timeFilterName}
|
|
|
|
|
isVisible={isVisible}
|
|
|
|
|
/>
|
2025-12-08 22:40:16 +01:00
|
|
|
)}
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const FeedCacheContainer = () => {
|
|
|
|
|
const location = useLocation();
|
|
|
|
|
const { cachedFeeds, accessFeed } = useFeedCacheStore();
|
|
|
|
|
|
2026-04-18 15:58:27 +07:00
|
|
|
const currentFeedKey = getFeedCacheKey(location.pathname, location.search);
|
2025-12-08 22:40:16 +01:00
|
|
|
const isOnFeedRoute = isFeedRoute(location.pathname);
|
|
|
|
|
const feedType = getFeedType(location.pathname);
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (isOnFeedRoute && currentFeedKey && feedType) {
|
|
|
|
|
accessFeed(currentFeedKey, feedType);
|
|
|
|
|
}
|
|
|
|
|
}, [currentFeedKey, isOnFeedRoute, feedType, accessFeed]);
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<>
|
|
|
|
|
{cachedFeeds.map((feed) => (
|
|
|
|
|
<CachedFeedWrapper key={feed.key} feed={feed} isVisible={isOnFeedRoute && feed.key === currentFeedKey} />
|
|
|
|
|
))}
|
|
|
|
|
</>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export default FeedCacheContainer;
|