@opengeni/react-native 1.4.5-canary.37615713321001

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 (132) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +74 -0
  3. package/dist/adapters.d.ts +53 -0
  4. package/dist/adapters.js +3 -0
  5. package/dist/adapters.js.map +1 -0
  6. package/dist/attachments.d.ts +75 -0
  7. package/dist/chunk-3VSZAQ7G.js +391 -0
  8. package/dist/chunk-3VSZAQ7G.js.map +1 -0
  9. package/dist/chunk-5ZVK7WKA.js +88 -0
  10. package/dist/chunk-5ZVK7WKA.js.map +1 -0
  11. package/dist/chunk-EEDIMY3L.js +240 -0
  12. package/dist/chunk-EEDIMY3L.js.map +1 -0
  13. package/dist/chunk-M23SDI4R.js +83 -0
  14. package/dist/chunk-M23SDI4R.js.map +1 -0
  15. package/dist/chunk-PHJBSAR3.js +2006 -0
  16. package/dist/chunk-PHJBSAR3.js.map +1 -0
  17. package/dist/environment.d.ts +19 -0
  18. package/dist/expo.d.ts +25 -0
  19. package/dist/expo.js +267 -0
  20. package/dist/expo.js.map +1 -0
  21. package/dist/index.d.ts +13 -0
  22. package/dist/index.js +3345 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/presentation.d.ts +262 -0
  25. package/dist/read-acknowledgement.d.ts +39 -0
  26. package/dist/realtime/call-events.d.ts +11 -0
  27. package/dist/realtime/call-view.d.ts +26 -0
  28. package/dist/realtime/expo-call.d.ts +11 -0
  29. package/dist/realtime/native-call.d.ts +104 -0
  30. package/dist/realtime/native-realtime.d.ts +35 -0
  31. package/dist/realtime/use-native-session-realtime.d.ts +25 -0
  32. package/dist/session-view.d.ts +87 -0
  33. package/dist/timeline/activity.d.ts +34 -0
  34. package/dist/timeline/composer.d.ts +86 -0
  35. package/dist/timeline/controls.d.ts +27 -0
  36. package/dist/timeline/decisions.d.ts +29 -0
  37. package/dist/timeline/feedback.d.ts +26 -0
  38. package/dist/timeline/icon-nodes.generated.d.ts +738 -0
  39. package/dist/timeline/icon.d.ts +11 -0
  40. package/dist/timeline/index.d.ts +32 -0
  41. package/dist/timeline/index.js +5419 -0
  42. package/dist/timeline/index.js.map +1 -0
  43. package/dist/timeline/markdown.d.ts +11 -0
  44. package/dist/timeline/markdown.js +415 -0
  45. package/dist/timeline/markdown.js.map +1 -0
  46. package/dist/timeline/message-attachments.d.ts +13 -0
  47. package/dist/timeline/message-timeline.d.ts +36 -0
  48. package/dist/timeline/model-picker.d.ts +17 -0
  49. package/dist/timeline/primitives.d.ts +85 -0
  50. package/dist/timeline/queue-dock.d.ts +19 -0
  51. package/dist/timeline/session-actions.d.ts +34 -0
  52. package/dist/timeline/session-list.d.ts +50 -0
  53. package/dist/timeline/session-screen.d.ts +35 -0
  54. package/dist/timeline/session-signals.d.ts +37 -0
  55. package/dist/timeline/sheet.d.ts +14 -0
  56. package/dist/timeline/theme.d.ts +58 -0
  57. package/dist/timeline/thinking-orb.d.ts +13 -0
  58. package/dist/timeline/turn.d.ts +80 -0
  59. package/dist/ui/attention.d.ts +14 -0
  60. package/dist/ui/cards.d.ts +21 -0
  61. package/dist/ui/composer.d.ts +21 -0
  62. package/dist/ui/format.d.ts +13 -0
  63. package/dist/ui/icons.d.ts +9 -0
  64. package/dist/ui/index.d.ts +12 -0
  65. package/dist/ui/index.js +1757 -0
  66. package/dist/ui/index.js.map +1 -0
  67. package/dist/ui/steps-sheet.d.ts +10 -0
  68. package/dist/ui/theme.d.ts +63 -0
  69. package/dist/ui/timeline.d.ts +48 -0
  70. package/dist/ui/web-tokens.gen.d.ts +90 -0
  71. package/dist/use-native-session.d.ts +40 -0
  72. package/dist/view-model.d.ts +52 -0
  73. package/dist/voice-input.d.ts +102 -0
  74. package/dist/webrtc.d.ts +9 -0
  75. package/dist/webrtc.js +19 -0
  76. package/dist/webrtc.js.map +1 -0
  77. package/expo-module.config.json +7 -0
  78. package/ios/OpenGeniCall.podspec +22 -0
  79. package/ios/OpenGeniCallAppDelegateSubscriber.swift +29 -0
  80. package/ios/OpenGeniCallCenter.swift +189 -0
  81. package/ios/OpenGeniCallModule.swift +64 -0
  82. package/package.json +93 -0
  83. package/src/adapters.ts +150 -0
  84. package/src/attachments.ts +396 -0
  85. package/src/environment.tsx +214 -0
  86. package/src/expo.ts +295 -0
  87. package/src/index.ts +98 -0
  88. package/src/presentation.ts +285 -0
  89. package/src/read-acknowledgement.ts +72 -0
  90. package/src/realtime/call-events.ts +41 -0
  91. package/src/realtime/call-view.tsx +220 -0
  92. package/src/realtime/expo-call.ts +49 -0
  93. package/src/realtime/native-call.ts +266 -0
  94. package/src/realtime/native-realtime.ts +115 -0
  95. package/src/realtime/use-native-session-realtime.ts +29 -0
  96. package/src/session-view.tsx +2251 -0
  97. package/src/timeline/activity.tsx +736 -0
  98. package/src/timeline/composer.tsx +686 -0
  99. package/src/timeline/controls.tsx +151 -0
  100. package/src/timeline/decisions.tsx +651 -0
  101. package/src/timeline/feedback.tsx +251 -0
  102. package/src/timeline/icon-nodes.generated.ts +1830 -0
  103. package/src/timeline/icon.tsx +44 -0
  104. package/src/timeline/index.ts +67 -0
  105. package/src/timeline/markdown.tsx +510 -0
  106. package/src/timeline/message-attachments.tsx +155 -0
  107. package/src/timeline/message-timeline.tsx +1042 -0
  108. package/src/timeline/model-picker.tsx +450 -0
  109. package/src/timeline/primitives.tsx +561 -0
  110. package/src/timeline/queue-dock.tsx +331 -0
  111. package/src/timeline/session-actions.tsx +379 -0
  112. package/src/timeline/session-list.tsx +338 -0
  113. package/src/timeline/session-screen.tsx +488 -0
  114. package/src/timeline/session-signals.tsx +312 -0
  115. package/src/timeline/sheet.tsx +153 -0
  116. package/src/timeline/theme.tsx +128 -0
  117. package/src/timeline/thinking-orb.tsx +93 -0
  118. package/src/timeline/turn.tsx +569 -0
  119. package/src/ui/attention.tsx +220 -0
  120. package/src/ui/cards.tsx +267 -0
  121. package/src/ui/composer.tsx +296 -0
  122. package/src/ui/format.ts +86 -0
  123. package/src/ui/icons.tsx +131 -0
  124. package/src/ui/index.ts +18 -0
  125. package/src/ui/steps-sheet.tsx +71 -0
  126. package/src/ui/theme.ts +261 -0
  127. package/src/ui/timeline.tsx +837 -0
  128. package/src/ui/web-tokens.gen.ts +94 -0
  129. package/src/use-native-session.ts +219 -0
  130. package/src/view-model.ts +485 -0
  131. package/src/voice-input.ts +382 -0
  132. package/src/webrtc.ts +30 -0
@@ -0,0 +1,155 @@
1
+ import type { FileAsset, OpenGeniClient, ResourceRef } from "@opengeni/sdk";
2
+ import { useEffect, useState } from "react";
3
+ import { ActivityIndicator, Image, Linking, Pressable, Text, View } from "react-native";
4
+ import { Icon } from "./icon";
5
+ import { fontStyle, useNativeTimelineTheme } from "./theme";
6
+
7
+ type AttachmentClient = Pick<OpenGeniClient, "getFile" | "createFileDownloadUrl">;
8
+ type FileResource = Extract<ResourceRef, { kind: "file" }>;
9
+
10
+ const PREVIEW_WIDTH = 200;
11
+
12
+ /**
13
+ * Files sent with a user message, above its bubble as on web: images as
14
+ * signed previews (tap opens the full image), other files as named chips.
15
+ */
16
+ export function NativeMessageAttachments(props: {
17
+ client: AttachmentClient;
18
+ workspaceId: string;
19
+ sessionId?: string | undefined;
20
+ resources: readonly ResourceRef[];
21
+ }) {
22
+ const files = props.resources.filter(
23
+ (resource): resource is FileResource => resource.kind === "file",
24
+ );
25
+ if (files.length === 0) return null;
26
+ return (
27
+ <View style={{ flexDirection: "row", flexWrap: "wrap", justifyContent: "flex-end", gap: 6 }}>
28
+ {files.map((resource) => (
29
+ <Attachment
30
+ key={resource.fileId}
31
+ client={props.client}
32
+ workspaceId={props.workspaceId}
33
+ sessionId={props.sessionId}
34
+ resource={resource}
35
+ />
36
+ ))}
37
+ </View>
38
+ );
39
+ }
40
+
41
+ function Attachment(props: {
42
+ client: AttachmentClient;
43
+ workspaceId: string;
44
+ sessionId?: string | undefined;
45
+ resource: FileResource;
46
+ }) {
47
+ const theme = useNativeTimelineTheme();
48
+ const c = theme.colors;
49
+ const [asset, setAsset] = useState<FileAsset | null>(null);
50
+ const [url, setUrl] = useState<string | null>(null);
51
+ const [ratio, setRatio] = useState(1);
52
+ const [failed, setFailed] = useState(false);
53
+ const { client, workspaceId, sessionId } = props;
54
+ const fileId = props.resource.fileId;
55
+
56
+ useEffect(() => {
57
+ let current = true;
58
+ setAsset(null);
59
+ setUrl(null);
60
+ setFailed(false);
61
+ const options = sessionId ? { sessionId } : {};
62
+ void (async () => {
63
+ try {
64
+ const file = await client.getFile(workspaceId, fileId, options);
65
+ if (!current) return;
66
+ setAsset(file);
67
+ if (!file.contentType.startsWith("image/")) return;
68
+ const signed = await client.createFileDownloadUrl(workspaceId, fileId, options);
69
+ if (current) setUrl(signed.url);
70
+ } catch {
71
+ if (current) setFailed(true);
72
+ }
73
+ })();
74
+ return () => {
75
+ current = false;
76
+ };
77
+ }, [client, fileId, sessionId, workspaceId]);
78
+
79
+ const open = async () => {
80
+ try {
81
+ const target =
82
+ url ??
83
+ (await client.createFileDownloadUrl(workspaceId, fileId, sessionId ? { sessionId } : {}))
84
+ .url;
85
+ await Linking.openURL(target);
86
+ } catch {
87
+ // Opening is best effort; the chip stays.
88
+ }
89
+ };
90
+ const name = asset?.filename ?? "Attachment";
91
+ const image = asset?.contentType.startsWith("image/") === true && !failed;
92
+
93
+ if (image) {
94
+ return (
95
+ <Pressable
96
+ accessibilityRole="imagebutton"
97
+ accessibilityLabel={`Open ${name}`}
98
+ onPress={() => void open()}
99
+ style={{
100
+ width: PREVIEW_WIDTH,
101
+ height: Math.min(260, Math.max(90, PREVIEW_WIDTH / ratio)),
102
+ borderRadius: 12,
103
+ overflow: "hidden",
104
+ borderWidth: 1,
105
+ borderColor: c.border,
106
+ backgroundColor: c["surface-2"],
107
+ alignItems: "center",
108
+ justifyContent: "center",
109
+ }}
110
+ >
111
+ {url ? (
112
+ <Image
113
+ source={{ uri: url }}
114
+ resizeMode="cover"
115
+ onLoad={(event) => {
116
+ const { width, height } = event.nativeEvent.source;
117
+ if (width > 0 && height > 0) setRatio(width / height);
118
+ }}
119
+ onError={() => setFailed(true)}
120
+ style={{ width: "100%", height: "100%" }}
121
+ />
122
+ ) : (
123
+ <ActivityIndicator size="small" color={c["fg-muted"]} />
124
+ )}
125
+ </Pressable>
126
+ );
127
+ }
128
+ return (
129
+ <Pressable
130
+ accessibilityRole="button"
131
+ accessibilityLabel={`Open ${name}`}
132
+ onPress={() => void open()}
133
+ style={({ pressed }) => ({
134
+ flexDirection: "row",
135
+ alignItems: "center",
136
+ gap: 6,
137
+ maxWidth: 240,
138
+ height: 34,
139
+ paddingHorizontal: 10,
140
+ borderRadius: 10,
141
+ borderWidth: 1,
142
+ borderColor: c.border,
143
+ backgroundColor: pressed ? c.hover : c["surface-1"],
144
+ })}
145
+ >
146
+ <Icon name="file-text" size={14} color={c["fg-muted"]} />
147
+ <Text
148
+ numberOfLines={1}
149
+ style={{ ...fontStyle(theme, 500), fontSize: 13, color: c.fg, flexShrink: 1 }}
150
+ >
151
+ {name}
152
+ </Text>
153
+ </Pressable>
154
+ );
155
+ }