Skip to content

Commit da61845

Browse files
AMoreauxFelixMalfait
authored andcommitted
fix(client-config): set isLoaded to false on API status update (twentyhq#12371)
Attempt at twentyhq#12289 (edit Félix: removed fix keyword since I don't think it fixes it) --------- Co-authored-by: Félix Malfait <felix.malfait@gmail.com> Co-authored-by: Félix Malfait <felix@twenty.com>
1 parent 1f347a4 commit da61845

File tree

25 files changed

+223
-169
lines changed

25 files changed

+223
-169
lines changed

packages/twenty-front/.env.example

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ VITE_DISABLE_ESLINT_CHECKER=true
1111
# VITE_ENABLE_SSL=false
1212
# VITE_HOST=localhost.com
1313
# SSL_KEY_PATH="./certs/your-cert.key"
14-
# SSL_CERT_PATH="./certs/your-cert.crt"
14+
# SSL_CERT_PATH="./certs/your-cert.crt"
15+
# IS_DEBUG_MODE=false

packages/twenty-front/src/modules/apollo/hooks/useApolloFactory.ts

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
import { InMemoryCache, NormalizedCacheObject } from '@apollo/client';
22
import { useMemo, useRef } from 'react';
33
import { useLocation, useNavigate } from 'react-router-dom';
4-
import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil';
4+
import { useRecoilState, useSetRecoilState } from 'recoil';
55

66
import { currentUserState } from '@/auth/states/currentUserState';
77
import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMemberState';
88
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState';
99
import { previousUrlState } from '@/auth/states/previousUrlState';
1010
import { tokenPairState } from '@/auth/states/tokenPairState';
1111
import { workspacesState } from '@/auth/states/workspaces';
12-
import { isDebugModeState } from '@/client-config/states/isDebugModeState';
1312
import { REACT_APP_SERVER_BASE_URL } from '~/config';
1413
import { useUpdateEffect } from '~/hooks/useUpdateEffect';
1514
import { isMatchingLocation } from '~/utils/isMatchingLocation';
@@ -22,18 +21,16 @@ import { ApolloFactory, Options } from '../services/apollo.factory';
2221
export const useApolloFactory = (options: Partial<Options<any>> = {}) => {
2322
// eslint-disable-next-line @nx/workspace-no-state-useref
2423
const apolloRef = useRef<ApolloFactory<NormalizedCacheObject> | null>(null);
25-
const [isDebugMode] = useRecoilState(isDebugModeState);
2624

2725
const navigate = useNavigate();
2826
const setTokenPair = useSetRecoilState(tokenPairState);
2927
const [currentWorkspace, setCurrentWorkspace] = useRecoilState(
3028
currentWorkspaceState,
3129
);
32-
const currentWorkspaceMember = useRecoilValue(currentWorkspaceMemberState);
33-
const setCurrentUser = useSetRecoilState(currentUserState);
34-
const setCurrentWorkspaceMember = useSetRecoilState(
30+
const [currentWorkspaceMember, setCurrentWorkspaceMember] = useRecoilState(
3531
currentWorkspaceMemberState,
3632
);
33+
const setCurrentUser = useSetRecoilState(currentUserState);
3734
const setCurrentUserWorkspace = useSetRecoilState(currentUserWorkspaceState);
3835

3936
const setWorkspaces = useSetRecoilState(workspacesState);
@@ -50,18 +47,15 @@ export const useApolloFactory = (options: Partial<Options<any>> = {}) => {
5047
},
5148
},
5249
}),
53-
headers: {
54-
...(currentWorkspace?.metadataVersion && {
55-
'X-Schema-Version': `${currentWorkspace.metadataVersion}`,
56-
}),
57-
},
50+
5851
defaultOptions: {
5952
watchQuery: {
6053
fetchPolicy: 'cache-and-network',
6154
},
6255
},
63-
connectToDevTools: isDebugMode,
56+
connectToDevTools: process.env.IS_DEBUG_MODE === 'true',
6457
currentWorkspaceMember: currentWorkspaceMember,
58+
currentWorkspace: currentWorkspace,
6559
onTokenPairChange: (tokenPair) => {
6660
setTokenPair(tokenPair);
6761
},
@@ -83,7 +77,7 @@ export const useApolloFactory = (options: Partial<Options<any>> = {}) => {
8377
}
8478
},
8579
extraLinks: [],
86-
isDebugMode,
80+
isDebugMode: process.env.IS_DEBUG_MODE === 'true',
8781
// Override options
8882
...options,
8983
});
@@ -96,8 +90,6 @@ export const useApolloFactory = (options: Partial<Options<any>> = {}) => {
9690
setCurrentWorkspaceMember,
9791
setCurrentWorkspace,
9892
setWorkspaces,
99-
isDebugMode,
100-
currentWorkspace?.metadataVersion,
10193
setPreviousUrl,
10294
]);
10395

@@ -107,5 +99,11 @@ export const useApolloFactory = (options: Partial<Options<any>> = {}) => {
10799
}
108100
}, [currentWorkspaceMember]);
109101

102+
useUpdateEffect(() => {
103+
if (isDefined(apolloRef.current)) {
104+
apolloRef.current.updateCurrentWorkspace(currentWorkspace);
105+
}
106+
}, [currentWorkspace]);
107+
110108
return apolloClient;
111109
};

packages/twenty-front/src/modules/apollo/services/__tests__/apollo.factory.test.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { ApolloError, gql, InMemoryCache } from '@apollo/client';
22
import fetchMock, { enableFetchMocks } from 'jest-fetch-mock';
33

4+
import { WorkspaceActivationStatus } from '~/generated/graphql';
45
import { ApolloFactory, Options } from '../apollo.factory';
56

67
enableFetchMocks();
@@ -31,9 +32,32 @@ const mockWorkspaceMember = {
3132
colorScheme: 'Light' as const,
3233
};
3334

35+
const mockWorkspace = {
36+
id: 'workspace-id',
37+
metadataVersion: 1,
38+
allowImpersonation: false,
39+
activationStatus: WorkspaceActivationStatus.ACTIVE,
40+
billingSubscriptions: [],
41+
currentBillingSubscription: null,
42+
workspaceMembersCount: 0,
43+
isPublicInviteLinkEnabled: false,
44+
isGoogleAuthEnabled: false,
45+
isMicrosoftAuthEnabled: false,
46+
isPasswordAuthEnabled: false,
47+
isCustomDomainEnabled: false,
48+
hasValidEnterpriseKey: false,
49+
subdomain: 'test',
50+
customDomain: 'test.com',
51+
workspaceUrls: {
52+
subdomainUrl: 'test.com',
53+
customUrl: 'test.com',
54+
},
55+
};
56+
3457
const createMockOptions = (): Options<any> => ({
3558
uri: 'http://localhost:3000',
3659
currentWorkspaceMember: mockWorkspaceMember,
60+
currentWorkspace: mockWorkspace,
3761
cache: new InMemoryCache(),
3862
isDebugMode: true,
3963
onError: mockOnError,

packages/twenty-front/src/modules/apollo/services/apollo.factory.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { createUploadLink } from 'apollo-upload-client';
1313

1414
import { renewToken } from '@/auth/services/AuthService';
1515
import { CurrentWorkspaceMember } from '@/auth/states/currentWorkspaceMemberState';
16+
import { CurrentWorkspace } from '@/auth/states/currentWorkspaceState';
1617
import { AuthTokenPair } from '~/generated/graphql';
1718
import { logDebug } from '~/utils/logDebug';
1819

@@ -34,13 +35,15 @@ export interface Options<TCacheShape> extends ApolloClientOptions<TCacheShape> {
3435
onTokenPairChange?: (tokenPair: AuthTokenPair) => void;
3536
onUnauthenticatedError?: () => void;
3637
currentWorkspaceMember: CurrentWorkspaceMember | null;
38+
currentWorkspace: CurrentWorkspace | null;
3739
extraLinks?: ApolloLink[];
3840
isDebugMode?: boolean;
3941
}
4042

4143
export class ApolloFactory<TCacheShape> implements ApolloManager<TCacheShape> {
4244
private client: ApolloClient<TCacheShape>;
4345
private currentWorkspaceMember: CurrentWorkspaceMember | null = null;
46+
private currentWorkspace: CurrentWorkspace | null = null;
4447

4548
constructor(opts: Options<TCacheShape>) {
4649
const {
@@ -50,12 +53,14 @@ export class ApolloFactory<TCacheShape> implements ApolloManager<TCacheShape> {
5053
onTokenPairChange,
5154
onUnauthenticatedError,
5255
currentWorkspaceMember,
56+
currentWorkspace,
5357
extraLinks,
5458
isDebugMode,
5559
...options
5660
} = opts;
5761

5862
this.currentWorkspaceMember = currentWorkspaceMember;
63+
this.currentWorkspace = currentWorkspace;
5964

6065
const buildApolloLink = (): ApolloLink => {
6166
const httpLink = createUploadLink({
@@ -84,6 +89,9 @@ export class ApolloFactory<TCacheShape> implements ApolloManager<TCacheShape> {
8489
...(this.currentWorkspaceMember?.locale
8590
? { 'x-locale': this.currentWorkspaceMember.locale }
8691
: { 'x-locale': i18n.locale }),
92+
...(this.currentWorkspace?.metadataVersion && {
93+
'X-Schema-Version': `${this.currentWorkspace.metadataVersion}`,
94+
}),
8795
},
8896
};
8997
});
@@ -188,6 +196,10 @@ export class ApolloFactory<TCacheShape> implements ApolloManager<TCacheShape> {
188196
this.currentWorkspaceMember = workspaceMember;
189197
}
190198

199+
updateCurrentWorkspace(workspace: CurrentWorkspace | null) {
200+
this.currentWorkspace = workspace;
201+
}
202+
191203
getClient() {
192204
return this.client;
193205
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { getTokenPair } from '@/apollo/utils/getTokenPair';
2+
import { isDefined } from 'twenty-shared/utils';
3+
4+
export const hasTokenPair = () => {
5+
const tokenPair = getTokenPair();
6+
return isDefined(tokenPair) && isDefined(tokenPair.accessToken?.token);
7+
};

packages/twenty-front/src/modules/app/components/AppRouterProviders.tsx

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,15 @@ export const AppRouterProviders = () => {
3333
const pageTitle = getPageTitleFromPath(pathname);
3434

3535
return (
36-
<CaptchaProvider>
37-
<ApolloProvider>
38-
<BaseThemeProvider>
39-
<ClientConfigProviderEffect />
40-
<ClientConfigProvider>
36+
<ApolloProvider>
37+
<BaseThemeProvider>
38+
<ClientConfigProviderEffect />
39+
<UserProviderEffect />
40+
<WorkspaceProviderEffect />
41+
<ClientConfigProvider>
42+
<CaptchaProvider>
4143
<ChromeExtensionSidecarEffect />
4244
<ChromeExtensionSidecarProvider>
43-
<UserProviderEffect />
44-
<WorkspaceProviderEffect />
4545
<UserProvider>
4646
<AuthProvider>
4747
<ApolloMetadataClientProvider>
@@ -71,9 +71,9 @@ export const AppRouterProviders = () => {
7171
</AuthProvider>
7272
</UserProvider>
7373
</ChromeExtensionSidecarProvider>
74-
</ClientConfigProvider>
75-
</BaseThemeProvider>
76-
</ApolloProvider>
77-
</CaptchaProvider>
74+
</CaptchaProvider>
75+
</ClientConfigProvider>
76+
</BaseThemeProvider>
77+
</ApolloProvider>
7878
);
7979
};

packages/twenty-front/src/modules/auth/components/VerifyLoginTokenEffect.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export const VerifyLoginTokenEffect = () => {
1717
const navigate = useNavigateApp();
1818
const { verifyLoginToken } = useVerifyLogin();
1919

20-
const { isLoaded: clientConfigLoaded } = useRecoilValue(
20+
const { isSaved: clientConfigLoaded } = useRecoilValue(
2121
clientConfigApiStatusState,
2222
);
2323

packages/twenty-front/src/modules/auth/hooks/__tests__/useAuth.test.tsx

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { useAuth } from '@/auth/hooks/useAuth';
22
import { billingState } from '@/client-config/states/billingState';
3-
import { isDebugModeState } from '@/client-config/states/isDebugModeState';
43
import { isDeveloperDefaultSignInPrefilledState } from '@/client-config/states/isDeveloperDefaultSignInPrefilledState';
54
import { supportChatState } from '@/client-config/states/supportChatState';
65
import { workspaceAuthProvidersState } from '@/workspace/states/workspaceAuthProvidersState';
@@ -118,7 +117,6 @@ describe('useAuth', () => {
118117
isDeveloperDefaultSignInPrefilledState,
119118
);
120119
const supportChat = useRecoilValue(supportChatState);
121-
const isDebugMode = useRecoilValue(isDebugModeState);
122120
const isMultiWorkspaceEnabled = useRecoilValue(
123121
isMultiWorkspaceEnabledState,
124122
);
@@ -131,7 +129,6 @@ describe('useAuth', () => {
131129
billing,
132130
isDeveloperDefaultSignInPrefilled,
133131
supportChat,
134-
isDebugMode,
135132
isMultiWorkspaceEnabled,
136133
},
137134
};
@@ -160,7 +157,6 @@ describe('useAuth', () => {
160157
supportDriver: 'none',
161158
supportFrontChatId: null,
162159
});
163-
expect(state.isDebugMode).toBe(false);
164160
});
165161

166162
it('should handle credential sign-up', async () => {

0 commit comments

Comments
 (0)