Skip to content

Commit c35d2be

Browse files
committed
single image toggle in image guard
1 parent d9189e4 commit c35d2be

File tree

2 files changed

+86
-16
lines changed

2 files changed

+86
-16
lines changed

src/components/ImageGuard/ImageGuard.tsx

Lines changed: 75 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -167,22 +167,83 @@ type ToggleProps = {
167167
children: ({ status }: { status: ToggleStatus }) => React.ReactElement;
168168
};
169169

170-
// !important - don't remove this until we know we'll never need to toggle individual images
171-
// ImageGuard.ToggleImage = function ToggleImage({ children }: ToggleProps) {
172-
// const { image } = useImageGuardContentContext();
173-
// const showImage = useStore((state) => state.showingImages[image.id.toString()]);
174-
// const toggleImage = useStore((state) => state.toggleImage);
170+
ImageGuard.ToggleImage = function ToggleImage({
171+
position = 'top-left',
172+
sx,
173+
className,
174+
}: {
175+
position?: 'static' | 'top-left' | 'top-right';
176+
sx?: Sx;
177+
className?: string;
178+
}) {
179+
const currentUser = useCurrentUser();
180+
const { isModerator, blurNsfw: toggleable } = currentUser ?? {};
181+
const { connect } = useImageGuardContext();
182+
const { image } = useImageGuardContentContext();
183+
const showImage = useStore((state) => state.showingImages[image.id.toString()]);
184+
const toggleImage = useStore((state) => state.toggleImage);
175185

176-
// if (!image.nsfw) return null;
186+
const showToModerator = image.imageNsfw && isModerator;
177187

178-
// return (
179-
// <ImageGuardPopover>
180-
// {cloneElement(children({ status: showImage ? 'hide' : 'show' }), {
181-
// onClick: () => toggleImage(image.id),
182-
// })}
183-
// </ImageGuardPopover>
184-
// );
185-
// };
188+
if (!image.nsfw && !showToModerator && !connect) return null;
189+
const showing = showImage;
190+
191+
return (
192+
<ImageGuardPopover>
193+
<Badge
194+
color="red"
195+
variant="filled"
196+
size="sm"
197+
px={6}
198+
sx={(theme) => ({
199+
cursor: toggleable ? 'pointer' : undefined,
200+
userSelect: 'none',
201+
...(position !== 'static'
202+
? {
203+
position: 'absolute',
204+
top: theme.spacing.xs,
205+
left: position === 'top-left' ? theme.spacing.xs : undefined,
206+
right: position === 'top-right' ? theme.spacing.xs : undefined,
207+
zIndex: 10,
208+
}
209+
: {}),
210+
...(sx && sx instanceof Function ? sx(theme) : sx),
211+
})}
212+
className={className}
213+
onClick={toggleable ? () => toggleImage(image.id) : undefined}
214+
>
215+
<Group spacing={5} noWrap>
216+
<Text
217+
weight="bold"
218+
sx={{
219+
whiteSpace: 'nowrap',
220+
221+
...(toggleable
222+
? {
223+
borderRight: '1px solid rgba(0,0,0,.15)',
224+
boxShadow: '0 1px 0 1px rgba(255,255,255,.1)',
225+
paddingRight: 5,
226+
}
227+
: {}),
228+
}}
229+
component="span"
230+
>
231+
18
232+
<Box component="span" sx={{ marginLeft: 1 }}>
233+
<IconPlus size={8} strokeWidth={5} />
234+
</Box>
235+
</Text>
236+
{toggleable &&
237+
(showing ? (
238+
<IconEyeOff size={14} strokeWidth={2.5} />
239+
) : (
240+
<IconEye size={14} strokeWidth={2.5} />
241+
))}
242+
</Group>
243+
</Badge>
244+
</ImageGuardPopover>
245+
);
246+
};
186247

187248
// Old/dynamic version
188249
// ImageGuard.ToggleConnect = function ToggleConnect({ children }: ToggleProps) {

src/components/User/Username.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import { Badge, BadgeProps, Group, MantineSize, Text, TextProps } from '@mantine/core';
2+
import React, { useEffect, useState } from 'react';
3+
import { useMemo } from 'react';
24
import { useFeatureFlags } from '~/providers/FeatureFlagsProvider';
35
import { getRandom } from '~/utils/array-helpers';
46

@@ -28,14 +30,21 @@ const textBadgeProps: Record<SupportLevel, { textProps: TextProps; badgeProps: B
2830
export function Username({
2931
username,
3032
deletedAt,
31-
supportLevel,
33+
supportLevel: initialSupportLevel,
3234
size = 'sm',
3335
inherit = false,
3436
}: Props) {
3537
const features = useFeatureFlags();
38+
39+
// TODO justin: remove random once final support badge is implemented
40+
// Briant made a change to `supportLevel` to fix ssr mismatches
41+
const [supportLevel, setSupportLevel] = useState<SupportLevel>('common');
42+
useEffect(() => {
43+
setSupportLevel(features.memberBadges ? getRandom(levels) : 'common');
44+
}, []); // eslint-disable-line
45+
3646
if (deletedAt) return <Text size={size}>[deleted]</Text>;
3747

38-
supportLevel = features.memberBadges ? getRandom(levels) : 'common'; // TODO justin: remove random once final support badge is implemented
3948
const { textProps, badgeProps } = textBadgeProps[supportLevel];
4049

4150
return (

0 commit comments

Comments
 (0)