-
{props.title}
+
0}>
+
+ 1,
+ [styles.articleMode]: true,
+ [styles.ArticleCardSwiper]: props.slides?.length > 1
+ })}
+ >
+
+
-
-
-
-
0}>
- }>
- }>
-
-
(mainSwipeRef = el)}
- centered-slides={true}
- observer={true}
- space-between={10}
- breakpoints={{
- 576: { spaceBetween: 20, slidesPerView: 1.5 },
- 992: { spaceBetween: 52, slidesPerView: 1.5 }
- }}
- round-lengths={true}
- loop={true}
- speed={800}
- autoplay={{
- disableOnInteraction: false,
- delay: 6000,
- pauseOnMouseEnter: true
- }}
- >
-
- {(slide, index) => (
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
- // @ts-ignore
-
-
-
- )}
-
-
-
mainSwipeRef?.swiper.slidePrev()}
- >
-
+
+
+
0}>
+ }>
+ }>
+
+
(mainSwipeRef = el)}
+ centered-slides={true}
+ observer={true}
+ space-between={10}
+ breakpoints={{
+ 576: { spaceBetween: 20, slidesPerView: 1.5 },
+ 992: { spaceBetween: 52, slidesPerView: 1.5 }
+ }}
+ round-lengths={true}
+ loop={true}
+ speed={800}
+ autoplay={{
+ disableOnInteraction: false,
+ delay: 6000,
+ pauseOnMouseEnter: true
+ }}
+ >
+
+ {(slide, index) => (
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+ // @ts-ignore
+
+
+
+ )}
+
+
+
mainSwipeRef?.swiper.slidePrev()}
+ >
+
+
+
mainSwipeRef?.swiper.slideNext()}
+ >
+
+
- mainSwipeRef?.swiper.slideNext()}
- >
-
-
-
+
-
+
-
-
+
+
)
}
diff --git a/src/routes/expo/[...layout].tsx b/src/routes/expo/[...layout].tsx
index fe807336..599d46f2 100644
--- a/src/routes/expo/[...layout].tsx
+++ b/src/routes/expo/[...layout].tsx
@@ -1,8 +1,10 @@
import { Params, RouteSectionProps, createAsync } from '@solidjs/router'
-import { Show, createEffect, createSignal, on } from 'solid-js'
+import { Show, createEffect, createMemo, createSignal, on } from 'solid-js'
+import { isServer } from 'solid-js/web'
import { TopicsNav } from '~/components/HeaderNav/TopicsNav'
import { Expo, ExpoNav } from '~/components/Views/ExpoView'
import { LoadMoreItems, LoadMoreWrapper } from '~/components/_shared/LoadMoreWrapper'
+import { Loading } from '~/components/_shared/Loading'
import { PageLayout } from '~/components/_shared/PageLayout'
import { EXPO_LAYOUTS, EXPO_TITLES, SHOUTS_PER_PAGE, useFeed } from '~/context/feed'
import { useLocalize } from '~/context/localize'
@@ -18,7 +20,7 @@ const fetchExpoShouts = async (layouts: string[]) => {
limit: SHOUTS_PER_PAGE,
offset: 0
} as LoadShoutsOptions)
- return result || []
+ return result
}
export const route = {
@@ -33,14 +35,14 @@ export default (props: RouteSectionProps
) => {
const { t } = useLocalize()
const { expoFeed, setExpoFeed, feedByLayout } = useFeed()
const [loadMoreVisible, setLoadMoreVisible] = createSignal(false)
- const getTitle = (l?: string) => EXPO_TITLES[(l as ExpoLayoutType) || '']
+ const getTitle = createMemo(() => (l?: string) => EXPO_TITLES[(l as ExpoLayoutType) || ''])
- const shouts = createAsync(
- async () =>
- props.data || (await fetchExpoShouts(props.params.layout ? [props.params.layout] : EXPO_LAYOUTS))
+ const shouts = createAsync(async () =>
+ isServer
+ ? props.data
+ : await fetchExpoShouts(props.params.layout ? [props.params.layout] : EXPO_LAYOUTS)
)
- // Функция для загрузки дополнительных шотов
const loadMore = async () => {
saveScrollPosition()
const limit = SHOUTS_PER_PAGE
@@ -48,46 +50,52 @@ export default (props: RouteSectionProps) => {
const offset = expoFeed()?.length || 0
const filters: LoadShoutsFilters = { layouts, featured: true }
const options: LoadShoutsOptions = { filters, limit, offset }
- const shoutsFetcher = loadShouts(options)
- const result = await shoutsFetcher()
+ const fetcher = await loadShouts(options)
+ const result = (await fetcher()) || []
setLoadMoreVisible(Boolean(result?.length))
- if (result) {
+ if (result && Array.isArray(result)) {
setExpoFeed((prev) => Array.from(new Set([...(prev || []), ...result])).sort(byCreated))
}
restoreScrollPosition()
return result as LoadMoreItems
}
- // Эффект для загрузки данных при изменении layout
+
createEffect(
on(
- () => props.params.layout as ExpoLayoutType,
- async (layout?: ExpoLayoutType) => {
- const layouts = layout ? [layout] : EXPO_LAYOUTS
- const offset = (layout ? feedByLayout()[layout]?.length : expoFeed()?.length) || 0
+ () => props.params.layout,
+ async (currentLayout) => {
+ const layouts = currentLayout ? [currentLayout] : EXPO_LAYOUTS
+ const offset = (currentLayout ? feedByLayout()[currentLayout]?.length : expoFeed()?.length) || 0
const options: LoadShoutsOptions = {
filters: { layouts, featured: true },
limit: SHOUTS_PER_PAGE,
offset
}
- const shoutsFetcher = loadShouts(options)
- const result = await shoutsFetcher()
- setExpoFeed(result || [])
+ const result = await loadShouts(options)
+ if (result && Array.isArray(result)) {
+ setExpoFeed(result)
+ } else {
+ setExpoFeed([])
+ }
}
)
)
+
return (
-
-
-
- {(sss: Shout[]) => }
-
-
+
+ } keyed>
+ {(sss) => (
+
+
+
+ )}
+
)
}