mirror of
https://github.com/makeplane/plane
synced 2024-06-14 14:31:34 +00:00
chore: remove unnecessary OAuth envs (#2378)
* chore: remove unnecessary oauth envs * merge conflicts resolved * fix: adding new service --------- Co-authored-by: sriramveeraghanta <veeraghanta.sriram@gmail.com>
This commit is contained in:
parent
77c1b90e6b
commit
1c43d313d1
@ -10,9 +10,12 @@ import githubWhiteImage from "public/logos/github-white.svg";
|
|||||||
|
|
||||||
export interface GithubLoginButtonProps {
|
export interface GithubLoginButtonProps {
|
||||||
handleSignIn: React.Dispatch<string>;
|
handleSignIn: React.Dispatch<string>;
|
||||||
|
clientId: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const GithubLoginButton: FC<GithubLoginButtonProps> = ({ handleSignIn }) => {
|
export const GithubLoginButton: FC<GithubLoginButtonProps> = (props) => {
|
||||||
|
const { handleSignIn, clientId } = props;
|
||||||
|
// states
|
||||||
const [loginCallBackURL, setLoginCallBackURL] = useState(undefined);
|
const [loginCallBackURL, setLoginCallBackURL] = useState(undefined);
|
||||||
const [gitCode, setGitCode] = useState<null | string>(null);
|
const [gitCode, setGitCode] = useState<null | string>(null);
|
||||||
|
|
||||||
@ -38,7 +41,7 @@ export const GithubLoginButton: FC<GithubLoginButtonProps> = ({ handleSignIn })
|
|||||||
<div className="w-full flex justify-center items-center">
|
<div className="w-full flex justify-center items-center">
|
||||||
<Link
|
<Link
|
||||||
className="w-full"
|
className="w-full"
|
||||||
href={`https://github.com/login/oauth/authorize?client_id=${process.env.NEXT_PUBLIC_GITHUB_ID}&redirect_uri=${loginCallBackURL}&scope=read:user,user:email`}
|
href={`https://github.com/login/oauth/authorize?client_id=${clientId}&redirect_uri=${loginCallBackURL}&scope=read:user,user:email`}
|
||||||
>
|
>
|
||||||
<button className="flex w-full items-center justify-center gap-2 rounded border border-custom-border-300 p-2 text-sm font-medium text-custom-text-100 duration-300 hover:bg-custom-background-80 h-[46px]">
|
<button className="flex w-full items-center justify-center gap-2 rounded border border-custom-border-300 p-2 text-sm font-medium text-custom-text-100 duration-300 hover:bg-custom-background-80 h-[46px]">
|
||||||
<Image
|
<Image
|
||||||
|
@ -1,22 +1,23 @@
|
|||||||
import { FC, CSSProperties, useEffect, useRef, useCallback, useState } from "react";
|
import { FC, useEffect, useRef, useCallback, useState } from "react";
|
||||||
|
|
||||||
import Script from "next/script";
|
import Script from "next/script";
|
||||||
|
|
||||||
export interface IGoogleLoginButton {
|
export interface IGoogleLoginButton {
|
||||||
text?: string;
|
clientId: string;
|
||||||
handleSignIn: React.Dispatch<any>;
|
handleSignIn: React.Dispatch<any>;
|
||||||
styles?: CSSProperties;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const GoogleLoginButton: FC<IGoogleLoginButton> = ({ handleSignIn }) => {
|
export const GoogleLoginButton: FC<IGoogleLoginButton> = (props) => {
|
||||||
|
const { handleSignIn, clientId } = props;
|
||||||
|
// refs
|
||||||
const googleSignInButton = useRef<HTMLDivElement>(null);
|
const googleSignInButton = useRef<HTMLDivElement>(null);
|
||||||
|
// states
|
||||||
const [gsiScriptLoaded, setGsiScriptLoaded] = useState(false);
|
const [gsiScriptLoaded, setGsiScriptLoaded] = useState(false);
|
||||||
|
|
||||||
const loadScript = useCallback(() => {
|
const loadScript = useCallback(() => {
|
||||||
if (!googleSignInButton.current || gsiScriptLoaded) return;
|
if (!googleSignInButton.current || gsiScriptLoaded) return;
|
||||||
|
|
||||||
(window as any)?.google?.accounts.id.initialize({
|
(window as any)?.google?.accounts.id.initialize({
|
||||||
client_id: process.env.NEXT_PUBLIC_GOOGLE_CLIENTID || "",
|
client_id: clientId,
|
||||||
callback: handleSignIn,
|
callback: handleSignIn,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -1,27 +1,30 @@
|
|||||||
import React, { useEffect } from "react";
|
import React from "react";
|
||||||
|
import useSWR from "swr";
|
||||||
import Image from "next/image";
|
|
||||||
import { useRouter } from "next/router";
|
import { useRouter } from "next/router";
|
||||||
|
|
||||||
// mobx
|
// mobx
|
||||||
import { observer } from "mobx-react-lite";
|
import { observer } from "mobx-react-lite";
|
||||||
import { useMobxStore } from "lib/mobx/store-provider";
|
import { useMobxStore } from "lib/mobx/store-provider";
|
||||||
// services
|
// services
|
||||||
import authenticationService from "services/authentication.service";
|
import authenticationService from "services/authentication.service";
|
||||||
|
import { AppConfigService } from "services/app-config.service";
|
||||||
// hooks
|
// hooks
|
||||||
import useToast from "hooks/use-toast";
|
import useToast from "hooks/use-toast";
|
||||||
// components
|
// components
|
||||||
import { EmailPasswordForm, GithubLoginButton, GoogleLoginButton, EmailCodeForm } from "components/accounts";
|
import { EmailPasswordForm, GoogleLoginButton, EmailCodeForm } from "components/accounts";
|
||||||
// images
|
// images
|
||||||
const imagePrefix = Boolean(parseInt(process.env.NEXT_PUBLIC_DEPLOY_WITH_NGINX || "0")) ? "/spaces" : "";
|
const imagePrefix = Boolean(parseInt(process.env.NEXT_PUBLIC_DEPLOY_WITH_NGINX || "0")) ? "/spaces" : "";
|
||||||
|
|
||||||
|
const appConfig = new AppConfigService();
|
||||||
|
|
||||||
export const SignInView = observer(() => {
|
export const SignInView = observer(() => {
|
||||||
const { user: userStore } = useMobxStore();
|
const { user: userStore } = useMobxStore();
|
||||||
|
// router
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const { next_path } = router.query as { next_path: string };
|
const { next_path } = router.query as { next_path: string };
|
||||||
|
// toast
|
||||||
const { setToastAlert } = useToast();
|
const { setToastAlert } = useToast();
|
||||||
|
// fetch app config
|
||||||
|
const { data } = useSWR("APP_CONFIG", () => appConfig.envConfig());
|
||||||
|
|
||||||
const onSignInError = (error: any) => {
|
const onSignInError = (error: any) => {
|
||||||
setToastAlert({
|
setToastAlert({
|
||||||
@ -64,24 +67,6 @@ export const SignInView = observer(() => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleGitHubSignIn = async (credential: string) => {
|
|
||||||
try {
|
|
||||||
if (process.env.NEXT_PUBLIC_GITHUB_ID && credential) {
|
|
||||||
const socialAuthPayload = {
|
|
||||||
medium: "github",
|
|
||||||
credential,
|
|
||||||
clientId: process.env.NEXT_PUBLIC_GITHUB_ID,
|
|
||||||
};
|
|
||||||
const response = await authenticationService.socialAuth(socialAuthPayload);
|
|
||||||
onSignInSuccess(response);
|
|
||||||
} else {
|
|
||||||
throw Error("Cant find credentials");
|
|
||||||
}
|
|
||||||
} catch (err: any) {
|
|
||||||
onSignInError(err);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const handlePasswordSignIn = async (formData: any) => {
|
const handlePasswordSignIn = async (formData: any) => {
|
||||||
await authenticationService
|
await authenticationService
|
||||||
.emailLogin(formData)
|
.emailLogin(formData)
|
||||||
@ -119,38 +104,32 @@ export const SignInView = observer(() => {
|
|||||||
</div>
|
</div>
|
||||||
<div className="grid place-items-center h-full overflow-y-auto py-5 px-7">
|
<div className="grid place-items-center h-full overflow-y-auto py-5 px-7">
|
||||||
<div>
|
<div>
|
||||||
{parseInt(process.env.NEXT_PUBLIC_ENABLE_OAUTH || "0") ? (
|
<h1 className="text-center text-2xl sm:text-2.5xl font-semibold text-custom-text-100">Sign in to Plane</h1>
|
||||||
<>
|
{data?.email_password_login && <EmailPasswordForm onSubmit={handlePasswordSignIn} />}
|
||||||
<h1 className="text-center text-2xl sm:text-2.5xl font-semibold text-custom-text-100">
|
|
||||||
Sign in to Plane
|
{data?.magic_login && (
|
||||||
</h1>
|
<div className="flex flex-col divide-y divide-custom-border-200">
|
||||||
<div className="flex flex-col divide-y divide-custom-border-200">
|
<div className="pb-7">
|
||||||
<div className="pb-7">
|
<EmailCodeForm handleSignIn={handleEmailCodeSignIn} />
|
||||||
<EmailCodeForm handleSignIn={handleEmailCodeSignIn} />
|
|
||||||
</div>
|
|
||||||
<div className="flex flex-col items-center justify-center gap-4 pt-7 sm:w-[360px] mx-auto overflow-hidden">
|
|
||||||
<GoogleLoginButton handleSignIn={handleGoogleSignIn} />
|
|
||||||
{/* <GithubLoginButton handleSignIn={handleGitHubSignIn} /> */}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</>
|
</div>
|
||||||
) : (
|
|
||||||
<EmailPasswordForm onSubmit={handlePasswordSignIn} />
|
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{parseInt(process.env.NEXT_PUBLIC_ENABLE_OAUTH || "0") ? (
|
<div className="flex flex-col items-center justify-center gap-4 pt-7 sm:w-[360px] mx-auto overflow-hidden">
|
||||||
<p className="pt-16 text-custom-text-200 text-sm text-center">
|
{data?.google && <GoogleLoginButton clientId={data.google} handleSignIn={handleGoogleSignIn} />}
|
||||||
By signing up, you agree to the{" "}
|
</div>
|
||||||
<a
|
|
||||||
href="https://plane.so/terms-and-conditions"
|
<p className="pt-16 text-custom-text-200 text-sm text-center">
|
||||||
target="_blank"
|
By signing up, you agree to the{" "}
|
||||||
rel="noopener noreferrer"
|
<a
|
||||||
className="font-medium underline"
|
href="https://plane.so/terms-and-conditions"
|
||||||
>
|
target="_blank"
|
||||||
Terms & Conditions
|
rel="noopener noreferrer"
|
||||||
</a>
|
className="font-medium underline"
|
||||||
</p>
|
>
|
||||||
) : null}
|
Terms & Conditions
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
30
space/services/app-config.service.ts
Normal file
30
space/services/app-config.service.ts
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
// services
|
||||||
|
import APIService from "services/api.service";
|
||||||
|
// helper
|
||||||
|
import { API_BASE_URL } from "helpers/common.helper";
|
||||||
|
|
||||||
|
export interface IEnvConfig {
|
||||||
|
github: string;
|
||||||
|
google: string;
|
||||||
|
github_app_name: string | null;
|
||||||
|
email_password_login: boolean;
|
||||||
|
magic_login: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class AppConfigService extends APIService {
|
||||||
|
constructor() {
|
||||||
|
super(API_BASE_URL);
|
||||||
|
}
|
||||||
|
|
||||||
|
async envConfig(): Promise<IEnvConfig> {
|
||||||
|
return this.get("/api/configs/", {
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.then((response) => response?.data)
|
||||||
|
.catch((error) => {
|
||||||
|
throw error?.response?.data;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -1,8 +1,6 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://turbo.build/schema.json",
|
"$schema": "https://turbo.build/schema.json",
|
||||||
"globalEnv": [
|
"globalEnv": [
|
||||||
"NEXT_PUBLIC_GITHUB_ID",
|
|
||||||
"NEXT_PUBLIC_GOOGLE_CLIENTID",
|
|
||||||
"NEXT_PUBLIC_API_BASE_URL",
|
"NEXT_PUBLIC_API_BASE_URL",
|
||||||
"NEXT_PUBLIC_DEPLOY_URL",
|
"NEXT_PUBLIC_DEPLOY_URL",
|
||||||
"API_BASE_URL",
|
"API_BASE_URL",
|
||||||
|
@ -85,11 +85,11 @@ const HomePage: NextPage = observer(() => {
|
|||||||
|
|
||||||
const handleGitHubSignIn = async (credential: string) => {
|
const handleGitHubSignIn = async (credential: string) => {
|
||||||
try {
|
try {
|
||||||
if (process.env.NEXT_PUBLIC_GITHUB_ID && credential) {
|
if (data && data.github && credential) {
|
||||||
const socialAuthPayload = {
|
const socialAuthPayload = {
|
||||||
medium: "github",
|
medium: "github",
|
||||||
credential,
|
credential,
|
||||||
clientId: process.env.NEXT_PUBLIC_GITHUB_ID,
|
clientId: data.github,
|
||||||
};
|
};
|
||||||
const response = await authenticationService.socialAuth(socialAuthPayload);
|
const response = await authenticationService.socialAuth(socialAuthPayload);
|
||||||
if (response && response?.user) {
|
if (response && response?.user) {
|
||||||
|
Loading…
Reference in New Issue
Block a user