@lockerverse/react 0.2.130-dev.1 → 0.2.131

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,28 +1,20 @@
1
1
  .lockerverse-public-events {
2
- --lockerverse-bg: #000;
2
+ --lockerverse-bg: #090a0b;
3
3
  --lockerverse-text: #f8f8f7;
4
4
  --lockerverse-muted: #a7aaac;
5
5
  --lockerverse-border: rgb(255 255 255 / 18%);
6
6
  --lockerverse-accent: #83baa1;
7
7
  --lockerverse-accent-contrast: #07130d;
8
- --lockerverse-surface: #101213;
9
- --lockerverse-popover: #1b1e1f;
10
8
  --lockerverse-font-family: ui-sans-serif, system-ui, sans-serif;
11
9
  box-sizing: border-box;
12
10
  width: 100%;
13
- padding: 0;
11
+ padding: clamp(8px, 3%, 28px);
14
12
  container-type: inline-size;
15
13
  font: 14px / 1.5 var(--lockerverse-font-family);
16
14
  color: var(--lockerverse-text);
17
15
  background: transparent;
18
16
  }
19
17
 
20
- .lockerverse-public-events__layout {
21
- display: grid;
22
- grid-template-columns: minmax(160px, 184px) minmax(0, 1fr);
23
- column-gap: 24px;
24
- }
25
-
26
18
  .lockerverse-public-events[data-lockerverse-theme="light"] {
27
19
  --lockerverse-bg: #fff;
28
20
  --lockerverse-text: #171919;
@@ -30,8 +22,6 @@
30
22
  --lockerverse-border: rgb(23 25 25 / 18%);
31
23
  --lockerverse-accent: #2d7052;
32
24
  --lockerverse-accent-contrast: #fff;
33
- --lockerverse-surface: #fff;
34
- --lockerverse-popover: #fff;
35
25
  }
36
26
 
37
27
  .lockerverse-public-events *,
@@ -42,13 +32,12 @@
42
32
 
43
33
  .lockerverse-public-events h2,
44
34
  .lockerverse-public-events h3,
45
- .lockerverse-public-events h3,
35
+ .lockerverse-public-events h4,
46
36
  .lockerverse-public-events p {
47
37
  margin: 0;
48
38
  }
49
39
 
50
40
  .lockerverse-public-events h2 {
51
- grid-column: 1 / -1;
52
41
  margin-bottom: 28px;
53
42
  font-size: 24px;
54
43
  font-weight: 600;
@@ -56,65 +45,43 @@
56
45
  text-wrap: balance;
57
46
  }
58
47
 
59
- .lockerverse-public-events h3 {
48
+ .lockerverse-public-events h4 {
49
+ margin-top: 5px;
60
50
  font-size: 20px;
61
51
  font-weight: 650;
62
52
  line-height: 1.25;
63
53
  overflow-wrap: anywhere;
64
54
  }
65
55
 
66
- .lockerverse-public-events button {
67
- min-height: 44px;
68
- padding: 8px 12px;
69
- margin-top: 12px;
70
- font: inherit;
71
- color: var(--lockerverse-text);
72
- cursor: pointer;
73
- background: transparent;
74
- border: 1px solid var(--lockerverse-border);
56
+ .lockerverse-public-events__content > h4:first-child {
57
+ margin-top: 0;
75
58
  }
76
59
 
77
60
  .lockerverse-public-events__tabs {
78
61
  display: flex;
79
- flex-direction: column;
80
- grid-column: 1;
81
- gap: 6px;
82
- align-self: start;
83
- }
84
-
85
- .lockerverse-public-events__layout > section {
86
- grid-column: 2;
87
- min-width: 0;
62
+ gap: 24px;
63
+ margin-bottom: 24px;
64
+ border-bottom: 1px solid var(--lockerverse-border);
88
65
  }
89
66
 
90
67
  .lockerverse-public-events .lockerverse-public-events__tab {
91
- display: flex;
92
- gap: 10px;
93
- align-items: center;
94
68
  min-height: 44px;
95
- padding: 9px 12px;
69
+ padding: 0 0 10px;
96
70
  margin: 0;
97
71
  font-weight: 600;
98
72
  color: var(--lockerverse-muted);
99
- text-align: left;
100
73
  border: 0;
101
- border-radius: 10px;
74
+ border-bottom: 2px solid transparent;
102
75
  }
103
76
 
104
77
  .lockerverse-public-events
105
78
  .lockerverse-public-events__tab[aria-pressed="true"] {
106
79
  color: var(--lockerverse-text);
107
- background: var(--lockerverse-surface);
108
- }
109
-
110
- .lockerverse-public-events
111
- .lockerverse-public-events__tab[aria-pressed="true"]
112
- svg {
113
- color: var(--lockerverse-accent);
80
+ border-bottom-color: var(--lockerverse-accent);
114
81
  }
115
82
 
116
83
  .lockerverse-public-events__group + .lockerverse-public-events__group {
117
- margin-top: 14px;
84
+ margin-top: 32px;
118
85
  }
119
86
 
120
87
  .lockerverse-public-events .lockerverse-public-events__group-title {
@@ -136,28 +103,24 @@
136
103
 
137
104
  .lockerverse-public-events__item {
138
105
  scroll-margin-top: 24px;
139
- background: var(--lockerverse-bg);
140
106
  border: 1px solid var(--lockerverse-border);
141
- border-radius: 10px;
142
- }
143
-
144
- .lockerverse-public-events__item:has(.lockerverse-public-events__share-menu) {
145
- position: relative;
146
- z-index: 2;
107
+ border-radius: 12px;
147
108
  }
148
109
 
149
110
  .lockerverse-public-events__row {
150
- position: relative;
151
111
  display: grid;
152
- grid-template-columns: 154px minmax(0, 1fr) max-content;
112
+ grid-template-columns: 76px minmax(0, 1fr) auto;
153
113
  gap: 16px;
154
114
  align-items: start;
155
115
  padding: 14px;
156
116
  }
157
117
 
118
+ .lockerverse-public-events__row--with-image {
119
+ grid-template-columns: 154px minmax(0, 1fr) auto;
120
+ }
121
+
158
122
  .lockerverse-public-events__image {
159
123
  display: block;
160
- grid-row: 1;
161
124
  width: 100%;
162
125
  height: 124px;
163
126
  object-fit: cover;
@@ -167,11 +130,10 @@
167
130
  .lockerverse-public-events__date {
168
131
  display: flex;
169
132
  flex-direction: column;
170
- grid-row: 1;
171
133
  align-items: center;
172
134
  justify-content: center;
173
- width: 100%;
174
- height: 124px;
135
+ width: 76px;
136
+ height: 76px;
175
137
  line-height: 1;
176
138
  border: 1px solid var(--lockerverse-border);
177
139
  border-radius: 7px;
@@ -202,51 +164,37 @@
202
164
  .lockerverse-public-events__content {
203
165
  display: flex;
204
166
  flex-direction: column;
205
- grid-column: 2;
206
167
  align-items: flex-start;
207
168
  min-width: 0;
208
169
  }
209
170
 
210
- .lockerverse-public-events__heading {
211
- width: 100%;
212
- }
213
-
214
- .lockerverse-public-events__heading:has(.lockerverse-public-events__live) {
215
- padding-right: 24px;
216
- }
217
-
218
- .lockerverse-public-events .lockerverse-public-events__schedule {
219
- margin-top: 5px;
220
- font-size: 14px;
221
- line-height: 1.5;
222
- color: var(--lockerverse-muted);
223
- }
224
-
225
- .lockerverse-public-events__live {
226
- position: absolute;
227
- top: 14px;
228
- right: 14px;
229
- padding: 2px 7px;
171
+ .lockerverse-public-events__meta {
172
+ display: flex;
173
+ flex-wrap: wrap;
174
+ gap: 8px;
175
+ align-items: center;
230
176
  font-size: 12px;
231
177
  font-weight: 700;
232
- color: var(--lockerverse-accent-contrast);
178
+ color: var(--lockerverse-accent);
233
179
  text-transform: uppercase;
234
180
  letter-spacing: 0.04em;
181
+ }
182
+
183
+ .lockerverse-public-events__live {
184
+ padding: 2px 7px;
185
+ color: var(--lockerverse-bg);
235
186
  background: var(--lockerverse-accent);
236
187
  border-radius: 999px;
237
188
  }
238
189
 
190
+ .lockerverse-public-events .lockerverse-public-events__time,
239
191
  .lockerverse-public-events .lockerverse-public-events__place {
240
- margin-top: 6px;
241
- font-size: 14px;
192
+ margin-top: 5px;
242
193
  color: var(--lockerverse-muted);
243
194
  }
244
195
 
245
196
  .lockerverse-public-events .lockerverse-public-events__description {
246
197
  margin-top: 10px;
247
- font-size: 14px;
248
- line-height: 1.5;
249
- color: var(--lockerverse-text);
250
198
  overflow-wrap: anywhere;
251
199
  white-space: pre-line;
252
200
  }
@@ -269,15 +217,11 @@
269
217
  }
270
218
 
271
219
  .lockerverse-public-events__actions {
272
- position: relative;
273
220
  display: flex;
274
- grid-row: 1;
275
- grid-column: 3;
276
- gap: 8px;
277
- align-items: center;
278
- align-self: end;
279
- justify-content: flex-end;
280
- min-width: 0;
221
+ flex-direction: column;
222
+ gap: 6px;
223
+ align-items: stretch;
224
+ min-width: 125px;
281
225
  }
282
226
 
283
227
  .lockerverse-public-events .lockerverse-public-events__link {
@@ -285,8 +229,8 @@
285
229
  gap: 8px;
286
230
  align-items: center;
287
231
  justify-content: center;
288
- min-height: 34px;
289
- padding: 6px 12px;
232
+ min-height: 44px;
233
+ padding: 8px 14px;
290
234
  margin: 0;
291
235
  font-weight: 600;
292
236
  color: var(--lockerverse-accent-contrast);
@@ -302,87 +246,50 @@
302
246
 
303
247
  .lockerverse-public-events .lockerverse-public-events__share {
304
248
  display: inline-flex;
249
+ gap: 8px;
305
250
  align-items: center;
306
251
  justify-content: center;
307
- min-width: 44px;
308
252
  min-height: 44px;
309
- padding: 0;
253
+ padding: 8px 10px;
310
254
  margin: 0;
255
+ font-weight: 600;
311
256
  color: var(--lockerverse-muted);
312
- border: 0;
313
- border-radius: 6px;
314
- }
315
-
316
- .lockerverse-public-events .lockerverse-public-events__share:hover {
317
- color: var(--lockerverse-accent);
257
+ border: 1px solid transparent;
258
+ border-radius: 8px;
318
259
  }
319
260
 
320
- .lockerverse-public-events
321
- .lockerverse-public-events__share[data-copied="true"] {
322
- color: var(--lockerverse-accent);
323
- }
261
+ @container (max-width: 700px) {
262
+ .lockerverse-public-events__row,
263
+ .lockerverse-public-events__row--with-image {
264
+ grid-template-columns: 76px minmax(0, 1fr);
265
+ }
324
266
 
325
- .lockerverse-public-events__share-menu {
326
- position: absolute;
327
- top: calc(100% + 6px);
328
- right: 0;
329
- z-index: 3;
330
- display: flex;
331
- flex-wrap: wrap;
332
- gap: 2px;
333
- align-items: center;
334
- min-inline-size: 0;
335
- width: max-content;
336
- max-width: min(300px, 80vw);
337
- padding: 6px;
338
- margin: 0;
339
- background: var(--lockerverse-popover);
340
- border: 1px solid var(--lockerverse-border);
341
- border-radius: 8px;
342
- box-shadow: 0 8px 24px rgb(0 0 0 / 18%);
343
- }
267
+ .lockerverse-public-events__row--with-image {
268
+ grid-template-columns: 112px minmax(0, 1fr);
269
+ }
344
270
 
345
- .lockerverse-public-events__share-menu[data-above="true"] {
346
- top: auto;
347
- bottom: calc(100% + 6px);
348
- }
271
+ .lockerverse-public-events__image {
272
+ height: 112px;
273
+ }
349
274
 
350
- .lockerverse-public-events__visually-hidden {
351
- position: absolute;
352
- width: 1px;
353
- height: 1px;
354
- overflow: hidden;
355
- white-space: nowrap;
356
- clip: rect(0, 0, 0, 0);
275
+ .lockerverse-public-events__actions {
276
+ flex-direction: row;
277
+ flex-wrap: wrap;
278
+ grid-column: 2;
279
+ min-width: 0;
280
+ }
357
281
  }
358
282
 
359
- .lockerverse-public-events .lockerverse-public-events__share-menu button,
360
- .lockerverse-public-events .lockerverse-public-events__share-menu a {
361
- display: inline-flex;
362
- align-items: center;
363
- justify-content: center;
364
- width: 38px;
365
- min-height: 38px;
366
- padding: 0;
367
- margin: 0;
368
- font-size: 18px;
283
+ .lockerverse-public-events .lockerverse-public-events__share:hover {
369
284
  color: var(--lockerverse-text);
370
- text-decoration: none;
371
- border: 0;
372
- border-radius: 6px;
373
- }
374
-
375
- .lockerverse-public-events .lockerverse-public-events__share-menu button:hover,
376
- .lockerverse-public-events .lockerverse-public-events__share-menu a:hover {
377
- color: var(--lockerverse-accent);
378
- background: var(--lockerverse-surface);
285
+ border-color: var(--lockerverse-border);
379
286
  }
380
287
 
381
288
  .lockerverse-public-events__copy-link {
382
289
  display: grid;
383
290
  gap: 5px;
384
291
  width: 100%;
385
- margin-top: 6px;
292
+ margin-top: 12px;
386
293
  font-size: 12px;
387
294
  color: var(--lockerverse-muted);
388
295
  }
@@ -403,6 +310,17 @@
403
310
  outline-offset: 4px;
404
311
  }
405
312
 
313
+ .lockerverse-public-events button {
314
+ min-height: 44px;
315
+ padding: 8px 12px;
316
+ margin-top: 12px;
317
+ font: inherit;
318
+ color: var(--lockerverse-text);
319
+ cursor: pointer;
320
+ background: transparent;
321
+ border: 1px solid var(--lockerverse-border);
322
+ }
323
+
406
324
  .lockerverse-public-events__empty {
407
325
  padding: 24px 0;
408
326
  color: var(--lockerverse-muted);
@@ -414,95 +332,33 @@
414
332
  border-radius: 8px;
415
333
  }
416
334
 
417
- @container (max-width: 760px) {
418
- .lockerverse-public-events__layout {
419
- grid-template-columns: minmax(0, 1fr);
420
- row-gap: 16px;
421
- }
422
-
423
- .lockerverse-public-events__tabs,
424
- .lockerverse-public-events__layout > section {
425
- grid-column: 1;
426
- }
427
-
428
- .lockerverse-public-events__tabs {
429
- flex-direction: row;
430
- flex-wrap: wrap;
431
- gap: 4px;
432
- border-bottom: 1px solid var(--lockerverse-border);
433
- }
434
-
435
- .lockerverse-public-events .lockerverse-public-events__tab {
436
- padding: 8px 10px;
437
- border-radius: 8px 8px 0 0;
438
- }
439
- }
440
-
441
- @container (max-width: 540px) {
335
+ @container (max-width: 500px) {
442
336
  .lockerverse-public-events__row {
443
- grid-template-columns: 96px minmax(0, 1fr);
444
- gap: 8px 12px;
337
+ grid-template-columns: 72px minmax(0, 1fr);
338
+ gap: 12px;
445
339
  padding: 12px;
446
340
  }
447
341
 
448
- .lockerverse-public-events__image,
449
- .lockerverse-public-events__date {
450
- align-self: start;
451
- width: 96px;
452
- height: 96px;
453
- }
454
-
455
- .lockerverse-public-events h3 {
456
- font-size: 18px;
457
- }
458
-
459
- .lockerverse-public-events__heading:has(.lockerverse-public-events__live) {
460
- padding-right: 84px;
461
- }
462
-
463
- .lockerverse-public-events__live {
464
- top: 12px;
465
- right: 12px;
466
- }
467
-
468
- .lockerverse-public-events__image,
469
- .lockerverse-public-events__date {
470
- grid-row: 1 / span 2;
471
- }
472
-
473
- .lockerverse-public-events__actions {
474
- grid-row: 2;
475
- grid-column: 2;
476
- }
477
-
478
- .lockerverse-public-events .lockerverse-public-events__schedule,
479
- .lockerverse-public-events .lockerverse-public-events__description {
480
- font-size: 13px;
481
- }
482
- }
483
-
484
- @container (max-width: 320px) {
485
- .lockerverse-public-events__row {
342
+ .lockerverse-public-events__row--with-image {
486
343
  grid-template-columns: minmax(0, 1fr);
487
344
  }
488
345
 
489
346
  .lockerverse-public-events__image {
490
- grid-row: 1;
491
- width: 100%;
492
347
  height: auto;
493
348
  aspect-ratio: 16 / 9;
494
349
  }
495
350
 
496
351
  .lockerverse-public-events__date {
497
- grid-row: 1;
352
+ width: 72px;
353
+ height: 72px;
498
354
  }
499
355
 
500
- .lockerverse-public-events__content,
501
- .lockerverse-public-events__actions {
502
- grid-column: 1;
356
+ .lockerverse-public-events__day {
357
+ font-size: 27px;
503
358
  }
504
359
 
505
- .lockerverse-public-events__actions {
506
- grid-row: 3;
360
+ .lockerverse-public-events__row--with-image
361
+ .lockerverse-public-events__actions {
362
+ grid-column: 1;
507
363
  }
508
364
  }
@@ -1 +1 @@
1
- {"version":3,"file":"public-events.d.ts","names":[],"sources":["../src/use-lockerverse-public-events.ts","../src/lockerverse-public-events.tsx"],"mappings":";;;KAUY;EACV,QAAQ;EACR,QAAQ;EACR;EACA,OAAO;EACP;;;iBAIc,2BACd,SAAS,uCACR;;;KCNS;EACV,QAAQ;;EAER;EACA;EACA;;EAEA;EACA,QAAQ;EACR,QAAQ;EACR;;;iBAqXc,0BACd,QACA,OACA,aACA,cACA,UACA,OACA,OACA,aACC,+CAA4B,IAAA"}
1
+ {"version":3,"file":"public-events.d.ts","names":[],"sources":["../src/use-lockerverse-public-events.ts","../src/lockerverse-public-events.tsx"],"mappings":";;;KAUY;EACV,QAAQ;EACR,QAAQ;EACR;EACA,OAAO;EACP;;;iBAIc,2BACd,SAAS,uCACR;;;KCdS;EACV,QAAQ;;EAER;EACA;EACA;;EAEA;EACA,QAAQ;EACR,QAAQ;EACR;;;iBA8Pc,0BACd,QACA,OACA,aACA,cACA,UACA,OACA,OACA,aACC,+CAA4B,IAAA"}
@@ -1,2 +1,2 @@
1
- import{t as e}from"./immutable-resource-identity.js";import{t}from"./accent-contrast.js";import{CalendarDays as n,CalendarX2 as r,Check as i,Copy as a,Facebook as o,Forward as s,Mail as c}from"lucide-react";import{useCallback as l,useEffect as u,useId as d,useRef as f,useState as p}from"react";import{Fragment as m,jsx as h,jsxs as g}from"react/jsx-runtime";import{createLockerversePublicEventsClient as _}from"@lockerverse/sdk/public-events";function v(e,t){return new Intl.DateTimeFormat(`en-US`,{day:`numeric`,month:`short`,timeZone:t,year:`numeric`}).format(new Date(e))}function y(e,t){return new Intl.DateTimeFormat(`en-US`,{hour:`numeric`,minute:`2-digit`,timeZone:t,timeZoneName:`short`}).format(new Date(e))}function b(e){if(!e)return null;try{let t=new URL(e);return t.protocol===`https:`||t.protocol===`http:`?t.toString():null}catch{return null}}function x(e,t){let n=b(e.link);if(n)return n;let r=new URL(window.location.href);return t?r.searchParams.set(`lockerverseEvents`,`past`):r.searchParams.delete(`lockerverseEvents`),r.searchParams.delete(`lockerverseEventOffset`),r.hash=`event-${e.id}`,r.toString()}function S(e){let n=e?.[`--lockerverse-accent`];if(!n||e?.[`--lockerverse-accent-contrast`]!==void 0)return e;let r=t(n);return r?{...e,"--lockerverse-accent-contrast":r}:e}function C(e){let t=document.createElement(`textarea`);t.value=e,t.setAttribute(`readonly`,``),t.style.position=`fixed`,t.style.opacity=`0`,document.body.appendChild(t);try{return t.select(),document.execCommand(`copy`)}catch{return!1}finally{t.remove()}}function w({item:e,past:t}){let[n,r]=p(!1),[l,d]=p(null),[m,_]=p(null),[v,y]=p(!1),S=f(null),w=f(null),T=b(e.link),E=e=>e instanceof Node&&S.current?.contains(e);u(()=>{if(!m)return;let e=e=>{E(e.target)||_(null)},t=e=>{e.key===`Escape`&&(_(null),S.current?.contains(document.activeElement)&&w.current?.focus())},n=e=>{E(e.target)||_(null)};return document.addEventListener(`pointerdown`,e),document.addEventListener(`keydown`,t),document.addEventListener(`focusin`,n),()=>{document.removeEventListener(`pointerdown`,e),document.removeEventListener(`keydown`,t),document.removeEventListener(`focusin`,n)}},[m]),u(()=>{if(!n)return;let e=window.setTimeout(()=>r(!1),2200);return()=>window.clearTimeout(e)},[n]);async function D(){if(m)try{await navigator.clipboard.writeText(m),r(!0),_(null),w.current?.focus()}catch{C(m)?(r(!0),_(null),w.current?.focus()):d(m)}}return g(`div`,{className:`lockerverse-public-events__actions`,ref:S,children:[T?g(`a`,{className:`lockerverse-public-events__link`,href:T,rel:`noopener noreferrer`,target:`_blank`,children:[`View event `,h(`span`,{"aria-hidden":`true`,children:`↗`})]}):null,h(`button`,{"aria-expanded":m!==null,"aria-label":`Share ${e.name}`,className:`lockerverse-public-events__share`,"data-copied":n,onClick:()=>{!m&&w.current&&y(window.innerHeight-w.current.getBoundingClientRect().bottom<72),_(m?null:x(e,t)),r(!1),d(null)},ref:w,title:`Share ${e.name}`,type:`button`,children:n?h(i,{"aria-hidden":`true`,size:22,strokeWidth:2}):h(s,{"aria-hidden":`true`,size:22,strokeWidth:1.9})}),n?h(`span`,{className:`lockerverse-public-events__visually-hidden`,role:`status`,children:`Link copied`}):null,m?g(`fieldset`,{className:`lockerverse-public-events__share-menu`,"data-above":v,children:[g(`legend`,{className:`lockerverse-public-events__visually-hidden`,children:[`Share `,e.name]}),h(`button`,{"aria-label":`Copy event link`,onClick:D,title:`Copy link`,type:`button`,children:h(a,{"aria-hidden":`true`,size:18})}),h(`a`,{"aria-label":`Share by email`,href:`mailto:?subject=${encodeURIComponent(e.name)}&body=${encodeURIComponent(m)}`,title:`Email`,children:h(c,{"aria-hidden":`true`,size:18})}),h(`a`,{"aria-label":`Share on Facebook`,href:`https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(m)}`,rel:`noopener noreferrer`,target:`_blank`,title:`Facebook`,children:h(o,{"aria-hidden":`true`,size:18})}),h(`a`,{"aria-label":`Share on X`,href:`https://twitter.com/intent/tweet?url=${encodeURIComponent(m)}&text=${encodeURIComponent(e.name)}`,rel:`noopener noreferrer`,target:`_blank`,title:`X`,children:h(`span`,{children:`𝕏`})}),l?g(`label`,{className:`lockerverse-public-events__copy-link`,children:[`Select and copy this event link`,h(`input`,{autoFocus:!0,onFocus:e=>e.currentTarget.select(),readOnly:!0,value:l})]}):null]}):null]})}function T({item:e,timeZone:t,active:n,past:r=!1}){let[i,a]=p(!1),o=new Date(e.startAt),s=new Intl.DateTimeFormat(`en-US`,{month:`short`,timeZone:t}).format(o),c=new Intl.DateTimeFormat(`en-US`,{day:`numeric`,timeZone:t}).format(o),l=new Intl.DateTimeFormat(`en-US`,{timeZone:t,year:`numeric`}).format(o),u=v(e.startAt,t),d=u===v(e.endAt,t)?y(e.endAt,t):`${v(e.endAt,t)} at ${y(e.endAt,t)}`,f=b(e.imageUrl),_=(e.description?.length??0)>130;return h(`li`,{className:`lockerverse-public-events__item`,id:`event-${e.id}`,children:g(`article`,{className:`lockerverse-public-events__row`,children:[f?h(`img`,{alt:``,className:`lockerverse-public-events__image`,height:124,loading:`lazy`,src:f,width:154}):g(`time`,{className:`lockerverse-public-events__date`,dateTime:e.startAt,children:[h(`span`,{className:`lockerverse-public-events__month`,children:s}),h(`span`,{className:`lockerverse-public-events__day`,children:c}),h(`span`,{className:`lockerverse-public-events__year`,children:l})]}),g(`div`,{className:`lockerverse-public-events__content`,children:[g(`div`,{className:`lockerverse-public-events__heading`,children:[h(`h3`,{children:e.name}),n?h(`span`,{className:`lockerverse-public-events__live`,children:`Live now`}):null]}),g(`p`,{className:`lockerverse-public-events__schedule`,children:[f?g(m,{children:[h(`time`,{dateTime:e.startAt,children:u}),h(`span`,{"aria-hidden":`true`,children:` · `})]}):null,h(`time`,{dateTime:e.startAt,children:y(e.startAt,t)}),h(`span`,{"aria-hidden":`true`,children:` — `}),h(`time`,{dateTime:e.endAt,children:d})]}),e.location?h(`p`,{className:`lockerverse-public-events__place`,children:e.location}):null,e.description?g(m,{children:[h(`p`,{className:[`lockerverse-public-events__description`,_&&!i?`lockerverse-public-events__description--clamped`:``].filter(Boolean).join(` `),children:e.description}),_?h(`button`,{"aria-expanded":i,className:`lockerverse-public-events__more`,onClick:()=>a(!i),type:`button`,children:i?`Show less`:`Read more`}):null]}):null]}),h(w,{item:e,past:r})]})})}function E({events:e,title:t=`Events`,showHeading:i=!0,emptyMessage:a=`No events yet.`,timeZone:o=`America/New_York`,theme:s=`dark`,style:c,className:f}){let[m,_]=p(()=>Date.now()),[v,y]=p(`current`),[b,x]=p([]),[C,w]=p(0),[E,D]=p(!1),[O,k]=p(!1),[A,j]=p(!1),[M,N]=p(null),[P,F]=p(null),I=d(),L=l(async(t,n=!1)=>{j(!0),N(null);try{let r=await e.client.listPast({offset:t});x(e=>n?r.events:[...e,...r.events]),w(t+r.events.length),D(r.hasMore),k(!0)}catch(e){N(e instanceof Error?e.message:`Unable to load past events.`)}finally{j(!1)}},[e.client]);u(()=>{let e=window.setInterval(()=>_(Date.now()),6e4);return()=>window.clearInterval(e)},[]),u(()=>{let e=new URL(window.location.href);e.searchParams.get(`lockerverseEvents`)===`past`&&(y(`past`),F(e.hash.slice(1)),L(0,!0))},[L]),u(()=>{let e=window.location.hash.slice(1);if(!e.startsWith(`event-`))return;if(v===`current`){document.getElementById(e)?.scrollIntoView({block:`center`});return}if(!P||A||!O)return;let t=document.getElementById(P);t?(t.scrollIntoView({block:`center`}),F(null)):E?L(C):F(null)},[e.events,L,E,O,A,C,P,v]);function R(){y(`past`),!(O||A)&&L(0,!0)}let z=e.events||[],B=z.filter(e=>new Date(e.startAt).getTime()<=m&&new Date(e.endAt).getTime()>m),V=z.filter(e=>new Date(e.startAt).getTime()>m);return h(`section`,{"aria-busy":v===`past`?A:e.loading,"aria-label":t,className:[`lockerverse-public-events`,f].filter(Boolean).join(` `),"data-lockerverse-theme":s,style:S(c),children:g(`div`,{className:`lockerverse-public-events__layout`,children:[i?h(`h2`,{children:t}):null,g(`nav`,{"aria-label":`Event views`,className:`lockerverse-public-events__tabs`,children:[g(`button`,{"aria-controls":`${I}-current-panel`,"aria-pressed":v===`current`,className:`lockerverse-public-events__tab`,id:`${I}-current-tab`,onClick:()=>y(`current`),type:`button`,children:[h(n,{"aria-hidden":`true`,size:18}),`Upcoming Events`]}),g(`button`,{"aria-controls":`${I}-past-panel`,"aria-pressed":v===`past`,className:`lockerverse-public-events__tab`,id:`${I}-past-tab`,onClick:R,type:`button`,children:[h(r,{"aria-hidden":`true`,size:18}),`Past Events`]})]}),g(`section`,{"aria-labelledby":`${I}-current-tab`,hidden:v!==`current`,id:`${I}-current-panel`,children:[e.loading&&!e.events?h(`p`,{role:`status`,children:`Loading events…`}):null,e.error?g(`div`,{role:`alert`,children:[h(`p`,{children:e.error.message}),h(`button`,{onClick:e.refresh,type:`button`,children:`Try again`})]}):null,e.events&&B.length===0&&V.length===0?h(`p`,{className:`lockerverse-public-events__empty`,children:a}):null,B.length>0?h(`div`,{className:`lockerverse-public-events__group`,children:h(`ol`,{className:`lockerverse-public-events__list`,children:B.map(e=>h(T,{active:!0,item:e,timeZone:o},e.id))})}):null,V.length>0?h(`div`,{className:`lockerverse-public-events__group`,children:h(`ol`,{className:`lockerverse-public-events__list`,children:V.map(e=>h(T,{active:!1,item:e,timeZone:o},e.id))})}):null]}),g(`section`,{"aria-labelledby":`${I}-past-tab`,hidden:v!==`past`,id:`${I}-past-panel`,children:[M?g(`div`,{role:`alert`,children:[h(`p`,{children:M}),h(`button`,{onClick:()=>L(O?C:0,!O),type:`button`,children:`Try again`})]}):null,A&&!O?h(`p`,{role:`status`,children:`Loading past events…`}):null,O&&b.length===0?h(`p`,{className:`lockerverse-public-events__empty`,children:`No past events yet.`}):null,b.length>0?h(`ol`,{className:`lockerverse-public-events__list`,children:b.map(e=>h(T,{active:!1,item:e,past:!0,timeZone:o},e.id))}):null,E?h(`button`,{className:`lockerverse-public-events__load-more`,disabled:A,onClick:()=>L(C),type:`button`,children:A?`Loading…`:`Load more past events`}):null]})]})})}function D(t){e(`public events`,{apiBaseUrl:t.apiBaseUrl,communitySlug:t.communitySlug,environment:t.environment,slug:``});let n=f(t.onError);n.current=t.onError;let[r]=p(()=>_({...t,onError:e=>n.current?.(e)})),[i,a]=p(0),[o,s]=p({error:null,events:null,loading:!0});u(()=>{let e=!0;return r.list().then(t=>{e&&s({error:null,events:t,loading:!1})},t=>{e&&s(e=>({...e,error:t,loading:!1}))}),()=>{e=!1}},[r,i]);let c=l(()=>{s(e=>({...e,error:null,loading:!0})),a(e=>e+1)},[]);return{...o,client:r,refresh:c}}export{E as LockerversePublicEvents,D as useLockerversePublicEvents};
1
+ import{t as e}from"./immutable-resource-identity.js";import{t}from"./accent-contrast.js";import{Share2 as n}from"lucide-react";import{useCallback as r,useEffect as i,useId as a,useRef as o,useState as s}from"react";import{Fragment as c,jsx as l,jsxs as u}from"react/jsx-runtime";import{createLockerversePublicEventsClient as d}from"@lockerverse/sdk/public-events";function f(e,t){return new Intl.DateTimeFormat(`en-US`,{day:`numeric`,month:`short`,timeZone:t,year:`numeric`}).format(new Date(e))}function p(e,t){return new Intl.DateTimeFormat(`en-US`,{hour:`numeric`,minute:`2-digit`,timeZone:t,timeZoneName:`short`}).format(new Date(e))}function m(e){if(!e)return null;try{let t=new URL(e);return t.protocol===`https:`||t.protocol===`http:`?t.toString():null}catch{return null}}function h(e,t){let n=m(e.link);if(n)return n;let r=new URL(window.location.href);return t?r.searchParams.set(`lockerverseEvents`,`past`):r.searchParams.delete(`lockerverseEvents`),r.searchParams.delete(`lockerverseEventOffset`),r.hash=`event-${e.id}`,r.toString()}function g(e){let n=e?.[`--lockerverse-accent`];if(!n||e?.[`--lockerverse-accent-contrast`]!==void 0)return e;let r=t(n);return r?{...e,"--lockerverse-accent-contrast":r}:e}function _({active:e,imageUrl:t,startAt:n,startDateLabel:r}){return t||e?u(`div`,{className:`lockerverse-public-events__meta`,children:[t?l(`time`,{dateTime:n,children:r}):null,e?l(`span`,{className:`lockerverse-public-events__live`,children:`Live now`}):null]}):null}function v({item:e,timeZone:t,active:r,past:i=!1}){let[a,o]=s(!1),[d,g]=s(!1),[v,y]=s(null),b=new Date(e.startAt),x=new Intl.DateTimeFormat(`en-US`,{month:`short`,timeZone:t}).format(b),S=new Intl.DateTimeFormat(`en-US`,{day:`numeric`,timeZone:t}).format(b),C=new Intl.DateTimeFormat(`en-US`,{timeZone:t,year:`numeric`}).format(b),w=f(e.startAt,t),T=w===f(e.endAt,t)?p(e.endAt,t):`${f(e.endAt,t)} at ${p(e.endAt,t)}`,E=m(e.link),D=m(e.imageUrl),O=(e.description?.length??0)>130;async function k(){let t=h(e,i);if(navigator.share)try{await navigator.share({title:e.name,url:t});return}catch(e){if(e instanceof DOMException&&e.name===`AbortError`)return}try{await navigator.clipboard.writeText(t),g(!0)}catch{y(t)}}return l(`li`,{className:`lockerverse-public-events__item`,id:`event-${e.id}`,children:u(`article`,{className:[`lockerverse-public-events__row`,D?`lockerverse-public-events__row--with-image`:``].filter(Boolean).join(` `),children:[D?l(`img`,{alt:``,className:`lockerverse-public-events__image`,height:124,loading:`lazy`,src:D,width:154}):u(`time`,{className:`lockerverse-public-events__date`,dateTime:e.startAt,children:[l(`span`,{className:`lockerverse-public-events__month`,children:x}),l(`span`,{className:`lockerverse-public-events__day`,children:S}),l(`span`,{className:`lockerverse-public-events__year`,children:C})]}),u(`div`,{className:`lockerverse-public-events__content`,children:[l(_,{active:r,imageUrl:D,startAt:e.startAt,startDateLabel:w}),l(`h4`,{children:e.name}),u(`p`,{className:`lockerverse-public-events__time`,children:[l(`time`,{dateTime:e.startAt,children:p(e.startAt,t)}),l(`span`,{"aria-hidden":`true`,children:` — `}),l(`time`,{dateTime:e.endAt,children:T})]}),e.location?l(`p`,{className:`lockerverse-public-events__place`,children:e.location}):null,e.description?u(c,{children:[l(`p`,{className:[`lockerverse-public-events__description`,O&&!a?`lockerverse-public-events__description--clamped`:``].filter(Boolean).join(` `),children:e.description}),O?l(`button`,{"aria-expanded":a,className:`lockerverse-public-events__more`,onClick:()=>o(!a),type:`button`,children:a?`Show less`:`Read more`}):null]}):null,v?u(`label`,{className:`lockerverse-public-events__copy-link`,children:[`Copy event link`,l(`input`,{onFocus:e=>e.currentTarget.select(),readOnly:!0,value:v})]}):null]}),u(`div`,{className:`lockerverse-public-events__actions`,children:[E?u(`a`,{className:`lockerverse-public-events__link`,href:E,rel:`noopener noreferrer`,target:`_blank`,children:[`View event `,l(`span`,{"aria-hidden":`true`,children:`↗`})]}):null,u(`button`,{"aria-label":`Share ${e.name}`,className:`lockerverse-public-events__share`,onClick:k,type:`button`,children:[l(n,{"aria-hidden":`true`,size:16,strokeWidth:1.8}),d?`Link copied`:`Share`]})]})]})})}function y({events:e,title:t=`Events`,showHeading:n=!0,emptyMessage:o=`No events yet.`,timeZone:c=`America/New_York`,theme:d=`dark`,style:f,className:p}){let[m,h]=s(()=>Date.now()),[_,y]=s(`current`),[b,x]=s([]),[S,C]=s(0),[w,T]=s(!1),[E,D]=s(!1),[O,k]=s(!1),[A,j]=s(null),[M,N]=s(null),P=a(),F=r(async(t,n=!1)=>{k(!0),j(null);try{let r=await e.client.listPast({offset:t});x(e=>n?r.events:[...e,...r.events]),C(t+r.events.length),T(r.hasMore),D(!0)}catch(e){j(e instanceof Error?e.message:`Unable to load past events.`)}finally{k(!1)}},[e.client]);i(()=>{let e=window.setInterval(()=>h(Date.now()),6e4);return()=>window.clearInterval(e)},[]),i(()=>{let e=new URL(window.location.href);e.searchParams.get(`lockerverseEvents`)===`past`&&(y(`past`),N(e.hash.slice(1)),F(0,!0))},[F]),i(()=>{let e=window.location.hash.slice(1);if(!e.startsWith(`event-`))return;if(_===`current`){document.getElementById(e)?.scrollIntoView({block:`center`});return}if(!M||O||!E)return;let t=document.getElementById(M);t?(t.scrollIntoView({block:`center`}),N(null)):w?F(S):N(null)},[e.events,F,w,E,O,S,M,_]);function I(){y(`past`),!(E||O)&&F(0,!0)}let L=e.events||[],R=L.filter(e=>new Date(e.startAt).getTime()<=m&&new Date(e.endAt).getTime()>m),z=L.filter(e=>new Date(e.startAt).getTime()>m);return u(`section`,{"aria-busy":_===`past`?O:e.loading,"aria-label":t,className:[`lockerverse-public-events`,p].filter(Boolean).join(` `),"data-lockerverse-theme":d,style:g(f),children:[n?l(`h2`,{children:t}):null,u(`nav`,{"aria-label":`Event views`,className:`lockerverse-public-events__tabs`,children:[l(`button`,{"aria-controls":`${P}-current-panel`,"aria-pressed":_===`current`,className:`lockerverse-public-events__tab`,id:`${P}-current-tab`,onClick:()=>y(`current`),type:`button`,children:`Upcoming Events`}),l(`button`,{"aria-controls":`${P}-past-panel`,"aria-pressed":_===`past`,className:`lockerverse-public-events__tab`,id:`${P}-past-tab`,onClick:I,type:`button`,children:`Past Events`})]}),u(`section`,{"aria-labelledby":`${P}-current-tab`,hidden:_!==`current`,id:`${P}-current-panel`,children:[e.loading&&!e.events?l(`p`,{role:`status`,children:`Loading events…`}):null,e.error?u(`div`,{role:`alert`,children:[l(`p`,{children:e.error.message}),l(`button`,{onClick:e.refresh,type:`button`,children:`Try again`})]}):null,e.events&&R.length===0&&z.length===0?l(`p`,{className:`lockerverse-public-events__empty`,children:o}):null,R.length>0?l(`div`,{className:`lockerverse-public-events__group`,children:l(`ol`,{className:`lockerverse-public-events__list`,children:R.map(e=>l(v,{active:!0,item:e,timeZone:c},e.id))})}):null,z.length>0?u(`div`,{className:`lockerverse-public-events__group`,children:[l(`h3`,{className:`lockerverse-public-events__group-title`,children:`Upcoming`}),l(`ol`,{className:`lockerverse-public-events__list`,children:z.map(e=>l(v,{active:!1,item:e,timeZone:c},e.id))})]}):null]}),u(`section`,{"aria-labelledby":`${P}-past-tab`,hidden:_!==`past`,id:`${P}-past-panel`,children:[A?u(`div`,{role:`alert`,children:[l(`p`,{children:A}),l(`button`,{onClick:()=>F(E?S:0,!E),type:`button`,children:`Try again`})]}):null,O&&!E?l(`p`,{role:`status`,children:`Loading past events…`}):null,E&&b.length===0?l(`p`,{className:`lockerverse-public-events__empty`,children:`No past events yet.`}):null,b.length>0?l(`ol`,{className:`lockerverse-public-events__list`,children:b.map(e=>l(v,{active:!1,item:e,past:!0,timeZone:c},e.id))}):null,w?l(`button`,{className:`lockerverse-public-events__load-more`,disabled:O,onClick:()=>F(S),type:`button`,children:O?`Loading…`:`Load more past events`}):null]})]})}function b(t){e(`public events`,{apiBaseUrl:t.apiBaseUrl,communitySlug:t.communitySlug,environment:t.environment,slug:``});let n=o(t.onError);n.current=t.onError;let[a]=s(()=>d({...t,onError:e=>n.current?.(e)})),[c,l]=s(0),[u,f]=s({error:null,events:null,loading:!0});i(()=>{let e=!0;return a.list().then(t=>{e&&f({error:null,events:t,loading:!1})},t=>{e&&f(e=>({...e,error:t,loading:!1}))}),()=>{e=!1}},[a,c]);let p=r(()=>{f(e=>({...e,error:null,loading:!0})),l(e=>e+1)},[]);return{...u,client:a,refresh:p}}export{y as LockerversePublicEvents,b as useLockerversePublicEvents};
2
2
  //# sourceMappingURL=public-events.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"public-events.js","names":[],"sources":["../src/lockerverse-public-events.tsx","../src/use-lockerverse-public-events.ts"],"sourcesContent":["import type { LockerversePublicEvent } from \"@lockerverse/sdk/public-events\";\nimport {\n CalendarDays,\n CalendarX2,\n Check,\n Copy,\n Facebook,\n Forward,\n Mail,\n} from \"lucide-react\";\nimport { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport { getAccentContrast } from \"./accent-contrast.ts\";\nimport type { LockerverseStyle, LockerverseTheme } from \"./theme.ts\";\nimport type { UseLockerversePublicEventsResult } from \"./use-lockerverse-public-events.ts\";\n\nexport type LockerversePublicEventsProps = {\n events: UseLockerversePublicEventsResult;\n /** The visible heading. Defaults to Events. */\n title?: string;\n showHeading?: boolean;\n emptyMessage?: string;\n /** Used to show dates and times. Defaults to America/New_York. */\n timeZone?: string;\n theme?: LockerverseTheme;\n style?: LockerverseStyle;\n className?: string;\n};\n\nfunction formatDate(value: string, timeZone: string) {\n return new Intl.DateTimeFormat(\"en-US\", {\n day: \"numeric\",\n month: \"short\",\n timeZone,\n year: \"numeric\",\n }).format(new Date(value));\n}\n\nfunction formatTime(value: string, timeZone: string) {\n return new Intl.DateTimeFormat(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n timeZone,\n timeZoneName: \"short\",\n }).format(new Date(value));\n}\n\nfunction getLink(value: string | null) {\n if (!value) {\n return null;\n }\n try {\n const url = new URL(value);\n return url.protocol === \"https:\" || url.protocol === \"http:\"\n ? url.toString()\n : null;\n } catch {\n return null;\n }\n}\n\nfunction getShareUrl(item: LockerversePublicEvent, past: boolean) {\n const link = getLink(item.link);\n if (link) {\n return link;\n }\n const url = new URL(window.location.href);\n if (past) {\n url.searchParams.set(\"lockerverseEvents\", \"past\");\n } else {\n url.searchParams.delete(\"lockerverseEvents\");\n }\n url.searchParams.delete(\"lockerverseEventOffset\");\n url.hash = `event-${item.id}`;\n return url.toString();\n}\n\nfunction withAccentContrast(style?: LockerverseStyle) {\n const accent = style?.[\"--lockerverse-accent\"];\n if (!accent || style?.[\"--lockerverse-accent-contrast\"] !== undefined) {\n return style;\n }\n const contrast = getAccentContrast(accent);\n return contrast\n ? { ...style, \"--lockerverse-accent-contrast\": contrast }\n : style;\n}\n\nfunction copyWithExecCommand(value: string) {\n const input = document.createElement(\"textarea\");\n input.value = value;\n input.setAttribute(\"readonly\", \"\");\n input.style.position = \"fixed\";\n input.style.opacity = \"0\";\n document.body.appendChild(input);\n try {\n input.select();\n return document.execCommand(\"copy\");\n } catch {\n return false;\n } finally {\n input.remove();\n }\n}\n\nfunction EventActions({\n item,\n past,\n}: {\n item: LockerversePublicEvent;\n past: boolean;\n}) {\n const [copied, setCopied] = useState(false);\n const [manualShareUrl, setManualShareUrl] = useState<string | null>(null);\n const [shareUrl, setShareUrl] = useState<string | null>(null);\n const [shareMenuAbove, setShareMenuAbove] = useState(false);\n const shareActionsRef = useRef<HTMLDivElement>(null);\n const shareTriggerRef = useRef<HTMLButtonElement>(null);\n const link = getLink(item.link);\n const isWithinShareActions = (target: EventTarget | null) =>\n target instanceof Node && shareActionsRef.current?.contains(target);\n\n useEffect(() => {\n if (!shareUrl) {\n return;\n }\n const closeOnOutsideClick = (event: PointerEvent) => {\n if (!isWithinShareActions(event.target)) {\n setShareUrl(null);\n }\n };\n const closeOnEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setShareUrl(null);\n if (shareActionsRef.current?.contains(document.activeElement)) {\n shareTriggerRef.current?.focus();\n }\n }\n };\n const closeOnFocusOutside = (event: FocusEvent) => {\n if (!isWithinShareActions(event.target)) {\n setShareUrl(null);\n }\n };\n document.addEventListener(\"pointerdown\", closeOnOutsideClick);\n document.addEventListener(\"keydown\", closeOnEscape);\n document.addEventListener(\"focusin\", closeOnFocusOutside);\n return () => {\n document.removeEventListener(\"pointerdown\", closeOnOutsideClick);\n document.removeEventListener(\"keydown\", closeOnEscape);\n document.removeEventListener(\"focusin\", closeOnFocusOutside);\n };\n }, [shareUrl]);\n\n useEffect(() => {\n if (!copied) {\n return;\n }\n const timeout = window.setTimeout(() => setCopied(false), 2200);\n return () => window.clearTimeout(timeout);\n }, [copied]);\n\n async function copyEventLink() {\n if (!shareUrl) {\n return;\n }\n try {\n await navigator.clipboard.writeText(shareUrl);\n setCopied(true);\n setShareUrl(null);\n shareTriggerRef.current?.focus();\n } catch {\n if (copyWithExecCommand(shareUrl)) {\n setCopied(true);\n setShareUrl(null);\n shareTriggerRef.current?.focus();\n } else {\n setManualShareUrl(shareUrl);\n }\n }\n }\n\n return (\n <div className=\"lockerverse-public-events__actions\" ref={shareActionsRef}>\n {link ? (\n <a\n className=\"lockerverse-public-events__link\"\n href={link}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n View event <span aria-hidden=\"true\">↗</span>\n </a>\n ) : null}\n <button\n aria-expanded={shareUrl !== null}\n aria-label={`Share ${item.name}`}\n className=\"lockerverse-public-events__share\"\n data-copied={copied}\n onClick={() => {\n if (!shareUrl && shareTriggerRef.current) {\n setShareMenuAbove(\n window.innerHeight -\n shareTriggerRef.current.getBoundingClientRect().bottom <\n 72\n );\n }\n setShareUrl(shareUrl ? null : getShareUrl(item, past));\n setCopied(false);\n setManualShareUrl(null);\n }}\n ref={shareTriggerRef}\n title={`Share ${item.name}`}\n type=\"button\"\n >\n {copied ? (\n <Check aria-hidden=\"true\" size={22} strokeWidth={2} />\n ) : (\n <Forward aria-hidden=\"true\" size={22} strokeWidth={1.9} />\n )}\n </button>\n {copied ? (\n <span\n className=\"lockerverse-public-events__visually-hidden\"\n role=\"status\"\n >\n Link copied\n </span>\n ) : null}\n {shareUrl ? (\n <fieldset\n className=\"lockerverse-public-events__share-menu\"\n data-above={shareMenuAbove}\n >\n <legend className=\"lockerverse-public-events__visually-hidden\">\n Share {item.name}\n </legend>\n <button\n aria-label=\"Copy event link\"\n onClick={copyEventLink}\n title=\"Copy link\"\n type=\"button\"\n >\n <Copy aria-hidden=\"true\" size={18} />\n </button>\n <a\n aria-label=\"Share by email\"\n href={`mailto:?subject=${encodeURIComponent(item.name)}&body=${encodeURIComponent(shareUrl)}`}\n title=\"Email\"\n >\n <Mail aria-hidden=\"true\" size={18} />\n </a>\n <a\n aria-label=\"Share on Facebook\"\n href={`https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(shareUrl)}`}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n title=\"Facebook\"\n >\n <Facebook aria-hidden=\"true\" size={18} />\n </a>\n <a\n aria-label=\"Share on X\"\n href={`https://twitter.com/intent/tweet?url=${encodeURIComponent(shareUrl)}&text=${encodeURIComponent(item.name)}`}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n title=\"X\"\n >\n <span>𝕏</span>\n </a>\n {manualShareUrl ? (\n <label className=\"lockerverse-public-events__copy-link\">\n Select and copy this event link\n <input\n autoFocus\n onFocus={(event) => event.currentTarget.select()}\n readOnly\n value={manualShareUrl}\n />\n </label>\n ) : null}\n </fieldset>\n ) : null}\n </div>\n );\n}\n\nfunction PublicEventRow({\n item,\n timeZone,\n active,\n past = false,\n}: {\n item: LockerversePublicEvent;\n timeZone: string;\n active: boolean;\n past?: boolean;\n}) {\n const [expanded, setExpanded] = useState(false);\n const start = new Date(item.startAt);\n const month = new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n timeZone,\n }).format(start);\n const day = new Intl.DateTimeFormat(\"en-US\", {\n day: \"numeric\",\n timeZone,\n }).format(start);\n const year = new Intl.DateTimeFormat(\"en-US\", {\n timeZone,\n year: \"numeric\",\n }).format(start);\n const startDateLabel = formatDate(item.startAt, timeZone);\n const sameDay = startDateLabel === formatDate(item.endAt, timeZone);\n const endLabel = sameDay\n ? formatTime(item.endAt, timeZone)\n : `${formatDate(item.endAt, timeZone)} at ${formatTime(item.endAt, timeZone)}`;\n const imageUrl = getLink(item.imageUrl);\n const canExpand = (item.description?.length ?? 0) > 130;\n\n return (\n <li className=\"lockerverse-public-events__item\" id={`event-${item.id}`}>\n <article className=\"lockerverse-public-events__row\">\n {imageUrl ? (\n <img\n alt=\"\"\n className=\"lockerverse-public-events__image\"\n height={124}\n loading=\"lazy\"\n src={imageUrl}\n width={154}\n />\n ) : (\n <time\n className=\"lockerverse-public-events__date\"\n dateTime={item.startAt}\n >\n <span className=\"lockerverse-public-events__month\">{month}</span>\n <span className=\"lockerverse-public-events__day\">{day}</span>\n <span className=\"lockerverse-public-events__year\">{year}</span>\n </time>\n )}\n <div className=\"lockerverse-public-events__content\">\n <div className=\"lockerverse-public-events__heading\">\n <h3>{item.name}</h3>\n {active ? (\n <span className=\"lockerverse-public-events__live\">Live now</span>\n ) : null}\n </div>\n <p className=\"lockerverse-public-events__schedule\">\n {imageUrl ? (\n <>\n <time dateTime={item.startAt}>{startDateLabel}</time>\n <span aria-hidden=\"true\"> · </span>\n </>\n ) : null}\n <time dateTime={item.startAt}>\n {formatTime(item.startAt, timeZone)}\n </time>\n <span aria-hidden=\"true\"> — </span>\n <time dateTime={item.endAt}>{endLabel}</time>\n </p>\n {item.location ? (\n <p className=\"lockerverse-public-events__place\">{item.location}</p>\n ) : null}\n {item.description ? (\n <>\n <p\n className={[\n \"lockerverse-public-events__description\",\n canExpand && !expanded\n ? \"lockerverse-public-events__description--clamped\"\n : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {item.description}\n </p>\n {canExpand ? (\n <button\n aria-expanded={expanded}\n className=\"lockerverse-public-events__more\"\n onClick={() => setExpanded(!expanded)}\n type=\"button\"\n >\n {expanded ? \"Show less\" : \"Read more\"}\n </button>\n ) : null}\n </>\n ) : null}\n </div>\n <EventActions item={item} past={past} />\n </article>\n </li>\n );\n}\n\n/** Optional public list that can be embedded in any React site. */\nexport function LockerversePublicEvents({\n events,\n title = \"Events\",\n showHeading = true,\n emptyMessage = \"No events yet.\",\n timeZone = \"America/New_York\",\n theme = \"dark\",\n style,\n className,\n}: LockerversePublicEventsProps) {\n const [now, setNow] = useState(() => Date.now());\n const [view, setView] = useState<\"current\" | \"past\">(\"current\");\n const [pastEvents, setPastEvents] = useState<LockerversePublicEvent[]>([]);\n const [pastOffset, setPastOffset] = useState(0);\n const [pastHasMore, setPastHasMore] = useState(false);\n const [pastLoaded, setPastLoaded] = useState(false);\n const [pastLoading, setPastLoading] = useState(false);\n const [pastError, setPastError] = useState<string | null>(null);\n const [pastTarget, setPastTarget] = useState<string | null>(null);\n const tabId = useId();\n\n const loadPast = useCallback(\n async (offset: number, reset = false) => {\n setPastLoading(true);\n setPastError(null);\n try {\n const page = await events.client.listPast({ offset });\n setPastEvents((current) =>\n reset ? page.events : [...current, ...page.events]\n );\n setPastOffset(offset + page.events.length);\n setPastHasMore(page.hasMore);\n setPastLoaded(true);\n } catch (error) {\n setPastError(\n error instanceof Error ? error.message : \"Unable to load past events.\"\n );\n } finally {\n setPastLoading(false);\n }\n },\n [events.client]\n );\n\n useEffect(() => {\n const interval = window.setInterval(() => setNow(Date.now()), 60_000);\n return () => window.clearInterval(interval);\n }, []);\n\n useEffect(() => {\n const url = new URL(window.location.href);\n if (url.searchParams.get(\"lockerverseEvents\") !== \"past\") {\n return;\n }\n setView(\"past\");\n setPastTarget(url.hash.slice(1));\n loadPast(0, true);\n }, [loadPast]);\n\n useEffect(() => {\n const hash = window.location.hash.slice(1);\n if (!hash.startsWith(\"event-\")) {\n return;\n }\n if (view === \"current\") {\n document.getElementById(hash)?.scrollIntoView({ block: \"center\" });\n return;\n }\n if (!pastTarget || pastLoading || !pastLoaded) {\n return;\n }\n const target = document.getElementById(pastTarget);\n if (target) {\n target.scrollIntoView({ block: \"center\" });\n setPastTarget(null);\n } else if (pastHasMore) {\n loadPast(pastOffset);\n } else {\n setPastTarget(null);\n }\n }, [\n events.events,\n loadPast,\n pastHasMore,\n pastLoaded,\n pastLoading,\n pastOffset,\n pastTarget,\n view,\n ]);\n\n function openPast() {\n setView(\"past\");\n if (pastLoaded || pastLoading) {\n return;\n }\n loadPast(0, true);\n }\n\n const availableEvents = events.events || [];\n const activeEvents = availableEvents.filter(\n (item) =>\n new Date(item.startAt).getTime() <= now &&\n new Date(item.endAt).getTime() > now\n );\n const upcomingEvents = availableEvents.filter(\n (item) => new Date(item.startAt).getTime() > now\n );\n\n return (\n <section\n aria-busy={view === \"past\" ? pastLoading : events.loading}\n aria-label={title}\n className={[\"lockerverse-public-events\", className]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-theme={theme}\n style={withAccentContrast(style)}\n >\n <div className=\"lockerverse-public-events__layout\">\n {showHeading ? <h2>{title}</h2> : null}\n <nav\n aria-label=\"Event views\"\n className=\"lockerverse-public-events__tabs\"\n >\n <button\n aria-controls={`${tabId}-current-panel`}\n aria-pressed={view === \"current\"}\n className=\"lockerverse-public-events__tab\"\n id={`${tabId}-current-tab`}\n onClick={() => setView(\"current\")}\n type=\"button\"\n >\n <CalendarDays aria-hidden=\"true\" size={18} />\n Upcoming Events\n </button>\n <button\n aria-controls={`${tabId}-past-panel`}\n aria-pressed={view === \"past\"}\n className=\"lockerverse-public-events__tab\"\n id={`${tabId}-past-tab`}\n onClick={openPast}\n type=\"button\"\n >\n <CalendarX2 aria-hidden=\"true\" size={18} />\n Past Events\n </button>\n </nav>\n <section\n aria-labelledby={`${tabId}-current-tab`}\n hidden={view !== \"current\"}\n id={`${tabId}-current-panel`}\n >\n {events.loading && !events.events ? (\n <p role=\"status\">Loading events…</p>\n ) : null}\n {events.error ? (\n <div role=\"alert\">\n <p>{events.error.message}</p>\n <button onClick={events.refresh} type=\"button\">\n Try again\n </button>\n </div>\n ) : null}\n {events.events &&\n activeEvents.length === 0 &&\n upcomingEvents.length === 0 ? (\n <p className=\"lockerverse-public-events__empty\">{emptyMessage}</p>\n ) : null}\n {activeEvents.length > 0 ? (\n <div className=\"lockerverse-public-events__group\">\n <ol className=\"lockerverse-public-events__list\">\n {activeEvents.map((item) => (\n <PublicEventRow\n active\n item={item}\n key={item.id}\n timeZone={timeZone}\n />\n ))}\n </ol>\n </div>\n ) : null}\n {upcomingEvents.length > 0 ? (\n <div className=\"lockerverse-public-events__group\">\n <ol className=\"lockerverse-public-events__list\">\n {upcomingEvents.map((item) => (\n <PublicEventRow\n active={false}\n item={item}\n key={item.id}\n timeZone={timeZone}\n />\n ))}\n </ol>\n </div>\n ) : null}\n </section>\n <section\n aria-labelledby={`${tabId}-past-tab`}\n hidden={view !== \"past\"}\n id={`${tabId}-past-panel`}\n >\n {pastError ? (\n <div role=\"alert\">\n <p>{pastError}</p>\n <button\n onClick={() =>\n loadPast(pastLoaded ? pastOffset : 0, !pastLoaded)\n }\n type=\"button\"\n >\n Try again\n </button>\n </div>\n ) : null}\n {pastLoading && !pastLoaded ? (\n <p role=\"status\">Loading past events…</p>\n ) : null}\n {pastLoaded && pastEvents.length === 0 ? (\n <p className=\"lockerverse-public-events__empty\">\n No past events yet.\n </p>\n ) : null}\n {pastEvents.length > 0 ? (\n <ol className=\"lockerverse-public-events__list\">\n {pastEvents.map((item) => (\n <PublicEventRow\n active={false}\n item={item}\n key={item.id}\n past\n timeZone={timeZone}\n />\n ))}\n </ol>\n ) : null}\n {pastHasMore ? (\n <button\n className=\"lockerverse-public-events__load-more\"\n disabled={pastLoading}\n onClick={() => loadPast(pastOffset)}\n type=\"button\"\n >\n {pastLoading ? \"Loading…\" : \"Load more past events\"}\n </button>\n ) : null}\n </section>\n </div>\n </section>\n );\n}\n","import {\n type CreateLockerversePublicEventsOptions,\n createLockerversePublicEventsClient,\n type LockerversePublicEvent,\n type LockerversePublicEventsClient,\n type LockerverseSdkError,\n} from \"@lockerverse/sdk/public-events\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useImmutableResourceIdentity } from \"./immutable-resource-identity.ts\";\n\nexport type UseLockerversePublicEventsResult = {\n client: LockerversePublicEventsClient;\n events: LockerversePublicEvent[] | null;\n loading: boolean;\n error: LockerverseSdkError | null;\n refresh: () => void;\n};\n\n/** Load the public events list for one community. */\nexport function useLockerversePublicEvents(\n options: CreateLockerversePublicEventsOptions\n): UseLockerversePublicEventsResult {\n useImmutableResourceIdentity(\"public events\", {\n apiBaseUrl: options.apiBaseUrl,\n communitySlug: options.communitySlug,\n environment: options.environment,\n slug: \"\",\n });\n const onErrorRef = useRef(options.onError);\n onErrorRef.current = options.onError;\n const [client] = useState(() =>\n createLockerversePublicEventsClient({\n ...options,\n onError: (error) => onErrorRef.current?.(error),\n })\n );\n const [revision, setRevision] = useState(0);\n const [state, setState] = useState<\n Pick<UseLockerversePublicEventsResult, \"events\" | \"loading\" | \"error\">\n >({ error: null, events: null, loading: true });\n\n useEffect(() => {\n let active = true;\n client.list().then(\n (events) => {\n if (active) {\n setState({ error: null, events, loading: false });\n }\n },\n (error: LockerverseSdkError) => {\n if (active) {\n setState((current) => ({ ...current, error, loading: false }));\n }\n }\n );\n return () => {\n active = false;\n };\n }, [client, revision]);\n\n const refresh = useCallback(() => {\n setState((current) => ({ ...current, error: null, loading: true }));\n setRevision((current) => current + 1);\n }, []);\n\n return { ...state, client, refresh };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"public-events.js","names":[],"sources":["../src/lockerverse-public-events.tsx","../src/use-lockerverse-public-events.ts"],"sourcesContent":["import type { LockerversePublicEvent } from \"@lockerverse/sdk/public-events\";\nimport { Share2 } from \"lucide-react\";\nimport { useCallback, useEffect, useId, useState } from \"react\";\nimport { getAccentContrast } from \"./accent-contrast.ts\";\nimport type { LockerverseStyle, LockerverseTheme } from \"./theme.ts\";\nimport type { UseLockerversePublicEventsResult } from \"./use-lockerverse-public-events.ts\";\n\nexport type LockerversePublicEventsProps = {\n events: UseLockerversePublicEventsResult;\n /** The visible heading. Defaults to Events. */\n title?: string;\n showHeading?: boolean;\n emptyMessage?: string;\n /** Used to show dates and times. Defaults to America/New_York. */\n timeZone?: string;\n theme?: LockerverseTheme;\n style?: LockerverseStyle;\n className?: string;\n};\n\nfunction formatDate(value: string, timeZone: string) {\n return new Intl.DateTimeFormat(\"en-US\", {\n day: \"numeric\",\n month: \"short\",\n timeZone,\n year: \"numeric\",\n }).format(new Date(value));\n}\n\nfunction formatTime(value: string, timeZone: string) {\n return new Intl.DateTimeFormat(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n timeZone,\n timeZoneName: \"short\",\n }).format(new Date(value));\n}\n\nfunction getLink(value: string | null) {\n if (!value) {\n return null;\n }\n try {\n const url = new URL(value);\n return url.protocol === \"https:\" || url.protocol === \"http:\"\n ? url.toString()\n : null;\n } catch {\n return null;\n }\n}\n\nfunction getShareUrl(item: LockerversePublicEvent, past: boolean) {\n const link = getLink(item.link);\n if (link) {\n return link;\n }\n const url = new URL(window.location.href);\n if (past) {\n url.searchParams.set(\"lockerverseEvents\", \"past\");\n } else {\n url.searchParams.delete(\"lockerverseEvents\");\n }\n url.searchParams.delete(\"lockerverseEventOffset\");\n url.hash = `event-${item.id}`;\n return url.toString();\n}\n\nfunction withAccentContrast(style?: LockerverseStyle) {\n const accent = style?.[\"--lockerverse-accent\"];\n if (!accent || style?.[\"--lockerverse-accent-contrast\"] !== undefined) {\n return style;\n }\n const contrast = getAccentContrast(accent);\n return contrast\n ? { ...style, \"--lockerverse-accent-contrast\": contrast }\n : style;\n}\n\nfunction EventDateMeta({\n active,\n imageUrl,\n startAt,\n startDateLabel,\n}: {\n active: boolean;\n imageUrl: string | null;\n startAt: string;\n startDateLabel: string;\n}) {\n if (!(imageUrl || active)) {\n return null;\n }\n\n return (\n <div className=\"lockerverse-public-events__meta\">\n {imageUrl ? <time dateTime={startAt}>{startDateLabel}</time> : null}\n {active ? (\n <span className=\"lockerverse-public-events__live\">Live now</span>\n ) : null}\n </div>\n );\n}\n\nfunction PublicEventRow({\n item,\n timeZone,\n active,\n past = false,\n}: {\n item: LockerversePublicEvent;\n timeZone: string;\n active: boolean;\n past?: boolean;\n}) {\n const [expanded, setExpanded] = useState(false);\n const [copied, setCopied] = useState(false);\n const [manualShareUrl, setManualShareUrl] = useState<string | null>(null);\n const start = new Date(item.startAt);\n const month = new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n timeZone,\n }).format(start);\n const day = new Intl.DateTimeFormat(\"en-US\", {\n day: \"numeric\",\n timeZone,\n }).format(start);\n const year = new Intl.DateTimeFormat(\"en-US\", {\n timeZone,\n year: \"numeric\",\n }).format(start);\n const startDateLabel = formatDate(item.startAt, timeZone);\n const sameDay = startDateLabel === formatDate(item.endAt, timeZone);\n const endLabel = sameDay\n ? formatTime(item.endAt, timeZone)\n : `${formatDate(item.endAt, timeZone)} at ${formatTime(item.endAt, timeZone)}`;\n const link = getLink(item.link);\n const imageUrl = getLink(item.imageUrl);\n const canExpand = (item.description?.length ?? 0) > 130;\n\n async function shareEvent() {\n const url = getShareUrl(item, past);\n if (navigator.share) {\n try {\n await navigator.share({ title: item.name, url });\n return;\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n return;\n }\n }\n }\n try {\n await navigator.clipboard.writeText(url);\n setCopied(true);\n } catch {\n setManualShareUrl(url);\n }\n }\n\n return (\n <li className=\"lockerverse-public-events__item\" id={`event-${item.id}`}>\n <article\n className={[\n \"lockerverse-public-events__row\",\n imageUrl ? \"lockerverse-public-events__row--with-image\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {imageUrl ? (\n <img\n alt=\"\"\n className=\"lockerverse-public-events__image\"\n height={124}\n loading=\"lazy\"\n src={imageUrl}\n width={154}\n />\n ) : (\n <time\n className=\"lockerverse-public-events__date\"\n dateTime={item.startAt}\n >\n <span className=\"lockerverse-public-events__month\">{month}</span>\n <span className=\"lockerverse-public-events__day\">{day}</span>\n <span className=\"lockerverse-public-events__year\">{year}</span>\n </time>\n )}\n <div className=\"lockerverse-public-events__content\">\n <EventDateMeta\n active={active}\n imageUrl={imageUrl}\n startAt={item.startAt}\n startDateLabel={startDateLabel}\n />\n <h4>{item.name}</h4>\n <p className=\"lockerverse-public-events__time\">\n <time dateTime={item.startAt}>\n {formatTime(item.startAt, timeZone)}\n </time>\n <span aria-hidden=\"true\"> — </span>\n <time dateTime={item.endAt}>{endLabel}</time>\n </p>\n {item.location ? (\n <p className=\"lockerverse-public-events__place\">{item.location}</p>\n ) : null}\n {item.description ? (\n <>\n <p\n className={[\n \"lockerverse-public-events__description\",\n canExpand && !expanded\n ? \"lockerverse-public-events__description--clamped\"\n : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {item.description}\n </p>\n {canExpand ? (\n <button\n aria-expanded={expanded}\n className=\"lockerverse-public-events__more\"\n onClick={() => setExpanded(!expanded)}\n type=\"button\"\n >\n {expanded ? \"Show less\" : \"Read more\"}\n </button>\n ) : null}\n </>\n ) : null}\n {manualShareUrl ? (\n <label className=\"lockerverse-public-events__copy-link\">\n Copy event link\n <input\n onFocus={(event) => event.currentTarget.select()}\n readOnly\n value={manualShareUrl}\n />\n </label>\n ) : null}\n </div>\n <div className=\"lockerverse-public-events__actions\">\n {link ? (\n <a\n className=\"lockerverse-public-events__link\"\n href={link}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n View event <span aria-hidden=\"true\">↗</span>\n </a>\n ) : null}\n <button\n aria-label={`Share ${item.name}`}\n className=\"lockerverse-public-events__share\"\n onClick={shareEvent}\n type=\"button\"\n >\n <Share2 aria-hidden=\"true\" size={16} strokeWidth={1.8} />\n {copied ? \"Link copied\" : \"Share\"}\n </button>\n </div>\n </article>\n </li>\n );\n}\n\n/** Optional public list that can be embedded in any React site. */\nexport function LockerversePublicEvents({\n events,\n title = \"Events\",\n showHeading = true,\n emptyMessage = \"No events yet.\",\n timeZone = \"America/New_York\",\n theme = \"dark\",\n style,\n className,\n}: LockerversePublicEventsProps) {\n const [now, setNow] = useState(() => Date.now());\n const [view, setView] = useState<\"current\" | \"past\">(\"current\");\n const [pastEvents, setPastEvents] = useState<LockerversePublicEvent[]>([]);\n const [pastOffset, setPastOffset] = useState(0);\n const [pastHasMore, setPastHasMore] = useState(false);\n const [pastLoaded, setPastLoaded] = useState(false);\n const [pastLoading, setPastLoading] = useState(false);\n const [pastError, setPastError] = useState<string | null>(null);\n const [pastTarget, setPastTarget] = useState<string | null>(null);\n const tabId = useId();\n\n const loadPast = useCallback(\n async (offset: number, reset = false) => {\n setPastLoading(true);\n setPastError(null);\n try {\n const page = await events.client.listPast({ offset });\n setPastEvents((current) =>\n reset ? page.events : [...current, ...page.events]\n );\n setPastOffset(offset + page.events.length);\n setPastHasMore(page.hasMore);\n setPastLoaded(true);\n } catch (error) {\n setPastError(\n error instanceof Error ? error.message : \"Unable to load past events.\"\n );\n } finally {\n setPastLoading(false);\n }\n },\n [events.client]\n );\n\n useEffect(() => {\n const interval = window.setInterval(() => setNow(Date.now()), 60_000);\n return () => window.clearInterval(interval);\n }, []);\n\n useEffect(() => {\n const url = new URL(window.location.href);\n if (url.searchParams.get(\"lockerverseEvents\") !== \"past\") {\n return;\n }\n setView(\"past\");\n setPastTarget(url.hash.slice(1));\n loadPast(0, true);\n }, [loadPast]);\n\n useEffect(() => {\n const hash = window.location.hash.slice(1);\n if (!hash.startsWith(\"event-\")) {\n return;\n }\n if (view === \"current\") {\n document.getElementById(hash)?.scrollIntoView({ block: \"center\" });\n return;\n }\n if (!pastTarget || pastLoading || !pastLoaded) {\n return;\n }\n const target = document.getElementById(pastTarget);\n if (target) {\n target.scrollIntoView({ block: \"center\" });\n setPastTarget(null);\n } else if (pastHasMore) {\n loadPast(pastOffset);\n } else {\n setPastTarget(null);\n }\n }, [\n events.events,\n loadPast,\n pastHasMore,\n pastLoaded,\n pastLoading,\n pastOffset,\n pastTarget,\n view,\n ]);\n\n function openPast() {\n setView(\"past\");\n if (pastLoaded || pastLoading) {\n return;\n }\n loadPast(0, true);\n }\n\n const availableEvents = events.events || [];\n const activeEvents = availableEvents.filter(\n (item) =>\n new Date(item.startAt).getTime() <= now &&\n new Date(item.endAt).getTime() > now\n );\n const upcomingEvents = availableEvents.filter(\n (item) => new Date(item.startAt).getTime() > now\n );\n\n return (\n <section\n aria-busy={view === \"past\" ? pastLoading : events.loading}\n aria-label={title}\n className={[\"lockerverse-public-events\", className]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-theme={theme}\n style={withAccentContrast(style)}\n >\n {showHeading ? <h2>{title}</h2> : null}\n <nav aria-label=\"Event views\" className=\"lockerverse-public-events__tabs\">\n <button\n aria-controls={`${tabId}-current-panel`}\n aria-pressed={view === \"current\"}\n className=\"lockerverse-public-events__tab\"\n id={`${tabId}-current-tab`}\n onClick={() => setView(\"current\")}\n type=\"button\"\n >\n Upcoming Events\n </button>\n <button\n aria-controls={`${tabId}-past-panel`}\n aria-pressed={view === \"past\"}\n className=\"lockerverse-public-events__tab\"\n id={`${tabId}-past-tab`}\n onClick={openPast}\n type=\"button\"\n >\n Past Events\n </button>\n </nav>\n <section\n aria-labelledby={`${tabId}-current-tab`}\n hidden={view !== \"current\"}\n id={`${tabId}-current-panel`}\n >\n {events.loading && !events.events ? (\n <p role=\"status\">Loading events…</p>\n ) : null}\n {events.error ? (\n <div role=\"alert\">\n <p>{events.error.message}</p>\n <button onClick={events.refresh} type=\"button\">\n Try again\n </button>\n </div>\n ) : null}\n {events.events &&\n activeEvents.length === 0 &&\n upcomingEvents.length === 0 ? (\n <p className=\"lockerverse-public-events__empty\">{emptyMessage}</p>\n ) : null}\n {activeEvents.length > 0 ? (\n <div className=\"lockerverse-public-events__group\">\n <ol className=\"lockerverse-public-events__list\">\n {activeEvents.map((item) => (\n <PublicEventRow\n active\n item={item}\n key={item.id}\n timeZone={timeZone}\n />\n ))}\n </ol>\n </div>\n ) : null}\n {upcomingEvents.length > 0 ? (\n <div className=\"lockerverse-public-events__group\">\n <h3 className=\"lockerverse-public-events__group-title\">Upcoming</h3>\n <ol className=\"lockerverse-public-events__list\">\n {upcomingEvents.map((item) => (\n <PublicEventRow\n active={false}\n item={item}\n key={item.id}\n timeZone={timeZone}\n />\n ))}\n </ol>\n </div>\n ) : null}\n </section>\n <section\n aria-labelledby={`${tabId}-past-tab`}\n hidden={view !== \"past\"}\n id={`${tabId}-past-panel`}\n >\n {pastError ? (\n <div role=\"alert\">\n <p>{pastError}</p>\n <button\n onClick={() => loadPast(pastLoaded ? pastOffset : 0, !pastLoaded)}\n type=\"button\"\n >\n Try again\n </button>\n </div>\n ) : null}\n {pastLoading && !pastLoaded ? (\n <p role=\"status\">Loading past events…</p>\n ) : null}\n {pastLoaded && pastEvents.length === 0 ? (\n <p className=\"lockerverse-public-events__empty\">\n No past events yet.\n </p>\n ) : null}\n {pastEvents.length > 0 ? (\n <ol className=\"lockerverse-public-events__list\">\n {pastEvents.map((item) => (\n <PublicEventRow\n active={false}\n item={item}\n key={item.id}\n past\n timeZone={timeZone}\n />\n ))}\n </ol>\n ) : null}\n {pastHasMore ? (\n <button\n className=\"lockerverse-public-events__load-more\"\n disabled={pastLoading}\n onClick={() => loadPast(pastOffset)}\n type=\"button\"\n >\n {pastLoading ? \"Loading…\" : \"Load more past events\"}\n </button>\n ) : null}\n </section>\n </section>\n );\n}\n","import {\n type CreateLockerversePublicEventsOptions,\n createLockerversePublicEventsClient,\n type LockerversePublicEvent,\n type LockerversePublicEventsClient,\n type LockerverseSdkError,\n} from \"@lockerverse/sdk/public-events\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useImmutableResourceIdentity } from \"./immutable-resource-identity.ts\";\n\nexport type UseLockerversePublicEventsResult = {\n client: LockerversePublicEventsClient;\n events: LockerversePublicEvent[] | null;\n loading: boolean;\n error: LockerverseSdkError | null;\n refresh: () => void;\n};\n\n/** Load the public events list for one community. */\nexport function useLockerversePublicEvents(\n options: CreateLockerversePublicEventsOptions\n): UseLockerversePublicEventsResult {\n useImmutableResourceIdentity(\"public events\", {\n apiBaseUrl: options.apiBaseUrl,\n communitySlug: options.communitySlug,\n environment: options.environment,\n slug: \"\",\n });\n const onErrorRef = useRef(options.onError);\n onErrorRef.current = options.onError;\n const [client] = useState(() =>\n createLockerversePublicEventsClient({\n ...options,\n onError: (error) => onErrorRef.current?.(error),\n })\n );\n const [revision, setRevision] = useState(0);\n const [state, setState] = useState<\n Pick<UseLockerversePublicEventsResult, \"events\" | \"loading\" | \"error\">\n >({ error: null, events: null, loading: true });\n\n useEffect(() => {\n let active = true;\n client.list().then(\n (events) => {\n if (active) {\n setState({ error: null, events, loading: false });\n }\n },\n (error: LockerverseSdkError) => {\n if (active) {\n setState((current) => ({ ...current, error, loading: false }));\n }\n }\n );\n return () => {\n active = false;\n };\n }, [client, revision]);\n\n const refresh = useCallback(() => {\n setState((current) => ({ ...current, error: null, loading: true }));\n setRevision((current) => current + 1);\n }, []);\n\n return { ...state, client, refresh };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lockerverse/react",
3
- "version": "0.2.130-dev.1",
3
+ "version": "0.2.131",
4
4
  "description": "Tree-shakable React payment and signup UI for Lockerverse",
5
5
  "repository": {
6
6
  "type": "git",
@@ -127,7 +127,7 @@
127
127
  "embla-carousel-react": "8.6.0",
128
128
  "lucide-react": "0.536.0",
129
129
  "valibot": "1.4.2",
130
- "@lockerverse/sdk": "0.2.130-dev.1"
130
+ "@lockerverse/sdk": "0.2.131"
131
131
  },
132
132
  "devDependencies": {
133
133
  "@size-limit/file": "13.0.3",