mirror of
https://github.com/Athou/commafeed.git
synced 2026-03-21 21:37:29 +00:00
add button in the header to open entry link (#1333)
This commit is contained in:
@@ -1,15 +1,15 @@
|
|||||||
import { Box, Divider, type MantineRadius, type MantineSpacing, Paper } from "@mantine/core"
|
import { Box, Divider, type MantineRadius, type MantineSpacing, Paper } from "@mantine/core"
|
||||||
import { Constants } from "app/constants"
|
import { Constants } from "app/constants"
|
||||||
import { type Entry, type ViewMode } from "app/types"
|
import { type Entry, type ViewMode } from "app/types"
|
||||||
|
import { FeedEntryCompactHeader } from "components/content/header/FeedEntryCompactHeader"
|
||||||
|
import { FeedEntryHeader } from "components/content/header/FeedEntryHeader"
|
||||||
import { useViewMode } from "hooks/useViewMode"
|
import { useViewMode } from "hooks/useViewMode"
|
||||||
import React from "react"
|
import React from "react"
|
||||||
import { useSwipeable } from "react-swipeable"
|
import { useSwipeable } from "react-swipeable"
|
||||||
import { tss } from "tss"
|
import { tss } from "tss"
|
||||||
import { FeedEntryBody } from "./FeedEntryBody"
|
import { FeedEntryBody } from "./FeedEntryBody"
|
||||||
import { FeedEntryCompactHeader } from "./FeedEntryCompactHeader"
|
|
||||||
import { FeedEntryContextMenu } from "./FeedEntryContextMenu"
|
import { FeedEntryContextMenu } from "./FeedEntryContextMenu"
|
||||||
import { FeedEntryFooter } from "./FeedEntryFooter"
|
import { FeedEntryFooter } from "./FeedEntryFooter"
|
||||||
import { FeedEntryHeader } from "./FeedEntryHeader"
|
|
||||||
|
|
||||||
interface FeedEntryProps {
|
interface FeedEntryProps {
|
||||||
entry: Entry
|
entry: Entry
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
import { Box, Text } from "@mantine/core"
|
import { Box, Text } from "@mantine/core"
|
||||||
import { type Entry } from "app/types"
|
import { type Entry } from "app/types"
|
||||||
|
import { FeedFavicon } from "components/content/FeedFavicon"
|
||||||
|
import { OpenExternalLink } from "components/content/header/OpenExternalLink"
|
||||||
import { RelativeDate } from "components/RelativeDate"
|
import { RelativeDate } from "components/RelativeDate"
|
||||||
import { OnDesktop } from "components/responsive/OnDesktop"
|
import { OnDesktop } from "components/responsive/OnDesktop"
|
||||||
import { tss } from "tss"
|
import { tss } from "tss"
|
||||||
import { FeedEntryTitle } from "./FeedEntryTitle"
|
import { FeedEntryTitle } from "./FeedEntryTitle"
|
||||||
import { FeedFavicon } from "./FeedFavicon"
|
|
||||||
|
|
||||||
export interface FeedEntryHeaderProps {
|
export interface FeedEntryHeaderProps {
|
||||||
entry: Entry
|
entry: Entry
|
||||||
@@ -61,6 +62,7 @@ export function FeedEntryCompactHeader(props: FeedEntryHeaderProps) {
|
|||||||
<RelativeDate date={props.entry.date} />
|
<RelativeDate date={props.entry.date} />
|
||||||
</Text>
|
</Text>
|
||||||
</OnDesktop>
|
</OnDesktop>
|
||||||
|
<OpenExternalLink entry={props.entry} />
|
||||||
</Box>
|
</Box>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -1,9 +1,10 @@
|
|||||||
import { Box, Space, Text } from "@mantine/core"
|
import { Box, Space, Text } from "@mantine/core"
|
||||||
import { type Entry } from "app/types"
|
import { type Entry } from "app/types"
|
||||||
|
import { FeedFavicon } from "components/content/FeedFavicon"
|
||||||
|
import { OpenExternalLink } from "components/content/header/OpenExternalLink"
|
||||||
import { RelativeDate } from "components/RelativeDate"
|
import { RelativeDate } from "components/RelativeDate"
|
||||||
import { tss } from "tss"
|
import { tss } from "tss"
|
||||||
import { FeedEntryTitle } from "./FeedEntryTitle"
|
import { FeedEntryTitle } from "./FeedEntryTitle"
|
||||||
import { FeedFavicon } from "./FeedFavicon"
|
|
||||||
|
|
||||||
export interface FeedEntryHeaderProps {
|
export interface FeedEntryHeaderProps {
|
||||||
entry: Entry
|
entry: Entry
|
||||||
@@ -15,10 +16,15 @@ const useStyles = tss
|
|||||||
read: boolean
|
read: boolean
|
||||||
}>()
|
}>()
|
||||||
.create(({ colorScheme, read }) => ({
|
.create(({ colorScheme, read }) => ({
|
||||||
headerText: {
|
main: {
|
||||||
|
display: "flex",
|
||||||
|
alignItems: "flex-start",
|
||||||
|
justifyContent: "space-between",
|
||||||
|
},
|
||||||
|
mainText: {
|
||||||
fontWeight: colorScheme === "light" && !read ? "bold" : "inherit",
|
fontWeight: colorScheme === "light" && !read ? "bold" : "inherit",
|
||||||
},
|
},
|
||||||
headerSubtext: {
|
details: {
|
||||||
display: "flex",
|
display: "flex",
|
||||||
alignItems: "center",
|
alignItems: "center",
|
||||||
fontSize: "90%",
|
fontSize: "90%",
|
||||||
@@ -31,10 +37,13 @@ export function FeedEntryHeader(props: FeedEntryHeaderProps) {
|
|||||||
})
|
})
|
||||||
return (
|
return (
|
||||||
<Box>
|
<Box>
|
||||||
<Box className={classes.headerText}>
|
<Box className={classes.main}>
|
||||||
<FeedEntryTitle entry={props.entry} />
|
<Box className={classes.mainText}>
|
||||||
|
<FeedEntryTitle entry={props.entry} />
|
||||||
|
</Box>
|
||||||
|
<OpenExternalLink entry={props.entry} />
|
||||||
</Box>
|
</Box>
|
||||||
<Box className={classes.headerSubtext}>
|
<Box className={classes.details}>
|
||||||
<FeedFavicon url={props.entry.iconUrl} />
|
<FeedFavicon url={props.entry.iconUrl} />
|
||||||
<Space w={6} />
|
<Space w={6} />
|
||||||
<Text c="dimmed">
|
<Text c="dimmed">
|
||||||
@@ -44,7 +53,7 @@ export function FeedEntryHeader(props: FeedEntryHeaderProps) {
|
|||||||
</Text>
|
</Text>
|
||||||
</Box>
|
</Box>
|
||||||
{props.expanded && (
|
{props.expanded && (
|
||||||
<Box className={classes.headerSubtext}>
|
<Box className={classes.details}>
|
||||||
<Text c="dimmed">
|
<Text c="dimmed">
|
||||||
{props.entry.author && <span>by {props.entry.author}</span>}
|
{props.entry.author && <span>by {props.entry.author}</span>}
|
||||||
{props.entry.author && props.entry.categories && <span> · </span>}
|
{props.entry.author && props.entry.categories && <span> · </span>}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
import { Trans } from "@lingui/macro"
|
||||||
|
import { ActionIcon, Anchor, Tooltip } from "@mantine/core"
|
||||||
|
import { markEntry } from "app/entries/thunks"
|
||||||
|
import { useAppDispatch } from "app/store"
|
||||||
|
import { type Entry } from "app/types"
|
||||||
|
import { TbExternalLink } from "react-icons/tb"
|
||||||
|
|
||||||
|
export function OpenExternalLink(props: { entry: Entry }) {
|
||||||
|
const dispatch = useAppDispatch()
|
||||||
|
const onClick = (e: React.MouseEvent) => {
|
||||||
|
e.stopPropagation()
|
||||||
|
dispatch(
|
||||||
|
markEntry({
|
||||||
|
entry: props.entry,
|
||||||
|
read: true,
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Anchor href={props.entry.url} target="_blank" rel="noreferrer" onClick={onClick}>
|
||||||
|
<Tooltip label={<Trans>Open link</Trans>}>
|
||||||
|
<ActionIcon variant="transparent" c="dimmed">
|
||||||
|
<TbExternalLink />
|
||||||
|
</ActionIcon>
|
||||||
|
</Tooltip>
|
||||||
|
</Anchor>
|
||||||
|
)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user