diff --git a/packages/web/src/components/PageComponents/Messages/MessageItem.tsx b/packages/web/src/components/PageComponents/Messages/MessageItem.tsx
index acf89a63..c45e8f5d 100644
--- a/packages/web/src/components/PageComponents/Messages/MessageItem.tsx
+++ b/packages/web/src/components/PageComponents/Messages/MessageItem.tsx
@@ -1,4 +1,5 @@
import { Avatar } from "@components/UI/Avatar.tsx";
+import { Skeleton } from "@components/UI/Skeleton.tsx";
import {
Tooltip,
TooltipArrow,
@@ -51,6 +52,26 @@ export const MessageItem = ({ message }: MessageItemProps) => {
const { getNode, getMyNode } = useNodeDB();
const { t, i18n } = useTranslation("messages");
+ const myNodeNum = useMemo(() => getMyNode()?.num, [getMyNode]);
+
+ // Show loading state when myNodeNum is not yet available
+ if (myNodeNum === undefined) {
+ return (
+
+
+
+ );
+ }
+
const MESSAGE_STATUS_MAP = useMemo(
(): Record => ({
[MessageState.Ack]: {
@@ -96,8 +117,6 @@ export const MessageItem = ({ message }: MessageItemProps) => {
return message.from != null ? getNode(message.from) : null;
}, [getNode, message.from]);
- const myNodeNum = useMemo(() => getMyNode().num, [getMyNode]);
-
const { displayName, shortName, isFavorite } = useMemo(() => {
const userIdHex = message.from.toString(16).toUpperCase().padStart(2, "0");
const last4 = userIdHex.slice(-4);
diff --git a/packages/web/src/components/UI/Skeleton.tsx b/packages/web/src/components/UI/Skeleton.tsx
new file mode 100644
index 00000000..dc8e3744
--- /dev/null
+++ b/packages/web/src/components/UI/Skeleton.tsx
@@ -0,0 +1,15 @@
+import { cn } from "@core/utils/cn.ts";
+
+function Skeleton({
+ className,
+ ...props
+}: React.HTMLAttributes) {
+ return (
+
+ );
+}
+
+export { Skeleton };