diff --git a/.changeset/tricky-rivers-think.md b/.changeset/tricky-rivers-think.md new file mode 100644 index 000000000..63f3584f9 --- /dev/null +++ b/.changeset/tricky-rivers-think.md @@ -0,0 +1,5 @@ +--- +"nostrudel": patch +--- + +Fixed keyboard shortcuts activating when replying to notification diff --git a/src/hooks/use-key-press-nav.ts b/src/hooks/use-key-press-nav.ts new file mode 100644 index 000000000..2381ff6c1 --- /dev/null +++ b/src/hooks/use-key-press-nav.ts @@ -0,0 +1,34 @@ +import { useKeyPressEvent } from "react-use"; +import { Handler } from "react-use/lib/useKey"; + +export default function useKeyPressNav(key: string, keydown?: Handler | null, keyup?: Handler | null) { + return useKeyPressEvent( + key, + keydown + ? (e) => { + // ignore if the user is focused on an input + if ( + document.activeElement instanceof HTMLInputElement || + document.activeElement instanceof HTMLTextAreaElement + ) { + return; + } + + keydown(e); + } + : undefined, + keyup + ? (e) => { + // ignore if the user is focused on an input + if ( + document.activeElement instanceof HTMLInputElement || + document.activeElement instanceof HTMLTextAreaElement + ) { + return; + } + + keyup(e); + } + : undefined, + ); +} diff --git a/src/views/notifications/components/notification-item.tsx b/src/views/notifications/components/notification-item.tsx index 00eecd041..eeffe743f 100644 --- a/src/views/notifications/components/notification-item.tsx +++ b/src/views/notifications/components/notification-item.tsx @@ -8,7 +8,7 @@ import { NostrEvent, isATag, isETag } from "../../../types/nostr-event"; import { getParsedZap } from "../../../helpers/nostr/zaps"; import { readablizeSats } from "../../../helpers/bolt11"; import { getThreadReferences, parseCoordinate } from "../../../helpers/nostr/event"; -import { EmbedEventPointer } from "../../../components/embed-event"; +import { EmbedEvent, EmbedEventPointer } from "../../../components/embed-event"; import EmbeddedUnknown from "../../../components/embed-event/event-types/embedded-unknown"; import { ErrorBoundary } from "../../../components/error-boundary"; import { TrustProvider } from "../../../providers/local/trust-provider"; @@ -33,6 +33,7 @@ import UserAvatar from "../../../components/user/user-avatar"; import UserName from "../../../components/user/user-name"; import { truncateId } from "../../../helpers/string"; import TextNoteContents from "../../../components/note/timeline-note/text-note-contents"; +import ArticleCard from "../../articles/components/article-card"; export const ExpandableToggleButton = ({ toggle, @@ -73,19 +74,34 @@ const ReplyNotification = forwardRef void }>( - ({ event, onClick }, ref) => ( - } - id={event.id} - pubkey={event.pubkey} - timestamp={event.created_at} - summary={event.content} - onClick={onClick} - > - - - ), + ({ event, onClick }, ref) => { + let content: ReactNode; + switch (event.kind) { + case kinds.LongFormArticle: + content = ; + break; + case kinds.ShortTextNote: + content = ; + break; + default: + content = ; + break; + } + + return ( + } + id={event.id} + pubkey={event.pubkey} + timestamp={event.created_at} + summary={event.content} + onClick={onClick} + > + {content} + + ); + }, ); const RepostNotification = forwardRef void }>( diff --git a/src/views/notifications/index.tsx b/src/views/notifications/index.tsx index 19d131ea6..4a949bfdf 100644 --- a/src/views/notifications/index.tsx +++ b/src/views/notifications/index.tsx @@ -1,8 +1,7 @@ import { memo, ReactNode, useCallback, useContext, useMemo } from "react"; -import { BreadcrumbLink, Button, ButtonGroup, Divider, Flex, Switch, Text } from "@chakra-ui/react"; +import { Button, ButtonGroup, Divider, Flex, Text } from "@chakra-ui/react"; import { Link as RouterLink } from "react-router-dom"; import dayjs, { Dayjs } from "dayjs"; -import { useKeyPressEvent } from "react-use"; import RequireCurrentAccount from "../../providers/route/require-current-account"; import IntersectionObserverProvider from "../../providers/local/intersection-observer"; @@ -20,6 +19,7 @@ import TimelineActionAndStatus from "../../components/timeline/timeline-action-a import FocusedContext from "./focused-context"; import useRouteStateValue from "../../hooks/use-route-state-value"; import readStatusService from "../../services/read-status"; +import useKeyPressNav from "../../hooks/use-key-press-nav"; // const DATE_FORMAT = "YYYY-MM-DD"; @@ -142,18 +142,18 @@ const NotificationsTimeline = memo( const navigateTop = () => setFocus(filteredEvents[0]?.id ?? ""); const navigateEnd = () => setFocus(filteredEvents[filteredEvents.length - 1]?.id ?? ""); - useKeyPressEvent("ArrowUp", navigatePrev); - useKeyPressEvent("ArrowDown", navigateNext); - useKeyPressEvent("ArrowLeft", navigatePrevUnread); - useKeyPressEvent("ArrowRight", navigateNextUnread); - useKeyPressEvent("k", navigatePrev); - useKeyPressEvent("h", navigatePrevUnread); - useKeyPressEvent("j", navigateNext); - useKeyPressEvent("l", navigateNextUnread); - useKeyPressEvent("H", navigateTop); - useKeyPressEvent("Home", navigateTop); - useKeyPressEvent("L", navigateEnd); - useKeyPressEvent("End", navigateEnd); + useKeyPressNav("ArrowUp", navigatePrev); + useKeyPressNav("ArrowDown", navigateNext); + useKeyPressNav("ArrowLeft", navigatePrevUnread); + useKeyPressNav("ArrowRight", navigateNextUnread); + useKeyPressNav("k", navigatePrev); + useKeyPressNav("h", navigatePrevUnread); + useKeyPressNav("j", navigateNext); + useKeyPressNav("l", navigateNextUnread); + useKeyPressNav("H", navigateTop); + useKeyPressNav("Home", navigateTop); + useKeyPressNav("L", navigateEnd); + useKeyPressNav("End", navigateEnd); if (filteredEvents.length === 0) return (