diff options
Diffstat (limited to 'src/view/com/util')
-rw-r--r-- | src/view/com/util/PostEmbeds/index.tsx | 2 | ||||
-rw-r--r-- | src/view/com/util/UserAvatar.tsx | 5 | ||||
-rw-r--r-- | src/view/com/util/UserBanner.tsx | 5 | ||||
-rw-r--r-- | src/view/com/util/ViewHeader.tsx | 2 | ||||
-rw-r--r-- | src/view/com/util/forms/DropdownButton.tsx | 30 | ||||
-rw-r--r-- | src/view/com/util/images/image-crop-picker/ImageCropPicker.tsx | 92 | ||||
-rw-r--r-- | src/view/com/util/images/image-crop-picker/ImageCropPicker.web.tsx | 75 | ||||
-rw-r--r-- | src/view/com/util/images/image-crop-picker/types.ts | 31 |
8 files changed, 27 insertions, 215 deletions
diff --git a/src/view/com/util/PostEmbeds/index.tsx b/src/view/com/util/PostEmbeds/index.tsx index 031f01e88..d2186b600 100644 --- a/src/view/com/util/PostEmbeds/index.tsx +++ b/src/view/com/util/PostEmbeds/index.tsx @@ -13,7 +13,7 @@ import {ImageLayoutGrid} from '../images/ImageLayoutGrid' import {ImagesLightbox} from 'state/models/shell-ui' import {useStores} from 'state/index' import {usePalette} from 'lib/hooks/usePalette' -import {saveImageModal} from 'lib/images' +import {saveImageModal} from 'lib/media/manip' import YoutubeEmbed from './YoutubeEmbed' import ExternalLinkEmbed from './ExternalLinkEmbed' import {getYoutubeVideoId} from 'lib/strings/url-helpers' diff --git a/src/view/com/util/UserAvatar.tsx b/src/view/com/util/UserAvatar.tsx index 9b8dd3de5..5a7a4801d 100644 --- a/src/view/com/util/UserAvatar.tsx +++ b/src/view/com/util/UserAvatar.tsx @@ -9,7 +9,7 @@ import { openCropper, openPicker, PickedMedia, -} from './images/image-crop-picker/ImageCropPicker' +} from '../../../lib/media/picker' import { requestPhotoAccessIfNeeded, requestCameraAccessIfNeeded, @@ -18,6 +18,7 @@ import {useStores} from 'state/index' import {colors, gradients} from 'lib/styles' import {DropdownButton} from './forms/DropdownButton' import {usePalette} from 'lib/hooks/usePalette' +import {isWeb} from 'platform/detection' export function UserAvatar({ size, @@ -58,7 +59,7 @@ export function UserAvatar({ ) const dropdownItems = [ - { + !isWeb && { label: 'Camera', icon: 'camera' as IconProp, onPress: async () => { diff --git a/src/view/com/util/UserBanner.tsx b/src/view/com/util/UserBanner.tsx index dc140b035..06a80d45b 100644 --- a/src/view/com/util/UserBanner.tsx +++ b/src/view/com/util/UserBanner.tsx @@ -10,7 +10,7 @@ import { openCropper, openPicker, PickedMedia, -} from './images/image-crop-picker/ImageCropPicker' +} from '../../../lib/media/picker' import {useStores} from 'state/index' import { requestPhotoAccessIfNeeded, @@ -18,6 +18,7 @@ import { } from 'lib/permissions' import {DropdownButton} from './forms/DropdownButton' import {usePalette} from 'lib/hooks/usePalette' +import {isWeb} from 'platform/detection' export function UserBanner({ banner, @@ -29,7 +30,7 @@ export function UserBanner({ const store = useStores() const pal = usePalette('default') const dropdownItems = [ - { + !isWeb && { label: 'Camera', icon: 'camera' as IconProp, onPress: async () => { diff --git a/src/view/com/util/ViewHeader.tsx b/src/view/com/util/ViewHeader.tsx index 0c3ca0bf5..fe195c7b1 100644 --- a/src/view/com/util/ViewHeader.tsx +++ b/src/view/com/util/ViewHeader.tsx @@ -35,7 +35,7 @@ export const ViewHeader = observer(function ViewHeader({ canGoBack = store.nav.tab.canGoBack } if (isDesktopWeb) { - return undefined + return <></> } return ( <Container hideOnScroll={hideOnScroll || false}> diff --git a/src/view/com/util/forms/DropdownButton.tsx b/src/view/com/util/forms/DropdownButton.tsx index 8fddd5941..2946c5ca0 100644 --- a/src/view/com/util/forms/DropdownButton.tsx +++ b/src/view/com/util/forms/DropdownButton.tsx @@ -16,7 +16,6 @@ import {Button, ButtonType} from './Button' import {colors} from 'lib/styles' import {toShareUrl} from 'lib/strings/url-helpers' import {useStores} from 'state/index' -import {ReportPostModal, ConfirmModal} from 'state/models/shell-ui' import {TABS_ENABLED} from 'lib/build-flags' import {usePalette} from 'lib/hooks/usePalette' import {useTheme} from 'lib/ThemeContext' @@ -28,6 +27,7 @@ export interface DropdownItem { label: string onPress: () => void } +type MaybeDropdownItem = DropdownItem | false | undefined export type DropdownButtonType = ButtonType | 'bare' @@ -44,7 +44,7 @@ export function DropdownButton({ }: { type?: DropdownButtonType style?: StyleProp<ViewStyle> - items: DropdownItem[] + items: MaybeDropdownItem[] label?: string menuWidth?: number children?: React.ReactNode @@ -71,7 +71,12 @@ export function DropdownButton({ ? pageX + width + rightOffset : pageX + width - menuWidth const newY = pageY + height + bottomOffset - createDropdownMenu(newX, newY, menuWidth, items) + createDropdownMenu( + newX, + newY, + menuWidth, + items.filter(v => !!v) as DropdownItem[], + ) }, ) } @@ -151,7 +156,11 @@ export function PostDropdownBtn({ icon: 'circle-exclamation', label: 'Report post', onPress() { - store.shell.openModal(new ReportPostModal(itemUri, itemCid)) + store.shell.openModal({ + name: 'report-post', + postUri: itemUri, + postCid: itemCid, + }) }, }, isAuthor @@ -159,13 +168,12 @@ export function PostDropdownBtn({ icon: ['far', 'trash-can'], label: 'Delete post', onPress() { - store.shell.openModal( - new ConfirmModal( - 'Delete this post?', - 'Are you sure? This can not be undone.', - onDeletePost, - ), - ) + store.shell.openModal({ + name: 'confirm', + title: 'Delete this post?', + message: 'Are you sure? This can not be undone.', + onPressConfirm: onDeletePost, + }) }, } : undefined, diff --git a/src/view/com/util/images/image-crop-picker/ImageCropPicker.tsx b/src/view/com/util/images/image-crop-picker/ImageCropPicker.tsx deleted file mode 100644 index d723fef99..000000000 --- a/src/view/com/util/images/image-crop-picker/ImageCropPicker.tsx +++ /dev/null @@ -1,92 +0,0 @@ -import { - openPicker as openPickerFn, - openCamera as openCameraFn, - openCropper as openCropperFn, - ImageOrVideo, -} from 'react-native-image-crop-picker' -import {RootStoreModel} from 'state/index' -import {PickerOpts, CameraOpts, CropperOpts, PickedMedia} from './types' -export type {PickedMedia} from './types' - -/** - * NOTE - * These methods all include the RootStoreModel as the first param - * because the web versions require it. The signatures have to remain - * equivalent between the different forms, but the store param is not - * used here. - * -prf - */ - -export async function openPicker( - _store: RootStoreModel, - opts: PickerOpts, -): Promise<PickedMedia[]> { - const mediaType = opts.mediaType || 'photo' - const items = await openPickerFn({ - mediaType, - multiple: opts.multiple, - maxFiles: opts.maxFiles, - }) - const toMedia = (item: ImageOrVideo) => ({ - mediaType, - path: item.path, - mime: item.mime, - size: item.size, - width: item.width, - height: item.height, - }) - if (Array.isArray(items)) { - return items.map(toMedia) - } - return [toMedia(items)] -} - -export async function openCamera( - _store: RootStoreModel, - opts: CameraOpts, -): Promise<PickedMedia> { - const mediaType = opts.mediaType || 'photo' - const item = await openCameraFn({ - mediaType, - width: opts.width, - height: opts.height, - freeStyleCropEnabled: opts.freeStyleCropEnabled, - cropperCircleOverlay: opts.cropperCircleOverlay, - cropping: true, - forceJpg: true, // ios only - compressImageQuality: 1.0, - }) - return { - mediaType, - path: item.path, - mime: item.mime, - size: item.size, - width: item.width, - height: item.height, - } -} - -export async function openCropper( - _store: RootStoreModel, - opts: CropperOpts, -): Promise<PickedMedia> { - const mediaType = opts.mediaType || 'photo' - const item = await openCropperFn({ - path: opts.path, - mediaType: opts.mediaType || 'photo', - width: opts.width, - height: opts.height, - freeStyleCropEnabled: opts.freeStyleCropEnabled, - cropperCircleOverlay: opts.cropperCircleOverlay, - forceJpg: true, // ios only - compressImageQuality: 1.0, - }) - return { - mediaType, - path: item.path, - mime: item.mime, - size: item.size, - width: item.width, - height: item.height, - } -} diff --git a/src/view/com/util/images/image-crop-picker/ImageCropPicker.web.tsx b/src/view/com/util/images/image-crop-picker/ImageCropPicker.web.tsx deleted file mode 100644 index d632590d6..000000000 --- a/src/view/com/util/images/image-crop-picker/ImageCropPicker.web.tsx +++ /dev/null @@ -1,75 +0,0 @@ -/// <reference lib="dom" /> - -import {CropImageModal} from 'state/models/shell-ui' -import {PickerOpts, CameraOpts, CropperOpts, PickedMedia} from './types' -export type {PickedMedia} from './types' -import {RootStoreModel} from 'state/index' - -interface PickedFile { - uri: string - path: string - size: number -} - -export async function openPicker( - store: RootStoreModel, - opts: PickerOpts, -): Promise<PickedMedia[] | PickedMedia> { - const res = await selectFile(opts) - return new Promise((resolve, reject) => { - store.shell.openModal( - new CropImageModal(res.uri, (img?: PickedMedia) => { - if (img) { - resolve(img) - } else { - reject(new Error('Canceled')) - } - }), - ) - }) -} - -export async function openCamera( - _store: RootStoreModel, - _opts: CameraOpts, -): Promise<PickedMedia> { - // const mediaType = opts.mediaType || 'photo' TODO - throw new Error('TODO') -} - -export async function openCropper( - _store: RootStoreModel, - _opts: CropperOpts, -): Promise<PickedMedia> { - // const mediaType = opts.mediaType || 'photo' TODO - throw new Error('TODO') -} - -function selectFile(opts: PickerOpts): Promise<PickedFile> { - return new Promise((resolve, reject) => { - var input = document.createElement('input') - input.type = 'file' - input.accept = opts.mediaType === 'photo' ? 'image/*' : '*/*' - input.onchange = e => { - const target = e.target as HTMLInputElement - const file = target?.files?.[0] - if (!file) { - return reject(new Error('Canceled')) - } - - var reader = new FileReader() - reader.readAsDataURL(file) - reader.onload = readerEvent => { - if (!readerEvent.target) { - return reject(new Error('Canceled')) - } - resolve({ - uri: readerEvent.target.result as string, - path: file.name, - size: file.size, - }) - } - } - input.click() - }) -} diff --git a/src/view/com/util/images/image-crop-picker/types.ts b/src/view/com/util/images/image-crop-picker/types.ts deleted file mode 100644 index 3197b4d3e..000000000 --- a/src/view/com/util/images/image-crop-picker/types.ts +++ /dev/null @@ -1,31 +0,0 @@ -export interface PickerOpts { - mediaType?: 'photo' - multiple?: boolean - maxFiles?: number -} - -export interface CameraOpts { - mediaType?: 'photo' - width: number - height: number - freeStyleCropEnabled?: boolean - cropperCircleOverlay?: boolean -} - -export interface CropperOpts { - path: string - mediaType?: 'photo' - width: number - height: number - freeStyleCropEnabled?: boolean - cropperCircleOverlay?: boolean -} - -export interface PickedMedia { - mediaType: 'photo' - path: string - mime: string - size: number - width: number - height: number -} |