Add meme view & sharing
Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
This commit is contained in:
@@ -32,6 +32,15 @@ const rgbToHex = (rgb: string) => {
|
||||
return `#${r.toString(16)}${g.toString(16)}${b.toString(16)}`;
|
||||
};
|
||||
|
||||
const rgbToRgba = (rgb: string, alpha: number) => {
|
||||
const [r, g, b] = rgb
|
||||
.replaceAll(/[^\d,]/g, '')
|
||||
.split(',')
|
||||
.map(value => Number.parseInt(value, 10));
|
||||
|
||||
return `rgba(${r}, ${g}, ${b}, ${alpha})`;
|
||||
};
|
||||
|
||||
const generateRandomColor = () => {
|
||||
const r = Math.floor(Math.random() * 256)
|
||||
.toString(16)
|
||||
@@ -50,5 +59,6 @@ export {
|
||||
isHexColor,
|
||||
isRgbColor,
|
||||
rgbToHex,
|
||||
rgbToRgba,
|
||||
generateRandomColor,
|
||||
};
|
||||
|
@@ -3,6 +3,7 @@ export {
|
||||
isHexColor,
|
||||
isRgbColor,
|
||||
rgbToHex,
|
||||
rgbToRgba,
|
||||
generateRandomColor,
|
||||
} from './color';
|
||||
export { packageName, appName, fileProvider, noOp } from './constants';
|
||||
@@ -14,8 +15,16 @@ export {
|
||||
allowedMimeTypes,
|
||||
getMemeType,
|
||||
} from './filesystem';
|
||||
export { isPermissionForPath, clearPermissions } from './permissions';
|
||||
export { getSortIcon, getViewIcon } from './icon';
|
||||
export {
|
||||
favoriteMeme,
|
||||
shareMeme,
|
||||
copyMeme,
|
||||
editMeme,
|
||||
deleteMeme,
|
||||
} from './meme';
|
||||
export { isPermissionForPath, clearPermissions } from './permissions';
|
||||
export { deleteTag } from './tag';
|
||||
export {
|
||||
type StringValidationResult,
|
||||
validateMemeTitle,
|
||||
|
51
src/utilities/meme.ts
Normal file
51
src/utilities/meme.ts
Normal file
@@ -0,0 +1,51 @@
|
||||
import { NavigationProp } from '@react-navigation/native';
|
||||
import { Dirs, FileSystem } from 'react-native-file-access';
|
||||
import { extension } from 'react-native-mime-types';
|
||||
import Share from 'react-native-share';
|
||||
import Clipboard from '@react-native-clipboard/clipboard';
|
||||
import { Meme } from '../database';
|
||||
import { ROUTE, RootStackParamList } from '../types';
|
||||
|
||||
const favoriteMeme = (realm: Realm, meme: Meme) => {
|
||||
realm.write(() => {
|
||||
meme.isFavorite = !meme.isFavorite;
|
||||
});
|
||||
};
|
||||
|
||||
const shareMeme = async (meme: Meme) => {
|
||||
const fileExtension = extension(meme.mimeType) as string;
|
||||
const cacheUri = `${Dirs.CacheDir}/${meme.id.toHexString()}.${fileExtension}`;
|
||||
await FileSystem.cp(meme.uri, cacheUri);
|
||||
await Share.open({
|
||||
url: `file://${cacheUri}`,
|
||||
type: meme.mimeType,
|
||||
failOnCancel: false,
|
||||
});
|
||||
};
|
||||
|
||||
const copyMeme = (meme: Meme) => {
|
||||
Clipboard.setURI(meme.uri);
|
||||
};
|
||||
|
||||
const editMeme = (
|
||||
navigation: NavigationProp<RootStackParamList>,
|
||||
meme: Meme,
|
||||
) => {
|
||||
navigation.navigate(ROUTE.EDIT_MEME, { id: meme.id.toHexString() });
|
||||
};
|
||||
|
||||
const deleteMeme = async (realm: Realm, meme: Meme) => {
|
||||
await FileSystem.unlink(meme.uri);
|
||||
|
||||
realm.write(() => {
|
||||
for (const tag of meme.tags) {
|
||||
tag.dateModified = new Date();
|
||||
tag.memes.slice(tag.memes.indexOf(meme), 1);
|
||||
tag.memesLength -= 1;
|
||||
}
|
||||
|
||||
realm.delete(meme);
|
||||
});
|
||||
};
|
||||
|
||||
export { favoriteMeme, shareMeme, copyMeme, editMeme, deleteMeme };
|
16
src/utilities/tag.ts
Normal file
16
src/utilities/tag.ts
Normal file
@@ -0,0 +1,16 @@
|
||||
import { Realm } from '@realm/react';
|
||||
import { Tag } from '../database';
|
||||
|
||||
const deleteTag = (realm: Realm, tag: Tag) => {
|
||||
realm.write(() => {
|
||||
for (const meme of tag.memes) {
|
||||
meme.dateModified = new Date();
|
||||
meme.tags.slice(meme.tags.indexOf(tag), 1);
|
||||
meme.tagsLength -= 1;
|
||||
}
|
||||
|
||||
realm.delete(tag);
|
||||
});
|
||||
};
|
||||
|
||||
export { deleteTag };
|
Reference in New Issue
Block a user