About Me

Hello, I'm Ali Hooshangi, a frontend developer and web designer with over 6 years of professional experience. My journey started in the tech world working with hardware, networking, and system troubleshooting, which gave me a deep understanding of how technology works behind the scenes. Later, I transitioned to web development, where I found my passion for creating high-performance, responsive, and visually appealing websites that deliver seamless user experiences.

Throughout my career, I have continuously expanded my skill set, specializing in Next.js and React.js. I build scalable, maintainable, and high-performance web applications while also crafting custom WordPress websites optimized for SEO and accessibility. My focus is on combining clean, modular code with creative design to create solutions that are functional, fast-loading, and enjoyable to use.

My Expertise

I have delivered projects ranging from simple landing pages to complex React-based platforms. My expertise includes performance optimization, SEO best practices, responsive design, and user experience design. I integrate APIs, implement dynamic functionalities, and ensure every project meets modern accessibility and web standards.

Technologies & Skills

My technical stack includes Next.js, React.js, Tailwind CSS, JavaScript/TypeScript, WordPress, and SEO optimization. I follow modern workflows including version control, testing, deployment, and prioritize maintainable, reusable, and scalable code architectures.

My Philosophy

I am passionate about mentoring junior developers, creating educational content, and sharing insights on web development trends, SEO, and performance optimization. I believe in continuous learning and adapting to emerging technologies to craft innovative and user-centered solutions.

My Goal

My ultimate goal is to combine technical expertise, creativity, and best practices to deliver websites and applications that are fast, functional, and engaging. I am dedicated, detail-oriented, and committed to helping clients achieve meaningful and lasting digital experiences.

My Utility Codes

See my Projects

faToEnDigits.ts

Convert Persian digits to English digits

export const faToEnDigits = (input: string) =>
  input.replace(/[۰-۹]/g, (d) => String.fromCharCode(d.charCodeAt(0) - 1728));

enToFaDigits.ts

Convert English digits to Persian digits

export const enToFaDigits = (input: string) =>
  input.replace(/[0-9]/g, (d) => String.fromCharCode(d.charCodeAt(0) + 1728));

truncateText.ts

Truncate long text and append '...'

export const truncateText = (text: string, maxLength: number) => {
  if (text.length <= maxLength) return text;
  return text.slice(0, maxLength) + "...";
};

formatPhoneNumber.ts

Format Iranian phone numbers as +98 XXX XXX XXXX

export function formatPhoneNumber(phone: string): string {
  if (!phone) return '';
  return phone.replace(/^+98(\d{3})(\d{3})(\d{4})$/, '+98 $1 $2 $3');
}

convertEnglishNumbersToPersian.ts

Convert English digits to Persian digits

export function convertEnglishNumbersToPersian(input: string): string {
  const enNums = ['0','1','2','3','4','5','6','7','8','9'];
  const faNums = ['۰','۱','۲','۳','۴','۵','۶','۷','۸','۹'];
  let output = '';
  for (const ch of input) {
    const index = enNums.indexOf(ch);
    output += index >= 0 ? faNums[index] : ch;
  }
  return output;
}

toStandardNumber.ts

Convert Persian/Arabic digits to standard English numbers

export const toStandardNumber = (number: any): string =>
  `${number}`.replace(/[\u0660-\u0669]/g, c => c.charCodeAt(0) - 0x0660)
               .replace(/[\u06f0-\u06f9]/g, c => c.charCodeAt(0) - 0x06f0);

hasValue.ts

Check if a value exists and is not empty

export const hasValue = (value: any): boolean => !!value?.toString().trim()?.length;

truncate.ts

Truncate a string to a certain length and add '...'

export const truncate = (value: string, limit: number): string =>
  value?.length > limit ? value?.substring(0, limit - 3) + "..." : value;

makeFormData.ts

Convert object payload to FormData for file uploads

export const makeFormData = (payload: object) => {
  const body = new FormData();
  Object.entries(payload).forEach(([key,value]) => {
    if(!value) return null;
    if(key === "file") {
      let uri = payload.file?.[0]?.uri;
      if(uri) body.append("file",{ uri, name:"image.jpg", type:"image/jpg" });
    } else body.append(key,value);
  });
  return body;
};

formatPrice.ts

Format number as price with commas

export const formatPrice = (number: number | string): string => {
  let localNumber = typeof number === "number" ? number.toString() : number;
  return localNumber.replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,");
};

replaceWithStar.ts

Replace part of a string with asterisks

export const replaceWithStar = (str: string, from: number, replaceLength: number) => {
  const stars = "*".repeat(replaceLength);
  return str.substring(0,from) + stars + str.substring(from+replaceLength);
};

pattern.ts

Common regex patterns for validation

export const pattern = {
  email: /[a-z0-9]+@[a-z]+.[a-z]{2,3}/,
  specialChar: /^(?=.*[!@#$%^&*]).*$/,
  digit: /^(?=.*[0-9]).*$/,
  upperCase: /^(?=.*[A-Z]).*$/,
  lowerCase: /^(?=.*[a-z]).*$/,
  nationalCode: /^(?!(\d)\1{9})\d{10}$/,
  carTag: /^[0-9]{2}[آابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی][0-9]{3}[0-9]{2}$/
};
find me in:
@alihoushngi
find me in: