- The file explorer from the future
+ {/* One space, all your drives. */}A file explorer from the future.
-
- Manage files across all devices, drives and clouds from one place.
+
+ Combine your drives and clouds into one database that you can organize and explore from
+ any device.
Designed for creators, hoarders and the painfully disorganized.
@@ -57,14 +59,25 @@ function App() {
{/* */}
-
Available on macOS (Intel & Apple Silicon), Windows and Linux.
@@ -72,31 +85,38 @@ function App() {
Coming soon to iOS & Android.
-
+ {showApp && (
+
diff --git a/apps/landing/src/assets/apple.svg b/apps/landing/src/assets/apple.svg
deleted file mode 100644
index d62b0ae35..000000000
--- a/apps/landing/src/assets/apple.svg
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/apps/landing/src/assets/github.svg b/apps/landing/src/assets/github.svg
deleted file mode 100644
index aa05db9c5..000000000
--- a/apps/landing/src/assets/github.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/apps/landing/src/assets/windows.svg b/apps/landing/src/assets/windows.svg
deleted file mode 100644
index 05142caaf..000000000
--- a/apps/landing/src/assets/windows.svg
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
-
diff --git a/apps/landing/src/components/Footer.tsx b/apps/landing/src/components/Footer.tsx
new file mode 100644
index 000000000..6aeb2e4d6
--- /dev/null
+++ b/apps/landing/src/components/Footer.tsx
@@ -0,0 +1,106 @@
+import { ReactComponent as AppLogo } from '../assets/app-logo.svg';
+import {
+ Twitter,
+ Discord,
+ Instagram,
+ Github,
+ Opencollective,
+ Twitch
+} from '@icons-pack/react-simple-icons';
+
+function FooterLink(props: { children: string; link: string }) {
+ return (
+
+ {props.children}
+
+ );
+}
+
+export function Footer() {
+ return (
+
+ );
+}
diff --git a/apps/landing/src/components/NavBar.tsx b/apps/landing/src/components/NavBar.tsx
index ffe6875e6..55c333069 100644
--- a/apps/landing/src/components/NavBar.tsx
+++ b/apps/landing/src/components/NavBar.tsx
@@ -2,9 +2,13 @@ import clsx from 'clsx';
import React, { useEffect, useState } from 'react';
import { ReactComponent as AppLogo } from '../assets/app-logo.svg';
-function NavLink(props: { children: string }) {
+function NavLink(props: { link?: string; children: string }) {
return (
-
+
{props.children}
);
@@ -30,20 +34,25 @@ export default function NavBar() {
isAtTop ? 'border-gray-550 bg-gray-750 bg-opacity-80' : 'bg-transparent border-transparent'
)}
>
-
-
-
- Spacedrive
- BETA
-
+
+
+
+
+ Spacedrive
+ BETA
+
+
-
- Product
- Documentation
- Support
- FAQ
- Changelog
- Blog
+
+ Features
+ Docs
+
+ FAQ
+
+
+ Changelog
+
+ Sponsor us
diff --git a/core/src/file/cas/identifier.rs b/core/src/file/cas/identifier.rs
index 6a58475b8..8fc850c84 100644
--- a/core/src/file/cas/identifier.rs
+++ b/core/src/file/cas/identifier.rs
@@ -8,6 +8,7 @@ use crate::{
use anyhow::Result;
use futures::executor::block_on;
use serde::{Deserialize, Serialize};
+use prisma_client_rust::Direction;
#[derive(Deserialize, Serialize, Debug)]
pub struct FileCreated {
@@ -35,40 +36,44 @@ impl Job for FileIdentifierJob {
let ctx = tokio::task::spawn_blocking(move || {
let mut completed: usize = 0;
+ let mut cursor:i32 = 0;
while completed < task_count {
- let file_paths = block_on(get_orphan_file_paths(&ctx.core_ctx, completed * 100)).unwrap();
- println!("Processing: {:?}", file_paths);
+
+ let file_paths = block_on(get_orphan_file_paths(&ctx.core_ctx, cursor)).unwrap();
+ println!("Processing {:?} orphan files. ({} completed of {})", file_paths.len(), completed, task_count);
+
let mut rows: Vec = Vec::new();
+ // only rows that have a valid cas_id to be inserted
for file_path in file_paths.iter() {
- if file_path.temp_cas_id.is_none() {
- continue;
+ if file_path.temp_cas_id.is_some() {
+ rows.push(prepare_file_values(file_path));
}
- rows.push(prepare_file_values(file_path));
}
if rows.len() == 0 {
+ println!("No orphan files to process, finishing...");
break;
}
let insert_files = format!(
r#"INSERT INTO files (cas_id, size_in_bytes) VALUES {} ON CONFLICT (cas_id) DO NOTHING RETURNING id, cas_id"#,
rows.join(", ")
);
- println!("{}", insert_files);
+
let files: Vec = block_on(db._query_raw(&insert_files)).unwrap();
- println!("FILES: {:?}", files);
-
for file in files.iter() {
let update_file_path = format!(
r#"UPDATE file_paths SET file_id = "{}" WHERE temp_cas_id = "{}""#,
file.id, file.cas_id
);
- println!("UPDATING PATH: {}", update_file_path);
block_on(db._execute_raw(&update_file_path)).unwrap();
}
+
+ let last_row = file_paths.last().unwrap();
+
+ cursor = last_row.id;
completed += 1;
- println!("completed: {}", completed);
ctx.progress(vec![JobReportUpdate::CompletedTaskCount(completed)]);
}
ctx
@@ -76,9 +81,11 @@ impl Job for FileIdentifierJob {
let remaining = count_orphan_file_paths(&ctx.core_ctx).await?;
- if remaining > 0 {
- ctx.core_ctx.spawn_job(Box::new(FileIdentifierJob));
- }
+ println!("Finished with {} files remaining because your code is bad.", remaining);
+
+ // if remaining > 0 {
+ // ctx.core_ctx.spawn_job(Box::new(FileIdentifierJob));
+ // }
Ok(())
}
@@ -101,17 +108,18 @@ pub async fn count_orphan_file_paths(ctx: &CoreContext) -> Result Result, FileError> {
let db = &ctx.database;
- println!("offset: {}", offset);
+ println!("cursor: {:?}", cursor);
let files = db
.file_path()
.find_many(vec![
file_path::file_id::equals(None),
file_path::is_dir::equals(false),
])
- .skip(offset)
+ .order_by(file_path::id::order(Direction::Asc))
+ .cursor(file_path::id::cursor(cursor))
.take(100)
.exec()
.await?;
diff --git a/docs/developer/contributing.md b/docs/developer/contributing.md
new file mode 100644
index 000000000..738616010
--- /dev/null
+++ b/docs/developer/contributing.md
@@ -0,0 +1,3 @@
+# Contributing to Spacedrive
+
+For now, if you wish to make any changes other than a bug fix, please create an issue first to get the developer's input. The project is in its infancy and the developers are making frequent breaking changes.
\ No newline at end of file
diff --git a/docs/developer/todo.md b/docs/developer/todo.md
new file mode 100644
index 000000000..40eff15b8
--- /dev/null
+++ b/docs/developer/todo.md
@@ -0,0 +1,16 @@
+
+
+# Todo
+
+- Landing sections
+- Custom scrollbars
+- Tag files
+- Right click menu
+- File explorer grid view
+- Albums
+- Content types screen
+- Show duplicate files on the inspector
+- Explorer filter by tag
+- Library statistics
+- File viewer
+- Open file
\ No newline at end of file
diff --git a/docs/product/faq.md b/docs/product/faq.md
index bbe08cf68..36e41a2f7 100644
--- a/docs/product/faq.md
+++ b/docs/product/faq.md
@@ -18,6 +18,10 @@ This software is aimed at independent creatives such as filmmakers, streamers, m
In the same way we use finance apps to consolidate our books, Spacedrive consolidates files and the metadata associated with them. If you have external hard drives, cloud accounts and more than one device—you'll get a birds eye view of every file you own. With the ability to create folders, tags and albums that contain files from all different locations.
+## Where are my files stored?
+
+Exactly where they already are, Spacedrive simply indexes your existing storage locations, extracting metadata and fingerprinting the byte data. However, it will have the power to transfer files at your command.
+
## What makes this different to Dropbox or Google Drive?
It is not a storage provider, Spacedrive is simply a database that exists on top of existing storage layers, from cloud services like Dropbox, Google Drive and iCloud to physical devices and external drives you already own. It doesn't provide you more storage, rather a supercharged view of your existing storage.
diff --git a/docs/product/marketing.md b/docs/product/marketing.md
new file mode 100644
index 000000000..0df5641c3
--- /dev/null
+++ b/docs/product/marketing.md
@@ -0,0 +1,8 @@
+### One space, all your drives.
+
+### The file explorer from the future.
+
+### The file explorer of the future.
+
+### All your files in one space.
+
diff --git a/packages/interface/package.json b/packages/interface/package.json
index 106380f2b..89ab64777 100644
--- a/packages/interface/package.json
+++ b/packages/interface/package.json
@@ -41,6 +41,7 @@
"react-query": "^3.34.19",
"react-router": "6.3.0",
"react-router-dom": "6.3.0",
+ "react-scrollbars-custom": "^4.0.27",
"react-spline": "^1.2.1",
"react-transition-group": "^4.4.2",
"react-virtuoso": "^2.9.0",
diff --git a/packages/interface/src/App.tsx b/packages/interface/src/App.tsx
index 13e070193..a0460e3dd 100644
--- a/packages/interface/src/App.tsx
+++ b/packages/interface/src/App.tsx
@@ -26,6 +26,7 @@ import { BaseTransport, ClientProvider, setTransport } from '@sd/client';
import { Button } from '@sd/ui';
import { CoreEvent } from '@sd/core';
import clsx from 'clsx';
+import './style.scss';
const queryClient = new QueryClient();
@@ -183,9 +184,7 @@ export default function App(props: AppProps) {
window.ReactQueryClient = queryClient;
}
- useEffect(() => {
- setTransport(props.transport);
- }, [props.transport]);
+ setTransport(props.transport);
console.log('App props', props);
diff --git a/packages/interface/src/components/file/FileList.tsx b/packages/interface/src/components/file/FileList.tsx
index 62410e7be..5e7f22a26 100644
--- a/packages/interface/src/components/file/FileList.tsx
+++ b/packages/interface/src/components/file/FileList.tsx
@@ -137,7 +137,7 @@ export const FileList: React.FC<{ location_id: number; path: string; limit: numb