@harkenapp/sdk-react-native 0.0.1-alpha.1

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 (235) hide show
  1. package/README.md +67 -0
  2. package/app.plugin.cjs +135 -0
  3. package/app.plugin.js +1 -0
  4. package/dist/api/client.d.ts +67 -0
  5. package/dist/api/client.d.ts.map +1 -0
  6. package/dist/api/client.js +163 -0
  7. package/dist/api/client.js.map +1 -0
  8. package/dist/api/errors.d.ts +46 -0
  9. package/dist/api/errors.d.ts.map +1 -0
  10. package/dist/api/errors.js +72 -0
  11. package/dist/api/errors.js.map +1 -0
  12. package/dist/api/index.d.ts +7 -0
  13. package/dist/api/index.d.ts.map +1 -0
  14. package/dist/api/index.js +20 -0
  15. package/dist/api/index.js.map +1 -0
  16. package/dist/api/retry.d.ts +29 -0
  17. package/dist/api/retry.d.ts.map +1 -0
  18. package/dist/api/retry.js +74 -0
  19. package/dist/api/retry.js.map +1 -0
  20. package/dist/attachments/FeedbackSheet.d.ts +88 -0
  21. package/dist/attachments/FeedbackSheet.d.ts.map +1 -0
  22. package/dist/attachments/FeedbackSheet.js +250 -0
  23. package/dist/attachments/FeedbackSheet.js.map +1 -0
  24. package/dist/attachments/index.d.ts +20 -0
  25. package/dist/attachments/index.d.ts.map +1 -0
  26. package/dist/attachments/index.js +40 -0
  27. package/dist/attachments/index.js.map +1 -0
  28. package/dist/components/AttachmentGrid.d.ts +94 -0
  29. package/dist/components/AttachmentGrid.d.ts.map +1 -0
  30. package/dist/components/AttachmentGrid.js +132 -0
  31. package/dist/components/AttachmentGrid.js.map +1 -0
  32. package/dist/components/AttachmentPicker.d.ts +98 -0
  33. package/dist/components/AttachmentPicker.d.ts.map +1 -0
  34. package/dist/components/AttachmentPicker.js +297 -0
  35. package/dist/components/AttachmentPicker.js.map +1 -0
  36. package/dist/components/AttachmentPreview.d.ts +78 -0
  37. package/dist/components/AttachmentPreview.d.ts.map +1 -0
  38. package/dist/components/AttachmentPreview.js +133 -0
  39. package/dist/components/AttachmentPreview.js.map +1 -0
  40. package/dist/components/CategorySelector.d.ts +77 -0
  41. package/dist/components/CategorySelector.d.ts.map +1 -0
  42. package/dist/components/CategorySelector.js +117 -0
  43. package/dist/components/CategorySelector.js.map +1 -0
  44. package/dist/components/FeedbackForm.d.ts +50 -0
  45. package/dist/components/FeedbackForm.d.ts.map +1 -0
  46. package/dist/components/FeedbackForm.js +141 -0
  47. package/dist/components/FeedbackForm.js.map +1 -0
  48. package/dist/components/FeedbackSheet.d.ts +75 -0
  49. package/dist/components/FeedbackSheet.d.ts.map +1 -0
  50. package/dist/components/FeedbackSheet.js +215 -0
  51. package/dist/components/FeedbackSheet.js.map +1 -0
  52. package/dist/components/ThemedButton.d.ts +23 -0
  53. package/dist/components/ThemedButton.d.ts.map +1 -0
  54. package/dist/components/ThemedButton.js +77 -0
  55. package/dist/components/ThemedButton.js.map +1 -0
  56. package/dist/components/ThemedText.d.ts +16 -0
  57. package/dist/components/ThemedText.d.ts.map +1 -0
  58. package/dist/components/ThemedText.js +44 -0
  59. package/dist/components/ThemedText.js.map +1 -0
  60. package/dist/components/ThemedTextInput.d.ts +13 -0
  61. package/dist/components/ThemedTextInput.d.ts.map +1 -0
  62. package/dist/components/ThemedTextInput.js +76 -0
  63. package/dist/components/ThemedTextInput.js.map +1 -0
  64. package/dist/components/UploadStatusOverlay.d.ts +82 -0
  65. package/dist/components/UploadStatusOverlay.d.ts.map +1 -0
  66. package/dist/components/UploadStatusOverlay.js +319 -0
  67. package/dist/components/UploadStatusOverlay.js.map +1 -0
  68. package/dist/components/index.d.ts +19 -0
  69. package/dist/components/index.d.ts.map +1 -0
  70. package/dist/components/index.js +28 -0
  71. package/dist/components/index.js.map +1 -0
  72. package/dist/context/HarkenContext.d.ts +62 -0
  73. package/dist/context/HarkenContext.d.ts.map +1 -0
  74. package/dist/context/HarkenContext.js +128 -0
  75. package/dist/context/HarkenContext.js.map +1 -0
  76. package/dist/context/index.d.ts +3 -0
  77. package/dist/context/index.d.ts.map +1 -0
  78. package/dist/context/index.js +7 -0
  79. package/dist/context/index.js.map +1 -0
  80. package/dist/domain/index.d.ts +3 -0
  81. package/dist/domain/index.d.ts.map +1 -0
  82. package/dist/domain/index.js +7 -0
  83. package/dist/domain/index.js.map +1 -0
  84. package/dist/domain/upload-queue.d.ts +116 -0
  85. package/dist/domain/upload-queue.d.ts.map +1 -0
  86. package/dist/domain/upload-queue.js +34 -0
  87. package/dist/domain/upload-queue.js.map +1 -0
  88. package/dist/hooks/index.d.ts +6 -0
  89. package/dist/hooks/index.d.ts.map +1 -0
  90. package/dist/hooks/index.js +16 -0
  91. package/dist/hooks/index.js.map +1 -0
  92. package/dist/hooks/useAnonymousId.d.ts +28 -0
  93. package/dist/hooks/useAnonymousId.d.ts.map +1 -0
  94. package/dist/hooks/useAnonymousId.js +59 -0
  95. package/dist/hooks/useAnonymousId.js.map +1 -0
  96. package/dist/hooks/useAttachmentPicker.d.ts +84 -0
  97. package/dist/hooks/useAttachmentPicker.d.ts.map +1 -0
  98. package/dist/hooks/useAttachmentPicker.js +181 -0
  99. package/dist/hooks/useAttachmentPicker.js.map +1 -0
  100. package/dist/hooks/useAttachmentStatus.d.ts +51 -0
  101. package/dist/hooks/useAttachmentStatus.d.ts.map +1 -0
  102. package/dist/hooks/useAttachmentStatus.js +69 -0
  103. package/dist/hooks/useAttachmentStatus.js.map +1 -0
  104. package/dist/hooks/useAttachmentUpload.d.ts +101 -0
  105. package/dist/hooks/useAttachmentUpload.d.ts.map +1 -0
  106. package/dist/hooks/useAttachmentUpload.js +293 -0
  107. package/dist/hooks/useAttachmentUpload.js.map +1 -0
  108. package/dist/hooks/useFeedback.d.ts +55 -0
  109. package/dist/hooks/useFeedback.d.ts.map +1 -0
  110. package/dist/hooks/useFeedback.js +96 -0
  111. package/dist/hooks/useFeedback.js.map +1 -0
  112. package/dist/hooks/useHarkenContext.d.ts +25 -0
  113. package/dist/hooks/useHarkenContext.d.ts.map +1 -0
  114. package/dist/hooks/useHarkenContext.js +35 -0
  115. package/dist/hooks/useHarkenContext.js.map +1 -0
  116. package/dist/hooks/useHarkenTheme.d.ts +26 -0
  117. package/dist/hooks/useHarkenTheme.d.ts.map +1 -0
  118. package/dist/hooks/useHarkenTheme.js +36 -0
  119. package/dist/hooks/useHarkenTheme.js.map +1 -0
  120. package/dist/index.d.ts +49 -0
  121. package/dist/index.d.ts.map +1 -0
  122. package/dist/index.js +91 -0
  123. package/dist/index.js.map +1 -0
  124. package/dist/services/index.d.ts +4 -0
  125. package/dist/services/index.d.ts.map +1 -0
  126. package/dist/services/index.js +9 -0
  127. package/dist/services/index.js.map +1 -0
  128. package/dist/services/uploadQueueService.d.ts +193 -0
  129. package/dist/services/uploadQueueService.d.ts.map +1 -0
  130. package/dist/services/uploadQueueService.js +623 -0
  131. package/dist/services/uploadQueueService.js.map +1 -0
  132. package/dist/services/uploadQueueStorage.d.ts +30 -0
  133. package/dist/services/uploadQueueStorage.d.ts.map +1 -0
  134. package/dist/services/uploadQueueStorage.js +77 -0
  135. package/dist/services/uploadQueueStorage.js.map +1 -0
  136. package/dist/storage/IdentityStore.d.ts +38 -0
  137. package/dist/storage/IdentityStore.d.ts.map +1 -0
  138. package/dist/storage/IdentityStore.js +83 -0
  139. package/dist/storage/IdentityStore.js.map +1 -0
  140. package/dist/storage/SecureStoreAdapter.d.ts +28 -0
  141. package/dist/storage/SecureStoreAdapter.d.ts.map +1 -0
  142. package/dist/storage/SecureStoreAdapter.js +52 -0
  143. package/dist/storage/SecureStoreAdapter.js.map +1 -0
  144. package/dist/storage/defaultStorage.d.ts +20 -0
  145. package/dist/storage/defaultStorage.d.ts.map +1 -0
  146. package/dist/storage/defaultStorage.js +131 -0
  147. package/dist/storage/defaultStorage.js.map +1 -0
  148. package/dist/storage/index.d.ts +6 -0
  149. package/dist/storage/index.d.ts.map +1 -0
  150. package/dist/storage/index.js +13 -0
  151. package/dist/storage/index.js.map +1 -0
  152. package/dist/storage/types.d.ts +32 -0
  153. package/dist/storage/types.d.ts.map +1 -0
  154. package/dist/storage/types.js +11 -0
  155. package/dist/storage/types.js.map +1 -0
  156. package/dist/theme/defaults.d.ts +43 -0
  157. package/dist/theme/defaults.d.ts.map +1 -0
  158. package/dist/theme/defaults.js +128 -0
  159. package/dist/theme/defaults.js.map +1 -0
  160. package/dist/theme/index.d.ts +3 -0
  161. package/dist/theme/index.d.ts.map +1 -0
  162. package/dist/theme/index.js +14 -0
  163. package/dist/theme/index.js.map +1 -0
  164. package/dist/theme/types.d.ts +136 -0
  165. package/dist/theme/types.d.ts.map +1 -0
  166. package/dist/theme/types.js +3 -0
  167. package/dist/theme/types.js.map +1 -0
  168. package/dist/types/config.d.ts +100 -0
  169. package/dist/types/config.d.ts.map +1 -0
  170. package/dist/types/config.js +3 -0
  171. package/dist/types/config.js.map +1 -0
  172. package/dist/types/index.d.ts +3 -0
  173. package/dist/types/index.d.ts.map +1 -0
  174. package/dist/types/index.js +3 -0
  175. package/dist/types/index.js.map +1 -0
  176. package/dist/types/openapi.d.ts +601 -0
  177. package/dist/types/openapi.d.ts.map +1 -0
  178. package/dist/types/openapi.js +7 -0
  179. package/dist/types/openapi.js.map +1 -0
  180. package/dist/utils/index.d.ts +2 -0
  181. package/dist/utils/index.d.ts.map +1 -0
  182. package/dist/utils/index.js +6 -0
  183. package/dist/utils/index.js.map +1 -0
  184. package/dist/utils/uuid.d.ts +10 -0
  185. package/dist/utils/uuid.d.ts.map +1 -0
  186. package/dist/utils/uuid.js +60 -0
  187. package/dist/utils/uuid.js.map +1 -0
  188. package/package.json +124 -0
  189. package/src/@types/expo-file-system-legacy.d.ts +13 -0
  190. package/src/api/client.ts +250 -0
  191. package/src/api/errors.ts +84 -0
  192. package/src/api/index.ts +15 -0
  193. package/src/api/retry.ts +99 -0
  194. package/src/attachments/FeedbackSheet.tsx +400 -0
  195. package/src/attachments/index.ts +70 -0
  196. package/src/components/AttachmentGrid.tsx +247 -0
  197. package/src/components/AttachmentPicker.tsx +391 -0
  198. package/src/components/AttachmentPreview.tsx +210 -0
  199. package/src/components/CategorySelector.tsx +174 -0
  200. package/src/components/FeedbackForm.tsx +216 -0
  201. package/src/components/FeedbackSheet.tsx +321 -0
  202. package/src/components/ThemedButton.tsx +127 -0
  203. package/src/components/ThemedText.tsx +65 -0
  204. package/src/components/ThemedTextInput.tsx +65 -0
  205. package/src/components/UploadStatusOverlay.tsx +440 -0
  206. package/src/components/index.ts +39 -0
  207. package/src/context/HarkenContext.tsx +129 -0
  208. package/src/context/index.ts +2 -0
  209. package/src/domain/index.ts +12 -0
  210. package/src/domain/upload-queue.ts +131 -0
  211. package/src/hooks/index.ts +10 -0
  212. package/src/hooks/useAnonymousId.ts +68 -0
  213. package/src/hooks/useAttachmentPicker.ts +243 -0
  214. package/src/hooks/useAttachmentStatus.ts +86 -0
  215. package/src/hooks/useAttachmentUpload.ts +370 -0
  216. package/src/hooks/useFeedback.ts +139 -0
  217. package/src/hooks/useHarkenContext.ts +35 -0
  218. package/src/hooks/useHarkenTheme.ts +36 -0
  219. package/src/index.ts +168 -0
  220. package/src/services/index.ts +11 -0
  221. package/src/services/uploadQueueService.ts +727 -0
  222. package/src/services/uploadQueueStorage.ts +78 -0
  223. package/src/storage/IdentityStore.ts +89 -0
  224. package/src/storage/SecureStoreAdapter.ts +59 -0
  225. package/src/storage/defaultStorage.ts +109 -0
  226. package/src/storage/index.ts +5 -0
  227. package/src/storage/types.ts +34 -0
  228. package/src/theme/defaults.ts +151 -0
  229. package/src/theme/index.ts +23 -0
  230. package/src/theme/types.ts +157 -0
  231. package/src/types/config.ts +112 -0
  232. package/src/types/index.ts +10 -0
  233. package/src/types/openapi.ts +601 -0
  234. package/src/utils/index.ts +1 -0
  235. package/src/utils/uuid.ts +77 -0
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AttachmentGrid = AttachmentGrid;
7
+ const react_1 = __importDefault(require("react"));
8
+ const react_native_1 = require("react-native");
9
+ const hooks_1 = require("../hooks");
10
+ const ThemedText_1 = require("./ThemedText");
11
+ const AttachmentPreview_1 = require("./AttachmentPreview");
12
+ /**
13
+ * Grid component for displaying multiple attachments.
14
+ *
15
+ * Shows attachment previews with upload status and an optional add button.
16
+ *
17
+ * @example
18
+ * ```tsx
19
+ * // Basic usage
20
+ * const { attachments, pickImage, retryAttachment, removeAttachment } = useAttachmentUpload();
21
+ *
22
+ * <AttachmentGrid
23
+ * attachments={attachments}
24
+ * onRetry={retryAttachment}
25
+ * onRemove={removeAttachment}
26
+ * onAdd={() => pickImage('library')}
27
+ * maxAttachments={5}
28
+ * />
29
+ *
30
+ * // With custom add button
31
+ * <AttachmentGrid
32
+ * attachments={attachments}
33
+ * onAdd={showPicker}
34
+ * addButtonIcon={<PlusIcon />}
35
+ * addButtonLabel="Upload"
36
+ * addButtonStyle={{ borderColor: 'blue' }}
37
+ * />
38
+ *
39
+ * // With fully custom renderers
40
+ * <AttachmentGrid
41
+ * attachments={attachments}
42
+ * renderAddButton={(onPress, disabled) => (
43
+ * <MyButton onPress={onPress} disabled={disabled}>Add File</MyButton>
44
+ * )}
45
+ * renderTile={(attachment, onRetry, onRemove) => (
46
+ * <MyTile
47
+ * key={attachment.attachmentId}
48
+ * {...attachment}
49
+ * onRetry={onRetry}
50
+ * onRemove={onRemove}
51
+ * />
52
+ * )}
53
+ * />
54
+ * ```
55
+ */
56
+ function AttachmentGrid({ attachments, onRetry, onRemove, onAdd, maxAttachments = 10, tileSize = 80, gap, showAddButton = true, disabled = false, style, addButtonLabel = 'Add', addButtonIcon = '+', addButtonStyle, emptyText = 'No attachments', renderAddButton, renderTile, tileStyle, tileImageStyle, statusLabels, getFileIcon, renderPlaceholder, }) {
57
+ const theme = (0, hooks_1.useHarkenTheme)();
58
+ const effectiveGap = gap ?? theme.spacing.sm;
59
+ const canAddMore = attachments.length < maxAttachments;
60
+ const shouldShowAddButton = showAddButton && canAddMore && onAdd;
61
+ return (<react_native_1.View style={[
62
+ styles.container,
63
+ { gap: effectiveGap },
64
+ style,
65
+ ]}>
66
+ {attachments.map((attachment) => {
67
+ const handleRetry = onRetry ? () => onRetry(attachment.attachmentId) : undefined;
68
+ const handleRemove = onRemove ? () => onRemove(attachment.attachmentId) : undefined;
69
+ // Use custom renderer if provided
70
+ if (renderTile) {
71
+ return (<react_1.default.Fragment key={attachment.attachmentId}>
72
+ {renderTile(attachment, handleRetry, handleRemove)}
73
+ </react_1.default.Fragment>);
74
+ }
75
+ return (<AttachmentPreview_1.AttachmentPreview key={attachment.attachmentId} uri={attachment.localUri} mimeType={attachment.mimeType} fileName={attachment.fileName} phase={attachment.phase} progress={attachment.progress} error={attachment.error} onRetry={handleRetry} onRemove={handleRemove} size={tileSize} style={tileStyle} imageStyle={tileImageStyle} statusLabels={statusLabels} getFileIcon={getFileIcon} renderPlaceholder={renderPlaceholder}/>);
76
+ })}
77
+
78
+ {shouldShowAddButton && (renderAddButton ? (renderAddButton(onAdd, disabled)) : (<react_native_1.Pressable onPress={onAdd} disabled={disabled} style={({ pressed }) => [
79
+ styles.addButton,
80
+ {
81
+ width: tileSize,
82
+ height: tileSize,
83
+ borderRadius: theme.radii.md,
84
+ backgroundColor: pressed
85
+ ? theme.colors.border
86
+ : theme.colors.backgroundSecondary,
87
+ borderWidth: 2,
88
+ borderColor: theme.colors.border,
89
+ borderStyle: 'dashed',
90
+ opacity: disabled ? 0.5 : 1,
91
+ },
92
+ addButtonStyle,
93
+ ]}>
94
+ {typeof addButtonIcon === 'string' ? (<ThemedText_1.ThemedText style={[styles.addIcon, { color: theme.colors.textSecondary }]}>
95
+ {addButtonIcon}
96
+ </ThemedText_1.ThemedText>) : (addButtonIcon)}
97
+ <ThemedText_1.ThemedText variant="caption" secondary>
98
+ {addButtonLabel}
99
+ </ThemedText_1.ThemedText>
100
+ </react_native_1.Pressable>))}
101
+
102
+ {attachments.length === 0 && !shouldShowAddButton && (<react_native_1.View style={[
103
+ styles.emptyState,
104
+ {
105
+ padding: theme.spacing.md,
106
+ },
107
+ ]}>
108
+ <ThemedText_1.ThemedText variant="caption" secondary>
109
+ {emptyText}
110
+ </ThemedText_1.ThemedText>
111
+ </react_native_1.View>)}
112
+ </react_native_1.View>);
113
+ }
114
+ const styles = react_native_1.StyleSheet.create({
115
+ container: {
116
+ flexDirection: 'row',
117
+ flexWrap: 'wrap',
118
+ },
119
+ addButton: {
120
+ alignItems: 'center',
121
+ justifyContent: 'center',
122
+ },
123
+ addIcon: {
124
+ fontSize: 28,
125
+ fontWeight: '300',
126
+ lineHeight: 32,
127
+ },
128
+ emptyState: {
129
+ alignItems: 'center',
130
+ },
131
+ });
132
+ //# sourceMappingURL=AttachmentGrid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttachmentGrid.js","sourceRoot":"","sources":["../../src/components/AttachmentGrid.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ import React from 'react';
2
+ import type { ViewStyle, StyleProp } from 'react-native';
3
+ export type AttachmentSource = 'camera' | 'library' | 'document';
4
+ /**
5
+ * Configuration for a single picker option.
6
+ */
7
+ export interface PickerOptionConfig {
8
+ /** Custom label text */
9
+ label?: string;
10
+ /** Custom description text */
11
+ description?: string;
12
+ /** Icon background color (defaults to theme accent colors) */
13
+ color?: string;
14
+ /** Custom icon element (replaces default) */
15
+ icon?: React.ReactNode;
16
+ /** Hide this option entirely */
17
+ hidden?: boolean;
18
+ }
19
+ export interface AttachmentPickerProps {
20
+ /** Whether the picker is visible */
21
+ visible: boolean;
22
+ /** Callback when picker is closed */
23
+ onClose: () => void;
24
+ /** Callback when camera is selected */
25
+ onTakePhoto: () => void;
26
+ /** Callback when photo library is selected */
27
+ onPickFromLibrary: () => void;
28
+ /** Callback when document picker is selected */
29
+ onPickDocument: () => void;
30
+ /** Title shown in the picker */
31
+ title?: string;
32
+ /**
33
+ * Custom render function for option icons.
34
+ * @deprecated Use `options.camera.icon` etc. instead
35
+ */
36
+ renderIcon?: (source: AttachmentSource) => React.ReactNode;
37
+ /** Customize individual picker options */
38
+ options?: {
39
+ camera?: PickerOptionConfig;
40
+ library?: PickerOptionConfig;
41
+ document?: PickerOptionConfig;
42
+ };
43
+ /** Cancel button label */
44
+ cancelLabel?: string;
45
+ /** Overlay background color */
46
+ overlayColor?: string;
47
+ /** Bottom sheet corner radius */
48
+ sheetRadius?: number;
49
+ /** Additional style for bottom sheet container */
50
+ sheetStyle?: StyleProp<ViewStyle>;
51
+ /** Additional style for option rows */
52
+ optionStyle?: StyleProp<ViewStyle>;
53
+ }
54
+ /**
55
+ * Platform-appropriate attachment source picker.
56
+ *
57
+ * - **iOS**: Uses native `ActionSheetIOS` for platform-native experience
58
+ * - **Android**: Uses a bottom sheet modal with styled options
59
+ *
60
+ * @example
61
+ * ```tsx
62
+ * // Basic usage
63
+ * <AttachmentPicker
64
+ * visible={showPicker}
65
+ * onClose={() => setShowPicker(false)}
66
+ * onTakePhoto={() => pickImage('camera')}
67
+ * onPickFromLibrary={() => pickImage('library')}
68
+ * onPickDocument={() => pickDocument()}
69
+ * />
70
+ *
71
+ * // With customization
72
+ * <AttachmentPicker
73
+ * visible={showPicker}
74
+ * onClose={() => setShowPicker(false)}
75
+ * onTakePhoto={() => pickImage('camera')}
76
+ * onPickFromLibrary={() => pickImage('library')}
77
+ * onPickDocument={() => pickDocument()}
78
+ * title="Attach File"
79
+ * cancelLabel="Dismiss"
80
+ * options={{
81
+ * camera: {
82
+ * label: 'Take Photo',
83
+ * icon: <CameraIcon />,
84
+ * color: '#007AFF',
85
+ * },
86
+ * library: {
87
+ * label: 'Choose Photo',
88
+ * icon: <PhotoIcon />,
89
+ * },
90
+ * document: {
91
+ * hidden: true, // Hide files option
92
+ * },
93
+ * }}
94
+ * />
95
+ * ```
96
+ */
97
+ export declare function AttachmentPicker({ visible, onClose, onTakePhoto, onPickFromLibrary, onPickDocument, title, renderIcon, options: optionOverrides, cancelLabel, overlayColor, sheetRadius, sheetStyle, optionStyle, }: AttachmentPickerProps): React.JSX.Element | null;
98
+ //# sourceMappingURL=AttachmentPicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttachmentPicker.d.ts","sourceRoot":"","sources":["../../src/components/AttachmentPicker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAUjD,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAKzD,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,wBAAwB;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,gCAAgC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,qCAAqC;IACrC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,uCAAuC;IACvC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,8CAA8C;IAC9C,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,gDAAgD;IAChD,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,gCAAgC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,KAAK,CAAC,SAAS,CAAC;IAC3D,0CAA0C;IAC1C,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,kBAAkB,CAAC;QAC5B,OAAO,CAAC,EAAE,kBAAkB,CAAC;QAC7B,QAAQ,CAAC,EAAE,kBAAkB,CAAC;KAC/B,CAAC;IACF,0BAA0B;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,UAAU,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAClC,uCAAuC;IACvC,WAAW,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CACpC;AAYD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,OAAO,EACP,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,KAAwB,EACxB,UAAU,EACV,OAAO,EAAE,eAAe,EACxB,WAAsB,EACtB,YAAY,EACZ,WAAW,EACX,UAAU,EACV,WAAW,GACZ,EAAE,qBAAqB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CA4LlD"}
@@ -0,0 +1,297 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.AttachmentPicker = AttachmentPicker;
37
+ const react_1 = __importStar(require("react"));
38
+ const react_native_1 = require("react-native");
39
+ const react_native_safe_area_context_1 = require("react-native-safe-area-context");
40
+ const hooks_1 = require("../hooks");
41
+ const ThemedText_1 = require("./ThemedText");
42
+ /**
43
+ * Platform-appropriate attachment source picker.
44
+ *
45
+ * - **iOS**: Uses native `ActionSheetIOS` for platform-native experience
46
+ * - **Android**: Uses a bottom sheet modal with styled options
47
+ *
48
+ * @example
49
+ * ```tsx
50
+ * // Basic usage
51
+ * <AttachmentPicker
52
+ * visible={showPicker}
53
+ * onClose={() => setShowPicker(false)}
54
+ * onTakePhoto={() => pickImage('camera')}
55
+ * onPickFromLibrary={() => pickImage('library')}
56
+ * onPickDocument={() => pickDocument()}
57
+ * />
58
+ *
59
+ * // With customization
60
+ * <AttachmentPicker
61
+ * visible={showPicker}
62
+ * onClose={() => setShowPicker(false)}
63
+ * onTakePhoto={() => pickImage('camera')}
64
+ * onPickFromLibrary={() => pickImage('library')}
65
+ * onPickDocument={() => pickDocument()}
66
+ * title="Attach File"
67
+ * cancelLabel="Dismiss"
68
+ * options={{
69
+ * camera: {
70
+ * label: 'Take Photo',
71
+ * icon: <CameraIcon />,
72
+ * color: '#007AFF',
73
+ * },
74
+ * library: {
75
+ * label: 'Choose Photo',
76
+ * icon: <PhotoIcon />,
77
+ * },
78
+ * document: {
79
+ * hidden: true, // Hide files option
80
+ * },
81
+ * }}
82
+ * />
83
+ * ```
84
+ */
85
+ function AttachmentPicker({ visible, onClose, onTakePhoto, onPickFromLibrary, onPickDocument, title = 'Add Attachment', renderIcon, options: optionOverrides, cancelLabel = 'Cancel', overlayColor, sheetRadius, sheetStyle, optionStyle, }) {
86
+ const theme = (0, hooks_1.useHarkenTheme)();
87
+ const screenHeight = react_native_1.Dimensions.get('window').height;
88
+ // Prevent double-triggering ActionSheetIOS if callbacks change
89
+ const isShowingRef = (0, react_1.useRef)(false);
90
+ // Build options with defaults and overrides
91
+ const options = [
92
+ {
93
+ key: 'camera',
94
+ label: optionOverrides?.camera?.label ?? 'Camera',
95
+ description: optionOverrides?.camera?.description ?? 'Take a new photo',
96
+ color: optionOverrides?.camera?.color ?? theme.colors.accent1,
97
+ icon: optionOverrides?.camera?.icon ??
98
+ (renderIcon ? renderIcon('camera') : <DefaultIcon emoji="📷"/>),
99
+ action: onTakePhoto,
100
+ hidden: optionOverrides?.camera?.hidden ?? false,
101
+ },
102
+ {
103
+ key: 'library',
104
+ label: optionOverrides?.library?.label ?? 'Photo Library',
105
+ description: optionOverrides?.library?.description ?? 'Choose from existing photos',
106
+ color: optionOverrides?.library?.color ?? theme.colors.accent2,
107
+ icon: optionOverrides?.library?.icon ??
108
+ (renderIcon ? renderIcon('library') : <DefaultIcon emoji="🖼️"/>),
109
+ action: onPickFromLibrary,
110
+ hidden: optionOverrides?.library?.hidden ?? false,
111
+ },
112
+ {
113
+ key: 'document',
114
+ label: optionOverrides?.document?.label ?? 'Files',
115
+ description: optionOverrides?.document?.description ?? 'Browse documents and files',
116
+ color: optionOverrides?.document?.color ?? theme.colors.accent3,
117
+ icon: optionOverrides?.document?.icon ??
118
+ (renderIcon ? renderIcon('document') : <DefaultIcon emoji="📄"/>),
119
+ action: onPickDocument,
120
+ hidden: optionOverrides?.document?.hidden ?? false,
121
+ },
122
+ ];
123
+ const visibleOptions = options.filter((o) => !o.hidden);
124
+ const handleOptionPress = (action) => {
125
+ onClose();
126
+ // Small delay to let modal close animation finish
127
+ setTimeout(action, 100);
128
+ };
129
+ // iOS: Use native ActionSheetIOS
130
+ (0, react_1.useEffect)(() => {
131
+ if (!visible) {
132
+ isShowingRef.current = false;
133
+ return;
134
+ }
135
+ if (visible && react_native_1.Platform.OS === 'ios' && !isShowingRef.current) {
136
+ isShowingRef.current = true;
137
+ // Build iOS action sheet options from visible options
138
+ const iosOptions = [cancelLabel, ...visibleOptions.map((o) => o.label)];
139
+ react_native_1.ActionSheetIOS.showActionSheetWithOptions({
140
+ options: iosOptions,
141
+ cancelButtonIndex: 0,
142
+ title,
143
+ }, (buttonIndex) => {
144
+ isShowingRef.current = false;
145
+ onClose();
146
+ if (buttonIndex > 0) {
147
+ const selectedOption = visibleOptions[buttonIndex - 1];
148
+ if (selectedOption) {
149
+ setTimeout(() => selectedOption.action(), 100);
150
+ }
151
+ }
152
+ });
153
+ }
154
+ }, [visible, onClose, visibleOptions, title, cancelLabel]);
155
+ // iOS: Don't render modal - we use ActionSheetIOS instead
156
+ if (react_native_1.Platform.OS === 'ios') {
157
+ return null;
158
+ }
159
+ const resolvedOverlayColor = overlayColor ?? theme.colors.overlay;
160
+ const resolvedSheetRadius = sheetRadius ?? theme.radii.xl;
161
+ // Android: Use bottom sheet modal
162
+ return (<react_native_1.Modal visible={visible} transparent animationType="slide" onRequestClose={onClose}>
163
+ <react_native_safe_area_context_1.SafeAreaView style={styles.modalContainer}>
164
+ {/* Background overlay */}
165
+ <react_native_1.Pressable style={[styles.overlay, { backgroundColor: resolvedOverlayColor }]} onPress={onClose}>
166
+ {/* Bottom sheet */}
167
+ <react_native_1.View style={[
168
+ styles.bottomSheet,
169
+ {
170
+ backgroundColor: theme.colors.background,
171
+ maxHeight: screenHeight * 0.6,
172
+ borderTopLeftRadius: resolvedSheetRadius,
173
+ borderTopRightRadius: resolvedSheetRadius,
174
+ },
175
+ sheetStyle,
176
+ ]}
177
+ // Prevent touches from passing through to background
178
+ onStartShouldSetResponder={() => true}>
179
+ {/* Handle bar */}
180
+ <react_native_1.View style={styles.handleContainer}>
181
+ <react_native_1.View style={[
182
+ styles.handle,
183
+ { backgroundColor: theme.colors.textSecondary },
184
+ ]}/>
185
+ </react_native_1.View>
186
+
187
+ {/* Title */}
188
+ <react_native_1.View style={styles.titleContainer}>
189
+ <ThemedText_1.ThemedText variant="title" style={styles.title}>
190
+ {title}
191
+ </ThemedText_1.ThemedText>
192
+ </react_native_1.View>
193
+
194
+ {/* Options */}
195
+ <react_native_1.View style={styles.optionsContainer}>
196
+ {visibleOptions.map((option) => (<react_native_1.Pressable key={option.key} style={({ pressed }) => [
197
+ styles.option,
198
+ {
199
+ backgroundColor: pressed
200
+ ? theme.colors.border
201
+ : theme.colors.backgroundSecondary,
202
+ borderRadius: theme.radii.md,
203
+ },
204
+ optionStyle,
205
+ ]} onPress={() => handleOptionPress(option.action)}>
206
+ <react_native_1.View style={[
207
+ styles.iconContainer,
208
+ {
209
+ backgroundColor: option.color,
210
+ borderRadius: theme.radii.full,
211
+ },
212
+ ]}>
213
+ {option.icon}
214
+ </react_native_1.View>
215
+ <react_native_1.View style={styles.optionText}>
216
+ <ThemedText_1.ThemedText variant="label">{option.label}</ThemedText_1.ThemedText>
217
+ <ThemedText_1.ThemedText variant="caption" secondary>
218
+ {option.description}
219
+ </ThemedText_1.ThemedText>
220
+ </react_native_1.View>
221
+ </react_native_1.Pressable>))}
222
+
223
+ {/* Cancel Button */}
224
+ <react_native_1.Pressable style={styles.cancelButton} onPress={onClose}>
225
+ <ThemedText_1.ThemedText secondary>{cancelLabel}</ThemedText_1.ThemedText>
226
+ </react_native_1.Pressable>
227
+ </react_native_1.View>
228
+ </react_native_1.View>
229
+ </react_native_1.Pressable>
230
+ </react_native_safe_area_context_1.SafeAreaView>
231
+ </react_native_1.Modal>);
232
+ }
233
+ /**
234
+ * Default emoji icon component.
235
+ */
236
+ function DefaultIcon({ emoji }) {
237
+ return <ThemedText_1.ThemedText style={styles.defaultIcon}>{emoji}</ThemedText_1.ThemedText>;
238
+ }
239
+ const styles = react_native_1.StyleSheet.create({
240
+ modalContainer: {
241
+ flex: 1,
242
+ },
243
+ overlay: {
244
+ flex: 1,
245
+ justifyContent: 'flex-end',
246
+ },
247
+ bottomSheet: {
248
+ paddingBottom: 20,
249
+ },
250
+ handleContainer: {
251
+ alignItems: 'center',
252
+ paddingVertical: 12,
253
+ },
254
+ handle: {
255
+ width: 36,
256
+ height: 4,
257
+ borderRadius: 2,
258
+ opacity: 0.3,
259
+ },
260
+ titleContainer: {
261
+ paddingHorizontal: 20,
262
+ paddingBottom: 16,
263
+ },
264
+ title: {
265
+ textAlign: 'center',
266
+ },
267
+ optionsContainer: {
268
+ paddingHorizontal: 20,
269
+ },
270
+ option: {
271
+ flexDirection: 'row',
272
+ alignItems: 'center',
273
+ paddingVertical: 16,
274
+ paddingHorizontal: 16,
275
+ marginBottom: 8,
276
+ },
277
+ iconContainer: {
278
+ width: 44,
279
+ height: 44,
280
+ alignItems: 'center',
281
+ justifyContent: 'center',
282
+ marginRight: 16,
283
+ },
284
+ defaultIcon: {
285
+ fontSize: 22,
286
+ },
287
+ optionText: {
288
+ flex: 1,
289
+ gap: 2,
290
+ },
291
+ cancelButton: {
292
+ paddingVertical: 16,
293
+ alignItems: 'center',
294
+ marginTop: 12,
295
+ },
296
+ });
297
+ //# sourceMappingURL=AttachmentPicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttachmentPicker.js","sourceRoot":"","sources":["../../src/components/AttachmentPicker.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import React from 'react';
2
+ import type { ViewStyle, StyleProp, ImageStyle } from 'react-native';
3
+ import type { UploadStatusLabels } from './UploadStatusOverlay';
4
+ import { UploadPhase } from '../domain';
5
+ export interface AttachmentPreviewProps {
6
+ /** Local file URI for preview */
7
+ uri: string;
8
+ /** MIME type of the file */
9
+ mimeType?: string;
10
+ /** File name (shown for non-image files) */
11
+ fileName?: string;
12
+ /** Current upload phase */
13
+ phase: UploadPhase;
14
+ /** Upload progress (0.0 - 1.0) */
15
+ progress: number;
16
+ /** Error message if failed */
17
+ error?: string;
18
+ /** Callback when retry is pressed */
19
+ onRetry?: () => void;
20
+ /** Callback when remove is pressed */
21
+ onRemove?: () => void;
22
+ /** Size of the preview */
23
+ size?: number;
24
+ /** Additional container style */
25
+ style?: StyleProp<ViewStyle>;
26
+ /** Additional image style */
27
+ imageStyle?: StyleProp<ImageStyle>;
28
+ /** Custom renderer for non-image file placeholders */
29
+ renderPlaceholder?: (mimeType: string, fileName?: string) => React.ReactNode;
30
+ /** Custom file icon function (returns string emoji or React node) */
31
+ getFileIcon?: (mimeType: string) => React.ReactNode | string;
32
+ /** Custom labels for upload status overlay */
33
+ statusLabels?: UploadStatusLabels;
34
+ }
35
+ /**
36
+ * Preview component for a single attachment with upload status.
37
+ *
38
+ * Shows image thumbnail for images, file icon for other types.
39
+ * Includes upload status overlay with progress/retry/remove actions.
40
+ *
41
+ * @example
42
+ * ```tsx
43
+ * // Basic usage
44
+ * <AttachmentPreview
45
+ * uri={attachment.localUri}
46
+ * mimeType={attachment.mimeType}
47
+ * phase={attachment.phase}
48
+ * progress={attachment.progress}
49
+ * onRetry={() => retryAttachment(attachment.attachmentId)}
50
+ * onRemove={() => removeAttachment(attachment.attachmentId)}
51
+ * />
52
+ *
53
+ * // With custom file icon
54
+ * <AttachmentPreview
55
+ * uri={attachment.localUri}
56
+ * mimeType={attachment.mimeType}
57
+ * phase={attachment.phase}
58
+ * progress={attachment.progress}
59
+ * getFileIcon={(mime) => {
60
+ * if (mime === 'application/pdf') return <PdfIcon />;
61
+ * return '📄';
62
+ * }}
63
+ * />
64
+ *
65
+ * // With custom placeholder
66
+ * <AttachmentPreview
67
+ * uri={attachment.localUri}
68
+ * mimeType={attachment.mimeType}
69
+ * phase={attachment.phase}
70
+ * progress={attachment.progress}
71
+ * renderPlaceholder={(mime, name) => (
72
+ * <MyCustomPlaceholder mimeType={mime} fileName={name} />
73
+ * )}
74
+ * />
75
+ * ```
76
+ */
77
+ export declare function AttachmentPreview({ uri, mimeType, fileName, phase, progress, error, onRetry, onRemove, size, style, imageStyle, renderPlaceholder, getFileIcon: customGetFileIcon, statusLabels, }: AttachmentPreviewProps): React.JSX.Element;
78
+ //# sourceMappingURL=AttachmentPreview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttachmentPreview.d.ts","sourceRoot":"","sources":["../../src/components/AttachmentPreview.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAIrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,WAAW,sBAAsB;IACrC,iCAAiC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,6BAA6B;IAC7B,UAAU,CAAC,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IACnC,sDAAsD;IACtD,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;IAC7E,qEAAqE;IACrE,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC;IAC7D,8CAA8C;IAC9C,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,GAAG,EACH,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,KAAK,EACL,OAAO,EACP,QAAQ,EACR,IAAS,EACT,KAAK,EACL,UAAU,EACV,iBAAiB,EACjB,WAAW,EAAE,iBAAiB,EAC9B,YAAY,GACb,EAAE,sBAAsB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAsE5C"}