@streamplace/components 0.8.17 → 0.8.18

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 (46) hide show
  1. package/dist/components/mobile-player/video-async.native.d.ts.map +1 -1
  2. package/dist/components/mobile-player/video-async.native.js +1 -1
  3. package/dist/components/mobile-player/video-async.native.js.map +1 -1
  4. package/dist/components/ui/menu.d.ts +14 -0
  5. package/dist/components/ui/menu.d.ts.map +1 -1
  6. package/dist/components/ui/menu.js +81 -2
  7. package/dist/components/ui/menu.js.map +1 -1
  8. package/dist/components/ui/text.d.ts +1 -1
  9. package/dist/lib/theme/atoms.d.ts +7 -7
  10. package/dist/lib/theme/theme.d.ts +1 -1
  11. package/dist/lib/theme/tokens.d.ts +1 -1
  12. package/dist/lib/theme/tokens.js +1 -1
  13. package/dist/livestream-provider/index.d.ts +2 -1
  14. package/dist/livestream-provider/index.d.ts.map +1 -1
  15. package/dist/livestream-provider/index.js +4 -2
  16. package/dist/livestream-provider/index.js.map +1 -1
  17. package/dist/livestream-provider/websocket.d.ts.map +1 -1
  18. package/dist/livestream-provider/websocket.js +15 -1
  19. package/dist/livestream-provider/websocket.js.map +1 -1
  20. package/dist/livestream-store/livestream-state.d.ts +2 -0
  21. package/dist/livestream-store/livestream-state.d.ts.map +1 -1
  22. package/dist/livestream-store/livestream-store.d.ts +1 -0
  23. package/dist/livestream-store/livestream-store.d.ts.map +1 -1
  24. package/dist/livestream-store/livestream-store.js +5 -1
  25. package/dist/livestream-store/livestream-store.js.map +1 -1
  26. package/dist/livestream-store/websocket-consumer.d.ts.map +1 -1
  27. package/dist/livestream-store/websocket-consumer.js +97 -75
  28. package/dist/livestream-store/websocket-consumer.js.map +1 -1
  29. package/locales/en-US/common.ftl +16 -0
  30. package/locales/en-US/settings.ftl +13 -0
  31. package/locales/es-ES/common.ftl +16 -0
  32. package/locales/es-ES/settings.ftl +1 -1
  33. package/locales/fr-FR/common.ftl +16 -0
  34. package/locales/pt-BR/common.ftl +16 -0
  35. package/locales/pt-BR/settings.ftl +1 -1
  36. package/locales/zh-Hant/common.ftl +16 -0
  37. package/node-compile-cache/v22.15.0-x64-efe9a9df-0/37be0eec +0 -0
  38. package/package.json +2 -2
  39. package/src/components/mobile-player/video-async.native.tsx +2 -1
  40. package/src/components/ui/menu.tsx +180 -3
  41. package/src/lib/theme/tokens.ts +1 -1
  42. package/src/livestream-provider/index.tsx +5 -1
  43. package/src/livestream-provider/websocket.tsx +15 -1
  44. package/src/livestream-store/livestream-state.tsx +2 -0
  45. package/src/livestream-store/livestream-store.tsx +5 -0
  46. package/src/livestream-store/websocket-consumer.tsx +95 -73
@@ -22,6 +22,8 @@ export const makeLivestreamStore = (): StoreApi<LivestreamState> => {
22
22
  authors: {},
23
23
  recentSegments: [],
24
24
  problems: [],
25
+ websocketConnected: false,
26
+ hasReceivedSegment: false,
25
27
  }));
26
28
  };
27
29
 
@@ -59,4 +61,7 @@ export const useLivestream = () => useLivestreamStore((x) => x.livestream);
59
61
 
60
62
  export const useSegment = () => useLivestreamStore((x) => x.segment);
61
63
 
64
+ export const useRecentSegments = () =>
65
+ useLivestreamStore((x) => x.recentSegments);
66
+
62
67
  export const useRenditions = () => useLivestreamStore((x) => x.renditions);
@@ -21,84 +21,106 @@ export const handleWebSocketMessages = (
21
21
  messages: any[],
22
22
  ): LivestreamState => {
23
23
  for (let message of messages) {
24
- if (PlaceStreamLivestream.isLivestreamView(message)) {
25
- const newLivestream = message as LivestreamViewHydrated;
26
- const oldLivestream = state.livestream;
27
-
28
- // check if this is actually new
29
- if (!oldLivestream || oldLivestream.uri !== newLivestream.uri) {
30
- const streamTitle = newLivestream.record.title || "something cool!";
31
- const systemMessage = SystemMessages.streamStart(streamTitle);
32
- // set proper times
33
- systemMessage.indexedAt = newLivestream.indexedAt;
34
- systemMessage.record.createdAt = newLivestream.record.createdAt;
35
-
36
- state = reduceChat(state, [systemMessage], []);
37
- }
38
-
39
- state = {
40
- ...state,
41
- livestream: newLivestream,
42
- };
43
- } else if (PlaceStreamLivestream.isViewerCount(message)) {
44
- message = message as PlaceStreamLivestream.ViewerCount;
45
- state = {
46
- ...state,
47
- viewers: message.count,
48
- };
49
- } else if (PlaceStreamChatDefs.isMessageView(message)) {
50
- message = message as PlaceStreamChatDefs.MessageView;
51
- // Explicitly map MessageView to MessageViewHydrated
52
- const hydrated: ChatMessageViewHydrated = {
53
- uri: message.uri,
54
- cid: message.cid,
55
- author: message.author,
56
- record: message.record as PlaceStreamChatMessage.Record,
57
- indexedAt: message.indexedAt,
58
- chatProfile: (message as any).chatProfile,
59
- replyTo: (message as any).replyTo,
60
- deleted: message.deleted,
61
- };
62
- state = reduceChat(state, [hydrated], [], []);
63
- } else if (PlaceStreamSegment.isRecord(message)) {
64
- const newRecentSegments = [...state.recentSegments];
65
- newRecentSegments.unshift(message);
66
- if (newRecentSegments.length > MAX_RECENT_SEGMENTS) {
67
- newRecentSegments.pop();
68
- }
69
- state = {
70
- ...state,
71
- segment: message as PlaceStreamSegment.Record,
72
- recentSegments: newRecentSegments,
73
- problems: findProblems(newRecentSegments),
74
- };
75
- } else if (PlaceStreamDefs.isBlockView(message)) {
76
- const block = message as PlaceStreamDefs.BlockView;
77
- state = reduceChat(state, [], [block], []);
78
- } else if (PlaceStreamDefs.isRenditions(message)) {
79
- message = message as PlaceStreamDefs.Renditions;
24
+ if (message.$type === "place.stream.error") {
80
25
  state = {
81
26
  ...state,
82
- renditions: message.renditions,
27
+ problems: [
28
+ ...state.problems,
29
+ {
30
+ code: message.code,
31
+ message: message.message,
32
+ severity: "error",
33
+ },
34
+ ],
83
35
  };
84
- } else if (AppBskyActorDefs.isProfileViewBasic(message)) {
85
- state = {
86
- ...state,
87
- profile: message,
88
- };
89
- } else if (PlaceStreamChatGate.isRecord(message)) {
90
- const hideRecord = message as PlaceStreamChatGate.Record;
91
- const hiddenMessageUri = hideRecord.hiddenMessage;
92
- const newPendingHides = [...state.pendingHides];
93
- if (!newPendingHides.includes(hiddenMessageUri)) {
94
- newPendingHides.push(hiddenMessageUri);
36
+ } else {
37
+ if (!state.websocketConnected) {
38
+ state = {
39
+ ...state,
40
+ websocketConnected: true,
41
+ };
95
42
  }
96
43
 
97
- state = {
98
- ...state,
99
- pendingHides: newPendingHides,
100
- };
101
- state = reduceChat(state, [], [], [hiddenMessageUri]);
44
+ if (PlaceStreamLivestream.isLivestreamView(message)) {
45
+ const newLivestream = message as LivestreamViewHydrated;
46
+ const oldLivestream = state.livestream;
47
+
48
+ // check if this is actually new
49
+ if (!oldLivestream || oldLivestream.uri !== newLivestream.uri) {
50
+ const streamTitle = newLivestream.record.title || "something cool!";
51
+ const systemMessage = SystemMessages.streamStart(streamTitle);
52
+ // set proper times
53
+ systemMessage.indexedAt = newLivestream.indexedAt;
54
+ systemMessage.record.createdAt = newLivestream.record.createdAt;
55
+
56
+ state = reduceChat(state, [systemMessage], []);
57
+ }
58
+
59
+ state = {
60
+ ...state,
61
+ livestream: newLivestream,
62
+ };
63
+ } else if (PlaceStreamLivestream.isViewerCount(message)) {
64
+ message = message as PlaceStreamLivestream.ViewerCount;
65
+ state = {
66
+ ...state,
67
+ viewers: message.count,
68
+ };
69
+ } else if (PlaceStreamChatDefs.isMessageView(message)) {
70
+ message = message as PlaceStreamChatDefs.MessageView;
71
+ // Explicitly map MessageView to MessageViewHydrated
72
+ const hydrated: ChatMessageViewHydrated = {
73
+ uri: message.uri,
74
+ cid: message.cid,
75
+ author: message.author,
76
+ record: message.record as PlaceStreamChatMessage.Record,
77
+ indexedAt: message.indexedAt,
78
+ chatProfile: (message as any).chatProfile,
79
+ replyTo: (message as any).replyTo,
80
+ deleted: message.deleted,
81
+ };
82
+ state = reduceChat(state, [hydrated], [], []);
83
+ } else if (PlaceStreamSegment.isRecord(message)) {
84
+ const newRecentSegments = [...state.recentSegments];
85
+ newRecentSegments.unshift(message);
86
+ if (newRecentSegments.length > MAX_RECENT_SEGMENTS) {
87
+ newRecentSegments.pop();
88
+ }
89
+ state = {
90
+ ...state,
91
+ segment: message as PlaceStreamSegment.Record,
92
+ recentSegments: newRecentSegments,
93
+ problems: findProblems(newRecentSegments),
94
+ hasReceivedSegment: true,
95
+ };
96
+ } else if (PlaceStreamDefs.isBlockView(message)) {
97
+ const block = message as PlaceStreamDefs.BlockView;
98
+ state = reduceChat(state, [], [block], []);
99
+ } else if (PlaceStreamDefs.isRenditions(message)) {
100
+ message = message as PlaceStreamDefs.Renditions;
101
+ state = {
102
+ ...state,
103
+ renditions: message.renditions,
104
+ };
105
+ } else if (AppBskyActorDefs.isProfileViewBasic(message)) {
106
+ state = {
107
+ ...state,
108
+ profile: message,
109
+ };
110
+ } else if (PlaceStreamChatGate.isRecord(message)) {
111
+ const hideRecord = message as PlaceStreamChatGate.Record;
112
+ const hiddenMessageUri = hideRecord.hiddenMessage;
113
+ const newPendingHides = [...state.pendingHides];
114
+ if (!newPendingHides.includes(hiddenMessageUri)) {
115
+ newPendingHides.push(hiddenMessageUri);
116
+ }
117
+
118
+ state = {
119
+ ...state,
120
+ pendingHides: newPendingHides,
121
+ };
122
+ state = reduceChat(state, [], [], [hiddenMessageUri]);
123
+ }
102
124
  }
103
125
  }
104
126
  return reduceChat(state, [], [], []);