diff --git a/src/components/ui/tooltip/clickable-tooltip.tsx b/src/components/ui/tooltip/clickable-tooltip.tsx index 2a5cbd52..e49f5a89 100644 --- a/src/components/ui/tooltip/clickable-tooltip.tsx +++ b/src/components/ui/tooltip/clickable-tooltip.tsx @@ -25,6 +25,7 @@ interface ClickableTooltipProps { triggerRef: RefObject isOpen: boolean setIsOpen: (isOpen: boolean) => void + toggleOnTriggerClick?: boolean } const ClickableTooltip = ({ @@ -37,6 +38,7 @@ const ClickableTooltip = ({ triggerRef, isOpen, setIsOpen, + toggleOnTriggerClick = true, }: ClickableTooltipProps) => { const [calculatedPosition, setCalculatedPosition] = useState(position) const [tooltipCoords, setTooltipCoords] = useState({ x: 0, y: 0 }) @@ -151,7 +153,7 @@ const ClickableTooltip = ({ }, [isOpen, closeOnClickOutside]) useEffect(() => { - if (!triggerRef?.current) return + if (!toggleOnTriggerClick || !triggerRef?.current) return const handleClick = (e: Event) => { e.preventDefault() @@ -165,7 +167,7 @@ const ClickableTooltip = ({ return () => { element.removeEventListener('click', handleClick, true) } - }, [triggerRef, isOpen]) + }, [triggerRef, isOpen, toggleOnTriggerClick]) const variants = { top: { diff --git a/src/context/date.context.tsx b/src/context/date.context.tsx index 13f56d3b..13dc0339 100644 --- a/src/context/date.context.tsx +++ b/src/context/date.context.tsx @@ -1,5 +1,5 @@ import type React from 'react' -import { createContext, useContext, useEffect, useState } from 'react' +import { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react' import { convertShamsiToHijri, getCurrentDate, @@ -44,44 +44,54 @@ export const DateProvider: React.FC<{ children: React.ReactNode }> = ({ children setSelectedDate(newToday.clone()) }, [timezone]) - const goToToday = () => { + const goToToday = useCallback(() => { const newToday = getCurrentDate(timezone.value) setCurrentDate(newToday.clone()) setSelectedDate(newToday.clone()) - } + }, [timezone]) - const isToday = (date: WidgetifyDate): boolean => { - return ( - date.jDate() === today.jDate() && - date.jMonth() === today.jMonth() && - date.jYear() === today.jYear() - ) - } + const isToday = useCallback( + (date: WidgetifyDate): boolean => { + return ( + date.jDate() === today.jDate() && + date.jMonth() === today.jMonth() && + date.jYear() === today.jYear() + ) + }, + [today] + ) - const getHijriDate = (date: WidgetifyDate): string => { + const getHijriDate = useCallback((date: WidgetifyDate): string => { const hijriDate = convertShamsiToHijri(date) return `${hijriDate.iYear()}/${hijriDate.iMonth() + 1}/${hijriDate.iDate()}` - } + }, []) const todayIsHoliday = activeDate.day() === 5 - return ( - - {children} - + const value = useMemo( + () => ({ + currentDate, + selectedDate, + todayIsHoliday, + today, + setCurrentDate, + setSelectedDate, + goToToday, + isToday, + getHijriDate, + }), + [ + currentDate, + selectedDate, + todayIsHoliday, + today, + goToToday, + isToday, + getHijriDate, + ] ) + + return {children} } export const useDate = (): DateContextType => { diff --git a/src/context/widget-visibility.context.tsx b/src/context/widget-visibility.context.tsx index 37cf6a6d..5ec00321 100644 --- a/src/context/widget-visibility.context.tsx +++ b/src/context/widget-visibility.context.tsx @@ -9,13 +9,14 @@ import { import Analytics from '@/analytics' import { getFromStorage, setToStorage } from '@/common/storage' import { showToast } from '@/common/toast' -import CalendarLayout from '@/layouts/widgets/calendar/calendar' import { ComboWidget } from '@/layouts/widgets/combo-widget/combo-widget.layout' import { HabitsLayout } from '@/layouts/widgets/habit/habits.layout' +import { WidgetKeys as RegistryWidgetKeys } from '@/layouts/widgets/layout-engine/types' import { NetworkLayout } from '@/layouts/widgets/network/network.layout' import { NewsLayout } from '@/layouts/widgets/news/news.layout' import { ToolsLayout } from '@/layouts/widgets/tools/tools.layout' import { WeatherLayout } from '@/layouts/widgets/weather/weather.layout' +import { WIDGET_DEFINITIONS } from '@/layouts/widgets/widget-registry' import { WigiArzLayout } from '@/layouts/widgets/wigi-arz/wigi_arz.layout' import { YadkarWidget } from '@/layouts/widgets/yadkar/yadkar' import { @@ -67,7 +68,10 @@ export const widgetItems: WidgetItem[] = [ emoji: '📅', label: 'تقویم', order: 0, - node: , + node: WIDGET_DEFINITIONS[RegistryWidgetKeys.calendar].node('calendar', { + w: 2, + h: 3, + }), canToggle: true, popular: true, }, diff --git a/src/layouts/widgets/calendar/components/calendar-grid.tsx b/src/layouts/widgets/calendar/components/calendar-grid.tsx index 0adc8120..1ba6f963 100644 --- a/src/layouts/widgets/calendar/components/calendar-grid.tsx +++ b/src/layouts/widgets/calendar/components/calendar-grid.tsx @@ -2,7 +2,7 @@ import { useAuth } from '@/context/auth.context' import { useGeneralSetting } from '@/context/general-setting.context' import { useGetEvents } from '@/services/hooks/date/get-events.hook' import type React from 'react' -import { useState } from 'react' +import { useMemo, useState } from 'react' import { type WidgetifyDate, formatDateStr } from '../utils' import { DayItem } from './day/day' import { ClickableTooltip } from '@/components/ui' @@ -53,6 +53,7 @@ export const CalendarGrid: React.FC = ({ const nextMonthDays = totalCells - daysInMonth - emptyDays const selectedDateStr = formatDateStr(selectedDate) + const triggerRef = useMemo(() => ({ current: clickedElement }), [clickedElement]) return ( <> @@ -109,9 +110,11 @@ export const CalendarGrid: React.FC = ({ {clickedElement && ( refetch()} diff --git a/src/layouts/widgets/calendar/components/day/tool-tip-content.tsx b/src/layouts/widgets/calendar/components/day/tool-tip-content.tsx index 27c8d011..8643b4bb 100644 --- a/src/layouts/widgets/calendar/components/day/tool-tip-content.tsx +++ b/src/layouts/widgets/calendar/components/day/tool-tip-content.tsx @@ -5,6 +5,7 @@ import { getHijriEvents, getShamsiEvents, hijriMonthNames, + type WidgetifyDate, } from '../../utils' import { useDate } from '@/context/date.context' import type React from 'react' @@ -23,6 +24,7 @@ import { moodOptions } from '@/common/constant/moods' import { Icon } from '@/src/icons' interface CalendarDayDetailsProps { + selectedDate: WidgetifyDate events: FetchedAllEvents eventIcon?: string moods: MoodEntry[] @@ -30,11 +32,12 @@ interface CalendarDayDetailsProps { } export const CalendarDayDetails: React.FC = ({ + selectedDate, events, moods, onMoodChange, }) => { - const { selectedDate, today, getHijriDate } = useDate() + const { today, getHijriDate } = useDate() const { isAuthenticated } = useAuth() const { mutateAsync: upsertMoodLog } = useUpsertMoodLog()