mirror of
https://github.com/spacedriveapp/spacedrive
synced 2024-07-13 17:44:03 +00:00
wip + working backfill
This commit is contained in:
parent
7e8bfcd2b6
commit
a9ca9a47c2
17
apps/mobile/src/navigation/BackfillWaitingStack.tsx
Normal file
17
apps/mobile/src/navigation/BackfillWaitingStack.tsx
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
import { createNativeStackNavigator, NativeStackScreenProps } from '@react-navigation/native-stack';
|
||||||
|
import React from 'react';
|
||||||
|
import DynamicHeader from '~/components/header/DynamicHeader';
|
||||||
|
import Header from '~/components/header/Header';
|
||||||
|
import LocationScreen from '~/screens/browse/Location';
|
||||||
|
import FiltersScreen from '~/screens/search/Filters';
|
||||||
|
import SearchScreen from '~/screens/search/Search';
|
||||||
|
|
||||||
|
const Stack = createNativeStackNavigator();
|
||||||
|
|
||||||
|
export default function BackfillWaitingStack() {
|
||||||
|
return (
|
||||||
|
<Stack.Navigator initialRouteName="BackfillWaiting">
|
||||||
|
<></>
|
||||||
|
</Stack.Navigator>
|
||||||
|
);
|
||||||
|
}
|
|
@ -4,6 +4,7 @@ import NotFoundScreen from '~/screens/NotFound';
|
||||||
|
|
||||||
import DrawerNavigator, { DrawerNavParamList } from './DrawerNavigator';
|
import DrawerNavigator, { DrawerNavParamList } from './DrawerNavigator';
|
||||||
import SearchStack, { SearchStackParamList } from './SearchStack';
|
import SearchStack, { SearchStackParamList } from './SearchStack';
|
||||||
|
import BackfillWaiting from '~/screens/settings/library/BackfillWaiting';
|
||||||
|
|
||||||
const Stack = createNativeStackNavigator<RootStackParamList>();
|
const Stack = createNativeStackNavigator<RootStackParamList>();
|
||||||
// This is the main navigator we nest everything under.
|
// This is the main navigator we nest everything under.
|
||||||
|
@ -20,6 +21,7 @@ export default function RootNavigator() {
|
||||||
component={SearchStack}
|
component={SearchStack}
|
||||||
options={{ headerShown: false }}
|
options={{ headerShown: false }}
|
||||||
/>
|
/>
|
||||||
|
<Stack.Screen name="BackfillWaiting" component={BackfillWaiting} options={{ headerShown: false }} />
|
||||||
<Stack.Screen name="NotFound" component={NotFoundScreen} options={{ title: 'Oops!' }} />
|
<Stack.Screen name="NotFound" component={NotFoundScreen} options={{ title: 'Oops!' }} />
|
||||||
</Stack.Navigator>
|
</Stack.Navigator>
|
||||||
);
|
);
|
||||||
|
@ -28,6 +30,7 @@ export default function RootNavigator() {
|
||||||
export type RootStackParamList = {
|
export type RootStackParamList = {
|
||||||
Root: NavigatorScreenParams<DrawerNavParamList>;
|
Root: NavigatorScreenParams<DrawerNavParamList>;
|
||||||
SearchStack: NavigatorScreenParams<SearchStackParamList>;
|
SearchStack: NavigatorScreenParams<SearchStackParamList>;
|
||||||
|
BackfillWaiting: undefined;
|
||||||
NotFound: undefined;
|
NotFound: undefined;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -12,10 +12,12 @@ import PrivacySettingsScreen from '~/screens/settings/client/PrivacySettings';
|
||||||
import AboutScreen from '~/screens/settings/info/About';
|
import AboutScreen from '~/screens/settings/info/About';
|
||||||
import DebugScreen from '~/screens/settings/info/Debug';
|
import DebugScreen from '~/screens/settings/info/Debug';
|
||||||
import SupportScreen from '~/screens/settings/info/Support';
|
import SupportScreen from '~/screens/settings/info/Support';
|
||||||
|
import BackfillWaiting from '~/screens/settings/library/BackfillWaiting';
|
||||||
import EditLocationSettingsScreen from '~/screens/settings/library/EditLocationSettings';
|
import EditLocationSettingsScreen from '~/screens/settings/library/EditLocationSettings';
|
||||||
import LibraryGeneralSettingsScreen from '~/screens/settings/library/LibraryGeneralSettings';
|
import LibraryGeneralSettingsScreen from '~/screens/settings/library/LibraryGeneralSettings';
|
||||||
import LocationSettingsScreen from '~/screens/settings/library/LocationSettings';
|
import LocationSettingsScreen from '~/screens/settings/library/LocationSettings';
|
||||||
import NodesSettingsScreen from '~/screens/settings/library/NodesSettings';
|
import NodesSettingsScreen from '~/screens/settings/library/NodesSettings';
|
||||||
|
import SyncSettingsScreen from '~/screens/settings/library/SyncSettings';
|
||||||
import TagsSettingsScreen from '~/screens/settings/library/TagsSettings';
|
import TagsSettingsScreen from '~/screens/settings/library/TagsSettings';
|
||||||
import SettingsScreen from '~/screens/settings/Settings';
|
import SettingsScreen from '~/screens/settings/Settings';
|
||||||
|
|
||||||
|
@ -87,6 +89,16 @@ export default function SettingsStack() {
|
||||||
component={TagsSettingsScreen}
|
component={TagsSettingsScreen}
|
||||||
options={{ header: () => <Header navBack title="Tags" /> }}
|
options={{ header: () => <Header navBack title="Tags" /> }}
|
||||||
/>
|
/>
|
||||||
|
<Stack.Screen
|
||||||
|
name="SyncSettings"
|
||||||
|
component={SyncSettingsScreen}
|
||||||
|
options={{ header: () => <Header navBack title="Sync" /> }}
|
||||||
|
/>
|
||||||
|
<Stack.Screen
|
||||||
|
name="BackfillWaiting"
|
||||||
|
component={BackfillWaiting}
|
||||||
|
options={{ header: () => <></> }}
|
||||||
|
/>
|
||||||
{/* <Stack.Screen
|
{/* <Stack.Screen
|
||||||
name="KeysSettings"
|
name="KeysSettings"
|
||||||
component={KeysSettingsScreen}
|
component={KeysSettingsScreen}
|
||||||
|
@ -131,6 +143,8 @@ export type SettingsStackParamList = {
|
||||||
NodesSettings: undefined;
|
NodesSettings: undefined;
|
||||||
TagsSettings: undefined;
|
TagsSettings: undefined;
|
||||||
KeysSettings: undefined;
|
KeysSettings: undefined;
|
||||||
|
SyncSettings: undefined;
|
||||||
|
BackfillWaiting: undefined;
|
||||||
// Info
|
// Info
|
||||||
About: undefined;
|
About: undefined;
|
||||||
Support: undefined;
|
Support: undefined;
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import {
|
import {
|
||||||
|
ArrowsClockwise,
|
||||||
Books,
|
Books,
|
||||||
FlyingSaucer,
|
FlyingSaucer,
|
||||||
Gear,
|
Gear,
|
||||||
|
@ -86,6 +87,11 @@ const sections: (debugState: DebugState) => SectionType[] = (debugState) => [
|
||||||
icon: TagSimple,
|
icon: TagSimple,
|
||||||
navigateTo: 'TagsSettings',
|
navigateTo: 'TagsSettings',
|
||||||
title: 'Tags',
|
title: 'Tags',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: ArrowsClockwise,
|
||||||
|
navigateTo: 'SyncSettings',
|
||||||
|
title: 'Sync',
|
||||||
rounded: 'bottom'
|
rounded: 'bottom'
|
||||||
}
|
}
|
||||||
// {
|
// {
|
||||||
|
|
35
apps/mobile/src/screens/settings/library/BackfillWaiting.tsx
Normal file
35
apps/mobile/src/screens/settings/library/BackfillWaiting.tsx
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
import { useEffect } from 'react';
|
||||||
|
import { Button, Text } from 'react-native';
|
||||||
|
import { useLibraryMutation, useLibraryQuery } from '@sd/client';
|
||||||
|
import ScreenContainer from '~/components/layout/ScreenContainer';
|
||||||
|
import { tw } from '~/lib/tailwind';
|
||||||
|
import { SettingsStackScreenProps } from '~/navigation/tabs/SettingsStack';
|
||||||
|
|
||||||
|
const BackfillWaiting = ({ navigation }: SettingsStackScreenProps<'BackfillWaiting'>) => {
|
||||||
|
const syncEnabled = useLibraryQuery(['sync.enabled']);
|
||||||
|
|
||||||
|
const enableSync = useLibraryMutation(['sync.backfill'], {});
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
async function _() {
|
||||||
|
await enableSync.mutateAsync(null).then(() => navigation.navigate('SyncSettings'));
|
||||||
|
}
|
||||||
|
|
||||||
|
_();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ScreenContainer scrollview={false} style={tw`gap-0 px-6`}>
|
||||||
|
<Text
|
||||||
|
style={tw`flex h-full w-full flex-col items-center justify-center p-5 text-center text-xl text-white`}
|
||||||
|
>
|
||||||
|
Library is being backfilled right now for Sync! Please hold while this process takes
|
||||||
|
place.
|
||||||
|
</Text>
|
||||||
|
|
||||||
|
<Button onPress={() => navigation.goBack()} title="Go Back" />
|
||||||
|
</ScreenContainer>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default BackfillWaiting;
|
133
apps/mobile/src/screens/settings/library/SyncSettings.tsx
Normal file
133
apps/mobile/src/screens/settings/library/SyncSettings.tsx
Normal file
|
@ -0,0 +1,133 @@
|
||||||
|
import { inferSubscriptionResult } from '@oscartbeaumont-sd/rspc-client';
|
||||||
|
import { Circle } from 'phosphor-react-native';
|
||||||
|
import React, { useEffect, useState } from 'react';
|
||||||
|
import { Text, View } from 'react-native';
|
||||||
|
import {
|
||||||
|
Procedures,
|
||||||
|
useDiscoveredPeers,
|
||||||
|
useFeatureFlag,
|
||||||
|
useLibraryMutation,
|
||||||
|
useLibraryQuery,
|
||||||
|
useLibrarySubscription
|
||||||
|
} from '@sd/client';
|
||||||
|
import ScreenContainer from '~/components/layout/ScreenContainer';
|
||||||
|
import { Button } from '~/components/primitive/Button';
|
||||||
|
import { tw } from '~/lib/tailwind';
|
||||||
|
import { SettingsStackScreenProps } from '~/navigation/tabs/SettingsStack';
|
||||||
|
|
||||||
|
const ACTORS = {
|
||||||
|
Ingest: 'Sync Ingest',
|
||||||
|
CloudSend: 'Cloud Sync Sender',
|
||||||
|
CloudReceive: 'Cloud Sync Receiver',
|
||||||
|
CloudIngest: 'Cloud Sync Ingest'
|
||||||
|
};
|
||||||
|
|
||||||
|
const SyncSettingsScreen = ({ navigation }: SettingsStackScreenProps<'SyncSettings'>) => {
|
||||||
|
const syncEnabled = useLibraryQuery(['sync.enabled']);
|
||||||
|
|
||||||
|
const backfillSync = useLibraryMutation(['sync.backfill'], {
|
||||||
|
onSuccess: async () => {
|
||||||
|
await syncEnabled.refetch();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const [data, setData] = useState<inferSubscriptionResult<Procedures, 'library.actors'>>({});
|
||||||
|
const [startBackfill, setStart] = useState(false);
|
||||||
|
|
||||||
|
useLibrarySubscription(['library.actors'], { onData: setData });
|
||||||
|
|
||||||
|
const cloudSync = useFeatureFlag('cloudSync');
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (startBackfill === true) {
|
||||||
|
console.log('Starting Backfill!');
|
||||||
|
|
||||||
|
navigation.navigate('BackfillWaiting');
|
||||||
|
|
||||||
|
// Force re-render?
|
||||||
|
}
|
||||||
|
}, [startBackfill, navigation]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ScreenContainer scrollview={false} style={tw`gap-0 px-6`}>
|
||||||
|
{syncEnabled.data === false ? (
|
||||||
|
<Button
|
||||||
|
variant={'accent'}
|
||||||
|
onPress={() => {
|
||||||
|
setStart(true);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Text>Start Backfill Operations</Text>
|
||||||
|
</Button>
|
||||||
|
) : (
|
||||||
|
<View>
|
||||||
|
{/* <Text
|
||||||
|
style={tw`flex flex-col items-center justify-center text-left text-white`}
|
||||||
|
>
|
||||||
|
Ingester
|
||||||
|
<OnlineIndicator online={data[ACTORS.Ingest] ?? false} />
|
||||||
|
</Text>
|
||||||
|
<View>
|
||||||
|
{data[ACTORS.Ingest] ? (
|
||||||
|
<StopButton name={ACTORS.Ingest} />
|
||||||
|
) : (
|
||||||
|
<StartButton name={ACTORS.Ingest} />
|
||||||
|
)}
|
||||||
|
</View> */}
|
||||||
|
<Text
|
||||||
|
style={tw`flex flex-col items-center justify-center text-left text-white`}
|
||||||
|
>
|
||||||
|
Sender
|
||||||
|
<OnlineIndicator online={data[ACTORS.CloudSend] ?? false} />
|
||||||
|
</Text>
|
||||||
|
<View>
|
||||||
|
{data[ACTORS.CloudSend] ? (
|
||||||
|
<StopButton name={ACTORS.CloudSend} />
|
||||||
|
) : (
|
||||||
|
<StartButton name={ACTORS.CloudSend} />
|
||||||
|
)}
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
|
</ScreenContainer>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default SyncSettingsScreen;
|
||||||
|
|
||||||
|
function OnlineIndicator({ online }: { online: boolean }) {
|
||||||
|
const size = 10;
|
||||||
|
return online ? (
|
||||||
|
<Circle size={size} color="#00ff0a" weight="fill" />
|
||||||
|
) : (
|
||||||
|
<Circle size={size} color="#ff0600" weight="fill" />
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function StartButton({ name }: { name: string }) {
|
||||||
|
const startActor = useLibraryMutation(['library.startActor']);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Button
|
||||||
|
variant="accent"
|
||||||
|
disabled={startActor.isLoading}
|
||||||
|
onPress={() => startActor.mutate(name)}
|
||||||
|
>
|
||||||
|
{startActor.isLoading ? <Text>Starting</Text> : <Text>Start</Text>}
|
||||||
|
</Button>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function StopButton({ name }: { name: string }) {
|
||||||
|
const stopActor = useLibraryMutation(['library.stopActor']);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Button
|
||||||
|
variant="accent"
|
||||||
|
disabled={stopActor.isLoading}
|
||||||
|
onPress={() => stopActor.mutate(name)}
|
||||||
|
>
|
||||||
|
{stopActor.isLoading ? <Text>Stopping</Text> : <Text>Stop</Text>}
|
||||||
|
</Button>
|
||||||
|
);
|
||||||
|
}
|
Loading…
Reference in a new issue