fix: mobile workspace related fixes (#1130)
* feat: put workspaces under unfinished features flag * fix: mention that signing out will quit the app * fix: put more affected places under features flag
This commit is contained in:
@@ -5,6 +5,7 @@ import { ApplicationGroup } from '@Lib/ApplicationGroup'
|
|||||||
import { navigationRef } from '@Lib/NavigationService'
|
import { navigationRef } from '@Lib/NavigationService'
|
||||||
import { DefaultTheme, NavigationContainer } from '@react-navigation/native'
|
import { DefaultTheme, NavigationContainer } from '@react-navigation/native'
|
||||||
import { ApplicationGroupContext } from '@Root/ApplicationGroupContext'
|
import { ApplicationGroupContext } from '@Root/ApplicationGroupContext'
|
||||||
|
import { EnvironmentContext } from '@Root/EnvironmentContext'
|
||||||
import { MobileThemeVariables } from '@Root/Style/Themes/styled-components'
|
import { MobileThemeVariables } from '@Root/Style/Themes/styled-components'
|
||||||
import { ApplicationGroupEvent, DeinitMode, DeinitSource } from '@standardnotes/snjs'
|
import { ApplicationGroupEvent, DeinitMode, DeinitSource } from '@standardnotes/snjs'
|
||||||
import { ThemeService, ThemeServiceContext } from '@Style/ThemeService'
|
import { ThemeService, ThemeServiceContext } from '@Style/ThemeService'
|
||||||
@@ -111,11 +112,13 @@ const AppComponent: React.FC<{
|
|||||||
{themeService.current && (
|
{themeService.current && (
|
||||||
<>
|
<>
|
||||||
<ThemeProvider theme={activeTheme}>
|
<ThemeProvider theme={activeTheme}>
|
||||||
<ActionSheetProvider>
|
<EnvironmentContext.Provider value={env}>
|
||||||
<ThemeServiceContext.Provider value={themeService.current}>
|
<ActionSheetProvider>
|
||||||
<MainStackComponent env={env} />
|
<ThemeServiceContext.Provider value={themeService.current}>
|
||||||
</ThemeServiceContext.Provider>
|
<MainStackComponent env={env} />
|
||||||
</ActionSheetProvider>
|
</ThemeServiceContext.Provider>
|
||||||
|
</ActionSheetProvider>
|
||||||
|
</EnvironmentContext.Provider>
|
||||||
<ToastWrapper />
|
<ToastWrapper />
|
||||||
</ThemeProvider>
|
</ThemeProvider>
|
||||||
</>
|
</>
|
||||||
|
|||||||
6
packages/mobile/src/EnvironmentContext.tsx
Normal file
6
packages/mobile/src/EnvironmentContext.tsx
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
import { TEnvironment } from '@Root/App'
|
||||||
|
import React from 'react'
|
||||||
|
|
||||||
|
export const EnvironmentContext = React.createContext<TEnvironment | undefined>(undefined)
|
||||||
|
|
||||||
|
export const SafeEnvironmentContext = EnvironmentContext as React.Context<TEnvironment>
|
||||||
8
packages/mobile/src/Hooks/useSafeEnvironmentContext.ts
Normal file
8
packages/mobile/src/Hooks/useSafeEnvironmentContext.ts
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
import { TEnvironment } from '@Root/App'
|
||||||
|
import { EnvironmentContext } from '@Root/EnvironmentContext'
|
||||||
|
import { useContext } from 'react'
|
||||||
|
|
||||||
|
export const useSafeEnvironmentContext = () => {
|
||||||
|
const env = useContext(EnvironmentContext) as TEnvironment
|
||||||
|
return env
|
||||||
|
}
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { IsDev } from '@Lib/Utils'
|
||||||
import AsyncStorage from '@react-native-community/async-storage'
|
import AsyncStorage from '@react-native-community/async-storage'
|
||||||
import SNReactNative from '@standardnotes/react-native-utils'
|
import SNReactNative from '@standardnotes/react-native-utils'
|
||||||
import {
|
import {
|
||||||
@@ -315,7 +316,9 @@ export class MobileDeviceInterface implements DeviceInterface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
performSoftReset() {
|
performSoftReset() {
|
||||||
SNReactNative.exitApp()
|
if (IsDev) {
|
||||||
|
SNReactNative.exitApp()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { useSignedIn } from '@Lib/SnjsHelperHooks'
|
import { useSignedIn } from '@Lib/SnjsHelperHooks'
|
||||||
|
import { isUnfinishedFeaturesEnabled } from '@Lib/Utils'
|
||||||
import { useNavigation } from '@react-navigation/native'
|
import { useNavigation } from '@react-navigation/native'
|
||||||
import { ButtonCell } from '@Root/Components/ButtonCell'
|
import { ButtonCell } from '@Root/Components/ButtonCell'
|
||||||
import { SectionedAccessoryTableCell } from '@Root/Components/SectionedAccessoryTableCell'
|
import { SectionedAccessoryTableCell } from '@Root/Components/SectionedAccessoryTableCell'
|
||||||
@@ -6,6 +7,7 @@ import { SectionedOptionsTableCell } from '@Root/Components/SectionedOptionsTabl
|
|||||||
import { SectionHeader } from '@Root/Components/SectionHeader'
|
import { SectionHeader } from '@Root/Components/SectionHeader'
|
||||||
import { TableSection } from '@Root/Components/TableSection'
|
import { TableSection } from '@Root/Components/TableSection'
|
||||||
import { useSafeApplicationContext } from '@Root/Hooks/useSafeApplicationContext'
|
import { useSafeApplicationContext } from '@Root/Hooks/useSafeApplicationContext'
|
||||||
|
import { useSafeEnvironmentContext } from '@Root/Hooks/useSafeEnvironmentContext'
|
||||||
import { ModalStackNavigationProp } from '@Root/ModalStack'
|
import { ModalStackNavigationProp } from '@Root/ModalStack'
|
||||||
import { SCREEN_MANAGE_SESSIONS, SCREEN_SETTINGS } from '@Root/Screens/screens'
|
import { SCREEN_MANAGE_SESSIONS, SCREEN_SETTINGS } from '@Root/Screens/screens'
|
||||||
import { ButtonType, PrefKey } from '@standardnotes/snjs'
|
import { ButtonType, PrefKey } from '@standardnotes/snjs'
|
||||||
@@ -26,6 +28,7 @@ export const OptionsSection = ({ title, encryptionAvailable }: Props) => {
|
|||||||
|
|
||||||
const [signedIn] = useSignedIn()
|
const [signedIn] = useSignedIn()
|
||||||
const navigation = useNavigation<ModalStackNavigationProp<typeof SCREEN_SETTINGS>['navigation']>()
|
const navigation = useNavigation<ModalStackNavigationProp<typeof SCREEN_SETTINGS>['navigation']>()
|
||||||
|
const env = useSafeEnvironmentContext()
|
||||||
|
|
||||||
// State
|
// State
|
||||||
const [importing, setImporting] = useState(false)
|
const [importing, setImporting] = useState(false)
|
||||||
@@ -76,14 +79,14 @@ export const OptionsSection = ({ title, encryptionAvailable }: Props) => {
|
|||||||
}, [encryptionAvailable])
|
}, [encryptionAvailable])
|
||||||
|
|
||||||
const destroyLocalData = async () => {
|
const destroyLocalData = async () => {
|
||||||
if (
|
let signoutText =
|
||||||
await application.alertService.confirm(
|
'Signing out will remove all data from this device, including notes and tags. Make sure your data is synced before proceeding.'
|
||||||
'Signing out will remove all data from this device, including notes and tags. Make sure your data is synced before proceeding.',
|
|
||||||
'Sign Out?',
|
if (isUnfinishedFeaturesEnabled(env)) {
|
||||||
'Sign Out',
|
signoutText += '\n\nYour app will quit after sign out completes.'
|
||||||
ButtonType.Danger,
|
}
|
||||||
)
|
|
||||||
) {
|
if (await application.alertService.confirm(signoutText, 'Sign Out?', 'Sign Out', ButtonType.Danger)) {
|
||||||
await application.user.signOut()
|
await application.user.signOut()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ export const WorkspacesSection = () => {
|
|||||||
break
|
break
|
||||||
case Remove:
|
case Remove:
|
||||||
message =
|
message =
|
||||||
'This action will remove this workspace and its related data from this device. Your synced data will not be affected.'
|
'This action will remove this workspace and its related data from this device. Your synced data will not be affected.\n\nYour app will quit after workspace removal completes.'
|
||||||
buttonText = 'Delete Workspace'
|
buttonText = 'Delete Workspace'
|
||||||
buttonType = Danger
|
buttonType = Danger
|
||||||
break
|
break
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import { useSignedIn } from '@Lib/SnjsHelperHooks'
|
import { useSignedIn } from '@Lib/SnjsHelperHooks'
|
||||||
|
import { isUnfinishedFeaturesEnabled } from '@Lib/Utils'
|
||||||
import { useSafeApplicationContext } from '@Root/Hooks/useSafeApplicationContext'
|
import { useSafeApplicationContext } from '@Root/Hooks/useSafeApplicationContext'
|
||||||
|
import { useSafeEnvironmentContext } from '@Root/Hooks/useSafeEnvironmentContext'
|
||||||
import { ModalStackNavigationProp } from '@Root/ModalStack'
|
import { ModalStackNavigationProp } from '@Root/ModalStack'
|
||||||
import { SCREEN_SETTINGS } from '@Root/Screens/screens'
|
import { SCREEN_SETTINGS } from '@Root/Screens/screens'
|
||||||
import { FilesSection } from '@Screens/Settings/Sections/FilesSection'
|
import { FilesSection } from '@Screens/Settings/Sections/FilesSection'
|
||||||
@@ -20,6 +22,7 @@ type Props = ModalStackNavigationProp<typeof SCREEN_SETTINGS>
|
|||||||
export const Settings = (props: Props) => {
|
export const Settings = (props: Props) => {
|
||||||
// Context
|
// Context
|
||||||
const application = useSafeApplicationContext()
|
const application = useSafeApplicationContext()
|
||||||
|
const env = useSafeEnvironmentContext()
|
||||||
|
|
||||||
// State
|
// State
|
||||||
const [hasPasscode, setHasPasscode] = useState(() => Boolean(application.hasPasscode()))
|
const [hasPasscode, setHasPasscode] = useState(() => Boolean(application.hasPasscode()))
|
||||||
@@ -55,7 +58,7 @@ export const Settings = (props: Props) => {
|
|||||||
<Container keyboardShouldPersistTaps={'always'} keyboardDismissMode={'interactive'}>
|
<Container keyboardShouldPersistTaps={'always'} keyboardDismissMode={'interactive'}>
|
||||||
<AuthSection title="Account" signedIn={signedIn} />
|
<AuthSection title="Account" signedIn={signedIn} />
|
||||||
<OptionsSection encryptionAvailable={!!encryptionAvailable} title="Options" />
|
<OptionsSection encryptionAvailable={!!encryptionAvailable} title="Options" />
|
||||||
<WorkspacesSection />
|
{isUnfinishedFeaturesEnabled(env) && <WorkspacesSection />}
|
||||||
<PreferencesSection />
|
<PreferencesSection />
|
||||||
{application.hasAccount() && isEntitledToFiles && <FilesSection />}
|
{application.hasAccount() && isEntitledToFiles && <FilesSection />}
|
||||||
<SecuritySection
|
<SecuritySection
|
||||||
|
|||||||
Reference in New Issue
Block a user