Calendar.js 5.79 KB
Newer Older
Choi Ga Young's avatar
Choi Ga Young committed
1
2
import React, { useState, useEffect } from 'react';
import { SafeAreaView, StyleSheet, View, Text, FlatList, TouchableOpacity } from 'react-native';
Choi Ga Young's avatar
Choi Ga Young committed
3
import { Button } from 'react-native-elements';
Choi Ga Young's avatar
Choi Ga Young committed
4
import Ionicons from 'react-native-vector-icons/Ionicons';
5
import { getDateStr } from '../utils/dateFunction';
Choi Ga Young's avatar
Choi Ga Young committed
6
7

const DateItem = ({ dateitem, textColor, onPress, flatListHeight }) => {
Choi Ga Young's avatar
Choi Ga Young committed
8
  return (
Choi Ga Young's avatar
Choi Ga Young committed
9
    <TouchableOpacity onPress={onPress}
Choi Ga Young's avatar
Choi Ga Young committed
10
      style={[style.dateContainer, { height: flatListHeight }]}>
Choi Ga Young's avatar
Choi Ga Young committed
11
      <Text style={textColor}>{dateitem.date.getDate()}</Text>
Choi Ga Young's avatar
Choi Ga Young committed
12
13
14
15
16
17
18
      {
        dateitem.type &&
        <View>
          <Text style={{ color: '#1E90FF' }}>{dateitem.type.input ? dateitem.type.input : null}</Text>
          <Text style={{ color: '#DC143C' }}>{dateitem.type.output ? dateitem.type.output : null}</Text>
        </View>
      }
Choi Ga Young's avatar
Choi Ga Young committed
19
20
21
    </TouchableOpacity>
  );
};
Choi Ga Young's avatar
Choi Ga Young committed
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
const INIT_Data = [
  {
    date: "2021-06-28",
    type: { 'input': 10000, 'output': 1000 },
  },
  {
    date: "2021-07-01",
    type: { 'input': 50000, 'output': 3500 },
  },
  {
    date: "2021-07-11",
    type: { 'input': 100000, 'output': 2000 },
  },
  {
    date: "2021-08-14",
    type: { 'input': 15000, 'output': 2010 },
  },
];
Choi Ga Young's avatar
Choi Ga Young committed
40

41
42
43
44
45
46
47
48
49
50
51
function Calendar({
  navigation,
  MData,
  year,
  setYear,
  month,
  setMonth,
  todayM,
  todayY,
}) {
  //console.log('MData', MData)
Choi Ga Young's avatar
Choi Ga Young committed
52
  const date = new Date();
Choi Ga Young's avatar
Choi Ga Young committed
53
  const [flatListHeight, setFlatListHeight] = useState(400)
Choi Ga Young's avatar
Choi Ga Young committed
54
55
56
57
58
59
60
61
62
63
64

  const prevLast = new Date(year, month, 0); //이전 달의 마지막 날
  const thisFirst = new Date(year, month, 1); //이번 달의 첫째 날
  const thisLast = new Date(year, month + 1, 0); //이번 달의 마지막 날

  const thisFirstDay = thisFirst.getDay(); //이번 달 첫번 째 요일
  const prevLastDate = prevLast.getDate(); //이전 달 마지막 날짜
  const thisLastDate = thisLast.getDate(); //이번 달 마지막 날짜
  const thisLastDay = thisLast.getDay(); //이번 달 마지막 요일

  // 이번 달 달력에 쓰일 날짜들. 이전달 다음달 전부 포함
Choi Ga Young's avatar
Choi Ga Young committed
65
66
  const Dates = [];
  const DBDates = [];
Choi Ga Young's avatar
Choi Ga Young committed
67
  if (thisFirstDay !== 0) { // 첫째 날이 일요일이 아니라면
Choi Ga Young's avatar
Choi Ga Young committed
68
    for (let i = 0; i < thisFirstDay; i++) {
Choi Ga Young's avatar
Choi Ga Young committed
69
      Dates.unshift({ date: new Date(year, month - 1, prevLastDate - i) })
Choi Ga Young's avatar
Choi Ga Young committed
70
    }
Choi Ga Young's avatar
Choi Ga Young committed
71
72
  }
  for (let i = 1; i <= thisLastDate; i++) { //이번 달 날짜 
Choi Ga Young's avatar
Choi Ga Young committed
73
    Dates.push({ date: new Date(year, month, i) })
Choi Ga Young's avatar
Choi Ga Young committed
74
75
  }
  for (let i = 1; i <= 6 - thisLastDay; i++) {
Choi Ga Young's avatar
Choi Ga Young committed
76
    Dates.push({ date: new Date(year, month + 1, i) })
Choi Ga Young's avatar
Choi Ga Young committed
77
  }
Choi Ga Young's avatar
Choi Ga Young committed
78

Choi Ga Young's avatar
Choi Ga Young committed
79
  //DB 데이터와 날짜 비교
Choi Ga Young's avatar
Choi Ga Young committed
80
81
82
  for (let i = 0; i < MData.length; i++) {
    const str = MData[i].date
    DBDates.push({ date: new Date(Number(str.slice(0, 4)), Number(str.slice(5, 7)) - 1, Number(str.slice(8, 10))), type: MData[i].type })
Choi Ga Young's avatar
Choi Ga Young committed
83
84
  }

Choi Ga Young's avatar
Choi Ga Young committed
85
  for (let i = 0; i < Dates.length; i++) {
Choi Ga Young's avatar
Choi Ga Young committed
86
    const idx = DBDates.findIndex(obj => obj.date.getTime() === Dates[i].date.getTime())
Choi Ga Young's avatar
Choi Ga Young committed
87
88
89
90
    if (idx !== -1) {
      Dates[i] = DBDates[idx]
    }
  }
Choi Ga Young's avatar
Choi Ga Young committed
91
92
93
94
95

  let istoday = false;

  const renderDate = ({ item }) => {
    let color = '#000000';
Choi Ga Young's avatar
Choi Ga Young committed
96
    if (item.date.getDate() === date.getDate() && month === todayM && year === todayY) {
Choi Ga Young's avatar
Choi Ga Young committed
97
98
99
100
101
102
      istoday = true;
    }
    if (istoday) {
      color = '#6495ed'
      istoday = false;
    }
Choi Ga Young's avatar
Choi Ga Young committed
103
    if (!(item.date.getMonth() === month)) {
Choi Ga Young's avatar
Choi Ga Young committed
104
105
      color = '#a9a9a9'
    }
Choi Ga Young's avatar
Choi Ga Young committed
106

Choi Ga Young's avatar
Choi Ga Young committed
107
    return (
108
      <DateItem dateitem={item} textColor={{ color }} onPress={() => navigation.navigate('CalDetail', getDateStr(item.date))} flatListHeight={flatListHeight / (Dates.length / 7)} />
Choi Ga Young's avatar
Choi Ga Young committed
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
    )
  }
  const prevBtn = () => {
    if (month < 1) {
      setYear(year - 1)
      setMonth(11)
    } else {
      setMonth(month - 1)
    }
  };
  const nextBtn = () => {
    if (month > 10) {
      setYear(year + 1)
      setMonth(0)
    } else {
      setMonth(month + 1)
    }
  }
  useEffect(() => {
    setMonth(todayM)
    setYear(todayY)
  }, [])

Choi Ga Young's avatar
Choi Ga Young committed
132
133
  const onLayout = (event) => {
    const { x, y, height, width } = event.nativeEvent.layout;
Choi Ga Young's avatar
Choi Ga Young committed
134
135
    setFlatListHeight(height)
  }
Choi Ga Young's avatar
Choi Ga Young committed
136
137
  return (
    <>
Choi Ga Young's avatar
Choi Ga Young committed
138
      <SafeAreaView style={style.EntContainer}>
Choi Ga Young's avatar
Choi Ga Young committed
139
140
141
142
143
144
145
146
147
148
149
150
        <View style={style.Container}>
          <Text style={style.Head}>{year}  {month + 1} </Text>
          <View style={style.Buttons}>
            <Button icon={
              <Ionicons name='chevron-back-sharp' onPress={prevBtn} size={15} color='black' />
            } type='clear' />
            <Button title='Today' onPress={() => { setMonth(todayM); setYear(todayY) }} type='clear' />
            <Button icon={
              <Ionicons name='chevron-forward-sharp' onPress={nextBtn} size={15} color='black' />
            } type='clear' />
          </View>
        </View>
Choi Ga Young's avatar
Choi Ga Young committed
151
152
153
154
155
156
157
158
159
        <View style={style.Days}>
          <Text style={style.DayText}></Text>
          <Text style={style.DayText}></Text>
          <Text style={style.DayText}></Text>
          <Text style={style.DayText}></Text>
          <Text style={style.DayText}></Text>
          <Text style={style.DayText}></Text>
          <Text style={style.DayText}></Text>
        </View>
Choi Ga Young's avatar
Choi Ga Young committed
160
        <FlatList
Choi Ga Young's avatar
Choi Ga Young committed
161
          style={{ backgroundColor: "#FFFFFF" }}
Choi Ga Young's avatar
Choi Ga Young committed
162
          onLayout={onLayout}
Choi Ga Young's avatar
Choi Ga Young committed
163
          data={Dates}
Choi Ga Young's avatar
Choi Ga Young committed
164
165
          numColumns={7}
          renderItem={renderDate}
Choi Ga Young's avatar
Choi Ga Young committed
166
          keyExtractor={item => item.date}
Choi Ga Young's avatar
Choi Ga Young committed
167
        />
Choi Ga Young's avatar
Choi Ga Young committed
168
169
170
      </SafeAreaView>
    </>
  )
Choi Ga Young's avatar
Choi Ga Young committed
171
};
Choi Ga Young's avatar
Choi Ga Young committed
172
173

const style = StyleSheet.create({
174
  EntContainer: {
Choi Ga Young's avatar
Choi Ga Young committed
175
176
177
    flex: 1,
    padding: 20
  },
178
  Head: {
Choi Ga Young's avatar
Choi Ga Young committed
179
    fontSize: 24,
Choi Ga Young's avatar
Choi Ga Young committed
180
    fontFamily: 'GowunDodum-Regular'
Choi Ga Young's avatar
Choi Ga Young committed
181
  },
182
  Container: {
Choi Ga Young's avatar
Choi Ga Young committed
183
184
185
    justifyContent: "center",
    alignItems: "center",
  },
186
  dateContainer: {
Choi Ga Young's avatar
Choi Ga Young committed
187
188
189
    flex: 1,
    borderWidth: 0.8,
    borderColor: '#DCDCDC'
Choi Ga Young's avatar
Choi Ga Young committed
190
191
192
193
194
195
  },
  Buttons: {
    flexDirection: 'row',
    margin: 10
  },
  Days: {
Choi Ga Young's avatar
Choi Ga Young committed
196
197
    flexDirection: 'row',
    backgroundColor: '#6495ED'
Choi Ga Young's avatar
Choi Ga Young committed
198
  },
Choi Ga Young's avatar
Choi Ga Young committed
199
200
  DayText: {
    flex: 1,
Choi Ga Young's avatar
Choi Ga Young committed
201
    textAlign: 'center',
Choi Ga Young's avatar
Choi Ga Young committed
202
203
204
    color: '#FFFFFF',
    fontFamily: 'GowunDodum-Regular',
    fontWeight: "bold"
Choi Ga Young's avatar
Choi Ga Young committed
205
  },
Choi Ga Young's avatar
Choi Ga Young committed
206
207
208
});

export default Calendar;