Change UI for create new project page (#54)

* Change create new project ui for git authentication

* Use submit handler method from react hook form

* Handle review changes

* Have a pre-selected value for connect account tab panel
This commit is contained in:
Nabarun Gogoi 2024-02-05 16:56:53 +05:30 committed by GitHub
parent da92ddfba3
commit 1c9597739b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 86 additions and 45 deletions

View File

@ -16,8 +16,5 @@
"plugin:react/recommended", "plugin:react/recommended",
"plugin:@typescript-eslint/recommended", "plugin:@typescript-eslint/recommended",
"plugin:prettier/recommended" "plugin:prettier/recommended"
], ]
"rules": {
"@typescript-eslint/no-explicit-any": "off"
}
} }

View File

@ -3,6 +3,7 @@ import React from 'react';
import OauthPopup from 'react-oauth-popup'; import OauthPopup from 'react-oauth-popup';
import { useGQLClient } from '../../../context/GQLClientContext'; import { useGQLClient } from '../../../context/GQLClientContext';
import ConnectAccountTabPanel from './ConnectAccountTabPanel';
const SCOPES = 'repo user'; const SCOPES = 'repo user';
const GITHUB_OAUTH_URL = `https://github.com/login/oauth/authorize?client_id=${ const GITHUB_OAUTH_URL = `https://github.com/login/oauth/authorize?client_id=${
@ -24,8 +25,9 @@ const ConnectAccount = ({ onAuth: onToken }: ConnectAccountInterface) => {
onToken(token); onToken(token);
}; };
// TODO: Use correct height
return ( return (
<div className="bg-gray-100 flex flex-col p-4 justify-end items-center text-center text-sm h-60 rounded-2xl"> <div className="bg-gray-100 flex flex-col p-4 justify-center items-center text-center text-sm h-full rounded-2xl">
<div>^</div> <div>^</div>
<div> <div>
<p>Connect to your git account</p> <p>Connect to your git account</p>
@ -47,6 +49,7 @@ const ConnectAccount = ({ onAuth: onToken }: ConnectAccountInterface) => {
</OauthPopup> </OauthPopup>
<Button className="rounded-full mx-2">Connect to Gitea</Button> <Button className="rounded-full mx-2">Connect to Gitea</Button>
</div> </div>
<ConnectAccountTabPanel />
</div> </div>
); );
}; };

View File

@ -0,0 +1,26 @@
import React from 'react';
import { Tabs, TabsHeader, Tab } from '@material-tailwind/react';
const ConnectAccountTabPanel = () => {
return (
<Tabs
className="grid bg-white h-32 p-2 m-4 rounded-md"
value="git repository"
>
<TabsHeader className="grid grid-cols-2">
<Tab className="row-span-1" value="git repository">
Import a repository
</Tab>
<Tab className="row-span-2" value="template">
Start with a template
</Tab>
</TabsHeader>
{/* <TabsBody> */}
{/* TODO: Add content */}
{/* </TabsBody> */}
</Tabs>
);
};
export default ConnectAccountTabPanel;

View File

@ -1,5 +1,5 @@
import React, { useCallback, useEffect, useMemo } from 'react'; import React, { useCallback, useEffect, useMemo } from 'react';
import { Controller, useForm } from 'react-hook-form'; import { Controller, useForm, SubmitHandler } from 'react-hook-form';
import toast from 'react-hot-toast'; import toast from 'react-hot-toast';
import { Domain } from 'gql-client'; import { Domain } from 'gql-client';
@ -29,6 +29,12 @@ interface EditDomainDialogProp {
onUpdate: () => Promise<void>; onUpdate: () => Promise<void>;
} }
type EditDomainValues = {
name: string;
branch: string;
redirectedTo: string;
};
const EditDomainDialog = ({ const EditDomainDialog = ({
domains, domains,
open, open,
@ -81,8 +87,8 @@ const EditDomainDialog = ({
}, },
}); });
const updateDomainHandler = useCallback( const updateDomainHandler: SubmitHandler<EditDomainValues> = useCallback(
async (data: any) => { async (data) => {
const domainRedirectTo = domains.find( const domainRedirectTo = domains.find(
(domainData) => data.redirectedTo === domainData.name, (domainData) => data.redirectedTo === domainData.name,
); );

View File

@ -1,5 +1,5 @@
import React, { useCallback, useEffect } from 'react'; import React, { useCallback, useEffect } from 'react';
import { useForm } from 'react-hook-form'; import { SubmitHandler, useForm } from 'react-hook-form';
import toast from 'react-hot-toast'; import toast from 'react-hot-toast';
import { Project } from 'gql-client'; import { Project } from 'gql-client';
@ -8,6 +8,14 @@ import { Button, Input, Switch, Typography } from '@material-tailwind/react';
import WebhookCard from './WebhookCard'; import WebhookCard from './WebhookCard';
import { useGQLClient } from '../../../../context/GQLClientContext'; import { useGQLClient } from '../../../../context/GQLClientContext';
type UpdateProdBranchValues = {
prodBranch: string;
};
type UpdateWebhooksValues = {
webhookUrl: string;
};
const GitTabPanel = ({ const GitTabPanel = ({
project, project,
onUpdate, onUpdate,
@ -27,21 +35,22 @@ const GitTabPanel = ({
}, },
}); });
const updateProdBranchHandler = useCallback( const updateProdBranchHandler: SubmitHandler<UpdateProdBranchValues> =
async (data: any) => { useCallback(
const { updateProject } = await client.updateProject(project.id, { async (data) => {
prodBranch: data.prodBranch, const { updateProject } = await client.updateProject(project.id, {
}); prodBranch: data.prodBranch,
});
if (updateProject) { if (updateProject) {
await onUpdate(); await onUpdate();
toast.success('Production branch upadated successfully'); toast.success('Production branch upadated successfully');
} else { } else {
toast.error('Error updating production branch'); toast.error('Error updating production branch');
} }
}, },
[project], [project],
); );
const { const {
register: registerWebhooks, register: registerWebhooks,
@ -53,23 +62,24 @@ const GitTabPanel = ({
}, },
}); });
const updateWebhooksHandler = useCallback( const updateWebhooksHandler: SubmitHandler<UpdateWebhooksValues> =
async (data: any) => { useCallback(
const { updateProject } = await client.updateProject(project.id, { async (data) => {
webhooks: [...project.webhooks, data.webhookUrl], const { updateProject } = await client.updateProject(project.id, {
}); webhooks: [...project.webhooks, data.webhookUrl],
});
if (updateProject) { if (updateProject) {
await onUpdate(); await onUpdate();
toast.success('Webhook added successfully'); toast.success('Webhook added successfully');
} else { } else {
toast.error('Error adding webhook'); toast.error('Error adding webhook');
} }
resetWebhooks(); resetWebhooks();
}, },
[project], [project],
); );
useEffect(() => { useEffect(() => {
resetProdBranch({ resetProdBranch({

View File

@ -2,6 +2,8 @@
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import { Select, SelectProps } from '@material-tailwind/react'; import { Select, SelectProps } from '@material-tailwind/react';
// TODO: Use correct type for ref
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const AsyncSelect = React.forwardRef((props: SelectProps, ref: any) => { const AsyncSelect = React.forwardRef((props: SelectProps, ref: any) => {
const [key, setKey] = useState(0); const [key, setKey] = useState(0);

View File

@ -9,7 +9,7 @@ import { useOctokit } from '../../../context/OctokitContext';
const NewProject = () => { const NewProject = () => {
const { octokit, updateAuth } = useOctokit(); const { octokit, updateAuth } = useOctokit();
return ( return Boolean(octokit) ? (
<> <>
<h5 className="mt-4 ml-4">Start with template</h5> <h5 className="mt-4 ml-4">Start with template</h5>
<div className="grid grid-cols-3 p-4 gap-4"> <div className="grid grid-cols-3 p-4 gap-4">
@ -24,12 +24,10 @@ const NewProject = () => {
})} })}
</div> </div>
<h5 className="mt-4 ml-4">Import a repository</h5> <h5 className="mt-4 ml-4">Import a repository</h5>
{Boolean(octokit) ? ( <RepositoryList octokit={octokit!} />
<RepositoryList octokit={octokit!} />
) : (
<ConnectAccount onAuth={updateAuth} />
)}
</> </>
) : (
<ConnectAccount onAuth={updateAuth} />
); );
}; };

View File

@ -17,7 +17,6 @@
], ],
"rules": { "rules": {
"indent": ["error", 2, { "SwitchCase": 1 }], "indent": ["error", 2, { "SwitchCase": 1 }],
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/explicit-module-boundary-types": [ "@typescript-eslint/explicit-module-boundary-types": [
"warn", "warn",
{ {