@select-org/post-components 2.1.4 → 2.1.5

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.
package/dist/index.d.ts CHANGED
@@ -4,6 +4,35 @@ export { FormatMentionData, ImageInfo, PostAuthor, PostDataMetaData } from './ty
4
4
  import { ResolvedTextContent, PrimaryContent, EmbedContent, TextItemContent, SectionItem as SectionItem$1 } from './resolver.js';
5
5
  export { LinkContent, MediaContent, PollContent, ResolvePostContentMode, ResolvedPostContent, SectionsContent, hasMeaningfulHtml, resolvePostContent } from './resolver.js';
6
6
 
7
+ /**
8
+ * i18n seam. The design system stays string-agnostic — consumers inject
9
+ * already-localized copy. When omitted, English defaults are used so the
10
+ * component still renders standalone.
11
+ */
12
+ interface EraseConfirmModalLabels {
13
+ /** First-step action row, e.g. "Erase post" / "Erase comment". */
14
+ erase?: string;
15
+ /** Cancel affordance (both steps). */
16
+ cancel?: string;
17
+ /** Confirmation heading, e.g. "Are you sure you want to erase this post?". */
18
+ confirmTitle?: string;
19
+ /** Confirmation body, e.g. "This action cannot be undone.". */
20
+ confirmBody?: string;
21
+ /** Destructive confirm button. */
22
+ confirmErase?: string;
23
+ }
24
+ interface Props$a {
25
+ backgroundColor?: string;
26
+ onYesPress: (e?: React.MouseEvent) => void;
27
+ onNoPress: (e?: React.MouseEvent) => void;
28
+ fontColor?: string;
29
+ itemType?: string;
30
+ isOpen: boolean;
31
+ handleClose: () => void;
32
+ labels?: EraseConfirmModalLabels;
33
+ }
34
+ declare const EraseConfirmModal: React.FC<Props$a>;
35
+
7
36
  interface PostCardProps {
8
37
  post: {
9
38
  context_id: string;
@@ -91,6 +120,8 @@ interface PostCardProps {
91
120
  uploadingRemaining?: string;
92
121
  uploadingDone?: string;
93
122
  };
123
+ /** Localized copy for the erase-confirmation modal. English defaults when omitted. */
124
+ eraseLabels?: EraseConfirmModalLabels;
94
125
  mode?: 'feed' | 'detail' | 'inbox' | 'draft';
95
126
  commentCount?: number;
96
127
  unreadCommentCount?: number;
@@ -135,6 +166,8 @@ interface PostHeaderProps {
135
166
  isAdmin?: boolean;
136
167
  isOwner?: boolean;
137
168
  onErasePress?: () => void;
169
+ /** Accessible label for the built-in delete affordance. Defaults to "Delete post". */
170
+ deleteLabel?: string;
138
171
  onCancelPost?: () => void;
139
172
  renderActionsMenu?: () => React.ReactNode;
140
173
  linkComponent?: React.ComponentType<{
@@ -157,7 +190,7 @@ interface PostHeaderProps {
157
190
  }
158
191
  declare const PostHeader: React.FC<PostHeaderProps>;
159
192
 
160
- interface Props$a {
193
+ interface Props$9 {
161
194
  textContent: ResolvedTextContent;
162
195
  showFull?: boolean;
163
196
  isPostDetail: boolean;
@@ -172,7 +205,7 @@ interface Props$a {
172
205
  }>;
173
206
  supportDeepviewDomain?: string | string[];
174
207
  }
175
- declare const PostBody: React.FC<Props$a>;
208
+ declare const PostBody: React.FC<Props$9>;
176
209
 
177
210
  interface PostFooterProps {
178
211
  postHref?: string;
@@ -205,7 +238,7 @@ interface PostFooterProps {
205
238
  }
206
239
  declare const PostFooter: React.FC<PostFooterProps>;
207
240
 
208
- interface Props$9 {
241
+ interface Props$8 {
209
242
  primaryContent: PrimaryContent;
210
243
  isPostDetail: boolean;
211
244
  onCardPress: () => void;
@@ -227,18 +260,18 @@ interface Props$9 {
227
260
  }>;
228
261
  supportDeepviewDomain?: string | string[];
229
262
  }
230
- declare const PostItemsView: React.FC<Props$9>;
263
+ declare const PostItemsView: React.FC<Props$8>;
231
264
 
232
- interface Props$8 {
265
+ interface Props$7 {
233
266
  embed: EmbedContent;
234
267
  }
235
- declare const PostEmbedView: React.FC<Props$8>;
268
+ declare const PostEmbedView: React.FC<Props$7>;
236
269
 
237
270
  declare const PostEmail: React.FC<{
238
271
  html: string;
239
272
  }>;
240
273
 
241
- interface Props$7 {
274
+ interface Props$6 {
242
275
  items: PollItemData[];
243
276
  voteResult: PollResult | null;
244
277
  onVotePress: (item: PollItemData) => void;
@@ -247,9 +280,9 @@ interface Props$7 {
247
280
  isInboxCard?: boolean;
248
281
  isPostOwner?: boolean;
249
282
  }
250
- declare const PostPollView: React.FC<Props$7>;
283
+ declare const PostPollView: React.FC<Props$6>;
251
284
 
252
- interface Props$6 {
285
+ interface Props$5 {
253
286
  textItems: TextItemContent['items'];
254
287
  showFullText: boolean;
255
288
  isPostDetail: boolean;
@@ -261,9 +294,9 @@ interface Props$6 {
261
294
  }>;
262
295
  supportDeepviewDomain?: string | string[];
263
296
  }
264
- declare const PostTextItem: React.FC<Props$6>;
297
+ declare const PostTextItem: React.FC<Props$5>;
265
298
 
266
- interface Props$5 {
299
+ interface Props$4 {
267
300
  sections: SectionItem$1[];
268
301
  isPostDetail: boolean;
269
302
  onCardPress: () => void;
@@ -284,9 +317,9 @@ interface Props$5 {
284
317
  className?: string;
285
318
  }>;
286
319
  }
287
- declare const PostSectionsView: React.FC<Props$5>;
320
+ declare const PostSectionsView: React.FC<Props$4>;
288
321
 
289
- interface Props$4 {
322
+ interface Props$3 {
290
323
  sourceInfo?: {
291
324
  avatar: string;
292
325
  username: string;
@@ -302,14 +335,22 @@ interface Props$4 {
302
335
  className?: string;
303
336
  }>;
304
337
  }
305
- declare const PostSectionSourceInfoView: React.FC<Props$4>;
338
+ declare const PostSectionSourceInfoView: React.FC<Props$3>;
306
339
 
307
- interface Props$3 {
340
+ interface Props$2 {
308
341
  fontColor?: string;
309
342
  sections: SectionItem$1[];
343
+ isPostDetail?: boolean;
310
344
  onCardPress?: () => void;
345
+ onNavigate?: (href: string, isInternal: boolean) => void;
346
+ linkComponent?: React.ComponentType<{
347
+ href: string;
348
+ children: React.ReactNode;
349
+ className?: string;
350
+ }>;
351
+ supportDeepviewDomain?: string | string[];
311
352
  }
312
- declare const PostSectionsSummaryView: React.FC<Props$3>;
353
+ declare const PostSectionsSummaryView: React.FC<Props$2>;
313
354
 
314
355
  interface PostLinkItemProps {
315
356
  linkItems: LinkItemMetaData[];
@@ -333,14 +374,14 @@ interface PostMediaLayoutProps {
333
374
  }
334
375
  declare const PostMediaLayoutCore: React.FC<PostMediaLayoutProps>;
335
376
 
336
- interface Props$2 {
377
+ interface Props$1 {
337
378
  status?: MediaUploadStatus;
338
379
  /** Tile width in px. Status text is hidden when < 100. */
339
380
  tileWidth?: number;
340
381
  }
341
- declare const MediaUploadStatusOverlay: React.FC<Props$2>;
382
+ declare const MediaUploadStatusOverlay: React.FC<Props$1>;
342
383
 
343
- interface Props$1 {
384
+ interface Props {
344
385
  statuses?: Record<string, MediaUploadStatus>;
345
386
  labels?: {
346
387
  /** Template with `{count}` replaced by the remaining in-flight number. */
@@ -349,7 +390,7 @@ interface Props$1 {
349
390
  uploadingDone?: string;
350
391
  };
351
392
  }
352
- declare const PostUploadStrip: React.FC<Props$1>;
393
+ declare const PostUploadStrip: React.FC<Props>;
353
394
 
354
395
  /*!
355
396
  * React Native Autolink
@@ -416,15 +457,4 @@ interface ReactionModalProps {
416
457
  }
417
458
  declare const ReactionModal: ({ isOpen, close, sendReaction, onAnalyticsEvent }: ReactionModalProps) => React.JSX.Element | null;
418
459
 
419
- interface Props {
420
- backgroundColor?: string;
421
- onYesPress: (e?: React.MouseEvent) => void;
422
- onNoPress: (e?: React.MouseEvent) => void;
423
- fontColor?: string;
424
- itemType?: string;
425
- isOpen: boolean;
426
- handleClose: () => void;
427
- }
428
- declare const EraseConfirmModal: React.FC<Props>;
429
-
430
460
  export { AutoLink, EmbedContent, EraseConfirmModal, ItemData, LinkItemMetaData, MediaUploadStatus, MediaUploadStatusOverlay, MentionData, POST_TYPE_HINT_DEFAULTS, PollItemData, PollResult, PostBody, PostCard, type PostCardProps, PostEmail, PostEmbedView, PostFooter, PostHeader, type PostHeaderProps, PostItemsView, PostLinkItem, PostMediaLayoutCore, PostPollView, PostSectionSourceInfoView, PostSectionsSummaryView, PostSectionsView, PostTextItem, type PostTypeHint, type PostTypeHintContext, PostUploadStrip, PrimaryContent, ReactionModal, ResolvedTextContent, SectionItem, TextItemContent, TipTapDocument, getPostTypeHint };
package/dist/index.js CHANGED
@@ -245,6 +245,7 @@ var PostHeader = ({
245
245
  isAdmin = false,
246
246
  isOwner = false,
247
247
  onErasePress,
248
+ deleteLabel,
248
249
  onCancelPost,
249
250
  renderActionsMenu,
250
251
  linkComponent: LinkComponent,
@@ -317,7 +318,7 @@ var PostHeader = ({
317
318
  AvatarImage,
318
319
  {
319
320
  src: author.avatar,
320
- alt: `${author.name}'s profile picture`,
321
+ alt: `${author.name}'s profile picture on Select App`,
321
322
  placeholder: author.avatarPlaceholder,
322
323
  imageComponent
323
324
  }
@@ -347,7 +348,7 @@ var PostHeader = ({
347
348
  /* @__PURE__ */ jsx2(
348
349
  "time",
349
350
  {
350
- title: postedAt,
351
+ title: formatRelativeTime(postedAt, locale ?? "en"),
351
352
  className: "text-xs text-muted-foreground whitespace-nowrap shrink-0",
352
353
  dateTime: postedAt,
353
354
  children: formatRelativeTime(postedAt, locale ?? "en")
@@ -411,7 +412,7 @@ var PostHeader = ({
411
412
  e.stopPropagation();
412
413
  onErasePress();
413
414
  },
414
- "aria-label": "Delete post",
415
+ "aria-label": deleteLabel ?? "Delete post",
415
416
  className: "absolute right-4 top-4 leading-none rounded-full p-1.5 transition-colors hover:bg-feedback-danger/10 hover:text-feedback-danger",
416
417
  children: /* @__PURE__ */ jsx2(AppIcon, { name: "chatErase", width: 16, height: 16, strokeWidth: 1.75 })
417
418
  }
@@ -1100,7 +1101,7 @@ var PostBody = ({
1100
1101
  };
1101
1102
  if (isPostDetail) {
1102
1103
  if (isEmailPost && html) {
1103
- return /* @__PURE__ */ jsxs2("div", { className: "relative flex-1 max-h-screen w-full overflow-x-hidden overflow-y-auto xl:px-0 px-5", children: [
1104
+ return /* @__PURE__ */ jsxs2("div", { className: "relative flex-1 max-h-full w-full overflow-x-hidden overflow-y-auto xl:px-0 px-5", children: [
1104
1105
  /* @__PURE__ */ jsx5("h1", { className: "text-2xl font-semibold text-gray-900 leading-snug mt-5 mb-3 px-5", children: subject }),
1105
1106
  /* @__PURE__ */ jsx5(PostEmail_default, { html })
1106
1107
  ] });
@@ -2695,7 +2696,8 @@ var EraseConfirmModal = ({
2695
2696
  onNoPress,
2696
2697
  itemType = "comment",
2697
2698
  isOpen,
2698
- handleClose
2699
+ handleClose,
2700
+ labels
2699
2701
  }) => {
2700
2702
  const [first, setFirst] = useState4(true);
2701
2703
  const [second, setSecond] = useState4(false);
@@ -2726,9 +2728,11 @@ var EraseConfirmModal = ({
2726
2728
  setFirst(true);
2727
2729
  setSecond(false);
2728
2730
  };
2729
- const eraseLabel = itemType === "Post" ? "Erase post" : "Erase comment";
2730
- const confirmTitle = itemType === "Post" ? "Are you sure you want to erase this post?" : "Are you sure you want to erase this comment?";
2731
- const confirmBody = itemType === "Post" ? "This action cannot be undone." : "This action cannot be undone.";
2731
+ const eraseLabel = labels?.erase ?? (itemType === "Post" ? "Erase post" : "Erase comment");
2732
+ const cancelLabel = labels?.cancel ?? "Cancel";
2733
+ const confirmTitle = labels?.confirmTitle ?? (itemType === "Post" ? "Are you sure you want to erase this post?" : "Are you sure you want to erase this comment?");
2734
+ const confirmBody = labels?.confirmBody ?? "This action cannot be undone.";
2735
+ const confirmEraseLabel = labels?.confirmErase ?? "Erase";
2732
2736
  return /* @__PURE__ */ jsxs15("div", { children: [
2733
2737
  /* @__PURE__ */ jsx24("div", { className: "fixed left-0 top-0 z-50 h-screen w-full bg-black/50" }),
2734
2738
  /* @__PURE__ */ jsx24(
@@ -2765,7 +2769,7 @@ var EraseConfirmModal = ({
2765
2769
  onClick: handleNoPress,
2766
2770
  children: [
2767
2771
  /* @__PURE__ */ jsx24("div", { children: /* @__PURE__ */ jsx24(AppIcon, { name: "cancel", className: "cursor-pointer size-6" }) }),
2768
- /* @__PURE__ */ jsx24("p", { className: "ml-3 text-lg", children: "Cancel" })
2772
+ /* @__PURE__ */ jsx24("p", { className: "ml-3 text-lg", children: cancelLabel })
2769
2773
  ]
2770
2774
  }
2771
2775
  )
@@ -2788,7 +2792,7 @@ var EraseConfirmModal = ({
2788
2792
  {
2789
2793
  className: "mr-6 py-2 text-muted-foreground",
2790
2794
  onClick: handleNoPress,
2791
- children: "Cancel"
2795
+ children: cancelLabel
2792
2796
  }
2793
2797
  ),
2794
2798
  /* @__PURE__ */ jsx24(
@@ -2797,7 +2801,7 @@ var EraseConfirmModal = ({
2797
2801
  className: "rounded-3xl bg-action-primary px-6 py-2 font-semibold text-white",
2798
2802
  onClick: onYesPress,
2799
2803
  "data-testid": "confirm-modal-erase",
2800
- children: "Erase"
2804
+ children: confirmEraseLabel
2801
2805
  }
2802
2806
  )
2803
2807
  ] })
@@ -2848,6 +2852,7 @@ var PostCard = ({
2848
2852
  isSnoozed = false,
2849
2853
  onSnoozeToggle,
2850
2854
  mediaItemStatuses,
2855
+ eraseLabels,
2851
2856
  showFooterLink = false,
2852
2857
  footerLinkLabel,
2853
2858
  footerLinkHref,
@@ -2944,7 +2949,8 @@ var PostCard = ({
2944
2949
  itemType: "Post",
2945
2950
  onYesPress: handleEraseConfirm,
2946
2951
  onNoPress: handleEraseCancel,
2947
- handleClose: handleEraseCancel
2952
+ handleClose: handleEraseCancel,
2953
+ labels: eraseLabels
2948
2954
  }
2949
2955
  ),
2950
2956
  /* @__PURE__ */ jsxs16("div", { className: cn(isPending && "opacity-50"), children: [
@@ -2972,7 +2978,8 @@ var PostCard = ({
2972
2978
  renderActionsMenu,
2973
2979
  linkComponent,
2974
2980
  imageComponent,
2975
- labels
2981
+ labels,
2982
+ deleteLabel: eraseLabels?.erase
2976
2983
  }
2977
2984
  ),
2978
2985
  /* @__PURE__ */ jsx25(
@@ -3061,7 +3068,11 @@ var BODY_SIZE = 80;
3061
3068
  var PostSectionsSummaryView = ({
3062
3069
  sections,
3063
3070
  fontColor,
3064
- onCardPress
3071
+ isPostDetail,
3072
+ onCardPress,
3073
+ onNavigate,
3074
+ linkComponent,
3075
+ supportDeepviewDomain
3065
3076
  }) => {
3066
3077
  const imageItems = useMemo8(() => {
3067
3078
  if (!sections || sections.length === 0) return [];
@@ -3096,14 +3107,17 @@ var PostSectionsSummaryView = ({
3096
3107
  whiteSpace: "pre-wrap",
3097
3108
  wordBreak: "break-word"
3098
3109
  },
3099
- mentionData: data.mentionData
3110
+ mentionData: data.mentionData,
3111
+ onNavigate,
3112
+ linkComponent,
3113
+ supportDeepviewDomain
3100
3114
  },
3101
3115
  `${index} - ${data.body}`
3102
3116
  );
3103
3117
  }
3104
3118
  return null;
3105
3119
  },
3106
- [fontColor]
3120
+ [fontColor, onNavigate, linkComponent, supportDeepviewDomain]
3107
3121
  );
3108
3122
  if (!sections || sections.length === 0) {
3109
3123
  return null;
@@ -3122,14 +3136,19 @@ var PostSectionsSummaryView = ({
3122
3136
  whiteSpace: "pre-wrap",
3123
3137
  wordBreak: "break-word"
3124
3138
  },
3125
- mentionData: []
3139
+ mentionData: [],
3140
+ onNavigate,
3141
+ linkComponent,
3142
+ supportDeepviewDomain
3126
3143
  },
3127
3144
  "body"
3128
3145
  ),
3129
3146
  /* @__PURE__ */ jsx26(
3130
3147
  PostMediaLayoutCore_default,
3131
3148
  {
3132
- items: imageItems
3149
+ items: imageItems,
3150
+ isPostDetail,
3151
+ onCardPress
3133
3152
  }
3134
3153
  )
3135
3154
  ] });