Utility Functions
Overview
Kumpulan utility functions yang reusable untuk mempermudah development aplikasi frontend. Functions ini mencakup image processing, data transformation, dan common utilities.
Available Utilities
ImageCompressor
Utility untuk kompresi gambar secara client-side sebelum upload.
Features:
- Automatic image compression
- Configurable quality settings
- Maximum width/height constraints
- File size target compression
- Multiple format support (JPEG, PNG, WebP)
- Batch compression support
Use Cases:
- Optimize images before upload
- Reduce bandwidth usage
- Improve upload performance
- Client-side image optimization
import { compressImage } from '@/utils/ImageCompressor'
const compressedFile = await compressImage(file, {
maxWidth: 1920,
maxHeight: 1080,
quality: 0.8,
maxSizeKB: 500
})
CommonUtilsClean
Common utility functions untuk berbagai keperluan aplikasi.
Features:
- Data formatting utilities
- String manipulation helpers
- Date/time utilities
- Array/object helpers
- Validation functions
Use Cases:
- Format currency, numbers, dates
- String operations (capitalize, truncate, etc)
- Data validation
- Common transformations
import { formatCurrency, truncateText } from '@/utils/CommonUtilsClean'
const price = formatCurrency(150000) // "Rp 150.000"
const excerpt = truncateText(longText, 100) // "First 100 chars..."
Common Patterns
Image Upload with Compression
import { useState } from 'react'
import { compressImage } from '@/utils/ImageCompressor'
import { FieldDropzoneNew } from '@/components/Field/FieldDropzoneNew'
function ImageUploadForm() {
const [files, setFiles] = useState([])
const handleFilesChange = async (newFiles) => {
// Compress images before upload
const compressed = await Promise.all(
newFiles.map(file =>
compressImage(file, {
maxWidth: 1920,
maxHeight: 1080,
quality: 0.8,
maxSizeKB: 500
})
)
)
setFiles(compressed)
}
return (
<FieldDropzoneNew
label="Upload Photos"
value={files}
onFilesChange={handleFilesChange}
enableImageCompression={true}
/>
)
}
Data Formatting
import {
formatCurrency,
formatDate,
truncateText
} from '@/utils/CommonUtilsClean'
function ProductCard({ product }) {
return (
<div>
<h3>{truncateText(product.name, 50)}</h3>
<p className="price">{formatCurrency(product.price)}</p>
<p className="date">Added: {formatDate(product.createdAt)}</p>
</div>
)
}
Best Practices
1. Image Compression Settings
Choose appropriate compression settings based on use case:
// High quality for portfolio/gallery
const portfolioSettings = {
maxWidth: 2560,
maxHeight: 1440,
quality: 0.95,
maxSizeKB: 2000
}
// Balanced for general use
const generalSettings = {
maxWidth: 1920,
maxHeight: 1080,
quality: 0.8,
maxSizeKB: 500
}
// Aggressive for thumbnails
const thumbnailSettings = {
maxWidth: 400,
maxHeight: 400,
quality: 0.7,
maxSizeKB: 50
}
2. Error Handling
Always handle compression errors:
try {
const compressed = await compressImage(file, settings)
// Use compressed file
} catch (error) {
console.error('Compression failed:', error)
// Fallback to original file
}
3. Performance
Compress in batches for better UX:
const compressFiles = async (files) => {
const results = []
for (const file of files) {
try {
const compressed = await compressImage(file)
results.push(compressed)
// Update progress
setProgress((results.length / files.length) * 100)
} catch (error) {
results.push(file) // Use original on error
}
}
return results
}
Integration Examples
With React Hook Form
import { useForm } from 'react-hook-form'
import { compressImage } from '@/utils/ImageCompressor'
function ProfileForm() {
const { register, setValue, watch } = useForm()
const handleImageUpload = async (e) => {
const file = e.target.files[0]
const compressed = await compressImage(file)
setValue('avatar', compressed)
}
return (
<form>
<input
type="file"
onChange={handleImageUpload}
accept="image/*"
/>
</form>
)
}
With API Upload
import { compressImage } from '@/utils/ImageCompressor'
async function uploadImage(file) {
// Compress before upload
const compressed = await compressImage(file, {
maxWidth: 1920,
quality: 0.8
})
const formData = new FormData()
formData.append('file', compressed)
const response = await fetch('/api/upload', {
method: 'POST',
body: formData
})
return response.json()
}
Related Components
- UI Components - Components using these utilities
- Hooks - Custom hooks
- Code Generation - Generated utilities
Technology Stack: JavaScript, TypeScript, Canvas API, File API
Use Case: Image optimization, Data formatting, Common utilities
Last Updated: November 2025