Skip to content

Commit 5a3cdf3

Browse files
committed
feat: deploy
1 parent 5bb0cbf commit 5a3cdf3

3 files changed

Lines changed: 71 additions & 32 deletions

File tree

.husky/pre-commit

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@ npm run format:check
2020

2121
# Run build check to ensure no build errors
2222
echo "🏗️ Running build check..."
23-
npm run build
23+
# npm run build
2424

2525
echo "✅ All pre-commit checks passed!"

components/landing-page/project/CreateProjectModal/Team.tsx

Lines changed: 64 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ interface TeamProps {
1212

1313
export interface TeamMember {
1414
id: string;
15-
username: string;
15+
email: string;
1616
role?: string;
1717
}
1818

@@ -35,9 +35,11 @@ const Team = React.forwardRef<{ validate: () => boolean }, TeamProps>(
3535
}, [initialData]);
3636

3737
const [searchQuery, setSearchQuery] = useState('');
38-
const [errors, setErrors] = useState<{ members?: string }>({});
38+
const [errors, setErrors] = useState<{ members?: string; email?: string }>(
39+
{}
40+
);
3941

40-
const handleInputChange = (
42+
const handleFormDataChange = (
4143
field: keyof TeamFormData,
4244
value: TeamMember[]
4345
) => {
@@ -51,7 +53,12 @@ const Team = React.forwardRef<{ validate: () => boolean }, TeamProps>(
5153
onDataChange?.(newData);
5254
};
5355

54-
const addMember = (username: string) => {
56+
const isValidEmail = (email: string): boolean => {
57+
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
58+
return emailRegex.test(email);
59+
};
60+
61+
const addMember = (email: string) => {
5562
if (formData.members.length >= 4) {
5663
setErrors(prev => ({
5764
...prev,
@@ -60,26 +67,47 @@ const Team = React.forwardRef<{ validate: () => boolean }, TeamProps>(
6067
return;
6168
}
6269

63-
const trimmed = username.trim();
64-
if (
65-
trimmed &&
66-
!formData.members.some(member => member.username === trimmed)
67-
) {
68-
const newMember: TeamMember = {
69-
id: Date.now().toString(),
70-
username: trimmed,
71-
role: 'MEMBER',
72-
};
73-
handleInputChange('members', [...formData.members, newMember]);
74-
setSearchQuery('');
70+
const trimmed = email.trim();
71+
72+
if (!trimmed) {
73+
setErrors(prev => ({
74+
...prev,
75+
email: 'Please enter an email address.',
76+
}));
77+
return;
78+
}
79+
80+
if (!isValidEmail(trimmed)) {
81+
setErrors(prev => ({
82+
...prev,
83+
email: 'Please enter a valid email address.',
84+
}));
85+
return;
86+
}
87+
88+
if (formData.members.some(member => member.email === trimmed)) {
89+
setErrors(prev => ({
90+
...prev,
91+
email: 'This email is already added to the team.',
92+
}));
93+
return;
7594
}
95+
96+
const newMember: TeamMember = {
97+
id: Date.now().toString(),
98+
email: trimmed,
99+
role: 'MEMBER',
100+
};
101+
handleFormDataChange('members', [...formData.members, newMember]);
102+
setSearchQuery('');
103+
setErrors(prev => ({ ...prev, email: undefined }));
76104
};
77105

78106
const removeMember = (id: string) => {
79107
const updatedMembers = formData.members.filter(
80108
member => member.id !== id
81109
);
82-
handleInputChange('members', updatedMembers);
110+
handleFormDataChange('members', updatedMembers);
83111
};
84112

85113
const handleKeyPress = (e: React.KeyboardEvent) => {
@@ -89,8 +117,18 @@ const Team = React.forwardRef<{ validate: () => boolean }, TeamProps>(
89117
}
90118
};
91119

120+
const handleEmailInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
121+
const value = e.target.value;
122+
setSearchQuery(value);
123+
124+
// Clear email error when user starts typing
125+
if (errors.email) {
126+
setErrors(prev => ({ ...prev, email: undefined }));
127+
}
128+
};
129+
92130
const validateForm = (): boolean => {
93-
const newErrors: { members?: string } = {};
131+
const newErrors: { members?: string; email?: string } = {};
94132

95133
setErrors(newErrors);
96134
return Object.keys(newErrors).length === 0;
@@ -122,7 +160,7 @@ const Team = React.forwardRef<{ validate: () => boolean }, TeamProps>(
122160

123161
<div className='space-y-4'>
124162
<Label className='text-white'>
125-
Invite members to your team (optional)
163+
Invite members to your team by email (optional)
126164
</Label>
127165

128166
<div className='space-y-4'>
@@ -133,9 +171,7 @@ const Team = React.forwardRef<{ validate: () => boolean }, TeamProps>(
133171
key={member.id}
134172
className='flex items-center space-x-1 rounded-full bg-[#A7F95014] py-1.5 pr-1.5 pl-2'
135173
>
136-
<span className='text-primary text-sm'>
137-
{member.username}
138-
</span>
174+
<span className='text-primary text-sm'>{member.email}</span>
139175
<Button
140176
type='button'
141177
variant='ghost'
@@ -164,10 +200,10 @@ const Team = React.forwardRef<{ validate: () => boolean }, TeamProps>(
164200
))}
165201

166202
<input
167-
type='text'
168-
placeholder={'Search by name, handle, or email'}
203+
type='email'
204+
placeholder={'Enter email address'}
169205
value={searchQuery}
170-
onChange={e => setSearchQuery(e.target.value)}
206+
onChange={handleEmailInputChange}
171207
onKeyPress={handleKeyPress}
172208
className='min-w-[200px] flex-1 bg-transparent text-sm text-white placeholder:text-[#919191] focus:outline-none'
173209
/>
@@ -189,6 +225,9 @@ const Team = React.forwardRef<{ validate: () => boolean }, TeamProps>(
189225
{errors.members && (
190226
<p className='text-sm text-red-500'>{errors.members}</p>
191227
)}
228+
{errors.email && (
229+
<p className='text-sm text-red-500'>{errors.email}</p>
230+
)}
192231
</div>
193232
</div>
194233
);

components/landing-page/project/CreateProjectModal/index.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -199,9 +199,9 @@ const CreateProjectModal = ({ open, setOpen }: CreateProjectModalProps) => {
199199

200200
// Convert team members to API format
201201
const apiTeam = (team.members || []).map(member => ({
202-
name: member.username,
202+
name: member.email.split('@')[0], // Extract name from email
203203
role: member.role || 'MEMBER',
204-
email: `${member.username}@example.com`, // Placeholder email
204+
email: member.email,
205205
}));
206206

207207
// Convert social links to API format
@@ -362,7 +362,7 @@ const CreateProjectModal = ({ open, setOpen }: CreateProjectModalProps) => {
362362
.array(
363363
z.object({
364364
id: z.string(),
365-
username: z.string().trim().min(1),
365+
email: z.string().email(),
366366
role: z.string().optional(),
367367
})
368368
)
@@ -572,17 +572,17 @@ Our development is structured in clear phases with measurable milestones and com
572572
members: [
573573
{
574574
id: 'member-1',
575-
username: 'alice_dev',
575+
email: 'alice.dev@example.com',
576576
role: 'Lead Developer',
577577
},
578578
{
579579
id: 'member-2',
580-
username: 'bob_crypto',
580+
email: 'bob.crypto@example.com',
581581
role: 'Smart Contract Engineer',
582582
},
583583
{
584584
id: 'member-3',
585-
username: 'charlie_ux',
585+
email: 'charlie.ux@example.com',
586586
role: 'Frontend Developer',
587587
},
588588
],

0 commit comments

Comments
 (0)