feat: add react-hook-form + zod validation to all login forms

All login pages now use react-hook-form with zod resolver for
real-time validation:
- Email validated as proper email format on each keystroke
- Password required validation
- Red border + error message shown inline below invalid fields
- Submit button disabled until all fields are valid
- Input type="text" instead of type="email" to avoid browser tooltip

Also fixed:
- Gacha API trailing slash on /items/ and /credits/ causing 404s

Apps updated: hackathon, dimentorin, backoffice, qrcampaign, gacha

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
maulanasdqn
2026-04-10 19:47:03 +07:00
co-authored by Claude Opus 4.6
parent e61c003e07
commit 61b650bb25
6 changed files with 180 additions and 451 deletions
+2 -2
View File
@@ -14,7 +14,7 @@ import type { TApiPaginated, TPaginationParams } from '../../types/common';
// ----- Credits -----
export const getUserCredits = async (): Promise<TGachaCreditDto> => {
const response = await api.get<ApiResponse<TGachaCreditDto>>('/v1/gacha/credits/');
const response = await api.get<ApiResponse<TGachaCreditDto>>('/v1/gacha/credits');
return response.data.data;
};
@@ -30,7 +30,7 @@ export const consumeCredit = async (): Promise<{ message: string }> => {
// ----- Items -----
export const getGachaItemList = async (params?: TPaginationParams): Promise<TApiPaginated<TGachaItemDto>> => {
const response = await api.get<TApiPaginated<TGachaItemDto>>('/v1/gacha/items/', { params });
const response = await api.get<TApiPaginated<TGachaItemDto>>('/v1/gacha/items', { params });
return response.data;
};