---
# System prepended metadata

title: MemberLearnHistory.jsx
tags: [N108 Component]

---

---
tags: N108 Component
---
# MemberLearnHistory.jsx
- Member 切換流程圖 *(原本 component 名稱把 Member 去掉)*
- 可以配合 PPT 14頁
```graphviz
digraph Pageswitch {
                nodesep=0.5
                node [color=orange, fontsize=22, shape=box, style=bold]
                edge [color=RosyBrown, style=dashed]
                Profile->{TopBar IMG_Name Content}
                Content->{info LearnHistory WatchHistory NotelistHistory}
                info->{infobtn}
                NotelistHistory->{NoteHistory}
                {rank=same;UploadImg IMG_Name}
                LearnHistory [color=orange, fontsize=22, shape=box,style=filled, fillcolor=Bisque]
}
```
## import 資料
| 名稱 | 類型 | 描述 | 來源 |
| :------ | :----------- | :----------- | :-- |
| NavLink | <font color='RosyBrown'>external component</font> | Route | react-router-dom |
| CalendarHeatmap | <font color='RosyBrown'>external component</font> | Route | react-calendar-heatmap |
| ReactTooltip | <font color='RosyBrown'>external component</font> | Calendar Hover tool | react-tooltip |
| api |  <font color='Green'>function</font> |  API function | app/lib/api.js |
| ReactLoading | <font color='RosyBrown'>external component</font> | loading 畫面 | react-loading |

## constructor 介紹
### state 參數介紹
| 名稱 | 類型 | 描述 | defalut |
| :------ | :----------- | :----------- | :-- |
| `data` | <font color='Gold'>json value</font> | API 獲取的學系歷程所有時間| `[]`|
| `showlist` | <font color='Gold'>json value</font> | 當天 *(有顏色的 github 磚)* 學習過的影片| `[]` |
| `isLoaded` | <font color='blue'>bool</font> | API loading，true 為 loading 完成，false 為正在 loading | `false` |
| `now` | <font color='Gold'>json value</font> | 今天相關 json 資料| 如下 |
### state.now 參數介紹
| 名稱 | 類型 | 描述 | defalut |
| :------ | :----------- | :----------- | :-- |
| `now.day` | <font color='orange'>string</font> | 日期 | `String(new Date().getDate()).padStart(2, '0')` |
| `now.month` | <font color='orange'>string</font> | 月份 | `String(new Date().getMonth() + 1).padStart(2, '0')` |
| `now.today` | <font color='SlateGrey'>date value</font> | 今天的西元年 月 日 (台北標準時間)| `new Date()` |
| `now.year` | <font color='Salmon'>int</font> | 今年 (西元) | `new Date().getFullYear()` |


## componentDidMount
- 執行 histroy()，並將 isLoaded = true
## componentDidUpdate
- 當 prevState == this.state 時，執行 histroy()，並將 isLoaded = true
## 獨立 function
| 名稱 | 描述 | async 是否 |
|:--|:--|:--|
|histroy()|Call Member/Learnhistory，以及作 json 分類處理|是|
|getlist()|點擊 github 磚時的 event function|是|
|CalendarHeatmapdata()|將 state.data 轉換成 CalendarHeatmap component 需要的格式|是|
### CalendarHeatmapdata() 介紹
- CalendarHeatmap 需要的格式為 {日期, 次數}
- 第一層 for 把時間格式處裡完成，時間為往前推算一年日期，ex: 2022/9/1 就算到 2021/8/31 -> 2022/9/1
```jsx=30
for (var k = 1; k <= 13; k++) {
    if (m > 12) {
        m = 1
        flag = 1
    }
    let y = flag ? year : year - 1
    let days = new Date(y, m, 0).getDate()
    if (y == year && m == today.getMonth() + 1)
        days = today.getDate()
    for (var j = 1; j <= days; j++) {
        let t_count = 0
        let t_date = y + "-" + m.toString(10).padStart(2, '0') + "-" + j.toString(10).padStart(2, '0')
        finaldate.push({ date: t_date, count: t_count })
    }
    m += 1
}
```
- 第二層 for 計算日期次數 (那天看了多少個影片)
```jsx=46
for (var k = 0; k < finaldate.length; k++) {
    for (var x = 0; x < data.length; x++) {
        if (finaldate[k].date == data[x].date)
            finaldate[k].count += 1;
    }
}
```
### getlist() 介紹
- 點擊的日期為 function 參數，並與 state.data 對照，相同時，即為當日看的影片
## API 數量表格
| 名稱 | 類型 | 描述 | 位於 |
|:--|:--|:--|:--|
|Member/Learnhistory|<font color='LightSkyBlue'>get</font>|所有觀看紀錄，包含影片名稱、時間、OID(VID)|histroy()|
## render
### 額外參數
| 名稱 | 類型 | 描述 |
| :------ | :----------- | :----------- |
| `t_date` | <font color='SlateGrey'>date value</font> | CalendarHeatmap 符合的資料格式，this.CalendarHeatmapdata 回傳|
### return
- isloaded 是 false，會顯示 ReactLoading 的轉圈圈畫面
```jsx=127
<ReactLoading
    type={"spinningBubbles"}
    color="#1abc81"
    height={150}
    width={150}
/>
```
- CalendarHeatmap 的參數有 7 個
    - startDate (開始日期)
    - endDate (結束日期)
    - values (所有天數的參數)
    - classForValue (顏色區別 css class)
    - tooltipDataAttrs (hover 顯示文字)
    - showWeekdayLabels (要不要標示一周)
    - onClick (點擊時，event function)
```jsx=144
<div className="mt_24 Box-userinfo">
    <div className="dis-center">過去一年的學習紀錄</div>
    <CalendarHeatmap
        startDate={now.year - 1 + '-' + now.month + '-' + now.day}
        endDate={now.year + '-' + now.month + '-' + now.day}
        values={t_date}
        classForValue={value => {
            if (!value) {
                return 'color-empty';
            }
            return `color-github-${value.count}`;
        }}
        tooltipDataAttrs={value => {
            if (value.date)
                return {
                    'data-tip': `${value.date} 有觀看 ${value.count} 部影片`
                };
        }}
        showWeekdayLabels={true}
        onClick={value => this.getlist(value.date)}
    />
    <ReactTooltip />
    <div className="dis-center">觀看紀錄</div>
    <div className="myCalendarHeatmap">
        {showlist.length ? showlist : <div className="dis-center">請選擇格子以檢視紀錄...</div>}
    </div>
</div>
```
[回上層 MemberContent.jsx](https://hackmd.io/VO9RoLZZTSuRFfjFN1uSUQ?view)