mirror of
https://github.com/tw93/Mole.git
synced 2026-02-04 20:19:45 +00:00
🎨 Refactor new feature uninstall
This commit is contained in:
134
lib/common.sh
Normal file
134
lib/common.sh
Normal file
@@ -0,0 +1,134 @@
|
||||
#!/bin/bash
|
||||
# Mac Tools - Common Functions Library
|
||||
# Shared utilities and functions for all modules
|
||||
|
||||
# Color definitions
|
||||
GREEN='\033[0;32m'
|
||||
BLUE='\033[0;34m'
|
||||
YELLOW='\033[1;33m'
|
||||
PURPLE='\033[0;35m'
|
||||
RED='\033[0;31m'
|
||||
NC='\033[0m'
|
||||
|
||||
# Logging functions
|
||||
log_info() { echo -e "${BLUE}$1${NC}"; }
|
||||
log_success() { echo -e "${GREEN}✅ $1${NC}"; }
|
||||
log_warning() { echo -e "${YELLOW}⚠️ $1${NC}"; }
|
||||
log_error() { echo -e "${RED}❌ $1${NC}"; }
|
||||
log_header() { echo -e "\n${PURPLE}▶ $1${NC}"; }
|
||||
|
||||
# System detection
|
||||
detect_architecture() {
|
||||
if [[ "$(uname -m)" == "arm64" ]]; then
|
||||
echo "Apple Silicon"
|
||||
else
|
||||
echo "Intel"
|
||||
fi
|
||||
}
|
||||
|
||||
get_free_space() {
|
||||
df -h / | awk 'NR==2 {print $4}'
|
||||
}
|
||||
|
||||
# Common UI functions
|
||||
clear_screen() {
|
||||
printf '\033[2J\033[H'
|
||||
}
|
||||
|
||||
show_header() {
|
||||
local title="$1"
|
||||
local subtitle="$2"
|
||||
|
||||
clear_screen
|
||||
echo -e "${BLUE}$title${NC}"
|
||||
echo "================================================="
|
||||
if [[ -n "$subtitle" ]]; then
|
||||
echo -e "${PURPLE}$subtitle${NC}"
|
||||
echo ""
|
||||
fi
|
||||
}
|
||||
|
||||
# Keyboard input handling (simple and robust)
|
||||
read_key() {
|
||||
local key rest
|
||||
IFS= read -rsn1 key || return 1
|
||||
|
||||
# Some terminals can yield empty on Enter with -n1; treat as ENTER
|
||||
if [[ -z "$key" ]]; then
|
||||
echo "ENTER"
|
||||
return 0
|
||||
fi
|
||||
|
||||
case "$key" in
|
||||
$'\n'|$'\r') echo "ENTER" ;;
|
||||
' ') echo " " ;;
|
||||
'q'|'Q') echo "QUIT" ;;
|
||||
'a'|'A') echo "ALL" ;;
|
||||
'n'|'N') echo "NONE" ;;
|
||||
'?') echo "HELP" ;;
|
||||
$'\x1b')
|
||||
# Read the next two bytes within 1s; works well on macOS bash 3.2
|
||||
if IFS= read -rsn2 -t 1 rest 2>/dev/null; then
|
||||
case "$rest" in
|
||||
"[A") echo "UP" ;;
|
||||
"[B") echo "DOWN" ;;
|
||||
"[C") echo "RIGHT" ;;
|
||||
"[D") echo "LEFT" ;;
|
||||
*) echo "ESC" ;;
|
||||
esac
|
||||
else
|
||||
echo "ESC"
|
||||
fi
|
||||
;;
|
||||
*) echo "OTHER" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Menu display helper
|
||||
show_menu_option() {
|
||||
local number="$1"
|
||||
local text="$2"
|
||||
local selected="$3"
|
||||
|
||||
if [[ "$selected" == "true" ]]; then
|
||||
echo -e "${BLUE}▶ $number. $text${NC}"
|
||||
else
|
||||
echo " $number. $text"
|
||||
fi
|
||||
}
|
||||
|
||||
# Error handling
|
||||
handle_error() {
|
||||
local message="$1"
|
||||
local exit_code="${2:-1}"
|
||||
|
||||
log_error "$message"
|
||||
exit "$exit_code"
|
||||
}
|
||||
|
||||
# File size utilities
|
||||
get_human_size() {
|
||||
local path="$1"
|
||||
du -sh "$path" 2>/dev/null | cut -f1 || echo "N/A"
|
||||
}
|
||||
|
||||
# Permission checks
|
||||
check_sudo() {
|
||||
if ! sudo -n true 2>/dev/null; then
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
request_sudo() {
|
||||
echo "This operation requires administrator privileges."
|
||||
echo -n "Please enter your password: "
|
||||
read -s password
|
||||
echo
|
||||
if echo "$password" | sudo -S true 2>/dev/null; then
|
||||
return 0
|
||||
else
|
||||
log_error "Invalid password or cancelled"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
Reference in New Issue
Block a user