@lockerverse/react 0.2.137 → 0.2.138-dev.1
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.
- package/README.md +30 -1
- package/dist/public-events.css +6 -0
- package/dist/public-events.d.ts +22 -4
- package/dist/public-events.d.ts.map +1 -1
- package/dist/public-events.js +1 -1
- package/dist/public-events.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -719,4 +719,33 @@ image is present and a date tile when it is absent. The default view groups
|
|
|
719
719
|
events into "Happening now" and "Upcoming". The "Past Events" view loads on
|
|
720
720
|
demand and offers "Load more" for older events. Each card has a share action.
|
|
721
721
|
Sharing uses the event link when one exists; otherwise it uses a link to the
|
|
722
|
-
event card on the host page.
|
|
722
|
+
event card on the host page. For a one-list view, a card link can load up to
|
|
723
|
+
five more pages to find its Event. The visitor can still use Load more.
|
|
724
|
+
|
|
725
|
+
Pass one configuration object to the hook for a different list. The component
|
|
726
|
+
reads that configuration from the hook result. With `showTabs: false`, it shows
|
|
727
|
+
one full-width list; `includePast` selects whether that list includes ended
|
|
728
|
+
Events. `from`, `to`, and `sort` set the server-side date range and order.
|
|
729
|
+
Without `from` or `to`, a one-list view reads all publicly listed Event
|
|
730
|
+
history. It includes past Events by default and sorts by descending start
|
|
731
|
+
time, so newer Events appear first. With `includePast: false`, the default is
|
|
732
|
+
ascending start time for current and future Events. Each page has 20 Events.
|
|
733
|
+
|
|
734
|
+
```tsx
|
|
735
|
+
const config = {
|
|
736
|
+
showTabs: false,
|
|
737
|
+
includePast: true,
|
|
738
|
+
from: "2026-09-01T00:00:00.000Z",
|
|
739
|
+
to: "2026-10-01T00:00:00.000Z",
|
|
740
|
+
sort: "startAtAsc",
|
|
741
|
+
} as const;
|
|
742
|
+
const events = useLockerversePublicEvents(
|
|
743
|
+
{ communitySlug: "auburn" },
|
|
744
|
+
{ config, initialPage }
|
|
745
|
+
);
|
|
746
|
+
return <LockerversePublicEvents events={events} />;
|
|
747
|
+
```
|
|
748
|
+
|
|
749
|
+
For server rendering, obtain `initialPage` with the SDK client's `search()`
|
|
750
|
+
and the same date, scope, sort, and page size. Without this configuration,
|
|
751
|
+
`initialEvents` from `list()` keeps the original Upcoming and Past views.
|
package/dist/public-events.css
CHANGED
|
@@ -87,6 +87,12 @@
|
|
|
87
87
|
min-width: 0;
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
+
.lockerverse-public-events[data-lockerverse-tabs="false"]
|
|
91
|
+
.lockerverse-public-events__layout
|
|
92
|
+
> section {
|
|
93
|
+
grid-column: 1 / -1;
|
|
94
|
+
}
|
|
95
|
+
|
|
90
96
|
.lockerverse-public-events .lockerverse-public-events__tab {
|
|
91
97
|
display: flex;
|
|
92
98
|
gap: 10px;
|
package/dist/public-events.d.ts
CHANGED
|
@@ -1,19 +1,37 @@
|
|
|
1
1
|
import { n as LockerverseTheme, t as LockerverseStyle } from "./theme.js";
|
|
2
|
-
import { CreateLockerversePublicEventsOptions, LockerversePublicEvent, LockerversePublicEventsClient, LockerverseSdkError } from "@lockerverse/sdk/public-events";
|
|
2
|
+
import { CreateLockerversePublicEventsOptions, LockerversePublicEvent, LockerversePublicEventsClient, LockerversePublicEventsPage, LockerversePublicEventsSort, LockerverseSdkError } from "@lockerverse/sdk/public-events";
|
|
3
3
|
//#region src/use-lockerverse-public-events.d.ts
|
|
4
|
+
type LockerversePublicEventsConfig = {
|
|
5
|
+
/** Show separate current and past views. Defaults to true. */
|
|
6
|
+
showTabs?: boolean;
|
|
7
|
+
/** Make past Events available. Defaults to true. */
|
|
8
|
+
includePast?: boolean;
|
|
9
|
+
/** Inclusive lower bound of the event overlap window, as an ISO instant. */
|
|
10
|
+
from?: string | undefined;
|
|
11
|
+
/** Exclusive upper bound of the event overlap window, as an ISO instant. */
|
|
12
|
+
to?: string | undefined;
|
|
13
|
+
sort?: LockerversePublicEventsSort | undefined;
|
|
14
|
+
};
|
|
4
15
|
type UseLockerversePublicEventsOptions = {
|
|
5
|
-
/** Initial public SDK snapshot. The hook still refreshes on mount. */
|
|
16
|
+
/** Initial legacy public SDK snapshot. The hook still refreshes on mount. */
|
|
6
17
|
initialEvents?: LockerversePublicEvent[];
|
|
18
|
+
/** Initial search page for a configured list. The hook still refreshes on mount. */
|
|
19
|
+
initialPage?: LockerversePublicEventsPage;
|
|
20
|
+
config?: LockerversePublicEventsConfig;
|
|
7
21
|
};
|
|
8
22
|
type UseLockerversePublicEventsResult = {
|
|
9
23
|
client: LockerversePublicEventsClient;
|
|
24
|
+
config: Required<Pick<LockerversePublicEventsConfig, "showTabs" | "includePast">> & Pick<LockerversePublicEventsConfig, "from" | "to" | "sort">;
|
|
10
25
|
events: LockerversePublicEvent[] | null;
|
|
26
|
+
hasMore: boolean;
|
|
11
27
|
loading: boolean;
|
|
28
|
+
loadingMore: boolean;
|
|
12
29
|
error: LockerverseSdkError | null;
|
|
13
30
|
refresh: () => void;
|
|
31
|
+
loadMore: () => void;
|
|
14
32
|
};
|
|
15
33
|
/** Load the public events list for one community. */
|
|
16
|
-
declare function useLockerversePublicEvents(options: CreateLockerversePublicEventsOptions, { initialEvents }?: UseLockerversePublicEventsOptions): UseLockerversePublicEventsResult;
|
|
34
|
+
declare function useLockerversePublicEvents(options: CreateLockerversePublicEventsOptions, { initialEvents, initialPage, config }?: UseLockerversePublicEventsOptions): UseLockerversePublicEventsResult;
|
|
17
35
|
//#endregion
|
|
18
36
|
//#region src/lockerverse-public-events.d.ts
|
|
19
37
|
type LockerversePublicEventsProps = {
|
|
@@ -31,5 +49,5 @@ type LockerversePublicEventsProps = {
|
|
|
31
49
|
/** Optional public list that can be embedded in any React site. */
|
|
32
50
|
declare function LockerversePublicEvents({ events, title, showHeading, emptyMessage, timeZone, theme, style, className }: LockerversePublicEventsProps): import("react").JSX.Element;
|
|
33
51
|
//#endregion
|
|
34
|
-
export { LockerversePublicEvents, type LockerversePublicEventsProps, type LockerverseStyle, type LockerverseTheme, type UseLockerversePublicEventsOptions, type UseLockerversePublicEventsResult, useLockerversePublicEvents };
|
|
52
|
+
export { LockerversePublicEvents, type LockerversePublicEventsConfig, type LockerversePublicEventsProps, type LockerverseStyle, type LockerverseTheme, type UseLockerversePublicEventsOptions, type UseLockerversePublicEventsResult, useLockerversePublicEvents };
|
|
35
53
|
//# sourceMappingURL=public-events.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public-events.d.ts","names":[],"sources":["../src/use-lockerverse-public-events.ts","../src/lockerverse-public-events.tsx"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"public-events.d.ts","names":[],"sources":["../src/use-lockerverse-public-events.ts","../src/lockerverse-public-events.tsx"],"mappings":";;;KAYY;;EAEV;;EAEA;;EAEA;;EAEA;EACA,OAAO;;KAGG;;EAEV,gBAAgB;;EAEhB,cAAc;EACd,SAAS;;KAGC;EACV,QAAQ;EACR,QAAQ,SACN,KAAK,8DAEL,KAAK;EACP,QAAQ;EACR;EACA;EACA;EACA,OAAO;EACP;EACA;;;iBASc,2BACd,SAAS,wCACP,eAAe,aAAa,WAAU,oCACvC;;;KCzCS;EACV,QAAQ;;EAER;EACA;EACA;;EAEA;EACA,QAAQ;EACR,QAAQ;EACR;;;iBA8lBc,0BACd,QACA,OACA,aACA,cACA,UACA,OACA,OACA,aACC,+CAA4B,IAAA"}
|
package/dist/public-events.js
CHANGED
|
@@ -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||M||!O)return;let t=document.getElementById(P);t?(t.scrollIntoView({block:`center`}),F(null)):E?L(C):F(null)},[e.events,L,M,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,{initialEvents:n}={}){e(`public events`,{apiBaseUrl:t.apiBaseUrl,communitySlug:t.communitySlug,environment:t.environment,slug:``});let r=f(t.onError);r.current=t.onError;let[i]=p(()=>_({...t,onError:e=>r.current?.(e)})),[a,o]=p(0),[s,c]=p(()=>({error:null,events:n??null,loading:!0}));u(()=>{let e=!0;return i.list().then(t=>{e&&c({error:null,events:t,loading:!1})},t=>{e&&c(e=>({...e,error:t,loading:!1}))}),()=>{e=!1}},[i,a]);let d=l(()=>{c(e=>({...e,error:null,loading:!0})),o(e=>e+1)},[]);return{...s,client:i,refresh:d}}export{E as LockerversePublicEvents,D as useLockerversePublicEvents};
|
|
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({items:e,now:t,timeZone:n,past:r=!1}){return h(`ol`,{className:`lockerverse-public-events__list`,children:e.map(e=>h(T,{active:!r&&new Date(e.startAt).getTime()<=t&&new Date(e.endAt).getTime()>t,item:e,past:r,timeZone:n},e.id))})}function D({disabled:e,label:t,onClick:n}){return h(`button`,{className:`lockerverse-public-events__load-more`,disabled:e,onClick:n,type:`button`,children:e?`Loading…`:t})}function O({events:e,view:t,tabId:n,sort:r,now:i,emptyMessage:a,timeZone:o}){let s=e.events??[],c=s.filter(e=>new Date(e.startAt).getTime()<=i&&new Date(e.endAt).getTime()>i),l=s.filter(e=>new Date(e.startAt).getTime()>i),u=s.filter(e=>new Date(e.endAt).getTime()>i),d=r?u.length===0:c.length===0&&l.length===0;return g(`section`,{"aria-labelledby":`${n}-current-tab`,hidden:t!==`current`,id:`${n}-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&&d?h(`p`,{className:`lockerverse-public-events__empty`,children:a}):null,r&&u.length>0?h(E,{items:u,now:i,timeZone:o}):null,!r&&c.length>0?h(`div`,{className:`lockerverse-public-events__group`,children:h(E,{items:c,now:i,timeZone:o})}):null,!r&&l.length>0?h(`div`,{className:`lockerverse-public-events__group`,children:h(E,{items:l,now:i,timeZone:o})}):null,e.hasMore?h(D,{disabled:e.loadingMore,label:`Load more events`,onClick:e.loadMore}):null]})}function k({events:e,title:t,now:n,emptyMessage:r,timeZone:i}){return g(`section`,{"aria-label":t,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&&e.events.length===0?h(`p`,{className:`lockerverse-public-events__empty`,children:r}):null,e.events&&e.events.length>0?h(E,{items:e.events,now:n,timeZone:i}):null,e.hasMore?h(D,{disabled:e.loadingMore,label:`Load more events`,onClick:e.loadMore}):null]})}function A({tabId:e,view:t,pastEvents:n,pastLoaded:r,pastLoading:i,pastError:a,pastHasMore:o,pastOffset:s,loadPast:c,now:l,timeZone:u}){return g(`section`,{"aria-labelledby":`${e}-past-tab`,hidden:t!==`past`,id:`${e}-past-panel`,children:[a?g(`div`,{role:`alert`,children:[h(`p`,{children:a}),h(`button`,{onClick:()=>c(r?s:0,!r),type:`button`,children:`Try again`})]}):null,i&&!r?h(`p`,{role:`status`,children:`Loading past events…`}):null,r&&n.length===0?h(`p`,{className:`lockerverse-public-events__empty`,children:`No past events yet.`}):null,n.length>0?h(E,{items:n,now:l,past:!0,timeZone:u}):null,o?h(D,{disabled:i,label:`Load more past events`,onClick:()=>c(s)}):null]})}function j({events:e,title:t=`Events`,showHeading:i=!0,emptyMessage:a=`No events yet.`,timeZone:o=`America/New_York`,theme:s=`dark`,style:c,className:_}){let[v,y]=p(()=>Date.now()),[b,x]=p(`current`),[C,w]=p([]),[T,E]=p(0),[D,j]=p(!1),[M,N]=p(!1),[P,F]=p(!1),[I,L]=p(null),[R,z]=p(null),B=d(),{showTabs:V,includePast:H,from:U,to:W,sort:G}=e.config,K=!!(U||W||G),q=JSON.stringify([U,W,G,V,H]),J=f(q),[Y,X]=p(!1),Z=f(0),[ee,te]=p(0),Q=f({key:``,pages:0}),$=l(async(t,n=!1)=>{Z.current+=1;let r=Z.current;F(!0),L(null);try{let i=K?await e.client.search({from:U,limit:20,offset:t,sort:G??`endAtDesc`,timeScope:`past`,to:W}):await e.client.listPast({offset:t});if(r!==Z.current)return;w(e=>n?i.events:[...e,...i.events]),E(t+i.events.length),j(i.hasMore),N(!0)}catch(e){if(r!==Z.current)return;L(e instanceof Error?e.message:`Unable to load past events.`)}finally{r===Z.current&&F(!1)}},[e.client,K,U,W,G]);u(()=>{let e=window.setInterval(()=>y(Date.now()),6e4);return()=>window.clearInterval(e)},[]),u(()=>{if(Y||(X(!0),!(V&&H)))return;let e=new URL(window.location.href);e.searchParams.get(`lockerverseEvents`)===`past`&&(x(`past`),z(e.hash.slice(1)),$(0,!0))},[Y,$,V,H]),u(()=>{J.current!==q&&(J.current=q,Z.current+=1,w([]),E(0),j(!1),N(!1),V&&H?b===`past`&&$(0,!0):x(`current`))},[q,V,H,b,$]),u(()=>{let e=()=>te(e=>e+1);return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),u(()=>{if(V)return;let t=window.location.hash.slice(1),n=`${q}:${t}`;if(Q.current.key!==n&&(Q.current={key:n,pages:0}),!t.startsWith(`event-`))return;let r=document.getElementById(t);r?r.scrollIntoView({block:`center`}):!(e.loading||e.loadingMore||e.error)&&e.hasMore&&Q.current.pages<5&&(Q.current.pages+=1,e.loadMore())},[e.events,e.error,e.hasMore,e.loading,e.loadingMore,e.loadMore,ee,q,V]),u(()=>{if(!V||b!==`current`)return;let t=window.location.hash.slice(1);if(!t.startsWith(`event-`))return;let n=document.getElementById(t);n?n.scrollIntoView({block:`center`}):!(e.loading||e.loadingMore||e.error)&&e.hasMore&&e.loadMore()},[e.events,e.error,e.hasMore,e.loading,e.loadingMore,e.loadMore,V,b]),u(()=>{if(!V||b!==`past`||!R||P||I||!M)return;let e=document.getElementById(R);e?(e.scrollIntoView({block:`center`}),z(null)):D?$(T):z(null)},[$,I,D,M,P,T,R,V,b]);function ne(){x(`past`),!(M||P)&&$(0,!0)}return h(`section`,{"aria-busy":V&&b===`past`?P:e.loading,"aria-label":t,className:[`lockerverse-public-events`,_].filter(Boolean).join(` `),"data-lockerverse-tabs":V,"data-lockerverse-theme":s,style:S(c),children:g(`div`,{className:`lockerverse-public-events__layout`,children:[i?h(`h2`,{children:t}):null,V?g(`nav`,{"aria-label":`Event views`,className:`lockerverse-public-events__tabs`,children:[g(`button`,{"aria-controls":`${B}-current-panel`,"aria-pressed":b===`current`,className:`lockerverse-public-events__tab`,id:`${B}-current-tab`,onClick:()=>x(`current`),type:`button`,children:[h(n,{"aria-hidden":`true`,size:18}),`Upcoming Events`]}),H?g(`button`,{"aria-controls":`${B}-past-panel`,"aria-pressed":b===`past`,className:`lockerverse-public-events__tab`,id:`${B}-past-tab`,onClick:ne,type:`button`,children:[h(r,{"aria-hidden":`true`,size:18}),`Past Events`]}):null]}):null,V?g(m,{children:[h(O,{emptyMessage:a,events:e,now:v,sort:G,tabId:B,timeZone:o,view:b}),H?h(A,{loadPast:$,now:v,pastError:I,pastEvents:C,pastHasMore:D,pastLoaded:M,pastLoading:P,pastOffset:T,tabId:B,timeZone:o,view:b}):null]}):h(k,{emptyMessage:a,events:e,now:v,timeZone:o,title:t})]})})}function M(t,{initialEvents:n,initialPage:r,config:i}={}){e(`public events`,{apiBaseUrl:t.apiBaseUrl,communitySlug:t.communitySlug,environment:t.environment,slug:``});let a=f(t.onError);a.current=t.onError;let[o]=p(()=>_({...t,onError:e=>a.current?.(e)})),s=i?.showTabs??!0,c=i?.includePast??!0,d=i?.from,m=i?.to,h=i?.sort,g=h??(!s&&c?`startAtDesc`:`startAtAsc`),v=!s||!!(d||m||h),y=!s&&c?`all`:`current`,b=JSON.stringify([s,c,d,m,h]),x=f(b);x.current=b;let S=f(0),C=f(!1),[w,T]=p(0),[E,D]=p(()=>({error:null,events:(v?r?.events:n)??null,hasMore:v&&r?r.hasMore:!1,loading:!0,loadingMore:!1}));u(()=>{let e=!0;return S.current+=1,C.current=!1,D(e=>({...e,loading:!0,loadingMore:!1})),(v?o.search({from:d,limit:20,offset:0,sort:g,timeScope:y,to:m}):o.list().then(e=>({events:e,hasMore:!1}))).then(t=>{e&&D({error:null,events:t.events,hasMore:t.hasMore,loading:!1,loadingMore:!1})},t=>{e&&D(e=>({...e,error:t,loading:!1,loadingMore:!1}))}),()=>{e=!1}},[o,d,m,y,g,v,w]);let O=l(()=>{S.current+=1,C.current=!1,D(e=>({...e,error:null,loading:!0})),T(e=>e+1)},[]),k=l(()=>{if(!(v&&E.hasMore)||E.loading||C.current)return;let e=E.events?.length??0,t=S.current;C.current=!0,D(e=>({...e,error:null,loadingMore:!0})),o.search({from:d,limit:20,offset:e,sort:g,timeScope:y,to:m}).then(e=>{x.current===b&&S.current===t&&(C.current=!1,D(t=>({...t,events:[...t.events??[],...e.events],hasMore:e.hasMore,loadingMore:!1})))},e=>{x.current===b&&S.current===t&&(C.current=!1,D(t=>({...t,error:e,loadingMore:!1})))})},[o,d,m,y,g,v,E,b]);return{...E,client:o,config:{from:d,includePast:c,showTabs:s,sort:h,to:m},loadMore:k,refresh:O}}export{j as LockerversePublicEvents,M 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 || pastError || !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 pastError,\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 UseLockerversePublicEventsOptions = {\n /** Initial public SDK snapshot. The hook still refreshes on mount. */\n initialEvents?: LockerversePublicEvent[];\n};\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 { initialEvents }: UseLockerversePublicEventsOptions = {}\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: initialEvents ?? 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 {\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\nfunction EventRows({\n items,\n now,\n timeZone,\n past = false,\n}: {\n items: LockerversePublicEvent[];\n now: number;\n timeZone: string;\n past?: boolean;\n}) {\n return (\n <ol className=\"lockerverse-public-events__list\">\n {items.map((item) => (\n <PublicEventRow\n active={\n !past &&\n new Date(item.startAt).getTime() <= now &&\n new Date(item.endAt).getTime() > now\n }\n item={item}\n key={item.id}\n past={past}\n timeZone={timeZone}\n />\n ))}\n </ol>\n );\n}\n\nfunction LoadMoreButton({\n disabled,\n label,\n onClick,\n}: {\n disabled: boolean;\n label: string;\n onClick: () => void;\n}) {\n return (\n <button\n className=\"lockerverse-public-events__load-more\"\n disabled={disabled}\n onClick={onClick}\n type=\"button\"\n >\n {disabled ? \"Loading…\" : label}\n </button>\n );\n}\n\nfunction CurrentEventsPanel({\n events,\n view,\n tabId,\n sort,\n now,\n emptyMessage,\n timeZone,\n}: {\n events: UseLockerversePublicEventsResult;\n view: \"current\" | \"past\";\n tabId: string;\n sort: string | undefined;\n now: number;\n emptyMessage: string;\n timeZone: string;\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 const currentEvents = availableEvents.filter(\n (item) => new Date(item.endAt).getTime() > now\n );\n const empty = sort\n ? currentEvents.length === 0\n : activeEvents.length === 0 && upcomingEvents.length === 0;\n\n return (\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 && empty ? (\n <p className=\"lockerverse-public-events__empty\">{emptyMessage}</p>\n ) : null}\n {sort && currentEvents.length > 0 ? (\n <EventRows items={currentEvents} now={now} timeZone={timeZone} />\n ) : null}\n {!sort && activeEvents.length > 0 ? (\n <div className=\"lockerverse-public-events__group\">\n <EventRows items={activeEvents} now={now} timeZone={timeZone} />\n </div>\n ) : null}\n {!sort && upcomingEvents.length > 0 ? (\n <div className=\"lockerverse-public-events__group\">\n <EventRows items={upcomingEvents} now={now} timeZone={timeZone} />\n </div>\n ) : null}\n {events.hasMore ? (\n <LoadMoreButton\n disabled={events.loadingMore}\n label=\"Load more events\"\n onClick={events.loadMore}\n />\n ) : null}\n </section>\n );\n}\n\nfunction CombinedEventsPanel({\n events,\n title,\n now,\n emptyMessage,\n timeZone,\n}: {\n events: UseLockerversePublicEventsResult;\n title: string;\n now: number;\n emptyMessage: string;\n timeZone: string;\n}) {\n return (\n <section aria-label={title}>\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 && events.events.length === 0 ? (\n <p className=\"lockerverse-public-events__empty\">{emptyMessage}</p>\n ) : null}\n {events.events && events.events.length > 0 ? (\n <EventRows items={events.events} now={now} timeZone={timeZone} />\n ) : null}\n {events.hasMore ? (\n <LoadMoreButton\n disabled={events.loadingMore}\n label=\"Load more events\"\n onClick={events.loadMore}\n />\n ) : null}\n </section>\n );\n}\n\nfunction PastEventsPanel({\n tabId,\n view,\n pastEvents,\n pastLoaded,\n pastLoading,\n pastError,\n pastHasMore,\n pastOffset,\n loadPast,\n now,\n timeZone,\n}: {\n tabId: string;\n view: \"current\" | \"past\";\n pastEvents: LockerversePublicEvent[];\n pastLoaded: boolean;\n pastLoading: boolean;\n pastError: string | null;\n pastHasMore: boolean;\n pastOffset: number;\n loadPast: (offset: number, reset?: boolean) => Promise<void>;\n now: number;\n timeZone: string;\n}) {\n return (\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\">No past events yet.</p>\n ) : null}\n {pastEvents.length > 0 ? (\n <EventRows items={pastEvents} now={now} past timeZone={timeZone} />\n ) : null}\n {pastHasMore ? (\n <LoadMoreButton\n disabled={pastLoading}\n label=\"Load more past events\"\n onClick={() => loadPast(pastOffset)}\n />\n ) : null}\n </section>\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 const { showTabs, includePast, from, to, sort } = events.config;\n const configuredPast = Boolean(from || to || sort);\n const pastQueryKey = JSON.stringify([from, to, sort, showTabs, includePast]);\n const previousPastQueryKey = useRef(pastQueryKey);\n const [initializedFromUrl, setInitializedFromUrl] = useState(false);\n const pastRequestId = useRef(0);\n const [hashRevision, setHashRevision] = useState(0);\n const autoLookup = useRef({ key: \"\", pages: 0 });\n\n const loadPast = useCallback(\n async (offset: number, reset = false) => {\n pastRequestId.current += 1;\n const requestId = pastRequestId.current;\n setPastLoading(true);\n setPastError(null);\n try {\n const page = configuredPast\n ? await events.client.search({\n from,\n limit: 20,\n offset,\n sort: sort ?? \"endAtDesc\",\n timeScope: \"past\",\n to,\n })\n : await events.client.listPast({ offset });\n if (requestId !== pastRequestId.current) {\n return;\n }\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 if (requestId !== pastRequestId.current) {\n return;\n }\n setPastError(\n error instanceof Error ? error.message : \"Unable to load past events.\"\n );\n } finally {\n if (requestId === pastRequestId.current) {\n setPastLoading(false);\n }\n }\n },\n [events.client, configuredPast, from, to, sort]\n );\n\n useEffect(() => {\n const interval = window.setInterval(() => setNow(Date.now()), 60_000);\n return () => window.clearInterval(interval);\n }, []);\n\n useEffect(() => {\n if (initializedFromUrl) {\n return;\n }\n setInitializedFromUrl(true);\n if (!(showTabs && includePast)) {\n return;\n }\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 }, [initializedFromUrl, loadPast, showTabs, includePast]);\n\n useEffect(() => {\n if (previousPastQueryKey.current === pastQueryKey) {\n return;\n }\n previousPastQueryKey.current = pastQueryKey;\n pastRequestId.current += 1;\n setPastEvents([]);\n setPastOffset(0);\n setPastHasMore(false);\n setPastLoaded(false);\n if (!(showTabs && includePast)) {\n setView(\"current\");\n } else if (view === \"past\") {\n loadPast(0, true);\n }\n }, [pastQueryKey, showTabs, includePast, view, loadPast]);\n\n useEffect(() => {\n const onHashChange = () => setHashRevision((current) => current + 1);\n window.addEventListener(\"hashchange\", onHashChange);\n return () => window.removeEventListener(\"hashchange\", onHashChange);\n }, []);\n\n useEffect(() => {\n if (showTabs) {\n return;\n }\n const hash = window.location.hash.slice(1);\n const lookupKey = `${pastQueryKey}:${hash}`;\n if (autoLookup.current.key !== lookupKey) {\n autoLookup.current = { key: lookupKey, pages: 0 };\n }\n if (!hash.startsWith(\"event-\")) {\n return;\n }\n const target = document.getElementById(hash);\n if (target) {\n target.scrollIntoView({ block: \"center\" });\n } else if (\n !(events.loading || events.loadingMore || events.error) &&\n events.hasMore &&\n autoLookup.current.pages < 5\n ) {\n autoLookup.current.pages += 1;\n events.loadMore();\n }\n }, [\n events.events,\n events.error,\n events.hasMore,\n events.loading,\n events.loadingMore,\n events.loadMore,\n hashRevision,\n pastQueryKey,\n showTabs,\n ]);\n\n useEffect(() => {\n if (!showTabs || view !== \"current\") {\n return;\n }\n const hash = window.location.hash.slice(1);\n if (!hash.startsWith(\"event-\")) {\n return;\n }\n const target = document.getElementById(hash);\n if (target) {\n target.scrollIntoView({ block: \"center\" });\n } else if (\n !(events.loading || events.loadingMore || events.error) &&\n events.hasMore\n ) {\n events.loadMore();\n }\n }, [\n events.events,\n events.error,\n events.hasMore,\n events.loading,\n events.loadingMore,\n events.loadMore,\n showTabs,\n view,\n ]);\n\n useEffect(() => {\n if (\n !showTabs ||\n view !== \"past\" ||\n !pastTarget ||\n pastLoading ||\n pastError ||\n !pastLoaded\n ) {\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 loadPast,\n pastError,\n pastHasMore,\n pastLoaded,\n pastLoading,\n pastOffset,\n pastTarget,\n showTabs,\n view,\n ]);\n\n function openPast() {\n setView(\"past\");\n if (pastLoaded || pastLoading) {\n return;\n }\n loadPast(0, true);\n }\n\n return (\n <section\n aria-busy={showTabs && view === \"past\" ? pastLoading : events.loading}\n aria-label={title}\n className={[\"lockerverse-public-events\", className]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-tabs={showTabs}\n data-lockerverse-theme={theme}\n style={withAccentContrast(style)}\n >\n <div className=\"lockerverse-public-events__layout\">\n {showHeading ? <h2>{title}</h2> : null}\n {showTabs ? (\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 {includePast ? (\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 ) : null}\n </nav>\n ) : null}\n {showTabs ? (\n <>\n <CurrentEventsPanel\n emptyMessage={emptyMessage}\n events={events}\n now={now}\n sort={sort}\n tabId={tabId}\n timeZone={timeZone}\n view={view}\n />\n {includePast ? (\n <PastEventsPanel\n loadPast={loadPast}\n now={now}\n pastError={pastError}\n pastEvents={pastEvents}\n pastHasMore={pastHasMore}\n pastLoaded={pastLoaded}\n pastLoading={pastLoading}\n pastOffset={pastOffset}\n tabId={tabId}\n timeZone={timeZone}\n view={view}\n />\n ) : null}\n </>\n ) : (\n <CombinedEventsPanel\n emptyMessage={emptyMessage}\n events={events}\n now={now}\n timeZone={timeZone}\n title={title}\n />\n )}\n </div>\n </section>\n );\n}\n","import {\n type CreateLockerversePublicEventsOptions,\n createLockerversePublicEventsClient,\n type LockerversePublicEvent,\n type LockerversePublicEventsClient,\n type LockerversePublicEventsPage,\n type LockerversePublicEventsSort,\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 LockerversePublicEventsConfig = {\n /** Show separate current and past views. Defaults to true. */\n showTabs?: boolean;\n /** Make past Events available. Defaults to true. */\n includePast?: boolean;\n /** Inclusive lower bound of the event overlap window, as an ISO instant. */\n from?: string | undefined;\n /** Exclusive upper bound of the event overlap window, as an ISO instant. */\n to?: string | undefined;\n sort?: LockerversePublicEventsSort | undefined;\n};\n\nexport type UseLockerversePublicEventsOptions = {\n /** Initial legacy public SDK snapshot. The hook still refreshes on mount. */\n initialEvents?: LockerversePublicEvent[];\n /** Initial search page for a configured list. The hook still refreshes on mount. */\n initialPage?: LockerversePublicEventsPage;\n config?: LockerversePublicEventsConfig;\n};\n\nexport type UseLockerversePublicEventsResult = {\n client: LockerversePublicEventsClient;\n config: Required<\n Pick<LockerversePublicEventsConfig, \"showTabs\" | \"includePast\">\n > &\n Pick<LockerversePublicEventsConfig, \"from\" | \"to\" | \"sort\">;\n events: LockerversePublicEvent[] | null;\n hasMore: boolean;\n loading: boolean;\n loadingMore: boolean;\n error: LockerverseSdkError | null;\n refresh: () => void;\n loadMore: () => void;\n};\n\ntype ListingState = Pick<\n UseLockerversePublicEventsResult,\n \"events\" | \"hasMore\" | \"loading\" | \"loadingMore\" | \"error\"\n>;\n\n/** Load the public events list for one community. */\nexport function useLockerversePublicEvents(\n options: CreateLockerversePublicEventsOptions,\n { initialEvents, initialPage, config }: UseLockerversePublicEventsOptions = {}\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 showTabs = config?.showTabs ?? true;\n const includePast = config?.includePast ?? true;\n const from = config?.from;\n const to = config?.to;\n const sort = config?.sort;\n const searchSort =\n sort ?? (!showTabs && includePast ? \"startAtDesc\" : \"startAtAsc\");\n const usesSearch = !showTabs || Boolean(from || to || sort);\n const timeScope = !showTabs && includePast ? \"all\" : \"current\";\n const queryKey = JSON.stringify([showTabs, includePast, from, to, sort]);\n const queryKeyRef = useRef(queryKey);\n queryKeyRef.current = queryKey;\n const requestGeneration = useRef(0);\n const loadingMoreRef = useRef(false);\n const [revision, setRevision] = useState(0);\n const [state, setState] = useState<ListingState>(() => ({\n error: null,\n events: (usesSearch ? initialPage?.events : initialEvents) ?? null,\n hasMore: usesSearch && initialPage ? initialPage.hasMore : false,\n loading: true,\n loadingMore: false,\n }));\n\n useEffect(() => {\n let active = true;\n requestGeneration.current += 1;\n loadingMoreRef.current = false;\n setState((current) => ({ ...current, loading: true, loadingMore: false }));\n const request = usesSearch\n ? client.search({\n from,\n limit: 20,\n offset: 0,\n sort: searchSort,\n timeScope,\n to,\n })\n : client.list().then((events) => ({ events, hasMore: false }));\n request.then(\n (page) => {\n if (active) {\n setState({\n error: null,\n events: page.events,\n hasMore: page.hasMore,\n loading: false,\n loadingMore: false,\n });\n }\n },\n (error: LockerverseSdkError) => {\n if (active) {\n setState((current) => ({\n ...current,\n error,\n loading: false,\n loadingMore: false,\n }));\n }\n }\n );\n return () => {\n active = false;\n };\n }, [client, from, to, timeScope, searchSort, usesSearch, revision]);\n\n const refresh = useCallback(() => {\n requestGeneration.current += 1;\n loadingMoreRef.current = false;\n setState((current) => ({ ...current, error: null, loading: true }));\n setRevision((current) => current + 1);\n }, []);\n\n const loadMore = useCallback(() => {\n if (\n !(usesSearch && state.hasMore) ||\n state.loading ||\n loadingMoreRef.current\n ) {\n return;\n }\n const offset = state.events?.length ?? 0;\n const generation = requestGeneration.current;\n loadingMoreRef.current = true;\n setState((current) => ({ ...current, error: null, loadingMore: true }));\n client\n .search({ from, limit: 20, offset, sort: searchSort, timeScope, to })\n .then(\n (page) => {\n if (\n queryKeyRef.current !== queryKey ||\n requestGeneration.current !== generation\n ) {\n return;\n }\n loadingMoreRef.current = false;\n setState((current) => ({\n ...current,\n events: [...(current.events ?? []), ...page.events],\n hasMore: page.hasMore,\n loadingMore: false,\n }));\n },\n (error: LockerverseSdkError) => {\n if (\n queryKeyRef.current !== queryKey ||\n requestGeneration.current !== generation\n ) {\n return;\n }\n loadingMoreRef.current = false;\n setState((current) => ({ ...current, error, loadingMore: false }));\n }\n );\n }, [client, from, to, timeScope, searchSort, usesSearch, state, queryKey]);\n\n return {\n ...state,\n client,\n config: { from, includePast, showTabs, sort, to },\n loadMore,\n refresh,\n };\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.
|
|
3
|
+
"version": "0.2.138-dev.1",
|
|
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
|
+
"@lockerverse/sdk": "0.2.138-dev.1"
|
|
131
131
|
},
|
|
132
132
|
"devDependencies": {
|
|
133
133
|
"@size-limit/file": "13.0.3",
|