Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: migrate to expo-image-picker #6143

Open
wants to merge 20 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 18 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

<!-- android 13 media permission -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />

<application
Expand Down
22 changes: 8 additions & 14 deletions app/containers/MessageComposer/constants.ts
Original file line number Diff line number Diff line change
@@ -1,24 +1,18 @@
import { Options } from 'react-native-image-crop-picker';
import { ImagePickerOptions, MediaTypeOptions } from 'expo-image-picker';

import { TMarkdownStyle } from './interfaces';

export const IMAGE_PICKER_CONFIG = {
cropping: true,
avoidEmptySpaceAroundImage: false,
freeStyleCropEnabled: true,
forceJpg: true,
includeExif: true
export const IMAGE_PICKER_CONFIG: ImagePickerOptions = {
exif: true
};

export const LIBRARY_PICKER_CONFIG: Options = {
multiple: true,
compressVideoPreset: 'Passthrough',
mediaType: 'any',
includeExif: true
export const LIBRARY_PICKER_CONFIG: ImagePickerOptions = {
allowsMultipleSelection: true,
exif: true
};

export const VIDEO_PICKER_CONFIG: Options = {
mediaType: 'video'
export const VIDEO_PICKER_CONFIG: ImagePickerOptions = {
mediaTypes: MediaTypeOptions.Videos
};

export const TIMEOUT_CLOSE_EMOJI_KEYBOARD = 300;
Expand Down
107 changes: 0 additions & 107 deletions app/containers/MessageComposer/helpers/forceJpgExtension.test.ts

This file was deleted.

13 changes: 0 additions & 13 deletions app/containers/MessageComposer/helpers/forceJpgExtension.ts

This file was deleted.

1 change: 0 additions & 1 deletion app/containers/MessageComposer/helpers/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
export * from './fetchIsAllOrHere';
export * from './forceJpgExtension';
export * from './getMentionRegexp';
export * from './prepareQuoteMessage';
export * from './insertEmojiAtCursor';
52 changes: 28 additions & 24 deletions app/containers/MessageComposer/hooks/useChooseMedia.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import { Alert } from 'react-native';
import * as DocumentPicker from 'expo-document-picker';

import { IMAGE_PICKER_CONFIG, LIBRARY_PICKER_CONFIG, VIDEO_PICKER_CONFIG } from '../constants';
import { forceJpgExtension } from '../helpers';
import I18n from '../../../i18n';
import { canUploadFile } from '../../../lib/methods/helpers';
import log from '../../../lib/methods/helpers/log';
Expand All @@ -11,7 +10,10 @@ import { getThreadById } from '../../../lib/database/services/Thread';
import Navigation from '../../../lib/navigation/appNavigation';
import { useAppSelector } from '../../../lib/hooks';
import { useRoomContext } from '../../../views/RoomView/context';
import ImagePicker, { ImageOrVideo } from '../../../lib/methods/helpers/ImagePicker/ImagePicker';
import ImagePicker from '../../../lib/methods/helpers/ImagePicker/ImagePicker';
import { mapMediaResult } from '../../../lib/methods/helpers/ImagePicker/mapMediaResult';
import { getPermissions } from '../../../lib/methods/helpers/ImagePicker/getPermissions';
import { IShareAttachment } from '../../../definitions';

export const useChooseMedia = ({
rid,
Expand All @@ -26,25 +28,23 @@ export const useChooseMedia = ({
const { action, setQuotesAndText, selectedMessages, getText } = useRoomContext();
const allowList = FileUpload_MediaTypeWhiteList as string;
const maxFileSize = FileUpload_MaxFileSize as number;
const libPickerLabels = {
cropperChooseText: I18n.t('Choose'),
cropperCancelText: I18n.t('Cancel'),
loadingLabelText: I18n.t('Processing')
};

const takePhoto = async () => {
try {
let image = await ImagePicker.openCamera({ ...IMAGE_PICKER_CONFIG, ...libPickerLabels });
image = forceJpgExtension(image);
const file = image as any; // FIXME: unify those types to remove the need for any
await getPermissions('camera');
const result = await ImagePicker.launchCameraAsync(IMAGE_PICKER_CONFIG);
if (result.canceled) {
return;
}
const media = mapMediaResult(result.assets);
const canUploadResult = canUploadFile({
file,
file: media[0],
allowList,
maxFileSize,
permissionToUploadFile: permissionToUpload
});
if (canUploadResult.success) {
return openShareView([image]);
return openShareView(media);
}

handleError(canUploadResult.error);
Expand All @@ -55,16 +55,20 @@ export const useChooseMedia = ({

const takeVideo = async () => {
try {
const video = await ImagePicker.openCamera({ ...VIDEO_PICKER_CONFIG, ...libPickerLabels });
const file = video as any; // FIXME: unify those types to remove the need for any
await getPermissions('camera');
const result = await ImagePicker.launchCameraAsync(VIDEO_PICKER_CONFIG);
if (result.canceled) {
return;
}
const media = mapMediaResult(result.assets);
const canUploadResult = canUploadFile({
file,
file: media[0],
allowList,
maxFileSize,
permissionToUploadFile: permissionToUpload
});
if (canUploadResult.success) {
return openShareView([video]);
return openShareView(media);
}

handleError(canUploadResult.error);
Expand All @@ -75,13 +79,13 @@ export const useChooseMedia = ({

const chooseFromLibrary = async () => {
try {
// The type can be video or photo, however the lib understands that it is just one of them.
let attachments = (await ImagePicker.openPicker({
...LIBRARY_PICKER_CONFIG,
...libPickerLabels
})) as unknown as ImageOrVideo[]; // FIXME: type this
attachments = attachments.map(att => forceJpgExtension(att));
openShareView(attachments);
await getPermissions('library');
const result = await ImagePicker.launchImageLibraryAsync(LIBRARY_PICKER_CONFIG);
if (result.canceled) {
return;
}
const media = mapMediaResult(result.assets);
openShareView(media);
} catch (e) {
log(e);
}
Expand Down Expand Up @@ -124,7 +128,7 @@ export const useChooseMedia = ({

const finishShareView = (text = '', quotes = []) => setQuotesAndText?.(text, quotes);

const openShareView = async (attachments: any) => {
const openShareView = async (attachments: IShareAttachment[]) => {
if (!rid) return;
const room = await getSubscriptionByRoomId(rid);
let thread;
Expand Down
4 changes: 2 additions & 2 deletions app/definitions/IAttachment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,12 +81,12 @@ export interface IShareAttachment {
size: number;
mime?: string;
path: string;
canUpload: boolean;
canUpload?: boolean;
error?: any;
uri: string;
width?: number;
height?: number;
exif?: {
Orientation: string;
};
base64?: string | null;
}
2 changes: 0 additions & 2 deletions app/i18n/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,6 @@
"Check_again": "Check again",
"Check_canned_responses": "Check on canned responses.",
"Checked": "Checked",
"Choose": "Choose",
"Choose_file": "Choose file",
"Choose_from_library": "Choose from library",
"Choose_where_you_want_links_be_opened": "Choose where you want links be opened",
Expand Down Expand Up @@ -568,7 +567,6 @@
"Presence_Cap_Warning_Title": "User status temporarily disabled",
"Privacy_Policy": " Privacy policy",
"Private": "Private",
"Processing": "Processing...",
"Profile": "Profile",
"Profile_saved_successfully": "Profile saved successfully!",
"Public": "Public",
Expand Down
24 changes: 9 additions & 15 deletions app/lib/methods/helpers/ImagePicker/ImagePicker.mock.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,19 @@
import { random } from 'lodash';
import { Image as ImageType, ImageOrVideo as ImageOrVideoType } from 'react-native-image-crop-picker';

export type Image = ImageType;
export type ImageOrVideo = ImageOrVideoType;

const mockImageRocketBase64 =
'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';

const image = {
exif: null,
filename: 'IMG_0007.PNG',
path: `/tmp/react-native-image-crop-picker/${random(20)}.jpg`,
path: `/tmp/expo-image-picker/${random(20)}.jpg`,
height: 152,
width: 152,
data: mockImageRocketBase64,
base64: mockImageRocketBase64,
modificationDate: null,
localIdentifier: 'CEEE9916-81FD-4544-9D86-7044DB6C4374/L0/001',
size: 5006,
sourceURL: `/tmp/react-native-image-crop-picker/${random(20)}.jpg`,
sourceURL: `/tmp/expo-image-picker/${random(20)}.jpg`,
mime: 'image/jpeg',
cropRect: {
width: 152,
Expand All @@ -29,17 +25,15 @@ const image = {
creationDate: '1679327100'
};

export function openPicker(options: any): Promise<any> {
const mockImageRocketBase64 = options?.multiple ? [image] : image;
return Promise.resolve(mockImageRocketBase64);
export function launchImageLibraryAsync(): Promise<any> {
return Promise.resolve({ assets: [image] });
}

export function openCamera(options: any): Promise<any> {
const mockImageRocketBase64 = options?.multiple ? [image] : image;
return Promise.resolve(mockImageRocketBase64);
export function launchCameraAsync(): Promise<any> {
return Promise.resolve({ assets: [image] });
}

export default {
openPicker,
openCamera
launchImageLibraryAsync,
launchCameraAsync
};
4 changes: 1 addition & 3 deletions app/lib/methods/helpers/ImagePicker/ImagePicker.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import ImagePicker, { Image as ImageInterface, ImageOrVideo as ImageOrVideoType } from 'react-native-image-crop-picker';
import * as ImagePicker from 'expo-image-picker';

export type Image = ImageInterface;
export type ImageOrVideo = ImageOrVideoType;
export default ImagePicker;
16 changes: 16 additions & 0 deletions app/lib/methods/helpers/ImagePicker/getPermissions.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { Linking } from 'react-native';

import ImagePicker from './ImagePicker';

export const getPermissions = async (type: 'camera' | 'library') => {
const method = type === 'camera' ? 'requestCameraPermissionsAsync' : 'requestMediaLibraryPermissionsAsync';
const requestResult = await ImagePicker[method]();
if (!requestResult.canAskAgain) {
Linking.openURL('app-settings:');
return Promise.reject();
}
if (!requestResult.granted) {
return Promise.reject();
}
return Promise.resolve();
};
Loading