Add alt text support and rework image layout (#503)

* Add alt text support and rework image layout

* Add additional BottomSheet implementation to account for nested Composer modal

* Use mobile gallery layout on mobile web

* Missing key

* Fix lint

* Move altimage modal into the standard modal system

* Fix overflow wrapping of images

* Fixes to the alt-image modal

* Remove unnecessary switch

* Restore old imagelayoutgrid code

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
This commit is contained in:
Ollie Hsieh 2023-04-21 14:20:06 -07:00 committed by GitHub
parent 0f5735b616
commit f0706dbe9f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
19 changed files with 412 additions and 132 deletions

View file

@ -65,6 +65,10 @@ export class GalleryModel {
})
}
setAltText(image: ImageModel) {
image.setAltText()
}
crop(image: ImageModel) {
image.crop()
}

View file

@ -5,6 +5,7 @@ import {makeAutoObservable, runInAction} from 'mobx'
import {openCropper} from 'lib/media/picker'
import {POST_IMG_MAX} from 'lib/constants'
import {scaleDownDimensions} from 'lib/media/util'
import {openAltTextModal} from 'lib/media/alt-text'
// TODO: EXIF embed
// Cases to consider: ExternalEmbed
@ -14,6 +15,7 @@ export class ImageModel implements RNImage {
width: number
height: number
size: number
altText?: string = undefined
cropped?: RNImage = undefined
compressed?: RNImage = undefined
scaledWidth: number = POST_IMG_MAX.width
@ -41,6 +43,18 @@ export class ImageModel implements RNImage {
this.scaledHeight = height
}
async setAltText() {
try {
const altText = await openAltTextModal(this.rootStore)
runInAction(() => {
this.altText = altText
})
} catch (err) {
this.rootStore.log.error('Failed to set alt text', err)
}
}
async crop() {
try {
const cropped = await openCropper(this.rootStore, {

View file

@ -3,7 +3,7 @@ import {RootStoreModel} from '../root-store'
import {makeAutoObservable} from 'mobx'
import {ProfileModel} from '../content/profile'
import {isObj, hasProp} from 'lib/type-guards'
import {Image} from 'lib/media/types'
import {Image as RNImage} from 'react-native-image-crop-picker'
export interface ConfirmModal {
name: 'confirm'
@ -38,7 +38,12 @@ export interface ReportAccountModal {
export interface CropImageModal {
name: 'crop-image'
uri: string
onSelect: (img?: Image) => void
onSelect: (img?: RNImage) => void
}
export interface AltTextImageModal {
name: 'alt-text-image'
onAltTextSet: (altText?: string) => void
}
export interface DeleteAccountModal {
@ -70,18 +75,30 @@ export interface ContentFilteringSettingsModal {
}
export type Modal =
| ConfirmModal
| EditProfileModal
| ServerInputModal
| ReportPostModal
| ReportAccountModal
| CropImageModal
| DeleteAccountModal
| RepostModal
// Account
| ChangeHandleModal
| DeleteAccountModal
| EditProfileModal
// Curation
| ContentFilteringSettingsModal
// Reporting
| ReportAccountModal
| ReportPostModal
// Posting
| AltTextImageModal
| CropImageModal
| ServerInputModal
| RepostModal
// Bluesky access
| WaitlistModal
| InviteCodesModal
| ContentFilteringSettingsModal
// Generic
| ConfirmModal
interface LightboxModel {}