Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/components/dashboard/Dashboard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ export default function Dashboard({
cloud_storage: 0,
gaming: 0,
social_media: 0,
music_streaming: 0,
};

footprints
Expand Down
1 change: 1 addition & 0 deletions src/components/demo/ComparisonDemo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ const mockDashboardData: DashboardData = {
cloud_storage: 20,
gaming: 30,
social_media: 10,
music_streaming: 30,
},
trend: [
{ date: "Mon", co2: 320 },
Expand Down
10 changes: 10 additions & 0 deletions src/components/forms/ActivityForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ export default function ActivityForm({ onSubmit, initialValues }: ActivityFormPr
cloudStorageGB: initialValues?.cloudStorageGB || 0,
gamingHours: initialValues?.gamingHours || 0,
socialMediaHours: initialValues?.socialMediaHours || 0,
musicStreamingHours: initialValues?.musicStreamingHours || 0,
});

const [isSubmitting, setIsSubmitting] = useState(false);
Expand Down Expand Up @@ -96,6 +97,7 @@ export default function ActivityForm({ onSubmit, initialValues }: ActivityFormPr
cloudStorageGB: 0,
gamingHours: 0,
socialMediaHours: 0,
musicStreamingHours: 0,
});
setErrors({});
setTouched({});
Expand Down Expand Up @@ -165,6 +167,14 @@ export default function ActivityForm({ onSubmit, initialValues }: ActivityFormPr
step: 0.5,
icon: '📱',
},
{
key: 'musicStreamingHours' as keyof ActivityInput,
label: ACTIVITY_LABELS.music_streaming,
description: ACTIVITY_DESCRIPTIONS.music_streaming,
max: 24,
step: 0.5,
icon: '🎵',
},
];
const hasActivity = Object.values(activities).some((v) => v > 0);
return (
Expand Down
5 changes: 4 additions & 1 deletion src/constants/co2Factors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export const CO2_FACTORS: Record<ActivityType, number> = {
cloud_storage: 0.5, // grams per GB per day
gaming: 60, // grams per hour
social_media: 12, // grams per hour
music_streaming: 8,
};

// Real-world equivalents for context
Expand Down Expand Up @@ -44,9 +45,10 @@ export const ACTIVITY_LABELS: Record<ActivityType, string> = {
cloud_storage: ACTIVITY_TYPES.cloud_storage.label,
gaming: ACTIVITY_TYPES.gaming.label,
social_media: ACTIVITY_TYPES.social_media.label,
music_streaming: ACTIVITY_TYPES.music_streaming.label,
};

// Activity descriptions - derived from ACTIVITY_TYPES (concise, under 10 words each)
// Activity descriptions
export const ACTIVITY_DESCRIPTIONS: Record<ActivityType, string> = {
emails: ACTIVITY_TYPES.emails.description,
streaming: ACTIVITY_TYPES.streaming.description,
Expand All @@ -55,4 +57,5 @@ export const ACTIVITY_DESCRIPTIONS: Record<ActivityType, string> = {
cloud_storage: ACTIVITY_TYPES.cloud_storage.description,
gaming: ACTIVITY_TYPES.gaming.description,
social_media: ACTIVITY_TYPES.social_media.description,
music_streaming: ACTIVITY_TYPES.music_streaming.description,
};
8 changes: 8 additions & 0 deletions src/constants/quickActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ export const defaultActivities: ActivityInput = {
cloudStorageGB: 0,
gamingHours: 0,
socialMediaHours: 0,
musicStreamingHours:0,
};

// Define all your presets here, matching the GitHub issue
Expand Down Expand Up @@ -58,4 +59,11 @@ export const QUICK_ACTIONS: QuickAction[] = [
// Note: Mapping 'Browsing' to 'socialMediaHours' as it's the closest available field
activities: { socialMediaHours: 1 },
},
{
id: "music_1h",
icon: "🎵",
label: "1 Hr Music Streaming",
toastMessage: "✅ Added 1 hour music streaming (XXg CO2)",
activities: { musicStreamingHours: 1 },
},
];
5 changes: 5 additions & 0 deletions src/lib/calculations/carbonFootprint.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ export const calculateCarbonFootprint = (activities: ActivityInput): Calculation
cloud_storage: activities.cloudStorageGB * CO2_FACTORS.cloud_storage,
gaming: activities.gamingHours * CO2_FACTORS.gaming,
social_media: activities.socialMediaHours * CO2_FACTORS.social_media,
music_streaming: activities.musicStreamingHours * CO2_FACTORS.music_streaming,
};

const totalCO2 = Object.values(breakdown).reduce((sum, value) => sum + value, 0);
Expand Down Expand Up @@ -124,6 +125,10 @@ export const suggestReductions = (breakdown: Record<ActivityType, number>): Arra
suggestion = 'Set time limits for social media browsing';
potentialSaving = emissions * 0.3;
break;
case 'music_streaming':
suggestion = 'Download music for offline listening or reduce streaming quality';
potentialSaving = emissions * 0.25;
break;
}

suggestions.push({
Expand Down
25 changes: 16 additions & 9 deletions src/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ export type ActivityType =
| "video_calls"
| "cloud_storage"
| "gaming"
| "social_media";
| "social_media"
| "music_streaming";

export interface ActivityTypeInfo {
id: ActivityType;
Expand All @@ -27,38 +28,43 @@ export const ACTIVITY_TYPES: Record<ActivityType, ActivityTypeInfo> = {
emails: {
id: "emails",
label: "Email",
description: "Sending and receiving emails"
description: "Sending and receiving emails",
},
video_calls: {
id: "video_calls",
label: "Video Calls",
description: "Zoom, Teams, Google Meet calls"
description: "Zoom, Teams, Google Meet calls",
},
streaming: {
id: "streaming",
label: "Streaming",
description: "Netflix, YouTube, Spotify"
description: "Netflix, YouTube, Spotify",
},
coding: {
id: "coding",
label: "Coding",
description: "Using IDEs, compiling code"
description: "Using IDEs, compiling code",
},
cloud_storage: {
id: "cloud_storage",
label: "Cloud Storage",
description: "Google Drive, Dropbox, iCloud"
description: "Google Drive, Dropbox, iCloud",
},
gaming: {
id: "gaming",
label: "Gaming",
description: "Online gaming and downloads"
description: "Online gaming and downloads",
},
social_media: {
id: "social_media",
label: "Social Media",
description: "Facebook, Instagram, Twitter"
}
description: "Facebook, Instagram, Twitter",
},
music_streaming: {
id: "music_streaming",
label: "Music Streaming",
description: "Hours spent listening to Spotify, Apple Music, or YouTube Music",
},
};

export interface ActivityInput {
Expand All @@ -69,6 +75,7 @@ export interface ActivityInput {
cloudStorageGB: number;
gamingHours: number;
socialMediaHours: number;
musicStreamingHours: number;
}

export interface CarbonFootprint {
Expand Down