fix: production readiness — resolve build, lint, and code quality issues

- Fix Next.js build failure: remove duplicate route at (dashboard)/listings/[id]
  that conflicted with (public)/listings/[id] (same URL path in two route groups)
- Fix 772 ESLint errors: auto-fix import ordering (import-x/order), remove unused
  imports/variables, convert empty interfaces to type aliases, replace require()
  with ESM imports, fix consistent-type-imports violations
- Add CLAUDE.md for developer onboarding documentation
- All checks pass: 0 lint errors, typecheck clean, 230 tests passing, build success

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
Ho Ngoc Hai
2026-04-08 07:15:06 +07:00
parent afa70320f5
commit 2502aa69b7
239 changed files with 746 additions and 984 deletions

View File

@@ -1,9 +1,9 @@
'use client';
import * as React from 'react';
import Image from 'next/image';
import { cn } from '@/lib/utils';
import * as React from 'react';
import type { PropertyMedia } from '@/lib/listings-api';
import { cn } from '@/lib/utils';
interface ImageGalleryProps {
media: PropertyMedia[];

View File

@@ -1,8 +1,8 @@
'use client';
import * as React from 'react';
import { cn } from '@/lib/utils';
import { Button } from '@/components/ui/button';
import { cn } from '@/lib/utils';
interface ImageFile {
file: File;
@@ -79,8 +79,7 @@ export function ImageUpload({ images, onChange, maxFiles = 20, className }: Imag
return () => {
images.forEach((img) => URL.revokeObjectURL(img.preview));
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
}, []); // intentionally empty: runs only on unmount to revoke object URLs
return (
<div className={cn('space-y-4', className)}>

View File

@@ -1,15 +1,15 @@
'use client';
import type { UseFormRegister, FieldErrors } from 'react-hook-form';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { Textarea } from '@/components/ui/textarea';
import { Select } from '@/components/ui/select';
import { Textarea } from '@/components/ui/textarea';
import {
TRANSACTION_TYPES,
PROPERTY_TYPES,
DIRECTIONS,
} from '@/lib/validations/listings';
import type { UseFormRegister, FieldErrors } from 'react-hook-form';
import type { CreateListingFormData } from '@/lib/validations/listings';
interface StepProps {

View File

@@ -1,6 +1,6 @@
import { Badge } from '@/components/ui/badge';
import { LISTING_STATUSES } from '@/lib/validations/listings';
import type { ListingStatus } from '@/lib/listings-api';
import { LISTING_STATUSES } from '@/lib/validations/listings';
interface ListingStatusBadgeProps {
status: ListingStatus;

View File

@@ -1,9 +1,8 @@
'use client';
import * as React from 'react';
import mapboxgl from 'mapbox-gl';
import * as React from 'react';
import 'mapbox-gl/dist/mapbox-gl.css';
import { Badge } from '@/components/ui/badge';
import type { ListingDetail } from '@/lib/listings-api';
function formatPrice(priceVND: string): string {

View File

@@ -2,8 +2,8 @@
import Image from 'next/image';
import Link from 'next/link';
import { Card, CardContent } from '@/components/ui/card';
import { Badge } from '@/components/ui/badge';
import { Card, CardContent } from '@/components/ui/card';
import type { ListingDetail } from '@/lib/listings-api';
function formatPrice(priceVND: string): string {

View File

@@ -3,8 +3,8 @@
import * as React from 'react';
import { Button } from '@/components/ui/button';
import { Select } from '@/components/ui/select';
import { PropertyCard } from './property-card';
import type { ListingDetail, PaginatedResult } from '@/lib/listings-api';
import { PropertyCard } from './property-card';
interface SearchResultsProps {
result: PaginatedResult<ListingDetail> | null;

View File

@@ -1,5 +1,5 @@
import * as React from 'react';
import { cva, type VariantProps } from 'class-variance-authority';
import * as React from 'react';
import { cn } from '@/lib/utils';
const badgeVariants = cva(

View File

@@ -1,5 +1,5 @@
import * as React from 'react';
import { cva, type VariantProps } from 'class-variance-authority';
import * as React from 'react';
import { cn } from '@/lib/utils';
const buttonVariants = cva(

View File

@@ -1,7 +1,7 @@
import * as React from 'react';
import { cn } from '@/lib/utils';
export interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {}
export type InputProps = React.InputHTMLAttributes<HTMLInputElement>;
const Input = React.forwardRef<HTMLInputElement, InputProps>(
({ className, type, ...props }, ref) => {

View File

@@ -1,7 +1,7 @@
'use client';
import * as React from 'react';
import { cva, type VariantProps } from 'class-variance-authority';
import * as React from 'react';
import { cn } from '@/lib/utils';
const labelVariants = cva(

View File

@@ -1,7 +1,7 @@
import * as React from 'react';
import { cn } from '@/lib/utils';
export interface SelectProps extends React.SelectHTMLAttributes<HTMLSelectElement> {}
export type SelectProps = React.SelectHTMLAttributes<HTMLSelectElement>;
const Select = React.forwardRef<HTMLSelectElement, SelectProps>(
({ className, children, ...props }, ref) => {

View File

@@ -1,7 +1,7 @@
import * as React from 'react';
import { cn } from '@/lib/utils';
export interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}
export type TextareaProps = React.TextareaHTMLAttributes<HTMLTextAreaElement>;
const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
({ className, ...props }, ref) => {