| 
 | 1 | +import { Select, SelectItem } from "@nextui-org/select";  | 
 | 2 | +import { Button } from "@nextui-org/button";  | 
 | 3 | +import { Input } from "@nextui-org/input";  | 
 | 4 | + | 
1 | 5 | import useIndex, { LICENSE_TYPES } from "@/hooks/useIndex";  | 
2 | 6 | 
 
  | 
3 | 7 | export default function IndexPage() {  | 
4 | 8 |   const { formData, setFormData, handleSubmit } = useIndex();  | 
5 | 9 | 
 
  | 
6 | 10 |   return (  | 
7 |  | -    <div className="min-h-screen bg-gray-100 py-12 px-4 sm:px-6 lg:px-8">  | 
8 |  | -      <div className="max-w-md mx-auto bg-white rounded-lg shadow-lg p-8">  | 
9 |  | -        <h1 className="text-3xl font-bold text-center text-gray-900 mb-8">  | 
 | 11 | +    <div className="min-h-screen py-12">  | 
 | 12 | +      <div className="max-w-md mx-auto p-8">  | 
 | 13 | +        <h1 className="text-3xl font-bold text-center mb-8">  | 
10 | 14 |           MobaXterm Keygen  | 
11 | 15 |         </h1>  | 
12 | 16 | 
 
  | 
13 | 17 |         <form className="space-y-6" onSubmit={handleSubmit}>  | 
14 |  | -          <div>  | 
15 |  | -            <label  | 
16 |  | -              className="block text-sm font-medium text-gray-700"  | 
17 |  | -              htmlFor="licenseType"  | 
18 |  | -            >  | 
19 |  | -              License Type:  | 
20 |  | -            </label>  | 
21 |  | -            <select  | 
22 |  | -              className="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500"  | 
23 |  | -              id="licenseType"  | 
24 |  | -              value={formData.licenseType}  | 
25 |  | -              onChange={(e) =>  | 
26 |  | -                setFormData({ ...formData, licenseType: e.target.value })  | 
27 |  | -              }  | 
28 |  | -            >  | 
29 |  | -              {Object.entries(LICENSE_TYPES).map(([key, value]) => (  | 
30 |  | -                <option key={value} value={value}>  | 
31 |  | -                  {key}  | 
32 |  | -                </option>  | 
33 |  | -              ))}  | 
34 |  | -            </select>  | 
35 |  | -          </div>  | 
 | 18 | +          <Select  | 
 | 19 | +            label="License Type"  | 
 | 20 | +            value={formData.licenseType}  | 
 | 21 | +            onChange={(e) =>  | 
 | 22 | +              setFormData({ ...formData, licenseType: e.target.value })  | 
 | 23 | +            }  | 
 | 24 | +          >  | 
 | 25 | +            {Object.entries(LICENSE_TYPES).map(([key, value]) => (  | 
 | 26 | +              <SelectItem key={value} value={value}>  | 
 | 27 | +                {key}  | 
 | 28 | +              </SelectItem>  | 
 | 29 | +            ))}  | 
 | 30 | +          </Select>  | 
36 | 31 | 
 
  | 
37 |  | -          <div>  | 
38 |  | -            <label  | 
39 |  | -              className="block text-sm font-medium text-gray-700"  | 
40 |  | -              htmlFor="userName"  | 
41 |  | -            >  | 
42 |  | -              Username:  | 
43 |  | -            </label>  | 
44 |  | -            <input  | 
45 |  | -              className="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500"  | 
46 |  | -              id="userName"  | 
47 |  | -              pattern="[a-zA-Z]+"  | 
48 |  | -              placeholder="Example: mobaXterm"  | 
49 |  | -              title="Only letters are allowed"  | 
50 |  | -              type="text"  | 
51 |  | -              value={formData.userName}  | 
52 |  | -              onChange={(e) =>  | 
53 |  | -                setFormData({ ...formData, userName: e.target.value })  | 
54 |  | -              }  | 
55 |  | -            />  | 
56 |  | -          </div>  | 
 | 32 | +          <Input  | 
 | 33 | +            label="Username"  | 
 | 34 | +            placeholder="Example: mobaXterm"  | 
 | 35 | +            value={formData.userName}  | 
 | 36 | +            onChange={(e) =>  | 
 | 37 | +              setFormData({ ...formData, userName: e.target.value })  | 
 | 38 | +            }  | 
 | 39 | +            pattern="[a-zA-Z]+"  | 
 | 40 | +            description="Only letters are allowed"  | 
 | 41 | +          />  | 
57 | 42 | 
 
  | 
58 |  | -          <div>  | 
59 |  | -            <label  | 
60 |  | -              className="block text-sm font-medium text-gray-700"  | 
61 |  | -              htmlFor="versionName"  | 
62 |  | -            >  | 
63 |  | -              Version:  | 
64 |  | -            </label>  | 
65 |  | -            <input  | 
66 |  | -              className="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500"  | 
67 |  | -              id="versionName"  | 
68 |  | -              pattern="^[1-9][0-9]*\.?\d{0,1}$"  | 
69 |  | -              placeholder="Example: 24.3"  | 
70 |  | -              title="Decimal number, and only one digit after the decimal point is allowed"  | 
71 |  | -              value={formData.versionName}  | 
72 |  | -              onChange={(e) =>  | 
73 |  | -                setFormData({ ...formData, versionName: e.target.value })  | 
74 |  | -              }  | 
75 |  | -            />  | 
76 |  | -          </div>  | 
 | 43 | +          <Input  | 
 | 44 | +            label="Version"  | 
 | 45 | +            placeholder="Example: 24.3"  | 
 | 46 | +            value={formData.versionName}  | 
 | 47 | +            onChange={(e) =>  | 
 | 48 | +              setFormData({ ...formData, versionName: e.target.value })  | 
 | 49 | +            }  | 
 | 50 | +            pattern="^[1-9][0-9]*\.?\d{0,1}$"  | 
 | 51 | +            description="Decimal number, and only one digit after the decimal point is allowed"  | 
 | 52 | +          />  | 
77 | 53 | 
 
  | 
78 |  | -          <div>  | 
79 |  | -            <label  | 
80 |  | -              className="block text-sm font-medium text-gray-700"  | 
81 |  | -              htmlFor="userNum"  | 
82 |  | -            >  | 
83 |  | -              Number of Users:  | 
84 |  | -            </label>  | 
85 |  | -            <input  | 
86 |  | -              className="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500"  | 
87 |  | -              id="userNum"  | 
88 |  | -              max="214783647"  | 
89 |  | -              pattern="^[1-9]+\d*$"  | 
90 |  | -              placeholder="Example: 1"  | 
91 |  | -              title="Number must be between 1 and 214783647"  | 
92 |  | -              type="text"  | 
93 |  | -              value={formData.userNum}  | 
94 |  | -              onChange={(e) =>  | 
95 |  | -                setFormData({ ...formData, userNum: e.target.value })  | 
96 |  | -              }  | 
97 |  | -            />  | 
98 |  | -          </div>  | 
 | 54 | +          <Input  | 
 | 55 | +            description="Number must be between 1 and 214783647"  | 
 | 56 | +            label="Number of Users"  | 
 | 57 | +            placeholder="Example: 1"  | 
 | 58 | +            value={formData.userNum}  | 
 | 59 | +            pattern="^[1-9]+\d*$"  | 
 | 60 | +            onChange={(e) =>  | 
 | 61 | +              setFormData({ ...formData, userNum: e.target.value })  | 
 | 62 | +            }  | 
 | 63 | +          />  | 
99 | 64 | 
 
  | 
100 |  | -          <button  | 
101 |  | -            className="w-full flex justify-center py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500"  | 
 | 65 | +          <Button  | 
 | 66 | +            color="secondary"  | 
 | 67 | +            variant="shadow"  | 
102 | 68 |             type="submit"  | 
 | 69 | +            className="w-full"  | 
103 | 70 |           >  | 
104 |  | -            Generate  | 
105 |  | -          </button>  | 
 | 71 | +            Download Key  | 
 | 72 | +          </Button>  | 
106 | 73 |         </form>  | 
107 | 74 |       </div>  | 
108 | 75 |     </div>  | 
 | 
0 commit comments