diff --git a/front/src/generated/graphql.tsx b/front/src/generated/graphql.tsx index 2779f2e32..7ed07e6fd 100644 --- a/front/src/generated/graphql.tsx +++ b/front/src/generated/graphql.tsx @@ -1798,6 +1798,15 @@ export type GetUsersQueryVariables = Exact<{ [key: string]: never; }>; export type GetUsersQuery = { __typename?: 'Query', findManyUser: Array<{ __typename?: 'User', id: string, email: string, displayName: string, firstName: string, lastName: string }> }; +export type GetClientConfigQuery = { + __typename?: 'Query'; + clientConfig: { + __typename?: 'ClientConfig'; + display_google_login: boolean; + prefill_login_with_seed: boolean; + }; +}; +export type GetClientConfigQueryVariables = {}; export const CreateEventDocument = gql` mutation CreateEvent($type: String!, $data: JSON!) { @@ -3080,4 +3089,39 @@ export function useGetUsersLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions; export type GetUsersLazyQueryHookResult = ReturnType; -export type GetUsersQueryResult = Apollo.QueryResult; \ No newline at end of file +export type GetUsersQueryResult = Apollo.QueryResult; + +export const GET_CLIENT_CONFIG = gql` + query GetClientConfig { + clientConfig { + display_google_login + prefill_login_with_seed + } + } +`; + +export function useGetClientConfigQuery( + baseOptions?: Apollo.QueryHookOptions< + GetClientConfigQuery, + GetClientConfigQueryVariables + >, +) { + const options = { ...defaultOptions, ...baseOptions }; + return Apollo.useQuery( + GET_CLIENT_CONFIG, + options, + ); +} + +export function useGetClientConfigLazyQuery( + baseOptions?: Apollo.LazyQueryHookOptions< + GetClientConfigQuery, + GetClientConfigQueryVariables + >, +) { + const options = { ...defaultOptions, ...baseOptions }; + return Apollo.useLazyQuery< + GetClientConfigQuery, + GetClientConfigQueryVariables + >(GET_CLIENT_CONFIG, options); +} \ No newline at end of file diff --git a/front/src/index.tsx b/front/src/index.tsx index 7c3ec9b30..79c55f635 100644 --- a/front/src/index.tsx +++ b/front/src/index.tsx @@ -8,6 +8,7 @@ import { ThemeType } from '@/ui/themes/themes'; import '@emotion/react'; import { ApolloProvider } from './providers/apollo/ApolloProvider'; +import { ClientConfigProvider } from './providers/clientConfig/ClientConfigProvider'; import { AppThemeProvider } from './providers/theme/AppThemeProvider'; import { UserProvider } from './providers/user/UserProvider'; import { App } from './App'; @@ -25,7 +26,9 @@ root.render( - + + + diff --git a/front/src/modules/auth/hooks/useFetchClientConfig.ts b/front/src/modules/auth/hooks/useFetchClientConfig.ts new file mode 100644 index 000000000..3d6305186 --- /dev/null +++ b/front/src/modules/auth/hooks/useFetchClientConfig.ts @@ -0,0 +1,7 @@ +import { useGetClientConfigQuery } from '~/generated/graphql'; + +export function useFetchClientConfig() { + const { data } = useGetClientConfigQuery(); + + return data?.clientConfig; +} diff --git a/front/src/modules/auth/states/displayGoogleLogin.ts b/front/src/modules/auth/states/displayGoogleLogin.ts new file mode 100644 index 000000000..465582c6a --- /dev/null +++ b/front/src/modules/auth/states/displayGoogleLogin.ts @@ -0,0 +1,6 @@ +import { atom } from 'recoil'; + +export const displayGoogleLogin = atom({ + key: 'displayGoogleLogin', + default: true, +}); diff --git a/front/src/modules/auth/states/prefillLoginWithSeed.ts b/front/src/modules/auth/states/prefillLoginWithSeed.ts new file mode 100644 index 000000000..c174bfd0c --- /dev/null +++ b/front/src/modules/auth/states/prefillLoginWithSeed.ts @@ -0,0 +1,6 @@ +import { atom } from 'recoil'; + +export const prefillLoginWithSeed = atom({ + key: 'prefillLoginWithSeed', + default: true, +}); diff --git a/front/src/providers/clientConfig/ClientConfigProvider.tsx b/front/src/providers/clientConfig/ClientConfigProvider.tsx new file mode 100644 index 000000000..a141b0a31 --- /dev/null +++ b/front/src/providers/clientConfig/ClientConfigProvider.tsx @@ -0,0 +1,21 @@ +import { useEffect } from 'react'; +import { useRecoilState } from 'recoil'; + +import { useFetchClientConfig } from '@/auth/hooks/useFetchClientConfig'; +import { displayGoogleLogin } from '@/auth/states/displayGoogleLogin'; +import { prefillLoginWithSeed } from '@/auth/states/prefillLoginWithSeed'; + +export const ClientConfigProvider: React.FC = ({ + children, +}) => { + const [, setDisplayGoogleLogin] = useRecoilState(displayGoogleLogin); + const [, setPrefillLoginWithSeed] = useRecoilState(prefillLoginWithSeed); + const clientConfig = useFetchClientConfig(); + + useEffect(() => { + setDisplayGoogleLogin(clientConfig?.display_google_login ?? true); + setPrefillLoginWithSeed(clientConfig?.prefill_login_with_seed ?? true); + }, [setDisplayGoogleLogin, setPrefillLoginWithSeed, clientConfig]); + + return <>{children}; +}; diff --git a/server/package.json b/server/package.json index df937f7b7..fd556def0 100644 --- a/server/package.json +++ b/server/package.json @@ -9,7 +9,7 @@ "prebuild": "rimraf dist", "build": "nest build", "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", - "start": "nest start", + "start": "set NODE_ENV=development&& nest start", "start:dev": "nest start --watch", "start:debug": "nest start --debug --watch", "start:prod": "node dist/main", diff --git a/server/src/core/auth/auth.resolver.ts b/server/src/core/auth/auth.resolver.ts index d4eea4f46..fad6a05dc 100644 --- a/server/src/core/auth/auth.resolver.ts +++ b/server/src/core/auth/auth.resolver.ts @@ -1,5 +1,5 @@ -import { Args, Mutation, Resolver } from '@nestjs/graphql'; -import { AuthTokens } from './dto/token.entity'; +import { Args, Mutation, Resolver, Query} from '@nestjs/graphql'; +import { AuthTokens, ClientConfig} from './dto/token.entity'; import { TokenService } from './services/token.service'; import { RefreshTokenInput } from './dto/refresh-token.input'; import { BadRequestException } from '@nestjs/common'; @@ -61,4 +61,17 @@ export class AuthResolver { return { tokens: tokens }; } -} + + @Query(() => ClientConfig) + async clientConfig(): Promise { + const displayGoogleLogin = process.env.AUTH_GOOGLE_CLIENT_ID !== undefined; + const prefillLoginWithSeed = process.env.NODE_ENV === 'development'; + + const clientConfig: ClientConfig = { + display_google_login: displayGoogleLogin, + prefill_login_with_seed: prefillLoginWithSeed, + }; + + return Promise.resolve(clientConfig); + } +} \ No newline at end of file diff --git a/server/src/core/auth/dto/token.entity.ts b/server/src/core/auth/dto/token.entity.ts index a1b8b6f7a..3bae3169d 100644 --- a/server/src/core/auth/dto/token.entity.ts +++ b/server/src/core/auth/dto/token.entity.ts @@ -23,3 +23,12 @@ export class AuthTokens { @Field(() => AuthTokenPair) tokens: AuthTokenPair; } + +@ObjectType() +export class ClientConfig { + @Field(() => Boolean) + display_google_login: boolean; + + @Field(() => Boolean) + prefill_login_with_seed: boolean; +} \ No newline at end of file