diff --git a/apps/onelauncher/frontend/src/hooks/useCluster.ts b/apps/onelauncher/frontend/src/hooks/useCluster.ts deleted file mode 100644 index b9db6006..00000000 --- a/apps/onelauncher/frontend/src/hooks/useCluster.ts +++ /dev/null @@ -1,54 +0,0 @@ -import type { ClusterModel } from '@/bindings.gen'; -import { bindings } from '@/main'; -import { useCommand } from '@onelauncher/common'; -import { useEffect, useState } from 'react'; - -export function useRecentCluster() { - const result = useCommand('getClusters', bindings.core.getClusters); - const [cluster, setCluster] = useState(); - - useEffect(() => { - if (!result.data) - return; - - let mostRecentCluster: ClusterModel | undefined; - - for (const c of result.data) { - if (!mostRecentCluster) { - mostRecentCluster = c; - continue; - } - - const currentPlayed = mostRecentCluster.last_played; - const newPlayed = c.last_played; - - if (typeof currentPlayed !== 'string' && typeof newPlayed === 'string') { - mostRecentCluster = c; - } - else if (typeof currentPlayed === 'string' && typeof newPlayed === 'string') { - const playedAt = new Date(currentPlayed); - const clusterPlayedAt = new Date(newPlayed); - - if (clusterPlayedAt > playedAt) - mostRecentCluster = c; - } - } - - setCluster(mostRecentCluster); - }, [result.data]); - - return cluster; -} - -export function useClusters() { - const result = useCommand('getClusters', bindings.core.getClusters); - const [clusters, setClusters] = useState | undefined>(); - - useEffect(() => { - if (!result.data) - return; - setClusters(result.data); - }, [result.data]); - - return clusters; -} diff --git a/apps/onelauncher/frontend/src/hooks/useCluster.tsx b/apps/onelauncher/frontend/src/hooks/useCluster.tsx new file mode 100644 index 00000000..c188f7c1 --- /dev/null +++ b/apps/onelauncher/frontend/src/hooks/useCluster.tsx @@ -0,0 +1,164 @@ +import type { ClusterModel } from '@/bindings.gen'; +import type { ModalProps } from '@/components/overlay/Modal'; +import { bindings } from '@/main'; +import { useCommand } from '@onelauncher/common'; +import { useEffect, useState } from 'react'; +import Modal from '@/components/overlay/Modal'; +import { Button, Dropdown } from '@onelauncher/common/components'; +import { Heading } from 'react-aria-components'; + +export function useRecentCluster() { + const result = useCommand('getClusters', bindings.core.getClusters); + const [cluster, setCluster] = useState(); + + useEffect(() => { + if (!result.data) + return; + + let mostRecentCluster: ClusterModel | undefined; + + for (const c of result.data) { + if (!mostRecentCluster) { + mostRecentCluster = c; + continue; + } + + const currentPlayed = mostRecentCluster.last_played; + const newPlayed = c.last_played; + + if (typeof currentPlayed !== 'string' && typeof newPlayed === 'string') { + mostRecentCluster = c; + } + else if (typeof currentPlayed === 'string' && typeof newPlayed === 'string') { + const playedAt = new Date(currentPlayed); + const clusterPlayedAt = new Date(newPlayed); + + if (clusterPlayedAt > playedAt) + mostRecentCluster = c; + } + } + + setCluster(mostRecentCluster); + }, [result.data]); + + return cluster; +} + +export function useClusters() { + const result = useCommand('getClusters', bindings.core.getClusters); + const [clusters, setClusters] = useState | undefined>(); + + useEffect(() => { + if (!result.data) + return; + setClusters(result.data); + }, [result.data]); + + return clusters; +} + +type ChooseClusterModalProps = ModalProps & { + clusters?: ClusterModel[]; + confirmText?: string; + selected?: (clusters: ClusterModel[]) => number; + onSelected?: (cluster: ClusterModel) => void; +}; + + +export function ChooseClusterModal({clusters: clusterList, selected: defaultSelected, onSelected, confirmText, ...props}: ChooseClusterModalProps) { + const clusters = useClusters() + const [selected, setSelected] = useState(0); + + useEffect(() => { + if (!clusters) return; + const newSelected = defaultSelected?.(clusters) + if (newSelected) setSelected(newSelected) + }, [clusters]) + + function chooseCluster() { + if (clusters !== undefined && selected !== undefined) { + const cluster = clusters[selected]; + if (cluster !== undefined) + onSelected?.(cluster); + } + } + + return ( + +
+ + Select a Cluster + { + setSelected(index as number) + }} + selectedKey={selected} + > + {clusters?.map((cluster, index) => ( + + {cluster.name} + + ))} + + +
+
+
+
+ ) + + // return ( + // , + //