@dxos/react-ui 0.1.31-next.ea8f0bc → 0.1.32-next.77d513e

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 (75) hide show
  1. package/dist/lib/browser/index.mjs +1047 -886
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/types/src/components/IdentityList/SpaceMemberListContainer.d.ts.map +1 -1
  5. package/dist/types/src/composites/DevicesDialog/DevicesDialog.d.ts.map +1 -1
  6. package/dist/types/src/composites/JoinDialog/JoinDialog.d.ts.map +1 -1
  7. package/dist/types/src/composites/JoinDialog/JoinDialog.stories.d.ts.map +1 -1
  8. package/dist/types/src/composites/Shell/Shell.stories.d.ts.map +1 -1
  9. package/dist/types/src/composites/SpaceDialog/SpaceDialog.d.ts.map +1 -1
  10. package/dist/types/src/panels/DevicesPanel/DevicesPanel.d.ts.map +1 -1
  11. package/dist/types/src/panels/IdentityPanel/IdentityPanel.d.ts.map +1 -1
  12. package/dist/types/src/panels/JoinPanel/JoinHeading.d.ts +2 -2
  13. package/dist/types/src/panels/JoinPanel/JoinHeading.d.ts.map +1 -1
  14. package/dist/types/src/panels/JoinPanel/JoinPanel.d.ts +1 -1
  15. package/dist/types/src/panels/JoinPanel/JoinPanel.d.ts.map +1 -1
  16. package/dist/types/src/panels/JoinPanel/JoinPanelProps.d.ts +1 -1
  17. package/dist/types/src/panels/JoinPanel/JoinPanelProps.d.ts.map +1 -1
  18. package/dist/types/src/panels/JoinPanel/joinMachine.d.ts +64 -0
  19. package/dist/types/src/panels/JoinPanel/joinMachine.d.ts.map +1 -0
  20. package/dist/types/src/panels/JoinPanel/view-states/AdditionMethodSelector.d.ts +2 -5
  21. package/dist/types/src/panels/JoinPanel/view-states/AdditionMethodSelector.d.ts.map +1 -1
  22. package/dist/types/src/panels/JoinPanel/view-states/InvitationAccepted.d.ts +1 -1
  23. package/dist/types/src/panels/JoinPanel/view-states/InvitationAccepted.d.ts.map +1 -1
  24. package/dist/types/src/panels/JoinPanel/view-states/InvitationAuthenticator.d.ts +2 -2
  25. package/dist/types/src/panels/JoinPanel/view-states/InvitationAuthenticator.d.ts.map +1 -1
  26. package/dist/types/src/panels/JoinPanel/view-states/InvitationInput.d.ts +2 -2
  27. package/dist/types/src/panels/JoinPanel/view-states/InvitationInput.d.ts.map +1 -1
  28. package/dist/types/src/panels/JoinPanel/view-states/InvitationRescuer.d.ts +2 -2
  29. package/dist/types/src/panels/JoinPanel/view-states/InvitationRescuer.d.ts.map +1 -1
  30. package/dist/types/src/panels/JoinPanel/view-states/ViewState.d.ts +4 -6
  31. package/dist/types/src/panels/JoinPanel/view-states/ViewState.d.ts.map +1 -1
  32. package/dist/types/src/panels/JoinPanel/view-states/index.d.ts +0 -1
  33. package/dist/types/src/panels/JoinPanel/view-states/index.d.ts.map +1 -1
  34. package/dist/types/src/playwright/invitations-manager.d.ts.map +1 -1
  35. package/dist/types/src/translations/locales/en-US.d.ts +3 -1
  36. package/dist/types/src/translations/locales/en-US.d.ts.map +1 -1
  37. package/dist/types/src/util/index.d.ts +1 -0
  38. package/dist/types/src/util/index.d.ts.map +1 -1
  39. package/dist/types/src/util/toEmoji.d.ts +2 -0
  40. package/dist/types/src/util/toEmoji.d.ts.map +1 -0
  41. package/package.json +24 -20
  42. package/src/components/IdentityList/SpaceMemberListContainer.tsx +6 -2
  43. package/src/components/InvitationList/InvitationList.stories.tsx +1 -1
  44. package/src/components/InvitationList/InvitationListItem.tsx +1 -1
  45. package/src/composites/DevicesDialog/DevicesDialog.tsx +3 -2
  46. package/src/composites/JoinDialog/JoinDialog.stories.tsx +4 -2
  47. package/src/composites/JoinDialog/JoinDialog.tsx +4 -2
  48. package/src/composites/Shell/Shell.stories.tsx +34 -17
  49. package/src/composites/Shell/Shell.tsx +1 -1
  50. package/src/composites/SpaceDialog/SpaceDialog.tsx +3 -2
  51. package/src/panels/DevicesPanel/DevicesPanel.tsx +17 -5
  52. package/src/panels/IdentityPanel/IdentityPanel.tsx +17 -13
  53. package/src/panels/JoinPanel/JoinHeading.tsx +42 -40
  54. package/src/panels/JoinPanel/JoinPanel.tsx +143 -220
  55. package/src/panels/JoinPanel/JoinPanelProps.ts +1 -1
  56. package/src/panels/JoinPanel/joinMachine.ts +418 -0
  57. package/src/panels/JoinPanel/view-states/AdditionMethodSelector.tsx +9 -21
  58. package/src/panels/JoinPanel/view-states/IdentityAdded.tsx +7 -7
  59. package/src/panels/JoinPanel/view-states/IdentityInput.tsx +5 -5
  60. package/src/panels/JoinPanel/view-states/InvitationAccepted.tsx +23 -19
  61. package/src/panels/JoinPanel/view-states/InvitationAuthenticator.tsx +39 -29
  62. package/src/panels/JoinPanel/view-states/InvitationInput.tsx +22 -22
  63. package/src/panels/JoinPanel/view-states/InvitationRescuer.tsx +59 -42
  64. package/src/panels/JoinPanel/view-states/ViewState.tsx +12 -63
  65. package/src/panels/JoinPanel/view-states/index.ts +0 -1
  66. package/src/panels/SpacePanel/SpacePanel.tsx +1 -1
  67. package/src/playwright/invitations-manager.ts +6 -2
  68. package/src/playwright/invitations.spec.ts +14 -5
  69. package/src/stories/Invitations.stories.tsx +3 -3
  70. package/src/translations/locales/en-US.ts +6 -4
  71. package/src/util/index.ts +1 -0
  72. package/src/util/toEmoji.ts +22 -0
  73. package/dist/types/src/panels/JoinPanel/view-states/IdentitySelector.d.ts +0 -7
  74. package/dist/types/src/panels/JoinPanel/view-states/IdentitySelector.d.ts.map +0 -1
  75. package/src/panels/JoinPanel/view-states/IdentitySelector.tsx +0 -100
@@ -1 +1 @@
1
- {"version":3,"file":"InvitationInput.d.ts","sourceRoot":"","sources":["../../../../../../src/panels/JoinPanel/view-states/InvitationInput.tsx"],"names":[],"mappings":"AAWA,OAAO,EAA+B,cAAc,EAAE,MAAM,aAAa,CAAC;AAE1E,MAAM,WAAW,oBAAqB,SAAQ,cAAc;IAC1D,cAAc,EAAE,OAAO,GAAG,MAAM,CAAC;CAClC;AAED,eAAO,MAAM,eAAe,0CAA2C,oBAAoB,gBAyD1F,CAAC"}
1
+ {"version":3,"file":"InvitationInput.d.ts","sourceRoot":"","sources":["../../../../../../src/panels/JoinPanel/view-states/InvitationInput.tsx"],"names":[],"mappings":"AASA,OAAO,EAA+B,cAAc,EAAE,MAAM,aAAa,CAAC;AAE1E,MAAM,WAAW,oBAAqB,SAAQ,cAAc;IAC1D,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC;CAC1B;AAED,eAAO,MAAM,eAAe,kCAAmC,oBAAoB,gBA2DlF,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { ViewStateProps } from './ViewState';
2
2
  export interface InvitationConnectorProps extends ViewStateProps {
3
- invitationType: 'space' | 'halo';
3
+ Domain: 'Space' | 'Halo';
4
4
  }
5
- export declare const InvitationRescuer: ({ invitationType, ...viewStateProps }: InvitationConnectorProps) => JSX.Element;
5
+ export declare const InvitationRescuer: ({ Domain, ...viewStateProps }: InvitationConnectorProps) => JSX.Element;
6
6
  //# sourceMappingURL=InvitationRescuer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"InvitationRescuer.d.ts","sourceRoot":"","sources":["../../../../../../src/panels/JoinPanel/view-states/InvitationRescuer.tsx"],"names":[],"mappings":"AAWA,OAAO,EAAa,cAAc,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,WAAW,wBAAyB,SAAQ,cAAc;IAC9D,cAAc,EAAE,OAAO,GAAG,MAAM,CAAC;CAClC;AA4DD,eAAO,MAAM,iBAAiB,0CAA2C,wBAAwB,gBAsBhG,CAAC"}
1
+ {"version":3,"file":"InvitationRescuer.d.ts","sourceRoot":"","sources":["../../../../../../src/panels/JoinPanel/view-states/InvitationRescuer.tsx"],"names":[],"mappings":"AAWA,OAAO,EAA+B,cAAc,EAAE,MAAM,aAAa,CAAC;AAE1E,MAAM,WAAW,wBAAyB,SAAQ,cAAc;IAC9D,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC;CAC1B;AAwED,eAAO,MAAM,iBAAiB,kCAAmC,wBAAwB,gBA2BxF,CAAC"}
@@ -1,12 +1,10 @@
1
1
  import { ComponentProps, ComponentPropsWithoutRef } from 'react';
2
- import type { AuthenticatingInvitationObservable, Identity } from '@dxos/client';
3
- import { JoinDispatch } from '../JoinPanelProps';
2
+ import { JoinSend, JoinState } from '../joinMachine';
4
3
  export interface ViewStateProps extends ComponentProps<'div'> {
5
4
  active: boolean;
6
- dispatch: JoinDispatch;
7
- selectedIdentity?: true | Identity;
8
- activeInvitation?: true | AuthenticatingInvitationObservable;
5
+ joinSend: JoinSend;
6
+ joinState?: JoinState;
9
7
  }
10
8
  export declare const ViewStateHeading: ({ children, className, ...props }: ComponentPropsWithoutRef<'h2'>) => JSX.Element;
11
- export declare const ViewState: ({ active, children, className, dispatch, selectedIdentity, activeInvitation, ...props }: ViewStateProps) => JSX.Element;
9
+ export declare const ViewState: ({ active, children, className, joinSend, joinState, ...props }: ViewStateProps) => JSX.Element;
12
10
  //# sourceMappingURL=ViewState.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ViewState.d.ts","sourceRoot":"","sources":["../../../../../../src/panels/JoinPanel/view-states/ViewState.tsx"],"names":[],"mappings":"AAKA,OAAc,EAAE,cAAc,EAAE,wBAAwB,EAAsB,MAAM,OAAO,CAAC;AAE5F,OAAO,KAAK,EAAE,kCAAkC,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAOjF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,WAAW,cAAe,SAAQ,cAAc,CAAC,KAAK,CAAC;IAC3D,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,YAAY,CAAC;IACvB,gBAAgB,CAAC,EAAE,IAAI,GAAG,QAAQ,CAAC;IACnC,gBAAgB,CAAC,EAAE,IAAI,GAAG,kCAAkC,CAAC;CAC9D;AAID,eAAO,MAAM,gBAAgB,sCAAuC,yBAAyB,IAAI,CAAC,gBAMjG,CAAC;AA2GF,eAAO,MAAM,SAAS,4FAQnB,cAAc,gBAyDhB,CAAC"}
1
+ {"version":3,"file":"ViewState.d.ts","sourceRoot":"","sources":["../../../../../../src/panels/JoinPanel/view-states/ViewState.tsx"],"names":[],"mappings":"AAKA,OAAc,EAAE,cAAc,EAAE,wBAAwB,EAAsB,MAAM,OAAO,CAAC;AAS5F,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,WAAW,cAAe,SAAQ,cAAc,CAAC,KAAK,CAAC;IAC3D,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAID,eAAO,MAAM,gBAAgB,sCAAuC,yBAAyB,IAAI,CAAC,gBAMjG,CAAC;AA4GF,eAAO,MAAM,SAAS,mEAAoE,cAAc,gBAcvG,CAAC"}
@@ -1,6 +1,5 @@
1
1
  export * from './AdditionMethodSelector';
2
2
  export * from './IdentityAdded';
3
- export * from './IdentitySelector';
4
3
  export * from './IdentityInput';
5
4
  export * from './InvitationAccepted';
6
5
  export * from './InvitationInput';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/panels/JoinPanel/view-states/index.ts"],"names":[],"mappings":"AAIA,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/panels/JoinPanel/view-states/index.ts"],"names":[],"mappings":"AAIA,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"invitations-manager.d.ts","sourceRoot":"","sources":["../../../../src/playwright/invitations-manager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAkB,IAAI,EAAE,MAAM,YAAY,CAAC;AAIhE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAO7E,oBAAY,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE5E,qBAAa,kBAAkB;IAOjB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IANrC,IAAI,EAAG,IAAI,CAAC;IAEZ,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,mBAAmB,CAAyB;gBAEvB,QAAQ,EAAE,OAAO;IAExC,IAAI;IAiBJ,cAAc,CAAC,EAAE,EAAE,MAAM;IAKzB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAK1C,sBAAsB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO;IAO3D,gBAAgB,CAAC,EAAE,EAAE,MAAM;IAOrB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe;IASrD,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS;IA2BtC,cAAc,CAAC,EAAE,EAAE,MAAM;IASzB,WAAW,CAAC,EAAE,EAAE,MAAM;IAItB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IAsBrG,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,EAAE,UAAU,EAAE,MAAM;IAQzE,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAO7E,uBAAuB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO;IAO5D,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IAKxC,sBAAsB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,EAAE,kBAAkB,EAAE,MAAM;IAOvF,uBAAuB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO;IAO5D,eAAe,CAAC,EAAE,EAAE,MAAM;IAO1B,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO;IAOzD,OAAO,CAAC,KAAK;YAIC,iBAAiB;CAUhC"}
1
+ {"version":3,"file":"invitations-manager.d.ts","sourceRoot":"","sources":["../../../../src/playwright/invitations-manager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAkB,IAAI,EAAE,MAAM,YAAY,CAAC;AAIhE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAO7E,oBAAY,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE5E,qBAAa,kBAAkB;IAOjB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IANrC,IAAI,EAAG,IAAI,CAAC;IAEZ,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,mBAAmB,CAAyB;gBAEvB,QAAQ,EAAE,OAAO;IAExC,IAAI;IAiBJ,cAAc,CAAC,EAAE,EAAE,MAAM;IAKzB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAK1C,sBAAsB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO;IAO3D,gBAAgB,CAAC,EAAE,EAAE,MAAM;IAOrB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe;IASrD,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS;IA2BtC,cAAc,CAAC,EAAE,EAAE,MAAM;IASzB,WAAW,CAAC,EAAE,EAAE,MAAM;IAItB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IAsBrG,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,EAAE,UAAU,EAAE,MAAM;IAUzE,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAO7E,uBAAuB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO;IAO5D,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IAKxC,sBAAsB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,EAAE,kBAAkB,EAAE,MAAM;IAOvF,uBAAuB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO;IAO5D,eAAe,CAAC,EAAE,EAAE,MAAM;IAO1B,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO;IASzD,OAAO,CAAC,KAAK;YAIC,iBAAiB;CAUhC"}
@@ -4,7 +4,7 @@ export declare const os: {
4
4
  'sidebar label': string;
5
5
  'copy invitation code label': string;
6
6
  'open share panel label': string;
7
- 'joining heading': string;
7
+ 'joining space heading': string;
8
8
  'join space heading': string;
9
9
  'halo heading': string;
10
10
  'exit label': string;
@@ -59,5 +59,7 @@ export declare const os: {
59
59
  'toggle sidebar label': string;
60
60
  'open sidebar label': string;
61
61
  'close sidebar label': string;
62
+ 'welcome message': string;
63
+ 'selecting identity heading': string;
62
64
  };
63
65
  //# sourceMappingURL=en-US.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"en-US.d.ts","sourceRoot":"","sources":["../../../../../src/translations/locales/en-US.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6Dd,CAAC"}
1
+ {"version":3,"file":"en-US.d.ts","sourceRoot":"","sources":["../../../../../src/translations/locales/en-US.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+Dd,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export * from './invitationStatusValue';
2
+ export * from './toEmoji';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/util/index.ts"],"names":[],"mappings":"AAIA,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/util/index.ts"],"names":[],"mappings":"AAIA,cAAc,yBAAyB,CAAC;AACxC,cAAc,WAAW,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const toEmoji: (keyAsHex: string) => string;
2
+ //# sourceMappingURL=toEmoji.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toEmoji.d.ts","sourceRoot":"","sources":["../../../../src/util/toEmoji.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,OAAO,aAAc,MAAM,WAAiD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/react-ui",
3
- "version": "0.1.31-next.ea8f0bc",
3
+ "version": "0.1.32-next.77d513e",
4
4
  "description": "A React component library for DXOS’s OS experiences",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -14,40 +14,44 @@
14
14
  "theme-extensions.js"
15
15
  ],
16
16
  "dependencies": {
17
- "@radix-ui/react-accordion": "^1.0.1",
18
- "@radix-ui/react-alert-dialog": "^1.0.2",
19
- "@radix-ui/react-dialog": "^1.0.0",
20
- "@radix-ui/react-radio-group": "^1.1.1",
17
+ "@radix-ui/react-accordion": "^1.1.1",
18
+ "@radix-ui/react-alert-dialog": "^1.0.3",
19
+ "@radix-ui/react-dialog": "^1.0.3",
20
+ "@radix-ui/react-radio-group": "^1.1.2",
21
21
  "@react-hook/async": "^3.1.1",
22
+ "@xstate/react": "^3.2.1",
22
23
  "debug": "^4.3.3",
24
+ "lodash.toarray": "^4.4.0",
23
25
  "qrcode.react": "^3.1.0",
24
26
  "url-join": "^5.0.0",
25
- "@dxos/client": "0.1.31-next.ea8f0bc",
26
- "@dxos/config": "0.1.31-next.ea8f0bc",
27
- "@dxos/debug": "0.1.31-next.ea8f0bc",
28
- "@dxos/keys": "0.1.31-next.ea8f0bc",
29
- "@dxos/protocols": "0.1.31-next.ea8f0bc",
30
- "@dxos/react-client": "0.1.31-next.ea8f0bc",
31
- "@dxos/react-components": "0.1.31-next.ea8f0bc",
32
- "@dxos/util": "0.1.31-next.ea8f0bc"
27
+ "xstate": "^4.37.0",
28
+ "@dxos/client": "0.1.32-next.77d513e",
29
+ "@dxos/config": "0.1.32-next.77d513e",
30
+ "@dxos/debug": "0.1.32-next.77d513e",
31
+ "@dxos/keys": "0.1.32-next.77d513e",
32
+ "@dxos/protocols": "0.1.32-next.77d513e",
33
+ "@dxos/react-client": "0.1.32-next.77d513e",
34
+ "@dxos/react-components": "0.1.32-next.77d513e",
35
+ "@dxos/util": "0.1.32-next.77d513e"
33
36
  },
34
37
  "devDependencies": {
35
38
  "@faker-js/faker": "^7.6.0",
39
+ "@phosphor-icons/react": "^2.0.5",
36
40
  "@types/debug": "^4.1.7",
41
+ "@types/lodash.toarray": "^4.4.7",
37
42
  "@types/react": "^18.0.21",
38
43
  "@types/react-dom": "^18.0.6",
39
44
  "@vitejs/plugin-react": "^3.0.1",
40
- "phosphor-react": "^1.4.1",
41
45
  "react": "^18.2.0",
42
46
  "react-dom": "^18.2.0",
43
- "vite": "4.0.4",
44
- "@dxos/async": "0.1.31-next.ea8f0bc",
45
- "@dxos/client-services": "0.1.31-next.ea8f0bc",
46
- "@dxos/log": "0.1.31-next.ea8f0bc",
47
- "@dxos/react-async": "0.1.31-next.ea8f0bc"
47
+ "vite": "^4.2.0",
48
+ "@dxos/async": "0.1.32-next.77d513e",
49
+ "@dxos/client-services": "0.1.32-next.77d513e",
50
+ "@dxos/log": "0.1.32-next.77d513e",
51
+ "@dxos/react-async": "0.1.32-next.77d513e"
48
52
  },
49
53
  "peerDependencies": {
50
- "phosphor-react": "^1.4.1",
54
+ "@phosphor-icons/react": "^2.0.5",
51
55
  "react": "^18.2.0",
52
56
  "react-dom": "^18.2.0"
53
57
  },
@@ -20,8 +20,12 @@ export const SpaceMemberListContainer = ({ spaceKey, includeSelf, onSelect }: Sp
20
20
  const members = useMemo(
21
21
  () =>
22
22
  includeSelf
23
- ? allUnsortedMembers.sort((a) => (a.identity.identityKey.equals(client.halo.identity!.identityKey) ? -1 : 1))
24
- : allUnsortedMembers.filter((member) => !member.identity.identityKey.equals(client.halo.identity!.identityKey)),
23
+ ? allUnsortedMembers.sort((a) =>
24
+ a.identity.identityKey.equals(client.halo.identity.get()!.identityKey) ? -1 : 1
25
+ )
26
+ : allUnsortedMembers.filter(
27
+ (member) => !member.identity.identityKey.equals(client.halo.identity.get()!.identityKey)
28
+ ),
25
29
  [allUnsortedMembers]
26
30
  );
27
31
  return <SpaceMemberList members={members} onSelect={onSelect} />;
@@ -37,7 +37,7 @@ export const Default = {
37
37
 
38
38
  await clients[0].halo.createIdentity({ displayName: 'Os Mutantes' });
39
39
 
40
- const space = await clients[0].echo.createSpace();
40
+ const space = await clients[0].createSpace();
41
41
  log.info('[space created]', space);
42
42
  space.properties.name = 'Q3 2022 Planning';
43
43
  log.info('[space title set]', space?.properties.name);
@@ -1,8 +1,8 @@
1
1
  //
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
+ import { Copy, ProhibitInset, QrCode, X } from '@phosphor-icons/react';
4
5
  import * as AccordionPrimitive from '@radix-ui/react-accordion';
5
- import { Copy, ProhibitInset, QrCode, X } from 'phosphor-react';
6
6
  import { QRCodeSVG } from 'qrcode.react';
7
7
  import React, { useCallback } from 'react';
8
8
 
@@ -5,7 +5,7 @@
5
5
  import { Close } from '@radix-ui/react-dialog';
6
6
  import React from 'react';
7
7
 
8
- import { ThemeContext, useId } from '@dxos/react-components';
8
+ import { ThemeContext, useId, useThemeContext } from '@dxos/react-components';
9
9
 
10
10
  import { PanelDialog, PanelDialogProps } from '../../layouts';
11
11
  import { DevicesPanel, DevicesPanelProps } from '../../panels';
@@ -16,6 +16,7 @@ export interface DevicesDialogProps
16
16
 
17
17
  export const DevicesDialog = ({ slots, ...devicesDialogProps }: DevicesDialogProps) => {
18
18
  const titleId = useId('spaceDialog__title');
19
+ const themeContextValue = useThemeContext();
19
20
 
20
21
  return (
21
22
  <PanelDialog
@@ -24,7 +25,7 @@ export const DevicesDialog = ({ slots, ...devicesDialogProps }: DevicesDialogPro
24
25
  titleId
25
26
  }}
26
27
  >
27
- <ThemeContext.Provider value={{ themeVariant: 'os' }}>
28
+ <ThemeContext.Provider value={{ ...themeContextValue, themeVariant: 'os' }}>
28
29
  <DevicesPanel
29
30
  {...{
30
31
  ...devicesDialogProps,
@@ -35,6 +35,9 @@ const JoinClientDecorator = (Story: StoryFn, { args }: StoryContext) => {
35
35
  log.info('[next invitation code]', { nextInvitationCode });
36
36
  setInvitationCode(nextInvitationCode);
37
37
  }
38
+ if (invitation.authenticationCode) {
39
+ log.info('[verification code]', invitation.authenticationCode);
40
+ }
38
41
  }, []);
39
42
 
40
43
  useAsyncEffect(async () => {
@@ -43,12 +46,11 @@ const JoinClientDecorator = (Story: StoryFn, { args }: StoryContext) => {
43
46
 
44
47
  await clients[0].halo.createIdentity({ displayName: 'Os Mutantes' });
45
48
 
46
- const space = await clients[0].echo.createSpace();
49
+ const space = await clients[0].createSpace();
47
50
  log.info('[space created]', space);
48
51
  space.properties.name = 'Q3 2022 Planning';
49
52
 
50
53
  const invitation = space.createInvitation({ type: Invitation.Type.INTERACTIVE });
51
- log.info('[invitation created]', invitation);
52
54
 
53
55
  invitation.subscribe({
54
56
  onAuthenticating: onInvitationEvent,
@@ -5,7 +5,7 @@
5
5
  import { Action, Cancel } from '@radix-ui/react-alert-dialog';
6
6
  import React from 'react';
7
7
 
8
- import { ThemeContext, useId } from '@dxos/react-components';
8
+ import { ThemeContext, useId, useThemeContext } from '@dxos/react-components';
9
9
 
10
10
  import { PanelAlertDialog, PanelAlertDialogProps } from '../../layouts';
11
11
  import { JoinPanel, JoinPanelProps } from '../../panels';
@@ -16,9 +16,11 @@ export interface JoinDialogProps
16
16
 
17
17
  export const JoinDialog = ({ slots, ...joinPanelProps }: JoinDialogProps) => {
18
18
  const titleId = useId('joinDialog__title');
19
+ const themeContextValue = useThemeContext();
20
+
19
21
  return (
20
22
  <PanelAlertDialog {...{ slots, titleId }}>
21
- <ThemeContext.Provider value={{ themeVariant: 'os' }}>
23
+ <ThemeContext.Provider value={{ ...themeContextValue, themeVariant: 'os' }}>
22
24
  <JoinPanel
23
25
  {...{
24
26
  ...joinPanelProps,
@@ -4,13 +4,21 @@
4
4
 
5
5
  import '@dxosTheme';
6
6
  import { faker } from '@faker-js/faker';
7
- import { Intersect, Laptop, PlusCircle } from 'phosphor-react';
7
+ import { Intersect, Laptop, PlusCircle } from '@phosphor-icons/react';
8
8
  import React, { useState } from 'react';
9
9
 
10
10
  import { PublicKey, ShellLayout } from '@dxos/client';
11
11
  import { useClient, useSpace, useSpaces } from '@dxos/react-client';
12
12
  import { ClientDecorator } from '@dxos/react-client/testing';
13
- import { Button, ButtonGroup, getSize, Group, Tooltip } from '@dxos/react-components';
13
+ import {
14
+ Button,
15
+ ButtonGroup,
16
+ getSize,
17
+ Group,
18
+ TooltipRoot,
19
+ TooltipContent,
20
+ TooltipTrigger
21
+ } from '@dxos/react-components';
14
22
 
15
23
  import { SpaceListItem } from '../../components';
16
24
  import { ShellProvider, useShell } from './ShellContext';
@@ -26,21 +34,30 @@ const ShellControls = () => {
26
34
 
27
35
  const controls = (
28
36
  <ButtonGroup className='mbe-4'>
29
- <Tooltip content='Devices'>
30
- <Button onClick={() => shell.setLayout(ShellLayout.DEVICE_INVITATIONS)}>
31
- <Laptop weight='fill' className={getSize(6)} />
32
- </Button>
33
- </Tooltip>
34
- <Tooltip content='Create Space'>
35
- <Button onClick={() => client.echo.createSpace({ name: faker.animal.bird() })}>
36
- <PlusCircle weight='fill' className={getSize(6)} />
37
- </Button>
38
- </Tooltip>
39
- <Tooltip content='Join Space'>
40
- <Button onClick={() => shell.setLayout(ShellLayout.JOIN_SPACE)}>
41
- <Intersect weight='fill' className={getSize(6)} />
42
- </Button>
43
- </Tooltip>
37
+ <TooltipRoot>
38
+ <TooltipContent>Devices</TooltipContent>
39
+ <TooltipTrigger asChild>
40
+ <Button onClick={() => shell.setLayout(ShellLayout.DEVICE_INVITATIONS)}>
41
+ <Laptop weight='fill' className={getSize(6)} />
42
+ </Button>
43
+ </TooltipTrigger>
44
+ </TooltipRoot>
45
+ <TooltipRoot>
46
+ <TooltipContent>Create Space</TooltipContent>
47
+ <TooltipTrigger asChild>
48
+ <Button onClick={() => client.createSpace({ name: faker.animal.bird() })}>
49
+ <PlusCircle weight='fill' className={getSize(6)} />
50
+ </Button>
51
+ </TooltipTrigger>
52
+ </TooltipRoot>
53
+ <TooltipRoot>
54
+ <TooltipContent>Join Space</TooltipContent>
55
+ <TooltipTrigger asChild>
56
+ <Button onClick={() => shell.setLayout(ShellLayout.JOIN_SPACE)}>
57
+ <Intersect weight='fill' className={getSize(6)} />
58
+ </Button>
59
+ </TooltipTrigger>
60
+ </TooltipRoot>
44
61
  </ButtonGroup>
45
62
  );
46
63
 
@@ -49,7 +49,7 @@ export const Shell = ({ runtime, origin }: { runtime: ShellRuntime; origin: stri
49
49
  initialInvitationCode={invitationCode}
50
50
  onDone={async () => {
51
51
  // TODO(wittjosiah): Is this app-specific?
52
- spaces.length > 0 || (await client.echo.createSpace());
52
+ spaces.length > 0 || (await client.createSpace());
53
53
  await runtime.setAppContext({ display: ShellDisplay.NONE });
54
54
  runtime.setLayout(ShellLayout.DEFAULT);
55
55
  }}
@@ -5,7 +5,7 @@
5
5
  import { Close } from '@radix-ui/react-dialog';
6
6
  import React from 'react';
7
7
 
8
- import { ThemeContext, useId } from '@dxos/react-components';
8
+ import { ThemeContext, useId, useThemeContext } from '@dxos/react-components';
9
9
 
10
10
  import { PanelDialog, PanelDialogProps } from '../../layouts';
11
11
  import { SpacePanel, SpacePanelProps } from '../../panels';
@@ -16,6 +16,7 @@ export interface SpaceDialogProps
16
16
 
17
17
  export const SpaceDialog = ({ slots, ...spacePanelProps }: SpaceDialogProps) => {
18
18
  const titleId = useId('spaceDialog__title');
19
+ const themeContextValue = useThemeContext();
19
20
 
20
21
  return (
21
22
  <PanelDialog
@@ -24,7 +25,7 @@ export const SpaceDialog = ({ slots, ...spacePanelProps }: SpaceDialogProps) =>
24
25
  titleId
25
26
  }}
26
27
  >
27
- <ThemeContext.Provider value={{ themeVariant: 'os' }}>
28
+ <ThemeContext.Provider value={{ ...themeContextValue, themeVariant: 'os' }}>
28
29
  <SpacePanel
29
30
  {...{
30
31
  ...spacePanelProps,
@@ -2,11 +2,20 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { UserPlus, X } from 'phosphor-react';
5
+ import { UserPlus, X } from '@phosphor-icons/react';
6
6
  import React, { cloneElement, useReducer } from 'react';
7
7
 
8
8
  import { useClient, useDevices, useHaloInvitations, useIdentity } from '@dxos/react-client';
9
- import { Button, DensityProvider, getSize, mx, Tooltip, useTranslation } from '@dxos/react-components';
9
+ import {
10
+ Button,
11
+ DensityProvider,
12
+ getSize,
13
+ mx,
14
+ TooltipContent,
15
+ TooltipRoot,
16
+ TooltipTrigger,
17
+ useTranslation
18
+ } from '@dxos/react-components';
10
19
 
11
20
  import { DeviceList, InvitationList, PanelSeparator } from '../../components';
12
21
  import { defaultSurface, subduedSurface } from '../../styles';
@@ -45,9 +54,12 @@ const DeviceListView = ({ createInvitationUrl, titleId, onDone, doneActionParent
45
54
  <h2 id={titleId} className={mx('grow font-system-medium', !displayName && 'font-mono')}>
46
55
  {displayName ?? identity.identityKey.truncate()}
47
56
  </h2>
48
- <Tooltip content={t('close label')} zIndex='z-50'>
49
- {doneActionParent ? cloneElement(doneActionParent, {}, doneButton) : doneButton}
50
- </Tooltip>
57
+ <TooltipRoot>
58
+ <TooltipContent className='z-50'>{t('close label')}</TooltipContent>
59
+ <TooltipTrigger asChild>
60
+ {doneActionParent ? cloneElement(doneActionParent, {}, doneButton) : doneButton}
61
+ </TooltipTrigger>
62
+ </TooltipRoot>
51
63
  </div>
52
64
  <div role='region' className={mx(defaultSurface, 'rounded-be-md p-2')}>
53
65
  <InvitationList
@@ -5,7 +5,7 @@ import React from 'react';
5
5
 
6
6
  import type { Identity } from '@dxos/client';
7
7
  import { useClient } from '@dxos/react-client';
8
- import { Avatar, Button, ThemeContext, useTranslation } from '@dxos/react-components';
8
+ import { Avatar, Button, DensityProvider, ThemeContext, useThemeContext, useTranslation } from '@dxos/react-components';
9
9
 
10
10
  export const IdentityPanel = ({
11
11
  identity,
@@ -16,24 +16,28 @@ export const IdentityPanel = ({
16
16
  }) => {
17
17
  const { t } = useTranslation('os');
18
18
  const client = useClient();
19
+ const themeContextValue = useThemeContext();
20
+
19
21
  const defaultManageProfile = () => {
20
22
  const remoteSource = new URL(client?.config.get('runtime.client.remoteSource') || 'https://halo.dxos.org');
21
23
  const tab = window.open(remoteSource.origin, '_blank');
22
24
  tab?.focus();
23
25
  };
24
26
  return (
25
- <ThemeContext.Provider value={{ themeVariant: 'os', rootDensity: 'fine' }}>
26
- <div className='flex flex-col gap-2 justify-center items-center'>
27
- <Avatar
28
- size={16}
29
- variant='circle'
30
- fallbackValue={identity.identityKey.toHex()}
31
- label={identity.profile?.displayName ?? ''}
32
- />
33
- <Button onClick={onClickManageProfile ?? defaultManageProfile} className='is-full'>
34
- {t('manage profile label')}
35
- </Button>
36
- </div>
27
+ <ThemeContext.Provider value={{ ...themeContextValue, themeVariant: 'os' }}>
28
+ <DensityProvider density='fine'>
29
+ <div className='flex flex-col gap-2 justify-center items-center'>
30
+ <Avatar
31
+ size={16}
32
+ variant='circle'
33
+ fallbackValue={identity.identityKey.toHex()}
34
+ label={identity.profile?.displayName ?? ''}
35
+ />
36
+ <Button onClick={onClickManageProfile ?? defaultManageProfile} className='is-full'>
37
+ {t('manage profile label')}
38
+ </Button>
39
+ </div>
40
+ </DensityProvider>
37
41
  </ThemeContext.Provider>
38
42
  );
39
43
  };
@@ -1,20 +1,21 @@
1
1
  //
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
- import { ProhibitInset } from 'phosphor-react';
4
+ import { X } from '@phosphor-icons/react';
5
5
  import React, { cloneElement, ForwardedRef, forwardRef } from 'react';
6
6
 
7
- import { AuthenticatingInvitationObservable } from '@dxos/client';
8
7
  import { useSpace } from '@dxos/react-client';
9
- import { Avatar, Button, getSize, Heading, mx, Trans, useId, useTranslation } from '@dxos/react-components';
8
+ import { Button, defaultDescription, getSize, Heading, mx, useId, useTranslation } from '@dxos/react-components';
10
9
 
11
- import { subduedSurface } from '../../styles';
10
+ import { defaultSurface } from '../../styles';
11
+ import { toEmoji } from '../../util';
12
12
  import { JoinPanelMode } from './JoinPanelProps';
13
+ import { JoinState } from './joinMachine';
13
14
 
14
15
  export interface JoinSpaceHeadingProps {
15
16
  mode?: JoinPanelMode;
16
17
  titleId: string;
17
- invitation?: AuthenticatingInvitationObservable;
18
+ joinState?: JoinState;
18
19
  onExit?: () => void;
19
20
  exitActionParent?: Parameters<typeof cloneElement>[0];
20
21
  preventExit?: boolean;
@@ -23,56 +24,57 @@ export interface JoinSpaceHeadingProps {
23
24
  // TODO(wittjosiah): Accesses the space properties directly which will trigger ECHO warnings without observer.
24
25
  export const JoinHeading = forwardRef(
25
26
  (
26
- { mode, titleId, invitation, onExit, exitActionParent, preventExit }: JoinSpaceHeadingProps,
27
+ { mode, titleId, joinState, onExit, exitActionParent, preventExit }: JoinSpaceHeadingProps,
27
28
  ref: ForwardedRef<HTMLDivElement>
28
29
  ) => {
29
30
  const { t } = useTranslation('os');
30
31
 
31
- const space = useSpace(invitation?.invitation?.spaceKey);
32
- const name = mode === 'halo-only' ? '(Unknown identity)' : space?.properties.name ?? '(Space name not available)';
32
+ const space = useSpace(joinState?.context.space.invitation?.spaceKey);
33
+ const name = space?.properties.name;
33
34
  const nameId = useId(mode === 'halo-only' ? 'identityDisplayName' : 'spaceDisplayName');
34
35
 
35
- const invitationKey =
36
- mode === 'halo-only'
37
- ? invitation?.invitation?.identityKey?.toHex()
38
- : invitation?.invitation?.identityKey?.toHex();
36
+ const invitationKey = joinState?.context[mode === 'halo-only' ? 'halo' : 'space'].invitation?.invitationId;
37
+ const invitationEmoji = invitationKey && toEmoji(invitationKey);
39
38
 
40
39
  const exitButton = (
41
- <Button variant='ghost' {...(onExit && { onClick: onExit })} className='grow-0 shrink-0' data-testid='join-exit'>
42
- <ProhibitInset className={getSize(5)} />
40
+ <Button
41
+ variant='ghost'
42
+ {...(onExit && { onClick: onExit })}
43
+ className={mx(defaultDescription, 'plb-0 pli-2 absolute block-start-1.5 inline-end-2 z-[1]')}
44
+ data-testid='join-exit'
45
+ >
46
+ <X weight='bold' className={getSize(4)} />
43
47
  <span className='sr-only'>{t('exit label')}</span>
44
48
  </Button>
45
49
  );
46
50
 
47
51
  return (
48
- <div role='none' className={mx(subduedSurface, 'p-2 rounded-bs-md')} ref={ref}>
49
- <div role='group' className='flex items-center gap-2'>
50
- {invitationKey ? (
51
- <Avatar fallbackValue={invitationKey} labelId={nameId} />
52
- ) : (
53
- <span role='none' className={mx(getSize(10), 'bg-neutral-300 dark:bg-neutral-700 rounded-full')} />
52
+ <div role='none' className={mx(defaultSurface, 'pbs-3 pbe-1 rounded-bs-md relative')} ref={ref}>
53
+ {!preventExit &&
54
+ mode !== 'halo-only' &&
55
+ (exitActionParent ? cloneElement(exitActionParent, {}, exitButton) : exitButton)}
56
+ <Heading
57
+ level={1}
58
+ className={mx(
59
+ defaultDescription,
60
+ 'font-body font-system-normal text-center text-sm grow pbe-2',
61
+ mode === 'halo-only' && (preventExit ? 'sr-only' : 'opacity-0')
54
62
  )}
55
- <Heading level={1} className='font-body font-normal text-base grow' id={titleId}>
56
- {invitation ? (
57
- <Trans
58
- {...{
59
- defaults: t('joining heading'),
60
- components: {
61
- small: <span className='block leading-none mbe-1 font-system-medium text-sm' />,
62
- large: <span className='block leading-none' id={nameId} />
63
- },
64
- values: { name }
65
- }}
66
- />
67
- ) : (
68
- <span className='block leading-none font-system-medium text-sm'>
69
- {mode === 'halo-only' ? t('halo heading') : t('join space heading')}
70
- </span>
63
+ id={titleId}
64
+ >
65
+ {t(mode === 'halo-only' ? 'selecting identity heading' : 'joining space heading')}
66
+ </Heading>
67
+ <div role='group' className='flex items-center justify-center gap-2'>
68
+ <span
69
+ role='none'
70
+ className={mx(
71
+ getSize(12),
72
+ 'bg-neutral-300 dark:bg-neutral-700 rounded-full text-center text-4xl leading-[3rem]'
71
73
  )}
72
- </Heading>
73
- {!preventExit &&
74
- mode !== 'halo-only' &&
75
- (exitActionParent ? cloneElement(exitActionParent, {}, exitButton) : exitButton)}
74
+ >
75
+ {invitationEmoji}
76
+ </span>
77
+ {name && <p id={nameId}>{name}</p>}
76
78
  </div>
77
79
  </div>
78
80
  );