1
1
import * as React from "react" ;
2
- import { useCallback , useEffect , useState } from "react" ;
2
+ import {
3
+ forwardRef ,
4
+ useCallback ,
5
+ useEffect ,
6
+ useImperativeHandle ,
7
+ useRef ,
8
+ useState ,
9
+ } from "react" ;
3
10
import { AccessibilityInfo , StyleSheet , View } from "react-native" ;
4
11
import type { DateData } from "react-native-calendars" ;
5
12
import { Calendar , LocaleConfig } from "react-native-calendars" ;
@@ -8,17 +15,26 @@ import type { Direction, Theme } from "react-native-calendars/src/types";
8
15
import { Labels , StorageKeysConstants } from "../../constants" ;
9
16
import { Colors , FontWeight , Margins , Paddings , Sizes } from "../../styles" ;
10
17
import type { MoodStorageItem } from "../../type" ;
18
+ import type { MarkedDatesType } from "../../types" ;
11
19
import { MoodboardUtils , StorageUtils } from "../../utils" ;
12
20
import { Icomoon , IcomoonIcons , SecondaryText } from "../baseComponents" ;
13
21
import EditMoodDay from "./editMoodDay.component" ;
14
22
15
23
const CALENDAR_MONTH_FORMAT = "MMMM yyyy" ;
16
24
17
- const MoodsCalendar : React . FC = ( ) => {
25
+ interface RefreshMoodCalendar {
26
+ refresh : ( ) => void ;
27
+ }
28
+
29
+ const MoodsCalendar : React . ForwardRefRenderFunction < RefreshMoodCalendar > = (
30
+ props ,
31
+ forwardedRef
32
+ ) => {
18
33
const [ moods , setMoods ] = useState < MoodStorageItem [ ] > ( ) ;
19
34
const [ showEditModal , setShowEditModal ] = useState ( false ) ;
20
35
const [ dateToEdit , setDateToEdit ] = useState < string > ( ) ;
21
36
const [ monthToDisplay , setMonthToDisplay ] = useState ( new Date ( ) . getMonth ( ) ) ;
37
+ const calendarRef = useRef < Calendar > ( null ) ;
22
38
23
39
const calenderTheme : Theme = {
24
40
arrowColor : Colors . primaryBlue ,
@@ -28,16 +44,23 @@ const MoodsCalendar: React.FC = () => {
28
44
textMonthFontSize : Sizes . xs ,
29
45
} ;
30
46
31
- const findMoods = async ( ) => {
47
+ useImperativeHandle ( forwardedRef , ( ) => ( {
48
+ async refresh ( ) {
49
+ await findMoods ( ) ;
50
+ } ,
51
+ } ) ) ;
52
+
53
+ const findMoods = useCallback ( async ( ) => {
32
54
const moodsStorage : MoodStorageItem [ ] =
33
55
( await StorageUtils . getObjectValue ( StorageKeysConstants . moodsByDate ) ) ??
34
56
[ ] ;
35
57
36
58
setMoods ( moodsStorage ) ;
37
- } ;
59
+ } , [ ] ) ;
38
60
39
61
useEffect ( ( ) => {
40
62
void findMoods ( ) ;
63
+ // eslint-disable-next-line react-hooks/exhaustive-deps
41
64
} , [ ] ) ;
42
65
43
66
const onDayPress = useCallback ( ( day : DateData ) => {
@@ -93,10 +116,10 @@ const MoodsCalendar: React.FC = () => {
93
116
) ;
94
117
} , [ ] ) ;
95
118
96
- const hideEditModal = useCallback ( ( ) => {
119
+ const hideEditModal = useCallback ( async ( ) => {
97
120
setShowEditModal ( false ) ;
98
- void findMoods ( ) ;
99
- } , [ ] ) ;
121
+ await findMoods ( ) ;
122
+ } , [ findMoods ] ) ;
100
123
101
124
return (
102
125
< >
@@ -118,6 +141,7 @@ const MoodsCalendar: React.FC = () => {
118
141
markedDates = { buildMarkedDatesForCalendar ( moods ) }
119
142
renderArrow = { renderMonthArrow }
120
143
onMonthChange = { onMonthChange }
144
+ ref = { calendarRef }
121
145
/>
122
146
123
147
< EditMoodDay
@@ -128,11 +152,12 @@ const MoodsCalendar: React.FC = () => {
128
152
</ >
129
153
) ;
130
154
} ;
155
+ MoodsCalendar . displayName = "MoodsCalendar" ;
131
156
132
157
export const buildMarkedDatesForCalendar = (
133
158
moods : MoodStorageItem [ ] | undefined
134
- ) => {
135
- const markedList = { } ;
159
+ ) : MarkedDatesType | undefined => {
160
+ const markedList : MarkedDatesType = { } ;
136
161
137
162
moods ?. forEach ( ( item ) => {
138
163
const moodItem = MoodboardUtils . MOODBOARD_ITEMS . find (
@@ -167,4 +192,4 @@ const styles = StyleSheet.create({
167
192
} ,
168
193
} ) ;
169
194
170
- export default MoodsCalendar ;
195
+ export default forwardRef ( MoodsCalendar ) ;
0 commit comments