From 5f5cd60dd2a08fcac0bf9c5854c913048bb056cc Mon Sep 17 00:00:00 2001 From: "Ericson \"Fogo\" Soares" Date: Thu, 21 Sep 2023 08:10:56 -0300 Subject: [PATCH] [ENG-1116] Distinct job manager for library (#1363) Done --- .github/workflows/server.yml | 14 +- apps/mobile/package.json | 2 +- .../src/components/animation/ProgressBar.tsx | 1 - .../src/components/animation/layout.tsx | 1 - .../src/components/drawer/DrawerContent.tsx | 2 +- .../drawer/DrawerLibraryManager.tsx | 2 +- .../src/components/drawer/DrawerLocations.tsx | 2 +- .../src/components/drawer/DrawerTags.tsx | 2 +- .../src/components/explorer/Explorer.tsx | 2 +- .../src/components/explorer/FileItem.tsx | 2 +- .../src/components/explorer/FileRow.tsx | 2 +- .../src/components/explorer/FileThumb.tsx | 2 +- .../explorer/sections/InfoTagPills.tsx | 1 - .../src/components/form/ColorPicker.tsx | 1 - apps/mobile/src/components/form/Input.tsx | 1 - apps/mobile/src/components/form/Switch.tsx | 1 - apps/mobile/src/components/header/Header.tsx | 1 - apps/mobile/src/components/job/Job.tsx | 2 +- .../src/components/job/JobContainer.tsx | 1 - apps/mobile/src/components/job/JobGroup.tsx | 2 +- .../src/components/key/PasswordMeter.tsx | 1 - apps/mobile/src/components/layout/Card.tsx | 1 - .../src/components/layout/CollapsibleView.tsx | 2 +- apps/mobile/src/components/layout/Modal.tsx | 2 +- .../mobile/src/components/menu/SortByMenu.tsx | 1 - .../components/modal/CreateLibraryModal.tsx | 1 - .../src/components/modal/ImportModal.tsx | 1 - .../confirmModals/DeleteLibraryModal.tsx | 1 - .../confirmModals/DeleteLocationModal.tsx | 1 - .../modal/confirmModals/DeleteTagModal.tsx | 1 - .../modal/inspector/ActionsModal.tsx | 2 +- .../modal/inspector/FileInfoModal.tsx | 1 - .../components/modal/job/JobManagerModal.tsx | 22 +-- .../components/modal/tag/CreateTagModal.tsx | 1 - .../components/modal/tag/UpdateTagModal.tsx | 1 - .../src/components/overview/OverviewStats.tsx | 1 - .../src/components/primitive/Button.tsx | 1 - .../src/components/primitive/Divider.tsx | 1 - .../src/components/primitive/InfoPill.tsx | 1 - apps/mobile/src/components/primitive/Menu.tsx | 1 - .../components/settings/SettingsContainer.tsx | 1 - .../src/components/settings/SettingsItem.tsx | 1 - apps/mobile/src/hooks/useTheme.ts | 1 - .../mobile/src/navigation/DrawerNavigator.tsx | 2 +- .../src/navigation/OnboardingNavigator.tsx | 1 - .../src/navigation/SettingsNavigator.tsx | 1 - apps/mobile/src/navigation/SharedScreens.tsx | 1 - apps/mobile/src/navigation/TabNavigator.tsx | 2 +- apps/mobile/src/navigation/index.tsx | 2 +- .../src/navigation/tabs/OverviewStack.tsx | 2 +- .../src/navigation/tabs/SpacedropStack.tsx | 2 +- .../src/navigation/tabs/SpacesStack.tsx | 2 +- apps/mobile/src/screens/Location.tsx | 1 - apps/mobile/src/screens/NotFound.tsx | 1 - apps/mobile/src/screens/Overview.tsx | 1 - apps/mobile/src/screens/Search.tsx | 1 - apps/mobile/src/screens/Spacedrop.tsx | 1 - apps/mobile/src/screens/Spaces.tsx | 1 - apps/mobile/src/screens/Tag.tsx | 1 - .../screens/onboarding/CreatingLibrary.tsx | 2 +- .../src/screens/onboarding/GetStarted.tsx | 1 - .../src/screens/onboarding/NewLibrary.tsx | 2 +- .../mobile/src/screens/onboarding/Privacy.tsx | 2 +- apps/mobile/src/screens/settings/Settings.tsx | 1 - .../settings/client/AppearanceSettings.tsx | 1 - .../settings/client/ExtensionsSettings.tsx | 1 - .../settings/client/GeneralSettings.tsx | 1 - .../settings/client/LibrarySettings.tsx | 1 - .../settings/client/PrivacySettings.tsx | 1 - .../src/screens/settings/info/About.tsx | 1 - .../src/screens/settings/info/Debug.tsx | 1 - .../src/screens/settings/info/Support.tsx | 1 - .../settings/library/EditLocationSettings.tsx | 1 - .../screens/settings/library/KeysSettings.tsx | 1 - .../library/LibraryGeneralSettings.tsx | 1 - .../settings/library/LocationSettings.tsx | 1 - .../settings/library/NodesSettings.tsx | 1 - .../screens/settings/library/TagsSettings.tsx | 1 - apps/mobile/src/stores/modalStore.ts | 1 - core/src/api/jobs.rs | 161 ++++++++---------- core/src/job/manager.rs | 4 +- core/src/job/worker.rs | 5 + core/src/location/non_indexed.rs | 6 +- .../ContextMenu/FilePath/CutCopyItems.tsx | 2 +- .../Explorer/ContextMenu/FilePath/Items.tsx | 2 +- .../ContextMenu/FilePath/OpenWith.tsx | 2 +- .../Explorer/ContextMenu/Object/Items.tsx | 2 +- .../Explorer/ContextMenu/SharedItems.tsx | 2 +- .../Explorer/ContextMenu/context.tsx | 1 - .../$libraryId/Explorer/ContextMenu/index.tsx | 2 +- .../app/$libraryId/Explorer/CopyAsPath.tsx | 1 - .../$libraryId/Explorer/DismissibleNotice.tsx | 2 +- .../$libraryId/Explorer/FilePath/Thumb.tsx | 2 +- .../app/$libraryId/Explorer/OptionsPanel.tsx | 2 +- .../$libraryId/Explorer/ParentContextMenu.tsx | 2 +- .../Explorer/RevealInNativeExplorer.tsx | 1 - .../app/$libraryId/Explorer/View/GridList.tsx | 2 +- .../app/$libraryId/Explorer/View/ListView.tsx | 14 +- .../$libraryId/Explorer/View/MediaView.tsx | 2 +- interface/app/$libraryId/Explorer/util.ts | 2 +- .../$libraryId/Layout/Sidebar/Contents.tsx | 11 +- .../Layout/Sidebar/DebugPopover.tsx | 2 +- .../Layout/Sidebar/EphemeralSection.tsx | 2 +- .../Sidebar/JobManager/IsRunningJob.tsx | 1 - .../Layout/Sidebar/JobManager/index.tsx | 36 ++-- .../Layout/Sidebar/LibrariesDropdown.tsx | 2 +- .../Layout/Sidebar/LibrarySection.tsx | 2 +- .../app/$libraryId/Layout/Sidebar/Link.tsx | 1 - .../Layout/Sidebar/LocationsContextMenu.tsx | 1 - .../Layout/Sidebar/TagsContextMenu.tsx | 1 - .../Layout/Sidebar/WindowControls.tsx | 2 +- .../app/$libraryId/Layout/Sidebar/index.tsx | 2 +- interface/app/$libraryId/Layout/index.tsx | 2 +- .../app/$libraryId/TopBar/TopBarButton.tsx | 2 +- interface/app/$libraryId/debug.tsx | 1 - interface/app/$libraryId/ephemeral.tsx | 13 +- interface/app/$libraryId/location/$id.tsx | 2 +- .../$libraryId/location/LocationOptions.tsx | 10 +- interface/app/$libraryId/node/$id.tsx | 2 +- .../app/$libraryId/overview/Categories.tsx | 4 +- .../app/$libraryId/overview/Inspector.tsx | 2 +- .../app/$libraryId/overview/Statistics.tsx | 3 +- interface/app/$libraryId/search.tsx | 2 +- interface/app/$libraryId/settings/Layout.tsx | 2 +- interface/app/$libraryId/settings/Setting.tsx | 2 +- interface/app/$libraryId/settings/Sidebar.tsx | 2 +- .../$libraryId/settings/client/backups.tsx | 2 +- .../$libraryId/settings/client/general.tsx | 2 +- .../$libraryId/settings/library/general.tsx | 2 +- .../settings/library/locations/$id.tsx | 4 +- .../library/locations/AddLocationButton.tsx | 4 +- .../library/locations/AddLocationDialog.tsx | 2 +- .../IndexerRuleEditor/RuleButton.tsx | 2 +- .../locations/IndexerRuleEditor/RuleInput.tsx | 2 +- .../locations/IndexerRuleEditor/RulesForm.tsx | 2 +- .../locations/IndexerRuleEditor/index.tsx | 4 +- .../settings/library/locations/ListItem.tsx | 4 +- .../app/$libraryId/settings/library/nodes.tsx | 2 +- .../settings/library/tags/CreateDialog.tsx | 1 - .../settings/library/tags/EditForm.tsx | 2 +- .../settings/library/tags/index.tsx | 2 +- .../settings/node/libraries/ListItem.tsx | 4 +- .../$libraryId/settings/resources/about.tsx | 3 +- .../settings/resources/dependencies.tsx | 1 - interface/app/$libraryId/spacedrop.tsx | 4 +- interface/app/$libraryId/tag/$id.tsx | 2 +- interface/app/index.tsx | 2 +- interface/app/onboarding/Layout.tsx | 2 +- interface/app/onboarding/alpha.tsx | 2 +- interface/app/p2p/Spacedrop.tsx | 2 +- interface/app/style.scss | 42 ++--- interface/components/Accordion.tsx | 2 +- interface/components/AssignTagMenuItems.tsx | 2 +- interface/components/DismissibleNotice.tsx | 1 - interface/components/Folder.tsx | 1 - interface/components/Loader.tsx | 1 - interface/components/PDFViewer.tsx | 1 - interface/components/TrafficLights.tsx | 1 - interface/hooks/useKeyDeleteFile.tsx | 1 - interface/hooks/useKeyMatcher.ts | 43 ++--- interface/hooks/useKeybindFactory.ts | 1 + packages/client/src/core.ts | 4 +- packages/ui/src/CheckBox.tsx | 2 +- packages/ui/src/Input.tsx | 2 +- packages/ui/src/Select.tsx | 2 +- packages/ui/src/Toast.tsx | 2 +- packages/ui/src/forms/Form.tsx | 2 +- packages/ui/style/tailwind.js | 4 +- 168 files changed, 276 insertions(+), 364 deletions(-) diff --git a/.github/workflows/server.yml b/.github/workflows/server.yml index cb9d68540..3172ded67 100644 --- a/.github/workflows/server.yml +++ b/.github/workflows/server.yml @@ -15,12 +15,12 @@ jobs: if: ${{ runner.os == 'Linux' }} uses: easimon/maximize-build-space@master with: - remove-codeql: "true" - remove-dotnet: "true" - remove-haskell: "true" - remove-android: "true" - overprovision-lvm: "true" - remove-docker-images: "true" + remove-codeql: 'true' + remove-dotnet: 'true' + remove-haskell: 'true' + remove-android: 'true' + overprovision-lvm: 'true' + remove-docker-images: 'true' - name: Checkout repository uses: actions/checkout@v3 @@ -56,7 +56,7 @@ jobs: tags: ${{ steps.image_info.outputs.tag }} ${{ github.event_name == 'release' && 'production' || 'staging' }} archs: amd64 image: ${{ steps.image_info.outputs.name }} - layers: "false" + layers: 'false' context: ./apps/server/docker build-args: | REPO=${{ steps.image_info.outputs.repo }} diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 7ebe5d939..18ab0e7c9 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -8,7 +8,7 @@ "start": "expo start --dev-client", "android": "expo run:android", "ios": "expo run:ios", - "prebuild": "expo prebuild", + "prebuild": "expo prebuild", "xcode": "open ios/Spacedrive.xcworkspace", "android-studio": "open -a '/Applications/Android Studio.app' ./android", "lint": "eslint src --cache", diff --git a/apps/mobile/src/components/animation/ProgressBar.tsx b/apps/mobile/src/components/animation/ProgressBar.tsx index 2bb8576cf..5a47d482f 100644 --- a/apps/mobile/src/components/animation/ProgressBar.tsx +++ b/apps/mobile/src/components/animation/ProgressBar.tsx @@ -1,7 +1,6 @@ import { MotiView } from 'moti'; import { memo } from 'react'; import { View } from 'react-native'; - import { tw } from '~/lib/tailwind'; type ProgressBarProps = { diff --git a/apps/mobile/src/components/animation/layout.tsx b/apps/mobile/src/components/animation/layout.tsx index 16a72b5ab..1cf43230f 100644 --- a/apps/mobile/src/components/animation/layout.tsx +++ b/apps/mobile/src/components/animation/layout.tsx @@ -7,7 +7,6 @@ import Animated, { useSharedValue, withTiming } from 'react-native-reanimated'; - import Layout from '~/constants/Layout'; type MotiViewProps = PropsWithChildren; diff --git a/apps/mobile/src/components/drawer/DrawerContent.tsx b/apps/mobile/src/components/drawer/DrawerContent.tsx index 0673b7737..d7ddf9284 100644 --- a/apps/mobile/src/components/drawer/DrawerContent.tsx +++ b/apps/mobile/src/components/drawer/DrawerContent.tsx @@ -5,10 +5,10 @@ import { CheckCircle, Gear } from 'phosphor-react-native'; import { useRef } from 'react'; import { Image, Platform, Pressable, Text, View } from 'react-native'; import { JobManagerContextProvider, useLibraryQuery } from '@sd/client'; - import Layout from '~/constants/Layout'; import { tw, twStyle } from '~/lib/tailwind'; import { getStackNameFromState } from '~/utils/nav'; + import { PulseAnimation } from '../animation/lottie'; import { ModalRef } from '../layout/Modal'; import { JobManagerModal } from '../modal/job/JobManagerModal'; diff --git a/apps/mobile/src/components/drawer/DrawerLibraryManager.tsx b/apps/mobile/src/components/drawer/DrawerLibraryManager.tsx index 945f68f2e..92935e64b 100644 --- a/apps/mobile/src/components/drawer/DrawerLibraryManager.tsx +++ b/apps/mobile/src/components/drawer/DrawerLibraryManager.tsx @@ -5,9 +5,9 @@ import { CaretRight, Gear, Lock, Plus } from 'phosphor-react-native'; import { useEffect, useRef, useState } from 'react'; import { Alert, Pressable, Text, View } from 'react-native'; import { useClientContext } from '@sd/client'; - import { tw, twStyle } from '~/lib/tailwind'; import { currentLibraryStore } from '~/utils/nav'; + import { AnimatedHeight } from '../animation/layout'; import { ModalRef } from '../layout/Modal'; import CreateLibraryModal from '../modal/CreateLibraryModal'; diff --git a/apps/mobile/src/components/drawer/DrawerLocations.tsx b/apps/mobile/src/components/drawer/DrawerLocations.tsx index 6dd19ec5b..e1612495d 100644 --- a/apps/mobile/src/components/drawer/DrawerLocations.tsx +++ b/apps/mobile/src/components/drawer/DrawerLocations.tsx @@ -3,9 +3,9 @@ import { useNavigation } from '@react-navigation/native'; import { useRef } from 'react'; import { Pressable, Text, View } from 'react-native'; import { useLibraryQuery } from '@sd/client'; - import { ModalRef } from '~/components/layout/Modal'; import { tw, twStyle } from '~/lib/tailwind'; + import FolderIcon from '../icons/FolderIcon'; import CollapsibleView from '../layout/CollapsibleView'; import ImportModal from '../modal/ImportModal'; diff --git a/apps/mobile/src/components/drawer/DrawerTags.tsx b/apps/mobile/src/components/drawer/DrawerTags.tsx index 09426de42..1e6c6aa8a 100644 --- a/apps/mobile/src/components/drawer/DrawerTags.tsx +++ b/apps/mobile/src/components/drawer/DrawerTags.tsx @@ -3,9 +3,9 @@ import { useNavigation } from '@react-navigation/native'; import { useRef } from 'react'; import { ColorValue, Pressable, Text, View } from 'react-native'; import { useLibraryQuery } from '@sd/client'; - import { ModalRef } from '~/components/layout/Modal'; import { tw, twStyle } from '~/lib/tailwind'; + import CollapsibleView from '../layout/CollapsibleView'; import CreateTagModal from '../modal/tag/CreateTagModal'; diff --git a/apps/mobile/src/components/explorer/Explorer.tsx b/apps/mobile/src/components/explorer/Explorer.tsx index 6a0cf2fb7..0c234805d 100644 --- a/apps/mobile/src/components/explorer/Explorer.tsx +++ b/apps/mobile/src/components/explorer/Explorer.tsx @@ -4,13 +4,13 @@ import { Rows, SquaresFour } from 'phosphor-react-native'; import { useState } from 'react'; import { Pressable, View } from 'react-native'; import { isPath, type ExplorerItem } from '@sd/client'; - import SortByMenu from '~/components/menu/SortByMenu'; import Layout from '~/constants/Layout'; import { tw } from '~/lib/tailwind'; import { type SharedScreenProps } from '~/navigation/SharedScreens'; import { getExplorerStore } from '~/stores/explorerStore'; import { useActionsModalStore } from '~/stores/modalStore'; + import FileItem from './FileItem'; import FileRow from './FileRow'; diff --git a/apps/mobile/src/components/explorer/FileItem.tsx b/apps/mobile/src/components/explorer/FileItem.tsx index 401830641..f23eec3b0 100644 --- a/apps/mobile/src/components/explorer/FileItem.tsx +++ b/apps/mobile/src/components/explorer/FileItem.tsx @@ -1,9 +1,9 @@ import { Text, View } from 'react-native'; import { ExplorerItem, getItemFilePath } from '@sd/client'; - import Layout from '~/constants/Layout'; import { tw, twStyle } from '~/lib/tailwind'; import { getExplorerStore } from '~/stores/explorerStore'; + import FileThumb from './FileThumb'; type FileItemProps = { diff --git a/apps/mobile/src/components/explorer/FileRow.tsx b/apps/mobile/src/components/explorer/FileRow.tsx index 155c8de32..8853ea77b 100644 --- a/apps/mobile/src/components/explorer/FileRow.tsx +++ b/apps/mobile/src/components/explorer/FileRow.tsx @@ -1,9 +1,9 @@ import React from 'react'; import { Text, View } from 'react-native'; import { ExplorerItem, getItemFilePath } from '@sd/client'; - import { tw, twStyle } from '~/lib/tailwind'; import { getExplorerStore } from '~/stores/explorerStore'; + import FileThumb from './FileThumb'; type FileRowProps = { diff --git a/apps/mobile/src/components/explorer/FileThumb.tsx b/apps/mobile/src/components/explorer/FileThumb.tsx index fcf25a31e..a8b9e65f1 100644 --- a/apps/mobile/src/components/explorer/FileThumb.tsx +++ b/apps/mobile/src/components/explorer/FileThumb.tsx @@ -9,8 +9,8 @@ import { isDarkTheme, type ExplorerItem } from '@sd/client'; - import { flattenThumbnailKey, useExplorerStore } from '~/stores/explorerStore'; + import { tw } from '../../lib/tailwind'; export const getThumbnailUrlByThumbKey = (thumbKey: string[]) => diff --git a/apps/mobile/src/components/explorer/sections/InfoTagPills.tsx b/apps/mobile/src/components/explorer/sections/InfoTagPills.tsx index 8af2131e7..6998d3540 100644 --- a/apps/mobile/src/components/explorer/sections/InfoTagPills.tsx +++ b/apps/mobile/src/components/explorer/sections/InfoTagPills.tsx @@ -8,7 +8,6 @@ import { isPath, useLibraryQuery } from '@sd/client'; - import { InfoPill, PlaceholderPill } from '~/components/primitive/InfoPill'; import { tw, twStyle } from '~/lib/tailwind'; diff --git a/apps/mobile/src/components/form/ColorPicker.tsx b/apps/mobile/src/components/form/ColorPicker.tsx index a4b9a2958..9f45253c2 100644 --- a/apps/mobile/src/components/form/ColorPicker.tsx +++ b/apps/mobile/src/components/form/ColorPicker.tsx @@ -1,6 +1,5 @@ import React from 'react'; import WheelColorPicker from 'react-native-wheel-color-picker'; - import { tw } from '~/lib/tailwind'; type ColorPickerProps = { diff --git a/apps/mobile/src/components/form/Input.tsx b/apps/mobile/src/components/form/Input.tsx index 15ec99b44..d8e5e5b47 100644 --- a/apps/mobile/src/components/form/Input.tsx +++ b/apps/mobile/src/components/form/Input.tsx @@ -3,7 +3,6 @@ import { cva, VariantProps } from 'class-variance-authority'; import { Eye, EyeSlash } from 'phosphor-react-native'; import { useState } from 'react'; import { Pressable, TextInputProps as RNTextInputProps, TextInput, View } from 'react-native'; - import { tw, twStyle } from '~/lib/tailwind'; const input = cva(['rounded-md border text-sm leading-tight shadow-sm'], { diff --git a/apps/mobile/src/components/form/Switch.tsx b/apps/mobile/src/components/form/Switch.tsx index d6f3ca0ac..07e15786a 100644 --- a/apps/mobile/src/components/form/Switch.tsx +++ b/apps/mobile/src/components/form/Switch.tsx @@ -1,6 +1,5 @@ import { FC } from 'react'; import { Switch as RNSwitch, SwitchProps, Text, View } from 'react-native'; - import { tw } from '~/lib/tailwind'; export const Switch: FC = ({ ...props }) => { diff --git a/apps/mobile/src/components/header/Header.tsx b/apps/mobile/src/components/header/Header.tsx index afe8e3081..6bed71021 100644 --- a/apps/mobile/src/components/header/Header.tsx +++ b/apps/mobile/src/components/header/Header.tsx @@ -5,7 +5,6 @@ import { MotiView } from 'moti'; import { List } from 'phosphor-react-native'; import { Pressable, Text, View } from 'react-native'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; - import { tw, twStyle } from '~/lib/tailwind'; // Default header with search bar and button to open drawer diff --git a/apps/mobile/src/components/job/Job.tsx b/apps/mobile/src/components/job/Job.tsx index f5d9fbaa2..e8f359266 100644 --- a/apps/mobile/src/components/job/Job.tsx +++ b/apps/mobile/src/components/job/Job.tsx @@ -11,8 +11,8 @@ import { import { memo } from 'react'; import { View, ViewStyle } from 'react-native'; import { JobProgressEvent, JobReport, useJobInfo } from '@sd/client'; - import { tw } from '~/lib/tailwind'; + import { ProgressBar } from '../animation/ProgressBar'; import JobContainer from './JobContainer'; diff --git a/apps/mobile/src/components/job/JobContainer.tsx b/apps/mobile/src/components/job/JobContainer.tsx index 9cbaf2d36..d7a491f26 100644 --- a/apps/mobile/src/components/job/JobContainer.tsx +++ b/apps/mobile/src/components/job/JobContainer.tsx @@ -2,7 +2,6 @@ import { Icon } from 'phosphor-react-native'; import { Fragment } from 'react'; import { Image, Text, View, ViewStyle } from 'react-native'; import { TextItems } from '@sd/client'; - import { styled, tw, twStyle } from '~/lib/tailwind'; type JobContainerProps = { diff --git a/apps/mobile/src/components/job/JobGroup.tsx b/apps/mobile/src/components/job/JobGroup.tsx index d468ac1a2..141bcba92 100644 --- a/apps/mobile/src/components/job/JobGroup.tsx +++ b/apps/mobile/src/components/job/JobGroup.tsx @@ -13,8 +13,8 @@ import { useLibraryMutation, useTotalElapsedTimeText } from '@sd/client'; - import { tw } from '~/lib/tailwind'; + import { AnimatedHeight } from '../animation/layout'; import { ProgressBar } from '../animation/ProgressBar'; import { Button } from '../primitive/Button'; diff --git a/apps/mobile/src/components/key/PasswordMeter.tsx b/apps/mobile/src/components/key/PasswordMeter.tsx index 760ea13e1..83cc693fe 100644 --- a/apps/mobile/src/components/key/PasswordMeter.tsx +++ b/apps/mobile/src/components/key/PasswordMeter.tsx @@ -1,6 +1,5 @@ import { Text, View, ViewStyle } from 'react-native'; import { getPasswordStrength } from '@sd/client'; - import { tw, twStyle } from '~/lib/tailwind'; // NOTE: Lazy load this component. diff --git a/apps/mobile/src/components/layout/Card.tsx b/apps/mobile/src/components/layout/Card.tsx index 92227b814..67381ce43 100644 --- a/apps/mobile/src/components/layout/Card.tsx +++ b/apps/mobile/src/components/layout/Card.tsx @@ -1,6 +1,5 @@ import React from 'react'; import { View, ViewProps } from 'react-native'; - import { twStyle } from '~/lib/tailwind'; type CardProps = { diff --git a/apps/mobile/src/components/layout/CollapsibleView.tsx b/apps/mobile/src/components/layout/CollapsibleView.tsx index d5196103e..a7bc3bb8e 100644 --- a/apps/mobile/src/components/layout/CollapsibleView.tsx +++ b/apps/mobile/src/components/layout/CollapsibleView.tsx @@ -2,8 +2,8 @@ import { MotiView } from 'moti'; import { CaretRight } from 'phosphor-react-native'; import { PropsWithChildren, useReducer } from 'react'; import { Pressable, StyleProp, Text, TextStyle, View, ViewStyle } from 'react-native'; - import { tw } from '~/lib/tailwind'; + import { AnimatedHeight } from '../animation/layout'; type CollapsibleViewProps = PropsWithChildren<{ diff --git a/apps/mobile/src/components/layout/Modal.tsx b/apps/mobile/src/components/layout/Modal.tsx index 302659bca..d8ce563af 100644 --- a/apps/mobile/src/components/layout/Modal.tsx +++ b/apps/mobile/src/components/layout/Modal.tsx @@ -11,9 +11,9 @@ import { import { X } from 'phosphor-react-native'; import { forwardRef, ReactNode } from 'react'; import { Pressable, Text, View } from 'react-native'; - import useForwardedRef from '~/hooks/useForwardedRef'; import { tw } from '~/lib/tailwind'; + import { Button } from '../primitive/Button'; const ModalBackdrop = (props: BottomSheetBackdropProps) => ( diff --git a/apps/mobile/src/components/menu/SortByMenu.tsx b/apps/mobile/src/components/menu/SortByMenu.tsx index 4f5022319..5f6d135ad 100644 --- a/apps/mobile/src/components/menu/SortByMenu.tsx +++ b/apps/mobile/src/components/menu/SortByMenu.tsx @@ -1,7 +1,6 @@ import { ArrowDown, ArrowUp } from 'phosphor-react-native'; import { useState } from 'react'; import { Text, View } from 'react-native'; - import { Menu, MenuItem } from '~/components/primitive/Menu'; import { tw } from '~/lib/tailwind'; diff --git a/apps/mobile/src/components/modal/CreateLibraryModal.tsx b/apps/mobile/src/components/modal/CreateLibraryModal.tsx index 95c2f3090..10adb6209 100644 --- a/apps/mobile/src/components/modal/CreateLibraryModal.tsx +++ b/apps/mobile/src/components/modal/CreateLibraryModal.tsx @@ -2,7 +2,6 @@ import { useQueryClient } from '@tanstack/react-query'; import { forwardRef, useState } from 'react'; import { Text, View } from 'react-native'; import { useBridgeMutation, usePlausibleEvent } from '@sd/client'; - import { ModalInput } from '~/components/form/Input'; import { Modal, ModalRef } from '~/components/layout/Modal'; import { Button } from '~/components/primitive/Button'; diff --git a/apps/mobile/src/components/modal/ImportModal.tsx b/apps/mobile/src/components/modal/ImportModal.tsx index f7c0fc7f0..01dc55386 100644 --- a/apps/mobile/src/components/modal/ImportModal.tsx +++ b/apps/mobile/src/components/modal/ImportModal.tsx @@ -2,7 +2,6 @@ import { forwardRef, useCallback } from 'react'; import { Alert, Text, View } from 'react-native'; import DocumentPicker from 'react-native-document-picker'; import { useLibraryMutation } from '@sd/client'; - import { Modal, ModalRef } from '~/components/layout/Modal'; import { Button } from '~/components/primitive/Button'; import useForwardedRef from '~/hooks/useForwardedRef'; diff --git a/apps/mobile/src/components/modal/confirmModals/DeleteLibraryModal.tsx b/apps/mobile/src/components/modal/confirmModals/DeleteLibraryModal.tsx index 1c0020733..ceaffe945 100644 --- a/apps/mobile/src/components/modal/confirmModals/DeleteLibraryModal.tsx +++ b/apps/mobile/src/components/modal/confirmModals/DeleteLibraryModal.tsx @@ -1,7 +1,6 @@ import { useQueryClient } from '@tanstack/react-query'; import { useRef } from 'react'; import { useBridgeMutation, usePlausibleEvent } from '@sd/client'; - import { ConfirmModal, ModalRef } from '~/components/layout/Modal'; type Props = { diff --git a/apps/mobile/src/components/modal/confirmModals/DeleteLocationModal.tsx b/apps/mobile/src/components/modal/confirmModals/DeleteLocationModal.tsx index 8ae96d389..a477558f7 100644 --- a/apps/mobile/src/components/modal/confirmModals/DeleteLocationModal.tsx +++ b/apps/mobile/src/components/modal/confirmModals/DeleteLocationModal.tsx @@ -1,6 +1,5 @@ import { useRef } from 'react'; import { useLibraryMutation, usePlausibleEvent } from '@sd/client'; - import { ConfirmModal, ModalRef } from '~/components/layout/Modal'; type Props = { diff --git a/apps/mobile/src/components/modal/confirmModals/DeleteTagModal.tsx b/apps/mobile/src/components/modal/confirmModals/DeleteTagModal.tsx index 0aa831062..8d5165f31 100644 --- a/apps/mobile/src/components/modal/confirmModals/DeleteTagModal.tsx +++ b/apps/mobile/src/components/modal/confirmModals/DeleteTagModal.tsx @@ -1,6 +1,5 @@ import { useRef } from 'react'; import { useLibraryMutation, usePlausibleEvent } from '@sd/client'; - import { ConfirmModal, ModalRef } from '~/components/layout/Modal'; type Props = { diff --git a/apps/mobile/src/components/modal/inspector/ActionsModal.tsx b/apps/mobile/src/components/modal/inspector/ActionsModal.tsx index e74bd2e6a..9577193b3 100644 --- a/apps/mobile/src/components/modal/inspector/ActionsModal.tsx +++ b/apps/mobile/src/components/modal/inspector/ActionsModal.tsx @@ -13,13 +13,13 @@ import { import { PropsWithChildren, useRef } from 'react'; import { Pressable, Text, View, ViewStyle } from 'react-native'; import { byteSize, getItemFilePath, getItemObject } from '@sd/client'; - import FileThumb from '~/components/explorer/FileThumb'; import FavoriteButton from '~/components/explorer/sections/FavoriteButton'; import InfoTagPills from '~/components/explorer/sections/InfoTagPills'; import { Modal, ModalRef } from '~/components/layout/Modal'; import { tw, twStyle } from '~/lib/tailwind'; import { useActionsModalStore } from '~/stores/modalStore'; + import FileInfoModal from './FileInfoModal'; type ActionsContainerProps = PropsWithChildren<{ diff --git a/apps/mobile/src/components/modal/inspector/FileInfoModal.tsx b/apps/mobile/src/components/modal/inspector/FileInfoModal.tsx index bf7267681..7e27124d6 100644 --- a/apps/mobile/src/components/modal/inspector/FileInfoModal.tsx +++ b/apps/mobile/src/components/modal/inspector/FileInfoModal.tsx @@ -17,7 +17,6 @@ import { useLibraryQuery, type ExplorerItem } from '@sd/client'; - import FileThumb from '~/components/explorer/FileThumb'; import InfoTagPills from '~/components/explorer/sections/InfoTagPills'; import { Modal, ModalScrollView, type ModalRef } from '~/components/layout/Modal'; diff --git a/apps/mobile/src/components/modal/job/JobManagerModal.tsx b/apps/mobile/src/components/modal/job/JobManagerModal.tsx index 219965ea5..fb4face99 100644 --- a/apps/mobile/src/components/modal/job/JobManagerModal.tsx +++ b/apps/mobile/src/components/modal/job/JobManagerModal.tsx @@ -1,7 +1,7 @@ -import { forwardRef, useMemo } from 'react'; +import { useQueryClient } from '@tanstack/react-query'; +import { forwardRef } from 'react'; import { FlatList, Text, View } from 'react-native'; -import { useBridgeQuery, useJobProgress } from '@sd/client'; - +import { useJobProgress, useLibraryQuery } from '@sd/client'; import JobGroup from '~/components/job/JobGroup'; import { Modal, ModalRef } from '~/components/layout/Modal'; import { tw } from '~/lib/tailwind'; @@ -11,18 +11,10 @@ import { tw } from '~/lib/tailwind'; // - Add clear all jobs button export const JobManagerModal = forwardRef((_, ref) => { - const jobGroupsById = useBridgeQuery(['jobs.reports']); - - // TODO: Currently we're only clustering togheter all job reports from all libraries without any distinction. - // TODO: We should probably cluster them by library in the job manager UI - - const jobGroups = useMemo(() => { - if (!jobGroupsById.data) return []; - return Object.values(jobGroupsById.data).flat(); - }, [jobGroupsById.data]); - - const progress = useJobProgress(jobGroups); + const queryClient = useQueryClient(); + const jobGroups = useLibraryQuery(['jobs.reports']); + const progress = useJobProgress(jobGroups.data); // const clearAllJobs = useLibraryMutation(['jobs.clearAll'], { // onError: () => { // // TODO: Show error toast @@ -35,7 +27,7 @@ export const JobManagerModal = forwardRef((_, ref) => { return ( i.id} contentContainerStyle={tw`mt-4`} diff --git a/apps/mobile/src/components/modal/tag/CreateTagModal.tsx b/apps/mobile/src/components/modal/tag/CreateTagModal.tsx index 25fc6ddd1..020d46295 100644 --- a/apps/mobile/src/components/modal/tag/CreateTagModal.tsx +++ b/apps/mobile/src/components/modal/tag/CreateTagModal.tsx @@ -3,7 +3,6 @@ import { forwardRef, useEffect, useState } from 'react'; import { Pressable, Text, View } from 'react-native'; import ColorPicker from 'react-native-wheel-color-picker'; import { useLibraryMutation, usePlausibleEvent } from '@sd/client'; - import { FadeInAnimation } from '~/components/animation/layout'; import { ModalInput } from '~/components/form/Input'; import { Modal, ModalRef } from '~/components/layout/Modal'; diff --git a/apps/mobile/src/components/modal/tag/UpdateTagModal.tsx b/apps/mobile/src/components/modal/tag/UpdateTagModal.tsx index 9f47741a8..472f4d8d5 100644 --- a/apps/mobile/src/components/modal/tag/UpdateTagModal.tsx +++ b/apps/mobile/src/components/modal/tag/UpdateTagModal.tsx @@ -2,7 +2,6 @@ import { useQueryClient } from '@tanstack/react-query'; import { forwardRef, useEffect, useState } from 'react'; import { Pressable, Text, View } from 'react-native'; import { Tag, useLibraryMutation } from '@sd/client'; - import { FadeInAnimation } from '~/components/animation/layout'; import ColorPicker from '~/components/form/ColorPicker'; import { Input } from '~/components/form/Input'; diff --git a/apps/mobile/src/components/overview/OverviewStats.tsx b/apps/mobile/src/components/overview/OverviewStats.tsx index 1ac46d353..4a052d129 100644 --- a/apps/mobile/src/components/overview/OverviewStats.tsx +++ b/apps/mobile/src/components/overview/OverviewStats.tsx @@ -2,7 +2,6 @@ import { FC, useEffect, useState } from 'react'; import { ScrollView, Text, View } from 'react-native'; import RNFS from 'react-native-fs'; import { byteSize, Statistics, useLibraryQuery } from '@sd/client'; - import useCounter from '~/hooks/useCounter'; import { tw, twStyle } from '~/lib/tailwind'; diff --git a/apps/mobile/src/components/primitive/Button.tsx b/apps/mobile/src/components/primitive/Button.tsx index 6cb8deeb0..75738e936 100644 --- a/apps/mobile/src/components/primitive/Button.tsx +++ b/apps/mobile/src/components/primitive/Button.tsx @@ -2,7 +2,6 @@ import { cva, VariantProps } from 'class-variance-authority'; import { MotiPressable, MotiPressableProps } from 'moti/interactions'; import { FC, useMemo } from 'react'; import { Pressable, PressableProps, View, ViewProps } from 'react-native'; - import { twStyle } from '~/lib/tailwind'; const button = cva(['items-center justify-center rounded-md border shadow-sm'], { diff --git a/apps/mobile/src/components/primitive/Divider.tsx b/apps/mobile/src/components/primitive/Divider.tsx index 13a441cb2..08ba31988 100644 --- a/apps/mobile/src/components/primitive/Divider.tsx +++ b/apps/mobile/src/components/primitive/Divider.tsx @@ -1,5 +1,4 @@ import { View } from 'react-native'; - import { styled } from '~/lib/tailwind'; export const Divider = styled(View, 'bg-app-line my-1 h-[1px] w-full'); diff --git a/apps/mobile/src/components/primitive/InfoPill.tsx b/apps/mobile/src/components/primitive/InfoPill.tsx index 29b2a8c53..487c995cf 100644 --- a/apps/mobile/src/components/primitive/InfoPill.tsx +++ b/apps/mobile/src/components/primitive/InfoPill.tsx @@ -1,6 +1,5 @@ import React from 'react'; import { Text, TextStyle, View, ViewStyle } from 'react-native'; - import { twStyle } from '~/lib/tailwind'; type Props = { diff --git a/apps/mobile/src/components/primitive/Menu.tsx b/apps/mobile/src/components/primitive/Menu.tsx index 5a8234c27..e74c5889b 100644 --- a/apps/mobile/src/components/primitive/Menu.tsx +++ b/apps/mobile/src/components/primitive/Menu.tsx @@ -8,7 +8,6 @@ import { Menu as PMenu, renderers } from 'react-native-popup-menu'; - import { tw } from '~/lib/tailwind'; type MenuProps = { diff --git a/apps/mobile/src/components/settings/SettingsContainer.tsx b/apps/mobile/src/components/settings/SettingsContainer.tsx index 95434bea5..c24165ece 100644 --- a/apps/mobile/src/components/settings/SettingsContainer.tsx +++ b/apps/mobile/src/components/settings/SettingsContainer.tsx @@ -1,6 +1,5 @@ import { PropsWithChildren } from 'react'; import { Text, View } from 'react-native'; - import { styled, tw } from '~/lib/tailwind'; type SettingsContainerProps = PropsWithChildren<{ diff --git a/apps/mobile/src/components/settings/SettingsItem.tsx b/apps/mobile/src/components/settings/SettingsItem.tsx index ae334d5be..a7bfebbe8 100644 --- a/apps/mobile/src/components/settings/SettingsItem.tsx +++ b/apps/mobile/src/components/settings/SettingsItem.tsx @@ -1,6 +1,5 @@ import { CaretRight, Icon } from 'phosphor-react-native'; import { Pressable, Text, View, ViewStyle } from 'react-native'; - import { tw, twStyle } from '~/lib/tailwind'; type SettingsItemProps = { diff --git a/apps/mobile/src/hooks/useTheme.ts b/apps/mobile/src/hooks/useTheme.ts index 8e2f36bb6..c14adb9ab 100644 --- a/apps/mobile/src/hooks/useTheme.ts +++ b/apps/mobile/src/hooks/useTheme.ts @@ -3,7 +3,6 @@ import { Appearance, NativeEventSubscription } from 'react-native'; import { useDeviceContext } from 'twrnc'; import { subscribe } from 'valtio'; import { getThemeStore } from '@sd/client'; - import { changeTwTheme, tw } from '~/lib/tailwind'; export function useTheme() { diff --git a/apps/mobile/src/navigation/DrawerNavigator.tsx b/apps/mobile/src/navigation/DrawerNavigator.tsx index 36cba8eff..4efbfc0fa 100644 --- a/apps/mobile/src/navigation/DrawerNavigator.tsx +++ b/apps/mobile/src/navigation/DrawerNavigator.tsx @@ -1,9 +1,9 @@ import { createDrawerNavigator, DrawerScreenProps } from '@react-navigation/drawer'; import { CompositeScreenProps, NavigatorScreenParams } from '@react-navigation/native'; import { StackScreenProps } from '@react-navigation/stack'; - import DrawerContent from '~/components/drawer/DrawerContent'; import { tw } from '~/lib/tailwind'; + import type { RootStackParamList } from '.'; import type { TabParamList } from './TabNavigator'; import TabNavigator from './TabNavigator'; diff --git a/apps/mobile/src/navigation/OnboardingNavigator.tsx b/apps/mobile/src/navigation/OnboardingNavigator.tsx index 58ae8ee32..24da8dc13 100644 --- a/apps/mobile/src/navigation/OnboardingNavigator.tsx +++ b/apps/mobile/src/navigation/OnboardingNavigator.tsx @@ -1,5 +1,4 @@ import { createStackNavigator, StackScreenProps } from '@react-navigation/stack'; - import { OnboardingContext, useContextValue } from '~/screens/onboarding/context'; import CreatingLibraryScreen from '~/screens/onboarding/CreatingLibrary'; import GetStartedScreen from '~/screens/onboarding/GetStarted'; diff --git a/apps/mobile/src/navigation/SettingsNavigator.tsx b/apps/mobile/src/navigation/SettingsNavigator.tsx index 885147dd0..83791d79d 100644 --- a/apps/mobile/src/navigation/SettingsNavigator.tsx +++ b/apps/mobile/src/navigation/SettingsNavigator.tsx @@ -1,5 +1,4 @@ import { createStackNavigator, StackScreenProps } from '@react-navigation/stack'; - import { tw } from '~/lib/tailwind'; import AppearanceSettingsScreen from '~/screens/settings/client/AppearanceSettings'; import ExtensionsSettingsScreen from '~/screens/settings/client/ExtensionsSettings'; diff --git a/apps/mobile/src/navigation/SharedScreens.tsx b/apps/mobile/src/navigation/SharedScreens.tsx index ca3bc96f6..bf564e448 100644 --- a/apps/mobile/src/navigation/SharedScreens.tsx +++ b/apps/mobile/src/navigation/SharedScreens.tsx @@ -4,7 +4,6 @@ import { StackNavigationOptions, StackScreenProps } from '@react-navigation/stack'; - import LocationScreen from '~/screens/Location'; import TagScreen from '~/screens/Tag'; diff --git a/apps/mobile/src/navigation/TabNavigator.tsx b/apps/mobile/src/navigation/TabNavigator.tsx index c4678103f..6a7553276 100644 --- a/apps/mobile/src/navigation/TabNavigator.tsx +++ b/apps/mobile/src/navigation/TabNavigator.tsx @@ -1,8 +1,8 @@ import { BottomTabScreenProps, createBottomTabNavigator } from '@react-navigation/bottom-tabs'; import { CompositeScreenProps, NavigatorScreenParams } from '@react-navigation/native'; import { Broadcast, CirclesFour, Planet } from 'phosphor-react-native'; - import { tw } from '~/lib/tailwind'; + import type { HomeDrawerScreenProps } from './DrawerNavigator'; import OverviewStack, { OverviewStackParamList } from './tabs/OverviewStack'; import SpacedropStack, { SpacedropStackParamList } from './tabs/SpacedropStack'; diff --git a/apps/mobile/src/navigation/index.tsx b/apps/mobile/src/navigation/index.tsx index bb6459fb4..5f6a9f3dd 100644 --- a/apps/mobile/src/navigation/index.tsx +++ b/apps/mobile/src/navigation/index.tsx @@ -1,9 +1,9 @@ import { NavigatorScreenParams } from '@react-navigation/native'; import { createStackNavigator, StackScreenProps } from '@react-navigation/stack'; - import { tw } from '~/lib/tailwind'; import NotFoundScreen from '~/screens/NotFound'; import SearchScreen from '~/screens/Search'; + import type { DrawerNavParamList } from './DrawerNavigator'; import DrawerNavigator from './DrawerNavigator'; import SettingsNavigator, { SettingsStackParamList } from './SettingsNavigator'; diff --git a/apps/mobile/src/navigation/tabs/OverviewStack.tsx b/apps/mobile/src/navigation/tabs/OverviewStack.tsx index 1bafc990f..0b85baa3b 100644 --- a/apps/mobile/src/navigation/tabs/OverviewStack.tsx +++ b/apps/mobile/src/navigation/tabs/OverviewStack.tsx @@ -1,8 +1,8 @@ import { CompositeScreenProps } from '@react-navigation/native'; import { createStackNavigator, StackScreenProps } from '@react-navigation/stack'; - import Header from '~/components/header/Header'; import { tw } from '~/lib/tailwind'; + import OverviewScreen from '../../screens/Overview'; import { SharedScreens, SharedScreensParamList } from '../SharedScreens'; import { TabScreenProps } from '../TabNavigator'; diff --git a/apps/mobile/src/navigation/tabs/SpacedropStack.tsx b/apps/mobile/src/navigation/tabs/SpacedropStack.tsx index c37b3c02f..7ace1cbbc 100644 --- a/apps/mobile/src/navigation/tabs/SpacedropStack.tsx +++ b/apps/mobile/src/navigation/tabs/SpacedropStack.tsx @@ -1,9 +1,9 @@ import { CompositeScreenProps } from '@react-navigation/native'; import { createStackNavigator, StackScreenProps } from '@react-navigation/stack'; - import Header from '~/components/header/Header'; import { tw } from '~/lib/tailwind'; import SpacedropScreen from '~/screens/Spacedrop'; + import { SharedScreens, SharedScreensParamList } from '../SharedScreens'; import { TabScreenProps } from '../TabNavigator'; diff --git a/apps/mobile/src/navigation/tabs/SpacesStack.tsx b/apps/mobile/src/navigation/tabs/SpacesStack.tsx index 1946054c6..c5f2a9ef7 100644 --- a/apps/mobile/src/navigation/tabs/SpacesStack.tsx +++ b/apps/mobile/src/navigation/tabs/SpacesStack.tsx @@ -1,8 +1,8 @@ import { CompositeScreenProps } from '@react-navigation/native'; import { createStackNavigator, StackScreenProps } from '@react-navigation/stack'; - import Header from '~/components/header/Header'; import { tw } from '~/lib/tailwind'; + import SpacesScreen from '../../screens/Spaces'; import { SharedScreens, SharedScreensParamList } from '../SharedScreens'; import { TabScreenProps } from '../TabNavigator'; diff --git a/apps/mobile/src/screens/Location.tsx b/apps/mobile/src/screens/Location.tsx index 103f717f4..43b8df4b9 100644 --- a/apps/mobile/src/screens/Location.tsx +++ b/apps/mobile/src/screens/Location.tsx @@ -1,6 +1,5 @@ import { useEffect } from 'react'; import { useLibraryQuery } from '@sd/client'; - import Explorer from '~/components/explorer/Explorer'; import { SharedScreenProps } from '~/navigation/SharedScreens'; import { getExplorerStore } from '~/stores/explorerStore'; diff --git a/apps/mobile/src/screens/NotFound.tsx b/apps/mobile/src/screens/NotFound.tsx index 89a1ebbc3..c1014685d 100644 --- a/apps/mobile/src/screens/NotFound.tsx +++ b/apps/mobile/src/screens/NotFound.tsx @@ -1,5 +1,4 @@ import { Text, TouchableOpacity, View } from 'react-native'; - import { tw } from '~/lib/tailwind'; import { RootStackScreenProps } from '~/navigation'; diff --git a/apps/mobile/src/screens/Overview.tsx b/apps/mobile/src/screens/Overview.tsx index ec06a1183..962c231e4 100644 --- a/apps/mobile/src/screens/Overview.tsx +++ b/apps/mobile/src/screens/Overview.tsx @@ -1,5 +1,4 @@ import { View } from 'react-native'; - import VirtualizedListWrapper from '~/components/layout/VirtualizedListWrapper'; import OverviewStats from '~/components/overview/OverviewStats'; import { tw } from '~/lib/tailwind'; diff --git a/apps/mobile/src/screens/Search.tsx b/apps/mobile/src/screens/Search.tsx index 8fefb6882..8526a8d55 100644 --- a/apps/mobile/src/screens/Search.tsx +++ b/apps/mobile/src/screens/Search.tsx @@ -3,7 +3,6 @@ import { Suspense, useDeferredValue, useMemo, useState } from 'react'; import { ActivityIndicator, Pressable, Text, TextInput, View } from 'react-native'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { getExplorerItemData, useLibraryQuery } from '@sd/client'; - import Explorer from '~/components/explorer/Explorer'; import { tw, twStyle } from '~/lib/tailwind'; import { RootStackScreenProps } from '~/navigation'; diff --git a/apps/mobile/src/screens/Spacedrop.tsx b/apps/mobile/src/screens/Spacedrop.tsx index d0e5ba4e8..fc9781104 100644 --- a/apps/mobile/src/screens/Spacedrop.tsx +++ b/apps/mobile/src/screens/Spacedrop.tsx @@ -2,7 +2,6 @@ import { GoogleDrive, iCloud, Mega } from '@sd/assets/images'; import { DeviceMobile, Icon, Laptop, User } from 'phosphor-react-native'; import { Alert, Image, ImageSourcePropType, Pressable, ScrollView, Text, View } from 'react-native'; import { Polygon, Svg } from 'react-native-svg'; - import { InfoPill } from '~/components/primitive/InfoPill'; import { tw, twStyle } from '~/lib/tailwind'; import { SpacedropStackScreenProps } from '~/navigation/tabs/SpacedropStack'; diff --git a/apps/mobile/src/screens/Spaces.tsx b/apps/mobile/src/screens/Spaces.tsx index bcc61baff..c5c7efb70 100644 --- a/apps/mobile/src/screens/Spaces.tsx +++ b/apps/mobile/src/screens/Spaces.tsx @@ -1,5 +1,4 @@ import { Text, View } from 'react-native'; - import { tw } from '~/lib/tailwind'; import { SpacesStackScreenProps } from '~/navigation/tabs/SpacesStack'; diff --git a/apps/mobile/src/screens/Tag.tsx b/apps/mobile/src/screens/Tag.tsx index 5444f211e..714e10f50 100644 --- a/apps/mobile/src/screens/Tag.tsx +++ b/apps/mobile/src/screens/Tag.tsx @@ -1,6 +1,5 @@ import { useEffect } from 'react'; import { useLibraryQuery } from '@sd/client'; - import Explorer from '~/components/explorer/Explorer'; import { SharedScreenProps } from '~/navigation/SharedScreens'; diff --git a/apps/mobile/src/screens/onboarding/CreatingLibrary.tsx b/apps/mobile/src/screens/onboarding/CreatingLibrary.tsx index 9e86caa68..eb9d2503a 100644 --- a/apps/mobile/src/screens/onboarding/CreatingLibrary.tsx +++ b/apps/mobile/src/screens/onboarding/CreatingLibrary.tsx @@ -1,8 +1,8 @@ import React from 'react'; import { Text } from 'react-native'; - import { PulseAnimation } from '~/components/animation/lottie'; import { tw } from '~/lib/tailwind'; + import { OnboardingContainer, OnboardingDescription, OnboardingTitle } from './GetStarted'; const CreatingLibraryScreen = () => { diff --git a/apps/mobile/src/screens/onboarding/GetStarted.tsx b/apps/mobile/src/screens/onboarding/GetStarted.tsx index 2f32ee1bb..1645d0fba 100644 --- a/apps/mobile/src/screens/onboarding/GetStarted.tsx +++ b/apps/mobile/src/screens/onboarding/GetStarted.tsx @@ -5,7 +5,6 @@ import { CaretLeft } from 'phosphor-react-native'; import { Image, KeyboardAvoidingView, Platform, Pressable, Text, View } from 'react-native'; import Animated from 'react-native-reanimated'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; - import { FadeInUpAnimation, LogoAnimation } from '~/components/animation/layout'; import { AnimatedButton } from '~/components/primitive/Button'; import { styled, tw, twStyle } from '~/lib/tailwind'; diff --git a/apps/mobile/src/screens/onboarding/NewLibrary.tsx b/apps/mobile/src/screens/onboarding/NewLibrary.tsx index 813a3f5bd..6321744a3 100644 --- a/apps/mobile/src/screens/onboarding/NewLibrary.tsx +++ b/apps/mobile/src/screens/onboarding/NewLibrary.tsx @@ -1,11 +1,11 @@ import { Database } from '@sd/assets/icons'; import { Controller } from 'react-hook-form'; import { Alert, Image, Text, View } from 'react-native'; - import { Input } from '~/components/form/Input'; import { Button } from '~/components/primitive/Button'; import { tw } from '~/lib/tailwind'; import { OnboardingStackScreenProps } from '~/navigation/OnboardingNavigator'; + import { useOnboardingContext } from './context'; import { OnboardingContainer, OnboardingDescription, OnboardingTitle } from './GetStarted'; diff --git a/apps/mobile/src/screens/onboarding/Privacy.tsx b/apps/mobile/src/screens/onboarding/Privacy.tsx index 373187020..2c5955f92 100644 --- a/apps/mobile/src/screens/onboarding/Privacy.tsx +++ b/apps/mobile/src/screens/onboarding/Privacy.tsx @@ -1,10 +1,10 @@ import React from 'react'; import { Controller } from 'react-hook-form'; import { Pressable, Text, View, ViewStyle } from 'react-native'; - import { Button } from '~/components/primitive/Button'; import { tw, twStyle } from '~/lib/tailwind'; import { OnboardingStackScreenProps } from '~/navigation/OnboardingNavigator'; + import { useOnboardingContext } from './context'; import { OnboardingContainer, OnboardingDescription, OnboardingTitle } from './GetStarted'; diff --git a/apps/mobile/src/screens/settings/Settings.tsx b/apps/mobile/src/screens/settings/Settings.tsx index 474e4cac7..d4eb74de8 100644 --- a/apps/mobile/src/screens/settings/Settings.tsx +++ b/apps/mobile/src/screens/settings/Settings.tsx @@ -15,7 +15,6 @@ import { import React from 'react'; import { SectionList, Text, TouchableWithoutFeedback, View } from 'react-native'; import { DebugState, useDebugState, useDebugStateEnabler } from '@sd/client'; - import { SettingsItem, SettingsItemDivider } from '~/components/settings/SettingsItem'; import { tw, twStyle } from '~/lib/tailwind'; import { SettingsStackParamList, SettingsStackScreenProps } from '~/navigation/SettingsNavigator'; diff --git a/apps/mobile/src/screens/settings/client/AppearanceSettings.tsx b/apps/mobile/src/screens/settings/client/AppearanceSettings.tsx index 4e1a39652..308c22936 100644 --- a/apps/mobile/src/screens/settings/client/AppearanceSettings.tsx +++ b/apps/mobile/src/screens/settings/client/AppearanceSettings.tsx @@ -2,7 +2,6 @@ import { CheckCircle } from 'phosphor-react-native'; import React, { useState } from 'react'; import { ColorValue, Pressable, ScrollView, Text, View, ViewStyle } from 'react-native'; import { Themes, useThemeStore } from '@sd/client'; - import { SettingsTitle } from '~/components/settings/SettingsContainer'; import Colors from '~/constants/style/Colors'; import { tw, twStyle } from '~/lib/tailwind'; diff --git a/apps/mobile/src/screens/settings/client/ExtensionsSettings.tsx b/apps/mobile/src/screens/settings/client/ExtensionsSettings.tsx index 1d4a44e5e..6e01eed8f 100644 --- a/apps/mobile/src/screens/settings/client/ExtensionsSettings.tsx +++ b/apps/mobile/src/screens/settings/client/ExtensionsSettings.tsx @@ -1,6 +1,5 @@ import React from 'react'; import { Text, View } from 'react-native'; - import { tw } from '~/lib/tailwind'; import { SettingsStackScreenProps } from '~/navigation/SettingsNavigator'; diff --git a/apps/mobile/src/screens/settings/client/GeneralSettings.tsx b/apps/mobile/src/screens/settings/client/GeneralSettings.tsx index 3a382e311..76a481fdd 100644 --- a/apps/mobile/src/screens/settings/client/GeneralSettings.tsx +++ b/apps/mobile/src/screens/settings/client/GeneralSettings.tsx @@ -1,6 +1,5 @@ import { Text, View } from 'react-native'; import { useBridgeQuery, useDebugState } from '@sd/client'; - import { Input } from '~/components/form/Input'; import Card from '~/components/layout/Card'; import { Divider } from '~/components/primitive/Divider'; diff --git a/apps/mobile/src/screens/settings/client/LibrarySettings.tsx b/apps/mobile/src/screens/settings/client/LibrarySettings.tsx index f7a11397d..a136462ea 100644 --- a/apps/mobile/src/screens/settings/client/LibrarySettings.tsx +++ b/apps/mobile/src/screens/settings/client/LibrarySettings.tsx @@ -3,7 +3,6 @@ import React, { useEffect, useRef } from 'react'; import { Animated, FlatList, Text, View } from 'react-native'; import { Swipeable } from 'react-native-gesture-handler'; import { LibraryConfigWrapped, useBridgeQuery } from '@sd/client'; - import { ModalRef } from '~/components/layout/Modal'; import DeleteLibraryModal from '~/components/modal/confirmModals/DeleteLibraryModal'; import { AnimatedButton, FakeButton } from '~/components/primitive/Button'; diff --git a/apps/mobile/src/screens/settings/client/PrivacySettings.tsx b/apps/mobile/src/screens/settings/client/PrivacySettings.tsx index 1aacde339..693e0ff29 100644 --- a/apps/mobile/src/screens/settings/client/PrivacySettings.tsx +++ b/apps/mobile/src/screens/settings/client/PrivacySettings.tsx @@ -1,6 +1,5 @@ import React from 'react'; import { Text, View } from 'react-native'; - import { tw } from '~/lib/tailwind'; import { SettingsStackScreenProps } from '~/navigation/SettingsNavigator'; diff --git a/apps/mobile/src/screens/settings/info/About.tsx b/apps/mobile/src/screens/settings/info/About.tsx index 91646e55f..c188235e2 100644 --- a/apps/mobile/src/screens/settings/info/About.tsx +++ b/apps/mobile/src/screens/settings/info/About.tsx @@ -1,6 +1,5 @@ import React from 'react'; import { Text, View } from 'react-native'; - import { tw } from '~/lib/tailwind'; import { SettingsStackScreenProps } from '~/navigation/SettingsNavigator'; diff --git a/apps/mobile/src/screens/settings/info/Debug.tsx b/apps/mobile/src/screens/settings/info/Debug.tsx index e218ed4ae..0db4d0ac0 100644 --- a/apps/mobile/src/screens/settings/info/Debug.tsx +++ b/apps/mobile/src/screens/settings/info/Debug.tsx @@ -1,7 +1,6 @@ import React from 'react'; import { Text, View } from 'react-native'; import { getDebugState, toggleFeatureFlag, useDebugState, useFeatureFlags } from '@sd/client'; - import Card from '~/components/layout/Card'; import { Button } from '~/components/primitive/Button'; import { tw } from '~/lib/tailwind'; diff --git a/apps/mobile/src/screens/settings/info/Support.tsx b/apps/mobile/src/screens/settings/info/Support.tsx index 17403c27b..07c5950b7 100644 --- a/apps/mobile/src/screens/settings/info/Support.tsx +++ b/apps/mobile/src/screens/settings/info/Support.tsx @@ -1,6 +1,5 @@ import React from 'react'; import { Text, View } from 'react-native'; - import { tw } from '~/lib/tailwind'; import { SettingsStackScreenProps } from '~/navigation/SettingsNavigator'; diff --git a/apps/mobile/src/screens/settings/library/EditLocationSettings.tsx b/apps/mobile/src/screens/settings/library/EditLocationSettings.tsx index 610166497..2f1a28c14 100644 --- a/apps/mobile/src/screens/settings/library/EditLocationSettings.tsx +++ b/apps/mobile/src/screens/settings/library/EditLocationSettings.tsx @@ -5,7 +5,6 @@ import { Controller } from 'react-hook-form'; import { Alert, ScrollView, Text, View } from 'react-native'; import { z } from 'zod'; import { useLibraryMutation, useLibraryQuery, useZodForm } from '@sd/client'; - import { Input } from '~/components/form/Input'; import { Switch } from '~/components/form/Switch'; import DeleteLocationModal from '~/components/modal/confirmModals/DeleteLocationModal'; diff --git a/apps/mobile/src/screens/settings/library/KeysSettings.tsx b/apps/mobile/src/screens/settings/library/KeysSettings.tsx index a10290ad4..0cc4e91e1 100644 --- a/apps/mobile/src/screens/settings/library/KeysSettings.tsx +++ b/apps/mobile/src/screens/settings/library/KeysSettings.tsx @@ -1,6 +1,5 @@ import React from 'react'; import { Text, View } from 'react-native'; - import { tw } from '~/lib/tailwind'; import { SettingsStackScreenProps } from '~/navigation/SettingsNavigator'; diff --git a/apps/mobile/src/screens/settings/library/LibraryGeneralSettings.tsx b/apps/mobile/src/screens/settings/library/LibraryGeneralSettings.tsx index 2bf256b53..12f3c36e3 100644 --- a/apps/mobile/src/screens/settings/library/LibraryGeneralSettings.tsx +++ b/apps/mobile/src/screens/settings/library/LibraryGeneralSettings.tsx @@ -4,7 +4,6 @@ import { Controller } from 'react-hook-form'; import { Alert, View } from 'react-native'; import { z } from 'zod'; import { useBridgeMutation, useLibraryContext, useZodForm } from '@sd/client'; - import { Input } from '~/components/form/Input'; import { Switch } from '~/components/form/Switch'; import DeleteLibraryModal from '~/components/modal/confirmModals/DeleteLibraryModal'; diff --git a/apps/mobile/src/screens/settings/library/LocationSettings.tsx b/apps/mobile/src/screens/settings/library/LocationSettings.tsx index 5be350e67..760653fc1 100644 --- a/apps/mobile/src/screens/settings/library/LocationSettings.tsx +++ b/apps/mobile/src/screens/settings/library/LocationSettings.tsx @@ -9,7 +9,6 @@ import { useLibraryQuery, useOnlineLocations } from '@sd/client'; - import FolderIcon from '~/components/icons/FolderIcon'; import { ModalRef } from '~/components/layout/Modal'; import DeleteLocationModal from '~/components/modal/confirmModals/DeleteLocationModal'; diff --git a/apps/mobile/src/screens/settings/library/NodesSettings.tsx b/apps/mobile/src/screens/settings/library/NodesSettings.tsx index e4afc4e31..a214e91d2 100644 --- a/apps/mobile/src/screens/settings/library/NodesSettings.tsx +++ b/apps/mobile/src/screens/settings/library/NodesSettings.tsx @@ -1,7 +1,6 @@ import React from 'react'; import { Text, View } from 'react-native'; import { isEnabled, useBridgeMutation, useDiscoveredPeers } from '@sd/client'; - import { Button } from '~/components/primitive/Button'; import { tw } from '~/lib/tailwind'; import { SettingsStackScreenProps } from '~/navigation/SettingsNavigator'; diff --git a/apps/mobile/src/screens/settings/library/TagsSettings.tsx b/apps/mobile/src/screens/settings/library/TagsSettings.tsx index a0e25da17..f6d45fca1 100644 --- a/apps/mobile/src/screens/settings/library/TagsSettings.tsx +++ b/apps/mobile/src/screens/settings/library/TagsSettings.tsx @@ -3,7 +3,6 @@ import { useEffect, useRef } from 'react'; import { Animated, FlatList, Text, View } from 'react-native'; import { Swipeable } from 'react-native-gesture-handler'; import { Tag, useLibraryQuery } from '@sd/client'; - import { ModalRef } from '~/components/layout/Modal'; import DeleteTagModal from '~/components/modal/confirmModals/DeleteTagModal'; import CreateTagModal from '~/components/modal/tag/CreateTagModal'; diff --git a/apps/mobile/src/stores/modalStore.ts b/apps/mobile/src/stores/modalStore.ts index f9be04443..c3e332e59 100644 --- a/apps/mobile/src/stores/modalStore.ts +++ b/apps/mobile/src/stores/modalStore.ts @@ -1,7 +1,6 @@ import { createRef } from 'react'; import { proxy, ref, useSnapshot } from 'valtio'; import { ExplorerItem } from '@sd/client'; - import { ModalRef } from '~/components/layout/Modal'; export const actionsModalStore = proxy({ diff --git a/core/src/api/jobs.rs b/core/src/api/jobs.rs index e4827e835..ff5270efd 100644 --- a/core/src/api/jobs.rs +++ b/core/src/api/jobs.rs @@ -1,7 +1,6 @@ use crate::{ invalidate_query, job::{job_without_data, Job, JobReport, JobStatus, Jobs}, - library::Library, location::{find_location, LocationError}, object::{ file_identifier::file_identifier_job::FileIdentifierJobInit, media::MediaProcessorJobInit, @@ -17,7 +16,6 @@ use std::{ }; use chrono::{DateTime, Utc}; -use futures::future::try_join_all; use prisma_client_rust::or; use rspc::alpha::AlphaRouter; use serde::{Deserialize, Serialize}; @@ -80,113 +78,90 @@ pub(crate) fn mount() -> AlphaRouter { jobs: VecDeque, } - async fn group_jobs_by_library( - library: &Library, - active_job_reports_by_id: &HashMap, - ) -> Result, rspc::Error> { - let mut groups: HashMap = HashMap::new(); + R.with2(library()) + .query(|(node, library), _: ()| async move { + let mut groups: HashMap = HashMap::new(); - let job_reports: Vec = library - .db - .job() - .find_many(vec![]) - .order_by(job::date_created::order(SortOrder::Desc)) - .take(100) - .select(job_without_data::select()) - .exec() - .await? - .into_iter() - .flat_map(JobReport::try_from) - .collect(); + let job_reports: Vec = library + .db + .job() + .find_many(vec![]) + .order_by(job::date_created::order(SortOrder::Desc)) + .take(100) + .select(job_without_data::select()) + .exec() + .await? + .into_iter() + .flat_map(JobReport::try_from) + .collect(); - for job in job_reports { - // action name and group key are computed from the job data - let (action_name, group_key) = job.get_meta(); + let active_reports_by_id = node.jobs.get_active_reports_with_id().await; - trace!( - "job {:#?}, action_name {}, group_key {:?}", - job, - action_name, - group_key - ); + for job in job_reports { + // action name and group key are computed from the job data + let (action_name, group_key) = job.get_meta(); - // if the job is running, use the in-memory report - let report = active_job_reports_by_id.get(&job.id).unwrap_or(&job); + trace!( + "job {:#?}, action_name {}, group_key {:?}", + job, + action_name, + group_key + ); - // if we have a group key, handle grouping - if let Some(group_key) = group_key { - match groups.entry(group_key) { - // Create new job group with metadata - Entry::Vacant(entry) => { - entry.insert(JobGroup { - id: job.parent_id.unwrap_or(job.id), - action: Some(action_name.clone()), + // if the job is running, use the in-memory report + let report = active_reports_by_id.get(&job.id).unwrap_or(&job); + + // if we have a group key, handle grouping + if let Some(group_key) = group_key { + match groups.entry(group_key) { + // Create new job group with metadata + Entry::Vacant(entry) => { + entry.insert(JobGroup { + id: job.parent_id.unwrap_or(job.id), + action: Some(action_name.clone()), + status: job.status, + jobs: [report.clone()].into_iter().collect(), + created_at: job.created_at.unwrap_or(Utc::now()), + }); + } + // Add to existing job group + Entry::Occupied(mut entry) => { + let group = entry.get_mut(); + + // protect paused status from being overwritten + if report.status != JobStatus::Paused { + group.status = report.status; + } + + group.jobs.push_front(report.clone()); + } + } + } else { + // insert individual job as group + groups.insert( + job.id.to_string(), + JobGroup { + id: job.id, + action: None, status: job.status, jobs: [report.clone()].into_iter().collect(), created_at: job.created_at.unwrap_or(Utc::now()), - }); - } - // Add to existing job group - Entry::Occupied(mut entry) => { - let group = entry.get_mut(); - - // protect paused status from being overwritten - if report.status != JobStatus::Paused { - group.status = report.status; - } - - // if group.status.is_finished() && !report.status.is_finished() { - // } - group.jobs.push_front(report.clone()); - } + }, + ); } - } else { - // insert individual job as group - groups.insert( - job.id.to_string(), - JobGroup { - id: job.id, - action: None, - status: job.status, - jobs: [report.clone()].into_iter().collect(), - created_at: job.created_at.unwrap_or(Utc::now()), - }, - ); } - } - let mut groups_vec = groups.into_values().collect::>(); - groups_vec.sort_by(|a, b| b.created_at.cmp(&a.created_at)); + let mut groups_vec = groups.into_values().collect::>(); + groups_vec.sort_by(|a, b| b.created_at.cmp(&a.created_at)); - Ok(groups_vec) - } - - R.query(|node, _: ()| async move { - // WARN: We really need the borrow in this line, this way each async move in the map below - // received a copy of the reference to the active job reports, - // I feel like I'm conquering the borrow checker - let active_job_reports_by_id = &node.jobs.get_active_reports_with_id().await; - - try_join_all( - node.libraries - .get_all() - .await - .into_iter() - .map(|library| async move { - group_jobs_by_library(&library, active_job_reports_by_id) - .await - .map(|groups| (library.id, groups)) - }), - ) - .await - .map(|groups_by_library_id| { - groups_by_library_id.into_iter().collect::>() + Ok(groups_vec) }) - }) }) .procedure("isActive", { R.with2(library()) - .query(|(node, _), _: ()| async move { Ok(node.jobs.has_active_workers().await) }) + .query(|(node, library), _: ()| async move { + Ok(node.jobs.has_active_workers(library.id).await) + }) }) .procedure("clear", { R.with2(library()) diff --git a/core/src/job/manager.rs b/core/src/job/manager.rs index b4829762d..60ce026d4 100644 --- a/core/src/job/manager.rs +++ b/core/src/job/manager.rs @@ -347,9 +347,9 @@ impl Jobs { } /// Check if the manager currently has some active workers. - pub async fn has_active_workers(&self) -> bool { + pub async fn has_active_workers(&self, library_id: Uuid) -> bool { for worker in self.running_workers.read().await.values() { - if !worker.is_paused() { + if worker.library_id == library_id && !worker.is_paused() { return true; } } diff --git a/core/src/job/worker.rs b/core/src/job/worker.rs index 9fb2f7727..651915139 100644 --- a/core/src/job/worker.rs +++ b/core/src/job/worker.rs @@ -28,6 +28,7 @@ use super::{ #[derive(Debug, Clone, Serialize, Type)] pub struct JobProgressEvent { pub id: Uuid, + pub library_id: Uuid, pub task_count: i32, pub completed_task_count: i32, pub message: String, @@ -90,6 +91,7 @@ impl WorkerContext { // a worker is a dedicated thread that runs a single job // once the job is complete the worker will exit pub struct Worker { + pub(super) library_id: Uuid, commands_tx: mpsc::Sender, report_watch_tx: Arc>, report_watch_rx: watch::Receiver, @@ -130,6 +132,7 @@ impl Worker { let (report_watch_tx, report_watch_rx) = watch::channel(report.clone()); let report_watch_tx = Arc::new(report_watch_tx); + let library_id = library.id; // spawn task to handle running the job tokio::spawn(Self::do_work( @@ -148,6 +151,7 @@ impl Worker { )); Ok(Self { + library_id, commands_tx, report_watch_tx, report_watch_rx, @@ -279,6 +283,7 @@ impl Worker { // emit a CoreEvent library.emit(CoreEvent::JobProgress(JobProgressEvent { id: report.id, + library_id: library.id, task_count: report.task_count, completed_task_count: report.completed_task_count, estimated_completion: report.estimated_completion, diff --git a/core/src/location/non_indexed.rs b/core/src/location/non_indexed.rs index 97a434ca2..38b82747c 100644 --- a/core/src/location/non_indexed.rs +++ b/core/src/location/non_indexed.rs @@ -25,7 +25,7 @@ use tokio::{fs, io}; use tracing::{error, warn}; use super::{ - file_path_helper::{path_is_hidden, FilePathMetadata, MetadataExt}, + file_path_helper::{path_is_hidden, MetadataExt}, generate_thumbnail, indexer::rules::{ seed::{no_hidden, no_os_protected}, @@ -188,7 +188,7 @@ pub async fn walk( has_local_thumbnail: thumbnail_key.is_some(), thumbnail_key, item: NonIndexedPathItem { - hidden: path_is_hidden(&Path::new(&entry_path), &metadata), + hidden: path_is_hidden(Path::new(&entry_path), &metadata), path: entry_path, name, extension, @@ -234,7 +234,7 @@ pub async fn walk( has_local_thumbnail: false, thumbnail_key: None, item: NonIndexedPathItem { - hidden: path_is_hidden(&Path::new(&directory), &metadata), + hidden: path_is_hidden(Path::new(&directory), &metadata), path: directory, name, extension: "".to_string(), diff --git a/interface/app/$libraryId/Explorer/ContextMenu/FilePath/CutCopyItems.tsx b/interface/app/$libraryId/Explorer/ContextMenu/FilePath/CutCopyItems.tsx index f310562b1..a32137e71 100644 --- a/interface/app/$libraryId/Explorer/ContextMenu/FilePath/CutCopyItems.tsx +++ b/interface/app/$libraryId/Explorer/ContextMenu/FilePath/CutCopyItems.tsx @@ -1,9 +1,9 @@ import { Copy, Scissors } from '@phosphor-icons/react'; import { useLibraryMutation } from '@sd/client'; import { ContextMenu, ModifierKeys, toast } from '@sd/ui'; - import { useKeybindFactory } from '~/hooks/useKeybindFactory'; import { isNonEmpty } from '~/util'; + import { useExplorerContext } from '../../Context'; import { getExplorerStore } from '../../store'; import { useExplorerSearchParams } from '../../util'; diff --git a/interface/app/$libraryId/Explorer/ContextMenu/FilePath/Items.tsx b/interface/app/$libraryId/Explorer/ContextMenu/FilePath/Items.tsx index ed51277c4..361b36e67 100644 --- a/interface/app/$libraryId/Explorer/ContextMenu/FilePath/Items.tsx +++ b/interface/app/$libraryId/Explorer/ContextMenu/FilePath/Items.tsx @@ -1,11 +1,11 @@ import { Image, Package, Trash, TrashSimple } from '@phosphor-icons/react'; import { libraryClient, useLibraryContext, useLibraryMutation } from '@sd/client'; import { ContextMenu, dialogManager, ModifierKeys, toast } from '@sd/ui'; - import { Menu } from '~/components/Menu'; import { useKeybindFactory } from '~/hooks/useKeybindFactory'; import { isNonEmpty } from '~/util'; import { usePlatform } from '~/util/Platform'; + import { useExplorerContext } from '../../Context'; import { CopyAsPathBase } from '../../CopyAsPath'; import DeleteDialog from '../../FilePath/DeleteDialog'; diff --git a/interface/app/$libraryId/Explorer/ContextMenu/FilePath/OpenWith.tsx b/interface/app/$libraryId/Explorer/ContextMenu/FilePath/OpenWith.tsx index 0a87006c4..766023a03 100644 --- a/interface/app/$libraryId/Explorer/ContextMenu/FilePath/OpenWith.tsx +++ b/interface/app/$libraryId/Explorer/ContextMenu/FilePath/OpenWith.tsx @@ -2,9 +2,9 @@ import { useQuery } from '@tanstack/react-query'; import { Suspense } from 'react'; import { useLibraryContext } from '@sd/client'; import { toast } from '@sd/ui'; - import { Menu } from '~/components/Menu'; import { Platform, usePlatform } from '~/util/Platform'; + import { ConditionalItem } from '../ConditionalItem'; import { useContextMenuContext } from '../context'; diff --git a/interface/app/$libraryId/Explorer/ContextMenu/Object/Items.tsx b/interface/app/$libraryId/Explorer/ContextMenu/Object/Items.tsx index 140789f4d..aa1526579 100644 --- a/interface/app/$libraryId/Explorer/ContextMenu/Object/Items.tsx +++ b/interface/app/$libraryId/Explorer/ContextMenu/Object/Items.tsx @@ -2,10 +2,10 @@ import { ArrowBendUpRight, TagSimple } from '@phosphor-icons/react'; import { useMemo } from 'react'; import { ObjectKind, useLibraryMutation, type ObjectKindEnum } from '@sd/client'; import { ContextMenu, toast } from '@sd/ui'; - import AssignTagMenuItems from '~/components/AssignTagMenuItems'; import { Menu } from '~/components/Menu'; import { isNonEmpty } from '~/util'; + import { ConditionalItem } from '../ConditionalItem'; import { useContextMenuContext } from '../context'; diff --git a/interface/app/$libraryId/Explorer/ContextMenu/SharedItems.tsx b/interface/app/$libraryId/Explorer/ContextMenu/SharedItems.tsx index ea8be9e11..602dba1ab 100644 --- a/interface/app/$libraryId/Explorer/ContextMenu/SharedItems.tsx +++ b/interface/app/$libraryId/Explorer/ContextMenu/SharedItems.tsx @@ -1,11 +1,11 @@ import { FileX, Share as ShareIcon } from '@phosphor-icons/react'; import { useMemo } from 'react'; import { ContextMenu, ModifierKeys } from '@sd/ui'; - import { Menu } from '~/components/Menu'; import { useKeybindFactory } from '~/hooks/useKeybindFactory'; import { isNonEmpty } from '~/util'; import { type Platform } from '~/util/Platform'; + import { useExplorerContext } from '../Context'; import { getQuickPreviewStore } from '../QuickPreview/store'; import { RevealInNativeExplorerBase } from '../RevealInNativeExplorer'; diff --git a/interface/app/$libraryId/Explorer/ContextMenu/context.tsx b/interface/app/$libraryId/Explorer/ContextMenu/context.tsx index 52409c763..65741476e 100644 --- a/interface/app/$libraryId/Explorer/ContextMenu/context.tsx +++ b/interface/app/$libraryId/Explorer/ContextMenu/context.tsx @@ -1,6 +1,5 @@ import { createContext, PropsWithChildren, useContext } from 'react'; import { ExplorerItem, FilePath, Object, useItemsAsFilePaths, useItemsAsObjects } from '@sd/client'; - import { NonEmptyArray } from '~/util'; const ContextMenuContext = createContext<{ diff --git a/interface/app/$libraryId/Explorer/ContextMenu/index.tsx b/interface/app/$libraryId/Explorer/ContextMenu/index.tsx index 29e286ea3..0f305616c 100644 --- a/interface/app/$libraryId/Explorer/ContextMenu/index.tsx +++ b/interface/app/$libraryId/Explorer/ContextMenu/index.tsx @@ -2,8 +2,8 @@ import { Plus } from '@phosphor-icons/react'; import { useMemo, type PropsWithChildren } from 'react'; import { ExplorerItem } from '@sd/client'; import { ContextMenu } from '@sd/ui'; - import { isNonEmpty } from '~/util'; + import { useExplorerContext } from '../Context'; import { Conditional, type ConditionalGroupProps } from './ConditionalItem'; import { ContextMenuContextProvider } from './context'; diff --git a/interface/app/$libraryId/Explorer/CopyAsPath.tsx b/interface/app/$libraryId/Explorer/CopyAsPath.tsx index 9be8d9e3f..35f64a1a0 100644 --- a/interface/app/$libraryId/Explorer/CopyAsPath.tsx +++ b/interface/app/$libraryId/Explorer/CopyAsPath.tsx @@ -1,6 +1,5 @@ import { ClipboardText } from '@phosphor-icons/react'; import { toast } from '@sd/ui'; - import { Menu } from '~/components/Menu'; export const CopyAsPathBase = ( diff --git a/interface/app/$libraryId/Explorer/DismissibleNotice.tsx b/interface/app/$libraryId/Explorer/DismissibleNotice.tsx index d2d357de4..f4c88ecc7 100644 --- a/interface/app/$libraryId/Explorer/DismissibleNotice.tsx +++ b/interface/app/$libraryId/Explorer/DismissibleNotice.tsx @@ -8,10 +8,10 @@ import { } from '@sd/assets/icons'; import { ReactNode } from 'react'; import { ExplorerLayout } from '@sd/client'; - import DismissibleNotice from '~/components/DismissibleNotice'; import { useIsDark } from '~/hooks'; import { dismissibleNoticeStore } from '~/hooks/useDismissibleNoticeStore'; + import { useExplorerContext } from './Context'; import { useExplorerStore } from './store'; diff --git a/interface/app/$libraryId/Explorer/FilePath/Thumb.tsx b/interface/app/$libraryId/Explorer/FilePath/Thumb.tsx index 97119d0dc..685cb939a 100644 --- a/interface/app/$libraryId/Explorer/FilePath/Thumb.tsx +++ b/interface/app/$libraryId/Explorer/FilePath/Thumb.tsx @@ -13,11 +13,11 @@ import { type VideoHTMLAttributes } from 'react'; import { getItemFilePath, useLibraryContext, type ExplorerItem } from '@sd/client'; - import { PDFViewer, TextViewer } from '~/components'; import { useCallbackToWatchResize, useIsDark } from '~/hooks'; import { pdfViewerEnabled } from '~/util/pdfViewer'; import { usePlatform } from '~/util/Platform'; + import { useExplorerContext } from '../Context'; import { getExplorerStore } from '../store'; import { useExplorerItemData } from '../util'; diff --git a/interface/app/$libraryId/Explorer/OptionsPanel.tsx b/interface/app/$libraryId/Explorer/OptionsPanel.tsx index 4499bfb43..7bd33b294 100644 --- a/interface/app/$libraryId/Explorer/OptionsPanel.tsx +++ b/interface/app/$libraryId/Explorer/OptionsPanel.tsx @@ -1,6 +1,6 @@ import { RadixCheckbox, Select, SelectOption, Slider, tw, z } from '@sd/ui'; - import { SortOrderSchema } from '~/app/route-schemas'; + import { useExplorerContext } from './Context'; import { createOrdering, diff --git a/interface/app/$libraryId/Explorer/ParentContextMenu.tsx b/interface/app/$libraryId/Explorer/ParentContextMenu.tsx index 3306f3147..e2efbeda7 100644 --- a/interface/app/$libraryId/Explorer/ParentContextMenu.tsx +++ b/interface/app/$libraryId/Explorer/ParentContextMenu.tsx @@ -2,9 +2,9 @@ import { Clipboard, FileX, Image, Plus, Repeat, Share, ShieldCheck } from '@phos import { PropsWithChildren } from 'react'; import { useLibraryMutation } from '@sd/client'; import { ContextMenu as CM, ModifierKeys, toast } from '@sd/ui'; - import { useOperatingSystem } from '~/hooks'; import { keybindForOs } from '~/util/keybinds'; + import { useExplorerContext } from './Context'; import { CopyAsPathBase } from './CopyAsPath'; import { RevealInNativeExplorerBase } from './RevealInNativeExplorer'; diff --git a/interface/app/$libraryId/Explorer/RevealInNativeExplorer.tsx b/interface/app/$libraryId/Explorer/RevealInNativeExplorer.tsx index f5ed63355..b0381657f 100644 --- a/interface/app/$libraryId/Explorer/RevealInNativeExplorer.tsx +++ b/interface/app/$libraryId/Explorer/RevealInNativeExplorer.tsx @@ -1,6 +1,5 @@ import { useLibraryContext } from '@sd/client'; import { ModifierKeys } from '@sd/ui'; - import { Menu } from '~/components/Menu'; import { useOperatingSystem } from '~/hooks'; import { useKeybindFactory } from '~/hooks/useKeybindFactory'; diff --git a/interface/app/$libraryId/Explorer/View/GridList.tsx b/interface/app/$libraryId/Explorer/View/GridList.tsx index 73c3d17ef..638a04492 100644 --- a/interface/app/$libraryId/Explorer/View/GridList.tsx +++ b/interface/app/$libraryId/Explorer/View/GridList.tsx @@ -84,7 +84,7 @@ const GridListItem = (props: { return (
{ return ( -
+
{props.row.getVisibleCells().map((cell) => (
{ useLayoutEffect(() => setListOffset(tableRef.current?.offsetTop ?? 0), []); return ( -
+
{sized && ( <> @@ -1050,7 +1050,7 @@ export default () => {
e.stopPropagation()} > {headerGroup.headers.map((header, i) => { @@ -1073,7 +1073,7 @@ export default () => { return (
{ -
+
{ return (
{ )} > {selectedPrior && ( -
+
)} { diff --git a/interface/app/$libraryId/Layout/Sidebar/EphemeralSection.tsx b/interface/app/$libraryId/Layout/Sidebar/EphemeralSection.tsx index c57a25e73..976bdc01f 100644 --- a/interface/app/$libraryId/Layout/Sidebar/EphemeralSection.tsx +++ b/interface/app/$libraryId/Layout/Sidebar/EphemeralSection.tsx @@ -1,8 +1,8 @@ import { useState } from 'react'; import { useBridgeQuery } from '@sd/client'; - import { Folder } from '~/components'; import { usePlatform } from '~/util/Platform'; + import SidebarLink from './Link'; import Section from './Section'; diff --git a/interface/app/$libraryId/Layout/Sidebar/JobManager/IsRunningJob.tsx b/interface/app/$libraryId/Layout/Sidebar/JobManager/IsRunningJob.tsx index 7854d208d..f94057d47 100644 --- a/interface/app/$libraryId/Layout/Sidebar/JobManager/IsRunningJob.tsx +++ b/interface/app/$libraryId/Layout/Sidebar/JobManager/IsRunningJob.tsx @@ -1,6 +1,5 @@ import { CheckCircle } from '@phosphor-icons/react'; import { Loader } from '@sd/ui'; - import { useLibraryQuery } from '~/../packages/client/src'; export default () => { diff --git a/interface/app/$libraryId/Layout/Sidebar/JobManager/index.tsx b/interface/app/$libraryId/Layout/Sidebar/JobManager/index.tsx index 1d83886c3..47d8aa45e 100644 --- a/interface/app/$libraryId/Layout/Sidebar/JobManager/index.tsx +++ b/interface/app/$libraryId/Layout/Sidebar/JobManager/index.tsx @@ -1,7 +1,7 @@ -import { useQueryClient } from '@tanstack/react-query'; import { Check, Trash, X } from '@phosphor-icons/react'; -import { useMemo, useState } from 'react'; -import { useBridgeQuery, useJobProgress, useLibraryMutation } from '@sd/client'; +import { useQueryClient } from '@tanstack/react-query'; +import { useState } from 'react'; +import { useJobProgress, useLibraryMutation, useLibraryQuery } from '@sd/client'; import { Button, PopoverClose, toast, Tooltip } from '@sd/ui'; import IsRunningJob from './IsRunningJob'; @@ -11,16 +11,9 @@ export function JobManager() { const queryClient = useQueryClient(); const [toggleConfirmation, setToggleConfirmation] = useState(false); - const jobGroupsById = useBridgeQuery(['jobs.reports']); + const jobGroups = useLibraryQuery(['jobs.reports']); - // TODO: Currently we're only clustering togheter all job reports from all libraries without any distinction. - // TODO: We should probably cluster them by library in the job manager UI - const jobGroups = useMemo(() => { - if (!jobGroupsById.data) return []; - return Object.values(jobGroupsById.data).flat(); - }, [jobGroupsById.data]); - - const progress = useJobProgress(jobGroups); + const progress = useJobProgress(jobGroups.data); const clearAllJobs = useLibraryMutation(['jobs.clearAll'], { onError: () => { @@ -84,15 +77,16 @@ export function JobManager() {
- {jobGroups.length === 0 ? ( -
- No jobs. -
- ) : ( - jobGroups.map((group) => ( - - )) - )} + {jobGroups.data && + (jobGroups.data.length === 0 ? ( +
+ No jobs. +
+ ) : ( + jobGroups.data.map((group) => ( + + )) + ))}
diff --git a/interface/app/$libraryId/Layout/Sidebar/LibrariesDropdown.tsx b/interface/app/$libraryId/Layout/Sidebar/LibrariesDropdown.tsx index 97553f212..2d07bb775 100644 --- a/interface/app/$libraryId/Layout/Sidebar/LibrariesDropdown.tsx +++ b/interface/app/$libraryId/Layout/Sidebar/LibrariesDropdown.tsx @@ -1,5 +1,5 @@ -import clsx from 'clsx'; import { Gear, Lock, Plus } from '@phosphor-icons/react'; +import clsx from 'clsx'; import { useClientContext } from '@sd/client'; import { dialogManager, Dropdown, DropdownMenu } from '@sd/ui'; diff --git a/interface/app/$libraryId/Layout/Sidebar/LibrarySection.tsx b/interface/app/$libraryId/Layout/Sidebar/LibrarySection.tsx index 800647c71..260e7e76f 100644 --- a/interface/app/$libraryId/Layout/Sidebar/LibrarySection.tsx +++ b/interface/app/$libraryId/Layout/Sidebar/LibrarySection.tsx @@ -11,9 +11,9 @@ import { useOnlineLocations } from '@sd/client'; import { Button, Tooltip } from '@sd/ui'; - import { AddLocationButton } from '~/app/$libraryId/settings/library/locations/AddLocationButton'; import { Folder, SubtleButton } from '~/components'; + import SidebarLink from './Link'; import LocationsContextMenu from './LocationsContextMenu'; import Section from './Section'; diff --git a/interface/app/$libraryId/Layout/Sidebar/Link.tsx b/interface/app/$libraryId/Layout/Sidebar/Link.tsx index d09ffffb6..64624f118 100644 --- a/interface/app/$libraryId/Layout/Sidebar/Link.tsx +++ b/interface/app/$libraryId/Layout/Sidebar/Link.tsx @@ -2,7 +2,6 @@ import { cva } from 'class-variance-authority'; import clsx from 'clsx'; import { forwardRef, PropsWithChildren } from 'react'; import { NavLink, NavLinkProps } from 'react-router-dom'; - import { useOperatingSystem } from '~/hooks/useOperatingSystem'; import { usePlatform } from '~/util/Platform'; diff --git a/interface/app/$libraryId/Layout/Sidebar/LocationsContextMenu.tsx b/interface/app/$libraryId/Layout/Sidebar/LocationsContextMenu.tsx index 7266ed9b7..0c07dba38 100644 --- a/interface/app/$libraryId/Layout/Sidebar/LocationsContextMenu.tsx +++ b/interface/app/$libraryId/Layout/Sidebar/LocationsContextMenu.tsx @@ -1,7 +1,6 @@ import { Pencil, Plus, Trash } from '@phosphor-icons/react'; import { useNavigate } from 'react-router'; import { ContextMenu as CM, dialogManager, toast } from '@sd/ui'; - import { AddLocationDialog } from '~/app/$libraryId/settings/library/locations/AddLocationDialog'; import DeleteDialog from '~/app/$libraryId/settings/library/locations/DeleteDialog'; import { openDirectoryPickerDialog } from '~/app/$libraryId/settings/library/locations/openDirectoryPickerDialog'; diff --git a/interface/app/$libraryId/Layout/Sidebar/TagsContextMenu.tsx b/interface/app/$libraryId/Layout/Sidebar/TagsContextMenu.tsx index 26b3de038..0b92b5673 100644 --- a/interface/app/$libraryId/Layout/Sidebar/TagsContextMenu.tsx +++ b/interface/app/$libraryId/Layout/Sidebar/TagsContextMenu.tsx @@ -2,7 +2,6 @@ import { Pencil, Plus, Trash } from '@phosphor-icons/react'; import { useNavigate } from 'react-router'; import { Link } from 'react-router-dom'; import { ContextMenu as CM, dialogManager } from '@sd/ui'; - import CreateDialog from '~/app/$libraryId/settings/library/tags/CreateDialog'; import DeleteDialog from '~/app/$libraryId/settings/library/tags/DeleteDialog'; diff --git a/interface/app/$libraryId/Layout/Sidebar/WindowControls.tsx b/interface/app/$libraryId/Layout/Sidebar/WindowControls.tsx index 320408587..4538588be 100644 --- a/interface/app/$libraryId/Layout/Sidebar/WindowControls.tsx +++ b/interface/app/$libraryId/Layout/Sidebar/WindowControls.tsx @@ -1,8 +1,8 @@ import clsx from 'clsx'; - import { MacTrafficLights } from '~/components/TrafficLights'; import { useOperatingSystem } from '~/hooks/useOperatingSystem'; import { usePlatform } from '~/util/Platform'; + import { macOnly } from './helpers'; export default () => { diff --git a/interface/app/$libraryId/Layout/Sidebar/index.tsx b/interface/app/$libraryId/Layout/Sidebar/index.tsx index 3aff970e0..cf4a6cb4c 100644 --- a/interface/app/$libraryId/Layout/Sidebar/index.tsx +++ b/interface/app/$libraryId/Layout/Sidebar/index.tsx @@ -1,7 +1,7 @@ import clsx from 'clsx'; - import { MacTrafficLights } from '~/components'; import { useOperatingSystem } from '~/hooks'; + import Contents from './Contents'; import Footer from './Footer'; import { macOnly } from './helpers'; diff --git a/interface/app/$libraryId/Layout/index.tsx b/interface/app/$libraryId/Layout/index.tsx index d30908239..6d6a7c2fd 100644 --- a/interface/app/$libraryId/Layout/index.tsx +++ b/interface/app/$libraryId/Layout/index.tsx @@ -10,11 +10,11 @@ import { usePlausiblePageViewMonitor, usePlausiblePingMonitor } from '@sd/client'; - import { useRootContext } from '~/app/RootContext'; import { LibraryIdParamsSchema } from '~/app/route-schemas'; import { useOperatingSystem, useZodRouteParams } from '~/hooks'; import { usePlatform } from '~/util/Platform'; + import { QuickPreviewContextProvider } from '../Explorer/QuickPreview/Context'; import { LayoutContext } from './Context'; import Sidebar from './Sidebar'; diff --git a/interface/app/$libraryId/TopBar/TopBarButton.tsx b/interface/app/$libraryId/TopBar/TopBarButton.tsx index 5a40a18b2..554c90436 100644 --- a/interface/app/$libraryId/TopBar/TopBarButton.tsx +++ b/interface/app/$libraryId/TopBar/TopBarButton.tsx @@ -1,5 +1,5 @@ -import { cva } from 'class-variance-authority'; import { Check } from '@phosphor-icons/react'; +import { cva } from 'class-variance-authority'; import { forwardRef } from 'react'; import { Button } from '@sd/ui'; diff --git a/interface/app/$libraryId/debug.tsx b/interface/app/$libraryId/debug.tsx index a55e05d44..89a701ce5 100644 --- a/interface/app/$libraryId/debug.tsx +++ b/interface/app/$libraryId/debug.tsx @@ -1,5 +1,4 @@ import { useBridgeQuery, useLibraryQuery } from '@sd/client'; - import { CodeBlock } from '~/components/Codeblock'; // TODO: Bring this back with a button in the sidebar near settings at the bottom diff --git a/interface/app/$libraryId/ephemeral.tsx b/interface/app/$libraryId/ephemeral.tsx index d654f04ac..036689d4a 100644 --- a/interface/app/$libraryId/ephemeral.tsx +++ b/interface/app/$libraryId/ephemeral.tsx @@ -1,24 +1,25 @@ -import { Suspense, memo, useDeferredValue, useMemo } from 'react'; +import { memo, Suspense, useDeferredValue, useMemo } from 'react'; import { - type EphemeralPathOrder, ExplorerItem, getExplorerItemData, - useLibraryQuery + useLibraryQuery, + type EphemeralPathOrder } from '@sd/client'; import { Tooltip } from '@sd/ui'; -import { type PathParams, PathParamsSchema } from '~/app/route-schemas'; +import { PathParamsSchema, type PathParams } from '~/app/route-schemas'; import { useOperatingSystem, useZodSearchParams } from '~/hooks'; + import Explorer from './Explorer'; import { ExplorerContextProvider } from './Explorer/Context'; -import { DefaultTopBarOptions } from './Explorer/TopBarOptions'; import { createDefaultExplorerSettings, getExplorerStore, nonIndexedPathOrderingSchema } from './Explorer/store'; +import { DefaultTopBarOptions } from './Explorer/TopBarOptions'; import { useExplorer, useExplorerSettings } from './Explorer/useExplorer'; -import { TopBarPortal } from './TopBar/Portal'; import { AddLocationButton } from './settings/library/locations/AddLocationButton'; +import { TopBarPortal } from './TopBar/Portal'; const EphemeralExplorer = memo((props: { args: PathParams }) => { const os = useOperatingSystem(); diff --git a/interface/app/$libraryId/location/$id.tsx b/interface/app/$libraryId/location/$id.tsx index d091cefa0..9691b7baf 100644 --- a/interface/app/$libraryId/location/$id.tsx +++ b/interface/app/$libraryId/location/$id.tsx @@ -13,10 +13,10 @@ import { useLibraryQuery, useLibrarySubscription } from '@sd/client'; - import { LocationIdParamsSchema } from '~/app/route-schemas'; import { Folder } from '~/components'; import { useKeyDeleteFile, useZodRouteParams } from '~/hooks'; + import Explorer from '../Explorer'; import { ExplorerContextProvider } from '../Explorer/Context'; import { usePathsInfiniteQuery } from '../Explorer/queries'; diff --git a/interface/app/$libraryId/location/LocationOptions.tsx b/interface/app/$libraryId/location/LocationOptions.tsx index 871dfe916..3484a50b5 100644 --- a/interface/app/$libraryId/location/LocationOptions.tsx +++ b/interface/app/$libraryId/location/LocationOptions.tsx @@ -1,5 +1,13 @@ +import { + Archive, + Check, + Copy, + FolderDotted, + Gear, + IconContext, + Image +} from '@phosphor-icons/react'; import { ReactComponent as Ellipsis } from '@sd/assets/svgs/ellipsis.svg'; -import { Archive, Check, Copy, FolderDotted, Gear, IconContext, Image } from '@phosphor-icons/react'; import { useState } from 'react'; import { useNavigate } from 'react-router'; import { useLibraryMutation, type Location } from '@sd/client'; diff --git a/interface/app/$libraryId/node/$id.tsx b/interface/app/$libraryId/node/$id.tsx index 8b1c783fd..4ddc7ff7a 100644 --- a/interface/app/$libraryId/node/$id.tsx +++ b/interface/app/$libraryId/node/$id.tsx @@ -1,9 +1,9 @@ import { Laptop } from '@sd/assets/icons'; import { useMemo } from 'react'; import { useBridgeQuery, useLibraryQuery } from '@sd/client'; - import { NodeIdParamsSchema } from '~/app/route-schemas'; import { useZodRouteParams } from '~/hooks'; + import Explorer from '../Explorer'; import { ExplorerContextProvider } from '../Explorer/Context'; import { createDefaultExplorerSettings } from '../Explorer/store'; diff --git a/interface/app/$libraryId/overview/Categories.tsx b/interface/app/$libraryId/overview/Categories.tsx index c03a7553e..7b7a0a8bb 100644 --- a/interface/app/$libraryId/overview/Categories.tsx +++ b/interface/app/$libraryId/overview/Categories.tsx @@ -1,14 +1,14 @@ +import { ArrowLeft, ArrowRight } from '@phosphor-icons/react'; import { getIcon } from '@sd/assets/util'; import clsx from 'clsx'; import { motion } from 'framer-motion'; -import { ArrowLeft, ArrowRight } from '@phosphor-icons/react'; import { RefObject, useEffect, useRef, useState } from 'react'; import Sticky from 'react-sticky-el'; import { useDraggable } from 'react-use-draggable-scroll'; import { Category, useLibraryQuery } from '@sd/client'; import { tw } from '@sd/ui'; - import { useIsDark } from '~/hooks'; + import { useLayoutContext } from '../Layout/Context'; import { usePageLayoutContext } from '../PageLayout/Context'; import CategoryButton from './CategoryButton'; diff --git a/interface/app/$libraryId/overview/Inspector.tsx b/interface/app/$libraryId/overview/Inspector.tsx index ea36b6d8d..7c42dbe4c 100644 --- a/interface/app/$libraryId/overview/Inspector.tsx +++ b/interface/app/$libraryId/overview/Inspector.tsx @@ -1,7 +1,7 @@ import { useCallback, useEffect, useRef, useState } from 'react'; import { useSnapshot } from 'valtio'; - import { useCallbackToWatchResize } from '~/hooks'; + import { useExplorerContext } from '../Explorer/Context'; import { Inspector } from '../Explorer/Inspector'; import { useExplorerStore } from '../Explorer/store'; diff --git a/interface/app/$libraryId/overview/Statistics.tsx b/interface/app/$libraryId/overview/Statistics.tsx index c5445a549..c88b1b79d 100644 --- a/interface/app/$libraryId/overview/Statistics.tsx +++ b/interface/app/$libraryId/overview/Statistics.tsx @@ -1,12 +1,11 @@ -import clsx from 'clsx'; import { Info } from '@phosphor-icons/react'; +import clsx from 'clsx'; import Skeleton from 'react-loading-skeleton'; import 'react-loading-skeleton/dist/skeleton.css'; import { byteSize, Statistics, useLibraryContext, useLibraryQuery } from '@sd/client'; import { Tooltip } from '@sd/ui'; - import { useCounter } from '~/hooks'; import { usePlatform } from '~/util/Platform'; diff --git a/interface/app/$libraryId/search.tsx b/interface/app/$libraryId/search.tsx index ed90f151f..9fa4c0625 100644 --- a/interface/app/$libraryId/search.tsx +++ b/interface/app/$libraryId/search.tsx @@ -1,9 +1,9 @@ import { MagnifyingGlass } from '@phosphor-icons/react'; import { memo, Suspense, useDeferredValue, useMemo } from 'react'; import { FilePathOrder, getExplorerItemData, useLibraryQuery } from '@sd/client'; - import { SearchParamsSchema, type SearchParams } from '~/app/route-schemas'; import { useZodSearchParams } from '~/hooks'; + import Explorer from './Explorer'; import { ExplorerContextProvider } from './Explorer/Context'; import { diff --git a/interface/app/$libraryId/settings/Layout.tsx b/interface/app/$libraryId/settings/Layout.tsx index bf99d9f98..af48a4374 100644 --- a/interface/app/$libraryId/settings/Layout.tsx +++ b/interface/app/$libraryId/settings/Layout.tsx @@ -1,7 +1,7 @@ import { PropsWithChildren, ReactNode, Suspense } from 'react'; import { Outlet } from 'react-router'; - import { useOperatingSystem } from '~/hooks/useOperatingSystem'; + import DragRegion from '../../../components/DragRegion'; import Sidebar from './Sidebar'; diff --git a/interface/app/$libraryId/settings/Setting.tsx b/interface/app/$libraryId/settings/Setting.tsx index eedffe363..d19a5857f 100644 --- a/interface/app/$libraryId/settings/Setting.tsx +++ b/interface/app/$libraryId/settings/Setting.tsx @@ -1,5 +1,5 @@ -import clsx from 'clsx'; import { Info } from '@phosphor-icons/react'; +import clsx from 'clsx'; import { PropsWithChildren } from 'react'; import { Tooltip } from '@sd/ui'; diff --git a/interface/app/$libraryId/settings/Sidebar.tsx b/interface/app/$libraryId/settings/Sidebar.tsx index b6e814584..9e2f26024 100644 --- a/interface/app/$libraryId/settings/Sidebar.tsx +++ b/interface/app/$libraryId/settings/Sidebar.tsx @@ -39,7 +39,7 @@ export default () => {
)} -
+
Client diff --git a/interface/app/$libraryId/settings/client/backups.tsx b/interface/app/$libraryId/settings/client/backups.tsx index 3480c4a6b..fe92fc26a 100644 --- a/interface/app/$libraryId/settings/client/backups.tsx +++ b/interface/app/$libraryId/settings/client/backups.tsx @@ -1,9 +1,9 @@ import dayjs from 'dayjs'; import { useBridgeMutation, useBridgeQuery, useLibraryMutation } from '@sd/client'; import { Button, Card } from '@sd/ui'; - import { Database } from '~/components'; import { usePlatform } from '~/util/Platform'; + import { Heading } from '../Layout'; // TODO: This is a non-library page but does a library query for backup. That will be confusing UX. diff --git a/interface/app/$libraryId/settings/client/general.tsx b/interface/app/$libraryId/settings/client/general.tsx index 4a9ba28d1..1b9c3d178 100644 --- a/interface/app/$libraryId/settings/client/general.tsx +++ b/interface/app/$libraryId/settings/client/general.tsx @@ -7,9 +7,9 @@ import { useZodForm } from '@sd/client'; import { Button, Card, Input, Switch, tw, z } from '@sd/ui'; - import { useDebouncedFormWatch } from '~/hooks'; import { usePlatform } from '~/util/Platform'; + import { Heading } from '../Layout'; import Setting from '../Setting'; diff --git a/interface/app/$libraryId/settings/library/general.tsx b/interface/app/$libraryId/settings/library/general.tsx index 21d1b32ee..ae2e29ece 100644 --- a/interface/app/$libraryId/settings/library/general.tsx +++ b/interface/app/$libraryId/settings/library/general.tsx @@ -1,7 +1,7 @@ import { MaybeUndefined, useBridgeMutation, useLibraryContext, useZodForm } from '@sd/client'; import { Button, dialogManager, Form, InputField, Switch, Tooltip, z } from '@sd/ui'; - import { useDebouncedFormWatch } from '~/hooks'; + import { Heading } from '../Layout'; import DeleteLibraryDialog from '../node/libraries/DeleteDialog'; import Setting from '../Setting'; diff --git a/interface/app/$libraryId/settings/library/locations/$id.tsx b/interface/app/$libraryId/settings/library/locations/$id.tsx index 8d6737910..e33041efd 100644 --- a/interface/app/$libraryId/settings/library/locations/$id.tsx +++ b/interface/app/$libraryId/settings/library/locations/$id.tsx @@ -1,5 +1,5 @@ -import { useQueryClient } from '@tanstack/react-query'; import { Archive, ArrowsClockwise, Info, Trash } from '@phosphor-icons/react'; +import { useQueryClient } from '@tanstack/react-query'; import { Suspense, useEffect } from 'react'; import { Controller } from 'react-hook-form'; import { useLibraryMutation, useLibraryQuery, useZodForm } from '@sd/client'; @@ -17,10 +17,10 @@ import { tw, z } from '@sd/ui'; - import ModalLayout from '~/app/$libraryId/settings/ModalLayout'; import { LocationIdParamsSchema } from '~/app/route-schemas'; import { useZodRouteParams } from '~/hooks'; + import IndexerRuleEditor from './IndexerRuleEditor'; import { LocationPathInputField } from './PathInput'; diff --git a/interface/app/$libraryId/settings/library/locations/AddLocationButton.tsx b/interface/app/$libraryId/settings/library/locations/AddLocationButton.tsx index 2f744de6e..958cd96a5 100644 --- a/interface/app/$libraryId/settings/library/locations/AddLocationButton.tsx +++ b/interface/app/$libraryId/settings/library/locations/AddLocationButton.tsx @@ -1,11 +1,11 @@ +import { FolderSimplePlus } from '@phosphor-icons/react'; import clsx from 'clsx'; import { motion } from 'framer-motion'; -import { FolderSimplePlus } from '@phosphor-icons/react'; import { useRef, useState } from 'react'; import { Button, dialogManager, type ButtonProps } from '@sd/ui'; - import { useCallbackToWatchResize } from '~/hooks'; import { usePlatform } from '~/util/Platform'; + import { AddLocationDialog } from './AddLocationDialog'; import { openDirectoryPickerDialog } from './openDirectoryPickerDialog'; diff --git a/interface/app/$libraryId/settings/library/locations/AddLocationDialog.tsx b/interface/app/$libraryId/settings/library/locations/AddLocationDialog.tsx index a29c3b355..73f1abdc3 100644 --- a/interface/app/$libraryId/settings/library/locations/AddLocationDialog.tsx +++ b/interface/app/$libraryId/settings/library/locations/AddLocationDialog.tsx @@ -10,10 +10,10 @@ import { useZodForm } from '@sd/client'; import { Dialog, ErrorMessage, toast, useDialog, UseDialogProps, z } from '@sd/ui'; - import Accordion from '~/components/Accordion'; import { useCallbackToWatchForm } from '~/hooks'; import { usePlatform } from '~/util/Platform'; + import IndexerRuleEditor from './IndexerRuleEditor'; import { LocationPathInputField } from './PathInput'; diff --git a/interface/app/$libraryId/settings/library/locations/IndexerRuleEditor/RuleButton.tsx b/interface/app/$libraryId/settings/library/locations/IndexerRuleEditor/RuleButton.tsx index e25652e3f..5fbbf6ccf 100644 --- a/interface/app/$libraryId/settings/library/locations/IndexerRuleEditor/RuleButton.tsx +++ b/interface/app/$libraryId/settings/library/locations/IndexerRuleEditor/RuleButton.tsx @@ -1,8 +1,8 @@ import clsx from 'clsx'; import { useRef } from 'react'; import { IndexerRule } from '@sd/client'; - import { InfoPill } from '~/app/$libraryId/Explorer/Inspector'; + import { IndexerRuleIdFieldType } from '.'; function ruleIsSystem(rule: IndexerRule) { diff --git a/interface/app/$libraryId/settings/library/locations/IndexerRuleEditor/RuleInput.tsx b/interface/app/$libraryId/settings/library/locations/IndexerRuleEditor/RuleInput.tsx index 510cd7199..6bc15d6ed 100644 --- a/interface/app/$libraryId/settings/library/locations/IndexerRuleEditor/RuleInput.tsx +++ b/interface/app/$libraryId/settings/library/locations/IndexerRuleEditor/RuleInput.tsx @@ -1,9 +1,9 @@ import clsx from 'clsx'; import { ChangeEvent, ChangeEventHandler, forwardRef, memo } from 'react'; import { Input, toast } from '@sd/ui'; - import { useOperatingSystem } from '~/hooks'; import { usePlatform } from '~/util/Platform'; + import { openDirectoryPickerDialog } from '../openDirectoryPickerDialog'; export type InputKinds = 'Name' | 'Extension' | 'Path' | 'Advanced'; diff --git a/interface/app/$libraryId/settings/library/locations/IndexerRuleEditor/RulesForm.tsx b/interface/app/$libraryId/settings/library/locations/IndexerRuleEditor/RulesForm.tsx index f6c4b077c..619bdaa36 100644 --- a/interface/app/$libraryId/settings/library/locations/IndexerRuleEditor/RulesForm.tsx +++ b/interface/app/$libraryId/settings/library/locations/IndexerRuleEditor/RulesForm.tsx @@ -1,5 +1,5 @@ -import clsx from 'clsx'; import { Info, Trash } from '@phosphor-icons/react'; +import clsx from 'clsx'; import { ChangeEvent, useCallback, useEffect, useId } from 'react'; import { createPortal } from 'react-dom'; import { Controller, FormProvider, useFieldArray } from 'react-hook-form'; diff --git a/interface/app/$libraryId/settings/library/locations/IndexerRuleEditor/index.tsx b/interface/app/$libraryId/settings/library/locations/IndexerRuleEditor/index.tsx index 8bd518e98..4801cb50a 100644 --- a/interface/app/$libraryId/settings/library/locations/IndexerRuleEditor/index.tsx +++ b/interface/app/$libraryId/settings/library/locations/IndexerRuleEditor/index.tsx @@ -1,12 +1,12 @@ -import clsx from 'clsx'; import { Trash } from '@phosphor-icons/react'; +import clsx from 'clsx'; import { MouseEventHandler, useState } from 'react'; import { ControllerRenderProps } from 'react-hook-form'; import { IndexerRule, useLibraryMutation, useLibraryQuery } from '@sd/client'; import { Button, Divider, Label, toast } from '@sd/ui'; import { InfoText } from '@sd/ui/src/forms'; - import { showAlertDialog } from '~/components'; + import RuleButton from './RuleButton'; import RulesForm from './RulesForm'; diff --git a/interface/app/$libraryId/settings/library/locations/ListItem.tsx b/interface/app/$libraryId/settings/library/locations/ListItem.tsx index 7feb683f0..c976a6e84 100644 --- a/interface/app/$libraryId/settings/library/locations/ListItem.tsx +++ b/interface/app/$libraryId/settings/library/locations/ListItem.tsx @@ -1,12 +1,12 @@ -import clsx from 'clsx'; import { Repeat, Trash } from '@phosphor-icons/react'; +import clsx from 'clsx'; import { useState } from 'react'; import { useNavigate } from 'react-router'; import { arraysEqual, Location, useLibraryMutation, useOnlineLocations } from '@sd/client'; import { Button, Card, dialogManager, Tooltip } from '@sd/ui'; - import { Folder } from '~/components'; import { useIsDark } from '~/hooks'; + import DeleteDialog from './DeleteDialog'; interface Props { diff --git a/interface/app/$libraryId/settings/library/nodes.tsx b/interface/app/$libraryId/settings/library/nodes.tsx index eee88e566..375b3af97 100644 --- a/interface/app/$libraryId/settings/library/nodes.tsx +++ b/interface/app/$libraryId/settings/library/nodes.tsx @@ -7,8 +7,8 @@ import { useFeatureFlag } from '@sd/client'; import { Button } from '@sd/ui'; - import { startPairing } from '~/app/p2p/pairing'; + import { Heading } from '../Layout'; export const Component = () => { diff --git a/interface/app/$libraryId/settings/library/tags/CreateDialog.tsx b/interface/app/$libraryId/settings/library/tags/CreateDialog.tsx index 480be1c49..a0fdba8c4 100644 --- a/interface/app/$libraryId/settings/library/tags/CreateDialog.tsx +++ b/interface/app/$libraryId/settings/library/tags/CreateDialog.tsx @@ -1,6 +1,5 @@ import { Object, useLibraryMutation, usePlausibleEvent, useZodForm } from '@sd/client'; import { Dialog, InputField, useDialog, UseDialogProps, z } from '@sd/ui'; - import { ColorPicker } from '~/components'; const schema = z.object({ diff --git a/interface/app/$libraryId/settings/library/tags/EditForm.tsx b/interface/app/$libraryId/settings/library/tags/EditForm.tsx index a18da5812..9ee204358 100644 --- a/interface/app/$libraryId/settings/library/tags/EditForm.tsx +++ b/interface/app/$libraryId/settings/library/tags/EditForm.tsx @@ -1,9 +1,9 @@ import { Trash } from '@phosphor-icons/react'; import { Tag, useLibraryMutation, useZodForm } from '@sd/client'; import { Button, dialogManager, Form, InputField, Switch, Tooltip, z } from '@sd/ui'; - import { ColorPicker } from '~/components'; import { useDebouncedFormWatch } from '~/hooks'; + import Setting from '../../Setting'; import DeleteDialog from './DeleteDialog'; diff --git a/interface/app/$libraryId/settings/library/tags/index.tsx b/interface/app/$libraryId/settings/library/tags/index.tsx index 635844369..f44660858 100644 --- a/interface/app/$libraryId/settings/library/tags/index.tsx +++ b/interface/app/$libraryId/settings/library/tags/index.tsx @@ -2,10 +2,10 @@ import clsx from 'clsx'; import { useEffect, useState } from 'react'; import { Tag, useLibraryQuery } from '@sd/client'; import { Button, Card, dialogManager } from '@sd/ui'; - import { Heading } from '~/app/$libraryId/settings/Layout'; import { TagsSettingsParamsSchema } from '~/app/route-schemas'; import { useZodRouteParams } from '~/hooks'; + import CreateDialog from './CreateDialog'; import EditForm from './EditForm'; diff --git a/interface/app/$libraryId/settings/node/libraries/ListItem.tsx b/interface/app/$libraryId/settings/node/libraries/ListItem.tsx index d3ee1c9ab..2a537279c 100644 --- a/interface/app/$libraryId/settings/node/libraries/ListItem.tsx +++ b/interface/app/$libraryId/settings/node/libraries/ListItem.tsx @@ -1,9 +1,9 @@ -import { Database, Database_Light } from '@sd/assets/icons'; import { Pencil, Trash } from '@phosphor-icons/react'; +import { Database, Database_Light } from '@sd/assets/icons'; import { LibraryConfigWrapped } from '@sd/client'; import { Button, ButtonLink, Card, dialogManager, Tooltip } from '@sd/ui'; - import { useIsDark } from '~/hooks'; + import DeleteDialog from './DeleteDialog'; interface Props { diff --git a/interface/app/$libraryId/settings/resources/about.tsx b/interface/app/$libraryId/settings/resources/about.tsx index e3347fab0..11174c6de 100644 --- a/interface/app/$libraryId/settings/resources/about.tsx +++ b/interface/app/$libraryId/settings/resources/about.tsx @@ -1,9 +1,8 @@ +import { Globe } from '@phosphor-icons/react'; import { AppLogo } from '@sd/assets/images'; import { Discord, Github } from '@sd/assets/svgs/brands'; -import { Globe } from '@phosphor-icons/react'; import { useBridgeQuery, useDebugStateEnabler } from '@sd/client'; import { Button, Divider } from '@sd/ui'; - import { useOperatingSystem } from '~/hooks/useOperatingSystem'; import { usePlatform } from '~/util/Platform'; diff --git a/interface/app/$libraryId/settings/resources/dependencies.tsx b/interface/app/$libraryId/settings/resources/dependencies.tsx index a972131e6..f05bfa703 100644 --- a/interface/app/$libraryId/settings/resources/dependencies.tsx +++ b/interface/app/$libraryId/settings/resources/dependencies.tsx @@ -1,6 +1,5 @@ import { useQuery } from '@tanstack/react-query'; import { ScreenHeading } from '@sd/ui'; - import { usePlatform } from '~/util/Platform'; export const Component = () => { diff --git a/interface/app/$libraryId/spacedrop.tsx b/interface/app/$libraryId/spacedrop.tsx index 113606fa3..4b499aec8 100644 --- a/interface/app/$libraryId/spacedrop.tsx +++ b/interface/app/$libraryId/spacedrop.tsx @@ -1,10 +1,10 @@ +import { Icon, User } from '@phosphor-icons/react'; import { GoogleDrive, iCloud, Mega } from '@sd/assets/images'; import clsx from 'clsx'; -import { Icon, User } from '@phosphor-icons/react'; import { tw } from '@sd/ui'; - import { SubtleButton, SubtleButtonContainer } from '~/components'; import { OperatingSystem } from '~/util/Platform'; + import classes from './spacedrop.module.scss'; // const { Form, Input, useZodForm, z } = forms; diff --git a/interface/app/$libraryId/tag/$id.tsx b/interface/app/$libraryId/tag/$id.tsx index 46837b99a..ab59112f7 100644 --- a/interface/app/$libraryId/tag/$id.tsx +++ b/interface/app/$libraryId/tag/$id.tsx @@ -1,9 +1,9 @@ import { getIcon, iconNames } from '@sd/assets/util'; import { useMemo } from 'react'; import { ObjectOrder, useLibraryQuery } from '@sd/client'; - import { LocationIdParamsSchema } from '~/app/route-schemas'; import { useZodRouteParams } from '~/hooks'; + import Explorer from '../Explorer'; import { ExplorerContextProvider } from '../Explorer/Context'; import { createDefaultExplorerSettings, objectOrderingKeysSchema } from '../Explorer/store'; diff --git a/interface/app/index.tsx b/interface/app/index.tsx index 976706398..decbc9aaf 100644 --- a/interface/app/index.tsx +++ b/interface/app/index.tsx @@ -2,9 +2,9 @@ import { useMemo } from 'react'; import { Navigate, Outlet, useMatches, type RouteObject } from 'react-router-dom'; import { currentLibraryCache, useCachedLibraries, useInvalidateQuery } from '@sd/client'; import { Dialogs, Toaster } from '@sd/ui'; - import { RouterErrorBoundary } from '~/ErrorFallback'; import { useKeybindHandler, useTheme } from '~/hooks'; + import libraryRoutes from './$libraryId'; import onboardingRoutes from './onboarding'; import { RootContext } from './RootContext'; diff --git a/interface/app/onboarding/Layout.tsx b/interface/app/onboarding/Layout.tsx index 5736befe9..86223ff95 100644 --- a/interface/app/onboarding/Layout.tsx +++ b/interface/app/onboarding/Layout.tsx @@ -3,9 +3,9 @@ import clsx from 'clsx'; import { Navigate, Outlet } from 'react-router'; import { useDebugState } from '@sd/client'; import { tw } from '@sd/ui'; - import DragRegion from '~/components/DragRegion'; import { useOperatingSystem } from '~/hooks/useOperatingSystem'; + import DebugPopover from '../$libraryId/Layout/Sidebar/DebugPopover'; import { macOnly } from '../$libraryId/Layout/Sidebar/helpers'; import { OnboardingContext, useContextValue } from './context'; diff --git a/interface/app/onboarding/alpha.tsx b/interface/app/onboarding/alpha.tsx index 220ba8519..bca04dc2d 100644 --- a/interface/app/onboarding/alpha.tsx +++ b/interface/app/onboarding/alpha.tsx @@ -1,9 +1,9 @@ import { AlphaBg, AlphaBg_Light, AppLogo } from '@sd/assets/images'; import { Discord } from '@sd/assets/svgs/brands'; import { Button, ButtonLink } from '@sd/ui'; - import { useIsDark } from '~/hooks'; import { usePlatform } from '~/util/Platform'; + import { OnboardingContainer } from './Layout'; export default function OnboardingAlpha() { diff --git a/interface/app/p2p/Spacedrop.tsx b/interface/app/p2p/Spacedrop.tsx index 7430e374f..82b2f9265 100644 --- a/interface/app/p2p/Spacedrop.tsx +++ b/interface/app/p2p/Spacedrop.tsx @@ -19,8 +19,8 @@ import { UseDialogProps, z } from '@sd/ui'; - import { usePlatform } from '~/util/Platform'; + import { getSpacedropState, subscribeSpacedropState } from '../../hooks/useSpacedropState'; function SpacedropProgress({ toastId, dropId }: { toastId: ToastId; dropId: string }) { diff --git a/interface/app/style.scss b/interface/app/style.scss index 164794821..28b387fbd 100644 --- a/interface/app/style.scss +++ b/interface/app/style.scss @@ -53,36 +53,36 @@ body { /*Tooltip*/ .TooltipContent { - animation-duration: 0.6s; - animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1); + animation-duration: 0.6s; + animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1); } .TooltipContent[data-side='top'] { - animation-name: slideUp; + animation-name: slideUp; } .TooltipContent[data-side='bottom'] { - animation-name: slideDown; + animation-name: slideDown; } @keyframes slideDown { - from { - opacity: 0; - transform: translateY(-10px); - } - to { - opacity: 1; - transform: translateY(0); - } + from { + opacity: 0; + transform: translateY(-10px); + } + to { + opacity: 1; + transform: translateY(0); + } } @keyframes slideUp { - from { - opacity: 0; - transform: translateY(10px); - } - to { - opacity: 1; - transform: translateY(0); - } + from { + opacity: 0; + transform: translateY(10px); + } + to { + opacity: 1; + transform: translateY(0); + } } .custom-scroll { @@ -202,7 +202,7 @@ body { @apply bg-transparent; } &::-webkit-scrollbar-thumb { - @apply bg-app-box rounded-md; + @apply rounded-md bg-app-box; } } diff --git a/interface/components/Accordion.tsx b/interface/components/Accordion.tsx index dbb64b91b..2a5d458e4 100644 --- a/interface/components/Accordion.tsx +++ b/interface/components/Accordion.tsx @@ -1,5 +1,5 @@ -import clsx from 'clsx'; import { CaretDown } from '@phosphor-icons/react'; +import clsx from 'clsx'; import { PropsWithChildren, useState } from 'react'; interface Props { diff --git a/interface/components/AssignTagMenuItems.tsx b/interface/components/AssignTagMenuItems.tsx index 36f7240e6..a8815e44f 100644 --- a/interface/components/AssignTagMenuItems.tsx +++ b/interface/components/AssignTagMenuItems.tsx @@ -4,11 +4,11 @@ import clsx from 'clsx'; import { useRef } from 'react'; import { Object, useLibraryMutation, useLibraryQuery, usePlausibleEvent } from '@sd/client'; import { dialogManager, ModifierKeys } from '@sd/ui'; - import CreateDialog from '~/app/$libraryId/settings/library/tags/CreateDialog'; import { useOperatingSystem } from '~/hooks'; import { useScrolled } from '~/hooks/useScrolled'; import { keybindForOs } from '~/util/keybinds'; + import { Menu } from './Menu'; export default (props: { objects: Object[] }) => { diff --git a/interface/components/DismissibleNotice.tsx b/interface/components/DismissibleNotice.tsx index efcfabc90..6568f0808 100644 --- a/interface/components/DismissibleNotice.tsx +++ b/interface/components/DismissibleNotice.tsx @@ -1,7 +1,6 @@ import clsx from 'clsx'; import { ReactNode } from 'react'; import { Button } from '@sd/ui'; - import { dismissibleNoticeStore, getDismissibleNoticeStore, diff --git a/interface/components/Folder.tsx b/interface/components/Folder.tsx index e06ab3768..480c5f058 100644 --- a/interface/components/Folder.tsx +++ b/interface/components/Folder.tsx @@ -4,7 +4,6 @@ import { Folder as Folder_Dark, Folder_Light } from '@sd/assets/icons'; - import { useIsDark } from '~/hooks'; interface Props { diff --git a/interface/components/Loader.tsx b/interface/components/Loader.tsx index 66fd1cbd3..f8fda2b1e 100644 --- a/interface/components/Loader.tsx +++ b/interface/components/Loader.tsx @@ -1,6 +1,5 @@ import clsx from 'clsx'; import { Puff } from 'react-loading-icons'; - import { useIsDark } from '~/hooks'; interface Props { diff --git a/interface/components/PDFViewer.tsx b/interface/components/PDFViewer.tsx index 4204f91d8..881837e76 100644 --- a/interface/components/PDFViewer.tsx +++ b/interface/components/PDFViewer.tsx @@ -1,5 +1,4 @@ import { memo, useLayoutEffect, useMemo } from 'react'; - import { useOperatingSystem } from '~/hooks'; export interface PDFViewerProps { diff --git a/interface/components/TrafficLights.tsx b/interface/components/TrafficLights.tsx index 9c7a754ba..7519ac20f 100644 --- a/interface/components/TrafficLights.tsx +++ b/interface/components/TrafficLights.tsx @@ -3,7 +3,6 @@ import fullscreenIconPath from '@sd/assets/svgs/macos_fullscreen.svg'; import minimizeIconPath from '@sd/assets/svgs/macos_minimize.svg'; import clsx from 'clsx'; import { ComponentProps, HTMLAttributes, useEffect, useRef } from 'react'; - import { useFocusState } from '~/hooks/useFocusState'; export interface TrafficLightsProps extends ComponentProps<'div'> { diff --git a/interface/hooks/useKeyDeleteFile.tsx b/interface/hooks/useKeyDeleteFile.tsx index 2f1f8a2f4..55b5e575e 100644 --- a/interface/hooks/useKeyDeleteFile.tsx +++ b/interface/hooks/useKeyDeleteFile.tsx @@ -1,7 +1,6 @@ import { useKey } from 'rooks'; import type { ExplorerItem } from '@sd/client'; import { dialogManager } from '@sd/ui'; - import DeleteDialog from '~/app/$libraryId/Explorer/FilePath/DeleteDialog'; export const useKeyDeleteFile = (selectedItems: Set, locationId?: number | null) => { diff --git a/interface/hooks/useKeyMatcher.ts b/interface/hooks/useKeyMatcher.ts index 5e1be0082..4b7edf507 100644 --- a/interface/hooks/useKeyMatcher.ts +++ b/interface/hooks/useKeyMatcher.ts @@ -1,33 +1,34 @@ -import { ModifierKeys, modifierSymbols } from "@sd/ui"; -import { OperatingSystem } from ".."; -import { useOperatingSystem } from "./useOperatingSystem"; +import { ModifierKeys, modifierSymbols } from '@sd/ui'; -type keysToMatch = 'Meta' | 'Alt' -type keysOsMap = Record -type osKeys = Record, icon: string}> +import { OperatingSystem } from '..'; +import { useOperatingSystem } from './useOperatingSystem'; + +type keysToMatch = 'Meta' | 'Alt'; +type keysOsMap = Record; +type osKeys = Record; icon: string }>; //This is a helper function to handle the possibility of a modifier key being undefined due to OS initial check const modifierKey = (key: keyof typeof ModifierKeys, os: 'Windows' | 'macOS' | 'Other') => { return modifierSymbols[key][os] ?? modifierSymbols[key]['Other']; -} +}; //Match macOS keys to Windows keys and others const keysOsMap: keysOsMap = { - 'Meta': { - 'macOS': {key: 'Meta', icon: modifierKey(ModifierKeys.Meta, 'macOS') }, - 'windows': {key: 'Control', icon: modifierKey(ModifierKeys.Control, 'Windows') }, - 'browser': {key: 'Control', icon: modifierKey(ModifierKeys.Control, 'Windows') }, - 'linux': {key: 'Control', icon: modifierKey(ModifierKeys.Control, 'Windows') }, - 'unknown': {key: 'Control', icon: modifierKey(ModifierKeys.Control, 'Windows') }, + Meta: { + macOS: { key: 'Meta', icon: modifierKey(ModifierKeys.Meta, 'macOS') }, + windows: { key: 'Control', icon: modifierKey(ModifierKeys.Control, 'Windows') }, + browser: { key: 'Control', icon: modifierKey(ModifierKeys.Control, 'Windows') }, + linux: { key: 'Control', icon: modifierKey(ModifierKeys.Control, 'Windows') }, + unknown: { key: 'Control', icon: modifierKey(ModifierKeys.Control, 'Windows') } }, - 'Alt': { - 'macOS': {key: 'Alt', icon: modifierKey(ModifierKeys.Alt, 'macOS') }, - 'windows': {key: 'Alt', icon: modifierKey(ModifierKeys.Alt, 'Other') }, - 'browser': {key: 'Alt', icon: modifierKey(ModifierKeys.Alt, 'Other') }, - 'linux': {key: 'Alt', icon: modifierKey(ModifierKeys.Alt, 'Other') }, - 'unknown': {key: 'Alt', icon: modifierKey(ModifierKeys.Alt, 'Other') }, - }, -} as const + Alt: { + macOS: { key: 'Alt', icon: modifierKey(ModifierKeys.Alt, 'macOS') }, + windows: { key: 'Alt', icon: modifierKey(ModifierKeys.Alt, 'Other') }, + browser: { key: 'Alt', icon: modifierKey(ModifierKeys.Alt, 'Other') }, + linux: { key: 'Alt', icon: modifierKey(ModifierKeys.Alt, 'Other') }, + unknown: { key: 'Alt', icon: modifierKey(ModifierKeys.Alt, 'Other') } + } +} as const; export function useKeyMatcher(arg: keyof typeof keysOsMap): osKeys[OperatingSystem] { const os = useOperatingSystem(); diff --git a/interface/hooks/useKeybindFactory.ts b/interface/hooks/useKeybindFactory.ts index 6ecf4e0d1..ef7ed6e89 100644 --- a/interface/hooks/useKeybindFactory.ts +++ b/interface/hooks/useKeybindFactory.ts @@ -1,4 +1,5 @@ import { keybindForOs } from '~/util/keybinds'; + import { useOperatingSystem } from './useOperatingSystem'; export const useKeybindFactory = () => keybindForOs(useOperatingSystem()); diff --git a/packages/client/src/core.ts b/packages/client/src/core.ts index 9824200be..8e2c97c7b 100644 --- a/packages/client/src/core.ts +++ b/packages/client/src/core.ts @@ -12,7 +12,7 @@ export type Procedures = { { key: "files.getPath", input: LibraryArgs, result: string | null } | { key: "invalidation.test-invalidate", input: never, result: number } | { key: "jobs.isActive", input: LibraryArgs, result: boolean } | - { key: "jobs.reports", input: never, result: { [key: string]: JobGroup[] } } | + { key: "jobs.reports", input: LibraryArgs, result: JobGroup[] } | { key: "library.list", input: never, result: LibraryConfigWrapped[] } | { key: "library.statistics", input: LibraryArgs, result: Statistics } | { key: "locations.get", input: LibraryArgs, result: Location | null } | @@ -222,7 +222,7 @@ export type InvalidateOperationEvent = { type: "single"; data: SingleInvalidateO export type JobGroup = { id: string; action: string | null; status: JobStatus; created_at: string; jobs: JobReport[] } -export type JobProgressEvent = { id: string; task_count: number; completed_task_count: number; message: string; estimated_completion: string } +export type JobProgressEvent = { id: string; library_id: string; task_count: number; completed_task_count: number; message: string; estimated_completion: string } export type JobReport = { id: string; name: string; action: string | null; data: number[] | null; metadata: any | null; is_background: boolean; errors_text: string[]; created_at: string | null; started_at: string | null; completed_at: string | null; parent_id: string | null; status: JobStatus; task_count: number; completed_task_count: number; message: string; estimated_completion: string } diff --git a/packages/ui/src/CheckBox.tsx b/packages/ui/src/CheckBox.tsx index 0f1c899f7..7eb23caa3 100644 --- a/packages/ui/src/CheckBox.tsx +++ b/packages/ui/src/CheckBox.tsx @@ -1,7 +1,7 @@ +import { Check } from '@phosphor-icons/react'; import * as Checkbox from '@radix-ui/react-checkbox'; import { cva, VariantProps } from 'class-variance-authority'; import clsx from 'clsx'; -import { Check } from '@phosphor-icons/react'; import { ComponentProps, forwardRef } from 'react'; const styles = cva( diff --git a/packages/ui/src/Input.tsx b/packages/ui/src/Input.tsx index fcaa08cb2..bcba85073 100644 --- a/packages/ui/src/Input.tsx +++ b/packages/ui/src/Input.tsx @@ -1,6 +1,6 @@ +import { Eye, EyeSlash, Icon, IconProps, MagnifyingGlass } from '@phosphor-icons/react'; import { cva, VariantProps } from 'class-variance-authority'; import clsx from 'clsx'; -import { Eye, EyeSlash, Icon, IconProps, MagnifyingGlass } from '@phosphor-icons/react'; import { createElement, forwardRef, isValidElement, useState } from 'react'; import { Button } from './Button'; diff --git a/packages/ui/src/Select.tsx b/packages/ui/src/Select.tsx index 45e1180b4..ead4a8b50 100644 --- a/packages/ui/src/Select.tsx +++ b/packages/ui/src/Select.tsx @@ -1,8 +1,8 @@ +import { Check } from '@phosphor-icons/react'; import * as RS from '@radix-ui/react-select'; import { ReactComponent as ChevronDouble } from '@sd/assets/svgs/chevron-double.svg'; import { cva, VariantProps } from 'class-variance-authority'; import clsx from 'clsx'; -import { Check } from '@phosphor-icons/react'; import { forwardRef, PropsWithChildren } from 'react'; export const selectStyles = cva( diff --git a/packages/ui/src/Toast.tsx b/packages/ui/src/Toast.tsx index 0aaa3bd6c..37095d484 100644 --- a/packages/ui/src/Toast.tsx +++ b/packages/ui/src/Toast.tsx @@ -1,5 +1,5 @@ -import clsx from 'clsx'; import { CheckCircle, Icon, Info, Warning, WarningCircle, X } from '@phosphor-icons/react'; +import clsx from 'clsx'; import { CSSProperties, ReactNode, useEffect, useState } from 'react'; import { toast as SonnerToast } from 'sonner'; diff --git a/packages/ui/src/forms/Form.tsx b/packages/ui/src/forms/Form.tsx index 832ba001f..bb85db7b6 100644 --- a/packages/ui/src/forms/Form.tsx +++ b/packages/ui/src/forms/Form.tsx @@ -1,6 +1,6 @@ +import { Warning } from '@phosphor-icons/react'; import { animated, useTransition } from '@react-spring/web'; import { cva, VariantProps } from 'class-variance-authority'; -import { Warning } from '@phosphor-icons/react'; import { ComponentProps } from 'react'; import { FieldErrors, diff --git a/packages/ui/style/tailwind.js b/packages/ui/style/tailwind.js index 96922ab15..36dd3f261 100644 --- a/packages/ui/style/tailwind.js +++ b/packages/ui/style/tailwind.js @@ -59,7 +59,7 @@ module.exports = function (app, options) { divider: alpha('--color-sidebar-divider'), button: alpha('--color-sidebar-button'), selected: alpha('--color-sidebar-selected'), - shade: alpha('--color-sidebar-shade'), + shade: alpha('--color-sidebar-shade') }, app: { DEFAULT: alpha('--color-app'), @@ -79,7 +79,7 @@ module.exports = function (app, options) { shade: alpha('--color-app-shade'), frame: alpha('--color-app-frame'), slider: alpha('--color-app-slider'), - explorerScrollbar: alpha('--color-app-explorer-scrollbar'), + explorerScrollbar: alpha('--color-app-explorer-scrollbar') }, menu: { DEFAULT: alpha('--color-menu'),