mirror of
https://github.com/spacedriveapp/spacedrive
synced 2024-06-30 09:03:27 +00:00
Compare commits
5 commits
6b7837a986
...
944fad2115
Author | SHA1 | Date | |
---|---|---|---|
|
944fad2115 | ||
|
2e00af3c4b | ||
|
1d9013f28c | ||
|
2554cfab3c | ||
|
6cd3d76def |
BIN
apps/landing/public/images/team/haden.jpg
Normal file
BIN
apps/landing/public/images/team/haden.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 62 KiB |
BIN
apps/landing/public/images/team/matheus.jpg
Normal file
BIN
apps/landing/public/images/team/matheus.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 57 KiB |
BIN
apps/landing/public/images/team/valerie.jpeg
Normal file
BIN
apps/landing/public/images/team/valerie.jpeg
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 MiB |
|
@ -13,24 +13,50 @@ export const teamMembers: Array<TeamMemberProps> = [
|
|||
}
|
||||
},
|
||||
{
|
||||
name: 'Utku Bakır',
|
||||
location: 'Toronto, Canada',
|
||||
role: 'Product Manager & TypeScript Engineer',
|
||||
imageUrl: '/images/team/utku.jpg',
|
||||
socials: {
|
||||
github: 'https://github.com/utkubakir'
|
||||
}
|
||||
name: 'Valerie Wong',
|
||||
location: 'Vancouver, Canada',
|
||||
role: 'Director of Operations',
|
||||
imageUrl: '/images/team/valerie.jpeg',
|
||||
},
|
||||
{
|
||||
name: 'Ericson Soares',
|
||||
location: 'Rio de Janeiro, Brazil',
|
||||
role: 'Rust Engineer - Core & VDFS',
|
||||
role: 'Head of Engineering - Rust',
|
||||
imageUrl: '/images/team/ericson.jpg',
|
||||
socials: {
|
||||
twitter: 'https://x.com/fogodev',
|
||||
github: 'https://github.com/fogodev'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'Ameer Al Ashhab',
|
||||
location: 'Amman, Jordan',
|
||||
role: 'Product Manager & TypeScript Engineer - Interface Design',
|
||||
imageUrl: '/images/team/ameer.jpg',
|
||||
socials: {
|
||||
github: 'https://github.com/ameer2468'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'Matheus Consoli',
|
||||
location: 'São Paulo, Brazil',
|
||||
role: 'Rust Engineer',
|
||||
imageUrl: '/images/team/matheus.jpg',
|
||||
socials: {
|
||||
github: 'https://github.com/matheus-consoli',
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'Vítor Vasconcellos',
|
||||
location: 'Rio de Janeiro, Brazil',
|
||||
role: 'Fullstack Devops Engineer',
|
||||
imageUrl: '/images/team/vitor.jpg',
|
||||
socials: {
|
||||
github: 'https://github.com/HeavenVolkoff',
|
||||
gitlab: 'https://gitlab.com/VitorVasconcellos',
|
||||
twitter: 'https://x.com/vasvas10'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'Mihail Dounaev',
|
||||
location: 'Finland',
|
||||
|
@ -41,26 +67,6 @@ export const teamMembers: Array<TeamMemberProps> = [
|
|||
dribbble: 'https://dribbble.com/mmmint'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'Ameer Al Ashhab',
|
||||
location: 'Jordan',
|
||||
role: 'TypeScript Engineer - Interface Design',
|
||||
imageUrl: '/images/team/ameer.jpg',
|
||||
socials: {
|
||||
github: 'https://github.com/ameer2468'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'Vítor Vasconcellos',
|
||||
location: 'Rio de Janeiro, Brazil',
|
||||
role: 'TypeScript Engineer',
|
||||
imageUrl: '/images/team/vitor.jpg',
|
||||
socials: {
|
||||
github: 'https://github.com/HeavenVolkoff',
|
||||
gitlab: 'https://gitlab.com/VitorVasconcellos',
|
||||
twitter: 'https://x.com/vasvas10'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'Matthew Yung',
|
||||
location: 'Vancouver, Canada',
|
||||
|
|
|
@ -98,6 +98,20 @@ file_path::select!(file_path_to_isolate_with_id {
|
|||
name
|
||||
extension
|
||||
});
|
||||
file_path::select!(file_path_sisters {
|
||||
id
|
||||
materialized_path
|
||||
is_dir
|
||||
name
|
||||
extension
|
||||
cas_id
|
||||
integrity_checksum
|
||||
location: select {
|
||||
id
|
||||
path
|
||||
name
|
||||
}
|
||||
});
|
||||
file_path::select!(file_path_walker {
|
||||
pub_id
|
||||
location_id
|
||||
|
|
|
@ -17,7 +17,7 @@ use crate::{
|
|||
use sd_core_file_path_helper::{FilePathError, IsolatedFilePathData};
|
||||
use sd_core_heavy_lifting::media_processor::{exif_media_data, ffmpeg_media_data};
|
||||
use sd_core_prisma_helpers::{
|
||||
file_path_to_isolate, file_path_to_isolate_with_id, object_with_file_paths,
|
||||
file_path_sisters, file_path_to_isolate, file_path_to_isolate_with_id, object_with_file_paths,
|
||||
object_with_media_data,
|
||||
};
|
||||
|
||||
|
@ -32,6 +32,7 @@ use sd_sync::OperationFactory;
|
|||
use sd_utils::{db::maybe_missing, error::FileIOError, msgpack};
|
||||
|
||||
use std::{
|
||||
collections::HashSet,
|
||||
ffi::OsString,
|
||||
path::{Path, PathBuf},
|
||||
sync::Arc,
|
||||
|
@ -171,6 +172,32 @@ pub(crate) fn mount() -> AlphaRouter<Ctx> {
|
|||
.map(|str| str.to_string()))
|
||||
})
|
||||
})
|
||||
.procedure("getDuplicates", {
|
||||
R.with2(library())
|
||||
.query(|(_, library), object_id: i32| async move {
|
||||
let file_paths = library
|
||||
.db
|
||||
.file_path()
|
||||
.find_many(vec![file_path::object_id::equals(Some(object_id))])
|
||||
.select(file_path_sisters::select())
|
||||
.exec()
|
||||
.await?;
|
||||
|
||||
let mut unique_location_ids = HashSet::new();
|
||||
let locations: Vec<_> =
|
||||
file_paths
|
||||
.clone()
|
||||
.into_iter()
|
||||
.filter_map(|file_path| {
|
||||
file_path.location.as_ref().cloned().filter(|location| {
|
||||
unique_location_ids.insert(location.id.clone())
|
||||
})
|
||||
})
|
||||
.collect();
|
||||
|
||||
Ok((locations, file_paths))
|
||||
})
|
||||
})
|
||||
.procedure("setNote", {
|
||||
#[derive(Type, Deserialize)]
|
||||
pub struct SetNoteArgs {
|
||||
|
|
|
@ -12,6 +12,20 @@ import {
|
|||
Icon as PhosphorIcon,
|
||||
Snowflake
|
||||
} from '@phosphor-icons/react';
|
||||
import clsx from 'clsx';
|
||||
import dayjs from 'dayjs';
|
||||
import {
|
||||
forwardRef,
|
||||
useCallback,
|
||||
useEffect,
|
||||
useMemo,
|
||||
useState,
|
||||
type HTMLAttributes,
|
||||
type ReactNode
|
||||
} from 'react';
|
||||
import { useLocation } from 'react-router';
|
||||
import { Link as NavLink } from 'react-router-dom';
|
||||
import Sticky from 'react-sticky-el';
|
||||
import {
|
||||
FilePath,
|
||||
FilePathForFrontend,
|
||||
|
@ -28,20 +42,6 @@ import {
|
|||
type ExplorerItem
|
||||
} from '@sd/client';
|
||||
import { Button, Divider, DropdownMenu, toast, Tooltip, tw } from '@sd/ui';
|
||||
import clsx from 'clsx';
|
||||
import dayjs from 'dayjs';
|
||||
import {
|
||||
forwardRef,
|
||||
useCallback,
|
||||
useEffect,
|
||||
useMemo,
|
||||
useState,
|
||||
type HTMLAttributes,
|
||||
type ReactNode
|
||||
} from 'react';
|
||||
import { useLocation } from 'react-router';
|
||||
import { Link as NavLink } from 'react-router-dom';
|
||||
import Sticky from 'react-sticky-el';
|
||||
import { LibraryIdParamsSchema } from '~/app/route-schemas';
|
||||
import { Folder, Icon } from '~/components';
|
||||
import { useLocale, useZodRouteParams } from '~/hooks';
|
||||
|
@ -233,6 +233,10 @@ export const SingleItemMetadata = ({ item }: { item: ExplorerItem }) => {
|
|||
enabled: filePathData != null && readyToFetch
|
||||
});
|
||||
|
||||
const duplicateFilePaths = useLibraryQuery(['files.getDuplicates', objectData?.id ?? -1], {
|
||||
enabled: objectData != null && readyToFetch
|
||||
});
|
||||
|
||||
const filesMediaData = useLibraryQuery(['files.getMediaData', objectData?.id ?? -1], {
|
||||
enabled: objectData != null && readyToFetch
|
||||
});
|
||||
|
@ -526,7 +530,6 @@ const MultiItemMetadata = ({ items }: { items: ExplorerItem[] }) => {
|
|||
const onlyNonIndexed = metadata.types.has('NonIndexedPath') && metadata.types.size === 1;
|
||||
const filesSize = humanizeSize(metadata.size);
|
||||
|
||||
|
||||
return (
|
||||
<>
|
||||
<MetaContainer>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"about": "关于",
|
||||
"about_vision_text": "我们很多人拥有不止一个云账户,磁盘没有备份,数据也有丢失的风险。我们依赖于像 Google 相册、iCloud 这样的云服务,但是它们容量有限,且互操作性几乎为零,云服务和操作系统之间也无法协作。我们的照片不应该困在单一一种生态系统中,也不应该被用于广告营销而被收割。它们应该与操作系统无关、永久保存、由我们自己所有。我们创造的数据是我们的遗产,它们的寿命会比我们还要长。开源技术是唯一能确保我们绝对控制定义我们生活的数据,并在无限规模上保留这些定义了我们的生活的数据的方式。",
|
||||
"about_vision_text": "我们很多人拥有不止一个云账户,磁盘没有备份,数据也有丢失的风险。我们依赖于像 Google 相册、iCloud 这样的云服务,但是它们容量有限,且互操作性几乎为零,云服务和操作系统之间也无法协作。我们的照片不应该困在单一一种生态系统中,也不应该被用于广告营销而被收割,它们应该与操作系统无关、永久保存、由我们自己所有。我们创造的数据是我们的遗产,它们的寿命会比我们还要长,无限地定义了我们的生活,而开源技术是唯一能确保我们绝对控制这些数据的方式",
|
||||
"about_vision_title": "项目远景",
|
||||
"accept": "接受",
|
||||
"accept_files": "Accept files",
|
||||
|
@ -128,7 +128,7 @@
|
|||
"cut": "剪切",
|
||||
"cut_object": "剪切对象",
|
||||
"cut_success": "剪切项目",
|
||||
"dark": "暗色",
|
||||
"dark": "深色",
|
||||
"data_folder": "数据文件夹",
|
||||
"database": "Database",
|
||||
"date": "日期",
|
||||
|
@ -302,7 +302,7 @@
|
|||
"got_it": "我知道了",
|
||||
"grid_gap": "间隙",
|
||||
"grid_view": "网格视图",
|
||||
"grid_view_notice_description": "通过网格视图直观地了解您的文件。这种视图以缩略图形式显示您的文件和文件夹,方便您快速识别所寻找的文件。",
|
||||
"grid_view_notice_description": "网格视图以缩略图形式显示文件和文件夹,以便直观、快速识别要寻找的文件。",
|
||||
"hidden": "隐",
|
||||
"hidden_label": "阻止位置及其内容出现在汇总分类、搜索和标签中,除非启用了“显示隐藏项目”。",
|
||||
"hide_in_library_search": "在库搜索中隐藏",
|
||||
|
@ -327,7 +327,7 @@
|
|||
"indexer_rules_error": "Error while retrieving indexer rules",
|
||||
"indexer_rules_info": "索引器规则允许您使用通配符指定要忽略的路径。",
|
||||
"indexer_rules_not_available": "No indexer rules available",
|
||||
"ingester": "摄取者",
|
||||
"ingester": "同步接收器",
|
||||
"ingester_description": "此过程接收接收到的云操作并将它们发送到主同步接收器。",
|
||||
"injester_description": "此过程从 P2P 连接和 Spacedrive Cloud 获取同步操作,并将其应用到库。",
|
||||
"install": "安装",
|
||||
|
@ -360,7 +360,7 @@
|
|||
"key_manager": "密钥管理器",
|
||||
"key_manager_description": "创建加密密钥,挂载和卸载密钥以即时查看解密文件。",
|
||||
"keybinds": "快捷键",
|
||||
"keybinds_description": "查看和管理客户端快捷键",
|
||||
"keybinds_description": "查看、管理客户端快捷键",
|
||||
"keys": "密钥",
|
||||
"kilometers": "千米",
|
||||
"kind": "种类",
|
||||
|
@ -641,7 +641,7 @@
|
|||
"spacedrop_everyone": "所有人",
|
||||
"spacedrop_rejected": "Spacedrop 被拒绝",
|
||||
"square_thumbnails": "方形缩略图",
|
||||
"star_on_github": "在 GitHub 上送一个 star",
|
||||
"star_on_github": "在 GitHub 上标星",
|
||||
"start": "开始",
|
||||
"starting": "开始...",
|
||||
"starts_with": "以...开始",
|
||||
|
@ -678,7 +678,7 @@
|
|||
"thumbnailer_cpu_usage_description": "限制缩略图生成器在后台处理时可以使用 CPU 的量。",
|
||||
"to": "到",
|
||||
"toggle_all": "切换全部",
|
||||
"toggle_command_palette": "切换命令面板",
|
||||
"toggle_command_palette": "打开命令面板",
|
||||
"toggle_hidden_files": "显示/隐藏文件",
|
||||
"toggle_image_slider_within_quick_preview": "在快速预览中切换图像滑块",
|
||||
"toggle_inspector": "切换检查器",
|
||||
|
@ -686,7 +686,7 @@
|
|||
"toggle_metadata": "切换元数据",
|
||||
"toggle_path_bar": "切换显示路径栏",
|
||||
"toggle_quick_preview": "切换快速预览",
|
||||
"toggle_sidebar": "切换侧边栏",
|
||||
"toggle_sidebar": "打开/关闭侧边栏",
|
||||
"tools": "工具",
|
||||
"total_bytes_capacity": "总容量",
|
||||
"total_bytes_capacity_description": "连接到资料库的所有节点的总容量。 在 Alpha 期间可能会显示不正确的值。",
|
||||
|
|
|
@ -13,6 +13,7 @@ export type Procedures = {
|
|||
{ key: "ephemeralFiles.getMediaData", input: string, result: MediaData | null } |
|
||||
{ key: "files.get", input: LibraryArgs<number>, result: ObjectWithFilePaths2 | null } |
|
||||
{ key: "files.getConvertibleImageExtensions", input: never, result: string[] } |
|
||||
{ key: "files.getDuplicates", input: LibraryArgs<number>, result: [({ id: number; name: string | null; path: string | null })[], FilePathSisters[]] } |
|
||||
{ key: "files.getMediaData", input: LibraryArgs<number>, result: MediaData } |
|
||||
{ key: "files.getPath", input: LibraryArgs<number>, result: string | null } |
|
||||
{ key: "invalidation.test-invalidate", input: never, result: number } |
|
||||
|
@ -300,6 +301,8 @@ export type FilePathOrder = { field: "name"; value: SortOrder } | { field: "size
|
|||
|
||||
export type FilePathSearchArgs = { take?: number | null; orderAndPagination?: OrderAndPagination<number, FilePathOrder, FilePathCursor> | null; filters?: SearchFilterArgs[]; groupDirectories?: boolean }
|
||||
|
||||
export type FilePathSisters = { id: number; is_dir: boolean | null; cas_id: string | null; integrity_checksum: string | null; location: { id: number; name: string | null; path: string | null } | null; materialized_path: string | null; name: string | null; extension: string | null }
|
||||
|
||||
export type Flash = {
|
||||
/**
|
||||
* Specifies how flash was used (on, auto, off, forced, onvalid)
|
||||
|
|
Loading…
Reference in a new issue