11import styles from './Donations.module.scss'
2- import { useEffect , useRef } from 'react'
2+ import { useEffect , useRef , useState } from 'react'
33import cn from 'classnames'
44import { Scrollable } from '../Scrollable'
5+ import { ListHeader } from '../ListHeader/ListHeader'
56
67const get_href_from_url_like_string = ( text : string ) : string | null => {
78 if ( / \s / . test ( text ) ) {
@@ -82,6 +83,8 @@ export type DonationsProps = {
8283
8384export const Donations : React . FC < DonationsProps > = ( props ) => {
8485 const observer_target = useRef < HTMLDivElement > ( null )
86+ const [ is_wallets_collapsed , set_is_wallets_collapsed ] = useState ( true )
87+ const [ is_donations_collapsed , set_is_donations_collapsed ] = useState ( false )
8588
8689 useEffect ( ( ) => {
8790 if ( ! observer_target . current ) return
@@ -104,80 +107,112 @@ export const Donations: React.FC<DonationsProps> = (props) => {
104107 return (
105108 < Scrollable >
106109 < div className = { styles . container } >
107- < div >
108- Hi there! If you enjoy using Code Web Chat, buying a $3 "coffee" is a
109- great way to show your support for the project.
110- < br />
111- Thank you for choosing to donate.
112- </ div >
113- < div >
114- { props . is_fetching ? (
115- < >
116- < div className = { styles . donations__donation } >
110+ < ListHeader
111+ title = "Crypto wallets"
112+ is_collapsed = { is_wallets_collapsed }
113+ on_toggle_collapsed = { ( ) => set_is_wallets_collapsed ( ( v ) => ! v ) }
114+ />
115+ { ! is_wallets_collapsed && (
116+ < div className = { styles . wallets } >
117+ < div className = { styles . wallets__wallet } >
118+ < strong > Bitcoin</ strong >
119+ < span > bc1qfzajl0fc4347knr6n5hhuk52ufr4sau04su5te</ span >
120+ </ div >
121+ < div className = { styles . wallets__wallet } >
122+ < strong > Ethereum</ strong >
123+ < span > 0x532eA8CA70aBfbA6bfE35e6B3b7b301b175Cf86D</ span >
124+ </ div >
125+ < div className = { styles . wallets__wallet } >
126+ < strong > Monero</ strong >
127+ < span >
128+ 84whVjApZJtSeRb2eEbZ1pJ7yuBoGoWHGA4JuiFvdXVBXnaRYyQ3S4kTEuzgKjpxyr3nxn1XHt9yWTRqZ3XGfY35L4yDm6R
129+ </ span >
130+ </ div >
131+ </ div >
132+ ) }
133+ < ListHeader
134+ title = "Recent coffees"
135+ is_collapsed = { is_donations_collapsed }
136+ on_toggle_collapsed = { ( ) => set_is_donations_collapsed ( ( v ) => ! v ) }
137+ />
138+ { ! is_donations_collapsed && (
139+ < div className = { styles . donations } >
140+ { props . is_fetching ? (
141+ < >
142+ < div className = { styles . donations__inner__donation } >
143+ < div
144+ className = { styles . skeleton }
145+ style = { { width : '50%' , height : '14px' } }
146+ />
147+ < div className = { styles . skeleton } style = { { height : '30px' } } />
148+ </ div >
149+ < div className = { styles . donations__inner__donation } >
150+ < div
151+ className = { styles . skeleton }
152+ style = { { width : '70%' , height : '14px' } }
153+ />
154+ < div className = { styles . skeleton } style = { { height : '30px' } } />
155+ </ div >
156+ < div className = { styles . donations__inner__donation } >
157+ < div
158+ className = { styles . skeleton }
159+ style = { { width : '40%' , height : '14px' } }
160+ />
161+ < div className = { styles . skeleton } style = { { height : '30px' } } />
162+ </ div >
163+ </ >
164+ ) : (
165+ < >
117166 < div
118- className = { styles . skeleton }
119- style = { { width : '50%' , height : '14px' } }
120- />
121- < div className = { styles . skeleton } style = { { height : '30px' } } />
122- </ div >
123- < div className = { styles . donations__donation } >
124- < div
125- className = { styles . skeleton }
126- style = { { width : '70%' , height : '14px' } }
127- />
128- < div className = { styles . skeleton } style = { { height : '30px' } } />
129- </ div >
130- < div className = { styles . donations__donation } >
131- < div
132- className = { styles . skeleton }
133- style = { { width : '40%' , height : '14px' } }
134- />
135- < div className = { styles . skeleton } style = { { height : '30px' } } />
136- </ div >
137- </ >
138- ) : (
139- < >
140- < div
141- className = { cn ( styles . donations , {
142- [ styles [ 'donations--revalidating' ] ] : props . is_revalidating
143- } ) }
144- >
145- { props . donations ?. map ( ( donation , index ) => (
146- < div className = { styles . donations__donation } key = { index } >
147- { ( ( ) => {
148- const { username, href, after_text } =
149- parse_support_message ( donation . support_message )
150- const title = `${ username } ${ after_text } `
151- return (
167+ className = { cn ( styles . donations__inner , {
168+ [ styles [ 'donations__inner--revalidating' ] ] :
169+ props . is_revalidating
170+ } ) }
171+ >
172+ { props . donations ?. map ( ( donation , index ) => (
173+ < div
174+ className = { styles . donations__inner__donation }
175+ key = { index }
176+ >
177+ { ( ( ) => {
178+ const { username, href, after_text } =
179+ parse_support_message ( donation . support_message )
180+ const title = `${ username } ${ after_text } `
181+ return (
182+ < div
183+ className = {
184+ styles . donations__inner__donation__header
185+ }
186+ title = { title }
187+ >
188+ < strong >
189+ { href ? (
190+ < a href = { href } target = "_blank" rel = "nofollow" >
191+ { username }
192+ </ a >
193+ ) : (
194+ username
195+ ) }
196+ </ strong > { ' ' }
197+ { after_text }
198+ </ div >
199+ )
200+ } ) ( ) }
201+ { donation . support_note && (
152202 < div
153- className = { styles . donations__donation__header }
154- title = { title }
203+ className = { styles . donations__inner__donation__note }
155204 >
156- < strong >
157- { href ? (
158- < a href = { href } target = "_blank" rel = "nofollow" >
159- { username }
160- </ a >
161- ) : (
162- username
163- ) }
164- </ strong > { ' ' }
165- { after_text }
205+ { donation . support_note }
166206 </ div >
167- )
168- } ) ( ) }
169- { donation . support_note && (
170- < div className = { styles . donations__donation__note } >
171- { donation . support_note }
172- </ div >
173- ) }
174- </ div >
175- ) ) }
176- </ div >
177- { props . has_more && < div ref = { observer_target } /> }
178- </ >
179- ) }
180- </ div >
207+ ) }
208+ </ div >
209+ ) ) }
210+ </ div >
211+ { props . has_more && < div ref = { observer_target } /> }
212+ </ >
213+ ) }
214+ </ div >
215+ ) }
181216 </ div >
182217 </ Scrollable >
183218 )
0 commit comments