527 lines
14 KiB
Dart
527 lines
14 KiB
Dart
/// Application-level constants and configurations
|
|
///
|
|
/// This file contains app metadata, loyalty tier definitions, pagination settings,
|
|
/// and other application-wide configuration values.
|
|
library;
|
|
|
|
// ============================================================================
|
|
// Loyalty Member Tiers
|
|
// ============================================================================
|
|
|
|
/// Membership tier levels in the loyalty program
|
|
///
|
|
/// Ordered from lowest to highest:
|
|
/// - [MemberTier.gold]: Entry level (0-999 points)
|
|
/// - [MemberTier.platinum]: Mid level (1000-4999 points)
|
|
/// - [MemberTier.diamond]: Premium level (5000+ points)
|
|
enum MemberTier {
|
|
/// Gold tier - Entry level membership
|
|
/// Requirements: 0-999 points
|
|
/// Benefits: 1x points multiplier, basic discounts
|
|
gold,
|
|
|
|
/// Platinum tier - Mid level membership
|
|
/// Requirements: 1000-4999 points
|
|
/// Benefits: 1.5x points multiplier, priority support, special offers
|
|
platinum,
|
|
|
|
/// Diamond tier - Premium membership
|
|
/// Requirements: 5000+ points
|
|
/// Benefits: 2x points multiplier, exclusive rewards, VIP support, early access
|
|
diamond,
|
|
}
|
|
|
|
/// Extension methods for MemberTier enum
|
|
extension MemberTierExtension on MemberTier {
|
|
/// Get display name for the tier
|
|
String get displayName {
|
|
switch (this) {
|
|
case MemberTier.gold:
|
|
return 'Gold';
|
|
case MemberTier.platinum:
|
|
return 'Platinum';
|
|
case MemberTier.diamond:
|
|
return 'Diamond';
|
|
}
|
|
}
|
|
|
|
/// Get Vietnamese display name
|
|
String get displayNameVi {
|
|
switch (this) {
|
|
case MemberTier.gold:
|
|
return 'Vàng';
|
|
case MemberTier.platinum:
|
|
return 'Bạc';
|
|
case MemberTier.diamond:
|
|
return 'Kim Cương';
|
|
}
|
|
}
|
|
|
|
/// Get points multiplier for earning rewards
|
|
double get pointsMultiplier {
|
|
switch (this) {
|
|
case MemberTier.gold:
|
|
return 1.0;
|
|
case MemberTier.platinum:
|
|
return 1.5;
|
|
case MemberTier.diamond:
|
|
return 2.0;
|
|
}
|
|
}
|
|
|
|
/// Get minimum points required for this tier
|
|
int get minPoints {
|
|
switch (this) {
|
|
case MemberTier.gold:
|
|
return 0;
|
|
case MemberTier.platinum:
|
|
return 1000;
|
|
case MemberTier.diamond:
|
|
return 5000;
|
|
}
|
|
}
|
|
|
|
/// Get maximum points for this tier (null for diamond = unlimited)
|
|
int? get maxPoints {
|
|
switch (this) {
|
|
case MemberTier.gold:
|
|
return 999;
|
|
case MemberTier.platinum:
|
|
return 4999;
|
|
case MemberTier.diamond:
|
|
return null; // Unlimited
|
|
}
|
|
}
|
|
|
|
/// Get next tier (null if already at highest tier)
|
|
MemberTier? get nextTier {
|
|
switch (this) {
|
|
case MemberTier.gold:
|
|
return MemberTier.platinum;
|
|
case MemberTier.platinum:
|
|
return MemberTier.diamond;
|
|
case MemberTier.diamond:
|
|
return null; // Already at top
|
|
}
|
|
}
|
|
|
|
/// Get tier from points value
|
|
static MemberTier fromPoints(int points) {
|
|
if (points >= MemberTier.diamond.minPoints) {
|
|
return MemberTier.diamond;
|
|
} else if (points >= MemberTier.platinum.minPoints) {
|
|
return MemberTier.platinum;
|
|
} else {
|
|
return MemberTier.gold;
|
|
}
|
|
}
|
|
}
|
|
|
|
// ============================================================================
|
|
// User Types
|
|
// ============================================================================
|
|
|
|
/// Types of users in the Worker app
|
|
enum UserType {
|
|
/// Contractor - Construction project managers (Thầu thợ)
|
|
contractor,
|
|
|
|
/// Architect - Design professionals (Kiến trúc sư)
|
|
architect,
|
|
|
|
/// Distributor - Product resellers (Đại lý phân phối)
|
|
distributor,
|
|
|
|
/// Broker - Real estate and construction brokers (Môi giới)
|
|
broker,
|
|
}
|
|
|
|
/// Extension methods for UserType enum
|
|
extension UserTypeExtension on UserType {
|
|
/// Get display name
|
|
String get displayName {
|
|
switch (this) {
|
|
case UserType.contractor:
|
|
return 'Contractor';
|
|
case UserType.architect:
|
|
return 'Architect';
|
|
case UserType.distributor:
|
|
return 'Distributor';
|
|
case UserType.broker:
|
|
return 'Broker';
|
|
}
|
|
}
|
|
|
|
/// Get Vietnamese display name
|
|
String get displayNameVi {
|
|
switch (this) {
|
|
case UserType.contractor:
|
|
return 'Thầu thợ';
|
|
case UserType.architect:
|
|
return 'Kiến trúc sư';
|
|
case UserType.distributor:
|
|
return 'Đại lý phân phối';
|
|
case UserType.broker:
|
|
return 'Môi giới';
|
|
}
|
|
}
|
|
}
|
|
|
|
// ============================================================================
|
|
// Order Status
|
|
// ============================================================================
|
|
|
|
/// Order lifecycle status
|
|
enum OrderStatus {
|
|
/// Order placed, awaiting processing
|
|
pending,
|
|
|
|
/// Order is being prepared
|
|
processing,
|
|
|
|
/// Order is out for delivery
|
|
shipping,
|
|
|
|
/// Order delivered successfully
|
|
completed,
|
|
|
|
/// Order cancelled by user or system
|
|
cancelled,
|
|
}
|
|
|
|
/// Extension methods for OrderStatus enum
|
|
extension OrderStatusExtension on OrderStatus {
|
|
String get displayName {
|
|
switch (this) {
|
|
case OrderStatus.pending:
|
|
return 'Pending';
|
|
case OrderStatus.processing:
|
|
return 'Processing';
|
|
case OrderStatus.shipping:
|
|
return 'Shipping';
|
|
case OrderStatus.completed:
|
|
return 'Completed';
|
|
case OrderStatus.cancelled:
|
|
return 'Cancelled';
|
|
}
|
|
}
|
|
|
|
String get displayNameVi {
|
|
switch (this) {
|
|
case OrderStatus.pending:
|
|
return 'Chờ xử lý';
|
|
case OrderStatus.processing:
|
|
return 'Đang xử lý';
|
|
case OrderStatus.shipping:
|
|
return 'Đang giao';
|
|
case OrderStatus.completed:
|
|
return 'Hoàn thành';
|
|
case OrderStatus.cancelled:
|
|
return 'Đã hủy';
|
|
}
|
|
}
|
|
}
|
|
|
|
// ============================================================================
|
|
// Project Status
|
|
// ============================================================================
|
|
|
|
/// Construction project lifecycle status
|
|
enum ProjectStatus {
|
|
/// Project in planning phase
|
|
planning,
|
|
|
|
/// Project actively in progress
|
|
inProgress,
|
|
|
|
/// Project completed
|
|
completed,
|
|
|
|
/// Project on hold
|
|
onHold,
|
|
|
|
/// Project cancelled
|
|
cancelled,
|
|
}
|
|
|
|
extension ProjectStatusExtension on ProjectStatus {
|
|
String get displayName {
|
|
switch (this) {
|
|
case ProjectStatus.planning:
|
|
return 'Planning';
|
|
case ProjectStatus.inProgress:
|
|
return 'In Progress';
|
|
case ProjectStatus.completed:
|
|
return 'Completed';
|
|
case ProjectStatus.onHold:
|
|
return 'On Hold';
|
|
case ProjectStatus.cancelled:
|
|
return 'Cancelled';
|
|
}
|
|
}
|
|
|
|
String get displayNameVi {
|
|
switch (this) {
|
|
case ProjectStatus.planning:
|
|
return 'Lên kế hoạch';
|
|
case ProjectStatus.inProgress:
|
|
return 'Đang thực hiện';
|
|
case ProjectStatus.completed:
|
|
return 'Hoàn thành';
|
|
case ProjectStatus.onHold:
|
|
return 'Tạm dừng';
|
|
case ProjectStatus.cancelled:
|
|
return 'Đã hủy';
|
|
}
|
|
}
|
|
}
|
|
|
|
// ============================================================================
|
|
// Project Types
|
|
// ============================================================================
|
|
|
|
/// Types of construction projects
|
|
enum ProjectType {
|
|
/// Residential construction
|
|
residential,
|
|
|
|
/// Commercial construction
|
|
commercial,
|
|
|
|
/// Industrial construction
|
|
industrial,
|
|
}
|
|
|
|
extension ProjectTypeExtension on ProjectType {
|
|
String get displayName {
|
|
switch (this) {
|
|
case ProjectType.residential:
|
|
return 'Residential';
|
|
case ProjectType.commercial:
|
|
return 'Commercial';
|
|
case ProjectType.industrial:
|
|
return 'Industrial';
|
|
}
|
|
}
|
|
|
|
String get displayNameVi {
|
|
switch (this) {
|
|
case ProjectType.residential:
|
|
return 'Dân dụng';
|
|
case ProjectType.commercial:
|
|
return 'Thương mại';
|
|
case ProjectType.industrial:
|
|
return 'Công nghiệp';
|
|
}
|
|
}
|
|
}
|
|
|
|
// ============================================================================
|
|
// App Metadata
|
|
// ============================================================================
|
|
|
|
/// Application constants
|
|
class AppConstants {
|
|
// Private constructor to prevent instantiation
|
|
AppConstants._();
|
|
|
|
/// Application name
|
|
static const String appName = 'Worker';
|
|
|
|
/// Full application name
|
|
static const String appFullName = 'Worker - EuroTile & Vasta Stone';
|
|
|
|
/// Application version
|
|
static const String appVersion = '1.0.0';
|
|
|
|
/// Build number
|
|
static const int buildNumber = 1;
|
|
|
|
/// Company name
|
|
static const String companyName = 'EuroTile & Vasta Stone';
|
|
|
|
/// Support email
|
|
static const String supportEmail = 'support@worker.example.com';
|
|
|
|
/// Support phone number (Vietnamese format)
|
|
static const String supportPhone = '1900 xxxx';
|
|
|
|
/// Website URL
|
|
static const String websiteUrl = 'https://worker.example.com';
|
|
|
|
// ============================================================================
|
|
// Pagination Settings
|
|
// ============================================================================
|
|
|
|
/// Default page size for paginated lists
|
|
static const int defaultPageSize = 20;
|
|
|
|
/// Products page size
|
|
static const int productsPageSize = 20;
|
|
|
|
/// Orders page size
|
|
static const int ordersPageSize = 10;
|
|
|
|
/// Projects page size
|
|
static const int projectsPageSize = 15;
|
|
|
|
/// Notifications page size
|
|
static const int notificationsPageSize = 25;
|
|
|
|
/// Points history page size
|
|
static const int pointsHistoryPageSize = 20;
|
|
|
|
/// Maximum items to load at once
|
|
static const int maxPageSize = 100;
|
|
|
|
// ============================================================================
|
|
// Cache Settings
|
|
// ============================================================================
|
|
|
|
/// Cache duration for products (in hours)
|
|
static const int productsCacheDuration = 24;
|
|
|
|
/// Cache duration for user profile (in hours)
|
|
static const int profileCacheDuration = 1;
|
|
|
|
/// Cache duration for categories (in hours)
|
|
static const int categoriesCacheDuration = 48;
|
|
|
|
/// Maximum cache size (in MB)
|
|
static const int maxCacheSize = 100;
|
|
|
|
// ============================================================================
|
|
// OTP Settings
|
|
// ============================================================================
|
|
|
|
/// OTP code length (6 digits)
|
|
static const int otpLength = 6;
|
|
|
|
/// OTP resend cooldown (in seconds)
|
|
static const int otpResendCooldown = 60;
|
|
|
|
/// OTP validity duration (in minutes)
|
|
static const int otpValidityMinutes = 5;
|
|
|
|
// ============================================================================
|
|
// Referral Settings
|
|
// ============================================================================
|
|
|
|
/// Points earned per successful referral
|
|
static const int pointsPerReferral = 100;
|
|
|
|
/// Points earned by the referred user on signup
|
|
static const int welcomeBonusPoints = 50;
|
|
|
|
// ============================================================================
|
|
// Order Settings
|
|
// ============================================================================
|
|
|
|
/// Minimum order amount (in VND)
|
|
static const double minOrderAmount = 100000; // 100,000 VND
|
|
|
|
/// Free shipping threshold (in VND)
|
|
static const double freeShippingThreshold = 1000000; // 1,000,000 VND
|
|
|
|
/// Standard shipping fee (in VND)
|
|
static const double standardShippingFee = 30000; // 30,000 VND
|
|
|
|
/// Maximum items per order
|
|
static const int maxItemsPerOrder = 50;
|
|
|
|
// ============================================================================
|
|
// Image Settings
|
|
// ============================================================================
|
|
|
|
/// Maximum avatar size (in MB)
|
|
static const int maxAvatarSize = 5;
|
|
|
|
/// Maximum product image size (in MB)
|
|
static const int maxProductImageSize = 3;
|
|
|
|
/// Supported image formats
|
|
static const List<String> supportedImageFormats = [
|
|
'jpg',
|
|
'jpeg',
|
|
'png',
|
|
'webp',
|
|
];
|
|
|
|
/// Image quality for compression (0-100)
|
|
static const int imageQuality = 85;
|
|
|
|
// ============================================================================
|
|
// Search Settings
|
|
// ============================================================================
|
|
|
|
/// Minimum search query length
|
|
static const int minSearchLength = 2;
|
|
|
|
/// Search debounce delay (in milliseconds)
|
|
static const int searchDebounceMs = 500;
|
|
|
|
/// Maximum search results
|
|
static const int maxSearchResults = 50;
|
|
|
|
// ============================================================================
|
|
// Date & Time Settings
|
|
// ============================================================================
|
|
|
|
/// Default date format (Vietnamese: dd/MM/yyyy)
|
|
static const String dateFormat = 'dd/MM/yyyy';
|
|
|
|
/// Date time format
|
|
static const String dateTimeFormat = 'dd/MM/yyyy HH:mm';
|
|
|
|
/// Time format (24-hour)
|
|
static const String timeFormat = 'HH:mm';
|
|
|
|
/// Full date time format
|
|
static const String fullDateTimeFormat = 'EEEE, dd MMMM yyyy HH:mm';
|
|
|
|
// ============================================================================
|
|
// Validation Settings
|
|
// ============================================================================
|
|
|
|
/// Minimum password length
|
|
static const int minPasswordLength = 8;
|
|
|
|
/// Maximum password length
|
|
static const int maxPasswordLength = 50;
|
|
|
|
/// Minimum name length
|
|
static const int minNameLength = 2;
|
|
|
|
/// Maximum name length
|
|
static const int maxNameLength = 100;
|
|
|
|
/// Vietnamese phone number regex pattern
|
|
/// Matches: 0912345678, +84912345678, 84912345678
|
|
static const String phoneRegexPattern = r'^(0|\+84|84)[3|5|7|8|9][0-9]{8}$';
|
|
|
|
/// Email regex pattern
|
|
static const String emailRegexPattern = r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$';
|
|
|
|
// ============================================================================
|
|
// Feature Flags
|
|
// ============================================================================
|
|
|
|
/// Enable dark mode
|
|
static const bool enableDarkMode = true;
|
|
|
|
/// Enable biometric authentication
|
|
static const bool enableBiometric = true;
|
|
|
|
/// Enable push notifications
|
|
static const bool enablePushNotifications = true;
|
|
|
|
/// Enable offline mode
|
|
static const bool enableOfflineMode = true;
|
|
|
|
/// Enable analytics
|
|
static const bool enableAnalytics = true;
|
|
|
|
/// Enable crash reporting
|
|
static const bool enableCrashReporting = true;
|
|
}
|