@glissandoo/lib 1.126.0 → 1.128.0

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.
Files changed (42) hide show
  1. package/functions/event.d.ts +13 -0
  2. package/functions/group.d.ts +1 -0
  3. package/functions/groupPlayer.d.ts +6 -0
  4. package/functions/index.d.ts +3 -0
  5. package/functions/index.js +3 -0
  6. package/functions/regions.js +3 -0
  7. package/functions/user.d.ts +1 -0
  8. package/helpers/appScenes.d.ts +1 -0
  9. package/helpers/appScenes.js +1 -0
  10. package/helpers/errors.d.ts +5 -0
  11. package/helpers/errors.js +5 -0
  12. package/helpers/plans.d.ts +2 -0
  13. package/helpers/plans.js +5 -1
  14. package/lang/ca.json +2 -0
  15. package/lang/de.json +2 -0
  16. package/lang/en.json +2 -0
  17. package/lang/es.json +2 -0
  18. package/lang/eu.json +2 -0
  19. package/lang/fr.json +2 -0
  20. package/lang/gl.json +2 -0
  21. package/lang/it.json +2 -0
  22. package/lang/nl.json +2 -0
  23. package/lang/pt.json +2 -0
  24. package/models/Evento/Player/basic.d.ts +0 -1
  25. package/models/Evento/Player/basic.js +0 -3
  26. package/models/Evento/Player/index.d.ts +0 -1
  27. package/models/Evento/Player/index.js +0 -3
  28. package/models/Evento/index.d.ts +3 -0
  29. package/models/Evento/index.js +10 -0
  30. package/models/Evento/types.d.ts +2 -0
  31. package/models/Evento/types.js +1 -0
  32. package/models/Group/Player/index.d.ts +2 -0
  33. package/models/Group/Player/index.js +6 -0
  34. package/models/Group/index.d.ts +16 -2
  35. package/models/Group/index.js +20 -3
  36. package/models/Group/types.d.ts +26 -4
  37. package/models/Group/types.js +9 -1
  38. package/models/Notification/types.d.ts +1 -0
  39. package/models/Notification/types.js +1 -0
  40. package/models/Partnership/index.d.ts +1 -1
  41. package/models/Partnership/types.d.ts +17 -3
  42. package/package.json +1 -1
@@ -10,6 +10,19 @@ export declare namespace EventoFbFunctionsTypes {
10
10
  Future = "future",
11
11
  All = "all"
12
12
  }
13
+ export interface RefreshGuestInviteCodeParams {
14
+ eventId: string;
15
+ }
16
+ export interface RefreshGuestInviteCodeResult {
17
+ code: string;
18
+ }
19
+ export interface VerifyGuestInviteCodeParams {
20
+ eventId: string;
21
+ code: string;
22
+ }
23
+ export interface VerifyGuestInviteCodeResult {
24
+ alreadyJoined: boolean;
25
+ }
13
26
  export interface PublishParams {
14
27
  type: EventType;
15
28
  displayName: string | null;
@@ -69,6 +69,7 @@ export declare namespace GroupFbFunctionsTypes {
69
69
  interface GetByIdResult extends GroupBasicData {
70
70
  id: string;
71
71
  instruments: GroupData['instruments'];
72
+ customFields: GroupData['customFields'];
72
73
  }
73
74
  interface GetByInvitationLinkParams {
74
75
  invitationLink: string;
@@ -36,6 +36,7 @@ export declare namespace GroupPlayerFbFunctionsTypes {
36
36
  groupId: string;
37
37
  mainInstrument: InstrumentId;
38
38
  instruments: InstrumentId[];
39
+ customFields?: Record<string, string | number | boolean | null>;
39
40
  }
40
41
  type JoinGroupResult = void;
41
42
  interface LeaveParams {
@@ -47,6 +48,11 @@ export declare namespace GroupPlayerFbFunctionsTypes {
47
48
  userIds: string[];
48
49
  }
49
50
  type RemoveResult = void;
51
+ interface PromoteGuestParams {
52
+ groupId: string;
53
+ userId: string;
54
+ }
55
+ type PromoteGuestResult = void;
50
56
  interface UpdateInstrumentsParams {
51
57
  playerId?: string;
52
58
  groupId: string;
@@ -62,6 +62,8 @@ export declare enum FbFunctionName {
62
62
  EventoMyPayments = "event-myPayments",
63
63
  EventPublish = "event-publish",
64
64
  EventRemove = "event-remove",
65
+ EventRefreshGuestInviteCode = "event-refreshGuestInviteCode",
66
+ EventVerifyGuestInviteCode = "event-verifyGuestInviteCode",
65
67
  EventRepertoryDownload = "eventRepertory-download",
66
68
  EventRepertoryDownloadPdf = "eventRepertory-downloadPdf",
67
69
  EventRepertoryEdit = "eventRepertory-edit",
@@ -106,6 +108,7 @@ export declare enum FbFunctionName {
106
108
  GroupPlayerLinkFakeAccount = "groupPlayer-linkFakeAccount",
107
109
  GroupPlayerOnUpdate = "groupPlayer-onUpdate",
108
110
  GroupPlayerRemove = "groupPlayer-remove",
111
+ GroupPlayerPromoteGuest = "groupPlayer-promoteGuest",
109
112
  GroupPlayerEditFakeInfo = "groupPlayer-editFakeInfo",
110
113
  GroupPlayerSetPermissions = "groupPlayer-updatePermis",
111
114
  GroupPlayerUpdateInstruments = "groupPlayer-updateInstruments",
@@ -66,6 +66,8 @@ var FbFunctionName;
66
66
  FbFunctionName["EventoMyPayments"] = "event-myPayments";
67
67
  FbFunctionName["EventPublish"] = "event-publish";
68
68
  FbFunctionName["EventRemove"] = "event-remove";
69
+ FbFunctionName["EventRefreshGuestInviteCode"] = "event-refreshGuestInviteCode";
70
+ FbFunctionName["EventVerifyGuestInviteCode"] = "event-verifyGuestInviteCode";
69
71
  FbFunctionName["EventRepertoryDownload"] = "eventRepertory-download";
70
72
  FbFunctionName["EventRepertoryDownloadPdf"] = "eventRepertory-downloadPdf";
71
73
  FbFunctionName["EventRepertoryEdit"] = "eventRepertory-edit";
@@ -110,6 +112,7 @@ var FbFunctionName;
110
112
  FbFunctionName["GroupPlayerLinkFakeAccount"] = "groupPlayer-linkFakeAccount";
111
113
  FbFunctionName["GroupPlayerOnUpdate"] = "groupPlayer-onUpdate";
112
114
  FbFunctionName["GroupPlayerRemove"] = "groupPlayer-remove";
115
+ FbFunctionName["GroupPlayerPromoteGuest"] = "groupPlayer-promoteGuest";
113
116
  FbFunctionName["GroupPlayerEditFakeInfo"] = "groupPlayer-editFakeInfo";
114
117
  FbFunctionName["GroupPlayerSetPermissions"] = "groupPlayer-updatePermis";
115
118
  FbFunctionName["GroupPlayerUpdateInstruments"] = "groupPlayer-updateInstruments";
@@ -73,6 +73,8 @@ const regionByFunctions = {
73
73
  [index_1.FbFunctionName.EventoMyPayments]: GCloudRegions.EuropeWest6,
74
74
  [index_1.FbFunctionName.EventPublish]: GCloudRegions.UsCentral1,
75
75
  [index_1.FbFunctionName.EventRemove]: GCloudRegions.UsCentral1,
76
+ [index_1.FbFunctionName.EventRefreshGuestInviteCode]: GCloudRegions.EuropeWest6,
77
+ [index_1.FbFunctionName.EventVerifyGuestInviteCode]: GCloudRegions.EuropeWest6,
76
78
  [index_1.FbFunctionName.EventRepertoryDownload]: GCloudRegions.EuropeWest6,
77
79
  [index_1.FbFunctionName.EventRepertoryDownloadPdf]: GCloudRegions.EuropeWest6,
78
80
  [index_1.FbFunctionName.EventRepertoryEdit]: GCloudRegions.UsCentral1,
@@ -118,6 +120,7 @@ const regionByFunctions = {
118
120
  [index_1.FbFunctionName.GroupPlayerLeave]: GCloudRegions.UsCentral1,
119
121
  [index_1.FbFunctionName.GroupPlayerOnUpdate]: GCloudRegions.UsCentral1,
120
122
  [index_1.FbFunctionName.GroupPlayerRemove]: GCloudRegions.UsCentral1,
123
+ [index_1.FbFunctionName.GroupPlayerPromoteGuest]: GCloudRegions.EuropeWest6,
121
124
  [index_1.FbFunctionName.GroupPlayerSetPermissions]: GCloudRegions.EuropeWest6,
122
125
  [index_1.FbFunctionName.GroupPlayerUpdateInstruments]: GCloudRegions.UsCentral1,
123
126
  [index_1.FbFunctionName.GroupPaymentCreate]: GCloudRegions.EuropeWest6,
@@ -26,6 +26,7 @@ export declare namespace UserFbFunctionsTypes {
26
26
  interface JoinEventParams {
27
27
  eventId: string;
28
28
  instrument?: string;
29
+ code: string;
29
30
  }
30
31
  type JoinEventResult = void;
31
32
  interface RecoveryPasswordParams {
@@ -78,6 +78,7 @@ export declare enum AppScenes {
78
78
  Join = "Join",
79
79
  JoinImageProfile = "AddProfileImage",
80
80
  JoinInstrument = "SelectGroupInstrument",
81
+ JoinCompleteProfile = "JoinCompleteProfile",
81
82
  JoinView = "JoinView",
82
83
  Login = "Login",
83
84
  GroupPaymentDetail = "GroupPaymentDetail",
@@ -82,6 +82,7 @@ var AppScenes;
82
82
  AppScenes["Join"] = "Join";
83
83
  AppScenes["JoinImageProfile"] = "AddProfileImage";
84
84
  AppScenes["JoinInstrument"] = "SelectGroupInstrument";
85
+ AppScenes["JoinCompleteProfile"] = "JoinCompleteProfile";
85
86
  AppScenes["JoinView"] = "JoinView";
86
87
  AppScenes["Login"] = "Login";
87
88
  AppScenes["GroupPaymentDetail"] = "GroupPaymentDetail";
@@ -8,6 +8,7 @@ export declare enum HttpsErrorMessages {
8
8
  InvalidGroupPartnership = "error.group.partnership",
9
9
  InvalidAdminGroup = "error.group.noAdmin",
10
10
  InvalidPermissionsGroup = "error.group.noPermissions",
11
+ GuestCannotBeAdmin = "error.group.guestCannotBeAdmin",
11
12
  InvalidAdminAction = "error.federation.admin",
12
13
  InvalidLinkInvitation = "groupPlayer.join.linkNoValid",
13
14
  InvalidJoinPlayer = "groupPlayer.join.isPlayer",
@@ -20,6 +21,10 @@ export declare enum HttpsErrorMessages {
20
21
  InvalidEventPlayer = "error.event.noPlayer",
21
22
  InvalidMaxNumberEvents = "error.event.maxEventsPublish",
22
23
  InvalidMaxCapacityEvent = "error.event.capacityCompleted",
24
+ EventInvitationLinkNotActive = "error.event.invitationLinkNotActive",
25
+ EventNotAcceptingJoins = "error.event.notAcceptingJoins",
26
+ EventGuestsLimitReached = "error.event.guestsLimitReached",
27
+ EventInvitationCodeInvalid = "error.event.invitationCodeInvalid",
23
28
  InvalidScoreNotByInstrumentsEventRepertory = "error.eventRepertory.scoreNotByInstruments",
24
29
  InvalidUser = "error.user.noValid",
25
30
  InvalidSuperAdmin = "error.superadmin.noValid",
package/helpers/errors.js CHANGED
@@ -9,6 +9,7 @@ var HttpsErrorMessages;
9
9
  HttpsErrorMessages["InvalidGroupPartnership"] = "error.group.partnership";
10
10
  HttpsErrorMessages["InvalidAdminGroup"] = "error.group.noAdmin";
11
11
  HttpsErrorMessages["InvalidPermissionsGroup"] = "error.group.noPermissions";
12
+ HttpsErrorMessages["GuestCannotBeAdmin"] = "error.group.guestCannotBeAdmin";
12
13
  HttpsErrorMessages["InvalidAdminAction"] = "error.federation.admin";
13
14
  HttpsErrorMessages["InvalidLinkInvitation"] = "groupPlayer.join.linkNoValid";
14
15
  HttpsErrorMessages["InvalidJoinPlayer"] = "groupPlayer.join.isPlayer";
@@ -21,6 +22,10 @@ var HttpsErrorMessages;
21
22
  HttpsErrorMessages["InvalidEventPlayer"] = "error.event.noPlayer";
22
23
  HttpsErrorMessages["InvalidMaxNumberEvents"] = "error.event.maxEventsPublish";
23
24
  HttpsErrorMessages["InvalidMaxCapacityEvent"] = "error.event.capacityCompleted";
25
+ HttpsErrorMessages["EventInvitationLinkNotActive"] = "error.event.invitationLinkNotActive";
26
+ HttpsErrorMessages["EventNotAcceptingJoins"] = "error.event.notAcceptingJoins";
27
+ HttpsErrorMessages["EventGuestsLimitReached"] = "error.event.guestsLimitReached";
28
+ HttpsErrorMessages["EventInvitationCodeInvalid"] = "error.event.invitationCodeInvalid";
24
29
  HttpsErrorMessages["InvalidScoreNotByInstrumentsEventRepertory"] = "error.eventRepertory.scoreNotByInstruments";
25
30
  HttpsErrorMessages["InvalidUser"] = "error.user.noValid";
26
31
  HttpsErrorMessages["InvalidSuperAdmin"] = "error.superadmin.noValid";
@@ -11,6 +11,8 @@ export declare enum PlanPeriod {
11
11
  Monthly = "monthly"
12
12
  }
13
13
  export declare const membersPerPlan: Record<PlansGroup, number>;
14
+ export declare const MAX_GUESTS_PER_EVENT = 10;
15
+ export declare const GUEST_INVITE_CODE_LENGTH = 6;
14
16
  export declare const pricesPerPlan: Record<PlanPeriod, Record<PlansGroup, number>>;
15
17
  export declare const planGroupTiers: {
16
18
  min: number;
package/helpers/plans.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.planGroupTiers = exports.pricesPerPlan = exports.membersPerPlan = exports.PlanPeriod = exports.PlansGroup = void 0;
3
+ exports.planGroupTiers = exports.pricesPerPlan = exports.GUEST_INVITE_CODE_LENGTH = exports.MAX_GUESTS_PER_EVENT = exports.membersPerPlan = exports.PlanPeriod = exports.PlansGroup = void 0;
4
4
  var PlansGroup;
5
5
  (function (PlansGroup) {
6
6
  PlansGroup["Piano"] = "piano";
@@ -23,6 +23,10 @@ exports.membersPerPlan = {
23
23
  [PlansGroup.Fortissimo]: 100,
24
24
  [PlansGroup.Tutti]: 1000,
25
25
  };
26
+ // Max reinforcements (guests) allowed per event, independent of the plan tier.
27
+ exports.MAX_GUESTS_PER_EVENT = 10;
28
+ // Number of digits of the event guest invitation code.
29
+ exports.GUEST_INVITE_CODE_LENGTH = 6;
26
30
  exports.pricesPerPlan = {
27
31
  [PlanPeriod.Monthly]: {
28
32
  [PlansGroup.Piano]: 0,
package/lang/ca.json CHANGED
@@ -27,6 +27,8 @@
27
27
  "communication.newComment.text": "{string:user.0.displayName} ha deixat un comentari en una publicació",
28
28
  "communication.newComment.title": "💬 Nou comentari",
29
29
  "event": "Esdeveniment",
30
+ "event.guest.joined.text": "{string:user.0.displayName} s'ha unit com a reforç a {string:event.0.displayName}",
31
+ "event.guest.joined.title": "🎺 Nou reforç",
30
32
  "group.delete.text": "El grup {string:group.0.displayName} ha sigut eliminat",
31
33
  "group.delete.title": "Grup eliminat",
32
34
  "group.onboarding.attendance.text": "Qui està disponible per a l'assaig? 😍 Descobreix-ho amb llistes senzilles d'assistència 🙋‍♀️",
package/lang/de.json CHANGED
@@ -27,6 +27,8 @@
27
27
  "communication.newComment.text": "{string:user.0.displayName} hat einen Kommentar zu einem Beitrag hinterlassen",
28
28
  "communication.newComment.title": "💬 Neuer Kommentar",
29
29
  "event": "Veranstaltung",
30
+ "event.guest.joined.text": "{string:user.0.displayName} ist {string:event.0.displayName} als Verstärkung beigetreten",
31
+ "event.guest.joined.title": "🎺 Neue Verstärkung",
30
32
  "group.delete.text": "Die Gruppe {string:group.0.displayName} wurde gelöscht",
31
33
  "group.delete.title": "Gruppe gelöscht",
32
34
  "group.onboarding.attendance.text": "Wer ist bei der Probe verfügbar? 😍 Erfahre es über einfache Anwesenheitslisten 🙋‍♀️",
package/lang/en.json CHANGED
@@ -27,6 +27,8 @@
27
27
  "communication.newComment.text": "{string:user.0.displayName} left a comment on a post",
28
28
  "communication.newComment.title": "💬 New comment",
29
29
  "event": "Event",
30
+ "event.guest.joined.text": "{string:user.0.displayName} has joined {string:event.0.displayName} as a reinforcement",
31
+ "event.guest.joined.title": "🎺 New reinforcement",
30
32
  "group.delete.text": "The group {string:group.0.displayName} has been deleted",
31
33
  "group.delete.title": "Group deleted",
32
34
  "group.onboarding.attendance.text": "Who's available for rehearsal? 😍 Find out through simple attendance lists 🙋‍♀️",
package/lang/es.json CHANGED
@@ -27,6 +27,8 @@
27
27
  "communication.newComment.text": "{string:user.0.displayName} ha dejado un comentario en una publicación",
28
28
  "communication.newComment.title": "💬 Nuevo comentario",
29
29
  "event": "Evento",
30
+ "event.guest.joined.text": "{string:user.0.displayName} se ha unido como refuerzo a {string:event.0.displayName}",
31
+ "event.guest.joined.title": "🎺 Nuevo refuerzo",
30
32
  "group.delete.text": "El grupo {string:group.0.displayName} ha sido eliminado",
31
33
  "group.delete.title": "Grupo eliminado",
32
34
  "group.onboarding.attendance.text": "¿Quién está disponible para el ensayo? 😍 Descúbrelo a través de listas sencillas de asistencia 🙋‍♀️",
package/lang/eu.json CHANGED
@@ -27,6 +27,8 @@
27
27
  "communication.newComment.text": "{string:user.0.displayName} erabiltzaileak iruzkin bat utzi du argitalpen batean",
28
28
  "communication.newComment.title": "💬 Iruzkin berria",
29
29
  "event": "Ekitaldia",
30
+ "event.guest.joined.text": "{string:user.0.displayName} indargarri gisa batu da {string:event.0.displayName} ekitaldira",
31
+ "event.guest.joined.title": "🎺 Indargarri berria",
30
32
  "group.delete.text": "{string:group.0.displayName} taldea ezabatu da",
31
33
  "group.delete.title": "Taldea ezabatuta",
32
34
  "group.onboarding.attendance.text": "Nork parte har dezake entseguan? 😍 Ezagutu erantzun sinpleekin 🙋‍♀️",
package/lang/fr.json CHANGED
@@ -27,6 +27,8 @@
27
27
  "communication.newComment.text": "{string:user.0.displayName} a laissé un commentaire sur une publication",
28
28
  "communication.newComment.title": "💬 Nouveau commentaire",
29
29
  "event": "Événement",
30
+ "event.guest.joined.text": "{string:user.0.displayName} a rejoint {string:event.0.displayName} en renfort",
31
+ "event.guest.joined.title": "🎺 Nouveau renfort",
30
32
  "group.delete.text": "Le groupe {string:group.0.displayName} a été supprimé",
31
33
  "group.delete.title": "Groupe supprimé",
32
34
  "group.onboarding.attendance.text": "Qui est disponible pour la répétition ? 😍 Découvrez-le grâce à des listes de présence simples 🙋‍♀️",
package/lang/gl.json CHANGED
@@ -27,6 +27,8 @@
27
27
  "communication.newComment.text": "{string:user.0.displayName} deixou un comentario nunha publicación",
28
28
  "communication.newComment.title": "💬 Novo comentario",
29
29
  "event": "Evento",
30
+ "event.guest.joined.text": "{string:user.0.displayName} uniuse como reforzo a {string:event.0.displayName}",
31
+ "event.guest.joined.title": "🎺 Novo reforzo",
30
32
  "group.delete.text": "O grupo {string:group.0.displayName} foi eliminado",
31
33
  "group.delete.title": "Grupo eliminado",
32
34
  "group.onboarding.attendance.text": "¿Quen está dispoñible para o ensaio? 😍 Descúbreo con listas sinxelas de asistencia 🙋‍♀️",
package/lang/it.json CHANGED
@@ -27,6 +27,8 @@
27
27
  "communication.newComment.text": "{string:user.0.displayName} ha lasciato un commento su un post",
28
28
  "communication.newComment.title": "💬 Nuovo commento",
29
29
  "event": "Evento",
30
+ "event.guest.joined.text": "{string:user.0.displayName} si è unito a {string:event.0.displayName} come rinforzo",
31
+ "event.guest.joined.title": "🎺 Nuovo rinforzo",
30
32
  "group.delete.text": "Il gruppo {string:group.0.displayName} è stato eliminato",
31
33
  "group.delete.title": "Gruppo eliminato",
32
34
  "group.onboarding.attendance.text": "Chi è disponibile per la prova? 😍 Scoprilo tramite semplici liste di presenza 🙋‍♀️",
package/lang/nl.json CHANGED
@@ -27,6 +27,8 @@
27
27
  "communication.newComment.text": "{string:user.0.displayName} heeft een reactie achtergelaten op een bericht",
28
28
  "communication.newComment.title": "💬 Nieuwe reactie",
29
29
  "event": "Evenement",
30
+ "event.guest.joined.text": "{string:user.0.displayName} heeft zich als versterking bij {string:event.0.displayName} aangesloten",
31
+ "event.guest.joined.title": "🎺 Nieuwe versterking",
30
32
  "group.delete.text": "De groep {string:group.0.displayName} is verwijderd",
31
33
  "group.delete.title": "Groep verwijderd",
32
34
  "group.onboarding.attendance.text": "Wie is beschikbaar voor de repetitie? 😍 Ontdek het via eenvoudige aanwezigheidslijsten 🙋‍♀️",
package/lang/pt.json CHANGED
@@ -27,6 +27,8 @@
27
27
  "communication.newComment.text": "{string:user.0.displayName} deixou um comentário em uma publicação",
28
28
  "communication.newComment.title": "💬 Novo comentário",
29
29
  "event": "Evento",
30
+ "event.guest.joined.text": "{string:user.0.displayName} juntou-se a {string:event.0.displayName} como reforço",
31
+ "event.guest.joined.title": "🎺 Novo reforço",
30
32
  "group.delete.text": "O grupo {string:group.0.displayName} foi excluído",
31
33
  "group.delete.title": "Grupo excluído",
32
34
  "group.onboarding.attendance.text": "Quem está disponível para o ensaio? 😍 Descubra por meio de listas simples de presença 🙋‍♀️",
@@ -12,7 +12,6 @@ export default class EventoPlayerBasic {
12
12
  get photoURL(): string;
13
13
  get mainInstrument(): import("../../../helpers/instruments").InstrumentId;
14
14
  get isGuest(): boolean;
15
- get isGroupPlayer(): boolean;
16
15
  get status(): EventPlayerStatus | null;
17
16
  get reason(): import("./types").EventPlayerReason | null;
18
17
  get note(): string | null;
@@ -31,9 +31,6 @@ class EventoPlayerBasic {
31
31
  get isGuest() {
32
32
  return this.data.isGuest || false;
33
33
  }
34
- get isGroupPlayer() {
35
- return !this.isGuest;
36
- }
37
34
  get status() {
38
35
  return this.data.status || null;
39
36
  }
@@ -9,7 +9,6 @@ export default class EventoPlayer extends PlayerBasic<EventPlayerData> {
9
9
  get eventId(): string;
10
10
  get status(): EventPlayerStatus | null;
11
11
  get isGuest(): boolean;
12
- get isGroupPlayer(): boolean;
13
12
  get isConfirmed(): boolean;
14
13
  get isDeclined(): boolean;
15
14
  get isPending(): boolean;
@@ -27,9 +27,6 @@ class EventoPlayer extends basic_1.default {
27
27
  get isGuest() {
28
28
  return this.data.isGuest || false;
29
29
  }
30
- get isGroupPlayer() {
31
- return !this.isGuest;
32
- }
33
30
  get isConfirmed() {
34
31
  return this.status === types_1.EventPlayerStatus.Confirmed;
35
32
  }
@@ -26,10 +26,13 @@ export default class Evento extends EventoPromoter<EventData> {
26
26
  get playerIds(): string[];
27
27
  get players(): Record<string, import("./types").EventPlayerBasicData>;
28
28
  get playersCount(): number;
29
+ get guestIds(): string[];
30
+ get guestsCount(): number;
29
31
  get repertory(): Record<string, import("./types").EventThemeBasicData>;
30
32
  get repertoryIds(): string[];
31
33
  get repertoryCount(): number;
32
34
  get activeInvitationLink(): boolean;
35
+ get guestInviteCode(): string | null;
33
36
  get invitationLink(): string;
34
37
  get shortDynamicLink(): string;
35
38
  get deletedAt(): FirebaseFirestore.Timestamp | null;
@@ -62,6 +62,13 @@ class Evento extends promoter_1.default {
62
62
  get playersCount() {
63
63
  return this.data.playerIds.length;
64
64
  }
65
+ // Ids of reinforcements (guests) currently participating in this event.
66
+ get guestIds() {
67
+ return this.playerIds.filter((playerId) => this.players[playerId]?.isGuest === true);
68
+ }
69
+ get guestsCount() {
70
+ return this.guestIds.length;
71
+ }
65
72
  get repertory() {
66
73
  return this.data.repertory || {};
67
74
  }
@@ -74,6 +81,9 @@ class Evento extends promoter_1.default {
74
81
  get activeInvitationLink() {
75
82
  return this.data.activeInvitationLink || false;
76
83
  }
84
+ get guestInviteCode() {
85
+ return this.data.guestInviteCode || null;
86
+ }
77
87
  get invitationLink() {
78
88
  const link = `https://glissandoo.com/joinevent/${this.id}`;
79
89
  if (lang_1.LanguagesTypes.ES === this.lang) {
@@ -23,6 +23,7 @@ export declare enum EventHistoryAction {
23
23
  EditReminders = "edit_reminders",
24
24
  PlayerAdd = "player_add",
25
25
  PlayerRemove = "player_remove",
26
+ GuestJoined = "guest_joined",
26
27
  PlayerStatusChange = "player_status_change",
27
28
  RepertoireAdd = "repertoire_add",
28
29
  RepertoireRemove = "repertoire_remove",
@@ -158,6 +159,7 @@ export interface EventData extends EventPromoterData {
158
159
  repertory: Record<string, EventThemeBasicData>;
159
160
  relEvents: string[];
160
161
  activeInvitationLink: boolean;
162
+ guestInviteCode: string | null;
161
163
  shortDynamicLink: string | null;
162
164
  invitationLink: string | null;
163
165
  notifyAt: Timestamp;
@@ -18,6 +18,7 @@ var EventHistoryAction;
18
18
  EventHistoryAction["EditReminders"] = "edit_reminders";
19
19
  EventHistoryAction["PlayerAdd"] = "player_add";
20
20
  EventHistoryAction["PlayerRemove"] = "player_remove";
21
+ EventHistoryAction["GuestJoined"] = "guest_joined";
21
22
  EventHistoryAction["PlayerStatusChange"] = "player_status_change";
22
23
  EventHistoryAction["RepertoireAdd"] = "repertoire_add";
23
24
  EventHistoryAction["RepertoireRemove"] = "repertoire_remove";
@@ -14,6 +14,8 @@ export default class GroupPlayer extends UserExtended<GroupPlayerData> {
14
14
  get instrumentsLastUpdatedBy(): string | null;
15
15
  get role(): GroupPlayerRole;
16
16
  get isAdmin(): boolean;
17
+ get isGuest(): boolean;
18
+ get isMember(): boolean;
17
19
  get permissions(): import("../types").AdminPermissions[];
18
20
  get joinedAt(): FirebaseFirestore.Timestamp;
19
21
  get leavedAt(): FirebaseFirestore.Timestamp | null;
@@ -38,6 +38,12 @@ class GroupPlayer extends extended_1.default {
38
38
  get isAdmin() {
39
39
  return this.role === types_1.GroupPlayerRole.Admin;
40
40
  }
41
+ get isGuest() {
42
+ return this.role === types_1.GroupPlayerRole.Guest;
43
+ }
44
+ get isMember() {
45
+ return !this.isGuest;
46
+ }
41
47
  get permissions() {
42
48
  return this.data.permissions || [];
43
49
  }
@@ -10,7 +10,7 @@ export default class Group extends GroupBasic<GroupData> {
10
10
  constructor(doc: DocumentModel, lang?: LanguagesTypes);
11
11
  get owner(): DocumentReference;
12
12
  get playerIds(): string[];
13
- get players(): Record<string, import("../Player/types").PlayerBasicData>;
13
+ get players(): Record<string, import("./types").GroupPlayerBasicData>;
14
14
  get playersCount(): number;
15
15
  get description(): string | null;
16
16
  get addresses(): import("./types").GroupAddressData[];
@@ -36,8 +36,22 @@ export default class Group extends GroupBasic<GroupData> {
36
36
  get currency(): string;
37
37
  get currencySymbol(): string;
38
38
  get activePlayers(): string[];
39
+ get guestIds(): string[];
40
+ get activeMembers(): string[];
41
+ isGuestPlayer: (userId: string) => boolean;
39
42
  get playersList(): {
40
43
  id: string;
44
+ isGuest?: boolean | undefined;
45
+ mainInstrument: import("../../helpers/instruments").InstrumentId;
46
+ username: string;
47
+ name: string;
48
+ lastname: string;
49
+ displayName: string;
50
+ photoURL: string;
51
+ }[];
52
+ get membersList(): {
53
+ id: string;
54
+ isGuest?: boolean | undefined;
41
55
  mainInstrument: import("../../helpers/instruments").InstrumentId;
42
56
  username: string;
43
57
  name: string;
@@ -74,7 +88,7 @@ export default class Group extends GroupBasic<GroupData> {
74
88
  last: number;
75
89
  };
76
90
  get metadata(): Record<string, string>;
77
- getPlayer: (userId: string) => import("../Player/types").PlayerBasicData | null;
91
+ getPlayer: (userId: string) => import("./types").GroupPlayerBasicData | null;
78
92
  isAdmin: (userId: string) => boolean;
79
93
  isPlayer: (userId: string) => boolean;
80
94
  /** @deprecated use isUpgradeRequired */
@@ -17,6 +17,9 @@ const types_1 = require("./types");
17
17
  class Group extends basic_1.default {
18
18
  constructor(doc, lang = lang_1.defaultLocale) {
19
19
  super(doc, lang);
20
+ this.isGuestPlayer = (userId) => {
21
+ return this.players[userId]?.isGuest === true;
22
+ };
20
23
  this.getPlayer = (userId) => {
21
24
  return userId in this.players ? this.players[userId] : null;
22
25
  };
@@ -118,6 +121,15 @@ class Group extends basic_1.default {
118
121
  get activePlayers() {
119
122
  return Object.keys(this.players);
120
123
  }
124
+ // Reinforcements (guests) are members at the data level but excluded from
125
+ // plan limits and the normal member flows.
126
+ get guestIds() {
127
+ return this.activePlayers.filter((playerId) => this.players[playerId]?.isGuest === true);
128
+ }
129
+ // Regular members, excluding guests. Use this for plan limit calculations.
130
+ get activeMembers() {
131
+ return this.activePlayers.filter((playerId) => this.players[playerId]?.isGuest !== true);
132
+ }
121
133
  get playersList() {
122
134
  const players = this.activePlayers.map((playerId) => ({
123
135
  ...this.players[playerId],
@@ -125,6 +137,11 @@ class Group extends basic_1.default {
125
137
  }));
126
138
  return (0, orders_1.orderByInstruments)(players, 'mainInstrument', this.instrumentsIds);
127
139
  }
140
+ // Ordered list of regular members (excludes guests). Use for member
141
+ // selection, rosters/templates and group-wide communications.
142
+ get membersList() {
143
+ return this.playersList.filter((player) => !this.players[player.id]?.isGuest);
144
+ }
128
145
  get isActive() {
129
146
  return this.exists && !this.deletedAt;
130
147
  }
@@ -210,18 +227,18 @@ class Group extends basic_1.default {
210
227
  /** @deprecated use isUpgradeRequired */
211
228
  get isExpiredTrial() {
212
229
  const isOutDateTrial = (0, date_fns_1.isPast)(this.trialEndAt);
213
- const members = this.activePlayers.length;
230
+ const members = this.activeMembers.length;
214
231
  const isAboveMembersLimitPlanFree = members > plans_1.membersPerPlan[plans_1.PlansGroup.Piano];
215
232
  return this.status !== types_1.GroupStatus.Premium && isOutDateTrial && isAboveMembersLimitPlanFree;
216
233
  }
217
234
  get isOutOfMembersLimit() {
218
- const members = this.activePlayers.length;
235
+ const members = this.activeMembers.length;
219
236
  return members > plans_1.membersPerPlan[this.planId];
220
237
  }
221
238
  get isUpgradePlanRequired() {
222
239
  const graceMembers = 4;
223
240
  const planMembers = plans_1.membersPerPlan[this.planId] + graceMembers;
224
- const members = this.activePlayers.length;
241
+ const members = this.activeMembers.length;
225
242
  return members > planMembers;
226
243
  }
227
244
  get firstAnswerAt() {
@@ -16,6 +16,7 @@ export declare enum GroupHistoryAction {
16
16
  MemberRemove = "member_remove",
17
17
  MemberInstrumentChange = "member_instrument_change",
18
18
  MemberPermissionsChange = "member_permissions_change",
19
+ GuestPromoted = "guest_promoted",
19
20
  TemplateCreated = "template_created",
20
21
  TemplateDeleted = "template_deleted",
21
22
  TemplateEdited = "template_edited",
@@ -38,6 +39,12 @@ export declare enum GroupCustomFieldType {
38
39
  LINK = "link",
39
40
  PARAGRAPH = "paragraph"
40
41
  }
42
+ export declare enum GroupCustomFieldMemberAccess {
43
+ Private = "private",
44
+ ReadOnly = "readOnly",
45
+ Editable = "editable",
46
+ Required = "required"
47
+ }
41
48
  export interface GroupCustomFieldOption {
42
49
  id: string;
43
50
  value: string;
@@ -45,9 +52,21 @@ export interface GroupCustomFieldOption {
45
52
  export interface GroupCustomField {
46
53
  label: string;
47
54
  type: GroupCustomFieldType;
48
- required: boolean;
49
- allowEditByMember: boolean;
50
- private?: boolean;
55
+ /**
56
+ * Member-facing access level. Single source of truth for visibility,
57
+ * editability and join-time enforcement.
58
+ */
59
+ memberAccess?: GroupCustomFieldMemberAccess;
60
+ /**
61
+ * @deprecated Superseded by `memberAccess`. Only retained so the one-off
62
+ * backfill can derive `memberAccess` from legacy documents.
63
+ */
64
+ required?: boolean;
65
+ /**
66
+ * @deprecated Superseded by `memberAccess`. Only retained so the one-off
67
+ * backfill can derive `memberAccess` from legacy documents.
68
+ */
69
+ allowEditByMember?: boolean;
51
70
  placeholder: string | null;
52
71
  options: GroupCustomFieldOption[];
53
72
  order: number;
@@ -148,6 +167,9 @@ export interface GroupTemplateData {
148
167
  export interface AGroupTemplateData extends GroupTemplateData {
149
168
  id: string;
150
169
  }
170
+ export interface GroupPlayerBasicData extends PlayerBasicData {
171
+ isGuest?: boolean;
172
+ }
151
173
  export interface GroupAlgoliaData extends Omit<GroupBasicData, 'location'> {
152
174
  objectID: string;
153
175
  _geoloc: {
@@ -241,7 +263,7 @@ export interface AGroupEventQuestion extends GroupEventQuestion {
241
263
  export type GroupInstruments = Partial<Record<DefaultInstrumentId, DefaultGroupInstrument>> & Record<CustomInstrumentId, CustomGroupInstrument>;
242
264
  export interface GroupData extends GroupBasicData {
243
265
  playerIds: string[];
244
- players: Record<string, PlayerBasicData>;
266
+ players: Record<string, GroupPlayerBasicData>;
245
267
  templates: Record<string, GroupTemplateData>;
246
268
  administrators: string[];
247
269
  adminPermissions: Record<string, AdminPermissions[]>;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GroupRepertoireTagDefault = exports.GroupRepertoireTagReserved = exports.SocialNetwork = exports.GroupModulePlan = exports.GroupModuleId = exports.GroupStatus = exports.GroupConfigShowAttendanceToMembers = exports.GroupConfigSitesKey = exports.GroupConfigKey = exports.AdminPermissions = exports.GroupCustomFieldType = exports.GroupHistoryAction = void 0;
3
+ exports.GroupRepertoireTagDefault = exports.GroupRepertoireTagReserved = exports.SocialNetwork = exports.GroupModulePlan = exports.GroupModuleId = exports.GroupStatus = exports.GroupConfigShowAttendanceToMembers = exports.GroupConfigSitesKey = exports.GroupConfigKey = exports.AdminPermissions = exports.GroupCustomFieldMemberAccess = exports.GroupCustomFieldType = exports.GroupHistoryAction = void 0;
4
4
  var GroupHistoryAction;
5
5
  (function (GroupHistoryAction) {
6
6
  GroupHistoryAction["Created"] = "created";
@@ -11,6 +11,7 @@ var GroupHistoryAction;
11
11
  GroupHistoryAction["MemberRemove"] = "member_remove";
12
12
  GroupHistoryAction["MemberInstrumentChange"] = "member_instrument_change";
13
13
  GroupHistoryAction["MemberPermissionsChange"] = "member_permissions_change";
14
+ GroupHistoryAction["GuestPromoted"] = "guest_promoted";
14
15
  GroupHistoryAction["TemplateCreated"] = "template_created";
15
16
  GroupHistoryAction["TemplateDeleted"] = "template_deleted";
16
17
  GroupHistoryAction["TemplateEdited"] = "template_edited";
@@ -35,6 +36,13 @@ var GroupCustomFieldType;
35
36
  GroupCustomFieldType["LINK"] = "link";
36
37
  GroupCustomFieldType["PARAGRAPH"] = "paragraph";
37
38
  })(GroupCustomFieldType = exports.GroupCustomFieldType || (exports.GroupCustomFieldType = {}));
39
+ var GroupCustomFieldMemberAccess;
40
+ (function (GroupCustomFieldMemberAccess) {
41
+ GroupCustomFieldMemberAccess["Private"] = "private";
42
+ GroupCustomFieldMemberAccess["ReadOnly"] = "readOnly";
43
+ GroupCustomFieldMemberAccess["Editable"] = "editable";
44
+ GroupCustomFieldMemberAccess["Required"] = "required";
45
+ })(GroupCustomFieldMemberAccess = exports.GroupCustomFieldMemberAccess || (exports.GroupCustomFieldMemberAccess = {}));
38
46
  var AdminPermissions;
39
47
  (function (AdminPermissions) {
40
48
  AdminPermissions["Owner"] = "owner";
@@ -18,6 +18,7 @@ export declare enum NotificationActions {
18
18
  BadgePlayedWorksUpLevel = "badgePlayedWorks.upLevel",
19
19
  CommunicationCreate = "communication.create",
20
20
  CommunicationNewComment = "communication.newComment",
21
+ EventGuestJoined = "event.guest.joined",
21
22
  GroupDelete = "group.delete",
22
23
  GroupPlayersAdd = "group.players.add",
23
24
  GroupPlayersJoin = "group.players.join",
@@ -15,6 +15,7 @@ var NotificationActions;
15
15
  NotificationActions["BadgePlayedWorksUpLevel"] = "badgePlayedWorks.upLevel";
16
16
  NotificationActions["CommunicationCreate"] = "communication.create";
17
17
  NotificationActions["CommunicationNewComment"] = "communication.newComment";
18
+ NotificationActions["EventGuestJoined"] = "event.guest.joined";
18
19
  NotificationActions["GroupDelete"] = "group.delete";
19
20
  NotificationActions["GroupPlayersAdd"] = "group.players.add";
20
21
  NotificationActions["GroupPlayersJoin"] = "group.players.join";
@@ -27,7 +27,7 @@ export default class Partnership extends PartnershipBasic<PartnershipData> {
27
27
  get boardMembers(): import("../../helpers/types").BoardMemberItem[];
28
28
  get boardDocuments(): import("../../helpers/types").BoardDocumentItem[];
29
29
  get language(): import("../../lang").LanguagesTypes;
30
- get customFields(): Record<string, import("../Group/types").GroupCustomField>;
30
+ get customFields(): Record<string, import("./types").PartnershipCustomField>;
31
31
  get customFieldsList(): APartnershipCustomField[];
32
32
  get tags(): Record<string, import("./types").PartnershipTag>;
33
33
  get tagsList(): APartnershipTag[];
@@ -1,9 +1,23 @@
1
1
  import { DocumentReference, Timestamp } from '@google-cloud/firestore';
2
2
  import { AdminItem, BasicAddressData, BoardDocumentItem, BoardMemberItem } from '../../helpers/types';
3
3
  import { LanguagesTypes } from '../../lang';
4
- import { AGroupCustomField, GroupCustomField } from '../Group/types';
5
- export type PartnershipCustomField = GroupCustomField;
6
- export type APartnershipCustomField = AGroupCustomField;
4
+ import { GroupCustomFieldOption, GroupCustomFieldType } from '../Group/types';
5
+ export interface PartnershipCustomField {
6
+ label: string;
7
+ type: GroupCustomFieldType;
8
+ required: boolean;
9
+ private?: boolean;
10
+ placeholder: string | null;
11
+ options: GroupCustomFieldOption[];
12
+ order: number;
13
+ createdAt: Timestamp;
14
+ updatedAt: Timestamp;
15
+ createdBy: string;
16
+ updatedBy: string;
17
+ }
18
+ export interface APartnershipCustomField extends PartnershipCustomField {
19
+ id: string;
20
+ }
7
21
  export interface PartnershipTag {
8
22
  label: string;
9
23
  order: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@glissandoo/lib",
3
- "version": "1.126.0",
3
+ "version": "1.128.0",
4
4
  "description": "Glissandoo library js",
5
5
  "main": "./index.js",
6
6
  "types": "./index.d.ts",