Pre-fill alt text with 10-million card post (#5377)

This commit is contained in:
Calvin
2024-09-17 09:33:54 -07:00
committed by GitHub
parent 0414b95c58
commit 390279df88
4 changed files with 33 additions and 14 deletions
@@ -241,6 +241,11 @@ export function TenMillionInner({
uri, uri,
width: WIDTH, width: WIDTH,
height: HEIGHT, height: HEIGHT,
altText: _(
msg`A virtual card celebrating 10 million users on Bluesky for user #${i18n.number(
userNumber,
)}`,
),
}, },
], ],
}) })
+9 -6
View File
@@ -1,19 +1,22 @@
import {makeAutoObservable, runInAction} from 'mobx' import {makeAutoObservable, runInAction} from 'mobx'
import {ImageModel} from './image'
import {Image as RNImage} from 'react-native-image-crop-picker'
import {openPicker} from 'lib/media/picker'
import {getImageDim} from 'lib/media/manip' import {getImageDim} from 'lib/media/manip'
import {openPicker} from 'lib/media/picker'
import {ImageInitOptions, ImageModel} from './image'
interface InitialImageUri { interface InitialImageUri {
uri: string uri: string
width: number width: number
height: number height: number
altText?: string
} }
export class GalleryModel { export class GalleryModel {
images: ImageModel[] = [] images: ImageModel[] = []
constructor(uris?: {uri: string; width: number; height: number}[]) { constructor(
uris?: {uri: string; width: number; height: number; altText?: string}[],
) {
makeAutoObservable(this) makeAutoObservable(this)
if (uris) { if (uris) {
@@ -33,7 +36,7 @@ export class GalleryModel {
return this.images.some(image => image.altText.trim() === '') return this.images.some(image => image.altText.trim() === '')
} }
*add(image_: Omit<RNImage, 'size'>) { *add(image_: ImageInitOptions) {
if (this.size >= 4) { if (this.size >= 4) {
return return
} }
@@ -100,10 +103,10 @@ export class GalleryModel {
async addFromUris(uris: InitialImageUri[]) { async addFromUris(uris: InitialImageUri[]) {
for (const uriObj of uris) { for (const uriObj of uris) {
this.add({ this.add({
mime: 'image/jpeg',
height: uriObj.height, height: uriObj.height,
width: uriObj.width, width: uriObj.width,
path: uriObj.uri, path: uriObj.uri,
altText: uriObj.altText,
}) })
} }
} }
+18 -7
View File
@@ -1,14 +1,15 @@
import {Image as RNImage} from 'react-native-image-crop-picker' import {Image as RNImage} from 'react-native-image-crop-picker'
import {makeAutoObservable, runInAction} from 'mobx'
import {POST_IMG_MAX} from 'lib/constants'
import * as ImageManipulator from 'expo-image-manipulator' import * as ImageManipulator from 'expo-image-manipulator'
import {getDataUriSize} from 'lib/media/util'
import {openCropper} from 'lib/media/picker'
import {ActionCrop, FlipType, SaveFormat} from 'expo-image-manipulator' import {ActionCrop, FlipType, SaveFormat} from 'expo-image-manipulator'
import {makeAutoObservable, runInAction} from 'mobx'
import {Position} from 'react-avatar-editor' import {Position} from 'react-avatar-editor'
import {Dimensions} from 'lib/media/types'
import {isIOS} from 'platform/detection'
import {logger} from '#/logger' import {logger} from '#/logger'
import {POST_IMG_MAX} from 'lib/constants'
import {openCropper} from 'lib/media/picker'
import {Dimensions} from 'lib/media/types'
import {getDataUriSize} from 'lib/media/util'
import {isIOS} from 'platform/detection'
export interface ImageManipulationAttributes { export interface ImageManipulationAttributes {
aspectRatio?: '4:3' | '1:1' | '3:4' | 'None' aspectRatio?: '4:3' | '1:1' | '3:4' | 'None'
@@ -19,6 +20,13 @@ export interface ImageManipulationAttributes {
flipVertical?: boolean flipVertical?: boolean
} }
export interface ImageInitOptions {
path: string
width: number
height: number
altText?: string
}
const MAX_IMAGE_SIZE_IN_BYTES = 976560 const MAX_IMAGE_SIZE_IN_BYTES = 976560
export class ImageModel implements Omit<RNImage, 'size'> { export class ImageModel implements Omit<RNImage, 'size'> {
@@ -41,12 +49,15 @@ export class ImageModel implements Omit<RNImage, 'size'> {
} }
prevAttributes: ImageManipulationAttributes = {} prevAttributes: ImageManipulationAttributes = {}
constructor(image: Omit<RNImage, 'size'>) { constructor(image: ImageInitOptions) {
makeAutoObservable(this) makeAutoObservable(this)
this.path = image.path this.path = image.path
this.width = image.width this.width = image.width
this.height = image.height this.height = image.height
if (image.altText !== undefined) {
this.setAltText(image.altText)
}
} }
setRatio(aspectRatio: ImageManipulationAttributes['aspectRatio']) { setRatio(aspectRatio: ImageManipulationAttributes['aspectRatio']) {
+1 -1
View File
@@ -36,7 +36,7 @@ export interface ComposerOpts {
mention?: string // handle of user to mention mention?: string // handle of user to mention
openEmojiPicker?: (pos: DOMRect | undefined) => void openEmojiPicker?: (pos: DOMRect | undefined) => void
text?: string text?: string
imageUris?: {uri: string; width: number; height: number}[] imageUris?: {uri: string; width: number; height: number; altText?: string}[]
} }
type StateContext = ComposerOpts | undefined type StateContext = ComposerOpts | undefined