diff --git a/assets/icons/personPlus_filled_stroke2_corner0_rounded.svg b/assets/icons/personPlus_filled_stroke2_corner0_rounded.svg
new file mode 100644
index 0000000000..d46976d84b
--- /dev/null
+++ b/assets/icons/personPlus_filled_stroke2_corner0_rounded.svg
@@ -0,0 +1 @@
+
diff --git a/src/components/icons/Person.tsx b/src/components/icons/Person.tsx
index 7fceada533..399f7c0619 100644
--- a/src/components/icons/Person.tsx
+++ b/src/components/icons/Person.tsx
@@ -15,3 +15,7 @@ export const PersonX_Stroke2_Corner0_Rounded = createSinglePathSVG({
export const PersonPlus_Stroke2_Corner0_Rounded = createSinglePathSVG({
path: 'M12 4a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5ZM7.5 6.5a4.5 4.5 0 1 1 9 0 4.5 4.5 0 0 1-9 0ZM5.678 19c.71-2.909 3.092-5 6.322-5 .621 0 1.206.077 1.748.218a1 1 0 1 0 .504-1.936A8.931 8.931 0 0 0 12 12c-4.758 0-8.083 3.521-8.496 7.906A1 1 0 0 0 4.5 21H11a1 1 0 1 0 0-2H5.678ZM18 14a1 1 0 0 1 1 1v2h2a1 1 0 1 1 0 2h-2v2a1 1 0 1 1-2 0v-2h-2a1 1 0 1 1 0-2h2v-2a1 1 0 0 1 1-1Z',
})
+
+export const PersonPlus_Filled_Stroke2_Corner0_Rounded = createSinglePathSVG({
+ path: 'M7.5 6.5a4.5 4.5 0 1 1 9 0 4.5 4.5 0 0 1-9 0ZM12 12c-4.758 0-8.083 3.521-8.496 7.906A1 1 0 0 0 4.5 21H15a3 3 0 1 1 0-6c0-.824.332-1.571.87-2.113C14.739 12.32 13.435 12 12 12Zm6 2a1 1 0 0 1 1 1v2h2a1 1 0 1 1 0 2h-2v2a1 1 0 1 1-2 0v-2h-2a1 1 0 1 1 0-2h2v-2a1 1 0 0 1 1-1Z',
+})
diff --git a/src/components/icons/common.ts b/src/components/icons/common.ts
index 9e9f15c4dd..669c157f51 100644
--- a/src/components/icons/common.ts
+++ b/src/components/icons/common.ts
@@ -1,5 +1,5 @@
import {StyleSheet, TextProps} from 'react-native'
-import type {SvgProps, PathProps} from 'react-native-svg'
+import type {PathProps, SvgProps} from 'react-native-svg'
import {tokens} from '#/alf'
diff --git a/src/lib/icons.tsx b/src/lib/icons.tsx
index 93b45ea3a9..aefa9c9c37 100644
--- a/src/lib/icons.tsx
+++ b/src/lib/icons.tsx
@@ -2,98 +2,6 @@ import React from 'react'
import {StyleProp, TextStyle, ViewStyle} from 'react-native'
import Svg, {Ellipse, Line, Path, Rect} from 'react-native-svg'
-export function GridIcon({
- style,
- solid,
-}: {
- style?: StyleProp
- solid?: boolean
-}) {
- const DIM = 4
- const ARC = 2
- return (
-
- )
-}
-export function GridIconSolid({style}: {style?: StyleProp}) {
- return
-}
-
-export function HomeIcon({
- style,
- size,
- strokeWidth = 4,
-}: {
- style?: StyleProp
- size?: string | number
- strokeWidth?: number
-}) {
- return (
-
- )
-}
-
-export function HomeIconSolid({
- style,
- size,
- strokeWidth = 4,
-}: {
- style?: StyleProp
- size?: string | number
- strokeWidth?: number
-}) {
- return (
-
- )
-}
-
// Copyright (c) 2020 Refactoring UI Inc.
// https://github.com/tailwindlabs/heroicons/blob/master/LICENSE
export function MagnifyingGlassIcon({
@@ -147,90 +55,6 @@ export function MagnifyingGlassIcon2({
)
}
-export function MagnifyingGlassIcon2Solid({
- style,
- size,
- strokeWidth = 2,
-}: {
- style?: StyleProp
- size?: string | number
- strokeWidth?: number
-}) {
- return (
-
- )
-}
-
-// https://github.com/Remix-Design/RemixIcon/blob/master/License
-export function BellIcon({
- style,
- size,
- strokeWidth = 1.5,
-}: {
- style?: StyleProp
- size?: string | number
- strokeWidth?: number
-}) {
- return (
-
- )
-}
-
-// https://github.com/Remix-Design/RemixIcon/blob/master/License
-export function BellIconSolid({
- style,
- size,
- strokeWidth = 1.5,
-}: {
- style?: StyleProp
- size?: string | number
- strokeWidth?: number
-}) {
- return (
-
- )
-}
-
export function CogIcon({
style,
size,
@@ -263,160 +87,6 @@ export function CogIcon({
)
}
-export function CogIconSolid({
- style,
- size,
- strokeWidth = 1.5,
-}: {
- style?: StyleProp
- size?: string | number
- strokeWidth: number
-}) {
- return (
-
- )
-}
-
-// Copyright (c) 2020 Refactoring UI Inc.
-// https://github.com/tailwindlabs/heroicons/blob/master/LICENSE
-export function MoonIcon({
- style,
- size,
- strokeWidth = 1.5,
-}: {
- style?: StyleProp
- size?: string | number
- strokeWidth?: number
-}) {
- return (
-
- )
-}
-
-// Copyright (c) 2020 Refactoring UI Inc.
-// https://github.com/tailwindlabs/heroicons/blob/master/LICENSE
-export function SunIcon({
- style,
- size,
- strokeWidth = 1.5,
-}: {
- style?: StyleProp
- size?: string | number
- strokeWidth?: number
-}) {
- return (
-
- )
-}
-
-// Copyright (c) 2020 Refactoring UI Inc.
-// https://github.com/tailwindlabs/heroicons/blob/master/LICENSE
-export function UserIcon({
- style,
- size,
- strokeWidth = 1.5,
-}: {
- style?: StyleProp
- size?: string | number
- strokeWidth?: number
-}) {
- return (
-
- )
-}
-
-export function UserIconSolid({
- style,
- size,
- strokeWidth = 1.5,
-}: {
- style?: StyleProp
- size?: string | number
- strokeWidth?: number
-}) {
- return (
-
- )
-}
-
// Copyright (c) 2020 Refactoring UI Inc.
// https://github.com/tailwindlabs/heroicons/blob/master/LICENSE
export function UserGroupIcon({
@@ -444,208 +114,6 @@ export function UserGroupIcon({
)
}
-export function RepostIcon({
- style,
- size = 24,
- strokeWidth = 1.5,
-}: {
- style?: StyleProp
- size?: string | number
- strokeWidth: number
-}) {
- return (
-
- )
-}
-
-// Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc.
-export function HeartIcon({
- style,
- size = 24,
- strokeWidth = 1.5,
-}: {
- style?: StyleProp
- size?: string | number
- strokeWidth: number
-}) {
- return (
-
- )
-}
-
-// Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc.
-export function HeartIconSolid({
- style,
- size = 24,
-}: {
- style?: StyleProp
- size?: string | number
-}) {
- return (
-
- )
-}
-
-export function UpIcon({
- style,
- size,
- strokeWidth = 1.3,
-}: {
- style?: StyleProp
- size?: string | number
- strokeWidth: number
-}) {
- return (
-
- )
-}
-
-export function UpIconSolid({
- style,
- size,
-}: {
- style?: StyleProp
- size?: string | number
-}) {
- return (
-
- )
-}
-
-export function DownIcon({
- style,
- size,
-}: {
- style?: StyleProp
- size?: string | number
-}) {
- return (
-
- )
-}
-
-export function DownIconSolid({
- style,
- size,
-}: {
- style?: StyleProp
- size?: string | number
-}) {
- return (
-
- )
-}
-
-// Copyright (c) 2020 Refactoring UI Inc.
-// https://github.com/tailwindlabs/heroicons/blob/master/LICENSE
-export function CommentBottomArrow({
- style,
- size,
- strokeWidth = 1.3,
-}: {
- style?: StyleProp
- size?: string | number
- strokeWidth?: number
-}) {
- let color = 'currentColor'
- if (
- style &&
- typeof style === 'object' &&
- 'color' in style &&
- typeof style.color === 'string'
- ) {
- color = style.color
- }
- return (
-
- )
-}
-
export function SquareIcon({
style,
size,
@@ -715,33 +183,6 @@ export function RectTallIcon({
)
}
-export function ComposeIcon({
- style,
- size,
- strokeWidth = 1.5,
-}: {
- style?: StyleProp
- size?: string | number
- strokeWidth?: number
-}) {
- return (
-
- )
-}
-
export function ComposeIcon2({
style,
size,
@@ -783,54 +224,6 @@ export function ComposeIcon2({
)
}
-export function SquarePlusIcon({
- style,
- size,
- strokeWidth = 1.5,
-}: {
- style?: StyleProp
- size?: string | number
- strokeWidth?: number
-}) {
- return (
-
- )
-}
-
export function InfoCircleIcon({
style,
size,
@@ -947,30 +340,3 @@ export function ShieldExclamation({
)
}
-
-export function ListIcon({
- style,
- size,
- strokeWidth = 1.5,
-}: {
- style?: StyleProp
- size?: string | number
- strokeWidth?: number
-}) {
- return (
-
- )
-}
diff --git a/src/view/com/notifications/Feed.tsx b/src/view/com/notifications/Feed.tsx
index e12b63733d..c632ed5dc9 100644
--- a/src/view/com/notifications/Feed.tsx
+++ b/src/view/com/notifications/Feed.tsx
@@ -8,23 +8,23 @@ import {
import {msg} from '@lingui/macro'
import {useLingui} from '@lingui/react'
+import {useInitialNumToRender} from '#/lib/hooks/useInitialNumToRender'
import {usePalette} from '#/lib/hooks/usePalette'
+import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries'
import {cleanError} from '#/lib/strings/errors'
+import {s} from '#/lib/styles'
import {logger} from '#/logger'
import {useModerationOpts} from '#/state/preferences/moderation-opts'
import {useNotificationFeedQuery} from '#/state/queries/notifications/feed'
import {useUnreadNotificationsApi} from '#/state/queries/notifications/unread'
-import {s} from 'lib/styles'
-import {EmptyState} from '../util/EmptyState'
-import {ErrorMessage} from '../util/error/ErrorMessage'
-import {List, ListRef} from '../util/List'
-import {NotificationFeedLoadingPlaceholder} from '../util/LoadingPlaceholder'
-import {LoadMoreRetryBtn} from '../util/LoadMoreRetryBtn'
-import {CenteredView} from '../util/Views'
+import {EmptyState} from '#/view/com/util/EmptyState'
+import {ErrorMessage} from '#/view/com/util/error/ErrorMessage'
+import {List, ListRef} from '#/view/com/util/List'
+import {NotificationFeedLoadingPlaceholder} from '#/view/com/util/LoadingPlaceholder'
+import {LoadMoreRetryBtn} from '#/view/com/util/LoadMoreRetryBtn'
+import {CenteredView} from '#/view/com/util/Views'
import {FeedItem} from './FeedItem'
import hairlineWidth = StyleSheet.hairlineWidth
-import {useInitialNumToRender} from 'lib/hooks/useInitialNumToRender'
-import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries'
const EMPTY_FEED_ITEM = {_reactKey: '__empty__'}
const LOAD_MORE_ERROR_ITEM = {_reactKey: '__load_more_error__'}
diff --git a/src/view/com/notifications/FeedItem.tsx b/src/view/com/notifications/FeedItem.tsx
index 4fe557f402..a5cc60fd81 100644
--- a/src/view/com/notifications/FeedItem.tsx
+++ b/src/view/com/notifications/FeedItem.tsx
@@ -17,11 +17,6 @@ import {
ModerationOpts,
} from '@atproto/api'
import {AtUri} from '@atproto/api'
-import {
- FontAwesomeIcon,
- FontAwesomeIconStyle,
- Props,
-} from '@fortawesome/react-native-fontawesome'
import {msg, plural, Trans} from '@lingui/macro'
import {useLingui} from '@lingui/react'
import {useQueryClient} from '@tanstack/react-query'
@@ -29,7 +24,6 @@ import {useQueryClient} from '@tanstack/react-query'
import {FeedNotification} from '#/state/queries/notifications/feed'
import {useAnimatedValue} from 'lib/hooks/useAnimatedValue'
import {usePalette} from 'lib/hooks/usePalette'
-import {HeartIconSolid} from 'lib/icons'
import {makeProfileLink} from 'lib/routes/links'
import {sanitizeDisplayName} from 'lib/strings/display-names'
import {sanitizeHandle} from 'lib/strings/handles'
@@ -37,6 +31,14 @@ import {niceDate} from 'lib/strings/time'
import {colors, s} from 'lib/styles'
import {isWeb} from 'platform/detection'
import {precacheProfile} from 'state/queries/profile'
+import {atoms as a, useTheme} from '#/alf'
+import {
+ ChevronBottom_Stroke2_Corner0_Rounded as ChevronDownIcon,
+ ChevronTop_Stroke2_Corner0_Rounded as ChevronUpIcon,
+} from '#/components/icons/Chevron'
+import {Heart2_Filled_Stroke2_Corner0_Rounded as HeartIconFilled} from '#/components/icons/Heart2'
+import {PersonPlus_Filled_Stroke2_Corner0_Rounded as PersonPlusIcon} from '#/components/icons/Person'
+import {Repost_Stroke2_Corner2_Rounded as RepostIcon} from '#/components/icons/Repost'
import {Link as NewLink} from '#/components/Link'
import {ProfileHoverCard} from '#/components/ProfileHoverCard'
import {FeedSourceCard} from '../feeds/FeedSourceCard'
@@ -47,6 +49,7 @@ import {formatCount} from '../util/numeric/format'
import {Text} from '../util/text/Text'
import {TimeElapsed} from '../util/TimeElapsed'
import {PreviewableUserAvatar, UserAvatar} from '../util/UserAvatar'
+
import hairlineWidth = StyleSheet.hairlineWidth
const MAX_AUTHORS = 5
@@ -71,6 +74,7 @@ let FeedItem = ({
const queryClient = useQueryClient()
const pal = usePalette('default')
const {_} = useLingui()
+ const t = useTheme()
const [isAuthorsExpanded, setAuthorsExpanded] = useState(false)
const itemHref = useMemo(() => {
if (item.type === 'post-like' || item.type === 'repost') {
@@ -150,30 +154,25 @@ let FeedItem = ({
}
let action = ''
- let icon: Props['icon'] | 'HeartIconSolid'
- let iconStyle: Props['style'] = []
+ let icon = (
+
+ )
if (item.type === 'post-like') {
action = _(msg`liked your post`)
- icon = 'HeartIconSolid'
- iconStyle = [
- s.likeColor as FontAwesomeIconStyle,
- {position: 'relative', top: -4},
- ]
} else if (item.type === 'repost') {
action = _(msg`reposted your post`)
- icon = 'retweet'
- iconStyle = [s.green3 as FontAwesomeIconStyle]
+ icon =
} else if (item.type === 'follow') {
action = _(msg`followed you`)
- icon = 'user-plus'
- iconStyle = [s.blue3 as FontAwesomeIconStyle]
+ icon =
} else if (item.type === 'feedgen-like') {
action = _(msg`liked your custom feed`)
- icon = 'HeartIconSolid'
- iconStyle = [
- s.likeColor as FontAwesomeIconStyle,
- {position: 'relative', top: -4},
- ]
} else {
return null
}
@@ -200,18 +199,10 @@ let FeedItem = ({
item.type === 'repost'
}
onBeforePress={onBeforePress}>
-
+
{/* TODO: Prevent conditional rendering and move toward composable
notifications for clearer accessibility labeling */}
- {icon === 'HeartIconSolid' ? (
-
- ) : (
-
- )}
+ {icon}
-
@@ -369,9 +359,8 @@ function CondensedAuthorsList({
+{authors.length - MAX_AUTHORS}
) : undefined}
-
diff --git a/src/view/com/util/LoadingPlaceholder.tsx b/src/view/com/util/LoadingPlaceholder.tsx
index be67d10cba..adeefd4ddb 100644
--- a/src/view/com/util/LoadingPlaceholder.tsx
+++ b/src/view/com/util/LoadingPlaceholder.tsx
@@ -8,12 +8,14 @@ import {
} from 'react-native'
import {usePalette} from 'lib/hooks/usePalette'
-import {HeartIconSolid} from 'lib/icons'
import {s} from 'lib/styles'
import {useTheme} from 'lib/ThemeContext'
-import {useTheme as useTheme_NEW} from '#/alf'
+import {atoms as a, useTheme as useTheme_NEW} from '#/alf'
import {Bubble_Stroke2_Corner2_Rounded as Bubble} from '#/components/icons/Bubble'
-import {Heart2_Stroke2_Corner0_Rounded as HeartIconOutline} from '#/components/icons/Heart2'
+import {
+ Heart2_Filled_Stroke2_Corner0_Rounded as HeartIconFilled,
+ Heart2_Stroke2_Corner0_Rounded as HeartIconOutline,
+} from '#/components/icons/Heart2'
import {Repost_Stroke2_Corner2_Rounded as Repost} from '#/components/icons/Repost'
import hairlineWidth = StyleSheet.hairlineWidth
@@ -139,14 +141,14 @@ export function NotificationLoadingPlaceholder({
const pal = usePalette('default')
return (
-
-
+
-
+