chore: migrate to TypeScript

- Convert all .js files to .tsx/.ts
- Add types for data structures (MuseumRecord, Metrics, etc.)
- Add type declarations for react-chartjs-2
- Configure tsconfig with relaxed strictness for gradual adoption
- All components now use TypeScript
This commit is contained in:
fahed
2026-02-04 13:45:50 +03:00
parent e98bebd60b
commit 868f46fc6e
18 changed files with 484 additions and 121 deletions

166
src/types/index.ts Normal file
View File

@@ -0,0 +1,166 @@
// Data types for HiHala Dashboard
export interface MuseumRecord {
date: string;
museum_code: string;
museum_name: string;
district: string;
visits: number;
tickets: number;
revenue_gross: number;
revenue_net: number;
revenue_incl_tax: number; // Legacy field
year: string;
quarter: string;
}
export interface Metrics {
revenue: number;
visitors: number;
tickets: number;
avgRevPerVisitor: number;
}
export interface Filters {
year: string;
district: string;
museum: string;
quarter: string;
}
export interface DateRangeFilters {
district: string;
museum: string;
}
export interface CacheStatus {
available: boolean;
timestamp: string | null;
age: number | null;
rows: number;
isStale?: boolean;
}
export interface CacheResult {
data: MuseumRecord[];
isStale: boolean;
timestamp: number;
}
export interface FetchResult {
data: MuseumRecord[];
fromCache: boolean;
cacheTimestamp?: number;
}
export interface GroupedData {
revenue: number;
visitors: number;
tickets: number;
}
export interface DistrictMuseumMap {
[district: string]: string[];
}
export interface UmrahData {
[year: number]: {
[quarter: number]: number | null;
};
}
// Chart data types
export interface ChartDataset {
label?: string;
data: number[];
backgroundColor?: string | string[];
borderColor?: string;
borderWidth?: number;
borderRadius?: number;
tension?: number;
fill?: boolean;
pointRadius?: number;
pointHoverRadius?: number;
pointBackgroundColor?: string;
pointBorderColor?: string;
pointBorderWidth?: number;
yAxisID?: string;
order?: number;
datalabels?: object;
}
export interface ChartData {
labels: string[];
datasets: ChartDataset[];
}
// Component props
export interface DashboardProps {
data: MuseumRecord[];
showDataLabels: boolean;
setShowDataLabels: (value: boolean) => void;
includeVAT: boolean;
setIncludeVAT: (value: boolean) => void;
}
export interface ComparisonProps {
data: MuseumRecord[];
showDataLabels: boolean;
setShowDataLabels: (value: boolean) => void;
includeVAT: boolean;
setIncludeVAT: (value: boolean) => void;
}
export interface SlidesProps {
data: MuseumRecord[];
}
// Quarterly table row
export interface QuarterlyRow {
q: number;
rev24: number;
rev25: number;
revChg: number;
vis24: number;
vis25: number;
visChg: number;
cap24: number | null;
cap25: number | null;
}
// Metric card for comparison
export interface MetricCardData {
title: string;
prev: number | null;
curr: number | null;
change: number | null;
isCurrency?: boolean;
isPercent?: boolean;
pendingMessage?: string;
}
// NocoDB raw types
export interface NocoDBDistrict {
Id: number;
Name: string;
}
export interface NocoDBMuseum {
Id: number;
Code: string;
Name: string;
'nc_epk____Districts_id': number;
}
export interface NocoDBDailyStat {
Id: number;
Date: string;
Visits: number;
Tickets: number;
GrossRevenue: number;
NetRevenue: number;
'nc_epk____Museums_id': number;
}
// Translation function type
export type TranslateFunction = (key: string) => string;