diff options
author | Samuel Newman <mozzius@protonmail.com> | 2025-03-04 13:54:19 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-04 05:54:19 -0800 |
commit | c995eb2f2fa3e73dcc6943078c85cd6a68f5370b (patch) | |
tree | 2dfea8ae6e4d86a77a90c72663b22441ca407159 /src/components/AvatarStack.tsx | |
parent | 5c14f695660dcbf815a584d9d3bb037171dd0c14 (diff) | |
download | voidsky-c995eb2f2fa3e73dcc6943078c85cd6a68f5370b.tar.zst |
DMs inbox (#7778)
* improve error screen * add chat request prompt * mock up inbox * bigger button * use two-button layout * get inbox working somewhat * fix type errors * fetch both pages for badge * don't include read convos in preview * in-chat ui for non-accepted convos (part 1) * add chatstatusinfo * fix status info not disappearing * get chat status info working * change min item height * move files around * add updated sdk * improve badge behaviour * mock up mark all as read * update sdk to 0.14.4 * hide chat status info if initiating convo * fix unread count for deleted accounts * add toasts after rejection * add prompt to delete * adjust badge on desktop * requests -> chat requests * fix height flicker * add mark as read button to header * add mark all as read APIs * separate avatarstack into two components (#7845) * fix messages being hidden behind chatstatusinfo * show inbox preview on empty state * fix empty state again * Use new convo availability API (#7812) * [Inbox] Accept button on convo screen (#7795) * accept button on convo screen * fix types * fix type error * improve spacing * [DMs] Implement new log types (#7835) * optimise badge state * add read message log * add isLogAcceptConvo * mute/unmute convo logs * use setqueriesdata * always show label on button * optimistically update badge * change incorrect unread count change * Update src/screens/Messages/Inbox.tsx Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com> * Update src/screens/Messages/components/RequestButtons.tsx Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com> * Update src/screens/Messages/components/RequestButtons.tsx Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com> * Update src/screens/Messages/components/RequestListItem.tsx Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com> * fix race condition with accepting convo * fix back button on web * filter left convos from badge * update atproto to fix CI * Add accept override external to convo (#7891) * Add accept override external to convo * rm log --------- Co-authored-by: Samuel Newman <mozzius@protonmail.com> --------- Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com> Co-authored-by: Eric Bailey <git@esb.lol>
Diffstat (limited to 'src/components/AvatarStack.tsx')
-rw-r--r-- | src/components/AvatarStack.tsx | 52 |
1 files changed, 41 insertions, 11 deletions
diff --git a/src/components/AvatarStack.tsx b/src/components/AvatarStack.tsx index 1b27a95ac..63f5ed77a 100644 --- a/src/components/AvatarStack.tsx +++ b/src/components/AvatarStack.tsx @@ -1,37 +1,37 @@ import {View} from 'react-native' import {moderateProfile} from '@atproto/api' +import {logger} from '#/logger' import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useProfilesQuery} from '#/state/queries/profile' import {UserAvatar} from '#/view/com/util/UserAvatar' import {atoms as a, useTheme} from '#/alf' +import * as bsky from '#/types/bsky' export function AvatarStack({ profiles, size = 26, + numPending, + backgroundColor, }: { - profiles: string[] + profiles: bsky.profile.AnyProfileView[] size?: number + numPending?: number + backgroundColor?: string }) { const halfSize = size / 2 - const {data, error} = useProfilesQuery({handles: profiles}) const t = useTheme() const moderationOpts = useModerationOpts() - if (error) { - console.error(error) - return null - } - - const isPending = !data || !moderationOpts + const isPending = (numPending && profiles.length === 0) || !moderationOpts const items = isPending - ? Array.from({length: profiles.length}).map((_, i) => ({ + ? Array.from({length: numPending ?? profiles.length}).map((_, i) => ({ key: i, profile: null, moderation: null, })) - : data.profiles.map(item => ({ + : profiles.map(item => ({ key: item.did, profile: item, moderation: moderateProfile(item, moderationOpts), @@ -56,7 +56,7 @@ export function AvatarStack({ height: size, left: i * -halfSize, borderWidth: 1, - borderColor: t.atoms.bg.backgroundColor, + borderColor: backgroundColor ?? t.atoms.bg.backgroundColor, borderRadius: 999, zIndex: 3 - i, }, @@ -74,3 +74,33 @@ export function AvatarStack({ </View> ) } + +export function AvatarStackWithFetch({ + profiles, + size, + backgroundColor, +}: { + profiles: string[] + size?: number + backgroundColor?: string +}) { + const {data, error} = useProfilesQuery({handles: profiles}) + + if (error) { + if (error.name !== 'AbortError') { + logger.error('Error fetching profiles for AvatarStack', { + safeMessage: error, + }) + } + return null + } + + return ( + <AvatarStack + numPending={profiles.length} + profiles={data?.profiles || []} + size={size} + backgroundColor={backgroundColor} + /> + ) +} |