* feat: setup openapi libs for landing * feat: seperate landing layouts * feat: movee landing providers * feat: add auth layout * feat: implement cookie management for access and refresh tokens * feat: replace Inter font with Bai Jamjuree in layout and add font utility * feat: add signin * feat: add Poppins font to the font utility * feat: expand theme colors in index.css for improved styling options * feat: update dependencies and enhance button and form components with new variants and context * feat: move old components to __old__ dir * feat: add react query support * feat: hide the footer * fix: header style * feat: replace Image component with LogoSimple in Header and update Logo component to accept props * fix: update label for tutorial stat in hero-stats.json * feat: implement EventsPage component with event listing and details * feat: add signup button and page * feat: add HERO_CONTENT data and integrate into Hero component * fix: update navigations import to uppercase and add missing Testimoni entry * feat: implement testimonials display and add submission page * fix: correct link path for testimonial submission * feat: add communites component and integrate social links from JSON data * fix: adjust grid gap in Communities component for better layout * fix: update font imports in layout components for consistency * fix: replace text logo with LogoSimple component in Footer and restore Footer in Layout * feat: add TestimonialSection component and update testimonials data * fix: update section ID from 'komunitas' to 'community' for consistency * feat: add CTASection component with interactive elements and background pattern * fix: update join URL in hero content for consistency * fix: update text in CTASection for improved emphasis and consistency * feat: add CommunitySection component and integrate it into the main page * feat: update Footer component to use dynamic navigation and social links * feat: implement HeroSection component with dynamic content and animations * refactor: replace hardcoded testimonials with dynamic data from JSON * feat: add signup page * feat: integrate Turnstile captcha verification in signup process * feat: implement verification page * feat: add signin link to the signup page * feat: add "Forgot Password?" link to the signin form * refactor: clean up unused ThemeProvider code and CSS variables * feat: add base styles for borders and background to improve UI consistency * feat: implement forgot password functionality with validation and UI components * fix: update password validation rules for clarity and consistency * feat: enable rich colors for Toaster component in layout * feat: implement reset password functionality with validation and UI components * feat: implement Turnstile captcha verification for forgot password and signup actions * refactor: remove console log and enhance error handling in signin and resend OTP actions * feat: add navigation entries for Roadmap and Artikel sections * feat: create initial Page component for articles section * feat: update footer component with additional social media links and icons * feat: remove all unused components in landing * chore: add @radix-ui/react-label deps * feat: wrap VerificationTabs in Suspense * feat: update .env.example to include TURNSTILE_SECRET_KEY and correct NEXT_PUBLIC_TURNSTILE_SITEKEY
58 lines
2.0 KiB
TypeScript
58 lines
2.0 KiB
TypeScript
import { z } from 'zod';
|
|
|
|
export const stepOneSignupValidationSchema = z
|
|
.object({
|
|
email: z
|
|
.string({
|
|
required_error: 'Email tidak boleh kosong',
|
|
invalid_type_error: 'Email harus berupa string',
|
|
})
|
|
.min(1, 'Email tidak boleh kosong')
|
|
.email('Email harus valid'),
|
|
fullname: z
|
|
.string({
|
|
required_error: 'Nama tidak boleh kosong',
|
|
invalid_type_error: 'Nama harus berupa string',
|
|
})
|
|
.min(1, 'Nama tidak boleh kosong')
|
|
.max(50, 'Nama tidak boleh lebih dari 50 karakter'),
|
|
password: z
|
|
.string({
|
|
required_error: 'Password tidak boleh kosong',
|
|
invalid_type_error: 'Password harus berupa string',
|
|
})
|
|
.min(8, 'Password harus minimal 8 karakter')
|
|
.max(50, 'Password tidak boleh lebih dari 50 karakter')
|
|
.regex(
|
|
/^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*\W).+$/,
|
|
'Password harus mengandung setidaknya satu huruf kapital, satu huruf kecil, satu angka, dan satu karakter spesial'
|
|
),
|
|
confirm_password: z
|
|
.string({
|
|
required_error: 'Konfirmasi password tidak boleh kosong',
|
|
})
|
|
.min(8, 'Konfirmasi password harus minimal 8 karakter')
|
|
.max(50, 'Konfirmasi password tidak boleh lebih dari 50 karakter'),
|
|
phone_number: z
|
|
.string({
|
|
required_error: 'Nomor telepon tidak boleh kosong',
|
|
invalid_type_error: 'Nomor telepon harus berupa string',
|
|
})
|
|
.min(10, 'Nomor telepon tidak boleh kurang dari 10 karakter')
|
|
.max(15, 'Nomor telepon tidak boleh lebih dari 15 karakter')
|
|
.regex(/^\d+$/, 'Nomor telepon hanya boleh berisi angka'),
|
|
})
|
|
.refine((data) => data.password === data.confirm_password, {
|
|
message: 'Password dan Konfirmasi Password harus sama',
|
|
path: ['confirm_password'],
|
|
});
|
|
|
|
export const stepTwoSignupValidationSchema = z.object({
|
|
token: z.string(),
|
|
});
|
|
|
|
export const signupValidationSchema = stepOneSignupValidationSchema.and(
|
|
stepTwoSignupValidationSchema
|
|
);
|
|
export type SignupValidationSchema = z.infer<typeof signupValidationSchema>;
|