@@ -167,22 +167,83 @@ type ToggleProps = {
167
167
children : ( { status } : { status : ToggleStatus } ) => React . ReactElement ;
168
168
} ;
169
169
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 ) ;
175
185
176
- // if (! image.nsfw) return null ;
186
+ const showToModerator = image . imageNsfw && isModerator ;
177
187
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
+ } ;
186
247
187
248
// Old/dynamic version
188
249
// ImageGuard.ToggleConnect = function ToggleConnect({ children }: ToggleProps) {
0 commit comments