1+
12import React , { useState , useEffect } from 'react' ;
23import { useNavigate } from 'react-router-dom' ;
34import { format } from 'date-fns' ;
@@ -44,6 +45,7 @@ import {
4445import { useAuth } from '../utils/auth' ;
4546import { getJournalEntries , JournalEntry } from '../utils/firebase' ;
4647import { toast } from 'sonner' ;
48+ import { Switch } from '@/components/ui/switch' ;
4749
4850const getMoodLabel = ( score : number ) : string => {
4951 if ( score <= 2 ) return "Very Unpleasant" ;
@@ -54,15 +56,15 @@ const getMoodLabel = (score: number): string => {
5456} ;
5557
5658const getMoodColor = ( score : number ) : string => {
57- if ( score <= 4 ) return "text-blue-400" ;
58- if ( score <= 6 ) return "text-slate-200" ;
59- return "text-green-400" ;
59+ if ( score <= 4 ) return "text-blue-600 dark:text-blue- 400" ;
60+ if ( score <= 6 ) return "text-slate-600 dark:text-slate- 200" ;
61+ return "text-green-600 dark:text-green- 400" ;
6062} ;
6163
6264const getMoodBgColor = ( score : number ) : string => {
63- if ( score <= 4 ) return "bg-blue-400/20" ;
64- if ( score <= 6 ) return "bg-slate-400/20" ;
65- return "bg-green-400/20" ;
65+ if ( score <= 4 ) return "bg-blue-100 dark:bg-blue- 400/20" ;
66+ if ( score <= 6 ) return "bg-slate-100 dark:bg-slate- 400/20" ;
67+ return "bg-green-100 dark:bg-green- 400/20" ;
6668} ;
6769
6870const JournalEntries : React . FC = ( ) => {
@@ -74,8 +76,26 @@ const JournalEntries: React.FC = () => {
7476 const [ isLoading , setIsLoading ] = useState ( true ) ;
7577 const [ currentPage , setCurrentPage ] = useState ( 1 ) ;
7678 const [ selectedMonth , setSelectedMonth ] = useState < string | null > ( null ) ;
79+ const [ isDarkMode , setIsDarkMode ] = useState ( false ) ;
7780 const entriesPerPage = 10 ;
7881
82+ useEffect ( ( ) => {
83+ // Check system preference for dark mode
84+ if ( document . documentElement . classList . contains ( 'dark' ) ) {
85+ setIsDarkMode ( true ) ;
86+ }
87+ } , [ ] ) ;
88+
89+ const toggleDarkMode = ( ) => {
90+ const newDarkMode = ! isDarkMode ;
91+ setIsDarkMode ( newDarkMode ) ;
92+ if ( newDarkMode ) {
93+ document . documentElement . classList . add ( 'dark' ) ;
94+ } else {
95+ document . documentElement . classList . remove ( 'dark' ) ;
96+ }
97+ } ;
98+
7999 useEffect ( ( ) => {
80100 const fetchEntries = async ( ) => {
81101 if ( ! currentUser ) {
@@ -185,22 +205,26 @@ const JournalEntries: React.FC = () => {
185205 } , [ currentEntries ] ) ;
186206
187207 return (
188- < div className = "min-h-screen bg-slate-900 text-white" >
208+ < div className = "min-h-screen bg-white dark:bg- slate-900 text-slate-800 dark: text-white" >
189209 < div className = "container py-8 px-4 mx-auto max-w-4xl" >
190210 < div className = "flex justify-between items-center mb-8" >
191211 < div className = "flex items-center gap-3" >
192212 < Button
193213 variant = "ghost"
194214 size = "icon"
195215 onClick = { ( ) => navigate ( '/journal' ) }
196- className = "text-white"
216+ className = "text-slate-800 dark:text- white"
197217 >
198218 < ArrowLeft className = "h-6 w-6" />
199219 </ Button >
200- < h1 className = "text-4xl font-bold tracking-tight" > Journal</ h1 >
220+ < h1 className = "text-4xl font-bold tracking-tight text-slate-800 dark:text-white " > Journal</ h1 >
201221 </ div >
202222
203- < div className = "flex gap-2" >
223+ < div className = "flex gap-2 items-center" >
224+ < div className = "flex items-center space-x-2 mr-2" >
225+ < span className = "text-sm" > { isDarkMode ? 'Dark' : 'Light' } </ span >
226+ < Switch checked = { isDarkMode } onCheckedChange = { toggleDarkMode } />
227+ </ div >
204228 < Button variant = "outline" size = "icon" className = "rounded-full" >
205229 < Search className = "h-5 w-5" />
206230 </ Button >
@@ -211,38 +235,38 @@ const JournalEntries: React.FC = () => {
211235 </ div >
212236
213237 < div className = "grid grid-cols-3 gap-4 mb-8" >
214- < Card className = "bg-slate-800 border-none" >
238+ < Card className = "bg-white dark:bg- slate-800 border border-slate-200 dark: border-none" >
215239 < CardContent className = "flex items-center p-4" >
216- < div className = "rounded-full bg-blue-900/30 p-2 mr-4" >
217- < BookOpen className = "h-6 w-6 text-blue-400" />
240+ < div className = "rounded-full bg-blue-100 dark:bg-blue- 900/30 p-2 mr-4" >
241+ < BookOpen className = "h-6 w-6 text-blue-600 dark:text-blue- 400" />
218242 </ div >
219243 < div >
220- < h3 className = "text-3xl font-bold text-blue-400" > { stats . entriesCount } </ h3 >
221- < p className = "text-sm text-slate-400" > Entries This Year</ p >
244+ < h3 className = "text-3xl font-bold text-blue-600 dark:text-blue- 400" > { stats . entriesCount } </ h3 >
245+ < p className = "text-sm text-slate-600 dark:text-slate- 400" > Entries This Year</ p >
222246 </ div >
223247 </ CardContent >
224248 </ Card >
225249
226- < Card className = "bg-slate-800 border-none" >
250+ < Card className = "bg-white dark:bg- slate-800 border border-slate-200 dark: border-none" >
227251 < CardContent className = "flex items-center p-4" >
228- < div className = "rounded-full bg-red-900/30 p-2 mr-4" >
229- < MessageSquareText className = "h-6 w-6 text-red-400" />
252+ < div className = "rounded-full bg-red-100 dark:bg-red- 900/30 p-2 mr-4" >
253+ < MessageSquareText className = "h-6 w-6 text-red-600 dark:text-red- 400" />
230254 </ div >
231255 < div >
232- < h3 className = "text-3xl font-bold text-red-400" > { stats . wordsWritten . toLocaleString ( ) } </ h3 >
233- < p className = "text-sm text-slate-400" > Words Written</ p >
256+ < h3 className = "text-3xl font-bold text-red-600 dark:text-red- 400" > { stats . wordsWritten . toLocaleString ( ) } </ h3 >
257+ < p className = "text-sm text-slate-600 dark:text-slate- 400" > Words Written</ p >
234258 </ div >
235259 </ CardContent >
236260 </ Card >
237261
238- < Card className = "bg-slate-800 border-none" >
262+ < Card className = "bg-white dark:bg- slate-800 border border-slate-200 dark: border-none" >
239263 < CardContent className = "flex items-center p-4" >
240- < div className = "rounded-full bg-purple-900/30 p-2 mr-4" >
241- < Calendar className = "h-6 w-6 text-purple-400" />
264+ < div className = "rounded-full bg-purple-100 dark:bg-purple- 900/30 p-2 mr-4" >
265+ < Calendar className = "h-6 w-6 text-purple-600 dark:text-purple- 400" />
242266 </ div >
243267 < div >
244- < h3 className = "text-3xl font-bold text-purple-400" > { stats . daysJournaled } </ h3 >
245- < p className = "text-sm text-slate-400" > Days Journaled</ p >
268+ < h3 className = "text-3xl font-bold text-purple-600 dark:text-purple- 400" > { stats . daysJournaled } </ h3 >
269+ < p className = "text-sm text-slate-600 dark:text-slate- 400" > Days Journaled</ p >
246270 </ div >
247271 </ CardContent >
248272 </ Card >
@@ -253,15 +277,15 @@ const JournalEntries: React.FC = () => {
253277 < Search className = "absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-slate-400" />
254278 < Input
255279 placeholder = "Search journal entries..."
256- className = "bg-slate-800 border-none pl-10"
280+ className = "bg-white dark:bg- slate-800 border-slate-200 dark:border-slate-700 pl-10"
257281 value = { searchQuery }
258282 onChange = { e => setSearchQuery ( e . target . value ) }
259283 />
260284 </ div >
261285 </ div >
262286
263287 < Tabs defaultValue = { selectedMonth || months [ 0 ] } className = "mb-6" >
264- < TabsList className = "bg-slate-800 w-full h-auto flex overflow-x-auto p-1" >
288+ < TabsList className = "bg-slate-100 dark:bg-slate- 800 w-full h-auto flex overflow-x-auto p-1" >
265289 { months . map ( month => (
266290 < TabsTrigger
267291 key = { month }
@@ -280,10 +304,10 @@ const JournalEntries: React.FC = () => {
280304 < div className = "animate-spin h-8 w-8 border-4 border-t-blue-500 border-slate-200 rounded-full" > </ div >
281305 </ div >
282306 ) : filteredEntries . length === 0 ? (
283- < div className = "text-center py-12 bg-slate-800 rounded-lg" >
307+ < div className = "text-center py-12 bg-slate-100 dark:bg-slate- 800 rounded-lg" >
284308 < BookOpen className = "h-12 w-12 mx-auto mb-4 text-slate-500" />
285- < h3 className = "text-xl font-semibold mb-2" > No entries found</ h3 >
286- < p className = "text-slate-400 mb-6" >
309+ < h3 className = "text-xl font-semibold mb-2 text-slate-800 dark:text-white " > No entries found</ h3 >
310+ < p className = "text-slate-600 dark:text-slate- 400 mb-6" >
287311 { entries . length === 0
288312 ? "You haven't written any journal entries yet."
289313 : "No entries match your current filters." }
@@ -299,38 +323,38 @@ const JournalEntries: React.FC = () => {
299323 < div className = "space-y-6" >
300324 { Object . entries ( groupedEntries ) . map ( ( [ date , entriesForDate ] ) => (
301325 < div key = { date } className = "space-y-4" >
302- < h2 className = "text-xl font-semibold" > { date } </ h2 >
326+ < h2 className = "text-xl font-semibold text-slate-800 dark:text-white " > { date } </ h2 >
303327
304328 { entriesForDate . map ( ( entry , index ) => (
305- < Card key = { index } className = "bg-slate-800 border-none overflow-hidden" >
329+ < Card key = { index } className = "bg-white dark:bg- slate-800 border border-slate-200 dark: border-none overflow-hidden" >
306330 < CardContent className = "p-0" >
307331 < div className = "p-5" >
308332 < div className = "flex justify-between items-start mb-4" >
309333 < div className = "flex items-center gap-3" >
310334 < div className = { `w-10 h-10 rounded-full ${ getMoodBgColor ( entry . level ) } flex items-center justify-center` } >
311- < div className = { `w-5 h-5 rounded-full ${ entry . level > 5 ? 'bg-green-400' : 'bg-blue-400' } ` } > </ div >
335+ < div className = { `w-5 h-5 rounded-full ${ entry . level > 5 ? 'bg-green-600 dark:bg-green- 400' : 'bg-blue-600 dark: bg-blue-400' } ` } > </ div >
312336 </ div >
313337 < div >
314338 < p className = { `font-medium ${ getMoodColor ( entry . level ) } ` } >
315339 { getMoodLabel ( entry . level ) }
316340 </ p >
317341 < div className = "flex flex-wrap gap-1 mt-1" >
318342 { entry . emotions . map ( emotion => (
319- < Badge key = { emotion } variant = "outline" className = "text-xs bg-slate-700" >
343+ < Badge key = { emotion } variant = "outline" className = "text-xs bg-slate-100 text-slate- 700 dark:bg-slate-700 dark:text-slate-200 " >
320344 { emotion }
321345 </ Badge >
322346 ) ) }
323347 </ div >
324348 </ div >
325349 </ div >
326- < p className = "text-sm text-slate-400" >
350+ < p className = "text-sm text-slate-500 dark:text-slate- 400" >
327351 { format ( entry . timestamp , 'h:mm a' ) }
328352 </ p >
329353 </ div >
330354
331355 < div className = "mb-4" >
332- < h3 className = "text-lg font-medium mb-2" > { entry . question } </ h3 >
333- < p className = "text-slate-300 whitespace-pre-line" > { entry . notes } </ p >
356+ < h3 className = "text-lg font-medium mb-2 text-slate-800 dark:text-white " > { entry . question } </ h3 >
357+ < p className = "text-slate-700 dark:text-slate- 300 whitespace-pre-line" > { entry . notes } </ p >
334358 </ div >
335359 </ div >
336360 </ CardContent >
0 commit comments