about summary refs log tree commit diff
path: root/src/view/com/util/images
diff options
context:
space:
mode:
Diffstat (limited to 'src/view/com/util/images')
-rw-r--r--src/view/com/util/images/AutoSizedImage.tsx4
-rw-r--r--src/view/com/util/images/Gallery.tsx19
-rw-r--r--src/view/com/util/images/ImageLayoutGrid.tsx130
3 files changed, 121 insertions, 32 deletions
diff --git a/src/view/com/util/images/AutoSizedImage.tsx b/src/view/com/util/images/AutoSizedImage.tsx
index 9abbe2875..a9bfc1c96 100644
--- a/src/view/com/util/images/AutoSizedImage.tsx
+++ b/src/view/com/util/images/AutoSizedImage.tsx
@@ -88,7 +88,7 @@ export function ConstrainedImage({
           <View
             style={[
               a.h_full,
-              a.rounded_sm,
+              a.rounded_md,
               a.overflow_hidden,
               t.atoms.bg_contrast_25,
               fullBleed ? a.w_full : {aspectRatio},
@@ -219,7 +219,7 @@ export function AutoSizedImage({
         accessibilityHint={_(msg`Tap to view full image`)}
         style={[
           a.w_full,
-          a.rounded_sm,
+          a.rounded_md,
           a.overflow_hidden,
           t.atoms.bg_contrast_25,
           {aspectRatio: max},
diff --git a/src/view/com/util/images/Gallery.tsx b/src/view/com/util/images/Gallery.tsx
index 38137cc49..e277b7e86 100644
--- a/src/view/com/util/images/Gallery.tsx
+++ b/src/view/com/util/images/Gallery.tsx
@@ -1,6 +1,6 @@
-import React, {ComponentProps, FC} from 'react'
-import {Pressable, View} from 'react-native'
-import {Image} from 'expo-image'
+import React from 'react'
+import {Pressable, StyleProp, View, ViewStyle} from 'react-native'
+import {Image, ImageStyle} from 'expo-image'
 import {AppBskyEmbedImages} from '@atproto/api'
 import {msg} from '@lingui/macro'
 import {useLingui} from '@lingui/react'
@@ -13,17 +13,18 @@ import {Text} from '#/components/Typography'
 
 type EventFunction = (index: number) => void
 
-interface GalleryItemProps {
+interface Props {
   images: AppBskyEmbedImages.ViewImage[]
   index: number
   onPress?: EventFunction
   onLongPress?: EventFunction
   onPressIn?: EventFunction
-  imageStyle?: ComponentProps<typeof Image>['style']
+  imageStyle?: StyleProp<ImageStyle>
   viewContext?: PostEmbedViewContext
+  insetBorderStyle?: StyleProp<ViewStyle>
 }
 
-export const GalleryItem: FC<GalleryItemProps> = ({
+export function GalleryItem({
   images,
   index,
   imageStyle,
@@ -31,7 +32,8 @@ export const GalleryItem: FC<GalleryItemProps> = ({
   onPressIn,
   onLongPress,
   viewContext,
-}) => {
+  insetBorderStyle,
+}: Props) {
   const t = useTheme()
   const {_} = useLingui()
   const largeAltBadge = useLargeAltBadgeEnabled()
@@ -47,7 +49,6 @@ export const GalleryItem: FC<GalleryItemProps> = ({
         onLongPress={onLongPress ? () => onLongPress(index) : undefined}
         style={[
           a.flex_1,
-          a.rounded_sm,
           a.overflow_hidden,
           t.atoms.bg_contrast_25,
           imageStyle,
@@ -63,7 +64,7 @@ export const GalleryItem: FC<GalleryItemProps> = ({
           accessibilityHint=""
           accessibilityIgnoresInvertColors
         />
-        <MediaInsetBorder />
+        <MediaInsetBorder style={insetBorderStyle} />
       </Pressable>
       {hasAlt && !hideBadges ? (
         <View
diff --git a/src/view/com/util/images/ImageLayoutGrid.tsx b/src/view/com/util/images/ImageLayoutGrid.tsx
index 45da7f076..1aaf166ff 100644
--- a/src/view/com/util/images/ImageLayoutGrid.tsx
+++ b/src/view/com/util/images/ImageLayoutGrid.tsx
@@ -1,5 +1,5 @@
 import React from 'react'
-import {StyleProp, View, ViewStyle} from 'react-native'
+import {StyleProp, StyleSheet, View, ViewStyle} from 'react-native'
 import {AppBskyEmbedImages} from '@atproto/api'
 
 import {PostEmbedViewContext} from '#/view/com/util/post-embeds/types'
@@ -22,14 +22,23 @@ export function ImageLayoutGrid({style, ...props}: ImageLayoutGridProps) {
       ? gtMobile
         ? a.gap_xs
         : a.gap_2xs
-      : gtMobile
-      ? a.gap_sm
       : a.gap_xs
   const count = props.images.length
-  const aspectRatio = count === 2 ? 2 : count === 3 ? 1.5 : 1
+  let aspectRatio
+  switch (count) {
+    case 2:
+      aspectRatio = 2
+      break
+    case 3:
+      aspectRatio = 2
+      break
+    case 4:
+      aspectRatio = undefined
+      break
+  }
   return (
     <View style={style}>
-      <View style={[gap, {aspectRatio}]}>
+      <View style={[gap, a.rounded_md, a.overflow_hidden, {aspectRatio}]}>
         <ImageLayoutGridInner {...props} gap={gap} />
       </View>
     </View>
@@ -54,10 +63,18 @@ function ImageLayoutGridInner(props: ImageLayoutGridInnerProps) {
       return (
         <View style={[a.flex_1, a.flex_row, gap]}>
           <View style={[a.flex_1, {aspectRatio: 1}]}>
-            <GalleryItem {...props} index={0} />
+            <GalleryItem
+              {...props}
+              index={0}
+              insetBorderStyle={noCorners(['topRight', 'bottomRight'])}
+            />
           </View>
           <View style={[a.flex_1, {aspectRatio: 1}]}>
-            <GalleryItem {...props} index={1} />
+            <GalleryItem
+              {...props}
+              index={1}
+              insetBorderStyle={noCorners(['topLeft', 'bottomLeft'])}
+            />
           </View>
         </View>
       )
@@ -65,15 +82,35 @@ function ImageLayoutGridInner(props: ImageLayoutGridInnerProps) {
     case 3:
       return (
         <View style={[a.flex_1, a.flex_row, gap]}>
-          <View style={{flex: 2}}>
-            <GalleryItem {...props} index={0} />
+          <View style={[a.flex_1]}>
+            <GalleryItem
+              {...props}
+              index={0}
+              insetBorderStyle={noCorners(['topRight', 'bottomRight'])}
+            />
           </View>
           <View style={[a.flex_1, gap]}>
-            <View style={[a.flex_1, {aspectRatio: 1}]}>
-              <GalleryItem {...props} index={1} />
+            <View style={[a.flex_1]}>
+              <GalleryItem
+                {...props}
+                index={1}
+                insetBorderStyle={noCorners([
+                  'topLeft',
+                  'bottomLeft',
+                  'bottomRight',
+                ])}
+              />
             </View>
-            <View style={[a.flex_1, {aspectRatio: 1}]}>
-              <GalleryItem {...props} index={2} />
+            <View style={[a.flex_1]}>
+              <GalleryItem
+                {...props}
+                index={2}
+                insetBorderStyle={noCorners([
+                  'topLeft',
+                  'bottomLeft',
+                  'topRight',
+                ])}
+              />
             </View>
           </View>
         </View>
@@ -83,19 +120,51 @@ function ImageLayoutGridInner(props: ImageLayoutGridInnerProps) {
       return (
         <>
           <View style={[a.flex_row, gap]}>
-            <View style={[a.flex_1, {aspectRatio: 1}]}>
-              <GalleryItem {...props} index={0} />
+            <View style={[a.flex_1, {aspectRatio: 1.5}]}>
+              <GalleryItem
+                {...props}
+                index={0}
+                insetBorderStyle={noCorners([
+                  'bottomLeft',
+                  'topRight',
+                  'bottomRight',
+                ])}
+              />
             </View>
-            <View style={[a.flex_1, {aspectRatio: 1}]}>
-              <GalleryItem {...props} index={1} />
+            <View style={[a.flex_1, {aspectRatio: 1.5}]}>
+              <GalleryItem
+                {...props}
+                index={1}
+                insetBorderStyle={noCorners([
+                  'topLeft',
+                  'bottomLeft',
+                  'bottomRight',
+                ])}
+              />
             </View>
           </View>
           <View style={[a.flex_row, gap]}>
-            <View style={[a.flex_1, {aspectRatio: 1}]}>
-              <GalleryItem {...props} index={2} />
+            <View style={[a.flex_1, {aspectRatio: 1.5}]}>
+              <GalleryItem
+                {...props}
+                index={2}
+                insetBorderStyle={noCorners([
+                  'topLeft',
+                  'topRight',
+                  'bottomRight',
+                ])}
+              />
             </View>
-            <View style={[a.flex_1, {aspectRatio: 1}]}>
-              <GalleryItem {...props} index={3} />
+            <View style={[a.flex_1, {aspectRatio: 1.5}]}>
+              <GalleryItem
+                {...props}
+                index={3}
+                insetBorderStyle={noCorners([
+                  'topLeft',
+                  'bottomLeft',
+                  'topRight',
+                ])}
+              />
             </View>
           </View>
         </>
@@ -105,3 +174,22 @@ function ImageLayoutGridInner(props: ImageLayoutGridInnerProps) {
       return null
   }
 }
+
+function noCorners(
+  corners: ('topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight')[],
+) {
+  const styles: StyleProp<ViewStyle>[] = []
+  if (corners.includes('topLeft')) {
+    styles.push({borderTopLeftRadius: 0})
+  }
+  if (corners.includes('topRight')) {
+    styles.push({borderTopRightRadius: 0})
+  }
+  if (corners.includes('bottomLeft')) {
+    styles.push({borderBottomLeftRadius: 0})
+  }
+  if (corners.includes('bottomRight')) {
+    styles.push({borderBottomRightRadius: 0})
+  }
+  return StyleSheet.flatten(styles)
+}