diff --git a/packages/interface/src/components/dialog/CreateLibraryDialog.tsx b/packages/interface/src/components/dialog/CreateLibraryDialog.tsx index a45fed7f5..9bd997437 100644 --- a/packages/interface/src/components/dialog/CreateLibraryDialog.tsx +++ b/packages/interface/src/components/dialog/CreateLibraryDialog.tsx @@ -6,9 +6,10 @@ import { PropsWithChildren, useState } from 'react'; export default function CreateLibraryDialog({ children, - onSubmit -}: PropsWithChildren<{ onSubmit?: () => void }>) { - const [openCreateModal, setOpenCreateModal] = useState(false); + onSubmit, + open, + setOpen +}: PropsWithChildren<{ onSubmit?: () => void; open: boolean; setOpen: (state: boolean) => void }>) { const [newLibName, setNewLibName] = useState(''); const queryClient = useQueryClient(); @@ -16,7 +17,7 @@ export default function CreateLibraryDialog({ 'library.create', { onSuccess: (library: any) => { - setOpenCreateModal(false); + setOpen(false); queryClient.setQueryData(['library.list'], (libraries: any) => [ ...(libraries || []), @@ -33,8 +34,8 @@ export default function CreateLibraryDialog({ return ( createLibrary(newLibName)} @@ -48,6 +49,7 @@ export default function CreateLibraryDialog({ value={newLibName} placeholder="My Cool Library" onChange={(e) => setNewLibName(e.target.value)} + required /> ); diff --git a/packages/interface/src/components/dialog/DeleteLibraryDialog.tsx b/packages/interface/src/components/dialog/DeleteLibraryDialog.tsx index 04718ac8b..cdc0363aa 100644 --- a/packages/interface/src/components/dialog/DeleteLibraryDialog.tsx +++ b/packages/interface/src/components/dialog/DeleteLibraryDialog.tsx @@ -22,7 +22,7 @@ export default function DeleteLibraryDialog( return ( { diff --git a/packages/interface/src/components/layout/Sidebar.tsx b/packages/interface/src/components/layout/Sidebar.tsx index 38217c715..aa23904c8 100644 --- a/packages/interface/src/components/layout/Sidebar.tsx +++ b/packages/interface/src/components/layout/Sidebar.tsx @@ -24,7 +24,7 @@ import { } from '@sd/ui'; import clsx from 'clsx'; import { CheckCircle, CirclesFour, Planet, ShareNetwork } from 'phosphor-react'; -import React, { PropsWithChildren } from 'react'; +import React, { PropsWithChildren, useState } from 'react'; import { NavLink, NavLinkProps } from 'react-router-dom'; import { useOperatingSystem } from '../../hooks/useOperatingSystem'; @@ -38,6 +38,7 @@ export function Sidebar() { const os = useOperatingSystem(); const { library, libraries, isLoading: isLoadingLibraries, switchLibrary } = useCurrentLibrary(); const debugState = useDebugState(); + const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false); const { data: isRunningJob } = useLibraryQuery(['jobs.isRunning']); @@ -84,9 +85,9 @@ export function Sidebar() { Library Settings - - Add Library - + setIsCreateDialogOpen(true)}> + Add Library + alert('TODO: Not implemented yet!')}> Lock @@ -142,6 +143,8 @@ export function Sidebar() { {debugState.enabled && } + {/* Putting this within the dropdown will break the enter click handling in the modal. */} + ); } diff --git a/packages/interface/src/components/location/LocationListItem.tsx b/packages/interface/src/components/location/LocationListItem.tsx index 4b1735f94..d1991cba4 100644 --- a/packages/interface/src/components/location/LocationListItem.tsx +++ b/packages/interface/src/components/location/LocationListItem.tsx @@ -14,6 +14,7 @@ interface LocationListItemProps { export default function LocationListItem({ location }: LocationListItemProps) { const [hide, setHide] = useState(false); + const [open, setOpen] = useState(false); const { mutate: locRescan } = useLibraryMutation('locations.fullRescan'); @@ -53,6 +54,8 @@ export default function LocationListItem({ location }: LocationListItemProps) { { diff --git a/packages/interface/src/components/onboarding/Onboarding.tsx b/packages/interface/src/components/onboarding/Onboarding.tsx index b28198b52..8067bd3f0 100644 --- a/packages/interface/src/components/onboarding/Onboarding.tsx +++ b/packages/interface/src/components/onboarding/Onboarding.tsx @@ -1,4 +1,5 @@ import clsx from 'clsx'; +import { useState } from 'react'; import { useNavigate } from 'react-router'; import { Button } from '../../../../ui/src'; @@ -9,6 +10,7 @@ import CreateLibraryDialog from '../dialog/CreateLibraryDialog'; export default function OnboardingPage() { const os = useOperatingSystem(); const navigate = useNavigate(); + const [open, setOpen] = useState(false); return (

Welcome to Spacedrive

- navigate('/overview')}> + navigate('/overview')}> diff --git a/packages/interface/src/screens/settings/library/TagsSettings.tsx b/packages/interface/src/screens/settings/library/TagsSettings.tsx index 058a8e9d7..f1648ce74 100644 --- a/packages/interface/src/screens/settings/library/TagsSettings.tsx +++ b/packages/interface/src/screens/settings/library/TagsSettings.tsx @@ -14,6 +14,7 @@ import { SettingsHeader } from '../../../components/settings/SettingsHeader'; export default function TagsSettings() { const [openCreateModal, setOpenCreateModal] = useState(false); + const [openDeleteModal, setOpenDeleteModal] = useState(false); // creating new tag state const [newColor, setNewColor] = useState('#A717D9'); const [newName, setNewName] = useState(''); @@ -69,7 +70,7 @@ export default function TagsSettings() {
{ @@ -150,6 +151,8 @@ export default function TagsSettings() {
{ diff --git a/packages/interface/src/screens/settings/node/LibrariesSettings.tsx b/packages/interface/src/screens/settings/node/LibrariesSettings.tsx index bf56bb205..d4193c586 100644 --- a/packages/interface/src/screens/settings/node/LibrariesSettings.tsx +++ b/packages/interface/src/screens/settings/node/LibrariesSettings.tsx @@ -42,6 +42,7 @@ function LibraryListItem(props: { library: LibraryConfigWrapped }) { export default function LibrarySettings() { const { data: libraries } = useBridgeQuery(['library.list']); + const [open, setOpen] = useState(false); return ( @@ -50,7 +51,7 @@ export default function LibrarySettings() { description="The database contains all library data and file metadata." rightArea={
- + diff --git a/packages/ui/src/Dialog.tsx b/packages/ui/src/Dialog.tsx index aaaac61c1..346f49f42 100644 --- a/packages/ui/src/Dialog.tsx +++ b/packages/ui/src/Dialog.tsx @@ -1,11 +1,13 @@ import * as DialogPrimitive from '@radix-ui/react-dialog'; import clsx from 'clsx'; import { ReactNode, useState } from 'react'; -import { animated, config, useTransition } from 'react-spring'; +import { animated, useTransition } from 'react-spring'; import { Button, Loader } from '../'; export interface DialogProps extends DialogPrimitive.DialogProps { + open: boolean; + setOpen: (open: boolean) => void; trigger: ReactNode; ctaLabel?: string; ctaDanger?: boolean; @@ -18,9 +20,7 @@ export interface DialogProps extends DialogPrimitive.DialogProps { submitDisabled?: boolean; } -export function Dialog(props: DialogProps) { - const [open, setOpen] = useState(false); - +export function Dialog({ open, setOpen: onOpenChange, ...props }: DialogProps) { const transitions = useTransition(open, { from: { opacity: 0, @@ -33,7 +33,7 @@ export function Dialog(props: DialogProps) { }); return ( - + {props.trigger} {transitions( (styles, show) => @@ -51,7 +51,12 @@ export function Dialog(props: DialogProps) { style={styles} className="min-w-[300px] max-w-[400px] rounded-md bg-app-box border border-app-line text-ink shadow-app-shade" > -
e.preventDefault()}> + { + e.preventDefault(); + if (props.ctaAction) props.ctaAction(); + }} + >
{props.title} @@ -70,7 +75,6 @@ export function Dialog(props: DialogProps) {