aboutsummaryrefslogtreecommitdiff
path: root/src/components
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2024-09-28 13:46:22 +0530
committerAkshay Nair <phenax5@gmail.com>2024-09-29 16:16:39 +0530
commita1143f3696a0b272018f7eea43ee23a674c618e1 (patch)
tree2289e6a1fbf47d339cb41849f9554d403bd837cc /src/components
parent5d456899ea444301870e1d3c721d139c9251c531 (diff)
downloaddaft-launcher-a1143f3696a0b272018f7eea43ee23a674c618e1.tar.gz
daft-launcher-a1143f3696a0b272018f7eea43ee23a674c618e1.zip
Add context menu for apps (fav,settings,uninstall)
Diffstat (limited to 'src/components')
-rw-r--r--src/components/AppMenu.tsx79
-rw-r--r--src/components/Clock.tsx4
-rw-r--r--src/components/Favorites.tsx49
3 files changed, 111 insertions, 21 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>
+ </>
+ );
+};
diff --git a/src/components/Clock.tsx b/src/components/Clock.tsx
index 113201f..619a31b 100644
--- a/src/components/Clock.tsx
+++ b/src/components/Clock.tsx
@@ -14,7 +14,7 @@ export const Clock: React.FC = () => {
const formatter = new Intl.DateTimeFormat('en', {
hour: 'numeric',
minute: 'numeric',
- second: 'numeric',
+ // second: 'numeric',
});
return formatter.format(date);
}, [date]);
@@ -30,7 +30,7 @@ export const Clock: React.FC = () => {
return (
<View className="p-6">
- <Text className="text-3xl font-bold">{timeText}</Text>
+ <Text className="text-4xl font-bold">{timeText}</Text>
<Text className="text-lg">{dateText}</Text>
</View>
);
diff --git a/src/components/Favorites.tsx b/src/components/Favorites.tsx
index 85ab3c2..c2adae7 100644
--- a/src/components/Favorites.tsx
+++ b/src/components/Favorites.tsx
@@ -1,4 +1,4 @@
-import React, {useCallback, useMemo} from 'react';
+import React, {useCallback, useEffect, useMemo} from 'react';
import {Text, TouchableOpacity, View} from 'react-native';
import {AppDetail} from 'react-native-launcher-kit/typescript/Interfaces/InstalledApps';
import {useFavorites} from '../hooks/useFavorites';
@@ -8,9 +8,13 @@ import DraggableFlatList, {
ShadowDecorator,
} from 'react-native-draggable-flatlist';
import Icon from 'react-native-vector-icons/MaterialIcons';
+import {AppMenu} from './AppMenu';
-export const Favorites: React.FC<{apps: AppDetail[]}> = ({apps}) => {
- const {favoriteAppNames, setFavorites} = useFavorites();
+export const Favorites: React.FC<{apps: AppDetail[]; active: boolean}> = ({
+ apps,
+ active,
+}) => {
+ const {favoriteAppNames, setFavorites, refreshFavorites} = useFavorites();
const appByName = useMemo(
() => Object.fromEntries(apps.map((app) => [app.packageName, app])),
@@ -29,8 +33,13 @@ export const Favorites: React.FC<{apps: AppDetail[]}> = ({apps}) => {
[setFavorites],
);
+ useEffect(() => {
+ if (!active) return;
+ refreshFavorites();
+ }, [active, refreshFavorites]);
+
return (
- <View className="px-4">
+ <View className="px-4 py-1">
<DraggableFlatList
data={favoriteApps}
onDragEnd={onDragEnd}
@@ -38,24 +47,26 @@ export const Favorites: React.FC<{apps: AppDetail[]}> = ({apps}) => {
renderItem={({item: app, drag, isActive}) => (
<ShadowDecorator>
<OpacityDecorator>
- <View
- className={`py-2 px-2 flex-row w-full ${
- isActive ? 'bg-gray-200 opacity-60' : ''
- }`}>
- <Text className="text-lg flex-1">{app.label}</Text>
- <TouchableOpacity
- onLongPress={drag}
- disabled={isActive}
- delayLongPress={500}>
- <View className={'py-1'}>
- <Icon name="drag-indicator" size={21} color="#aaa" />
- </View>
- </TouchableOpacity>
- </View>
+ <AppMenu app={app}>
+ <View
+ className={`py-3 px-2 flex-row w-full ${
+ isActive ? 'bg-gray-950 opacity-60' : ''
+ }`}>
+ <Text className="text-lg flex-1">{app.label}</Text>
+ <TouchableOpacity
+ onLongPress={drag}
+ disabled={isActive}
+ delayLongPress={500}>
+ <View className="py-1">
+ <Icon name="drag-indicator" size={21} color="#444" />
+ </View>
+ </TouchableOpacity>
+ </View>
+ </AppMenu>
</OpacityDecorator>
</ShadowDecorator>
)}
- renderPlaceholder={() => <View className="flex-1 bg-gray-200" />}
+ renderPlaceholder={() => <View className="flex-1 bg-gray-950" />}
/>
</View>
);