aboutsummaryrefslogtreecommitdiff
path: root/src/components/AppMenu.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/AppMenu.tsx')
-rw-r--r--src/components/AppMenu.tsx79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/components/AppMenu.tsx b/src/components/AppMenu.tsx
new file mode 100644
index 0000000..ec0d684
--- /dev/null
+++ b/src/components/AppMenu.tsx
@@ -0,0 +1,79 @@
+import {Text, View, Modal, TouchableOpacity, Pressable} from 'react-native';
+import {AppDetail} from 'react-native-launcher-kit/typescript/Interfaces/InstalledApps';
+import {useFavorites} from '../hooks/useFavorites';
+import React, {useState} from 'react';
+import IntentLauncher from '@angelkrak/react-native-intent-launcher';
+
+export const AppMenu: React.FC<React.PropsWithChildren<{app: AppDetail}>> = ({
+ app,
+ children,
+}) => {
+ const [isOpen, setIsOpen] = useState(false);
+ const {addToFavorites, isFavorite, removeFromFavorites} = useFavorites();
+
+ const menuPress = (fn: () => Promise<void> | void) => async () => {
+ await fn();
+ setIsOpen(false);
+ };
+
+ const menuItems = [
+ isFavorite(app.packageName)
+ ? {
+ label: 'Remove from favorites',
+ onPress: menuPress(() => removeFromFavorites(app.packageName)),
+ }
+ : {
+ label: 'Add to favorites',
+ onPress: menuPress(() => addToFavorites(app.packageName)),
+ },
+ {
+ label: 'App info',
+ onPress: menuPress(() =>
+ IntentLauncher.startActivity({
+ action: 'android.settings.APPLICATION_DETAILS_SETTINGS',
+ data: 'package:' + app.packageName,
+ }),
+ ),
+ },
+ {
+ label: 'Uninstall',
+ onPress: menuPress(() =>
+ IntentLauncher.startActivity({
+ action: 'android.intent.action.DELETE',
+ data: 'package:' + app.packageName,
+ }),
+ ),
+ },
+ ];
+
+ return (
+ <>
+ <TouchableOpacity onLongPress={() => setIsOpen(true)}>
+ {children}
+ </TouchableOpacity>
+
+ <Modal
+ visible={isOpen}
+ transparent={true}
+ animationType="none"
+ onRequestClose={() => setIsOpen(false)}>
+ <TouchableOpacity className="flex-1" onPress={() => setIsOpen(false)}>
+ <View className="flex justify-center items-center h-full">
+ <View className="shadow-lg bg-gray-900 w-2/3">
+ {menuItems.map((menuItem) => (
+ <Pressable
+ key={menuItem.label}
+ onPress={menuItem.onPress}
+ className="py-3 px-4 border-b border-gray-800 last:border-b-0">
+ <Text className="text-lg text-gray-300">
+ {menuItem.label}
+ </Text>
+ </Pressable>
+ ))}
+ </View>
+ </View>
+ </TouchableOpacity>
+ </Modal>
+ </>
+ );
+};