mirror of
https://github.com/spacedriveapp/spacedrive
synced 2024-06-30 12:33:31 +00:00
Merge branch 'main' into eng-386-inspector-sister-file-paths
This commit is contained in:
commit
2554cfab3c
4
Cargo.lock
generated
4
Cargo.lock
generated
|
@ -9035,7 +9035,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "sd-core"
|
||||
version = "0.2.15"
|
||||
version = "0.3.0"
|
||||
dependencies = [
|
||||
"aovec",
|
||||
"async-channel",
|
||||
|
@ -9292,7 +9292,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "sd-desktop"
|
||||
version = "0.2.15"
|
||||
version = "0.3.0"
|
||||
dependencies = [
|
||||
"axum",
|
||||
"directories 5.0.1",
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import AppKit
|
||||
import SwiftRs
|
||||
|
||||
@objc
|
||||
public enum AppThemeType: Int {
|
||||
|
@ -7,6 +8,34 @@ public enum AppThemeType: Int {
|
|||
case dark = 1
|
||||
}
|
||||
|
||||
var activity: NSObjectProtocol?
|
||||
|
||||
@_cdecl("disable_app_nap")
|
||||
public func disableAppNap(reason: SRString) -> Bool {
|
||||
// Check if App Nap is already disabled
|
||||
guard activity == nil else {
|
||||
return false
|
||||
}
|
||||
|
||||
activity = ProcessInfo.processInfo.beginActivity(
|
||||
options: .userInitiatedAllowingIdleSystemSleep,
|
||||
reason: reason.toString()
|
||||
)
|
||||
return true
|
||||
}
|
||||
|
||||
@_cdecl("enable_app_nap")
|
||||
public func enableAppNap() -> Bool {
|
||||
// Check if App Nap is already enabled
|
||||
guard let pinfo = activity else {
|
||||
return false
|
||||
}
|
||||
|
||||
ProcessInfo.processInfo.endActivity(pinfo)
|
||||
activity = nil
|
||||
return true
|
||||
}
|
||||
|
||||
@_cdecl("lock_app_theme")
|
||||
public func lockAppTheme(themeType: AppThemeType) {
|
||||
var theme: NSAppearance?
|
||||
|
|
|
@ -9,10 +9,10 @@ pub enum AppThemeType {
|
|||
Dark = 1 as Int,
|
||||
}
|
||||
|
||||
swift!(pub fn disable_app_nap(reason: &SRString) -> Bool);
|
||||
swift!(pub fn enable_app_nap() -> Bool);
|
||||
swift!(pub fn lock_app_theme(theme_type: Int));
|
||||
swift!(pub fn set_titlebar_style(window: &NSObject, is_fullscreen: Bool));
|
||||
// swift!(pub fn setup_disk_watcher(window: &NSObject, transparent: Bool, large: Bool));
|
||||
// swift!(pub fn disk_event_callback(mounted: Bool, path: &SRString));
|
||||
swift!(pub fn reload_webview(webview: &NSObject));
|
||||
|
||||
#[repr(C)]
|
||||
|
@ -30,20 +30,3 @@ pub fn open_file_paths_with(file_urls: &[String], with_url: &str) {
|
|||
let file_url = file_urls.join("\0");
|
||||
unsafe { open_file_path_with(&file_url.as_str().into(), &with_url.into()) }
|
||||
}
|
||||
|
||||
// main!(|_| {
|
||||
// unsafe { setup_disk_watcher() };
|
||||
// print!("Waiting for disk events... ");
|
||||
// Ok(())
|
||||
// });
|
||||
|
||||
// #[no_mangle]
|
||||
// pub extern "C" fn disk_event_callback(mounted: Bool, path: *const SRString) {
|
||||
// let mounted_str = if mounted { "mounted" } else { "unmounted" };
|
||||
|
||||
// // Convert the raw pointer to a reference
|
||||
// let path_ref = unsafe { &*path };
|
||||
// let path_str = path_ref.to_string(); // Assuming SRString has a to_string method
|
||||
|
||||
// println!("Disk at path {} was {}", path_str, mounted_str);
|
||||
// }
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
[package]
|
||||
name = "sd-desktop"
|
||||
version = "0.2.15"
|
||||
version = "0.3.0"
|
||||
description = "The universal file manager."
|
||||
authors = ["Spacedrive Technology Inc <support@spacedrive.com>"]
|
||||
default-run = "sd-desktop"
|
||||
|
|
|
@ -289,7 +289,10 @@ async fn main() -> tauri::Result<()> {
|
|||
sd_desktop_macos::set_titlebar_style(
|
||||
&window.ns_window().expect("NSWindows must exist on macOS"),
|
||||
false,
|
||||
)
|
||||
);
|
||||
sd_desktop_macos::disable_app_nap(
|
||||
&"File indexer needs to run unimpeded".into(),
|
||||
);
|
||||
};
|
||||
}
|
||||
});
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
{
|
||||
"$schema": "https://github.com/tauri-apps/tauri/raw/tauri-v2.0.0-beta.17/core/tauri-config-schema/schema.json",
|
||||
"productName": "Spacedrive",
|
||||
"version": "0.2.13",
|
||||
"identifier": "com.spacedrive.desktop",
|
||||
"build": {
|
||||
"beforeDevCommand": "pnpm dev",
|
||||
|
|
|
@ -4,6 +4,19 @@ import {
|
|||
NavigationContainer,
|
||||
useNavigationContainerRef
|
||||
} from '@react-navigation/native';
|
||||
import {
|
||||
ClientContextProvider,
|
||||
LibraryContextProvider,
|
||||
P2PContextProvider,
|
||||
RspcProvider,
|
||||
initPlausible,
|
||||
useBridgeQuery,
|
||||
useClientContext,
|
||||
useInvalidateQuery,
|
||||
usePlausibleEvent,
|
||||
usePlausiblePageViewMonitor,
|
||||
usePlausiblePingMonitor
|
||||
} from '@sd/client';
|
||||
import { QueryClient } from '@tanstack/react-query';
|
||||
import dayjs from 'dayjs';
|
||||
import advancedFormat from 'dayjs/plugin/advancedFormat';
|
||||
|
@ -17,19 +30,6 @@ import { GestureHandlerRootView } from 'react-native-gesture-handler';
|
|||
import { MenuProvider } from 'react-native-popup-menu';
|
||||
import { SafeAreaProvider } from 'react-native-safe-area-context';
|
||||
import { useSnapshot } from 'valtio';
|
||||
import {
|
||||
ClientContextProvider,
|
||||
initPlausible,
|
||||
LibraryContextProvider,
|
||||
P2PContextProvider,
|
||||
RspcProvider,
|
||||
useBridgeQuery,
|
||||
useClientContext,
|
||||
useInvalidateQuery,
|
||||
usePlausibleEvent,
|
||||
usePlausiblePageViewMonitor,
|
||||
usePlausiblePingMonitor
|
||||
} from '@sd/client';
|
||||
|
||||
import { GlobalModals } from './components/modal/GlobalModals';
|
||||
import { Toast, toastConfig } from './components/primitive/Toast';
|
||||
|
@ -55,13 +55,17 @@ function AppNavigation() {
|
|||
const plausibleEvent = usePlausibleEvent();
|
||||
const buildInfo = useBridgeQuery(['buildInfo']);
|
||||
|
||||
initPlausible({ platformType: 'mobile', buildInfo: buildInfo?.data });
|
||||
|
||||
const navRef = useNavigationContainerRef();
|
||||
const routeNameRef = useRef<string>();
|
||||
|
||||
const [currentPath, setCurrentPath] = useState<string>('/');
|
||||
|
||||
useEffect(() => {
|
||||
if (buildInfo?.data) {
|
||||
initPlausible({ platformType: 'mobile', buildInfo: buildInfo.data });
|
||||
}
|
||||
}, [buildInfo]);
|
||||
|
||||
usePlausiblePageViewMonitor({ currentPath });
|
||||
usePlausiblePingMonitor({ currentPath });
|
||||
|
||||
|
@ -73,9 +77,11 @@ function AppNavigation() {
|
|||
return () => clearInterval(interval);
|
||||
}, [plausibleEvent]);
|
||||
|
||||
if (library === null && libraries.data) {
|
||||
currentLibraryStore.id = libraries.data[0]?.uuid ?? null;
|
||||
}
|
||||
useEffect(() => {
|
||||
if (library === null && libraries.data) {
|
||||
currentLibraryStore.id = libraries.data[0]?.uuid ?? null;
|
||||
}
|
||||
}, [library, libraries]);
|
||||
|
||||
return (
|
||||
<NavigationContainer
|
||||
|
|
|
@ -31,17 +31,17 @@ export const CATEGORIES_LIST = [
|
|||
const BrowseCategories = () => {
|
||||
const navigation = useNavigation<BrowseStackScreenProps<'Browse'>['navigation']>();
|
||||
return (
|
||||
<View style={tw`gap-5 px-6`}>
|
||||
<View style={tw`gap-5 px-5`}>
|
||||
<View style={tw`flex-row items-center justify-between`}>
|
||||
<Text style={tw`text-lg font-bold text-white`}>Library</Text>
|
||||
<Button
|
||||
onPress={() => {
|
||||
navigation.navigate('Library');
|
||||
}}
|
||||
style={tw`h-9 w-9 rounded-full`}
|
||||
style={tw`h-8 w-8 rounded-full`}
|
||||
variant="gray"
|
||||
>
|
||||
<DotsThree weight="bold" size={20} color={'white'} />
|
||||
<DotsThree weight="bold" size={18} color={'white'} />
|
||||
</Button>
|
||||
</View>
|
||||
<View style={tw`flex-row flex-wrap gap-2`}>
|
||||
|
|
|
@ -1,14 +1,15 @@
|
|||
import { useNavigation } from '@react-navigation/native';
|
||||
import { useLibraryQuery } from '@sd/client';
|
||||
import { DotsThree, Plus } from 'phosphor-react-native';
|
||||
import { useRef } from 'react';
|
||||
import { Text, View } from 'react-native';
|
||||
import { useRef, useState } from 'react';
|
||||
import { FlatList, Text, View } from 'react-native';
|
||||
import { ModalRef } from '~/components/layout/Modal';
|
||||
import { tw } from '~/lib/tailwind';
|
||||
import { tw, twStyle } from '~/lib/tailwind';
|
||||
import { BrowseStackScreenProps } from '~/navigation/tabs/BrowseStack';
|
||||
import { SettingsStackScreenProps } from '~/navigation/tabs/SettingsStack';
|
||||
|
||||
import { Plus } from 'phosphor-react-native';
|
||||
import Empty from '../layout/Empty';
|
||||
import Fade from '../layout/Fade';
|
||||
import { LocationItem } from '../locations/LocationItem';
|
||||
import ImportModal from '../modal/ImportModal';
|
||||
import { Button } from '../primitive/Button';
|
||||
|
@ -20,54 +21,64 @@ const BrowseLocations = () => {
|
|||
>();
|
||||
|
||||
const modalRef = useRef<ModalRef>(null);
|
||||
|
||||
const [showAll, setShowAll] = useState(false);
|
||||
const result = useLibraryQuery(['locations.list'], { keepPreviousData: true });
|
||||
const locations = result.data;
|
||||
|
||||
return (
|
||||
<View style={tw`gap-5 px-6`}>
|
||||
<View style={tw`w-full flex-row items-center justify-between`}>
|
||||
<View style={tw`gap-5`}>
|
||||
<View style={tw`flex-row items-center justify-between px-5`}>
|
||||
<Text style={tw`text-lg font-bold text-white`}>Locations</Text>
|
||||
<View style={tw`flex-row gap-3`}>
|
||||
<Button
|
||||
style={tw`h-9 w-9 rounded-full`}
|
||||
variant="dashed"
|
||||
onPress={() => modalRef.current?.present()}
|
||||
style={twStyle(`rounded-full`, {
|
||||
borderColor: showAll ? tw.color('accent') : tw.color('border-app-lightborder')
|
||||
})}
|
||||
variant="outline"
|
||||
onPress={() => setShowAll((prev) => !prev)}
|
||||
>
|
||||
<Plus weight="bold" size={16} style={tw`text-ink`} />
|
||||
<Text style={tw`text-xs text-ink`}>{showAll ? 'Show less' : 'Show all'} ({locations?.length})</Text>
|
||||
</Button>
|
||||
<Button
|
||||
onPress={() => {
|
||||
navigation.navigate('Locations');
|
||||
}}
|
||||
style={tw`h-9 w-9 rounded-full`}
|
||||
onPress={() => modalRef.current?.present()}
|
||||
style={tw`flex-row gap-1 rounded-full`}
|
||||
variant="gray"
|
||||
>
|
||||
<DotsThree weight="bold" size={20} color={'white'} />
|
||||
<Plus size={10} weight="bold" style={tw`text-white`} />
|
||||
<Text style={tw`text-xs text-ink`}>Add</Text>
|
||||
</Button>
|
||||
</View>
|
||||
</View>
|
||||
<View style={tw`flex-row flex-wrap gap-2`}>
|
||||
{locations?.length === 0 ? (
|
||||
<Empty description="You have not added any locations" icon="Folder" />
|
||||
) : (
|
||||
<>
|
||||
{locations?.slice(0, 3).map((location) => (
|
||||
<View style={tw`relative -m-1`}>
|
||||
<Fade color='black' width={30} height="100%">
|
||||
<FlatList
|
||||
data={locations}
|
||||
ListEmptyComponent={<Empty description="You have not added any locations" icon="Folder" />}
|
||||
numColumns={showAll ? 3 : 1}
|
||||
horizontal={showAll ? false : true}
|
||||
contentContainerStyle={twStyle(locations?.length === 0 && 'w-full','px-5')}
|
||||
key={showAll ? '_locations' : 'alllocationcols'}
|
||||
keyExtractor={(item) => item.id.toString()}
|
||||
scrollEnabled={showAll ? false : true}
|
||||
showsHorizontalScrollIndicator={false}
|
||||
renderItem={({ item }) => {
|
||||
return (
|
||||
<LocationItem
|
||||
key={location.id}
|
||||
location={location}
|
||||
location={item}
|
||||
style={twStyle(showAll && 'max-w-[31%] flex-1')}
|
||||
editLocation={() =>
|
||||
navigation.navigate('SettingsStack', {
|
||||
screen: 'EditLocationSettings',
|
||||
params: { id: location.id },
|
||||
params: { id: item.id },
|
||||
initial: false
|
||||
})
|
||||
}
|
||||
onPress={() => navigation.navigate('Location', { id: location.id })}
|
||||
/>
|
||||
))}
|
||||
</>
|
||||
)}
|
||||
onPress={() => navigation.navigate('Location', { id: item.id })}
|
||||
/>
|
||||
)}
|
||||
}
|
||||
/>
|
||||
</Fade>
|
||||
</View>
|
||||
<ImportModal ref={modalRef} />
|
||||
</View>
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
import { useNavigation } from '@react-navigation/native';
|
||||
import { useLibraryQuery } from '@sd/client';
|
||||
import { DotsThree, Plus } from 'phosphor-react-native';
|
||||
import React, { useRef } from 'react';
|
||||
import { Text, View } from 'react-native';
|
||||
import { Plus } from 'phosphor-react-native';
|
||||
import React, { useRef, useState } from 'react';
|
||||
import { FlatList, Text, View } from 'react-native';
|
||||
import { ModalRef } from '~/components/layout/Modal';
|
||||
import { tw } from '~/lib/tailwind';
|
||||
import { tw, twStyle } from '~/lib/tailwind';
|
||||
import { BrowseStackScreenProps } from '~/navigation/tabs/BrowseStack';
|
||||
|
||||
import Empty from '../layout/Empty';
|
||||
import Fade from '../layout/Fade';
|
||||
import CreateTagModal from '../modal/tag/CreateTagModal';
|
||||
import { Button } from '../primitive/Button';
|
||||
import { TagItem } from '../tags/TagItem';
|
||||
|
@ -19,47 +20,58 @@ const BrowseTags = () => {
|
|||
const tagData = tags.data;
|
||||
|
||||
const modalRef = useRef<ModalRef>(null);
|
||||
const [showAll, setShowAll] = useState(false);
|
||||
|
||||
return (
|
||||
<View style={tw`gap-5 px-6`}>
|
||||
<View style={tw`w-full flex-row items-center justify-between`}>
|
||||
<View style={tw`gap-5`}>
|
||||
<View style={tw`w-full flex-row items-center justify-between px-5`}>
|
||||
<Text style={tw`text-lg font-bold text-white`}>Tags</Text>
|
||||
<View style={tw`flex-row gap-3`}>
|
||||
<Button
|
||||
style={tw`h-9 w-9 rounded-full`}
|
||||
variant="dashed"
|
||||
onPress={() => modalRef.current?.present()}
|
||||
testID='show-all-tags-button'
|
||||
style={twStyle(`rounded-full`, {
|
||||
borderColor: showAll ? tw.color('accent') : tw.color('border-app-lightborder')
|
||||
})}
|
||||
variant="outline"
|
||||
onPress={() => setShowAll((prev) => !prev)}
|
||||
>
|
||||
<Plus weight="bold" size={16} style={tw`text-ink`} />
|
||||
<Text style={tw`text-xs text-ink`}>{showAll ? 'Show less' : 'Show all'} ({tagData?.length})</Text>
|
||||
</Button>
|
||||
<Button
|
||||
testID="navigate-tags-screen"
|
||||
onPress={() => {
|
||||
navigation.navigate('Tags');
|
||||
}}
|
||||
style={tw`w-9 rounded-full`}
|
||||
testID='create-tag-button'
|
||||
onPress={() => modalRef.current?.present()}
|
||||
style={tw`flex-row gap-1 rounded-full`}
|
||||
variant="gray"
|
||||
>
|
||||
<DotsThree weight="bold" size={20} color={'white'} />
|
||||
<Plus size={10} weight="bold" style={tw`text-white`} />
|
||||
<Text style={tw`text-xs text-ink`}>Add</Text>
|
||||
</Button>
|
||||
</View>
|
||||
</View>
|
||||
<View style={tw`flex-row flex-wrap gap-2`}>
|
||||
{tagData?.length === 0 ? (
|
||||
<Empty description="You have not created any tags" icon="Tags" />
|
||||
) : (
|
||||
tagData
|
||||
?.slice(0, 3)
|
||||
.map((tag) => (
|
||||
<View style={tw`relative -m-1`}>
|
||||
<Fade color='black' width={20} height="100%">
|
||||
<FlatList
|
||||
data={tagData}
|
||||
ListEmptyComponent={<Empty description="You have not created any tags" icon="Tags" />}
|
||||
numColumns={showAll ? 3 : 1}
|
||||
contentContainerStyle={twStyle(tagData?.length === 0 && 'w-full','px-5')}
|
||||
horizontal={showAll ? false : true}
|
||||
key={showAll ? '_tags' : 'alltagcols'}
|
||||
keyExtractor={(item) => item.id.toString()}
|
||||
scrollEnabled={showAll ? false : true}
|
||||
showsHorizontalScrollIndicator={false}
|
||||
renderItem={({ item }) => (
|
||||
<TagItem
|
||||
key={tag.id}
|
||||
tag={tag}
|
||||
onPress={() =>
|
||||
navigation.navigate('Tag', { id: tag.id, color: tag.color! })
|
||||
}
|
||||
/>
|
||||
))
|
||||
)}
|
||||
style={twStyle(showAll && 'max-w-[31%] flex-1')}
|
||||
key={item.id}
|
||||
tag={item}
|
||||
onPress={() =>
|
||||
navigation.navigate('Tag', { id: item.id, color: item.color! })
|
||||
}
|
||||
/>
|
||||
)}
|
||||
/>
|
||||
</Fade>
|
||||
</View>
|
||||
<CreateTagModal ref={modalRef} />
|
||||
</View>
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
import { DrawerContentScrollView } from '@react-navigation/drawer';
|
||||
import { DrawerContentComponentProps } from '@react-navigation/drawer/lib/typescript/src/types';
|
||||
import { AppLogo } from '@sd/assets/images';
|
||||
import { JobManagerContextProvider, useLibraryQuery } from '@sd/client';
|
||||
import { Image } from 'expo-image';
|
||||
import { CheckCircle } from 'phosphor-react-native';
|
||||
import { useRef } from 'react';
|
||||
import { Platform, Pressable, Text, View } from 'react-native';
|
||||
import { JobManagerContextProvider, useLibraryQuery } from '@sd/client';
|
||||
import Layout from '~/constants/Layout';
|
||||
import { tw, twStyle } from '~/lib/tailwind';
|
||||
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
import { DrawerNavigationHelpers } from '@react-navigation/drawer/lib/typescript/src/types';
|
||||
import { useNavigation } from '@react-navigation/native';
|
||||
import { useRef } from 'react';
|
||||
import { Pressable, Text, View } from 'react-native';
|
||||
import {
|
||||
Location,
|
||||
arraysEqual,
|
||||
humanizeSize,
|
||||
Location,
|
||||
useLibraryQuery,
|
||||
useOnlineLocations
|
||||
} from '@sd/client';
|
||||
import { useRef } from 'react';
|
||||
import { Pressable, Text, View } from 'react-native';
|
||||
import { ModalRef } from '~/components/layout/Modal';
|
||||
import { tw, twStyle } from '~/lib/tailwind';
|
||||
|
||||
|
@ -49,8 +49,8 @@ const DrawerLocationItem: React.FC<DrawerLocationItemProps> = ({
|
|||
{location.name ?? ''}
|
||||
</Text>
|
||||
</View>
|
||||
<View style={tw`rounded-md border border-app-lightborder bg-app-box px-1 py-0.5`}>
|
||||
<Text style={tw`text-[11px] font-medium text-ink-dull`} numberOfLines={1}>
|
||||
<View style={tw`rounded-md border border-app-box/70 bg-app/70 px-1 py-0.5`}>
|
||||
<Text style={tw`text-[11px] font-bold text-ink-dull`} numberOfLines={1}>
|
||||
{`${humanizeSize(location.size_in_bytes)}`}
|
||||
</Text>
|
||||
</View>
|
||||
|
|
|
@ -27,7 +27,7 @@ const FileRow = ({ data }: FileRowProps) => {
|
|||
height: getExplorerStore().listItemSize
|
||||
})}
|
||||
>
|
||||
<FileThumb data={data} size={0.6} />
|
||||
<FileThumb data={data} size={0.5} />
|
||||
<View style={tw`mx-2 flex-1 flex-row items-center justify-between border-b border-white/10 pb-3`}>
|
||||
<View style={tw`max-w-[80%]`}>
|
||||
<Text numberOfLines={1} style={tw`text-center text-sm font-medium text-ink`}>
|
||||
|
|
|
@ -25,6 +25,7 @@ const SortByMenu = () => {
|
|||
return (
|
||||
<View style={tw`flex-row items-center gap-1.5`}>
|
||||
<Menu
|
||||
containerStyle={tw`max-w-44`}
|
||||
trigger={<Trigger activeOption={sortOptions[searchStore.sort.by]} />}
|
||||
|
||||
>
|
||||
|
@ -40,6 +41,7 @@ const SortByMenu = () => {
|
|||
))}
|
||||
</Menu>
|
||||
<Menu
|
||||
containerStyle={tw`max-w-40`}
|
||||
trigger={<Trigger
|
||||
triggerIcon={searchStore.sort.direction === 'Asc' ? ArrowUpIcon : ArrowDownIcon}
|
||||
activeOption={searchStore.sort.direction}
|
||||
|
|
|
@ -48,7 +48,7 @@ export default function Header({ route, navBack, title, search = false }: Props)
|
|||
}}
|
||||
>
|
||||
<MagnifyingGlass
|
||||
size={24}
|
||||
size={20}
|
||||
weight="bold"
|
||||
color={tw.color('text-zinc-300')}
|
||||
/>
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
import { TextItems } from '@sd/client';
|
||||
import { Image } from 'expo-image';
|
||||
import { Icon } from 'phosphor-react-native';
|
||||
import { Fragment } from 'react';
|
||||
import { Text, View, ViewStyle } from 'react-native';
|
||||
import { TextItems } from '@sd/client';
|
||||
import { styled, tw, twStyle } from '~/lib/tailwind';
|
||||
|
||||
type JobContainerProps = {
|
||||
|
@ -25,7 +25,7 @@ export default function JobContainer(props: JobContainerProps) {
|
|||
<View
|
||||
style={twStyle(
|
||||
'flex flex-row justify-center',
|
||||
'border-b border-app-line/50 px-8 py-4',
|
||||
'border-b border-app-line/30 px-8 py-4',
|
||||
isChild && 'my-1.5 border-b-0 p-2 pl-12',
|
||||
restProps.containerStyle
|
||||
)}
|
||||
|
|
|
@ -1,9 +1,4 @@
|
|||
import { Folder } from '@sd/assets/icons';
|
||||
import dayjs from 'dayjs';
|
||||
import { DotsThreeVertical, Pause, Play, Stop } from 'phosphor-react-native';
|
||||
import { useMemo, useState } from 'react';
|
||||
import { Animated, Pressable, View } from 'react-native';
|
||||
import { Swipeable } from 'react-native-gesture-handler';
|
||||
import {
|
||||
getJobNiceActionName,
|
||||
getTotalTasks,
|
||||
|
@ -11,13 +6,20 @@ import {
|
|||
JobProgressEvent,
|
||||
JobReport,
|
||||
useLibraryMutation,
|
||||
useRspcLibraryContext,
|
||||
useTotalElapsedTimeText
|
||||
} from '@sd/client';
|
||||
import { tw } from '~/lib/tailwind';
|
||||
import dayjs from 'dayjs';
|
||||
import { DotsThreeVertical, Eye, Pause, Play, Stop, Trash } from 'phosphor-react-native';
|
||||
import { SetStateAction, useMemo, useState } from 'react';
|
||||
import { Animated, Pressable, View } from 'react-native';
|
||||
import { Swipeable } from 'react-native-gesture-handler';
|
||||
import { tw, twStyle } from '~/lib/tailwind';
|
||||
|
||||
import { AnimatedHeight } from '../animation/layout';
|
||||
import { ProgressBar } from '../animation/ProgressBar';
|
||||
import { Button } from '../primitive/Button';
|
||||
import { Menu, MenuItem } from '../primitive/Menu';
|
||||
import { toast } from '../primitive/Toast';
|
||||
import Job from './Job';
|
||||
import JobContainer from './JobContainer';
|
||||
|
@ -58,11 +60,11 @@ export default function ({ group, progress }: JobGroupProps) {
|
|||
return (
|
||||
<Animated.View
|
||||
style={[
|
||||
tw`flex flex-row items-center pr-4`,
|
||||
tw`mt-5 flex flex-row items-start pr-4`,
|
||||
{ transform: [{ translateX: translate }] }
|
||||
]}
|
||||
>
|
||||
<Options activeJob={runningJob} group={group} />
|
||||
<Options showChildJobs={showChildJobs} setShowChildJobs={setShowChildJobs} activeJob={runningJob} group={group} />
|
||||
</Animated.View>
|
||||
);
|
||||
};
|
||||
|
@ -158,8 +160,23 @@ const toastErrorSuccess = (
|
|||
};
|
||||
};
|
||||
|
||||
function Options({ activeJob, group }: { activeJob?: JobReport; group: JobGroup }) {
|
||||
// const queryClient = useQueryClient();
|
||||
interface OptionsProps {
|
||||
activeJob?: JobReport;
|
||||
group: JobGroup;
|
||||
showChildJobs: boolean;
|
||||
setShowChildJobs: React.Dispatch<SetStateAction<boolean>>
|
||||
}
|
||||
|
||||
function Options({ activeJob, group, setShowChildJobs, showChildJobs }: OptionsProps) {
|
||||
|
||||
const rspc = useRspcLibraryContext();
|
||||
|
||||
const clearJob = useLibraryMutation(
|
||||
['jobs.clear'], {
|
||||
onSuccess: () => {
|
||||
rspc.queryClient.invalidateQueries(['jobs.reports']);
|
||||
}
|
||||
})
|
||||
|
||||
const resumeJob = useLibraryMutation(
|
||||
['jobs.resume'],
|
||||
|
@ -179,32 +196,45 @@ function Options({ activeJob, group }: { activeJob?: JobReport; group: JobGroup
|
|||
[group.jobs]
|
||||
);
|
||||
|
||||
// const clearJob = useLibraryMutation(
|
||||
// ['jobs.clear'],
|
||||
// toastErrorSuccess('failed_to_remove_job', undefined, () => {
|
||||
// queryClient.invalidateQueries(['jobs.reports']);
|
||||
// })
|
||||
// );
|
||||
const clearJobHandler = () => {
|
||||
group.jobs.forEach((job) => {
|
||||
clearJob.mutate(job.id);
|
||||
//only one toast for all jobs
|
||||
if (job.id === group.id)
|
||||
toast.success('Job has been removed');
|
||||
});
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* Resume */}
|
||||
{(group.status === 'Queued' || group.status === 'Paused' || isJobPaused) && (
|
||||
<Button variant="outline" size="sm" onPress={() => resumeJob.mutate(group.id)}>
|
||||
<Play size={18} color="white" />
|
||||
<Button style={tw`h-7 w-7`} variant="outline" size="sm" onPress={() => resumeJob.mutate(group.id)}>
|
||||
<Play size={16} color="white" />
|
||||
</Button>
|
||||
)}
|
||||
{/* TODO: This should remove the job from panel */}
|
||||
{!activeJob !== undefined ? (
|
||||
<Button variant="outline" size="sm">
|
||||
<Menu
|
||||
containerStyle={tw`max-w-25`}
|
||||
trigger={
|
||||
<View style={tw`flex h-7 w-7 flex-row items-center justify-center rounded-md border border-app-inputborder`}>
|
||||
<DotsThreeVertical size={16} color="white" />
|
||||
</Button>
|
||||
</View>
|
||||
}
|
||||
>
|
||||
<MenuItem
|
||||
style={twStyle(showChildJobs ? 'rounded bg-app-screen/50' : 'bg-transparent')}
|
||||
onSelect={() => setShowChildJobs(!showChildJobs)}
|
||||
text="Expand" icon={Eye}/>
|
||||
<MenuItem onSelect={clearJobHandler} text='Remove' icon={Trash}/>
|
||||
</Menu>
|
||||
) : (
|
||||
<View style={tw`flex flex-row gap-2`}>
|
||||
<Button variant="outline" size="sm" onPress={() => pauseJob.mutate(group.id)}>
|
||||
<Button style={tw`h-7 w-7`} variant="outline" size="sm" onPress={() => pauseJob.mutate(group.id)}>
|
||||
<Pause size={16} color="white" />
|
||||
</Button>
|
||||
<Button variant="outline" size="sm" onPress={() => cancelJob.mutate(group.id)}>
|
||||
<Button style={tw`h-7 w-7`} variant="outline" size="sm" onPress={() => cancelJob.mutate(group.id)}>
|
||||
<Stop size={16} color="white" />
|
||||
</Button>
|
||||
</View>
|
||||
|
|
|
@ -7,14 +7,14 @@ import { Icon, IconName } from '../icons/Icon';
|
|||
|
||||
interface Props {
|
||||
description: string; //description of empty state
|
||||
icon: IconName; //Spacedrive icon
|
||||
icon?: IconName; //Spacedrive icon
|
||||
style?: ClassInput; //Tailwind classes
|
||||
iconSize?: number; //Size of the icon
|
||||
textSize?: ClassInput; //Size of the text
|
||||
textStyle?: ClassInput; //Size of the text
|
||||
includeHeaderHeight?: boolean; //Height of the header
|
||||
}
|
||||
|
||||
const Empty = ({ description, icon, style, includeHeaderHeight = false, textSize = 'text-sm', iconSize = 38 }: Props) => {
|
||||
const Empty = ({ description, icon, style, includeHeaderHeight = false, textStyle, iconSize = 38 }: Props) => {
|
||||
const headerHeight = useSafeAreaInsets().top;
|
||||
return (
|
||||
<View
|
||||
|
@ -25,8 +25,8 @@ const Empty = ({ description, icon, style, includeHeaderHeight = false, textSize
|
|||
style
|
||||
)}
|
||||
>
|
||||
<Icon name={icon} size={iconSize} />
|
||||
<Text style={twStyle(`mt-2 text-center font-medium text-ink-dull`, textSize)}>
|
||||
{icon && <Icon name={icon} size={iconSize} />}
|
||||
<Text style={twStyle(`mt-2 text-center text-sm font-medium text-ink-dull`, textStyle)}>
|
||||
{description}
|
||||
</Text>
|
||||
</View>
|
||||
|
|
|
@ -6,10 +6,10 @@ import {
|
|||
BottomSheetHandleProps,
|
||||
BottomSheetModal,
|
||||
BottomSheetModalProps,
|
||||
BottomSheetScrollView
|
||||
BottomSheetScrollView,
|
||||
} from '@gorhom/bottom-sheet';
|
||||
import { X } from 'phosphor-react-native';
|
||||
import { forwardRef, ReactNode } from 'react';
|
||||
import { ReactNode, forwardRef } from 'react';
|
||||
import { Platform, Pressable, Text, View } from 'react-native';
|
||||
import useForwardedRef from '~/hooks/useForwardedRef';
|
||||
import { tw, twStyle } from '~/lib/tailwind';
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { Location, arraysEqual, humanizeSize, useOnlineLocations } from '@sd/client';
|
||||
import { DotsThreeOutlineVertical } from 'phosphor-react-native';
|
||||
import { Pressable, Text, View } from 'react-native';
|
||||
import { arraysEqual, humanizeSize, Location, useOnlineLocations } from '@sd/client';
|
||||
import { tw, twStyle } from '~/lib/tailwind';
|
||||
|
||||
import FolderIcon from '../icons/FolderIcon';
|
||||
|
@ -16,11 +16,11 @@ const GridLocation: React.FC<GridLocationProps> = ({ location, modalRef }: GridL
|
|||
const onlineLocations = useOnlineLocations();
|
||||
const online = onlineLocations.some((l) => arraysEqual(location.pub_id, l));
|
||||
return (
|
||||
<Card style={'h-auto flex-col justify-center gap-3'}>
|
||||
<Card style={'h-auto flex-col items-start justify-center gap-3'}>
|
||||
<View style={tw`w-full flex-col justify-between gap-1`}>
|
||||
<View style={tw`flex-row items-center justify-between`}>
|
||||
<View style={tw`relative`}>
|
||||
<FolderIcon size={42} />
|
||||
<FolderIcon size={36} />
|
||||
<View
|
||||
style={twStyle(
|
||||
'z-5 absolute bottom-[6px] right-[2px] h-2 w-2 rounded-full',
|
||||
|
@ -46,9 +46,11 @@ const GridLocation: React.FC<GridLocationProps> = ({ location, modalRef }: GridL
|
|||
{location.path}
|
||||
</Text>
|
||||
</View>
|
||||
<Text style={tw`text-left text-[13px] font-bold text-ink-dull`} numberOfLines={1}>
|
||||
<View style={tw`rounded-md border border-app-box/70 bg-app/70 px-1 py-0.5`}>
|
||||
<Text style={tw`text-xs font-bold text-ink-dull`} numberOfLines={1}>
|
||||
{`${humanizeSize(location.size_in_bytes)}`}
|
||||
</Text>
|
||||
</View>
|
||||
</Card>
|
||||
);
|
||||
};
|
||||
|
|
|
@ -61,10 +61,10 @@ const ListLocation = ({ location }: ListLocationProps) => {
|
|||
</Text>
|
||||
</View>
|
||||
</View>
|
||||
<View style={tw`flex-row items-center gap-3`}>
|
||||
<View style={tw`rounded-md border border-app-box bg-app p-1.5`}>
|
||||
<View style={tw`flex-row items-center gap-1.5`}>
|
||||
<View style={tw`rounded-md border border-app-box/70 bg-app/70 px-1.5 py-1`}>
|
||||
<Text
|
||||
style={tw`text-left text-xs font-medium text-ink-dull`}
|
||||
style={tw`text-xs font-bold text-ink-dull`}
|
||||
numberOfLines={1}
|
||||
>
|
||||
{`${humanizeSize(location.size_in_bytes)}`}
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
import { Location } from '@sd/client';
|
||||
import { useRef } from 'react';
|
||||
import { Pressable } from 'react-native';
|
||||
import { Location } from '@sd/client';
|
||||
import { twStyle } from '~/lib/tailwind';
|
||||
|
||||
import { ClassInput } from 'twrnc';
|
||||
import { ModalRef } from '../layout/Modal';
|
||||
import { LocationModal } from '../modal/location/LocationModal';
|
||||
import GridLocation from './GridLocation';
|
||||
|
@ -13,19 +14,21 @@ type LocationItemProps = {
|
|||
onPress: () => void;
|
||||
viewStyle?: 'grid' | 'list';
|
||||
editLocation: () => void;
|
||||
style?: ClassInput;
|
||||
};
|
||||
|
||||
export const LocationItem = ({
|
||||
location,
|
||||
onPress,
|
||||
editLocation,
|
||||
viewStyle = 'grid'
|
||||
viewStyle = 'grid',
|
||||
style
|
||||
}: LocationItemProps) => {
|
||||
const modalRef = useRef<ModalRef>(null);
|
||||
return (
|
||||
<>
|
||||
<Pressable
|
||||
style={twStyle(viewStyle === 'grid' ? `w-[31.5%]` : `flex-1`)}
|
||||
style={twStyle(viewStyle === 'grid' ? `m-1 w-[112px]` : `flex-1`, style)}
|
||||
onPress={onPress}
|
||||
>
|
||||
{viewStyle === 'grid' ? (
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { Tag, getItemObject, useLibraryMutation, useLibraryQuery, useRspcContext } from "@sd/client";
|
||||
import { Tag, getItemObject, useLibraryMutation, useLibraryQuery, useRspcLibraryContext } from "@sd/client";
|
||||
import { CaretLeft, Plus } from "phosphor-react-native";
|
||||
import { forwardRef, useCallback, useEffect, useMemo, useRef, useState } from "react";
|
||||
import { FlatList, NativeScrollEvent, Pressable, Text, View } from "react-native";
|
||||
|
@ -24,7 +24,7 @@ const AddTagModal = forwardRef<ModalRef, unknown>((_, ref) => {
|
|||
const [startedScrolling, setStartedScrolling] = useState(false);
|
||||
const [reachedBottom, setReachedBottom] = useState(true); // needs to be set to true for initial rendering fade to be correct
|
||||
|
||||
const rspc = useRspcContext();
|
||||
const rspc = useRspcLibraryContext();
|
||||
const tagsQuery = useLibraryQuery(['tags.list']);
|
||||
const tagsObjectQuery = useLibraryQuery(['tags.getForObject', objectData?.id ?? -1]);
|
||||
const mutation = useLibraryMutation(['tags.assign'], {
|
||||
|
|
|
@ -1,14 +1,15 @@
|
|||
import * as RNFS from '@dr.pogodin/react-native-fs';
|
||||
import { useLibraryMutation, useRspcLibraryContext } from '@sd/client';
|
||||
import { forwardRef, useCallback } from 'react';
|
||||
import { Alert, Platform, Text, View } from 'react-native';
|
||||
import DocumentPicker from 'react-native-document-picker';
|
||||
import { useLibraryMutation, useRspcLibraryContext } from '@sd/client';
|
||||
import { Modal, ModalRef } from '~/components/layout/Modal';
|
||||
import { Button } from '~/components/primitive/Button';
|
||||
import useForwardedRef from '~/hooks/useForwardedRef';
|
||||
import { tw } from '~/lib/tailwind';
|
||||
|
||||
import { Icon } from '../icons/Icon';
|
||||
import { toast } from '../primitive/Toast';
|
||||
|
||||
// import * as ML from 'expo-media-library';
|
||||
|
||||
|
@ -22,17 +23,29 @@ const ImportModal = forwardRef<ModalRef, unknown>((_, ref) => {
|
|||
|
||||
const createLocation = useLibraryMutation('locations.create', {
|
||||
onError: (error, variables) => {
|
||||
modalRef.current?.close();
|
||||
//custom message handling
|
||||
if (error.message.startsWith("location already exists")) {
|
||||
return toast.error('This location has already been added');
|
||||
} else if (error.message.startsWith("nested location currently")) {
|
||||
return toast.error('Nested locations are currently not supported');
|
||||
}
|
||||
switch (error.message) {
|
||||
case 'NEED_RELINK':
|
||||
if (!variables.dry_run) relinkLocation.mutate(variables.path);
|
||||
toast.info('Please relink the location');
|
||||
break;
|
||||
case 'ADD_LIBRARY':
|
||||
addLocationToLibrary.mutate(variables);
|
||||
break;
|
||||
default:
|
||||
toast.error(error.message);
|
||||
throw new Error('Unimplemented custom remote error handling');
|
||||
}
|
||||
},
|
||||
onSuccess: () => {
|
||||
toast.success('Location added successfully');
|
||||
},
|
||||
onSettled: () => {
|
||||
rspc.queryClient.invalidateQueries(['locations.list']);
|
||||
modalRef.current?.close();
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import { useRef } from 'react';
|
||||
import { useLibraryMutation, usePlausibleEvent, useRspcLibraryContext } from '@sd/client';
|
||||
import { useRef } from 'react';
|
||||
import { ConfirmModal, ModalRef } from '~/components/layout/Modal';
|
||||
import { toast } from '~/components/primitive/Toast';
|
||||
|
||||
type Props = {
|
||||
locationId: number;
|
||||
|
@ -20,6 +21,10 @@ const DeleteLocationModal = ({ trigger, onSubmit, locationId, triggerStyle }: Pr
|
|||
onSuccess: () => {
|
||||
submitPlausibleEvent({ event: { type: 'locationDelete' } });
|
||||
onSubmit?.();
|
||||
toast.success('Location deleted successfully');
|
||||
},
|
||||
onError: (error) => {
|
||||
toast.error(error.message);
|
||||
},
|
||||
onSettled: () => {
|
||||
modalRef.current?.close();
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import { useRef } from 'react';
|
||||
import { useLibraryMutation, usePlausibleEvent, useRspcLibraryContext } from '@sd/client';
|
||||
import { useRef } from 'react';
|
||||
import { ConfirmModal, ModalRef } from '~/components/layout/Modal';
|
||||
import { toast } from '~/components/primitive/Toast';
|
||||
|
||||
type Props = {
|
||||
tagId: number;
|
||||
|
@ -19,6 +20,7 @@ const DeleteTagModal = ({ trigger, onSubmit, tagId, triggerStyle }: Props) => {
|
|||
submitPlausibleEvent({ event: { type: 'tagDelete' } });
|
||||
onSubmit?.();
|
||||
rspc.queryClient.invalidateQueries(['tags.list']);
|
||||
toast.success('Tag deleted successfully');
|
||||
},
|
||||
onSettled: () => {
|
||||
modalRef.current?.close();
|
||||
|
|
|
@ -3,7 +3,8 @@ import {
|
|||
getItemObject,
|
||||
humanizeSize,
|
||||
useLibraryMutation,
|
||||
useLibraryQuery
|
||||
useLibraryQuery,
|
||||
useRspcContext
|
||||
} from '@sd/client';
|
||||
import dayjs from 'dayjs';
|
||||
import {
|
||||
|
@ -28,6 +29,7 @@ import { tw, twStyle } from '~/lib/tailwind';
|
|||
import { useActionsModalStore } from '~/stores/modalStore';
|
||||
|
||||
import FileInfoModal from './FileInfoModal';
|
||||
import RenameModal from './RenameModal';
|
||||
|
||||
type ActionsContainerProps = PropsWithChildren<{
|
||||
style?: ViewStyle;
|
||||
|
@ -65,8 +67,10 @@ const ActionDivider = () => <View style={tw`my-3.5 h-[0.5px] bg-app-box`} />;
|
|||
|
||||
export const ActionsModal = () => {
|
||||
const fileInfoRef = useRef<ModalRef>(null);
|
||||
const renameRef = useRef<ModalRef>(null);
|
||||
|
||||
const { modalRef, data } = useActionsModalStore();
|
||||
const rspc = useRspcContext();
|
||||
|
||||
const objectData = data && getItemObject(data);
|
||||
const filePath = data && getIndexedItemFilePath(data);
|
||||
|
@ -77,6 +81,13 @@ export const ActionsModal = () => {
|
|||
enabled: filePath != null
|
||||
});
|
||||
|
||||
const deleteFile = useLibraryMutation('files.deleteFiles', {
|
||||
onSuccess: () => {
|
||||
rspc.queryClient.invalidateQueries(['search.paths'])
|
||||
modalRef.current?.dismiss();
|
||||
}
|
||||
});
|
||||
|
||||
async function handleOpen() {
|
||||
const absolutePath = queriedFullPath.data;
|
||||
if (!absolutePath) return;
|
||||
|
@ -141,7 +152,9 @@ export const ActionsModal = () => {
|
|||
/>
|
||||
</ActionsContainer>
|
||||
<ActionsContainer style={tw`mt-2`}>
|
||||
<ActionsItem icon={Pencil} title="Rename" />
|
||||
<ActionsItem onPress={() => {
|
||||
renameRef.current?.present();
|
||||
}} icon={Pencil} title="Rename" />
|
||||
<ActionDivider />
|
||||
<ActionsItem icon={Copy} title="Duplicate" />
|
||||
<ActionDivider />
|
||||
|
@ -154,11 +167,19 @@ export const ActionsModal = () => {
|
|||
<ActionDivider />
|
||||
<ActionsItem icon={Package} title="Compress" />
|
||||
<ActionDivider />
|
||||
<ActionsItem icon={TrashSimple} title="Delete" isDanger />
|
||||
<ActionsItem icon={TrashSimple} title="Delete" isDanger onPress={async () => {
|
||||
if (filePath && filePath.location_id) {
|
||||
await deleteFile.mutateAsync({
|
||||
location_id: filePath.location_id,
|
||||
file_path_ids: [filePath.id]
|
||||
});
|
||||
}
|
||||
}} />
|
||||
</ActionsContainer>
|
||||
</View>
|
||||
)}
|
||||
</Modal>
|
||||
<RenameModal objectName={filePath?.name ?? ''} ref={renameRef} />
|
||||
<FileInfoModal ref={fileInfoRef} data={data} />
|
||||
</>
|
||||
);
|
||||
|
|
90
apps/mobile/src/components/modal/inspector/RenameModal.tsx
Normal file
90
apps/mobile/src/components/modal/inspector/RenameModal.tsx
Normal file
|
@ -0,0 +1,90 @@
|
|||
import { getIndexedItemFilePath, useLibraryMutation, useRspcLibraryContext } from '@sd/client';
|
||||
import React, { forwardRef, useEffect, useRef, useState } from 'react';
|
||||
import { Text, View } from 'react-native';
|
||||
import { TextInput } from 'react-native-gesture-handler';
|
||||
import { Modal, ModalRef } from '~/components/layout/Modal';
|
||||
import { Button } from '~/components/primitive/Button';
|
||||
import { ModalInput } from '~/components/primitive/Input';
|
||||
import { toast } from '~/components/primitive/Toast';
|
||||
import useForwardedRef from '~/hooks/useForwardedRef';
|
||||
import { tw } from '~/lib/tailwind';
|
||||
import { useActionsModalStore } from '~/stores/modalStore';
|
||||
|
||||
interface Props {
|
||||
objectName: string;
|
||||
}
|
||||
|
||||
const RenameModal = forwardRef<ModalRef, Props>((props, ref) => {
|
||||
const modalRef = useForwardedRef(ref);
|
||||
const [newName, setNewName] = useState('');
|
||||
const rspc = useRspcLibraryContext();
|
||||
const { data } = useActionsModalStore();
|
||||
const inputRef = useRef<TextInput>(null);
|
||||
|
||||
const filePathData = data && getIndexedItemFilePath(data);
|
||||
|
||||
const renameFile = useLibraryMutation(['files.renameFile'], {
|
||||
onSuccess: () => {
|
||||
modalRef.current?.dismiss();
|
||||
rspc.queryClient.invalidateQueries(['search.paths']);
|
||||
},
|
||||
onError: () => {
|
||||
toast.error('Failed to rename object');
|
||||
}
|
||||
});
|
||||
|
||||
// set input value to object name on initial render
|
||||
useEffect(() => {
|
||||
setNewName(props.objectName);
|
||||
}, [props.objectName]);
|
||||
|
||||
const textRenameHandler = async () => {
|
||||
switch (data?.type) {
|
||||
case 'Path':
|
||||
case 'Object': {
|
||||
if (!filePathData) throw new Error('Failed to get file path object');
|
||||
|
||||
const { id, location_id } = filePathData;
|
||||
|
||||
if (!location_id) throw new Error('Missing location id');
|
||||
|
||||
await renameFile.mutateAsync({
|
||||
location_id: location_id,
|
||||
kind: {
|
||||
One: {
|
||||
from_file_path_id: id,
|
||||
to: newName
|
||||
}
|
||||
}
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<Modal
|
||||
ref={modalRef}
|
||||
title="Rename"
|
||||
onDismiss={() => setNewName(props.objectName)}
|
||||
enableContentPanningGesture={false}
|
||||
enablePanDownToClose={false}
|
||||
snapPoints={['20']}
|
||||
>
|
||||
<View style={tw`mt-2 flex-col gap-2 px-6`}>
|
||||
<ModalInput
|
||||
ref={inputRef}
|
||||
autoFocus
|
||||
onFocus={() => inputRef.current?.setSelection(0, newName.length)}
|
||||
value={newName}
|
||||
onChangeText={(t) => setNewName(t)}
|
||||
/>
|
||||
<Button disabled={newName.length === 0 || props.objectName === newName} onPress={textRenameHandler} variant="accent">
|
||||
<Text style={tw`font-medium text-ink`}>Save</Text>
|
||||
</Button>
|
||||
</View>
|
||||
</Modal>
|
||||
);
|
||||
});
|
||||
|
||||
export default RenameModal;
|
|
@ -1,40 +1,51 @@
|
|||
import { forwardRef } from 'react';
|
||||
import { FlatList, Text, View } from 'react-native';
|
||||
import { BottomSheetFlatList } from '@gorhom/bottom-sheet';
|
||||
import { useJobProgress, useLibraryQuery } from '@sd/client';
|
||||
import { forwardRef, useEffect } from 'react';
|
||||
import JobGroup from '~/components/job/JobGroup';
|
||||
import Empty from '~/components/layout/Empty';
|
||||
import { Modal, ModalRef } from '~/components/layout/Modal';
|
||||
import useForwardedRef from '~/hooks/useForwardedRef';
|
||||
import { tw } from '~/lib/tailwind';
|
||||
|
||||
// TODO:
|
||||
// - When there is no job, make modal height smaller
|
||||
// - Add clear all jobs button
|
||||
//TODO: Handle data fetching better when modal is opened
|
||||
|
||||
export const JobManagerModal = forwardRef<ModalRef, unknown>((_, ref) => {
|
||||
// const queryClient = useQueryClient();
|
||||
|
||||
// const rspc = useRspcLibraryContext();
|
||||
const jobGroups = useLibraryQuery(['jobs.reports']);
|
||||
const progress = useJobProgress(jobGroups.data);
|
||||
const modalRef = useForwardedRef(ref);
|
||||
|
||||
//TODO: Add clear all jobs button
|
||||
// const clearAllJobs = useLibraryMutation(['jobs.clearAll'], {
|
||||
// onError: () => {
|
||||
// // TODO: Show error toast
|
||||
// toast.error('Failed to clear all jobs.');
|
||||
// },
|
||||
// onSuccess: () => {
|
||||
// queryClient.invalidateQueries(['jobs.reports ']);
|
||||
// }
|
||||
// });
|
||||
|
||||
useEffect(() => {
|
||||
if (jobGroups.data?.length === 0) {
|
||||
modalRef.current?.snapToPosition('20');
|
||||
}
|
||||
}, [jobGroups, modalRef]);
|
||||
|
||||
return (
|
||||
<Modal ref={ref} snapPoints={['60']} title="Recent Jobs" showCloseButton>
|
||||
<FlatList
|
||||
<Modal
|
||||
ref={modalRef}
|
||||
snapPoints={['60']}
|
||||
title="Recent Jobs"
|
||||
showCloseButton
|
||||
>
|
||||
<BottomSheetFlatList
|
||||
data={jobGroups.data}
|
||||
style={tw`flex-1`}
|
||||
keyExtractor={(i) => i.id}
|
||||
contentContainerStyle={tw`mt-4`}
|
||||
renderItem={({ item }) => <JobGroup group={item} progress={progress} />}
|
||||
ListEmptyComponent={
|
||||
<View style={tw`flex h-60 items-center justify-center`}>
|
||||
<Text style={tw`text-center text-base text-ink-dull`}>No jobs.</Text>
|
||||
</View>
|
||||
<Empty style="border-0" description='No jobs.'/>
|
||||
}
|
||||
/>
|
||||
</Modal>
|
||||
|
|
|
@ -1,16 +1,17 @@
|
|||
import { forwardRef, useEffect, useState } from 'react';
|
||||
import { Pressable, Text, View } from 'react-native';
|
||||
import ColorPicker from 'react-native-wheel-color-picker';
|
||||
import {
|
||||
ToastDefautlColor,
|
||||
useLibraryMutation,
|
||||
usePlausibleEvent,
|
||||
useRspcLibraryContext
|
||||
} from '@sd/client';
|
||||
import { forwardRef, useEffect, useState } from 'react';
|
||||
import { Pressable, Text, View } from 'react-native';
|
||||
import ColorPicker from 'react-native-wheel-color-picker';
|
||||
import { FadeInAnimation } from '~/components/animation/layout';
|
||||
import { Modal, ModalRef } from '~/components/layout/Modal';
|
||||
import { Button } from '~/components/primitive/Button';
|
||||
import { ModalInput } from '~/components/primitive/Input';
|
||||
import { toast } from '~/components/primitive/Toast';
|
||||
import useForwardedRef from '~/hooks/useForwardedRef';
|
||||
import { useKeyboard } from '~/hooks/useKeyboard';
|
||||
import { tw, twStyle } from '~/lib/tailwind';
|
||||
|
@ -36,8 +37,12 @@ const CreateTagModal = forwardRef<ModalRef, unknown>((_, ref) => {
|
|||
|
||||
rspc.queryClient.invalidateQueries(['tags.list']);
|
||||
|
||||
toast.success('Tag created successfully');
|
||||
submitPlausibleEvent({ event: { type: 'tagCreate' } });
|
||||
},
|
||||
onError: (error) => {
|
||||
toast.error(error.message);
|
||||
},
|
||||
onSettled: () => {
|
||||
// Close modal
|
||||
modalRef.current?.dismiss();
|
||||
|
@ -57,7 +62,7 @@ const CreateTagModal = forwardRef<ModalRef, unknown>((_, ref) => {
|
|||
return (
|
||||
<Modal
|
||||
ref={modalRef}
|
||||
snapPoints={['25']}
|
||||
snapPoints={['22']}
|
||||
title="Create Tag"
|
||||
onDismiss={() => {
|
||||
// Resets form onDismiss
|
||||
|
@ -94,7 +99,7 @@ const CreateTagModal = forwardRef<ModalRef, unknown>((_, ref) => {
|
|||
<Button
|
||||
variant="accent"
|
||||
onPress={() => createTag({ color: tagColor, name: tagName })}
|
||||
style={tw`mt-6`}
|
||||
style={tw`mt-2`}
|
||||
disabled={tagName.length === 0}
|
||||
>
|
||||
<Text style={tw`text-sm font-medium text-white`}>Create</Text>
|
||||
|
|
|
@ -14,17 +14,17 @@ export default function CategoriesScreen() {
|
|||
const kinds = useLibraryQuery(['library.kindStatistics']);
|
||||
const navigation = useNavigation<OverviewStackScreenProps<'Overview'>['navigation']>();
|
||||
return (
|
||||
<View style={tw`px-6`}>
|
||||
<View style={tw`px-5`}>
|
||||
<View style={tw`flex-row items-center justify-between pb-5`}>
|
||||
<Text style={tw`text-lg font-bold text-white`}>Categories</Text>
|
||||
<Button
|
||||
onPress={() => {
|
||||
navigation.navigate('Categories');
|
||||
}}
|
||||
style={tw`h-9 w-9 rounded-full`}
|
||||
style={tw`h-8 w-8 rounded-full`}
|
||||
variant="gray"
|
||||
>
|
||||
<DotsThree weight='bold' size={20} color={'white'} />
|
||||
<DotsThree weight='bold' size={18} color={'white'} />
|
||||
</Button>
|
||||
</View>
|
||||
<View style={tw`flex-row flex-wrap gap-2`}>
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
import { useNavigation } from '@react-navigation/native';
|
||||
import { useLibraryQuery } from '@sd/client';
|
||||
import React, { useRef } from 'react';
|
||||
import { Pressable, Text, View } from 'react-native';
|
||||
import { FlatList } from 'react-native-gesture-handler';
|
||||
import { useLibraryQuery } from '@sd/client';
|
||||
import { tw, twStyle } from '~/lib/tailwind';
|
||||
import { OverviewStackScreenProps } from '~/navigation/tabs/OverviewStack';
|
||||
|
||||
|
@ -25,10 +25,11 @@ const Locations = () => {
|
|||
<>
|
||||
<OverviewSection title="Locations" count={locations?.length}>
|
||||
<View style={tw`flex-row items-center`}>
|
||||
<Fade height={'100%'} width={30} color="black">
|
||||
<FlatList
|
||||
horizontal
|
||||
data={locations}
|
||||
contentContainerStyle={tw`px-7`}
|
||||
contentContainerStyle={tw`px-6`}
|
||||
showsHorizontalScrollIndicator={false}
|
||||
keyExtractor={(location) => location.id.toString()}
|
||||
ItemSeparatorComponent={() => <View style={tw`w-2`} />}
|
||||
|
@ -73,6 +74,7 @@ const Locations = () => {
|
|||
</Pressable>
|
||||
)}
|
||||
/>
|
||||
</Fade>
|
||||
</View>
|
||||
</OverviewSection>
|
||||
<ImportModal ref={modalRef} />
|
||||
|
|
|
@ -37,7 +37,7 @@ const StatItem = ({ title, bytes, isLoading, style }: StatItemProps) => {
|
|||
hidden: isLoading
|
||||
})}
|
||||
>
|
||||
<Text style={tw`text-sm font-bold text-zinc-400`}>{title}</Text>
|
||||
<Text style={tw`text-xs font-bold text-zinc-400`}>{title}</Text>
|
||||
<View style={tw`mt-1 flex-row items-baseline`}>
|
||||
<Text style={twStyle('text-xl font-bold tabular-nums text-white')}>{count}</Text>
|
||||
<Text style={tw`ml-1 text-sm text-zinc-400`}>{unit}</Text>
|
||||
|
@ -104,7 +104,7 @@ const OverviewStats = ({ stats }: Props) => {
|
|||
};
|
||||
|
||||
return (
|
||||
<View style={tw`px-6`}>
|
||||
<View style={tw`px-5`}>
|
||||
<Text style={tw`pb-3 text-lg font-bold text-white`}>Statistics</Text>
|
||||
<View style={tw`flex-row gap-2`}>
|
||||
<View style={tw`h-full flex-1 flex-col gap-2`}>
|
||||
|
|
|
@ -8,11 +8,11 @@ const button = cva(['items-center justify-center rounded-md border shadow-sm'],
|
|||
variants: {
|
||||
variant: {
|
||||
danger: ['border-red-800 bg-red-600 shadow-none'],
|
||||
gray: ['border-app-lightborder bg-app-button shadow-none'],
|
||||
gray: ['border-app-box bg-app shadow-none'],
|
||||
darkgray: ['border-app-box bg-app shadow-none'],
|
||||
accent: ['border-accent-deep bg-accent shadow-md shadow-app-shade/10'],
|
||||
outline: ['border-sidebar-line/60 bg-black shadow-none'],
|
||||
transparent: ['border-0 bg-black shadow-none'],
|
||||
outline: ['border border-app-inputborder bg-transparent shadow-none'],
|
||||
transparent: ['border-0 bg-transparent shadow-none'],
|
||||
dashed: ['border border-dashed border-app-line bg-transparent shadow-none']
|
||||
},
|
||||
size: {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { BottomSheetTextInput } from '@gorhom/bottom-sheet';
|
||||
import { cva, VariantProps } from 'class-variance-authority';
|
||||
import { Eye, EyeSlash } from 'phosphor-react-native';
|
||||
import { useState } from 'react';
|
||||
import { forwardRef, useState } from 'react';
|
||||
import { Pressable, TextInputProps as RNTextInputProps, TextInput, View } from 'react-native';
|
||||
import { tw, twStyle } from '~/lib/tailwind';
|
||||
|
||||
|
@ -23,28 +23,32 @@ const input = cva(['rounded-md border text-sm leading-tight shadow-sm'], {
|
|||
|
||||
type InputProps = VariantProps<typeof input> & RNTextInputProps;
|
||||
|
||||
export const Input = ({ variant, size, ...props }: InputProps) => {
|
||||
const { style, ...otherProps } = props;
|
||||
export const Input = forwardRef<TextInput, InputProps>((props, ref) => {
|
||||
const { style, variant, size, ...otherProps } = props;
|
||||
return (
|
||||
<TextInput
|
||||
ref={ref}
|
||||
selectionColor={tw.color('accent')}
|
||||
placeholderTextColor={tw.color('ink-faint')}
|
||||
style={twStyle(input({ variant, size }), style as string)}
|
||||
{...otherProps}
|
||||
/>
|
||||
);
|
||||
};
|
||||
})
|
||||
|
||||
// To use in modals (for keyboard handling)
|
||||
export const ModalInput = ({ variant, size, ...props }: InputProps) => {
|
||||
const { style, ...otherProps } = props;
|
||||
export const ModalInput = forwardRef<any, InputProps>((props, ref) => {
|
||||
const { style, variant, size, ...otherProps } = props;
|
||||
return (
|
||||
<BottomSheetTextInput
|
||||
ref={ref}
|
||||
selectionColor={tw.color('accent')}
|
||||
placeholderTextColor={tw.color('ink-faint')}
|
||||
style={twStyle(input({ variant, size }), style as string)}
|
||||
{...otherProps}
|
||||
/>
|
||||
);
|
||||
};
|
||||
})
|
||||
|
||||
// Same as Input but configured with password props & show/hide password button
|
||||
|
||||
|
|
|
@ -14,13 +14,14 @@ type MenuProps = {
|
|||
trigger: React.ReactNode;
|
||||
children: React.ReactNode[] | React.ReactNode;
|
||||
triggerStyle?: ClassInput;
|
||||
containerStyle?: ClassInput;
|
||||
};
|
||||
|
||||
// TODO: Still looks a bit off...
|
||||
export const Menu = (props: MenuProps) => (
|
||||
<PMenu style={twStyle(props.triggerStyle)}>
|
||||
<MenuTrigger>{props.trigger}</MenuTrigger>
|
||||
<MenuOptions optionsContainerStyle={tw`rounded-md border border-app-cardborder bg-app-menu p-1`}>
|
||||
<MenuOptions optionsContainerStyle={twStyle(`rounded-md border border-app-cardborder bg-app-menu p-1`, props.containerStyle)}>
|
||||
{props.children}
|
||||
</MenuOptions>
|
||||
</PMenu>
|
||||
|
@ -28,24 +29,25 @@ export const Menu = (props: MenuProps) => (
|
|||
|
||||
type MenuItemProps = {
|
||||
icon?: Icon;
|
||||
textStyle?: ClassInput;
|
||||
iconStyle?: ClassInput;
|
||||
style?: ClassInput;
|
||||
} & MenuOptionProps;
|
||||
|
||||
export const MenuItem = ({ icon, ...props }: MenuItemProps) => {
|
||||
export const MenuItem = ({ icon, textStyle, iconStyle, style, ...props }: MenuItemProps) => {
|
||||
const Icon = icon;
|
||||
|
||||
return (
|
||||
<View style={tw`flex flex-1 flex-row items-center`}>
|
||||
<View style={twStyle(`flex-1 flex-row items-center px-2 py-1`, style)}>
|
||||
{Icon && (
|
||||
<View style={tw`ml-1`}>
|
||||
<Icon size={16} style={tw`text-ink`} />
|
||||
</View>
|
||||
<Icon size={14} style={twStyle(`text-ink-dull`, iconStyle)} />
|
||||
)}
|
||||
<MenuOption
|
||||
{...props}
|
||||
customStyles={{
|
||||
optionText: tw`w-full py-1 text-sm font-medium text-ink`
|
||||
optionText: twStyle(`text-sm font-medium text-ink-dull`, textStyle)
|
||||
}}
|
||||
style={tw`flex flex-row items-center`}
|
||||
style={tw`flex flex-row`}
|
||||
/>
|
||||
</View>
|
||||
);
|
||||
|
|
|
@ -1,30 +1,41 @@
|
|||
/* eslint-disable no-restricted-imports */
|
||||
import { CheckCircle, Info, WarningCircle } from 'phosphor-react-native';
|
||||
import { Text, View } from 'react-native';
|
||||
import Toast, { ToastConfig } from 'react-native-toast-message';
|
||||
import { tw } from '~/lib/tailwind';
|
||||
|
||||
const baseStyles = 'w-[340px] flex-row overflow-hidden rounded-md border p-3 shadow-lg';
|
||||
const baseStyles = 'max-w-[340px] flex-row gap-1 items-center justify-center overflow-hidden rounded-md border p-3 shadow-lg bg-app-input border-app-inputborder';
|
||||
const containerStyle = 'flex-row items-start gap-1.5'
|
||||
|
||||
const toastConfig: ToastConfig = {
|
||||
success: ({ text1, ...rest }) => (
|
||||
<View style={tw.style(baseStyles, 'border-app-line bg-app-darkBox/90 ')}>
|
||||
<Text style={tw`text-sm font-medium text-ink`} numberOfLines={3}>
|
||||
<View style={tw.style(baseStyles)}>
|
||||
<View style={tw.style(containerStyle)}>
|
||||
<CheckCircle size={20} weight="fill" color={tw.color("text-green-500")} />
|
||||
<Text style={tw`self-center text-left text-sm font-medium text-ink`} numberOfLines={3}>
|
||||
{text1}
|
||||
</Text>
|
||||
</View>
|
||||
</View>
|
||||
),
|
||||
error: ({ text1, ...rest }) => (
|
||||
<View style={tw.style(baseStyles, 'border-red-500 bg-red-500/90')}>
|
||||
<Text style={tw`text-sm font-medium text-ink`} numberOfLines={3}>
|
||||
<View style={tw.style(baseStyles)}>
|
||||
<View style={tw.style(containerStyle)}>
|
||||
<WarningCircle size={20} weight="fill" color={tw.color("text-red-500")} />
|
||||
<Text style={tw`self-center text-left text-sm font-medium text-ink`} numberOfLines={3}>
|
||||
{text1}
|
||||
</Text>
|
||||
</View>
|
||||
</View>
|
||||
),
|
||||
info: ({ text1, ...rest }) => (
|
||||
<View style={tw.style(baseStyles, 'border-app-line bg-app-darkBox/90')}>
|
||||
<Text style={tw`text-sm font-medium text-ink`} numberOfLines={3}>
|
||||
<View style={tw.style(baseStyles)}>
|
||||
<View style={tw.style(containerStyle)}>
|
||||
<Info size={20} weight="fill" color={tw.color("text-accent")} />
|
||||
<Text style={tw`self-center text-left text-sm font-medium text-ink`} numberOfLines={3}>
|
||||
{text1}
|
||||
</Text>
|
||||
</View>
|
||||
</View>
|
||||
)
|
||||
};
|
||||
|
|
|
@ -16,7 +16,7 @@ const GridTag = ({ tag, modalRef }: GridTagProps) => {
|
|||
<Card style={twStyle(`h-auto w-full flex-col justify-center gap-3`)}>
|
||||
<View style={tw`flex-row items-center justify-between`}>
|
||||
<View
|
||||
style={twStyle('h-[28px] w-[28px] rounded-full', {
|
||||
style={twStyle('h-5 w-5 rounded-full', {
|
||||
backgroundColor: tag.color!
|
||||
})}
|
||||
/>
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
import { Tag } from '@sd/client';
|
||||
import { useRef } from 'react';
|
||||
import { Pressable } from 'react-native';
|
||||
import { Tag } from '@sd/client';
|
||||
import { twStyle } from '~/lib/tailwind';
|
||||
|
||||
import { ClassInput } from 'twrnc';
|
||||
import { ModalRef } from '../layout/Modal';
|
||||
import { TagModal } from '../modal/tag/TagModal';
|
||||
import GridTag from './GridTag';
|
||||
|
@ -12,14 +13,15 @@ type TagItemProps = {
|
|||
tag: Tag;
|
||||
onPress: () => void;
|
||||
viewStyle?: 'grid' | 'list';
|
||||
style?: ClassInput;
|
||||
};
|
||||
|
||||
export const TagItem = ({ tag, onPress, viewStyle = 'grid' }: TagItemProps) => {
|
||||
export const TagItem = ({ tag, onPress, style, viewStyle = 'grid' }: TagItemProps) => {
|
||||
const modalRef = useRef<ModalRef>(null);
|
||||
return (
|
||||
<>
|
||||
<Pressable
|
||||
style={twStyle(viewStyle === 'grid' ? `w-[31.5%]` : `flex-1`)}
|
||||
style={twStyle(viewStyle === 'grid' ? `m-1 w-[112px]` : `flex-1`, style)}
|
||||
onPress={onPress}
|
||||
testID="browse-tag"
|
||||
>
|
||||
|
|
|
@ -79,7 +79,7 @@ module.exports = {
|
|||
// shadow
|
||||
shade: `hsla(${DARK_HUE}, 15%, 0%, ${ALPHA})`,
|
||||
// menu
|
||||
menu: `hsla(${DARK_HUE}, 25%, 5%, ${ALPHA})`
|
||||
menu: `hsla(${DARK_HUE}, 10%, 5%, ${ALPHA})`
|
||||
},
|
||||
sidebar: {
|
||||
box: `hsla(${DARK_HUE}, 15%, 16%, ${ALPHA})`,
|
||||
|
|
|
@ -17,7 +17,6 @@ export function useFiltersSearch(search: string) {
|
|||
|
||||
const locations = useLibraryQuery(['locations.list'], {
|
||||
keepPreviousData: true,
|
||||
enabled: (name || ext) ? true : false,
|
||||
});
|
||||
|
||||
const filterFactory = (key: SearchFilters, value: Filters[keyof Filters]) => {
|
||||
|
@ -60,7 +59,7 @@ export function useFiltersSearch(search: string) {
|
|||
const filters = [] as SearchFilterArgs[];
|
||||
|
||||
//It's a global search if no locations have been selected
|
||||
if (searchStore.filters.locations.length === 0 || !name || !ext) {
|
||||
if (searchStore.filters.locations.length === 0) {
|
||||
const locationIds = locations.data?.map((l) => l.id);
|
||||
if (locationIds) filters.push({ filePath: { locations: { in: locationIds } } });
|
||||
}
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
import BrowseCategories from '~/components/browse/BrowseCategories';
|
||||
import BrowseLocations from '~/components/browse/BrowseLocations';
|
||||
import BrowseTags from '~/components/browse/BrowseTags';
|
||||
import ScreenContainer from '~/components/layout/ScreenContainer';
|
||||
|
@ -6,7 +5,7 @@ import ScreenContainer from '~/components/layout/ScreenContainer';
|
|||
export default function BrowseScreen() {
|
||||
return (
|
||||
<ScreenContainer>
|
||||
<BrowseCategories />
|
||||
{/* <BrowseCategories /> */}
|
||||
<BrowseLocations />
|
||||
<BrowseTags />
|
||||
</ScreenContainer>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { useLibraryQuery, usePathsExplorerQuery } from '@sd/client';
|
||||
import { useLibraryQuery, useLibrarySubscription, usePathsExplorerQuery } from '@sd/client';
|
||||
import { useEffect, useMemo } from 'react';
|
||||
import Explorer from '~/components/explorer/Explorer';
|
||||
import Empty from '~/components/layout/Empty';
|
||||
|
@ -19,6 +19,13 @@ export default function LocationScreen({ navigation, route }: BrowseStackScreenP
|
|||
.pop();
|
||||
}, [path])
|
||||
|
||||
// makes sure that the location shows newest/modified objects
|
||||
// when a location is opened
|
||||
useLibrarySubscription(
|
||||
['locations.quickRescan', { sub_path: path ?? '', location_id: id }],
|
||||
{ onData() {} }
|
||||
);
|
||||
|
||||
const paths = usePathsExplorerQuery({
|
||||
arg: {
|
||||
filters: [
|
||||
|
@ -70,7 +77,6 @@ export default function LocationScreen({ navigation, route }: BrowseStackScreenP
|
|||
includeHeaderHeight
|
||||
icon={'FolderNoSpace'}
|
||||
style={tw`flex-1 items-center justify-center border-0`}
|
||||
textSize="text-md"
|
||||
iconSize={100}
|
||||
description={'No files found'}
|
||||
/>}
|
||||
|
|
|
@ -60,7 +60,6 @@ export default function LocationsScreen({ viewStyle }: Props) {
|
|||
<Empty
|
||||
icon="Folder"
|
||||
style={'border-0'}
|
||||
textSize="text-md"
|
||||
iconSize={84}
|
||||
description="You have not added any locations"
|
||||
/>
|
||||
|
|
|
@ -38,7 +38,6 @@ export default function TagScreen({ navigation, route }: BrowseStackScreenProps<
|
|||
includeHeaderHeight
|
||||
icon={'Tags'}
|
||||
style={tw`flex-1 items-center justify-center border-0`}
|
||||
textSize="text-md"
|
||||
iconSize={100}
|
||||
description={'No items assigned to this tag'}
|
||||
/>} {...objects} />;
|
||||
|
|
|
@ -65,7 +65,6 @@ export default function TagsScreen({ viewStyle = 'list' }: Props) {
|
|||
<Empty
|
||||
icon="Tags"
|
||||
style={'border-0'}
|
||||
textSize="text-md"
|
||||
iconSize={84}
|
||||
description="You have not created any tags"
|
||||
/>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { useIsFocused } from '@react-navigation/native';
|
||||
import { usePathsExplorerQuery } from '@sd/client';
|
||||
import { useLibraryQuery, usePathsExplorerQuery } from '@sd/client';
|
||||
import { ArrowLeft, DotsThree, FunnelSimple } from 'phosphor-react-native';
|
||||
import { Suspense, useDeferredValue, useState } from 'react';
|
||||
import { ActivityIndicator, Platform, Pressable, TextInput, View } from 'react-native';
|
||||
|
@ -23,6 +23,8 @@ const SearchScreen = ({ navigation }: SearchStackScreenProps<'Search'>) => {
|
|||
const deferredSearch = useDeferredValue(search);
|
||||
const order = useSortBy();
|
||||
|
||||
const locations = useLibraryQuery(['locations.list']).data ?? [];
|
||||
|
||||
const objects = usePathsExplorerQuery({
|
||||
order,
|
||||
arg: {
|
||||
|
@ -43,6 +45,13 @@ const SearchScreen = ({ navigation }: SearchStackScreenProps<'Search'>) => {
|
|||
const noObjects = objects.items?.length === 0 || !objects.items;
|
||||
const noSearch = deferredSearch.length === 0 && appliedFiltersLength === 0;
|
||||
|
||||
const searchIcon =
|
||||
locations.length > 0 && noObjects && noSearch ? 'FolderNoSpace' :
|
||||
noSearch && noObjects ? 'Search' : 'FolderNoSpace';
|
||||
|
||||
const searchDescription = locations.length === 0 ? 'You have not added any locations to search' : noObjects
|
||||
|| noSearch ? 'No files found' : 'No results found for this search';
|
||||
|
||||
return (
|
||||
<View
|
||||
style={twStyle('relative z-50 flex-1 bg-app-header', {
|
||||
|
@ -117,12 +126,12 @@ const SearchScreen = ({ navigation }: SearchStackScreenProps<'Search'>) => {
|
|||
emptyComponent={
|
||||
<Empty
|
||||
includeHeaderHeight
|
||||
icon={noSearch ? 'Search' : 'FolderNoSpace'}
|
||||
icon={searchIcon}
|
||||
description={searchDescription}
|
||||
style={tw`flex-1 items-center justify-center border-0`}
|
||||
textSize="text-md"
|
||||
textStyle={tw`max-w-[220px]`}
|
||||
iconSize={100}
|
||||
description={noSearch ? 'Add filters or type to search for files' : 'No files found'}
|
||||
/>
|
||||
/>
|
||||
}
|
||||
tabHeight={false} />
|
||||
</Suspense>
|
||||
|
|
|
@ -5,10 +5,10 @@ appId: com.spacedrive.app
|
|||
id: 'browse-tab'
|
||||
- waitForAnimationToEnd
|
||||
- tapOn:
|
||||
id: 'navigate-tags-screen'
|
||||
- tapOn:
|
||||
id: 'create-tag-modal'
|
||||
id: 'create-tag-button'
|
||||
- inputText: 'MyTag'
|
||||
- tapOn:
|
||||
text: 'Create'
|
||||
- tapOn:
|
||||
id: 'show-all-tags-button'
|
||||
- assertVisible: 'MyTag'
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
[package]
|
||||
name = "sd-core"
|
||||
version = "0.2.15"
|
||||
version = "0.3.0"
|
||||
description = "Virtual distributed filesystem engine that powers Spacedrive."
|
||||
authors = ["Spacedrive Technology Inc <support@spacedrive.com>"]
|
||||
rust-version = "1.78"
|
||||
|
|
|
@ -195,18 +195,9 @@ impl Task<Error> for SaveTask {
|
|||
size_in_bytes_bytes
|
||||
),
|
||||
sync_db_entry!(inode_to_db(entry.metadata.inode), inode),
|
||||
{
|
||||
let v = entry.metadata.created_at.into();
|
||||
sync_db_entry!(v, date_created)
|
||||
},
|
||||
{
|
||||
let v = entry.metadata.modified_at.into();
|
||||
sync_db_entry!(v, date_modified)
|
||||
},
|
||||
{
|
||||
let v = Utc::now().into();
|
||||
sync_db_entry!(v, date_indexed)
|
||||
},
|
||||
sync_db_entry!(entry.metadata.created_at.into(), date_created),
|
||||
sync_db_entry!(entry.metadata.modified_at.into(), date_modified),
|
||||
sync_db_entry!(Utc::now().into(), date_indexed),
|
||||
sync_db_entry!(entry.metadata.hidden, hidden),
|
||||
]
|
||||
.into_iter()
|
||||
|
|
103
core/crates/sync/README.md
Normal file
103
core/crates/sync/README.md
Normal file
|
@ -0,0 +1,103 @@
|
|||
# `sd-core-sync`
|
||||
|
||||
Spacedrive's sync system. Consumes types and helpers from `sd-sync`.
|
||||
|
||||
## Using Sync
|
||||
|
||||
### Creating Records
|
||||
|
||||
Prepare a sync id by creating or obtaining its value,
|
||||
and then wrapping it in the model's `SyncId` struct,
|
||||
available at `prisma_sync::{model}::SyncId`.
|
||||
|
||||
Next, prepare the sync operations using some varaints of the `sync_entry` macros.
|
||||
`sync_entry` and `option_sync_entry` take the value first, and then the path to the field's prisma module.
|
||||
`sync_db_entry` and `option_sync_db_entry` take the same inputs, but additionally produce a prisma operation in a tuple with the sync operation, intended to be put into a `Vec` and unzipped.
|
||||
|
||||
Finally, use `sync.shared/relation_create` depending on if you're creating a standalone record or a relation between two records, and then write it to the database with `write_ops`.
|
||||
|
||||
```rs
|
||||
let (sync_params, db_params): (Vec<_>, Vec<_>) = [
|
||||
sync_db_entry!(self.name, tag::name),
|
||||
sync_db_entry!(self.color, tag::color),
|
||||
sync_db_entry!(false, tag::is_hidden),
|
||||
sync_db_entry!(date_created, tag::date_created),
|
||||
]
|
||||
.into_iter()
|
||||
.unzip();
|
||||
|
||||
sync.write_ops(
|
||||
db,
|
||||
(
|
||||
sync.shared_create(
|
||||
prisma_sync::tag::SyncId { pub_id },
|
||||
sync_params,
|
||||
),
|
||||
db.tag().create(pub_id, db_params),
|
||||
),
|
||||
)
|
||||
```
|
||||
|
||||
### Updating Records
|
||||
|
||||
This follows a similar process to creation, but with `sync.shared/relation_create`.
|
||||
|
||||
```rs
|
||||
let (sync_params, db_params): (Vec<_>, Vec<_>) = [
|
||||
sync_db_entry!(name, tag::name),
|
||||
sync_db_entry!(color, tag::color),
|
||||
]
|
||||
.into_iter()
|
||||
.unzip();
|
||||
|
||||
sync.write_ops(
|
||||
db,
|
||||
(
|
||||
sync.shared_update(prisma_sync::tag::SyncId { pub_id }, k, v),
|
||||
db.tag().update(tag::id::equals(id), db_params);
|
||||
)
|
||||
)
|
||||
```
|
||||
|
||||
### Deleting Records
|
||||
|
||||
This only requires a sync ID.
|
||||
|
||||
```rs
|
||||
sync.write_op(
|
||||
db,
|
||||
sync.shared_delete(prisma_sync::tag::SyncId { pub_id }),
|
||||
db.tag().delete(tag::id::equals(id));
|
||||
)
|
||||
```
|
||||
|
||||
### Relation Records
|
||||
|
||||
Relations require sync IDs for both the item and the group being related together.
|
||||
Apart from that they're basically the same as shared operations.
|
||||
|
||||
```rs
|
||||
let (sync_params, db_params): (Vec<_>, Vec<_>) = [
|
||||
sync_db_entry!(date_created, tag_on_object::date_created)
|
||||
]
|
||||
.into_iter()
|
||||
.unzip();
|
||||
|
||||
sync.write_ops(
|
||||
db,
|
||||
(
|
||||
sync.relation_create(
|
||||
prisma_sync::tag_on_object::SyncId {
|
||||
tag: prisma_sync::tag::SyncId { pub_id: tag_pub_id },
|
||||
object: prisma_sync::object::SyncId { pub_id: object_pub_id },
|
||||
},
|
||||
sync_params
|
||||
),
|
||||
db.tag_on_object().create(
|
||||
object::id::equals(object_id),
|
||||
tag::id::equals(tag_id),
|
||||
db_params
|
||||
)
|
||||
)
|
||||
)
|
||||
```
|
|
@ -4,7 +4,7 @@ use sd_prisma::{
|
|||
prisma::{file_path, object, tag, tag_on_object},
|
||||
prisma_sync,
|
||||
};
|
||||
use sd_sync::OperationFactory;
|
||||
use sd_sync::{option_sync_db_entry, option_sync_entry, sync_entry, OperationFactory};
|
||||
use sd_utils::{msgpack, uuid_to_bytes};
|
||||
|
||||
use std::collections::BTreeMap;
|
||||
|
@ -88,6 +88,22 @@ pub(crate) fn mount() -> AlphaRouter<Ctx> {
|
|||
.procedure("create", {
|
||||
R.with2(library())
|
||||
.mutation(|(_, library), args: TagCreateArgs| async move {
|
||||
// Check if tag with the same name already exists
|
||||
let existing_tag = library
|
||||
.db
|
||||
.tag()
|
||||
.find_many(vec![tag::name::equals(Some(args.name.clone()))])
|
||||
.select(tag::select!({ id }))
|
||||
.exec()
|
||||
.await?;
|
||||
|
||||
if !existing_tag.is_empty() {
|
||||
return Err(rspc::Error::new(
|
||||
ErrorCode::Conflict,
|
||||
"Tag with the same name already exists".to_string(),
|
||||
));
|
||||
}
|
||||
|
||||
let created_tag = args.exec(&library).await?;
|
||||
|
||||
invalidate_query!(library, "tags.list");
|
||||
|
@ -308,29 +324,30 @@ pub(crate) fn mount() -> AlphaRouter<Ctx> {
|
|||
.exec()
|
||||
.await?;
|
||||
|
||||
let (sync_params, db_params): (Vec<_>, Vec<_>) = [
|
||||
option_sync_db_entry!(args.name, tag::name),
|
||||
option_sync_db_entry!(args.color, tag::color),
|
||||
]
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.unzip();
|
||||
|
||||
sync.write_ops(
|
||||
db,
|
||||
(
|
||||
[
|
||||
args.name.as_ref().map(|v| (tag::name::NAME, msgpack!(v))),
|
||||
args.color.as_ref().map(|v| (tag::color::NAME, msgpack!(v))),
|
||||
]
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.map(|(k, v)| {
|
||||
sync.shared_update(
|
||||
prisma_sync::tag::SyncId {
|
||||
pub_id: tag.pub_id.clone(),
|
||||
},
|
||||
k,
|
||||
v,
|
||||
)
|
||||
})
|
||||
.collect(),
|
||||
db.tag().update(
|
||||
tag::id::equals(args.id),
|
||||
vec![tag::name::set(args.name), tag::color::set(args.color)],
|
||||
),
|
||||
sync_params
|
||||
.into_iter()
|
||||
.map(|(k, v)| {
|
||||
sync.shared_update(
|
||||
prisma_sync::tag::SyncId {
|
||||
pub_id: tag.pub_id.clone(),
|
||||
},
|
||||
k,
|
||||
v,
|
||||
)
|
||||
})
|
||||
.collect(),
|
||||
db.tag().update(tag::id::equals(args.id), db_params),
|
||||
),
|
||||
)
|
||||
.await?;
|
||||
|
|
|
@ -26,6 +26,15 @@ impl TagCreateArgs {
|
|||
let pub_id = Uuid::new_v4().as_bytes().to_vec();
|
||||
let date_created: DateTime<FixedOffset> = Utc::now().into();
|
||||
|
||||
let (sync_params, db_params): (Vec<_>, Vec<_>) = [
|
||||
sync_db_entry!(self.name, tag::name),
|
||||
sync_db_entry!(self.color, tag::color),
|
||||
sync_db_entry!(false, tag::is_hidden),
|
||||
sync_db_entry!(date_created, tag::date_created),
|
||||
]
|
||||
.into_iter()
|
||||
.unzip();
|
||||
|
||||
sync.write_ops(
|
||||
db,
|
||||
(
|
||||
|
@ -33,25 +42,9 @@ impl TagCreateArgs {
|
|||
prisma_sync::tag::SyncId {
|
||||
pub_id: pub_id.clone(),
|
||||
},
|
||||
[
|
||||
(tag::name::NAME, msgpack!(&self.name)),
|
||||
(tag::color::NAME, msgpack!(&self.color)),
|
||||
(tag::is_hidden::NAME, msgpack!(false)),
|
||||
(
|
||||
tag::date_created::NAME,
|
||||
msgpack!(&date_created.to_rfc3339()),
|
||||
),
|
||||
],
|
||||
),
|
||||
db.tag().create(
|
||||
pub_id,
|
||||
vec![
|
||||
tag::name::set(Some(self.name)),
|
||||
tag::color::set(Some(self.color)),
|
||||
tag::is_hidden::set(Some(false)),
|
||||
tag::date_created::set(Some(date_created)),
|
||||
],
|
||||
sync_params,
|
||||
),
|
||||
db.tag().create(pub_id, db_params),
|
||||
),
|
||||
)
|
||||
.await
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
# crdt-rs
|
||||
|
||||
Just @brendonovich experimenting with CRDT stuff.
|
|
@ -42,6 +42,7 @@ export const ContextMenu = ({
|
|||
/>
|
||||
));
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
toast.error(t('error_message', { error }));
|
||||
}
|
||||
|
@ -66,7 +67,10 @@ export const ContextMenu = ({
|
|||
dialogManager.create((dp) => (
|
||||
<DeleteDialog
|
||||
{...dp}
|
||||
onSuccess={() => navigate('settings/library/locations')}
|
||||
onSuccess={() => {
|
||||
toast.success(t('location_deleted_successfully'));
|
||||
navigate('settings/library/locations');
|
||||
}}
|
||||
locationId={locationId}
|
||||
/>
|
||||
));
|
||||
|
|
|
@ -3,18 +3,14 @@ import { NodeIdParamsSchema } from '~/app/route-schemas';
|
|||
import { Icon } from '~/components';
|
||||
import { useRouteTitle, useZodRouteParams } from '~/hooks';
|
||||
import { hardwareModelToIcon } from '~/util/hardware';
|
||||
|
||||
import { TopBarPortal } from '../TopBar/Portal';
|
||||
import StarfieldEffect from './StarfieldEffect'; // Import the StarfieldEffect component
|
||||
|
||||
export const Component = () => {
|
||||
const { id: _nodeId } = useZodRouteParams(NodeIdParamsSchema);
|
||||
// we encode/decode because nodeId has special characters and I'm not willing to change that rn
|
||||
const nodeId = decodeURIComponent(_nodeId);
|
||||
|
||||
const peers = usePeers();
|
||||
|
||||
const peer = peers.get(nodeId);
|
||||
|
||||
const title = useRouteTitle(peer?.metadata?.name || 'Peer');
|
||||
|
||||
return (
|
||||
|
@ -39,8 +35,12 @@ export const Component = () => {
|
|||
{peer?.metadata.operating_system?.toString()}
|
||||
</h3>
|
||||
<h3 className="text-sm text-ink-dull">{nodeId}</h3>
|
||||
<div className="mt-8 flex h-28 w-96 items-center justify-center rounded-lg border border-dashed border-app-line p-4 text-sm font-medium text-ink-dull">
|
||||
Drop files here to send with Spacedrop
|
||||
|
||||
<div className="relative mt-8 flex h-28 w-96 items-center justify-center rounded-lg border border-solid border-app-line p-4 text-sm font-medium text-ink-dull">
|
||||
<StarfieldEffect />
|
||||
<div className="pointer-events-none absolute inset-0 flex items-center justify-center">
|
||||
Drop files here to send with Spacedrop
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
|
254
interface/app/$libraryId/peer/StarfieldEffect.tsx
Normal file
254
interface/app/$libraryId/peer/StarfieldEffect.tsx
Normal file
|
@ -0,0 +1,254 @@
|
|||
import React, { useEffect, useRef } from 'react';
|
||||
|
||||
const StarfieldEffect: React.FC = () => {
|
||||
const canvasRef = useRef<HTMLCanvasElement>(null);
|
||||
|
||||
useEffect(() => {
|
||||
const canvas = canvasRef.current;
|
||||
if (!canvas) return;
|
||||
|
||||
const ctx = canvas.getContext('2d');
|
||||
if (!ctx) return;
|
||||
|
||||
const resizeCanvas = () => {
|
||||
const scale = window.devicePixelRatio || 1;
|
||||
const width = canvas.parentElement?.clientWidth || 800;
|
||||
const height = canvas.parentElement?.clientHeight || 300;
|
||||
canvas.width = width * scale;
|
||||
canvas.height = height * scale;
|
||||
canvas.style.width = `${width}px`;
|
||||
canvas.style.height = `${height}px`;
|
||||
ctx.scale(scale, scale);
|
||||
};
|
||||
|
||||
resizeCanvas();
|
||||
window.addEventListener('resize', resizeCanvas);
|
||||
|
||||
canvas.style.position = 'absolute';
|
||||
canvas.oncontextmenu = e => e.preventDefault();
|
||||
|
||||
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
|
||||
const pix = imageData.data;
|
||||
|
||||
const center = { x: canvas.width / 2, y: canvas.height / 2 };
|
||||
|
||||
let mouseActive = false;
|
||||
let mouseDown = false;
|
||||
let mousePos = { x: center.x, y: center.y };
|
||||
|
||||
let starSpeed = 20;
|
||||
const starSpeedMin = starSpeed;
|
||||
const starSpeedMax = 100;
|
||||
const starDistance = 5000;
|
||||
|
||||
let fov = 320;
|
||||
const fovMin = 210;
|
||||
const fovMax = fov;
|
||||
|
||||
const starHolderCount = 8000; // Increased star count
|
||||
const starHolder: any[] = [];
|
||||
const starBgHolder: any[] = [];
|
||||
|
||||
const backgroundColor = { r: 28, g: 29, b: 37, a: 255 };
|
||||
|
||||
const clearImageData = () => {
|
||||
for (let i = 0, l = pix.length; i < l; i += 4) {
|
||||
pix[i] = backgroundColor.r;
|
||||
pix[i + 1] = backgroundColor.g;
|
||||
pix[i + 2] = backgroundColor.b;
|
||||
pix[i + 3] = backgroundColor.a;
|
||||
}
|
||||
};
|
||||
|
||||
const setPixel = (x: number, y: number, r: number, g: number, b: number, a: number) => {
|
||||
const i = (x + y * canvas.width) * 4;
|
||||
pix[i] = r;
|
||||
pix[i + 1] = g;
|
||||
pix[i + 2] = b;
|
||||
pix[i + 3] = a;
|
||||
};
|
||||
|
||||
const setPixelAdditive = (x: number, y: number, r: number, g: number, b: number, a: number) => {
|
||||
const i = (x + y * canvas.width) * 4;
|
||||
pix[i] += r;
|
||||
pix[i + 1] += g;
|
||||
pix[i + 2] += b;
|
||||
pix[i + 3] = a;
|
||||
};
|
||||
|
||||
const drawLine = (x1: number, y1: number, x2: number, y2: number, r: number, g: number, b: number, a: number) => {
|
||||
const dx = Math.abs(x2 - x1);
|
||||
const dy = Math.abs(y2 - y1);
|
||||
const sx = x1 < x2 ? 1 : -1;
|
||||
const sy = y1 < y2 ? 1 : -1;
|
||||
let err = dx - dy;
|
||||
let lx = x1;
|
||||
let ly = y1;
|
||||
|
||||
const continueLoop = true
|
||||
while (continueLoop) {
|
||||
if (lx > 0 && lx < canvas.width && ly > 0 && ly < canvas.height) {
|
||||
setPixel(lx, ly, r, g, b, a);
|
||||
}
|
||||
if (lx === x2 && ly === y2) break;
|
||||
const e2 = 2 * err;
|
||||
if (e2 > -dx) {
|
||||
err -= dy;
|
||||
lx += sx;
|
||||
}
|
||||
if (e2 < dy) {
|
||||
err += dx;
|
||||
ly += sy;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const addParticle = (x: number, y: number, z: number, ox: number, oy: number, oz: number) => {
|
||||
const particle = { x, y, z, ox, oy, x2d: 0, y2d: 0, color: { r: 0, g: 0, b: 0, a: 0 }, oColor: { r: 0, g: 0, b: 0, a: 0 }, w: 0, distance: 0, distanceTotal: 0 };
|
||||
return particle;
|
||||
};
|
||||
|
||||
const addParticles = () => {
|
||||
let x, y, z, colorValue, particle;
|
||||
for (let i = 0; i < starHolderCount / 3; i++) {
|
||||
x = Math.random() * 24000 - 12000;
|
||||
y = Math.random() * 4500 - 2250;
|
||||
z = Math.round(Math.random() * starDistance);
|
||||
colorValue = 185; // Adjusted color
|
||||
particle = addParticle(x, y, z, x, y, z);
|
||||
particle.color = { r: 171, g: 172, b: 185, a: 255 };
|
||||
starBgHolder.push(particle);
|
||||
}
|
||||
for (let i = 0; i < starHolderCount; i++) {
|
||||
x = Math.random() * 10000 - 5000;
|
||||
y = Math.random() * 10000 - 5000;
|
||||
z = Math.round(Math.random() * starDistance);
|
||||
colorValue = 185; // Adjusted color
|
||||
particle = addParticle(x, y, z, x, y, z);
|
||||
particle.color = { r: 171, g: 172, b: 185, a: 255 };
|
||||
particle.oColor = { r: 171, g: 172, b: 185, a: 255 };
|
||||
particle.w = 1;
|
||||
particle.distance = starDistance - z;
|
||||
particle.distanceTotal = Math.round(starDistance + fov - particle.w);
|
||||
starHolder.push(particle);
|
||||
}
|
||||
};
|
||||
|
||||
const animloop = () => {
|
||||
requestAnimationFrame(animloop);
|
||||
render();
|
||||
};
|
||||
|
||||
const render = () => {
|
||||
clearImageData();
|
||||
let star, scale;
|
||||
|
||||
if (mouseActive) {
|
||||
starSpeed += 2;
|
||||
if (starSpeed > starSpeedMax) starSpeed = starSpeedMax;
|
||||
} else {
|
||||
starSpeed -= 1;
|
||||
if (starSpeed < starSpeedMin) starSpeed = starSpeedMin;
|
||||
}
|
||||
|
||||
fov += mouseActive ? -1 : 0.5;
|
||||
fov = Math.max(fovMin, Math.min(fovMax, fov));
|
||||
|
||||
const warpSpeedValue = starSpeed * (starSpeed / (starSpeedMax / 2));
|
||||
|
||||
for (const bgStar of starBgHolder) {
|
||||
star = bgStar;
|
||||
scale = fov / (fov + star.z);
|
||||
star.x2d = star.x * scale + center.x;
|
||||
star.y2d = star.y * scale + center.y;
|
||||
if (star.x2d > 0 && star.x2d < canvas.width && star.y2d > 0 && star.y2d < canvas.height) {
|
||||
setPixel(star.x2d | 0, star.y2d | 0, star.color.r, star.color.g, star.color.b, 255);
|
||||
}
|
||||
}
|
||||
|
||||
for (const mainStar of starHolder) {
|
||||
star = mainStar;
|
||||
star.z -= starSpeed;
|
||||
star.distance += starSpeed;
|
||||
if (star.z < -fov + star.w) {
|
||||
star.z = starDistance;
|
||||
star.distance = 0;
|
||||
}
|
||||
|
||||
const distancePercent = star.distance / star.distanceTotal;
|
||||
star.color.r = Math.floor(star.oColor.r * distancePercent);
|
||||
star.color.g = Math.floor(star.oColor.g * distancePercent);
|
||||
star.color.b = Math.floor(star.oColor.b * distancePercent);
|
||||
|
||||
scale = fov / (fov + star.z);
|
||||
star.x2d = star.x * scale + center.x;
|
||||
star.y2d = star.y * scale + center.y;
|
||||
|
||||
if (star.x2d > 0 && star.x2d < canvas.width && star.y2d > 0 && star.y2d < canvas.height) {
|
||||
setPixelAdditive(star.x2d | 0, star.y2d | 0, star.color.r, star.color.g, star.color.b, 255);
|
||||
}
|
||||
|
||||
if (starSpeed !== starSpeedMin) {
|
||||
const nz = star.z + warpSpeedValue;
|
||||
scale = fov / (fov + nz);
|
||||
const x2d = star.x * scale + center.x;
|
||||
const y2d = star.y * scale + center.y;
|
||||
if (x2d > 0 && x2d < canvas.width && y2d > 0 && y2d < canvas.height) {
|
||||
drawLine(star.x2d | 0, star.y2d | 0, x2d | 0, y2d | 0, star.color.r, star.color.g, star.color.b, 255);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ctx.putImageData(imageData, 0, 0);
|
||||
|
||||
center.x += (mousePos.x - center.x) * 0.015;
|
||||
if (!mouseActive) {
|
||||
center.x += (canvas.width / 2 - center.x) * 0.015;
|
||||
}
|
||||
};
|
||||
|
||||
const getMousePos = (event: MouseEvent) => {
|
||||
const rect = canvas.getBoundingClientRect();
|
||||
return { x: event.clientX - rect.left, y: event.clientY - rect.top };
|
||||
};
|
||||
|
||||
const mouseMoveHandler = (event: MouseEvent) => {
|
||||
mousePos = getMousePos(event);
|
||||
};
|
||||
|
||||
const mouseEnterHandler = () => {
|
||||
mouseActive = true;
|
||||
};
|
||||
|
||||
const mouseLeaveHandler = () => {
|
||||
mouseActive = false;
|
||||
mouseDown = false;
|
||||
};
|
||||
|
||||
canvas.addEventListener('mousemove', mouseMoveHandler);
|
||||
canvas.addEventListener('mousedown', () => { mouseDown = true; });
|
||||
canvas.addEventListener('mouseup', () => { mouseDown = false; });
|
||||
canvas.addEventListener('mouseenter', mouseEnterHandler);
|
||||
canvas.addEventListener('mouseleave', mouseLeaveHandler);
|
||||
|
||||
addParticles();
|
||||
animloop();
|
||||
|
||||
return () => {
|
||||
canvas.removeEventListener('mousemove', mouseMoveHandler);
|
||||
canvas.removeEventListener('mousedown', () => { mouseDown = true; });
|
||||
canvas.removeEventListener('mouseup', () => { mouseDown = false; });
|
||||
canvas.removeEventListener('mouseenter', mouseEnterHandler);
|
||||
canvas.removeEventListener('mouseleave', mouseLeaveHandler);
|
||||
window.removeEventListener('resize', resizeCanvas);
|
||||
};
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<canvas ref={canvasRef} className="block size-full rounded-lg border border-gray-500 transition-all hover:scale-105">
|
||||
Drop files here to send with Spacedrop
|
||||
</canvas>
|
||||
);
|
||||
};
|
||||
|
||||
export default StarfieldEffect;
|
|
@ -388,7 +388,9 @@
|
|||
"local_locations": "Local Locations",
|
||||
"local_node": "Local Node",
|
||||
"location": "Location",
|
||||
"location_added_successfully": "Location added successfully.",
|
||||
"location_connected_tooltip": "Location is being watched for changes",
|
||||
"location_deleted_successfully": "Location deleted successfully.",
|
||||
"location_disconnected_tooltip": "Location is not being watched for changes",
|
||||
"location_display_name_info": "The name of this Location, this is what will be displayed in the sidebar. Will not rename the actual folder on disk.",
|
||||
"location_empty_notice_message": "No files found here",
|
||||
|
|
448
pnpm-lock.yaml
448
pnpm-lock.yaml
|
@ -58,7 +58,7 @@ importers:
|
|||
version: 5.4.2
|
||||
vite:
|
||||
specifier: ^5.1.6
|
||||
version: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)
|
||||
version: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)
|
||||
|
||||
.github/actions/publish-artifacts:
|
||||
dependencies:
|
||||
|
@ -89,7 +89,7 @@ importers:
|
|||
version: 0.0.0-main-dc31e5b2
|
||||
'@oscartbeaumont-sd/rspc-tauri':
|
||||
specifier: '=0.0.0-main-dc31e5b2'
|
||||
version: 0.0.0-main-dc31e5b2(patch_hash=3ozd223mr7o4cioyf7af7qd56a)(@tauri-apps/api@2.0.0-beta.11)
|
||||
version: 0.0.0-main-dc31e5b2(patch_hash=3ozd223mr7o4cioyf7af7qd56a)(@tauri-apps/api@2.0.0-beta.12)
|
||||
'@remix-run/router':
|
||||
specifier: '=1.13.1'
|
||||
version: 1.13.1(patch_hash=wdk5klbkacqsve2yzdckjvtjz4)
|
||||
|
@ -107,10 +107,10 @@ importers:
|
|||
version: 0.7.3(typescript@5.4.2)(zod@3.22.4)
|
||||
'@tanstack/react-query':
|
||||
specifier: ^4.36.1
|
||||
version: 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0)
|
||||
version: 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0)
|
||||
'@tauri-apps/api':
|
||||
specifier: next
|
||||
version: 2.0.0-beta.11
|
||||
version: 2.0.0-beta.12
|
||||
'@tauri-apps/plugin-dialog':
|
||||
specifier: 2.0.0-beta.3
|
||||
version: 2.0.0-beta.3
|
||||
|
@ -147,7 +147,7 @@ importers:
|
|||
version: 2.16.0
|
||||
'@tauri-apps/cli':
|
||||
specifier: next
|
||||
version: 2.0.0-beta.16
|
||||
version: 2.0.0-beta.18
|
||||
'@types/react':
|
||||
specifier: ^18.2.67
|
||||
version: 18.2.67
|
||||
|
@ -162,10 +162,10 @@ importers:
|
|||
version: 5.4.2
|
||||
vite:
|
||||
specifier: ^5.1.6
|
||||
version: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)
|
||||
version: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)
|
||||
vite-tsconfig-paths:
|
||||
specifier: ^4.3.2
|
||||
version: 4.3.2(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2))
|
||||
version: 4.3.2(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2))
|
||||
|
||||
apps/landing:
|
||||
dependencies:
|
||||
|
@ -183,10 +183,10 @@ importers:
|
|||
version: 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
|
||||
'@react-three/drei':
|
||||
specifier: ^9.88.13
|
||||
version: 9.102.6(@react-three/fiber@8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)))(expo@50.0.13(@babel/core@7.24.0))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0)(three@0.161.0))(@types/react@18.2.67)(@types/three@0.162.0)(immer@10.0.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(three@0.161.0)
|
||||
version: 9.102.6(@react-three/fiber@8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0)(three@0.161.0))(@types/react@18.2.67)(@types/three@0.162.0)(immer@10.0.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(three@0.161.0)
|
||||
'@react-three/fiber':
|
||||
specifier: ^8.15.11
|
||||
version: 8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)))(expo@50.0.13(@babel/core@7.24.0))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0)(three@0.161.0)
|
||||
version: 8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0)(three@0.161.0)
|
||||
'@sd/assets':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/assets
|
||||
|
@ -553,7 +553,7 @@ importers:
|
|||
version: 8.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.4.2)
|
||||
'@storybook/react-vite':
|
||||
specifier: ^8.0.1
|
||||
version: 8.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.13.0)(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2))
|
||||
version: 8.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.13.0)(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2))
|
||||
'@storybook/testing-library':
|
||||
specifier: ^0.2.2
|
||||
version: 0.2.2
|
||||
|
@ -602,7 +602,7 @@ importers:
|
|||
version: 5.4.2
|
||||
vite:
|
||||
specifier: ^5.1.6
|
||||
version: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)
|
||||
version: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)
|
||||
|
||||
apps/web:
|
||||
dependencies:
|
||||
|
@ -617,7 +617,7 @@ importers:
|
|||
version: link:../../interface
|
||||
'@tanstack/react-query':
|
||||
specifier: ^4.36.1
|
||||
version: 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0)
|
||||
version: 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0)
|
||||
html-to-image:
|
||||
specifier: ^1.11.11
|
||||
version: 1.11.11
|
||||
|
@ -675,10 +675,10 @@ importers:
|
|||
version: 5.4.2
|
||||
vite:
|
||||
specifier: ^5.1.6
|
||||
version: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)
|
||||
version: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)
|
||||
vite-tsconfig-paths:
|
||||
specifier: ^4.3.2
|
||||
version: 4.3.2(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2))
|
||||
version: 4.3.2(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2))
|
||||
|
||||
interface:
|
||||
dependencies:
|
||||
|
@ -735,10 +735,10 @@ importers:
|
|||
version: 7.107.0
|
||||
'@tanstack/react-query':
|
||||
specifier: ^4.36.1
|
||||
version: 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0)
|
||||
version: 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0)
|
||||
'@tanstack/react-query-devtools':
|
||||
specifier: ^4.36.1
|
||||
version: 4.36.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
|
||||
version: 4.36.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
|
||||
'@tanstack/react-table':
|
||||
specifier: ^8.10.7
|
||||
version: 8.13.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
|
||||
|
@ -801,7 +801,7 @@ importers:
|
|||
version: 4.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
|
||||
react-i18next:
|
||||
specifier: ^13.5.0
|
||||
version: 13.5.0(i18next@23.10.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0)
|
||||
version: 13.5.0(i18next@23.10.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0)
|
||||
react-json-view:
|
||||
specifier: ^1.21.3
|
||||
version: 1.21.3(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
|
||||
|
@ -886,10 +886,10 @@ importers:
|
|||
version: 5.4.2
|
||||
vite:
|
||||
specifier: ^5.1.6
|
||||
version: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)
|
||||
version: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)
|
||||
vite-plugin-svgr:
|
||||
specifier: ^3.3.0
|
||||
version: 3.3.0(rollup@4.13.0)(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2))
|
||||
version: 3.3.0(rollup@4.13.0)(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2))
|
||||
|
||||
packages/assets: {}
|
||||
|
||||
|
@ -900,13 +900,13 @@ importers:
|
|||
version: 0.0.0-main-dc31e5b2
|
||||
'@oscartbeaumont-sd/rspc-react':
|
||||
specifier: '=0.0.0-main-dc31e5b2'
|
||||
version: 0.0.0-main-dc31e5b2(@oscartbeaumont-sd/rspc-client@0.0.0-main-dc31e5b2)(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)
|
||||
version: 0.0.0-main-dc31e5b2(@oscartbeaumont-sd/rspc-client@0.0.0-main-dc31e5b2)(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0))(react@18.2.0)
|
||||
'@solid-primitives/deep':
|
||||
specifier: ^0.2.4
|
||||
version: 0.2.7(solid-js@1.8.15)
|
||||
'@tanstack/react-query':
|
||||
specifier: ^4.36.1
|
||||
version: 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0)
|
||||
version: 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0)
|
||||
'@tanstack/solid-query':
|
||||
specifier: ^5.17.9
|
||||
version: 5.28.5(solid-js@1.8.15)
|
||||
|
@ -962,7 +962,7 @@ importers:
|
|||
version: 7.3.1(eslint@8.57.0)(typescript@5.4.2)
|
||||
'@vitejs/plugin-react-swc':
|
||||
specifier: ^3.6.0
|
||||
version: 3.6.0(@swc/helpers@0.5.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2))
|
||||
version: 3.6.0(@swc/helpers@0.5.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2))
|
||||
eslint:
|
||||
specifier: ^8.57.0
|
||||
version: 8.57.0
|
||||
|
@ -998,19 +998,19 @@ importers:
|
|||
version: 3.2.0
|
||||
vite-plugin-html:
|
||||
specifier: ^3.2.2
|
||||
version: 3.2.2(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2))
|
||||
version: 3.2.2(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2))
|
||||
vite-plugin-i18next-loader:
|
||||
specifier: ^2.0.12
|
||||
version: 2.0.12(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2))
|
||||
version: 2.0.12(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2))
|
||||
vite-plugin-inspect:
|
||||
specifier: ^0.8.3
|
||||
version: 0.8.3(rollup@4.13.0)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2))
|
||||
version: 0.8.3(rollup@4.13.0)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2))
|
||||
vite-plugin-solid:
|
||||
specifier: ^2.10.2
|
||||
version: 2.10.2(@testing-library/jest-dom@6.4.2)(solid-js@1.8.15)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2))
|
||||
version: 2.10.2(@testing-library/jest-dom@6.4.2)(solid-js@1.8.15)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2))
|
||||
vite-plugin-svgr:
|
||||
specifier: ^3.3.0
|
||||
version: 3.3.0(rollup@4.13.0)(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2))
|
||||
version: 3.3.0(rollup@4.13.0)(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2))
|
||||
|
||||
packages/ui:
|
||||
dependencies:
|
||||
|
@ -3560,9 +3560,6 @@ packages:
|
|||
'@radix-ui/number@1.0.1':
|
||||
resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==}
|
||||
|
||||
'@radix-ui/primitive@1.0.0':
|
||||
resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==}
|
||||
|
||||
'@radix-ui/primitive@1.0.1':
|
||||
resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==}
|
||||
|
||||
|
@ -3605,11 +3602,6 @@ packages:
|
|||
'@types/react-dom':
|
||||
optional: true
|
||||
|
||||
'@radix-ui/react-compose-refs@1.0.0':
|
||||
resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==}
|
||||
peerDependencies:
|
||||
react: ^16.8 || ^17.0 || ^18.0
|
||||
|
||||
'@radix-ui/react-compose-refs@1.0.1':
|
||||
resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==}
|
||||
peerDependencies:
|
||||
|
@ -3663,12 +3655,6 @@ packages:
|
|||
'@types/react':
|
||||
optional: true
|
||||
|
||||
'@radix-ui/react-dismissable-layer@1.0.2':
|
||||
resolution: {integrity: sha512-WjJzMrTWROozDqLB0uRWYvj4UuXsM/2L19EmQ3Au+IJWqwvwq9Bwd+P8ivo0Deg9JDPArR1I6MbWNi1CmXsskg==}
|
||||
peerDependencies:
|
||||
react: ^16.8 || ^17.0 || ^18.0
|
||||
react-dom: ^16.8 || ^17.0 || ^18.0
|
||||
|
||||
'@radix-ui/react-dismissable-layer@1.0.4':
|
||||
resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==}
|
||||
peerDependencies:
|
||||
|
@ -3843,12 +3829,6 @@ packages:
|
|||
'@types/react-dom':
|
||||
optional: true
|
||||
|
||||
'@radix-ui/react-primitive@1.0.1':
|
||||
resolution: {integrity: sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA==}
|
||||
peerDependencies:
|
||||
react: ^16.8 || ^17.0 || ^18.0
|
||||
react-dom: ^16.8 || ^17.0 || ^18.0
|
||||
|
||||
'@radix-ui/react-primitive@1.0.3':
|
||||
resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==}
|
||||
peerDependencies:
|
||||
|
@ -3927,11 +3907,6 @@ packages:
|
|||
'@types/react-dom':
|
||||
optional: true
|
||||
|
||||
'@radix-ui/react-slot@1.0.1':
|
||||
resolution: {integrity: sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==}
|
||||
peerDependencies:
|
||||
react: ^16.8 || ^17.0 || ^18.0
|
||||
|
||||
'@radix-ui/react-slot@1.0.2':
|
||||
resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==}
|
||||
peerDependencies:
|
||||
|
@ -3993,11 +3968,6 @@ packages:
|
|||
'@types/react-dom':
|
||||
optional: true
|
||||
|
||||
'@radix-ui/react-use-callback-ref@1.0.0':
|
||||
resolution: {integrity: sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==}
|
||||
peerDependencies:
|
||||
react: ^16.8 || ^17.0 || ^18.0
|
||||
|
||||
'@radix-ui/react-use-callback-ref@1.0.1':
|
||||
resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==}
|
||||
peerDependencies:
|
||||
|
@ -4016,11 +3986,6 @@ packages:
|
|||
'@types/react':
|
||||
optional: true
|
||||
|
||||
'@radix-ui/react-use-escape-keydown@1.0.2':
|
||||
resolution: {integrity: sha512-DXGim3x74WgUv+iMNCF+cAo8xUHHeqvjx8zs7trKf+FkQKPQXLk2sX7Gx1ysH7Q76xCpZuxIJE7HLPxRE+Q+GA==}
|
||||
peerDependencies:
|
||||
react: ^16.8 || ^17.0 || ^18.0
|
||||
|
||||
'@radix-ui/react-use-escape-keydown@1.0.3':
|
||||
resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==}
|
||||
peerDependencies:
|
||||
|
@ -5114,68 +5079,72 @@ packages:
|
|||
resolution: {integrity: sha512-wJRY+fBUm3KpqZDHMIz5HRv+1vlnvRJ/dFxiyY3NlINTx2qXqDou5qWYcP1CuZXsd39InWVPV3FAZvno/kGCkA==}
|
||||
engines: {node: '>= 18', npm: '>= 6.6.0', yarn: '>= 1.19.1'}
|
||||
|
||||
'@tauri-apps/cli-darwin-arm64@2.0.0-beta.16':
|
||||
resolution: {integrity: sha512-5Gif4AvpJmnyLj3HO3AEl1RVrr4ast6mDQiXoLwe75bfWq1pj9VwsS5SuSrUKtB8YBSnnclcJwkqwa6soY/xkg==}
|
||||
'@tauri-apps/api@2.0.0-beta.12':
|
||||
resolution: {integrity: sha512-77OvAnsExtiprnjQcvmDyZGfnIvMF/zVL5+8Vkl1R8o8E3iDtvEJZpbbH1F4dPtNa3gr4byp/5dm8hAa1+r3AA==}
|
||||
engines: {node: '>= 18', npm: '>= 6.6.0', yarn: '>= 1.19.1'}
|
||||
|
||||
'@tauri-apps/cli-darwin-arm64@2.0.0-beta.18':
|
||||
resolution: {integrity: sha512-Jq49VH/UpHVkWw+qqymY1xWLMu7FF+4r5C4qVZvgm5Mkgulgf63jyCkrejdlXvOJQNm5MAHTyn2hnX6ZDeWVxA==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [darwin]
|
||||
|
||||
'@tauri-apps/cli-darwin-x64@2.0.0-beta.16':
|
||||
resolution: {integrity: sha512-6Cia8lGSroyoXKvfRI+Dv8Xinr27lptDzGZnd8mT9V0xPg73xcWxPKiTkuxPmLQTrQKVAurfsX3DwwgK8m9kSw==}
|
||||
'@tauri-apps/cli-darwin-x64@2.0.0-beta.18':
|
||||
resolution: {integrity: sha512-50UZNSPfMveKv8jH674S8r+844Ew3WFyastZU+/Q2pPCzqBU4ejdVVLT/37oZo8ip3VpLR3+TBfSn0dmdKrgUw==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [darwin]
|
||||
|
||||
'@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-beta.16':
|
||||
resolution: {integrity: sha512-1mQ0flIt0wrX4QLPwd8f1QFsuFjLPQtWuiObK63K0/YZmDS2yzKT6jnGqNCJsSiyXE2/36gKSyWh6OVpX8U7xg==}
|
||||
'@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-beta.18':
|
||||
resolution: {integrity: sha512-2AI8j2LwryQ+HYMvLNx9EDRWMRwWhK/7RKdOkxgXEbLXc6AKzwVZLH6QddQvjcq8nBR6zk5wnvBjxo1DcQEBSA==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm]
|
||||
os: [linux]
|
||||
|
||||
'@tauri-apps/cli-linux-arm64-gnu@2.0.0-beta.16':
|
||||
resolution: {integrity: sha512-CjgwOvaslvy06m36faZ40noQaBu37gcXtD0HlCgAMofDZz7fUWQJn3xE7r8fegXmY0oMKZ9ah8dgwd5KSk+L+Q==}
|
||||
'@tauri-apps/cli-linux-arm64-gnu@2.0.0-beta.18':
|
||||
resolution: {integrity: sha512-HcPWBF/rJkBgzQhuUwxY8v/+44EamEqqj6rNO6j59d070e/80Uaild6a7A2LKNtvskm7zK436oDfWCyOBF/QQA==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
|
||||
'@tauri-apps/cli-linux-arm64-musl@2.0.0-beta.16':
|
||||
resolution: {integrity: sha512-JMtryDJckutFzNpwFgh98o9Z4Vw1pwImYmJIDLpCPSqYIfd+mrBgPZFTaGl11ZsQnllqt4FNXlYR8T+ey7ZpfQ==}
|
||||
'@tauri-apps/cli-linux-arm64-musl@2.0.0-beta.18':
|
||||
resolution: {integrity: sha512-JkQ4rMtuhPFotMKsVhbRF18f3EiHsdnu7QiOy3i9idFnAv1moo7tU46ntRJtXr8FRTEHywMnnzlNo4Tg5fbZSw==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
|
||||
'@tauri-apps/cli-linux-x64-gnu@2.0.0-beta.16':
|
||||
resolution: {integrity: sha512-3dQGCKsbjaIzk4UM7Jf5FzBJpBJ1OfwBOwkVv2M4O7EDLNZi9brDR+I41eqyFhTabEcHJoLhtURLbD25dJuiug==}
|
||||
'@tauri-apps/cli-linux-x64-gnu@2.0.0-beta.18':
|
||||
resolution: {integrity: sha512-H0whpcVNrVx3apDz2Kp+OgNcJFkTxijqEABYtHS7vXHnhmb6DNdUlKudSW0NwK8SmHJREm0KJftEszrJOoJwaw==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
|
||||
'@tauri-apps/cli-linux-x64-musl@2.0.0-beta.16':
|
||||
resolution: {integrity: sha512-t+wdk/VCn8l9y1fhRQPfvZyz3Or7QEPTxXNobbUzbtckFsf/LqTxjaajOBmSGnZpoTDFvwVOmalDaylILxuM5g==}
|
||||
'@tauri-apps/cli-linux-x64-musl@2.0.0-beta.18':
|
||||
resolution: {integrity: sha512-pti+ttp3Kn7s0Xu4Dc+Z6idLWaQqZel8UqLlvHY21Tf/G4TgMBoyonIWRfQMRoy4DcW/8Oml5F4ZY6IdTC9dgg==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
|
||||
'@tauri-apps/cli-win32-arm64-msvc@2.0.0-beta.16':
|
||||
resolution: {integrity: sha512-ouP0iiRMTNaKyz6c06LucMR5P585r2XJ3/GlzNWtUfP4EaP8mZAENB0ro9VZl10++7Z658MdWxSAf4+Qmkj0jQ==}
|
||||
'@tauri-apps/cli-win32-arm64-msvc@2.0.0-beta.18':
|
||||
resolution: {integrity: sha512-hcc2YsFTbwoctuf+mC3DSy1FVMifH02+6I8kjXXXj2DE4FguP6TwbH43oY+GB6zI3bNdRRhqaZ83GfPTLR55pw==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [win32]
|
||||
|
||||
'@tauri-apps/cli-win32-ia32-msvc@2.0.0-beta.16':
|
||||
resolution: {integrity: sha512-BiBkv3IesPNGXVaampxpB+ub0tz2sGu+6OLzxSm1QTp+2ZSw/qeXi/icvJl5azmOyee4ZWBBiuBzdVY88QH+Vw==}
|
||||
'@tauri-apps/cli-win32-ia32-msvc@2.0.0-beta.18':
|
||||
resolution: {integrity: sha512-8wPZ9L87m0vXNKuMWaYN7nz23Nx95yMEAFCZLrVgpvWahh+LyUho7TrHUQqzE3pGtlkhWDA64hqvuH8Sg75Jwg==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [ia32]
|
||||
os: [win32]
|
||||
|
||||
'@tauri-apps/cli-win32-x64-msvc@2.0.0-beta.16':
|
||||
resolution: {integrity: sha512-rrJeC7eAT6diQpnI3aaflhvtKyTryywbhHLG/c1QyPhdxA7Or6nflo5KzWLd6q3GQqKRbvz5dDtxwFn+XLo+rQ==}
|
||||
'@tauri-apps/cli-win32-x64-msvc@2.0.0-beta.18':
|
||||
resolution: {integrity: sha512-x31LCiExR1cS/xXNs1AJEDEM7dtoE3tYWy6u7Kcl1bQBWZV5AAEofRhO1iztWCNdOm2Ddvc/Ugb8Q2khAu7+iw==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
|
||||
'@tauri-apps/cli@2.0.0-beta.16':
|
||||
resolution: {integrity: sha512-ELaPqTekAVfTU4lFf7k/Z422DKXk/uDWi7ppI8TuQOqcXjrxlXMvv/Y1eC2tem9vMeuOIU0Jg53pOhOu0w8JIQ==}
|
||||
'@tauri-apps/cli@2.0.0-beta.18':
|
||||
resolution: {integrity: sha512-VcuvIyKsGVygUX1sIZmyCinzfudhcgzkFY8c9UBTbpf2/dtJADqqKEirsTXa/XPvWK64weyHFpr+i1uL7zopsg==}
|
||||
engines: {node: '>= 10'}
|
||||
hasBin: true
|
||||
|
||||
|
@ -15817,13 +15786,13 @@ snapshots:
|
|||
'@types/yargs': 17.0.32
|
||||
chalk: 4.1.2
|
||||
|
||||
'@joshwooding/vite-plugin-react-docgen-typescript@0.3.0(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2))':
|
||||
'@joshwooding/vite-plugin-react-docgen-typescript@0.3.0(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2))':
|
||||
dependencies:
|
||||
glob: 7.2.3
|
||||
glob-promise: 4.2.2(glob@7.2.3)
|
||||
magic-string: 0.27.0
|
||||
react-docgen-typescript: 2.2.2(typescript@5.4.2)
|
||||
vite: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)
|
||||
vite: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)
|
||||
optionalDependencies:
|
||||
typescript: 5.4.2
|
||||
|
||||
|
@ -16238,16 +16207,10 @@ snapshots:
|
|||
'@tanstack/react-query': 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0)
|
||||
react: 18.2.0
|
||||
|
||||
'@oscartbeaumont-sd/rspc-react@0.0.0-main-dc31e5b2(@oscartbeaumont-sd/rspc-client@0.0.0-main-dc31e5b2)(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)':
|
||||
'@oscartbeaumont-sd/rspc-tauri@0.0.0-main-dc31e5b2(patch_hash=3ozd223mr7o4cioyf7af7qd56a)(@tauri-apps/api@2.0.0-beta.12)':
|
||||
dependencies:
|
||||
'@oscartbeaumont-sd/rspc-client': 0.0.0-main-dc31e5b2
|
||||
'@tanstack/react-query': 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0)
|
||||
react: 18.2.0
|
||||
|
||||
'@oscartbeaumont-sd/rspc-tauri@0.0.0-main-dc31e5b2(patch_hash=3ozd223mr7o4cioyf7af7qd56a)(@tauri-apps/api@2.0.0-beta.11)':
|
||||
dependencies:
|
||||
'@oscartbeaumont-sd/rspc-client': 0.0.0-main-dc31e5b2
|
||||
'@tauri-apps/api': 2.0.0-beta.11
|
||||
'@tauri-apps/api': 2.0.0-beta.12
|
||||
|
||||
'@phosphor-icons/core@2.0.8': {}
|
||||
|
||||
|
@ -16315,10 +16278,6 @@ snapshots:
|
|||
dependencies:
|
||||
'@babel/runtime': 7.24.0
|
||||
|
||||
'@radix-ui/primitive@1.0.0':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.0
|
||||
|
||||
'@radix-ui/primitive@1.0.1':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.0
|
||||
|
@ -16363,11 +16322,6 @@ snapshots:
|
|||
'@types/react': 18.2.67
|
||||
'@types/react-dom': 18.2.22
|
||||
|
||||
'@radix-ui/react-compose-refs@1.0.0(react@18.2.0)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.0
|
||||
react: 18.2.0
|
||||
|
||||
'@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.67)(react@18.2.0)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.0
|
||||
|
@ -16427,17 +16381,6 @@ snapshots:
|
|||
optionalDependencies:
|
||||
'@types/react': 18.2.67
|
||||
|
||||
'@radix-ui/react-dismissable-layer@1.0.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.0
|
||||
'@radix-ui/primitive': 1.0.0
|
||||
'@radix-ui/react-compose-refs': 1.0.0(react@18.2.0)
|
||||
'@radix-ui/react-primitive': 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
|
||||
'@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0)
|
||||
'@radix-ui/react-use-escape-keydown': 1.0.2(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
'@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.0
|
||||
|
@ -16529,7 +16472,7 @@ snapshots:
|
|||
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.67)(react@18.2.0)
|
||||
'@radix-ui/react-context': 1.0.1(@types/react@18.2.67)(react@18.2.0)
|
||||
'@radix-ui/react-direction': 1.0.1(@types/react@18.2.67)(react@18.2.0)
|
||||
'@radix-ui/react-dismissable-layer': 1.0.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
|
||||
'@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
|
||||
'@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.67)(react@18.2.0)
|
||||
'@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
|
||||
'@radix-ui/react-id': 1.0.1(@types/react@18.2.67)(react@18.2.0)
|
||||
|
@ -16641,13 +16584,6 @@ snapshots:
|
|||
'@types/react': 18.2.67
|
||||
'@types/react-dom': 18.2.22
|
||||
|
||||
'@radix-ui/react-primitive@1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.0
|
||||
'@radix-ui/react-slot': 1.0.1(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
'@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.0
|
||||
|
@ -16756,12 +16692,6 @@ snapshots:
|
|||
'@types/react': 18.2.67
|
||||
'@types/react-dom': 18.2.22
|
||||
|
||||
'@radix-ui/react-slot@1.0.1(react@18.2.0)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.0
|
||||
'@radix-ui/react-compose-refs': 1.0.0(react@18.2.0)
|
||||
react: 18.2.0
|
||||
|
||||
'@radix-ui/react-slot@1.0.2(@types/react@18.2.67)(react@18.2.0)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.0
|
||||
|
@ -16845,11 +16775,6 @@ snapshots:
|
|||
'@types/react': 18.2.67
|
||||
'@types/react-dom': 18.2.22
|
||||
|
||||
'@radix-ui/react-use-callback-ref@1.0.0(react@18.2.0)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.0
|
||||
react: 18.2.0
|
||||
|
||||
'@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.67)(react@18.2.0)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.0
|
||||
|
@ -16865,12 +16790,6 @@ snapshots:
|
|||
optionalDependencies:
|
||||
'@types/react': 18.2.67
|
||||
|
||||
'@radix-ui/react-use-escape-keydown@1.0.2(react@18.2.0)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.0
|
||||
'@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0)
|
||||
react: 18.2.0
|
||||
|
||||
'@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.67)(react@18.2.0)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.0
|
||||
|
@ -17458,13 +17377,6 @@ snapshots:
|
|||
nullthrows: 1.1.1
|
||||
react-native: 0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0)
|
||||
|
||||
'@react-native/virtualized-lists@0.73.4(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))':
|
||||
dependencies:
|
||||
invariant: 2.2.4
|
||||
nullthrows: 1.1.1
|
||||
react-native: 0.73.4(@babel/core@7.24.0)(react@18.2.0)
|
||||
optional: true
|
||||
|
||||
'@react-navigation/bottom-tabs@6.5.20(@react-navigation/native@6.1.17(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0))(react-native-safe-area-context@4.8.2(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0))(react-native-screens@3.29.0(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0)':
|
||||
dependencies:
|
||||
'@react-navigation/elements': 1.3.30(@react-navigation/native@6.1.17(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0))(react-native-safe-area-context@4.8.2(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0)
|
||||
|
@ -17569,13 +17481,13 @@ snapshots:
|
|||
'@react-spring/types': 9.7.3
|
||||
react: 18.2.0
|
||||
|
||||
'@react-spring/three@9.6.1(@react-three/fiber@8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)))(expo@50.0.13(@babel/core@7.24.0))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0)(three@0.161.0))(react@18.2.0)(three@0.161.0)':
|
||||
'@react-spring/three@9.6.1(@react-three/fiber@8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0)(three@0.161.0))(react@18.2.0)(three@0.161.0)':
|
||||
dependencies:
|
||||
'@react-spring/animated': 9.6.1(react@18.2.0)
|
||||
'@react-spring/core': 9.6.1(react@18.2.0)
|
||||
'@react-spring/shared': 9.6.1(react@18.2.0)
|
||||
'@react-spring/types': 9.6.1
|
||||
'@react-three/fiber': 8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)))(expo@50.0.13(@babel/core@7.24.0))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0)(three@0.161.0)
|
||||
'@react-three/fiber': 8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0)(three@0.161.0)
|
||||
react: 18.2.0
|
||||
three: 0.161.0
|
||||
|
||||
|
@ -17592,12 +17504,12 @@ snapshots:
|
|||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
'@react-three/drei@9.102.6(@react-three/fiber@8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)))(expo@50.0.13(@babel/core@7.24.0))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0)(three@0.161.0))(@types/react@18.2.67)(@types/three@0.162.0)(immer@10.0.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(three@0.161.0)':
|
||||
'@react-three/drei@9.102.6(@react-three/fiber@8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0)(three@0.161.0))(@types/react@18.2.67)(@types/three@0.162.0)(immer@10.0.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(three@0.161.0)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.0
|
||||
'@mediapipe/tasks-vision': 0.10.8
|
||||
'@react-spring/three': 9.6.1(@react-three/fiber@8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)))(expo@50.0.13(@babel/core@7.24.0))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0)(three@0.161.0))(react@18.2.0)(three@0.161.0)
|
||||
'@react-three/fiber': 8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)))(expo@50.0.13(@babel/core@7.24.0))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0)(three@0.161.0)
|
||||
'@react-spring/three': 9.6.1(@react-three/fiber@8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0)(three@0.161.0))(react@18.2.0)(three@0.161.0)
|
||||
'@react-three/fiber': 8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0)(three@0.161.0)
|
||||
'@use-gesture/react': 10.3.0(react@18.2.0)
|
||||
camera-controls: 2.8.3(three@0.161.0)
|
||||
cross-env: 7.0.3
|
||||
|
@ -17625,7 +17537,7 @@ snapshots:
|
|||
- '@types/three'
|
||||
- immer
|
||||
|
||||
'@react-three/fiber@8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)))(expo@50.0.13(@babel/core@7.24.0))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0)(three@0.161.0)':
|
||||
'@react-three/fiber@8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0)(three@0.161.0)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.0
|
||||
'@types/react-reconciler': 0.26.7
|
||||
|
@ -17641,11 +17553,11 @@ snapshots:
|
|||
three: 0.161.0
|
||||
zustand: 3.7.2(react@18.2.0)
|
||||
optionalDependencies:
|
||||
expo: 50.0.13(@babel/core@7.24.0)
|
||||
expo-asset: 9.0.2(expo@50.0.13(@babel/core@7.24.0))
|
||||
expo-file-system: 16.0.8(expo@50.0.13(@babel/core@7.24.0))
|
||||
expo: 50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))
|
||||
expo-asset: 9.0.2(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))))
|
||||
expo-file-system: 16.0.8(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))))
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
react-native: 0.73.4(@babel/core@7.24.0)(react@18.2.0)
|
||||
react-native: 0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0)
|
||||
|
||||
'@redux-devtools/extension@3.3.0(redux@5.0.1)':
|
||||
dependencies:
|
||||
|
@ -18089,7 +18001,7 @@ snapshots:
|
|||
- encoding
|
||||
- supports-color
|
||||
|
||||
'@storybook/builder-vite@8.0.1(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2))':
|
||||
'@storybook/builder-vite@8.0.1(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2))':
|
||||
dependencies:
|
||||
'@storybook/channels': 8.0.1
|
||||
'@storybook/client-logger': 8.0.1
|
||||
|
@ -18108,7 +18020,7 @@ snapshots:
|
|||
fs-extra: 11.2.0
|
||||
magic-string: 0.30.8
|
||||
ts-dedent: 2.2.0
|
||||
vite: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)
|
||||
vite: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)
|
||||
optionalDependencies:
|
||||
typescript: 5.4.2
|
||||
transitivePeerDependencies:
|
||||
|
@ -18406,11 +18318,11 @@ snapshots:
|
|||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
'@storybook/react-vite@8.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.13.0)(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2))':
|
||||
'@storybook/react-vite@8.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.13.0)(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2))':
|
||||
dependencies:
|
||||
'@joshwooding/vite-plugin-react-docgen-typescript': 0.3.0(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2))
|
||||
'@joshwooding/vite-plugin-react-docgen-typescript': 0.3.0(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2))
|
||||
'@rollup/pluginutils': 5.1.0(rollup@4.13.0)
|
||||
'@storybook/builder-vite': 8.0.1(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2))
|
||||
'@storybook/builder-vite': 8.0.1(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2))
|
||||
'@storybook/node-logger': 8.0.1
|
||||
'@storybook/react': 8.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.4.2)
|
||||
find-up: 5.0.0
|
||||
|
@ -18420,7 +18332,7 @@ snapshots:
|
|||
react-dom: 18.2.0(react@18.2.0)
|
||||
resolve: 1.22.8
|
||||
tsconfig-paths: 4.2.0
|
||||
vite: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)
|
||||
vite: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)
|
||||
transitivePeerDependencies:
|
||||
- '@preact/preset-vite'
|
||||
- encoding
|
||||
|
@ -18706,10 +18618,10 @@ snapshots:
|
|||
|
||||
'@tanstack/query-core@5.28.4': {}
|
||||
|
||||
'@tanstack/react-query-devtools@4.36.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
|
||||
'@tanstack/react-query-devtools@4.36.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
|
||||
dependencies:
|
||||
'@tanstack/match-sorter-utils': 8.11.8
|
||||
'@tanstack/react-query': 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0)
|
||||
'@tanstack/react-query': 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
superjson: 1.13.3
|
||||
|
@ -18724,15 +18636,6 @@ snapshots:
|
|||
react-dom: 18.2.0(react@18.2.0)
|
||||
react-native: 0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0)
|
||||
|
||||
'@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0)':
|
||||
dependencies:
|
||||
'@tanstack/query-core': 4.36.1
|
||||
react: 18.2.0
|
||||
use-sync-external-store: 1.2.0(react@18.2.0)
|
||||
optionalDependencies:
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
react-native: 0.73.4(@babel/core@7.24.0)(react@18.2.0)
|
||||
|
||||
'@tanstack/react-table@8.13.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
|
||||
dependencies:
|
||||
'@tanstack/table-core': 8.13.2
|
||||
|
@ -18763,48 +18666,50 @@ snapshots:
|
|||
|
||||
'@tauri-apps/api@2.0.0-beta.11': {}
|
||||
|
||||
'@tauri-apps/cli-darwin-arm64@2.0.0-beta.16':
|
||||
'@tauri-apps/api@2.0.0-beta.12': {}
|
||||
|
||||
'@tauri-apps/cli-darwin-arm64@2.0.0-beta.18':
|
||||
optional: true
|
||||
|
||||
'@tauri-apps/cli-darwin-x64@2.0.0-beta.16':
|
||||
'@tauri-apps/cli-darwin-x64@2.0.0-beta.18':
|
||||
optional: true
|
||||
|
||||
'@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-beta.16':
|
||||
'@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-beta.18':
|
||||
optional: true
|
||||
|
||||
'@tauri-apps/cli-linux-arm64-gnu@2.0.0-beta.16':
|
||||
'@tauri-apps/cli-linux-arm64-gnu@2.0.0-beta.18':
|
||||
optional: true
|
||||
|
||||
'@tauri-apps/cli-linux-arm64-musl@2.0.0-beta.16':
|
||||
'@tauri-apps/cli-linux-arm64-musl@2.0.0-beta.18':
|
||||
optional: true
|
||||
|
||||
'@tauri-apps/cli-linux-x64-gnu@2.0.0-beta.16':
|
||||
'@tauri-apps/cli-linux-x64-gnu@2.0.0-beta.18':
|
||||
optional: true
|
||||
|
||||
'@tauri-apps/cli-linux-x64-musl@2.0.0-beta.16':
|
||||
'@tauri-apps/cli-linux-x64-musl@2.0.0-beta.18':
|
||||
optional: true
|
||||
|
||||
'@tauri-apps/cli-win32-arm64-msvc@2.0.0-beta.16':
|
||||
'@tauri-apps/cli-win32-arm64-msvc@2.0.0-beta.18':
|
||||
optional: true
|
||||
|
||||
'@tauri-apps/cli-win32-ia32-msvc@2.0.0-beta.16':
|
||||
'@tauri-apps/cli-win32-ia32-msvc@2.0.0-beta.18':
|
||||
optional: true
|
||||
|
||||
'@tauri-apps/cli-win32-x64-msvc@2.0.0-beta.16':
|
||||
'@tauri-apps/cli-win32-x64-msvc@2.0.0-beta.18':
|
||||
optional: true
|
||||
|
||||
'@tauri-apps/cli@2.0.0-beta.16':
|
||||
'@tauri-apps/cli@2.0.0-beta.18':
|
||||
optionalDependencies:
|
||||
'@tauri-apps/cli-darwin-arm64': 2.0.0-beta.16
|
||||
'@tauri-apps/cli-darwin-x64': 2.0.0-beta.16
|
||||
'@tauri-apps/cli-linux-arm-gnueabihf': 2.0.0-beta.16
|
||||
'@tauri-apps/cli-linux-arm64-gnu': 2.0.0-beta.16
|
||||
'@tauri-apps/cli-linux-arm64-musl': 2.0.0-beta.16
|
||||
'@tauri-apps/cli-linux-x64-gnu': 2.0.0-beta.16
|
||||
'@tauri-apps/cli-linux-x64-musl': 2.0.0-beta.16
|
||||
'@tauri-apps/cli-win32-arm64-msvc': 2.0.0-beta.16
|
||||
'@tauri-apps/cli-win32-ia32-msvc': 2.0.0-beta.16
|
||||
'@tauri-apps/cli-win32-x64-msvc': 2.0.0-beta.16
|
||||
'@tauri-apps/cli-darwin-arm64': 2.0.0-beta.18
|
||||
'@tauri-apps/cli-darwin-x64': 2.0.0-beta.18
|
||||
'@tauri-apps/cli-linux-arm-gnueabihf': 2.0.0-beta.18
|
||||
'@tauri-apps/cli-linux-arm64-gnu': 2.0.0-beta.18
|
||||
'@tauri-apps/cli-linux-arm64-musl': 2.0.0-beta.18
|
||||
'@tauri-apps/cli-linux-x64-gnu': 2.0.0-beta.18
|
||||
'@tauri-apps/cli-linux-x64-musl': 2.0.0-beta.18
|
||||
'@tauri-apps/cli-win32-arm64-msvc': 2.0.0-beta.18
|
||||
'@tauri-apps/cli-win32-ia32-msvc': 2.0.0-beta.18
|
||||
'@tauri-apps/cli-win32-x64-msvc': 2.0.0-beta.18
|
||||
|
||||
'@tauri-apps/plugin-dialog@2.0.0-beta.3':
|
||||
dependencies:
|
||||
|
@ -19504,10 +19409,10 @@ snapshots:
|
|||
|
||||
'@virtual-grid/shared@2.0.1': {}
|
||||
|
||||
'@vitejs/plugin-react-swc@3.6.0(@swc/helpers@0.5.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2))':
|
||||
'@vitejs/plugin-react-swc@3.6.0(@swc/helpers@0.5.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2))':
|
||||
dependencies:
|
||||
'@swc/core': 1.4.8(@swc/helpers@0.5.2)
|
||||
vite: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)
|
||||
vite: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)
|
||||
transitivePeerDependencies:
|
||||
- '@swc/helpers'
|
||||
|
||||
|
@ -22202,19 +22107,6 @@ snapshots:
|
|||
- expo
|
||||
- supports-color
|
||||
|
||||
expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)):
|
||||
dependencies:
|
||||
'@react-native/assets-registry': 0.73.1
|
||||
blueimp-md5: 2.19.0
|
||||
expo-constants: 15.4.5(expo@50.0.13(@babel/core@7.24.0))
|
||||
expo-file-system: 16.0.8(expo@50.0.13(@babel/core@7.24.0))
|
||||
invariant: 2.2.4
|
||||
md5-file: 3.2.3
|
||||
transitivePeerDependencies:
|
||||
- expo
|
||||
- supports-color
|
||||
optional: true
|
||||
|
||||
expo-av@13.10.5(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))):
|
||||
dependencies:
|
||||
expo: 50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))
|
||||
|
@ -22236,34 +22128,15 @@ snapshots:
|
|||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
expo-constants@15.4.5(expo@50.0.13(@babel/core@7.24.0)):
|
||||
dependencies:
|
||||
'@expo/config': 8.5.4
|
||||
expo: 50.0.13(@babel/core@7.24.0)
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
optional: true
|
||||
|
||||
expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))):
|
||||
dependencies:
|
||||
expo: 50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))
|
||||
|
||||
expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)):
|
||||
dependencies:
|
||||
expo: 50.0.13(@babel/core@7.24.0)
|
||||
optional: true
|
||||
|
||||
expo-font@11.10.3(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))):
|
||||
dependencies:
|
||||
expo: 50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))
|
||||
fontfaceobserver: 2.3.0
|
||||
|
||||
expo-font@11.10.3(expo@50.0.13(@babel/core@7.24.0)):
|
||||
dependencies:
|
||||
expo: 50.0.13(@babel/core@7.24.0)
|
||||
fontfaceobserver: 2.3.0
|
||||
optional: true
|
||||
|
||||
expo-haptics@12.8.1(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))):
|
||||
dependencies:
|
||||
expo: 50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))
|
||||
|
@ -22277,11 +22150,6 @@ snapshots:
|
|||
dependencies:
|
||||
expo: 50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))
|
||||
|
||||
expo-keep-awake@12.8.2(expo@50.0.13(@babel/core@7.24.0)):
|
||||
dependencies:
|
||||
expo: 50.0.13(@babel/core@7.24.0)
|
||||
optional: true
|
||||
|
||||
expo-linking@6.2.2(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))):
|
||||
dependencies:
|
||||
expo-constants: 15.4.5(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))))
|
||||
|
@ -22320,33 +22188,6 @@ snapshots:
|
|||
|
||||
expo-status-bar@1.11.1: {}
|
||||
|
||||
expo@50.0.13(@babel/core@7.24.0):
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.0
|
||||
'@expo/cli': 0.17.8(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))(expo-modules-autolinking@1.10.3)
|
||||
'@expo/config': 8.5.4
|
||||
'@expo/config-plugins': 7.8.4
|
||||
'@expo/metro-config': 0.17.6(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))
|
||||
'@expo/vector-icons': 14.0.0
|
||||
babel-preset-expo: 10.0.1(@babel/core@7.24.0)
|
||||
expo-asset: 9.0.2(expo@50.0.13(@babel/core@7.24.0))
|
||||
expo-file-system: 16.0.8(expo@50.0.13(@babel/core@7.24.0))
|
||||
expo-font: 11.10.3(expo@50.0.13(@babel/core@7.24.0))
|
||||
expo-keep-awake: 12.8.2(expo@50.0.13(@babel/core@7.24.0))
|
||||
expo-modules-autolinking: 1.10.3
|
||||
expo-modules-core: 1.11.12
|
||||
fbemitter: 3.0.0
|
||||
whatwg-url-without-unicode: 8.0.0-3
|
||||
transitivePeerDependencies:
|
||||
- '@babel/core'
|
||||
- '@react-native/babel-preset'
|
||||
- bluebird
|
||||
- bufferutil
|
||||
- encoding
|
||||
- supports-color
|
||||
- utf-8-validate
|
||||
optional: true
|
||||
|
||||
expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))):
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.0
|
||||
|
@ -26368,7 +26209,7 @@ snapshots:
|
|||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
react-i18next@13.5.0(i18next@23.10.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0):
|
||||
react-i18next@13.5.0(i18next@23.10.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0):
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.0
|
||||
html-parse-stringify: 3.0.1
|
||||
|
@ -26376,7 +26217,7 @@ snapshots:
|
|||
react: 18.2.0
|
||||
optionalDependencies:
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
react-native: 0.73.4(@babel/core@7.24.0)(react@18.2.0)
|
||||
react-native: 0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0)
|
||||
|
||||
react-intersection-observer@9.8.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
|
||||
dependencies:
|
||||
|
@ -26629,56 +26470,6 @@ snapshots:
|
|||
- supports-color
|
||||
- utf-8-validate
|
||||
|
||||
react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0):
|
||||
dependencies:
|
||||
'@jest/create-cache-key-function': 29.7.0
|
||||
'@react-native-community/cli': 12.3.2
|
||||
'@react-native-community/cli-platform-android': 12.3.2
|
||||
'@react-native-community/cli-platform-ios': 12.3.2
|
||||
'@react-native/assets-registry': 0.73.1
|
||||
'@react-native/codegen': 0.73.3(@babel/preset-env@7.24.0(@babel/core@7.24.0))
|
||||
'@react-native/community-cli-plugin': 0.73.16(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))
|
||||
'@react-native/gradle-plugin': 0.73.4
|
||||
'@react-native/js-polyfills': 0.73.1
|
||||
'@react-native/normalize-colors': 0.73.2
|
||||
'@react-native/virtualized-lists': 0.73.4(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))
|
||||
abort-controller: 3.0.0
|
||||
anser: 1.4.10
|
||||
ansi-regex: 5.0.1
|
||||
base64-js: 1.5.1
|
||||
chalk: 4.1.2
|
||||
deprecated-react-native-prop-types: 5.0.0
|
||||
event-target-shim: 5.0.1
|
||||
flow-enums-runtime: 0.0.6
|
||||
invariant: 2.2.4
|
||||
jest-environment-node: 29.7.0
|
||||
jsc-android: 250231.0.0
|
||||
memoize-one: 5.2.1
|
||||
metro-runtime: 0.80.6
|
||||
metro-source-map: 0.80.6
|
||||
mkdirp: 0.5.6
|
||||
nullthrows: 1.1.1
|
||||
pretty-format: 26.6.2
|
||||
promise: 8.3.0
|
||||
react: 18.2.0
|
||||
react-devtools-core: 4.28.5
|
||||
react-refresh: 0.14.0
|
||||
react-shallow-renderer: 16.15.0(react@18.2.0)
|
||||
regenerator-runtime: 0.13.11
|
||||
scheduler: 0.24.0-canary-efb381bbf-20230505
|
||||
stacktrace-parser: 0.1.10
|
||||
whatwg-fetch: 3.6.20
|
||||
ws: 6.2.2
|
||||
yargs: 17.7.2
|
||||
transitivePeerDependencies:
|
||||
- '@babel/core'
|
||||
- '@babel/preset-env'
|
||||
- bufferutil
|
||||
- encoding
|
||||
- supports-color
|
||||
- utf-8-validate
|
||||
optional: true
|
||||
|
||||
react-reconciler@0.27.0(react@18.2.0):
|
||||
dependencies:
|
||||
loose-envify: 1.4.0
|
||||
|
@ -28708,7 +28499,7 @@ snapshots:
|
|||
unist-util-stringify-position: 4.0.0
|
||||
vfile-message: 4.0.2
|
||||
|
||||
vite-plugin-html@3.2.2(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)):
|
||||
vite-plugin-html@3.2.2(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)):
|
||||
dependencies:
|
||||
'@rollup/pluginutils': 4.2.1
|
||||
colorette: 2.0.20
|
||||
|
@ -28722,9 +28513,9 @@ snapshots:
|
|||
html-minifier-terser: 6.1.0
|
||||
node-html-parser: 5.4.2
|
||||
pathe: 0.2.0
|
||||
vite: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)
|
||||
vite: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)
|
||||
|
||||
vite-plugin-i18next-loader@2.0.12(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)):
|
||||
vite-plugin-i18next-loader@2.0.12(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)):
|
||||
dependencies:
|
||||
dot-prop: 8.0.2
|
||||
glob-all: 3.3.1
|
||||
|
@ -28732,9 +28523,9 @@ snapshots:
|
|||
marked: 12.0.1
|
||||
marked-terminal: 7.0.0(marked@12.0.1)
|
||||
ts-deepmerge: 7.0.0
|
||||
vite: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)
|
||||
vite: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)
|
||||
|
||||
vite-plugin-inspect@0.8.3(rollup@4.13.0)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)):
|
||||
vite-plugin-inspect@0.8.3(rollup@4.13.0)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)):
|
||||
dependencies:
|
||||
'@antfu/utils': 0.7.7
|
||||
'@rollup/pluginutils': 5.1.0(rollup@4.13.0)
|
||||
|
@ -28745,12 +28536,12 @@ snapshots:
|
|||
perfect-debounce: 1.0.0
|
||||
picocolors: 1.0.0
|
||||
sirv: 2.0.4
|
||||
vite: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)
|
||||
vite: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)
|
||||
transitivePeerDependencies:
|
||||
- rollup
|
||||
- supports-color
|
||||
|
||||
vite-plugin-solid@2.10.2(@testing-library/jest-dom@6.4.2)(solid-js@1.8.15)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)):
|
||||
vite-plugin-solid@2.10.2(@testing-library/jest-dom@6.4.2)(solid-js@1.8.15)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)):
|
||||
dependencies:
|
||||
'@babel/core': 7.24.0
|
||||
'@types/babel__core': 7.20.5
|
||||
|
@ -28758,36 +28549,36 @@ snapshots:
|
|||
merge-anything: 5.1.7
|
||||
solid-js: 1.8.15
|
||||
solid-refresh: 0.6.3(solid-js@1.8.15)
|
||||
vite: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)
|
||||
vitefu: 0.2.5(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2))
|
||||
vite: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)
|
||||
vitefu: 0.2.5(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2))
|
||||
optionalDependencies:
|
||||
'@testing-library/jest-dom': 6.4.2
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
vite-plugin-svgr@3.3.0(rollup@4.13.0)(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)):
|
||||
vite-plugin-svgr@3.3.0(rollup@4.13.0)(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)):
|
||||
dependencies:
|
||||
'@rollup/pluginutils': 5.1.0(rollup@4.13.0)
|
||||
'@svgr/core': 8.1.0(typescript@5.4.2)
|
||||
'@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.4.2))
|
||||
vite: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)
|
||||
vite: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)
|
||||
transitivePeerDependencies:
|
||||
- rollup
|
||||
- supports-color
|
||||
- typescript
|
||||
|
||||
vite-tsconfig-paths@4.3.2(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)):
|
||||
vite-tsconfig-paths@4.3.2(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)):
|
||||
dependencies:
|
||||
debug: 4.3.4(supports-color@8.1.1)
|
||||
globrex: 0.1.2
|
||||
tsconfck: 3.0.3(typescript@5.4.2)
|
||||
optionalDependencies:
|
||||
vite: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)
|
||||
vite: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
- typescript
|
||||
|
||||
vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2):
|
||||
vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2):
|
||||
dependencies:
|
||||
esbuild: 0.19.12
|
||||
postcss: 8.4.36
|
||||
|
@ -28795,12 +28586,13 @@ snapshots:
|
|||
optionalDependencies:
|
||||
'@types/node': 20.11.29
|
||||
fsevents: 2.3.3
|
||||
lightningcss: 1.19.0
|
||||
sass: 1.72.0
|
||||
terser: 5.29.2
|
||||
|
||||
vitefu@0.2.5(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)):
|
||||
vitefu@0.2.5(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)):
|
||||
optionalDependencies:
|
||||
vite: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)
|
||||
vite: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)
|
||||
|
||||
vlq@1.0.1: {}
|
||||
|
||||
|
|
Loading…
Reference in a new issue