11import { computed , Ref , toValue } from "vue" ;
2- import { deferredVuefireUseCollection , deferredVuefireUseDocument } from "@/views/vue-utils" ;
3- import { VoxxrinConferenceDescriptor , VoxxrinLanguaceCode } from "@/models/VoxxrinConferenceDescriptor" ;
4- import { collection , CollectionReference , doc , DocumentReference , getDocs } from "firebase/firestore" ;
2+ import { deferredVuefireUseDocument } from "@/views/vue-utils" ;
3+ import { VoxxrinConferenceDescriptor } from "@/models/VoxxrinConferenceDescriptor" ;
4+ import { doc , DocumentReference , getDoc } from "firebase/firestore" ;
55import { db } from "@/state/firebase" ;
66import { resolvedEventFirestorePath } from "../../../shared/utilities/event-utils" ;
77import { LineupSpeaker } from "../../../shared/event-lineup.firestore" ;
88import { createVoxxrinSpeakerFromFirestore , SpeakerId , speakerMatchesSearchTerms } from "@/models/VoxxrinSpeaker" ;
9- import { match } from "ts-pattern" ;
109import { CompletablePromiseQueue , sortBy } from "@/models/utils" ;
1110import { User } from "firebase/auth" ;
1211import { checkCache } from "@/services/Cachings" ;
1312import { Temporal } from "temporal-polyfill" ;
1413import { PERF_LOGGER } from "@/services/Logger" ;
1514import { loadSpeakerUrl } from "@/state/useEventTalk" ;
1615import { toValidFirebaseKey } from "../../../shared/utilities/firebase.utils" ;
16+ import { match , P } from "ts-pattern" ;
1717
1818export function useLineupSpeakers ( eventDescriptorRef : Ref < VoxxrinConferenceDescriptor | undefined > , searchTermsRef : Ref < string | undefined > ) {
1919
20- const firestoreSpeakersRef = deferredVuefireUseCollection ( [ eventDescriptorRef ] ,
21- ( [ eventDescriptor ] ) => eventLineupSpeakersCollections ( eventDescriptor ) ,
22- ( firestoreSpeaker : LineupSpeaker ) => firestoreSpeaker ,
23- ( ) => { } ,
24- ( change , speakerId , collectionRef ) => {
25- match ( change )
26- . with ( { type :'created' } , change => collectionRef . value . set ( speakerId , change . createdDoc ) )
27- . with ( { type :'updated' } , change => collectionRef . value . set ( speakerId , change . updatedDoc ) )
28- . with ( { type :'deleted' } , change => collectionRef . value . delete ( speakerId ) )
29- . exhaustive ( )
30- }
31- ) ;
20+ const firestoreAllSpeakersRef = deferredVuefireUseDocument ( [ eventDescriptorRef ] ,
21+ ( [ maybeEventDescriptor ] ) => allEventLineupSpeakersDoc ( maybeEventDescriptor ) ) ;
3222
3323 return {
3424 speakers : computed ( ( ) => {
35- const firestoreSpeakersLineup = toValue ( firestoreSpeakersRef ) ,
25+ const firestoreAllSpeakersLineup = toValue ( firestoreAllSpeakersRef ) ,
3626 eventDescriptor = toValue ( eventDescriptorRef ) ,
3727 searchTerms = toValue ( searchTermsRef ) ;
3828
39- if ( ! firestoreSpeakersLineup || ! eventDescriptor ) {
40- return undefined ;
29+ if ( ! firestoreAllSpeakersLineup || ! eventDescriptor ) {
30+ return [ ] ;
4131 }
4232
4333 const speakers = sortBy (
44- [ ...firestoreSpeakersLineup . values ( ) ]
34+ [ ...Object . values ( firestoreAllSpeakersLineup ) ]
4535 . map ( fSpeaker => createVoxxrinSpeakerFromFirestore ( eventDescriptor , fSpeaker ) )
4636 . filter ( speaker => speakerMatchesSearchTerms ( speaker , searchTerms ) ) ,
4737 sp => sp . fullName
@@ -71,16 +61,12 @@ export function useLineupSpeaker(eventDescriptorRef: Ref<VoxxrinConferenceDescri
7161 }
7262}
7363
74- export function eventLineupSpeakersCollections ( eventDescriptor : VoxxrinConferenceDescriptor | undefined ) {
75- if ( ! eventDescriptor || ! eventDescriptor . id || ! eventDescriptor . id . value ) {
76- return [ ] ;
64+ export function allEventLineupSpeakersDoc ( maybeEventDescriptor : VoxxrinConferenceDescriptor | undefined ) {
65+ if ( ! maybeEventDescriptor || ! maybeEventDescriptor . id || ! maybeEventDescriptor . id . value ) {
66+ return undefined ;
7767 }
7868
79- return [
80- collection ( db ,
81- `${ resolvedEventFirestorePath ( eventDescriptor . id . value , eventDescriptor . spaceToken ?. value ) } /speakers`
82- ) as CollectionReference < LineupSpeaker >
83- ] ;
69+ return doc ( db , `${ resolvedEventFirestorePath ( maybeEventDescriptor . id . value , maybeEventDescriptor . spaceToken ?. value ) } /speakers-allInOne/self` ) as DocumentReference < Record < string , LineupSpeaker > > ;
8470}
8571
8672export function eventLineupSpeakerDocument ( eventDescriptor : VoxxrinConferenceDescriptor | undefined , speakerId : SpeakerId | undefined ) {
@@ -99,13 +85,14 @@ export async function prepareEventSpeakers(user: User, conferenceDescriptor: Vox
9985 async ( ) => {
10086 PERF_LOGGER . debug ( `eventTalkPreparation(eventId=${ conferenceDescriptor . id . value } )` )
10187
102- const speakersColl = eventLineupSpeakersCollections ( conferenceDescriptor ) [ 0 ] ;
103- const speakers = await getDocs ( speakersColl )
88+ const maybeAllSpeakersDoc = allEventLineupSpeakersDoc ( conferenceDescriptor ) ;
89+ const allSpeakersById = await match ( maybeAllSpeakersDoc )
90+ . with ( P . nullish , async ( ) => ( { } as Record < string , LineupSpeaker > ) )
91+ . otherwise ( async allSpeakersDoc => ( await getDoc ( allSpeakersDoc ) ) . data ( ) || { } ) ;
10492
105- promisesQueue . addAll ( speakers . docs . map ( speaker => ( ) => {
106- const speakerData = speaker . data ( )
107- if ( speakerData . photoUrl ) {
108- return loadSpeakerUrl ( speakerData . photoUrl ) ;
93+ promisesQueue . addAll ( Object . values ( allSpeakersById ) . map ( speaker => ( ) => {
94+ if ( speaker . photoUrl ) {
95+ return loadSpeakerUrl ( speaker . photoUrl ) ;
10996 }
11097 } ) , { priority : 100 } ) ;
11198 } ) , { priority : 1000 } ) ;
0 commit comments