import { Button, GetProps, useMedia } from "tamagui"; import React, { useMemo, useState } from "react"; import Drawer from "expo-router/drawer"; import HostList from "./components/host-list"; import HostForm, { hostFormModal } from "./components/form"; import Icons from "@/components/ui/icons"; import { initialValues } from "./schema/form"; import KeyForm from "../keychains/components/form"; import { useUser } from "@/hooks/useUser"; import { useTeamId } from "@/stores/auth"; import { useMoveHost } from "./hooks/query"; import { useQueryParams } from "@/hooks/useQueryParams"; import { BackButton } from "@/components/ui/button"; type Params = { parentId?: string | null; }; export default function HostsPage() { const teamId = useTeamId(); const user = useUser(); const [selected, setSelected] = useState<string[]>([]); const queryParams = useQueryParams<Params>(); const parentId = queryParams.params?.parentId; const media = useMedia(); const setParentId = (id: string | null) => { queryParams.push({ parentId: id || "" }); }; const onGoBack = () => { if (!queryParams.goBack()) { queryParams.replace({ parentId: "" }); } }; const actions = useMemo(() => { if (selected?.length > 0) { return ( <HostsActions selected={selected} parentId={parentId} onClear={() => setSelected([])} /> ); } if (!teamId || user?.teamCanWrite(teamId)) { return ( <AddButton onPress={() => hostFormModal.onOpen({ ...initialValues, parentId })} /> ); } return null; }, [teamId, user, parentId]); return ( <> <Drawer.Screen options={{ headerLeft: parentId ? () => <BackButton onPress={onGoBack} /> : media.gtXs ? () => null : undefined, headerTitle: selected.length > 0 ? `Selected ${selected.length} hosts` : "Hosts", headerRight: () => actions, }} /> <HostList parentId={parentId} onParentIdChange={setParentId} selected={selected} onSelectedChange={setSelected} /> <HostForm /> <KeyForm /> </> ); } const AddButton = (props: GetProps<typeof Button>) => ( <Button bg="$colorTransparent" icon={<Icons name="plus" size={24} />} $gtSm={{ mr: "$2" }} {...props} > New </Button> ); type HostsActionsProps = { selected: string[]; parentId?: string | null; onClear: () => void; }; const actionMode = { CUT: 1, }; const HostsActions = ({ selected, parentId = null, onClear, }: HostsActionsProps) => { const [curMode, setCurMode] = useState(0); const move = useMoveHost(); const onReset = () => { setCurMode(0); onClear(); }; const onMoveAction = () => { move.mutate({ parentId, hostId: selected }, { onSuccess: onReset }); }; return ( <> {curMode === actionMode.CUT ? ( <Button key="paste" circular icon={<Icons name="content-paste" size={20} />} bg="$colorTransparent" onPress={onMoveAction} /> ) : ( <Button key="cut" circular icon={<Icons name="content-cut" size={20} />} bg="$colorTransparent" onPress={() => setCurMode(actionMode.CUT)} /> )} {/* <Button circular icon={<Icons name="trash-can" size={24} />} bg="$colorTransparent" /> */} <Button key="close" circular icon={<Icons name="close" size={24} />} bg="$colorTransparent" onPress={onReset} mr="$2" /> </> ); };