Skip to main content

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()
}

Technology Stack: JavaScript, TypeScript, Canvas API, File API
Use Case: Image optimization, Data formatting, Common utilities
Last Updated: November 2025