🔧 chore: reskin with shared components

This commit is contained in:
Andre H 2024-03-01 11:13:17 +08:00
parent 0b64ccc364
commit 6e653774be

View File

@ -1,15 +1,23 @@
import React, { useCallback, useEffect, useState } from 'react'; import React, { useCallback, useEffect, useState } from 'react';
import { useForm, Controller, SubmitHandler } from 'react-hook-form'; import { useForm, SubmitHandler } from 'react-hook-form';
import { useNavigate, useOutletContext, useParams } from 'react-router-dom'; import { useNavigate, useOutletContext, useParams } from 'react-router-dom';
import toast from 'react-hot-toast'; import toast from 'react-hot-toast';
import assert from 'assert'; import assert from 'assert';
import { Button, Option, Typography } from '@material-tailwind/react';
import { useOctokit } from '../../../../../context/OctokitContext'; import { useOctokit } from '../../../../../context/OctokitContext';
import { useGQLClient } from '../../../../../context/GQLClientContext'; import { useGQLClient } from '../../../../../context/GQLClientContext';
import AsyncSelect from '../../../../../components/shared/AsyncSelect';
import { Template } from '../../../../../types'; import { Template } from '../../../../../types';
import { Heading } from 'components/shared/Heading';
import { Input } from 'components/shared/Input';
import { Radio } from 'components/shared/Radio';
import { Select } from 'components/shared/Select';
import {
ArrowRightCircleFilledIcon,
GitIcon,
GitTeaIcon,
} from 'components/shared/CustomIcon';
import { Checkbox } from 'components/shared/Checkbox';
import { Button } from 'components/shared/Button';
type SubmitRepoValues = { type SubmitRepoValues = {
framework: string; framework: string;
@ -30,6 +38,19 @@ const CreateRepo = () => {
const [gitAccounts, setGitAccounts] = useState<string[]>([]); const [gitAccounts, setGitAccounts] = useState<string[]>([]);
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
const FRAMEWORK_OPTIONS = [
{
value: 'react-native',
label: 'React Native',
leftIcon: <GitIcon />,
},
{
value: 'expo',
label: 'Expo',
leftIcon: <GitTeaIcon />,
},
];
const submitRepoHandler: SubmitHandler<SubmitRepoValues> = useCallback( const submitRepoHandler: SubmitHandler<SubmitRepoValues> = useCallback(
async (data) => { async (data) => {
assert(data.account); assert(data.account);
@ -93,7 +114,7 @@ const CreateRepo = () => {
fetchUserAndOrgs(); fetchUserAndOrgs();
}, [octokit]); }, [octokit]);
const { register, handleSubmit, control, reset } = useForm<SubmitRepoValues>({ const { handleSubmit, reset } = useForm<SubmitRepoValues>({
defaultValues: { defaultValues: {
framework: 'React', framework: 'React',
repoName: '', repoName: '',
@ -110,86 +131,49 @@ const CreateRepo = () => {
return ( return (
<form onSubmit={handleSubmit(submitRepoHandler)}> <form onSubmit={handleSubmit(submitRepoHandler)}>
<div className="mb-2"> <div className="flex flex-col gap-4 lg:gap-7 w-full">
<Typography variant="h6" placeholder={''}>
Create a repository
</Typography>
<Typography color="gray" placeholder={''}>
The project will be cloned into this repository
</Typography>
</div>
<div className="mb-2">
<h5>Framework</h5>
<div className="flex items-center gap-2">
<label className="inline-flex items-center w-1/2 border rounded-lg p-2">
<input
type="radio"
{...register('framework')}
value="React"
className="h-5 w-5 text-indigo-600 rounded"
/>
<span className="ml-2">^React</span>
</label>
<label className="inline-flex items-center w-1/2 border rounded-lg p-2">
<input
type="radio"
{...register('framework')}
className="h-5 w-5 text-indigo-600 rounded"
value="Next"
/>
<span className="ml-2">^Next</span>
</label>
</div>
</div>
<div className="mb-2">
<h5>Git account</h5>
<div> <div>
<Controller <Heading className="text-lg font-medium">Create a repository</Heading>
name="account" <Heading className="text-sm text-elements-low-em">
control={control} The project will be cloned into this repository
render={({ field }) => ( </Heading>
<AsyncSelect {...field}> </div>
{gitAccounts.map((account, key) => ( <div className="flex flex-col justify-start gap-3">
<Option key={key} value={account}> <Heading className="text-sm">Framework</Heading>
^ {account} <Radio
</Option> variant="card"
))} options={FRAMEWORK_OPTIONS}
</AsyncSelect> orientation="horizontal"
)}
/> />
</div> </div>
</div> <div className="flex flex-col justify-start gap-3">
<div className="mb-2"> <Heading className="text-sm">Git account</Heading>
<h5>Name the repo</h5> <Select
options={
gitAccounts.map((account) => ({
value: account,
label: account,
})) ?? []
}
/>
</div>
<div className="flex flex-col justify-start gap-3">
<Heading className="text-sm">Name the repo</Heading>
<Input />
</div>
<div> <div>
<input <Checkbox label="Make this repo private" value={'private-repo'} />
type="text" </div>
className="border border-gray-300 rounded p-2 w-full focus:border-blue-300 focus:outline-none focus:shadow-outline-blue" <div>
placeholder="" <Button
{...register('repoName')} type="submit"
/> size="lg"
disabled={!Boolean(template.repoFullName) || isLoading}
rightIcon={<ArrowRightCircleFilledIcon />}
>
Deploy
</Button>
</div> </div>
</div>
<div className="mb-2">
<label className="inline-flex items-center">
<input
type="checkbox"
className="h-5 w-5 text-indigo-600 rounded"
{...register('isPrivate')}
/>
<span className="ml-2">Make this repo private</span>
</label>
</div>
<div className="mb-2">
<Button
className="bg-blue-500 rounded-xl p-2"
type="submit"
disabled={!Boolean(template.repoFullName) || isLoading}
loading={isLoading}
placeholder={''}
>
Deploy ^
</Button>
</div> </div>
</form> </form>
); );