Skip to content

Commit

Permalink
Merge pull request #462 from lifeomic/raise-logged-out-ui
Browse files Browse the repository at this point in the history
feat!: move LoginScreen outside of LoggedInProviders
  • Loading branch information
swain committed Nov 16, 2023
2 parents 0c9e30a + 62380c0 commit 36b7362
Show file tree
Hide file tree
Showing 15 changed files with 74 additions and 104 deletions.
26 changes: 13 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@ See `example/AppDemo.tsx` for simple usage, which could be as simple as:
```typescript
import React, { FC } from 'react';
import { authConfig } from './authConfig';
import { RootProviders, RootStack } from '@lifeomic/react-native-sdk';
import { RootProviders, LoggedInStack } from '@lifeomic/react-native-sdk';

export default function App() {
return (
<RootProviders authConfig={authConfig}>
<RootStack />
<LoggedInStack />
</RootProviders>
);
}
Expand All @@ -42,7 +42,7 @@ export default function App() {
import React, { FC } from 'react';
import { authConfig } from './authConfig';
import { MyCustomScreen } from './src/MyCustomScreen';
import { RootProviders, RootStack } from '@lifeomic/react-native-sdk';
import { RootProviders, LoggedInStack } from '@lifeomic/react-native-sdk';

export default function App() {
return (
Expand All @@ -54,7 +54,7 @@ export default function App() {
}}
>
<RootProviders authConfig={authConfig}>
<RootStack />
<LoggedInStack />
</RootProviders>
</DeveloperConfigProvider>
);
Expand All @@ -66,7 +66,7 @@ export default function App() {
```typescript
import React, { FC } from 'react';
import { authConfig } from './authConfig';
import { RootProviders, RootStack } from '@lifeomic/react-native-sdk';
import { RootProviders, LoggedInStack } from '@lifeomic/react-native-sdk';

export default function App() {
return (
Expand All @@ -78,7 +78,7 @@ export default function App() {
}}
>
<RootProviders authConfig={authConfig}>
<RootStack />
<LoggedInStack />
</RootProviders>
</DeveloperConfigProvider>
);
Expand Down Expand Up @@ -135,7 +135,7 @@ export const UsersScreen = () => {
```typescript
import React, { FC } from 'react';
import { authConfig } from './authConfig';
import { RootProviders, RootStack } from '@lifeomic/react-native-sdk';
import { RootProviders, LoggedInStack } from '@lifeomic/react-native-sdk';
import { UserDetailsScreen, UsersScreen } from './screens';

export default function App() {
Expand All @@ -157,7 +157,7 @@ export default function App() {
}}
>
<RootProviders authConfig={authConfig}>
<RootStack />
<LoggedInStack />
</RootProviders>
</DeveloperConfigProvider>
);
Expand Down Expand Up @@ -186,7 +186,7 @@ function App() {
}}
>
<RootProviders authConfig={authConfig}>
<RootStack />
<LoggedInStack />
</RootProviders>
</DeveloperConfigProvider>
);
Expand Down Expand Up @@ -231,7 +231,7 @@ const CustomLoginScreen = () => {
```typescript
import React, { FC } from 'react';
import { authConfig } from './authConfig';
import { RootProviders, RootStack } from '@lifeomic/react-native-sdk';
import { RootProviders, LoggedInStack } from '@lifeomic/react-native-sdk';

export default function App() {
return (
Expand All @@ -241,7 +241,7 @@ export default function App() {
}}
>
<RootProviders authConfig={authConfig}>
<RootStack />
<LoggedInStack />
</RootProviders>
</DeveloperConfigProvider>
);
Expand All @@ -263,7 +263,7 @@ import React, { FC } from 'react';
import { authConfig } from './authConfig';
import {
RootProviders,
RootStack,
LoggedInStack,
OnAppSessionStartParams,
} from '@lifeomic/react-native-sdk';

Expand All @@ -285,7 +285,7 @@ export default function App() {
}}
>
<RootProviders authConfig={authConfig}>
<RootStack />
<LoggedInStack />
</RootProviders>
</DeveloperConfigProvider>
);
Expand Down
4 changes: 2 additions & 2 deletions example/AppDemo.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React from 'react';
import { authConfig, baseURL } from './storybook/helpers/oauthConfig';
import { DeveloperConfigProvider, RootProviders, RootStack } from '../src';
import { DeveloperConfigProvider, RootProviders, LoggedInStack } from '../src';
import { FhirExampleScreen } from './src/screens/FhirExampleScreen';

if (__DEV__) {
Expand All @@ -22,7 +22,7 @@ function App() {
}}
>
<RootProviders authConfig={authConfig}>
<RootStack />
<LoggedInStack />
</RootProviders>
</DeveloperConfigProvider>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { authConfig } from '../../helpers/oauthConfig';
import {
DeveloperConfigProvider,
RootProviders,
RootStack,
LoggedInStack,
getDefaultTabs,
} from '../../../../src';
import { withKnobs } from '@storybook/addon-knobs';
Expand Down Expand Up @@ -50,7 +50,7 @@ storiesOf('Custom Screen Injection', module)
}}
>
<RootProviders authConfig={authConfig}>
<RootStack />
<LoggedInStack />
</RootProviders>
</DeveloperConfigProvider>
);
Expand Down
12 changes: 6 additions & 6 deletions example/storybook/stories/ExampleApp/ExampleApp.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { authConfig, baseURL } from '../../helpers/oauthConfig';
import {
DeveloperConfigProvider,
RootProviders,
RootStack,
LoggedInStack,
LogoHeader,
BrandConfigProvider,
getDefaultTabs,
Expand Down Expand Up @@ -37,7 +37,7 @@ storiesOf('Example App', module)
}}
>
<RootProviders authConfig={authConfig}>
<RootStack />
<LoggedInStack />
</RootProviders>
</DeveloperConfigProvider>
);
Expand Down Expand Up @@ -69,7 +69,7 @@ storiesOf('Example App', module)
}}
>
<RootProviders authConfig={authConfig}>
<RootStack />
<LoggedInStack />
</RootProviders>
</DeveloperConfigProvider>
);
Expand Down Expand Up @@ -147,7 +147,7 @@ storiesOf('Example App', module)
}}
>
<RootProviders authConfig={authConfig}>
<RootStack />
<LoggedInStack />
</RootProviders>
</DeveloperConfigProvider>
)}
Expand Down Expand Up @@ -248,7 +248,7 @@ storiesOf('Example App', module)
<RootProviders authConfig={authConfig}>
<BrandConfigProvider {...brand}>
<LogoHeader visible={true} imageSource={logo} />
<RootStack />
<LoggedInStack />
</BrandConfigProvider>
</RootProviders>
</DeveloperConfigProvider>
Expand Down Expand Up @@ -345,7 +345,7 @@ storiesOf('Example App', module)
});
}}
>
<RootStack />
<LoggedInStack />
</DataOverrideProvider>
</RootProviders>
</DeveloperConfigProvider>
Expand Down
2 changes: 1 addition & 1 deletion src/common/DeveloperConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import { Project } from '../hooks/useSubjectProjects';
* DeveloperConfig provides a single interface to configure the app at build-time.
* Unlike useAppConfig, which is populated at runtime via API, properties in this
* type are provided at dev/build time. Another way to think about it is this is a
* high-level development interface for devs using RootProviders and RootStack.
* high-level development interface for devs using RootProviders and LoggedInStack.
*
* NOTE: All props are optional, and DeveloperConfigProvider is not required in
* your app.
Expand Down
42 changes: 36 additions & 6 deletions src/common/LoggedInProviders.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,52 @@ import React from 'react';
import { ActiveAccountContextProvider } from '../hooks/useActiveAccount';
import { NotificationsManagerProvider } from '../hooks/useNotificationManager';
import { ActiveProjectContextProvider } from '../hooks/useActiveProject';
import Toast from 'react-native-toast-message';
import { TrackTileProvider } from '../components/TrackTile/TrackTileProvider';
import { WearableLifecycleProvider } from '../components/Wearables/WearableLifecycleProvider';
import { CreateEditPostModal } from '../components/Circles/CreateEditPostModal';
import { PushNotificationsProvider } from '../hooks/usePushNotifications';
import { CircleTileContextProvider } from '../hooks/Circles/useActiveCircleTile';
import { OnboardingCourseContextProvider } from '../hooks/useOnboardingCourse';
import { useDeveloperConfig } from '../hooks/useDeveloperConfig';
import { useAuth } from '../hooks';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
import { NotLoggedInRootParamList } from '../navigators';
import { LoginScreen } from '../screens';
import { ActivityIndicatorView } from '../components';
import { t } from 'i18next';

export const LoggedInProviders = ({
children,
}: {
export type LoggedInProvidersProps = {
children?: React.ReactNode;
}) => {
};

const LoggedOutStack = createNativeStackNavigator<NotLoggedInRootParamList>();

export const LoggedInProviders = ({ children }: LoggedInProvidersProps) => {
const auth = useAuth();
const { pushNotificationsConfig } = useDeveloperConfig();

if (!auth.isLoggedIn && auth.loading) {
return (
<ActivityIndicatorView
message={t('root-stack-waiting-for-auth', 'Waiting for authorization')}
/>
);
}

if (!auth.isLoggedIn) {
return (
<LoggedOutStack.Navigator>
<LoggedOutStack.Group>
<LoggedOutStack.Screen
name="screens/LoginScreen"
component={LoginScreen}
options={{ headerShown: false }}
/>
</LoggedOutStack.Group>
</LoggedOutStack.Navigator>
);
}

return (
<ActiveAccountContextProvider>
<ActiveProjectContextProvider>
Expand All @@ -31,7 +62,6 @@ export const LoggedInProviders = ({
</NotificationsManagerProvider>
</PushNotificationsProvider>
<CreateEditPostModal />
<Toast />
</OnboardingCourseContextProvider>
</CircleTileContextProvider>
</WearableLifecycleProvider>
Expand Down
11 changes: 6 additions & 5 deletions src/common/RootProviders.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,16 @@ import { SafeAreaProvider } from 'react-native-safe-area-context';
import { ThemedNavigationContainer } from './ThemedNavigationContainer';
import { LoggedInProviders } from './LoggedInProviders';
import { QueryClientProvider, QueryClient } from '@tanstack/react-query';
import Toast from 'react-native-toast-message';

const queryClient = new QueryClient();

export function RootProviders({
authConfig,
children,
}: {
export type RootProvidersProps = {
authConfig: AuthConfiguration;
children?: React.ReactNode;
}) {
};

export function RootProviders({ authConfig, children }: RootProvidersProps) {
const { apiBaseURL, theme } = useDeveloperConfig();

return (
Expand All @@ -37,6 +37,7 @@ export function RootProviders({
<ActionSheetProvider>
<SafeAreaProvider>
<ThemedNavigationContainer>
<Toast />
<LoggedInProviders>{children}</LoggedInProviders>
</ThemedNavigationContainer>
</SafeAreaProvider>
Expand Down
3 changes: 0 additions & 3 deletions src/hooks/useActiveAccount.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { Account } from '../types/rest-types';
import { inviteNotifier } from '../components/Invitations/InviteNotifier';
import { ProjectInvite } from '../types';
import { useRestCache, useRestQuery } from './rest-api';
import { useAuth } from './useAuth';
import { useStoredValue } from './useStoredValue';

export type ActiveAccountProps = {
Expand Down Expand Up @@ -38,13 +37,11 @@ export const ActiveAccountContextProvider = ({
*/
accountIdToSelect?: string;
}) => {
const { isLoggedIn } = useAuth();
const accountsResult = useRestQuery(
'GET /v1/accounts',
{},
{
select: (data) => data.accounts.filter((a) => a.products.includes('LR')),
enabled: isLoggedIn,
},
);

Expand Down
4 changes: 1 addition & 3 deletions src/hooks/useNotifications.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import { gql } from 'graphql-request';
import { useGraphQLClient } from './useGraphQLClient';
import { useActiveAccount } from './useActiveAccount';
import { useUser } from './useUser';
import { useAuth } from './useAuth';

export type NotificationBase = {
id: string;
Expand Down Expand Up @@ -141,7 +140,6 @@ export function useNotifications() {
const { graphQLClient } = useGraphQLClient();
const { accountHeaders } = useActiveAccount();
const { data } = useUser();
const { isLoggedIn } = useAuth();

const queryForNotifications = useCallback(() => {
return graphQLClient.request<NotificationQueryResponse>(
Expand All @@ -154,7 +152,7 @@ export function useNotifications() {
}, [accountHeaders, data?.id, graphQLClient]);

return useQuery(['notifications'], queryForNotifications, {
enabled: !!accountHeaders?.['LifeOmic-Account'] && !!data?.id && isLoggedIn,
enabled: !!accountHeaders?.['LifeOmic-Account'] && !!data?.id,
select: selectNotifications,
});
}
8 changes: 1 addition & 7 deletions src/hooks/useUser.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,7 @@
import { useAuth } from './useAuth';
import { useRestCache, useRestMutation, useRestQuery } from './rest-api';

export function useUser() {
const { authResult } = useAuth();
return useRestQuery(
'GET /v1/user',
{},
{ enabled: !!authResult?.accessToken },
);
return useRestQuery('GET /v1/user', {});
}

export const useUpdateUser = () => {
Expand Down
Loading

0 comments on commit 36b7362

Please sign in to comment.