Files
ocean-cleanup/src/types/index.ts
Paul Bailey 0e05769581 Rebrand application from 'Beach Litter Mapping Platform' to 'Litter Scouts'
- Updated app name in all source files, documentation, and configuration
- Changed package names in package.json files
- Updated header, titles, and user-facing text
- Modified email templates and notification text
- Updated steering rules and spec documents
2025-11-18 00:31:44 +00:00

245 lines
5.2 KiB
TypeScript

// Core type definitions for Litter Scouts
export type LitterType = 'plastic' | 'metal' | 'glass' | 'organic' | 'hazardous' | 'other';
export type QuantityLevel = 'minimal' | 'moderate' | 'significant' | 'severe';
export type LocationSource = 'exif' | 'gps' | 'manual';
export type VerificationStatus = 'pending' | 'verified' | 'disputed';
export type EventStatus = 'upcoming' | 'completed' | 'cancelled';
export interface Coordinates {
latitude: number;
longitude: number;
}
export interface User {
id: string;
clerkId: string;
email: string;
username: string;
firstName?: string;
lastName?: string;
avatarUrl?: string;
impactScore: number;
createdAt: Date;
updatedAt: Date;
}
export interface Report {
id: string;
userId: string;
latitude: number;
longitude: number;
locationSource: LocationSource;
photoUrls: string[];
photoTimestamp?: Date;
litterType: LitterType;
quantity: QuantityLevel;
description?: string;
createdAt: Date;
updatedAt: Date;
submittedAt: Date;
verificationStatus: VerificationStatus;
cleanedAt?: Date;
cleanedByUserId?: string;
}
export interface CleanupEvent {
id: string;
organizerId: string;
organizerClerkId?: string; // Clerk ID of the organizer for permission checks
title: string;
description: string;
latitude: number;
longitude: number;
locationName: string;
scheduledDate: Date;
duration: number; // in minutes
status: EventStatus;
participantCount: number;
litterCollected?: number; // in kilograms
photos?: string[];
createdAt: Date;
updatedAt: Date;
}
export interface EnvironmentalConcern {
id: string;
reportId: string;
concernType: string;
severity: 'low' | 'medium' | 'high' | 'critical';
description: string;
createdAt: Date;
}
export interface Hotspot {
id: string;
latitude: number;
longitude: number;
radius: number; // in meters
reportCount: number;
severityScore: number;
lastReportDate: Date;
calculatedAt: Date;
}
export type HotspotSeverity = 'low' | 'medium' | 'high' | 'critical';
export interface HotspotWithSeverity extends Hotspot {
severity: HotspotSeverity;
}
// DTOs (Data Transfer Objects)
export interface CreateReportDTO {
photos: File[];
latitude?: number;
longitude?: number;
locationSource: LocationSource;
litterType: LitterType;
quantity: QuantityLevel;
description?: string;
environmentalConcerns?: {
type: string;
severity: 'low' | 'medium' | 'high' | 'critical';
description: string;
}[];
}
export interface Verification {
id: string;
reportId: string;
userId: string;
verificationType: 'verify' | 'dispute';
comment?: string;
createdAt: Date;
user: {
id: string;
username: string;
};
}
export interface ReportResponseDTO extends Report {
user: {
id: string;
username: string;
avatarUrl?: string;
};
verificationCount: number;
disputeCount: number;
environmentalConcerns: EnvironmentalConcern[];
verifications?: Verification[];
}
export interface FilterState {
dateRange?: {
start: Date;
end: Date;
};
litterTypes?: LitterType[];
quantities?: QuantityLevel[];
verificationStatus?: VerificationStatus[];
showCleaned?: boolean;
}
// Analytics types
export interface AnalyticsSummary {
totalReports: number;
totalEvents: number;
totalUsers: number;
totalLitterCollected: number; // in kilograms
reportsByType: Record<string, number>;
reportsByQuantity: Record<string, number>;
verifiedReports: number;
cleanedReports: number;
activeUsers: number;
upcomingEvents: number;
completedEvents: number;
}
export interface DateRange {
start: Date;
end: Date;
}
export interface TimeSeriesDataPoint {
date: string;
reportCount: number;
eventCount: number;
litterCollected: number;
}
export interface LitterTypeDistribution {
type: string;
count: number;
}
export interface QuantityAggregation {
level: string;
count: number;
}
// External environmental data types
export interface WeatherData {
temperature: number; // Celsius
feelsLike: number;
humidity: number; // percentage
windSpeed: number; // m/s
windDirection: number; // degrees
description: string;
icon: string;
timestamp: Date;
}
export interface TideData {
tides: Array<{
time: Date;
height: number; // meters
type: 'high' | 'low';
}>;
nextTide?: {
time: Date;
height: number;
type: 'high' | 'low';
};
}
export interface WaterQualityData {
status: 'excellent' | 'good' | 'sufficient' | 'poor' | 'unknown';
lastUpdated?: Date;
parameters?: {
bacteria?: number;
ph?: number;
temperature?: number;
};
source?: string;
}
export interface BeachQualityData {
rating: 'blue-flag' | 'green-coast' | 'excellent' | 'good' | 'adequate' | 'poor' | 'unknown';
awards?: string[];
facilities?: string[];
lastInspection?: Date;
}
export interface BiodiversityData {
species?: Array<{
name: string;
scientificName?: string;
status?: string;
}>;
protectedArea?: boolean;
habitatType?: string;
conservationStatus?: string;
}
export interface ExternalEnvironmentalData {
weather?: WeatherData;
tides?: TideData;
waterQuality?: WaterQualityData;
beachQuality?: BeachQualityData;
biodiversity?: BiodiversityData;
}