+
-
+
+
@@ -199,3 +205,38 @@ export const EntryItem: FC
= memo(({ entryId, view }) => {
if (!entry) return
return
})
+
+const SkeletonItemMap = {
+ [FeedViewType.Articles]: ArticleItemSkeleton,
+ [FeedViewType.SocialMedia]: SocialMediaItemSkeleton,
+ [FeedViewType.Pictures]: PictureItemSkeleton,
+ [FeedViewType.Videos]: VideoItemSkeleton,
+ [FeedViewType.Audios]: AudioItemSkeleton,
+ [FeedViewType.Notifications]: NotificationItemSkeleton,
+}
+
+const LoadingCircleFallback = (
+
+
+
+)
+export const EntryItemSkeleton: FC<{ view: FeedViewType }> = memo(
+ ({ view }) => {
+ const SkeletonItem = SkeletonItemMap[view]
+ return SkeletonItem ?
+ (
+ {createSkeletonItems(SkeletonItem)}
+ ) :
+ (
+ LoadingCircleFallback
+ )
+ },
+)
+
+const createSkeletonItems = (element: ReactNode) => {
+ const children = [] as ReactNode[]
+ for (let i = 0; i < 10; i++) {
+ children.push(element)
+ }
+ return children
+}
diff --git a/src/renderer/src/modules/entry-column/notification-item.tsx b/src/renderer/src/modules/entry-column/notification-item.tsx
index b695fea03..024a45fee 100644
--- a/src/renderer/src/modules/entry-column/notification-item.tsx
+++ b/src/renderer/src/modules/entry-column/notification-item.tsx
@@ -2,8 +2,35 @@ import { ListItem } from "@renderer/modules/entry-column/list-item-template"
import type { UniversalItemProps } from "./types"
-export function NotificationItem({ entryId, entryPreview, translation }: UniversalItemProps) {
+export function NotificationItem({
+ entryId,
+ entryPreview,
+ translation,
+}: UniversalItemProps) {
return (
-
+
)
}
+
+export const NotificationItemSkeleton = (
+
+)
diff --git a/src/renderer/src/modules/entry-column/picture-item.tsx b/src/renderer/src/modules/entry-column/picture-item.tsx
index b0c7caaad..1cfa6deef 100644
--- a/src/renderer/src/modules/entry-column/picture-item.tsx
+++ b/src/renderer/src/modules/entry-column/picture-item.tsx
@@ -44,3 +44,28 @@ export function PictureItem({
)
}
+
+export const PictureItemSkeleton = (
+
+)
diff --git a/src/renderer/src/modules/entry-column/social-media-item.tsx b/src/renderer/src/modules/entry-column/social-media-item.tsx
index 5d1537886..4065663f8 100644
--- a/src/renderer/src/modules/entry-column/social-media-item.tsx
+++ b/src/renderer/src/modules/entry-column/social-media-item.tsx
@@ -5,9 +5,7 @@ import { Media } from "@renderer/components/ui/media"
import { usePreviewMedia } from "@renderer/components/ui/media/hooks"
import { useAsRead } from "@renderer/hooks/biz/useAsRead"
import { useEntryActions } from "@renderer/hooks/biz/useEntryActions"
-import {
- useRouteParamsSelector,
-} from "@renderer/hooks/biz/useRouteParams"
+import { useRouteParamsSelector } from "@renderer/hooks/biz/useRouteParams"
import { cn } from "@renderer/lib/utils"
import { useEntry } from "@renderer/store/entry/hooks"
import { useFeedById } from "@renderer/store/feed"
@@ -136,3 +134,39 @@ const ActionBar = ({ entryId }: { entryId: string }) => {
)
}
+
+export const SocialMediaItemSkeleton = (
+
+)
diff --git a/src/renderer/src/modules/entry-column/video-item.tsx b/src/renderer/src/modules/entry-column/video-item.tsx
index 133747940..cd4b5af90 100644
--- a/src/renderer/src/modules/entry-column/video-item.tsx
+++ b/src/renderer/src/modules/entry-column/video-item.tsx
@@ -137,3 +137,28 @@ const PreviewVideoModalContent: ModalContentComponent<{
)
}
+
+export const VideoItemSkeleton = (
+
+)
diff --git a/src/renderer/src/styles/tailwind-extend.css b/src/renderer/src/styles/tailwind-extend.css
index 88edaa0fb..b6facc15e 100644
--- a/src/renderer/src/styles/tailwind-extend.css
+++ b/src/renderer/src/styles/tailwind-extend.css
@@ -261,3 +261,13 @@
}
}
}
+
+@layer utilities {
+ .scrollbar-none {
+ scrollbar-width: none;
+ -ms-overflow-style: none;
+ }
+ .scrollbar-none::-webkit-scrollbar {
+ display: none;
+ }
+}