UNPKG

rnr-starter

Version:

A comprehensive React Native Expo boilerplate with 50+ modern UI components, dark/light themes, i18n, state management, and production-ready architecture

91 lines (80 loc) 2.97 kB
import { z } from 'zod'; // Login form schema export const loginSchema = z.object({ email: z.string().min(1, 'Email is required').email('Invalid email format'), password: z .string() .min(1, 'Password is required') .min(6, 'Password must be at least 6 characters'), }); export type LoginFormData = z.infer<typeof loginSchema>; // User profile form schema export const userProfileSchema = z.object({ name: z .string() .min(1, 'Name is required') .min(2, 'Name must be at least 2 characters') .max(50, 'Name must be less than 50 characters'), email: z.string().min(1, 'Email is required').email('Invalid email format'), bio: z.string().max(500, 'Bio must be less than 500 characters').optional(), location: z.string().max(100, 'Location must be less than 100 characters').optional(), website: z.string().url('Invalid website URL').optional().or(z.literal('')), }); export type UserProfileFormData = z.infer<typeof userProfileSchema>; // Post creation form schema export const postSchema = z.object({ title: z .string() .min(1, 'Title is required') .min(5, 'Title must be at least 5 characters') .max(100, 'Title must be less than 100 characters'), content: z .string() .min(1, 'Content is required') .min(20, 'Content must be at least 20 characters') .max(2000, 'Content must be less than 2000 characters'), author: z .string() .min(1, 'Author is required') .min(2, 'Author name must be at least 2 characters'), tags: z .array(z.string().min(1, 'Tag cannot be empty')) .min(1, 'At least one tag is required') .max(5, 'Maximum 5 tags allowed'), }); export type PostFormData = z.infer<typeof postSchema>; // Contact form schema export const contactSchema = z.object({ name: z.string().min(1, 'Name is required').min(2, 'Name must be at least 2 characters'), email: z.string().min(1, 'Email is required').email('Invalid email format'), subject: z.string().min(1, 'Subject is required').min(5, 'Subject must be at least 5 characters'), message: z .string() .min(1, 'Message is required') .min(10, 'Message must be at least 10 characters') .max(1000, 'Message must be less than 1000 characters'), priority: z.enum(['low', 'medium', 'high'], { required_error: 'Priority is required', }), newsletter: z.boolean().optional(), }); export type ContactFormData = z.infer<typeof contactSchema>; // Settings form schema export const settingsSchema = z.object({ notifications: z.object({ email: z.boolean(), push: z.boolean(), sms: z.boolean(), }), privacy: z.object({ profileVisible: z.boolean(), showEmail: z.boolean(), showLocation: z.boolean(), }), preferences: z.object({ theme: z.enum(['light', 'dark', 'system']), language: z.enum(['en', 'ru', 'es', 'fr']), timezone: z.string().min(1, 'Timezone is required'), }), }); export type SettingsFormData = z.infer<typeof settingsSchema>;