From 34b8c1f962a5c835351dc6f4369757259998af16 Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Sat, 28 Sep 2024 22:19:31 +0530 Subject: Finish up app menu + fix drag interaction --- src/components/AppMenu.tsx | 39 ++++++++++++++++++---------- src/components/Clock.tsx | 4 +-- src/components/Favorites.tsx | 62 +++++++++++++++++++++++--------------------- 3 files changed, 61 insertions(+), 44 deletions(-) (limited to 'src/components') diff --git a/src/components/AppMenu.tsx b/src/components/AppMenu.tsx index ec0d684..2319e73 100644 --- a/src/components/AppMenu.tsx +++ b/src/components/AppMenu.tsx @@ -2,7 +2,10 @@ 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'; +// @ts-expect-error No declaration file import IntentLauncher from '@angelkrak/react-native-intent-launcher'; +import {TouchableHighlight} from 'react-native-gesture-handler'; +import {useStableCallback} from '../hooks/useStableCallback'; export const AppMenu: React.FC> = ({ app, @@ -11,24 +14,26 @@ export const AppMenu: React.FC> = ({ const [isOpen, setIsOpen] = useState(false); const {addToFavorites, isFavorite, removeFromFavorites} = useFavorites(); - const menuPress = (fn: () => Promise | void) => async () => { + const openContextMenu = useStableCallback(() => setIsOpen(true)); + const closeContextMenu = useStableCallback(() => setIsOpen(false)); + + const onMenuItemPress = (fn: () => Promise | void) => async () => { + closeContextMenu(); await fn(); - setIsOpen(false); }; - const menuItems = [ isFavorite(app.packageName) ? { label: 'Remove from favorites', - onPress: menuPress(() => removeFromFavorites(app.packageName)), + onPress: onMenuItemPress(() => removeFromFavorites(app.packageName)), } : { label: 'Add to favorites', - onPress: menuPress(() => addToFavorites(app.packageName)), + onPress: onMenuItemPress(() => addToFavorites(app.packageName)), }, { label: 'App info', - onPress: menuPress(() => + onPress: onMenuItemPress(() => IntentLauncher.startActivity({ action: 'android.settings.APPLICATION_DETAILS_SETTINGS', data: 'package:' + app.packageName, @@ -37,7 +42,7 @@ export const AppMenu: React.FC> = ({ }, { label: 'Uninstall', - onPress: menuPress(() => + onPress: onMenuItemPress(() => IntentLauncher.startActivity({ action: 'android.intent.action.DELETE', data: 'package:' + app.packageName, @@ -46,25 +51,33 @@ export const AppMenu: React.FC> = ({ }, ]; + const openApp = useStableCallback(() => + IntentLauncher.startAppByPackageName(app.packageName), + ); + return ( <> - setIsOpen(true)}> + {children} - + setIsOpen(false)}> - setIsOpen(false)}> + onRequestClose={closeContextMenu}> + - + {menuItems.map((menuItem) => ( + className="py-3 px-4 border-b border-[#222] last:border-b-0 last:border-transparent"> {menuItem.label} diff --git a/src/components/Clock.tsx b/src/components/Clock.tsx index 619a31b..f41a298 100644 --- a/src/components/Clock.tsx +++ b/src/components/Clock.tsx @@ -1,7 +1,7 @@ import React, {useEffect, useMemo, useState} from 'react'; import {Text, View} from 'react-native'; -export const Clock: React.FC = () => { +export const Clock: React.FC = React.memo(() => { const [date, setDate] = useState(() => new Date()); useEffect(() => { const interval = setInterval(() => { @@ -34,4 +34,4 @@ export const Clock: React.FC = () => { {dateText} ); -}; +}); diff --git a/src/components/Favorites.tsx b/src/components/Favorites.tsx index c2adae7..6ee99cb 100644 --- a/src/components/Favorites.tsx +++ b/src/components/Favorites.tsx @@ -9,12 +9,23 @@ import DraggableFlatList, { } from 'react-native-draggable-flatlist'; import Icon from 'react-native-vector-icons/MaterialIcons'; import {AppMenu} from './AppMenu'; +import {useInstalledApps} from '../hooks/useInstalledApps'; -export const Favorites: React.FC<{apps: AppDetail[]; active: boolean}> = ({ - apps, - active, -}) => { - const {favoriteAppNames, setFavorites, refreshFavorites} = useFavorites(); +const AppLabel: React.FC<{app: AppDetail}> = React.memo(({app}) => { + return ( + + + + {app.label} + + + + ); +}); + +export const Favorites: React.FC<{active: boolean}> = (_) => { + const {apps} = useInstalledApps(); + const {favoriteAppNames, setFavorites} = useFavorites(); const appByName = useMemo( () => Object.fromEntries(apps.map((app) => [app.packageName, app])), @@ -33,40 +44,33 @@ export const Favorites: React.FC<{apps: AppDetail[]; active: boolean}> = ({ [setFavorites], ); - useEffect(() => { - if (!active) return; - refreshFavorites(); - }, [active, refreshFavorites]); - return ( item.packageName} + keyExtractor={(app) => app.packageName} renderItem={({item: app, drag, isActive}) => ( - + - - - {app.label} - - - - - - - + + + + + + + )} - renderPlaceholder={() => } + renderPlaceholder={() => } /> ); -- cgit v1.3.1