ATlast — you'll never need to find your favorites on another platform again. Find your favs in the ATmosphere.
atproto
1import { BookOpen, Grid3x3 } from "lucide-react";
2import { useState, useEffect } from "react";
3import AppHeader from "../components/AppHeader";
4import SetupWizard from "../components/SetupWizard";
5import TabNavigation, { TabId } from "../components/TabNavigation";
6import UploadTab from "../components/UploadTab";
7import HistoryTab from "../components/HistoryTab";
8import PlaceholderTab from "../components/PlaceholderTab";
9import { apiClient } from "../lib/api/client";
10import type { Upload as UploadType } from "../types";
11import type { UserSettings } from "../types/settings";
12import SettingsPage from "./Settings";
13
14interface atprotoSession {
15 did: string;
16 handle: string;
17 displayName?: string;
18 avatar?: string;
19 description?: string;
20}
21
22interface HomePageProps {
23 session: atprotoSession | null;
24 onLogout: () => void;
25 onNavigate: (step: "home" | "login") => void;
26 onFileUpload: (
27 e: React.ChangeEvent<HTMLInputElement>,
28 platform: string,
29 ) => void;
30 onLoadUpload: (uploadId: string) => void;
31 currentStep: string;
32 userSettings: UserSettings;
33 onSettingsUpdate: (settings: Partial<UserSettings>) => void;
34 reducedMotion?: boolean;
35 isDark?: boolean;
36 onToggleTheme?: () => void;
37 onToggleMotion?: () => void;
38}
39
40export default function HomePage({
41 session,
42 onLogout,
43 onNavigate,
44 onFileUpload,
45 onLoadUpload,
46 currentStep,
47 userSettings,
48 onSettingsUpdate,
49 reducedMotion = false,
50 isDark = false,
51 onToggleTheme,
52 onToggleMotion,
53}: HomePageProps) {
54 const [activeTab, setActiveTab] = useState<TabId>("upload");
55 const [uploads, setUploads] = useState<UploadType[]>([]);
56 const [isLoading, setIsLoading] = useState(true);
57 const [selectedPlatform, setSelectedPlatform] = useState<string>("");
58 const [showWizard, setShowWizard] = useState(false);
59
60 useEffect(() => {
61 if (session) {
62 loadUploads();
63 }
64
65 // Show wizard on first visit
66 if (!userSettings.wizardCompleted) {
67 setShowWizard(true);
68 }
69 }, [session, userSettings.wizardCompleted]);
70
71 // Reload uploads when navigating to history tab
72 useEffect(() => {
73 if (activeTab === "history" && session) {
74 loadUploads();
75 }
76 }, [activeTab, session]);
77
78 async function loadUploads() {
79 try {
80 setIsLoading(true);
81 const data = await apiClient.getUploads();
82 setUploads(data.uploads);
83 } catch (error) {
84 console.error("Failed to load uploads:", error);
85 } finally {
86 setIsLoading(false);
87 }
88 }
89
90 return (
91 <div className="min-h-screen">
92 <SetupWizard
93 isOpen={showWizard}
94 onClose={() => setShowWizard(false)}
95 onComplete={onSettingsUpdate}
96 currentSettings={userSettings}
97 />
98
99 {/* Header */}
100 <div className="bg-white dark:bg-slate-900 border-b-2 border-cyan-500/50 dark:border-purple-500/50 overflow-x-auto">
101 <AppHeader
102 session={session}
103 onLogout={onLogout}
104 onNavigate={onNavigate}
105 currentStep={currentStep}
106 isDark={isDark}
107 reducedMotion={reducedMotion}
108 onToggleTheme={onToggleTheme}
109 onToggleMotion={onToggleMotion}
110 />
111 </div>
112
113 <div className="max-w-6xl mx-auto px-4 py-8">
114 <div className="max-w-6xl mx-auto bg-slate-100/50 dark:bg-slate-900/50 backdrop-blur-xl rounded-3xl p-3 border-2 border-cyan-500/30 dark:border-purple-500/30 mb-8">
115 {/* Tab Navigation */}
116 <TabNavigation activeTab={activeTab} onTabChange={setActiveTab} />
117
118 {/* Tab Content */}
119 <div>
120 {activeTab === "upload" && (
121 <UploadTab
122 wizardCompleted={userSettings.wizardCompleted}
123 onShowWizard={() => setShowWizard(true)}
124 onPlatformSelect={setSelectedPlatform}
125 onFileUpload={onFileUpload}
126 selectedPlatform={selectedPlatform}
127 />
128 )}
129
130 {activeTab === "history" && (
131 <HistoryTab
132 wizardCompleted={userSettings.wizardCompleted}
133 onShowWizard={() => setShowWizard(true)}
134 uploads={uploads}
135 isLoading={isLoading}
136 userSettings={userSettings}
137 onLoadUpload={onLoadUpload}
138 />
139 )}
140
141 {activeTab === "settings" && (
142 <SettingsPage
143 userSettings={userSettings}
144 onSettingsUpdate={onSettingsUpdate}
145 onOpenWizard={() => setShowWizard(true)}
146 />
147 )}
148
149 {activeTab === "guides" && (
150 <PlaceholderTab
151 icon={BookOpen}
152 title="Platform Guides"
153 message="Export guides coming soon..."
154 />
155 )}
156
157 {activeTab === "apps" && (
158 <PlaceholderTab
159 icon={Grid3x3}
160 title="ATmosphere Apps"
161 message="Apps directory coming soon..."
162 />
163 )}
164 </div>
165 </div>
166 </div>
167 </div>
168 );
169}