import {Href, Stack, useRouter} from "expo-router"; import {StyleSheet, Text, View, ColorValue, ListRenderItemInfo, TouchableOpacity, Platform, Modal} from "react-native"; import {RowMap, SwipeListView} from "react-native-swipe-list-view"; import {ChevronDown, Plus} from "lucide-react-native"; import {useEffect, useState} from "react"; import {MenuAction, MenuView, NativeActionEvent} from "@react-native-menu/menu"; import {SQLiteDatabase, SQLiteProvider, useSQLiteContext} from "expo-sqlite"; import CreateComputer from "@/app/createComputer"; export const iOS_HIGHLIGHT = "#007AFF"; export async function migrateDbIfNeeded(db: SQLiteDatabase) { await db.execAsync(` PRAGMA journal_mode = WAL; CREATE TABLE IF NOT EXISTS servers (key INTEGER PRIMARY KEY NOT NULL, name TEXT NOT NULL, domain TEXT NOT NULL); CREATE TABLE IF NOT EXISTS computers (key INTEGER PRIMARY KEY NOT NULL, server_key INTEGER NOT NULL, name, emoji, background_color, mac_address TEXT NOT NULL); `); } export default function Index() { const [ currentServerName, setCurrentServerName ] = useState("None"); const [ servers, setServers ] = useState([]); const [ computers, setComputers ] = useState([]); return (
); } function Header(props: { servers: Server[], setServers: (value: (((prevState: Server[]) => Server[]) | Server[])) => void, currentServerName: string, setCurrentServerName: (value: (((prevState: string) => string) | string)) => void }) { const db = useSQLiteContext(); useEffect(() => { async function setup() { const result = await db.getFirstAsync(`SELECT * FROM servers`); props.setCurrentServerName(result?.name || "None"); } if (props.currentServerName === "None") { setup(); } }, []); useEffect(() => { async function setup() { const result = await db.getAllAsync(`SELECT * FROM servers`); props.setServers(result); } setup(); }, []); const [ menuEvent, setMenuEvent ] = useState(""); const router = useRouter(); useEffect(() => { if (menuEvent === "addComputer") { router.navigate('/createComputer'); } else if (menuEvent === "addServer") { router.navigate('/createServer'); } setMenuEvent(""); }, [menuEvent]); const selectActions: MenuAction[] = []; for (const server of props.servers) { if (server.name !== props.currentServerName) { selectActions.push({ id: server.domain, title: server.name, titleColor: '#000000', imageColor: '#000000', }) } } selectActions.push({ id: 'deleteServer', title: 'Delete Current Server', attributes: { destructive: true, }, image: Platform.select({ ios: 'trash', android: 'ic_menu_delete', }), imageColor: "red", }) const handleServerSelect = ({nativeEvent}: NativeActionEvent) => { const newName = props.servers.find((server) => { return server.name === nativeEvent.event; }) props.setCurrentServerName(newName?.name ?? "None"); }; const addActions: MenuAction[] = [ { id: 'addServer', title: 'Add WoL Server', titleColor: '#000000', image: 'globe', imageColor: '#000000', } ]; if (props.currentServerName !== "None") { addActions.push({ id: 'addComputer', title: 'Add Computer', titleColor: '#000000', image: 'desktopcomputer', imageColor: '#000000', }); } return {props.currentServerName} {props.servers.length > 0 && } , headerRight: props => { setMenuEvent(nativeEvent.event); }} actions={addActions} shouldOpenOnLongPress={false} > }} /> } const styles = StyleSheet.create({ computerElement: { display: "flex", flexDirection: "row", paddingHorizontal: 24, paddingVertical: 14, gap: 32, backgroundColor: '#FFFFFF' }, computerName: { fontSize: 18, justifyContent: "flex-start", }, computerSubtitle: { fontSize: 12, justifyContent: "flex-start", color: '#979797' }, backTextWhite: { color: '#FFF', }, rowBack: { alignItems: 'center', backgroundColor: '#DDD', flex: 1, flexDirection: 'row', justifyContent: 'space-between', paddingLeft: 15, }, backRightBtn: { alignItems: 'center', bottom: 0, justifyContent: 'center', position: 'absolute', top: 0, width: 75, }, backRightBtnRight: { backgroundColor: 'red', right: 0, }, }); function ComputerList(props: {computers: Computer[], setComputers: (value: (((prevState: Computer[]) => Computer[]) | Computer[])) => void }) { const db = useSQLiteContext(); useEffect(() => { async function setup() { const result = await db.getAllAsync(`SELECT * FROM computers`); props.setComputers(result); } setup(); }, []); const renderHiddenItem = (data: ListRenderItemInfo, rowMap: RowMap) => ( { //TODO: remove it from storage }}> Delete ); return ( ) => //TODO: Make Button {item.emoji} {item.name} {item.mac_address} } rightOpenValue={-75} renderHiddenItem={renderHiddenItem} /> ) } type Server = { key: number, name: string, domain: string, } type Computer = { key: number, server_key: number, name: string, emoji: string, background_color: ColorValue, mac_address: string, }