Combine SubtleWebHover and SubtleHover, default to web only for all cases (#9188)
This commit is contained in:
@@ -23,7 +23,7 @@ import {ContentHider} from '#/components/moderation/ContentHider'
|
|||||||
import {PostAlerts} from '#/components/moderation/PostAlerts'
|
import {PostAlerts} from '#/components/moderation/PostAlerts'
|
||||||
import {RichText} from '#/components/RichText'
|
import {RichText} from '#/components/RichText'
|
||||||
import {Embed as StarterPackCard} from '#/components/StarterPack/StarterPackCard'
|
import {Embed as StarterPackCard} from '#/components/StarterPack/StarterPackCard'
|
||||||
import {SubtleWebHover} from '#/components/SubtleWebHover'
|
import {SubtleHover} from '#/components/SubtleHover'
|
||||||
import * as bsky from '#/types/bsky'
|
import * as bsky from '#/types/bsky'
|
||||||
import {
|
import {
|
||||||
type Embed as TEmbed,
|
type Embed as TEmbed,
|
||||||
@@ -284,7 +284,7 @@ export function QuoteEmbed({
|
|||||||
childContainerStyle={[a.pt_sm]}>
|
childContainerStyle={[a.pt_sm]}>
|
||||||
{({active}) => (
|
{({active}) => (
|
||||||
<>
|
<>
|
||||||
{!active && <SubtleWebHover hover={hover} style={[a.rounded_md]} />}
|
{!active && <SubtleHover hover={hover} style={[a.rounded_md]} />}
|
||||||
<Link
|
<Link
|
||||||
style={[!active && a.p_md]}
|
style={[!active && a.p_md]}
|
||||||
hoverStyle={{borderColor: pal.colors.borderLinkHover}}
|
hoverStyle={{borderColor: pal.colors.borderLinkHover}}
|
||||||
|
|||||||
@@ -1,8 +1,15 @@
|
|||||||
import {View} from 'react-native'
|
import {View} from 'react-native'
|
||||||
|
|
||||||
|
import {isTouchDevice} from '#/lib/browser'
|
||||||
|
import {isNative, isWeb} from '#/platform/detection'
|
||||||
import {atoms as a, useTheme, type ViewStyleProp} from '#/alf'
|
import {atoms as a, useTheme, type ViewStyleProp} from '#/alf'
|
||||||
|
|
||||||
export function SubtleHover({style, hover}: ViewStyleProp & {hover: boolean}) {
|
export function SubtleHover({
|
||||||
|
style,
|
||||||
|
hover,
|
||||||
|
web = true,
|
||||||
|
native = false,
|
||||||
|
}: ViewStyleProp & {hover: boolean; web?: boolean; native?: boolean}) {
|
||||||
const t = useTheme()
|
const t = useTheme()
|
||||||
|
|
||||||
let opacity: number
|
let opacity: number
|
||||||
@@ -18,17 +25,34 @@ export function SubtleHover({style, hover}: ViewStyleProp & {hover: boolean}) {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
const el = (
|
||||||
<View
|
<View
|
||||||
style={[
|
style={[
|
||||||
a.absolute,
|
a.absolute,
|
||||||
a.inset_0,
|
a.inset_0,
|
||||||
a.pointer_events_none,
|
a.pointer_events_none,
|
||||||
a.transition_opacity,
|
a.transition_opacity,
|
||||||
t.atoms.bg_contrast_25,
|
t.atoms.bg_contrast_50,
|
||||||
style,
|
style,
|
||||||
{opacity: hover ? opacity : 0},
|
{opacity: hover ? opacity : 0},
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (hover) {
|
||||||
|
console.log({
|
||||||
|
isWeb,
|
||||||
|
web,
|
||||||
|
isNative,
|
||||||
|
native,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isWeb && web) {
|
||||||
|
return isTouchDevice ? null : el
|
||||||
|
} else if (isNative && native) {
|
||||||
|
return el
|
||||||
|
}
|
||||||
|
|
||||||
|
return null
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
import {type ViewStyleProp} from '#/alf'
|
|
||||||
|
|
||||||
export function SubtleWebHover({}: ViewStyleProp & {hover: boolean}) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
import {StyleSheet, View} from 'react-native'
|
|
||||||
|
|
||||||
import {isTouchDevice} from '#/lib/browser'
|
|
||||||
import {useTheme, type ViewStyleProp} from '#/alf'
|
|
||||||
|
|
||||||
export function SubtleWebHover({
|
|
||||||
style,
|
|
||||||
hover,
|
|
||||||
}: ViewStyleProp & {hover: boolean}) {
|
|
||||||
const t = useTheme()
|
|
||||||
if (isTouchDevice) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
let opacity = 0.5
|
|
||||||
switch (t.name) {
|
|
||||||
case 'dark':
|
|
||||||
opacity = 0.4
|
|
||||||
break
|
|
||||||
case 'dim':
|
|
||||||
opacity = 0.45
|
|
||||||
break
|
|
||||||
case 'light':
|
|
||||||
opacity = 0.5
|
|
||||||
break
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
<View
|
|
||||||
style={[
|
|
||||||
t.atoms.bg_contrast_25,
|
|
||||||
styles.container,
|
|
||||||
{opacity: hover ? opacity : 0},
|
|
||||||
style,
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
|
||||||
container: {
|
|
||||||
position: 'absolute',
|
|
||||||
left: 0,
|
|
||||||
right: 0,
|
|
||||||
bottom: 0,
|
|
||||||
top: 0,
|
|
||||||
pointerEvents: 'none',
|
|
||||||
// @ts-ignore web only
|
|
||||||
transition: '0.15s ease-in-out opacity',
|
|
||||||
},
|
|
||||||
})
|
|
||||||
@@ -41,7 +41,7 @@ import {ShowMoreTextButton} from '#/components/Post/ShowMoreTextButton'
|
|||||||
import {PostControls} from '#/components/PostControls'
|
import {PostControls} from '#/components/PostControls'
|
||||||
import {RichText} from '#/components/RichText'
|
import {RichText} from '#/components/RichText'
|
||||||
import * as Skele from '#/components/Skeleton'
|
import * as Skele from '#/components/Skeleton'
|
||||||
import {SubtleWebHover} from '#/components/SubtleWebHover'
|
import {SubtleHover} from '#/components/SubtleHover'
|
||||||
import {Text} from '#/components/Typography'
|
import {Text} from '#/components/Typography'
|
||||||
|
|
||||||
export type ThreadItemPostProps = {
|
export type ThreadItemPostProps = {
|
||||||
@@ -246,7 +246,7 @@ const ThreadItemPostInner = memo(function ThreadItemPostInner({
|
|||||||
const {isActive: live} = useActorStatus(post.author)
|
const {isActive: live} = useActorStatus(post.author)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SubtleHover>
|
<SubtleHoverWrapper>
|
||||||
<ThreadItemPostOuterWrapper item={item} overrides={overrides}>
|
<ThreadItemPostOuterWrapper item={item} overrides={overrides}>
|
||||||
<PostHider
|
<PostHider
|
||||||
testID={`postThreadItem-by-${post.author.handle}`}
|
testID={`postThreadItem-by-${post.author.handle}`}
|
||||||
@@ -339,11 +339,11 @@ const ThreadItemPostInner = memo(function ThreadItemPostInner({
|
|||||||
</View>
|
</View>
|
||||||
</PostHider>
|
</PostHider>
|
||||||
</ThreadItemPostOuterWrapper>
|
</ThreadItemPostOuterWrapper>
|
||||||
</SubtleHover>
|
</SubtleHoverWrapper>
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
function SubtleHover({children}: {children: ReactNode}) {
|
function SubtleHoverWrapper({children}: {children: ReactNode}) {
|
||||||
const {
|
const {
|
||||||
state: hover,
|
state: hover,
|
||||||
onIn: onHoverIn,
|
onIn: onHoverIn,
|
||||||
@@ -354,7 +354,7 @@ function SubtleHover({children}: {children: ReactNode}) {
|
|||||||
onPointerEnter={onHoverIn}
|
onPointerEnter={onHoverIn}
|
||||||
onPointerLeave={onHoverOut}
|
onPointerLeave={onHoverOut}
|
||||||
style={a.pointer}>
|
style={a.pointer}>
|
||||||
<SubtleWebHover hover={hover} />
|
<SubtleHover hover={hover} />
|
||||||
{children}
|
{children}
|
||||||
</View>
|
</View>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ import {ShowMoreTextButton} from '#/components/Post/ShowMoreTextButton'
|
|||||||
import {PostControls} from '#/components/PostControls'
|
import {PostControls} from '#/components/PostControls'
|
||||||
import {RichText} from '#/components/RichText'
|
import {RichText} from '#/components/RichText'
|
||||||
import * as Skele from '#/components/Skeleton'
|
import * as Skele from '#/components/Skeleton'
|
||||||
import {SubtleWebHover} from '#/components/SubtleWebHover'
|
import {SubtleHover} from '#/components/SubtleHover'
|
||||||
import {Text} from '#/components/Typography'
|
import {Text} from '#/components/Typography'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -310,7 +310,7 @@ const ThreadItemTreePostInner = memo(function ThreadItemTreePostInner({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<ThreadItemTreePostOuterWrapper item={item}>
|
<ThreadItemTreePostOuterWrapper item={item}>
|
||||||
<SubtleHover>
|
<SubtleHoverWrapper>
|
||||||
<PostHider
|
<PostHider
|
||||||
testID={`postThreadItem-by-${post.author.handle}`}
|
testID={`postThreadItem-by-${post.author.handle}`}
|
||||||
href={postHref}
|
href={postHref}
|
||||||
@@ -381,12 +381,12 @@ const ThreadItemTreePostInner = memo(function ThreadItemTreePostInner({
|
|||||||
</View>
|
</View>
|
||||||
</ThreadItemTreePostInnerWrapper>
|
</ThreadItemTreePostInnerWrapper>
|
||||||
</PostHider>
|
</PostHider>
|
||||||
</SubtleHover>
|
</SubtleHoverWrapper>
|
||||||
</ThreadItemTreePostOuterWrapper>
|
</ThreadItemTreePostOuterWrapper>
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
function SubtleHover({children}: {children: React.ReactNode}) {
|
function SubtleHoverWrapper({children}: {children: React.ReactNode}) {
|
||||||
const {
|
const {
|
||||||
state: hover,
|
state: hover,
|
||||||
onIn: onHoverIn,
|
onIn: onHoverIn,
|
||||||
@@ -397,7 +397,7 @@ function SubtleHover({children}: {children: React.ReactNode}) {
|
|||||||
onPointerEnter={onHoverIn}
|
onPointerEnter={onHoverIn}
|
||||||
onPointerLeave={onHoverOut}
|
onPointerLeave={onHoverOut}
|
||||||
style={[a.flex_1, a.pointer]}>
|
style={[a.flex_1, a.pointer]}>
|
||||||
<SubtleWebHover hover={hover} />
|
<SubtleHover hover={hover} />
|
||||||
{children}
|
{children}
|
||||||
</View>
|
</View>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ import {InlineLinkText, Link} from '#/components/Link'
|
|||||||
import * as MediaPreview from '#/components/MediaPreview'
|
import * as MediaPreview from '#/components/MediaPreview'
|
||||||
import {ProfileHoverCard} from '#/components/ProfileHoverCard'
|
import {ProfileHoverCard} from '#/components/ProfileHoverCard'
|
||||||
import {Notification as StarterPackCard} from '#/components/StarterPack/StarterPackCard'
|
import {Notification as StarterPackCard} from '#/components/StarterPack/StarterPackCard'
|
||||||
import {SubtleWebHover} from '#/components/SubtleWebHover'
|
import {SubtleHover} from '#/components/SubtleHover'
|
||||||
import {Text} from '#/components/Typography'
|
import {Text} from '#/components/Typography'
|
||||||
import {useSimpleVerificationState} from '#/components/verification'
|
import {useSimpleVerificationState} from '#/components/verification'
|
||||||
import {VerificationCheck} from '#/components/verification/VerificationCheck'
|
import {VerificationCheck} from '#/components/verification/VerificationCheck'
|
||||||
@@ -613,7 +613,7 @@ let NotificationFeedItem = ({
|
|||||||
}}>
|
}}>
|
||||||
{({hovered}) => (
|
{({hovered}) => (
|
||||||
<>
|
<>
|
||||||
<SubtleWebHover hover={hovered} />
|
<SubtleHover hover={hovered} />
|
||||||
<View style={[styles.layoutIcon, a.pr_sm]}>
|
<View style={[styles.layoutIcon, a.pr_sm]}>
|
||||||
{/* TODO: Prevent conditional rendering and move toward composable
|
{/* TODO: Prevent conditional rendering and move toward composable
|
||||||
notifications for clearer accessibility labeling */}
|
notifications for clearer accessibility labeling */}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ import {PostRepliedTo} from '#/components/Post/PostRepliedTo'
|
|||||||
import {ShowMoreTextButton} from '#/components/Post/ShowMoreTextButton'
|
import {ShowMoreTextButton} from '#/components/Post/ShowMoreTextButton'
|
||||||
import {PostControls} from '#/components/PostControls'
|
import {PostControls} from '#/components/PostControls'
|
||||||
import {RichText} from '#/components/RichText'
|
import {RichText} from '#/components/RichText'
|
||||||
import {SubtleWebHover} from '#/components/SubtleWebHover'
|
import {SubtleHover} from '#/components/SubtleHover'
|
||||||
import * as bsky from '#/types/bsky'
|
import * as bsky from '#/types/bsky'
|
||||||
|
|
||||||
export function Post({
|
export function Post({
|
||||||
@@ -167,7 +167,7 @@ function PostInner({
|
|||||||
onPointerLeave={() => {
|
onPointerLeave={() => {
|
||||||
setHover(false)
|
setHover(false)
|
||||||
}}>
|
}}>
|
||||||
<SubtleWebHover hover={hover} />
|
<SubtleHover hover={hover} />
|
||||||
{showReplyLine && <View style={styles.replyLine} />}
|
{showReplyLine && <View style={styles.replyLine} />}
|
||||||
<View style={styles.layout}>
|
<View style={styles.layout}>
|
||||||
<View style={styles.layoutAvi}>
|
<View style={styles.layoutAvi}>
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ import {PostControls} from '#/components/PostControls'
|
|||||||
import {DiscoverDebug} from '#/components/PostControls/DiscoverDebug'
|
import {DiscoverDebug} from '#/components/PostControls/DiscoverDebug'
|
||||||
import {ProfileHoverCard} from '#/components/ProfileHoverCard'
|
import {ProfileHoverCard} from '#/components/ProfileHoverCard'
|
||||||
import {RichText} from '#/components/RichText'
|
import {RichText} from '#/components/RichText'
|
||||||
import {SubtleWebHover} from '#/components/SubtleWebHover'
|
import {SubtleHover} from '#/components/SubtleHover'
|
||||||
import * as bsky from '#/types/bsky'
|
import * as bsky from '#/types/bsky'
|
||||||
|
|
||||||
interface FeedItemProps {
|
interface FeedItemProps {
|
||||||
@@ -317,7 +317,7 @@ let FeedItemInner = ({
|
|||||||
onPointerLeave={() => {
|
onPointerLeave={() => {
|
||||||
setHover(false)
|
setHover(false)
|
||||||
}}>
|
}}>
|
||||||
<SubtleWebHover hover={hover} />
|
<SubtleHover hover={hover} />
|
||||||
<View style={{flexDirection: 'row', gap: 10, paddingLeft: 8}}>
|
<View style={{flexDirection: 'row', gap: 10, paddingLeft: 8}}>
|
||||||
<View style={{width: 42}}>
|
<View style={{width: 42}}>
|
||||||
{isThreadChild && (
|
{isThreadChild && (
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import {useLingui} from '@lingui/react'
|
|||||||
import {usePalette} from '#/lib/hooks/usePalette'
|
import {usePalette} from '#/lib/hooks/usePalette'
|
||||||
import {makeProfileLink} from '#/lib/routes/links'
|
import {makeProfileLink} from '#/lib/routes/links'
|
||||||
import {useInteractionState} from '#/components/hooks/useInteractionState'
|
import {useInteractionState} from '#/components/hooks/useInteractionState'
|
||||||
import {SubtleWebHover} from '#/components/SubtleWebHover'
|
import {SubtleHover} from '#/components/SubtleHover'
|
||||||
import {Link} from '../util/Link'
|
import {Link} from '../util/Link'
|
||||||
import {Text} from '../util/text/Text'
|
import {Text} from '../util/text/Text'
|
||||||
|
|
||||||
@@ -33,7 +33,7 @@ export function ViewFullThread({uri}: {uri: string}) {
|
|||||||
noFeedback
|
noFeedback
|
||||||
onPointerEnter={onHoverIn}
|
onPointerEnter={onHoverIn}
|
||||||
onPointerLeave={onHoverOut}>
|
onPointerLeave={onHoverOut}>
|
||||||
<SubtleWebHover
|
<SubtleHover
|
||||||
hover={hover}
|
hover={hover}
|
||||||
// adjust position for visual alignment - the actual box has lots of top padding and not much bottom padding -sfn
|
// adjust position for visual alignment - the actual box has lots of top padding and not much bottom padding -sfn
|
||||||
style={{top: 8, bottom: -5}}
|
style={{top: 8, bottom: -5}}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import {atoms as a, useLayoutBreakpoints, useTheme, web} from '#/alf'
|
|||||||
import {useInteractionState} from '#/components/hooks/useInteractionState'
|
import {useInteractionState} from '#/components/hooks/useInteractionState'
|
||||||
import {ArrowTop_Stroke2_Corner0_Rounded as ArrowIcon} from '#/components/icons/Arrow'
|
import {ArrowTop_Stroke2_Corner0_Rounded as ArrowIcon} from '#/components/icons/Arrow'
|
||||||
import {CENTER_COLUMN_OFFSET} from '#/components/Layout'
|
import {CENTER_COLUMN_OFFSET} from '#/components/Layout'
|
||||||
import {SubtleWebHover} from '#/components/SubtleWebHover'
|
import {SubtleHover} from '#/components/SubtleHover'
|
||||||
|
|
||||||
export function LoadLatestBtn({
|
export function LoadLatestBtn({
|
||||||
onPress,
|
onPress,
|
||||||
@@ -91,7 +91,7 @@ export function LoadLatestBtn({
|
|||||||
targetScale={0.9}
|
targetScale={0.9}
|
||||||
onPointerEnter={onHoverIn}
|
onPointerEnter={onHoverIn}
|
||||||
onPointerLeave={onHoverOut}>
|
onPointerLeave={onHoverOut}>
|
||||||
<SubtleWebHover hover={hovered} style={[a.rounded_full]} />
|
<SubtleHover hover={hovered} style={[a.rounded_full]} />
|
||||||
<ArrowIcon
|
<ArrowIcon
|
||||||
size="md"
|
size="md"
|
||||||
style={[
|
style={[
|
||||||
|
|||||||
Reference in New Issue
Block a user