@@ -7,6 +7,7 @@ defmodule AlgoraWeb.ClaimLive do
7
7
alias Algora.Bounties.Claim
8
8
alias Algora.Github
9
9
alias Algora.Repo
10
+ alias Algora.Util
10
11
11
12
@ impl true
12
13
def mount ( % { "group_id" => group_id } , _session , socket ) do
@@ -118,176 +119,198 @@ defmodule AlgoraWeb.ClaimLive do
118
119
def render ( assigns ) do
119
120
~H"""
120
121
< div class = "container mx-auto py-8 px-4 " >
121
- < div class = "space-y-8 " >
122
- < . header class = "mb-8 " >
123
- < div class = "grid gap-8 md:grid-cols-[2fr_1fr] " >
124
- < div class = "flex items-center gap-4 " >
125
- < . avatar class = "h-12 w-12 rounded-full " >
126
- < . avatar_image src = { @ source_or_target . repository . user . avatar_url } />
127
- < . avatar_fallback >
128
- { String . first ( @ source_or_target . repository . user . provider_login ) }
129
- </ . avatar_fallback >
130
- </ . avatar >
131
- < div >
132
- < . link
133
- href = { @ source_or_target . url }
134
- class = "text-xl font-semibold hover:underline "
135
- target = "_blank "
136
- >
137
- { @ source_or_target . title }
138
- </ . link >
139
- < div class = "text-sm text-muted-foreground " >
140
- { @ source_or_target . repository . user . provider_login } /{ @ source_or_target . repository . name } #{ @ source_or_target . number }
122
+ < div class = "grid gap-8 md:grid-cols-[2fr_1fr] " >
123
+ < div class = "space-y-8 " >
124
+ < . card >
125
+ < . card_header >
126
+ < div class = "flex items-center gap-4 " >
127
+ < . avatar class = "h-12 w-12 rounded-full " >
128
+ < . avatar_image src = { @ source_or_target . repository . user . avatar_url } />
129
+ < . avatar_fallback >
130
+ { String . first ( @ source_or_target . repository . user . provider_login ) }
131
+ </ . avatar_fallback >
132
+ </ . avatar >
133
+ < div >
134
+ < . link
135
+ href = { @ source_or_target . url }
136
+ class = "text-xl font-semibold hover:underline "
137
+ target = "_blank "
138
+ >
139
+ { @ source_or_target . title }
140
+ </ . link >
141
+ < div class = "text-sm text-muted-foreground " >
142
+ { @ source_or_target . repository . user . provider_login } /{ @ source_or_target . repository . name } #{ @ source_or_target . number }
143
+ </ div >
141
144
</ div >
142
145
</ div >
143
- </ div >
144
- < div class = "mt-4 grid grid-cols-2 gap-8 " >
145
- < . stat_card title = "Total Paid " >
146
- < div class = "text-success " >
147
- { Money . to_string! ( @ total_paid ) }
148
- </ div >
149
- </ . stat_card >
150
- < . stat_card title = "Prize Pool " >
151
- < div class = "text-success " >
152
- { Money . to_string! ( @ prize_pool ) }
153
- </ div >
154
- </ . stat_card >
155
- </ div >
156
- </ div >
157
- </ . header >
158
-
159
- < div class = "grid gap-8 md:grid-cols-[2fr_1fr] " >
160
- < div class = "space-y-8 " >
161
- < . card >
162
- < . card_header >
163
- < div class = "grid grid-cols-1 sm:grid-cols-3 " >
164
- <%= for claim <- @ claims do %>
165
- < div class = "flex items-center gap-4 " >
166
- < . avatar >
167
- < . avatar_image src = { claim . user . avatar_url } />
168
- < . avatar_fallback > { String . first ( claim . user . name ) } </ . avatar_fallback >
169
- </ . avatar >
170
- < div >
171
- < p class = "font-medium " > { claim . user . name } </ p >
172
- < p class = "text-sm text-muted-foreground " > @{ claim . user . handle } </ p >
173
- </ div >
174
- </ div >
175
- <% end %>
176
- </ div >
177
- </ . card_header >
178
- < . card_content >
179
- < div class = "prose dark:prose-invert " >
180
- { Phoenix.HTML . raw ( @ source_body_html ) }
181
- </ div >
182
- </ . card_content >
183
- </ . card >
184
- </ div >
146
+ </ . card_header >
147
+ < . card_content >
148
+ < div class = "prose dark:prose-invert " >
149
+ { Phoenix.HTML . raw ( @ source_body_html ) }
150
+ </ div >
151
+ </ . card_content >
152
+ </ . card >
153
+ </ div >
185
154
186
- < div class = "space-y-8 " >
187
- < . card >
188
- < . card_header >
155
+ < div class = "space-y-8 " >
156
+ < . card >
157
+ < . card_header >
158
+ < div class = "flex items-center justify-between " >
189
159
< . card_title >
190
160
Claim
191
161
</ . card_title >
192
- </ . card_header >
193
- < . card_content >
194
- < div class = "space-y-2 " >
195
- < div class = "flex justify-between text-sm " >
196
- < span class = "text-muted-foreground " > Status</ span >
197
- < span > { @ primary_claim . status |> to_string ( ) |> String . capitalize ( ) } </ span >
198
- </ div >
199
- < div class = "flex justify-between text-sm " >
200
- < span class = "text-muted-foreground " > Submitted</ span >
201
- < span > { Calendar . strftime ( @ primary_claim . inserted_at , "%B %d, %Y" ) } </ span >
202
- </ div >
203
- < div class = "flex justify-between text-sm " >
204
- < span class = "text-muted-foreground " > Last Updated</ span >
205
- < span > { Calendar . strftime ( @ primary_claim . updated_at , "%B %d, %Y" ) } </ span >
206
- </ div >
162
+ < . button >
163
+ Reward bounty
164
+ </ . button >
165
+ </ div >
166
+ </ . card_header >
167
+ < . card_content >
168
+ < div class = "space-y-2 " >
169
+ < div class = "flex justify-between text-sm " >
170
+ < span class = "text-muted-foreground " > Total prize pool</ span >
171
+ < span class = "font-medium font-display tabular-nums " >
172
+ { Money . to_string! ( @ prize_pool ) }
173
+ </ span >
207
174
</ div >
208
- </ . card_content >
209
- </ . card >
175
+ < div class = "flex justify-between text-sm " >
176
+ < span class = "text-muted-foreground " > Total paid</ span >
177
+ < span class = "font-medium font-display tabular-nums " >
178
+ { Money . to_string! ( @ total_paid ) }
179
+ </ span >
180
+ </ div >
181
+ < div class = "flex justify-between text-sm " >
182
+ < span class = "text-muted-foreground " > Status</ span >
183
+ < span > { @ primary_claim . status |> to_string ( ) |> String . capitalize ( ) } </ span >
184
+ </ div >
185
+ < div class = "flex justify-between text-sm " >
186
+ < span class = "text-muted-foreground " > Submitted</ span >
187
+ < span > { Calendar . strftime ( @ primary_claim . inserted_at , "%B %d, %Y" ) } </ span >
188
+ </ div >
189
+ < div class = "flex justify-between text-sm " >
190
+ < span class = "text-muted-foreground " > Last updated</ span >
191
+ < span > { Calendar . strftime ( @ primary_claim . updated_at , "%B %d, %Y" ) } </ span >
192
+ </ div >
193
+ </ div >
194
+ </ . card_content >
195
+ </ . card >
210
196
211
- < . card >
212
- < . card_header >
197
+ < . card >
198
+ < . card_header >
199
+ < div class = "flex items-center justify-between " >
213
200
< . card_title >
214
- Sponsors
201
+ Authors
215
202
</ . card_title >
216
- </ . card_header >
217
- < . card_content >
218
- < div class = "divide-y divide-border " >
219
- <%= for sponsor <- @ sponsors do %>
220
- < div class = "flex items-center justify-between py-4 " >
203
+ < . button variant = "secondary " >
204
+ Split bounty
205
+ </ . button >
206
+ </ div >
207
+ </ . card_header >
208
+ < . card_content >
209
+ < div class = "space-y-4 " >
210
+ <%= for claim <- @ claims do %>
211
+ < div class = "flex justify-between text-sm " >
212
+ < span >
221
213
< div class = "flex items-center gap-4 " >
222
214
< . avatar >
223
- < . avatar_image src = { sponsor . sponsor . avatar_url } />
224
- < . avatar_fallback >
225
- { String . first ( sponsor . sponsor . name ) }
226
- </ . avatar_fallback >
215
+ < . avatar_image src = { claim . user . avatar_url } />
216
+ < . avatar_fallback > { String . first ( claim . user . name ) } </ . avatar_fallback >
227
217
</ . avatar >
228
218
< div >
229
- < p class = "font-medium " > { sponsor . sponsor . name } </ p >
230
- < p class = "text-sm text-muted-foreground " > @{ sponsor . sponsor . handle } </ p >
219
+ < p class = "font-medium " > { claim . user . name } </ p >
220
+ < p class = "text-sm text-muted-foreground " > @{ claim . user . handle } </ p >
231
221
</ div >
232
222
</ div >
233
- < div class = "text-right " >
234
- < div class = "text-sm font-medium " >
235
- <%= case sponsor . status do %>
236
- <% :overpaid -> %>
237
- < div class = "text-success " >
238
- < span class = "text-base font-semibold font-display tabular-nums " >
239
- { Money . to_string! ( Money . sub! ( sponsor . paid , sponsor . tipped ) ) }
240
- </ span >
241
- paid
242
- </ div >
243
- < div class = "text-success " >
244
- < span class = "text-base font-semibold font-display tabular-nums " >
245
- +{ Money . to_string! ( sponsor . tipped ) }
246
- </ span >
247
- tip!
248
- </ div >
249
- <% :paid - > %>
250
- < div class = "text-success " >
251
- < span class = "text-base font-semibold font-display tabular-nums " >
252
- { Money . to_string! ( sponsor . paid ) }
253
- </ span >
254
- paid
255
- </ div >
256
- <% :partial - > %>
257
- < div class = "text-success " >
258
- < span class = "text-base font-semibold font-display tabular-nums " >
259
- { Money . to_string! ( sponsor . paid ) }
260
- </ span >
261
- paid
262
- </ div >
263
- < div class = "text-muted-foreground " >
264
- < span class = "text-base font-semibold font-display tabular-nums " >
265
- { Money . to_string! ( Money . sub! ( sponsor . pledged , sponsor . paid ) ) }
266
- </ span >
267
- pending
268
- </ div >
269
- <% :pending - > %>
270
- < div class = "text-muted-foreground " >
271
- < span class = "text-base font-semibold font-display tabular-nums " >
272
- { Money . to_string! ( sponsor . pledged ) }
273
- </ span >
274
- pending
275
- </ div >
276
- <% :none - > %>
277
- < div class = "text-success " >
278
- < span class = "text-base font-semibold font-display tabular-nums " >
279
- { Money . to_string! ( sponsor . pledged ) }
280
- </ span >
281
- </ div >
282
- <% end %>
283
- </ div >
223
+ </ span >
224
+ < span class = "text-foreground font-medium " >
225
+ < span >
226
+ { Util . format_pct ( claim . group_share ) }
227
+ </ span >
228
+ </ span >
229
+ </ div >
230
+ <% end %>
231
+ </ div >
232
+ </ . card_content >
233
+ </ . card >
234
+
235
+ < . card >
236
+ < . card_header >
237
+ < . card_title >
238
+ Sponsors
239
+ </ . card_title >
240
+ </ . card_header >
241
+ < . card_content >
242
+ < div class = "divide-y divide-border " >
243
+ <%= for sponsor <- @ sponsors do %>
244
+ < div class = "flex items-center justify-between py-4 " >
245
+ < div class = "flex items-center gap-4 " >
246
+ < . avatar >
247
+ < . avatar_image src = { sponsor . sponsor . avatar_url } />
248
+ < . avatar_fallback >
249
+ { String . first ( sponsor . sponsor . name ) }
250
+ </ . avatar_fallback >
251
+ </ . avatar >
252
+ < div >
253
+ < p class = "font-medium " > { sponsor . sponsor . name } </ p >
254
+ < p class = "text-sm text-muted-foreground " > @{ sponsor . sponsor . handle } </ p >
284
255
</ div >
285
256
</ div >
286
- <% end %>
287
- </ div >
288
- </ . card_content >
289
- </ . card >
290
- </ div >
257
+ < div class = "text-right " >
258
+ < div class = "text-sm font-medium " >
259
+ <%= case sponsor . status do %>
260
+ <% :overpaid -> %>
261
+ < div class = "text-success " >
262
+ < span class = "text-base font-semibold font-display tabular-nums " >
263
+ { Money . to_string! ( Money . sub! ( sponsor . paid , sponsor . tipped ) ) }
264
+ </ span >
265
+ paid
266
+ </ div >
267
+ < div class = "text-success " >
268
+ < span class = "text-base font-semibold font-display tabular-nums " >
269
+ +{ Money . to_string! ( sponsor . tipped ) }
270
+ </ span >
271
+ tip!
272
+ </ div >
273
+ <% :paid - > %>
274
+ < div class = "text-success " >
275
+ < span class = "text-base font-semibold font-display tabular-nums " >
276
+ { Money . to_string! ( sponsor . paid ) }
277
+ </ span >
278
+ paid
279
+ </ div >
280
+ <% :partial - > %>
281
+ < div class = "text-success " >
282
+ < span class = "text-base font-semibold font-display tabular-nums " >
283
+ { Money . to_string! ( sponsor . paid ) }
284
+ </ span >
285
+ paid
286
+ </ div >
287
+ < div class = "text-muted-foreground " >
288
+ < span class = "text-base font-semibold font-display tabular-nums " >
289
+ { Money . to_string! ( Money . sub! ( sponsor . pledged , sponsor . paid ) ) }
290
+ </ span >
291
+ pending
292
+ </ div >
293
+ <% :pending - > %>
294
+ < div class = "text-muted-foreground " >
295
+ < span class = "text-base font-semibold font-display tabular-nums " >
296
+ { Money . to_string! ( sponsor . pledged ) }
297
+ </ span >
298
+ pending
299
+ </ div >
300
+ <% :none - > %>
301
+ < div class = "text-success " >
302
+ < span class = "text-base font-semibold font-display tabular-nums " >
303
+ { Money . to_string! ( sponsor . pledged ) }
304
+ </ span >
305
+ </ div >
306
+ <% end %>
307
+ </ div >
308
+ </ div >
309
+ </ div >
310
+ <% end %>
311
+ </ div >
312
+ </ . card_content >
313
+ </ . card >
291
314
</ div >
292
315
</ div >
293
316
</ div >
0 commit comments