1+ import React , { useEffect , useState } from 'react'
2+ import ReactTooltip from 'react-tooltip'
3+ import { HiBell } from 'react-icons/hi'
4+ import ReactMarkdown from 'react-markdown'
5+ import { format } from 'timeago.js'
6+ import BeatLoader from 'react-spinners/BeatLoader'
7+ import { useGetVersions } from "../api/getVersions" ;
8+ import { useChangelogStore } from "../stores/changelog" ;
9+ import { getAppVersion } from "src/utils/Os" ;
10+
11+ export const Changelog = ( ) => {
12+ const tooltipId = 'tl-1'
13+ const [ tooltipOpen , setTooltipShown ] = useState ( false ) ;
14+ const { isLoading, isError, data : versions } = useGetVersions ( {
15+ config : {
16+ enabled : tooltipOpen
17+ }
18+ } ) ;
19+
20+ const { lastReadVersion, setVersionAsRead} = useChangelogStore ( ) ;
21+
22+ const isChangelogRead = ( ) : boolean => {
23+ return lastReadVersion === getAppVersion ( ) ;
24+ }
25+
26+ useEffect ( ( ) => {
27+ if ( tooltipOpen ) {
28+ setVersionAsRead ( getAppVersion ( ) )
29+ }
30+ } , [ tooltipOpen , setVersionAsRead ] )
31+
32+ return (
33+ < >
34+ < ReactTooltip
35+ id = { tooltipId }
36+ event = "click"
37+ scrollHide = { false }
38+ afterShow = { ( ) => { setTooltipShown ( true ) } }
39+ place = "bottom"
40+ className = "changelogTooltip scrollable"
41+ globalEventOff = "click" >
42+ { isLoading ? (
43+ < div className = "tooltipLoading" >
44+ < BeatLoader color = { '#A9B2BD' } loading = { isLoading } size = { 15 } />
45+ </ div >
46+ ) : isError || ! versions . length ? (
47+ < p className = "tooltipErrorMsg" > Failed to load the changelog</ p >
48+ ) : (
49+ versions . map ( ( item ) => {
50+ return (
51+ < div key = { item . name } >
52+ < div className = "tooltipHeader" >
53+ < a className = "tooltipVersion" onClick = { ( ) => window . open ( item . html_url , '_blank' ) } >
54+ { item . name }
55+ </ a >
56+ < span className = "tooltipDate" > { format ( new Date ( item . published_at ) ) } </ span >
57+ </ div >
58+ < div className = "tooltipContent" >
59+ < ReactMarkdown children = { item . body } />
60+ </ div >
61+ </ div >
62+ )
63+ } )
64+ ) }
65+ </ ReactTooltip >
66+ < span
67+ data-tip
68+ data-for = { tooltipId }
69+ className = { 'changelogButton' + ( ! isChangelogRead ( ) ? ' active' : '' ) } >
70+ < HiBell style = { { width : 14 } } />
71+ </ span >
72+ </ >
73+ )
74+ }
0 commit comments