hive-react-kit 1.11.3 → 1.12.4

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/build.css CHANGED
@@ -1237,6 +1237,10 @@
1237
1237
  --tw-translate-x: calc(var(--spacing) * 4);
1238
1238
  translate: var(--tw-translate-x) var(--tw-translate-y);
1239
1239
  }
1240
+ .translate-x-5 {
1241
+ --tw-translate-x: calc(var(--spacing) * 5);
1242
+ translate: var(--tw-translate-x) var(--tw-translate-y);
1243
+ }
1240
1244
  .-translate-y-1\/2 {
1241
1245
  --tw-translate-y: calc(calc(1 / 2 * 100%) * -1);
1242
1246
  translate: var(--tw-translate-x) var(--tw-translate-y);
@@ -86,6 +86,19 @@ export interface BlogPostListProps {
86
86
  * flag) into a single 3-dot kebab menu. Forwarded to
87
87
  * `<PostActionButton/>`. */
88
88
  actionsAsMenu?: boolean;
89
+ /** When true, a heart button is shown on each post card so the curator
90
+ * can request an on-chain upvote with a chosen vote weight. */
91
+ isCurator?: boolean;
92
+ /** Called when the curator submits a curation request. Weight is 1–15. */
93
+ onCurationRequest?: (author: string, permlink: string, weight: number) => void | Promise<void>;
94
+ /** Looks up the server-configured max curation weight for a content
95
+ * type, plus whether it's already been submitted for curation.
96
+ * Forwarded to each card's vote slider and to the already-voted
97
+ * fallback <CurationButton/>. */
98
+ onFetchCurationStatus?: (author: string, permlink: string, type: 'post' | 'snap' | 'comment') => Promise<{
99
+ maxWeight: number;
100
+ alreadySubmitted: boolean;
101
+ }>;
89
102
  }
90
103
  export declare const BlogPostList: FC<BlogPostListProps>;
91
104
  export default BlogPostList;
@@ -0,0 +1,29 @@
1
+ type CurationType = 'post' | 'snap' | 'comment';
2
+ interface CurationStatus {
3
+ maxWeight: number;
4
+ alreadySubmitted: boolean;
5
+ }
6
+ interface CurationButtonProps {
7
+ author: string;
8
+ permlink: string;
9
+ type: CurationType;
10
+ onCurationRequest: (author: string, permlink: string, weight: number) => void | Promise<void>;
11
+ /** Looks up the max slider weight for this content type, plus whether
12
+ * it's already been submitted for curation by any curator. Checked
13
+ * fresh every time the modal opens. */
14
+ onFetchCurationStatus?: (author: string, permlink: string, type: CurationType) => Promise<CurationStatus>;
15
+ }
16
+ /**
17
+ * Fallback curation entry point — for curators who already spent their
18
+ * own vote on this content (before the curation feature existed, or
19
+ * simply voted before deciding to curate). The vote slider's "Request
20
+ * curation" toggle can't help there since it never reopens once you've
21
+ * voted, so this is a separate, vote-free trigger.
22
+ *
23
+ * Only ever rendered by the caller when: `isCurator && onCurationRequest
24
+ * && isHiveSuiteContent(...) && !hasCurationVoterVoted(...) &&
25
+ * hasUserVoted(votes, currentUser)` — i.e. exactly the case the merged
26
+ * vote-slider flow can't cover.
27
+ */
28
+ export declare function CurationButton({ author, permlink, type, onCurationRequest, onFetchCurationStatus }: CurationButtonProps): import("react/jsx-runtime").JSX.Element;
29
+ export {};
@@ -223,6 +223,20 @@ export interface HiveDetailPostProps {
223
223
  * `<TranslatedText>` / inline-comment translators inside the
224
224
  * page will then re-render with the new language. */
225
225
  onSelectLanguage?: (code: string) => void;
226
+ /** When true, a heart button is shown on the post and on each comment
227
+ * so the curator can request on-chain upvotes. */
228
+ isCurator?: boolean;
229
+ /** Called when the curator submits a curation request. `type` is
230
+ * `'post'` for the main post or `'comment'` for a comment. */
231
+ onCurationRequest?: (author: string, permlink: string, weight: number, type: 'post' | 'comment') => void | Promise<void>;
232
+ /** Looks up the server-configured max curation weight for a content
233
+ * type, plus whether it's already been submitted for curation.
234
+ * Forwarded to the post's vote slider, its already-voted fallback
235
+ * button, and to every comment via <InlineCommentSection/>. */
236
+ onFetchCurationStatus?: (author: string, permlink: string, type: 'post' | 'snap' | 'comment') => Promise<{
237
+ maxWeight: number;
238
+ alreadySubmitted: boolean;
239
+ }>;
226
240
  }
227
- export declare function HiveDetailPost({ author, permlink, currentUser, onUpvote, onSubmitComment, onClickCommentUpvote, onReblog, isReblogged, onShare, onTip, onReport, onEdit, onDelete, onShareComment, onTipComment, onReportComment, onToggleCommentBookmark, isCommentBookmarked, onEditComment, onDeleteComment, ecencyToken, threeSpeakApiKey, giphyApiKey, templateToken, templateApiBaseUrl, reportedAuthors, reportedPosts, hiveIconUrl, backgroundColor, onBack, onOpenMenu, onOpenProfileMenu, onUserClick, onCommunityClick, getUserUrl, getCommunityUrl, onNavigateToPost, isBookmarked, onToggleBookmark, onHeaderShare, onHeaderReport, language, onSelectLanguage, onVotePoll, showVoteButton, processBody, defaultReward, defaultBeneficiaries, beneficiaryFavorites, defaultVotePercent, voteWeightStep, allowLandscapeVideos, renderOptions, awaitingWalletApproval, decentMemesAppAccount, decentMemesTheme, }: HiveDetailPostProps): import("react/jsx-runtime").JSX.Element;
241
+ export declare function HiveDetailPost({ author, permlink, currentUser, onUpvote, onSubmitComment, onClickCommentUpvote, onReblog, isReblogged, onShare, onTip, onReport, onEdit, onDelete, onShareComment, onTipComment, onReportComment, onToggleCommentBookmark, isCommentBookmarked, onEditComment, onDeleteComment, ecencyToken, threeSpeakApiKey, giphyApiKey, templateToken, templateApiBaseUrl, reportedAuthors, reportedPosts, hiveIconUrl, backgroundColor, onBack, onOpenMenu, onOpenProfileMenu, onUserClick, onCommunityClick, getUserUrl, getCommunityUrl, onNavigateToPost, isBookmarked, onToggleBookmark, onHeaderShare, onHeaderReport, language, onSelectLanguage, onVotePoll, showVoteButton, processBody, defaultReward, defaultBeneficiaries, beneficiaryFavorites, defaultVotePercent, voteWeightStep, allowLandscapeVideos, renderOptions, awaitingWalletApproval, decentMemesAppAccount, decentMemesTheme, isCurator, onCurationRequest, onFetchCurationStatus, }: HiveDetailPostProps): import("react/jsx-runtime").JSX.Element;
228
242
  export default HiveDetailPost;
@@ -1,4 +1,9 @@
1
- export declare function VoteSlider({ author, permlink, defaultValue, step, onUpvote, onCancel, awaitingWalletApproval, walletApprovalLabel, }: {
1
+ type CurationType = 'post' | 'snap' | 'comment';
2
+ interface CurationStatus {
3
+ maxWeight: number;
4
+ alreadySubmitted: boolean;
5
+ }
6
+ export declare function VoteSlider({ author, permlink, defaultValue, step, onUpvote, onCancel, awaitingWalletApproval, walletApprovalLabel, curationEligible, curationType, onCurationRequest, onFetchCurationStatus, }: {
2
7
  author: string;
3
8
  permlink: string;
4
9
  defaultValue?: number;
@@ -13,4 +18,28 @@ export declare function VoteSlider({ author, permlink, defaultValue, step, onUpv
13
18
  awaitingWalletApproval?: boolean;
14
19
  /** Override for the wallet-approval hint text. */
15
20
  walletApprovalLabel?: string;
21
+ /** Shows the curator-only "Request curation" toggle below the vote
22
+ * slider. Callers resolve this from `isCurator && !!onCurationRequest
23
+ * && <not already curated> && <content published via HiveSuite>`
24
+ * before rendering — this component has no opinion on eligibility,
25
+ * it just renders the toggle when told to (pending a fresh
26
+ * already-submitted check — see `onFetchCurationStatus`). */
27
+ curationEligible?: boolean;
28
+ /** Required when `curationEligible` — sizes the curation-weight
29
+ * slider's built-in default range before the server limit resolves. */
30
+ curationType?: CurationType;
31
+ /** Fired with the chosen curation weight immediately after a
32
+ * successful vote, only when the curator switched the toggle on.
33
+ * Voting and curation are deliberately one action — a curator can no
34
+ * longer request curation without also spending their own vote. */
35
+ onCurationRequest?: (weight: number) => void | Promise<void>;
36
+ /** Looks up the server-configured max curation weight for
37
+ * `curationType`, plus whether this content was already submitted for
38
+ * curation by any curator. Called once, as soon as the slider opens
39
+ * (if `curationEligible`) — the toggle only renders once this
40
+ * resolves, and stays hidden entirely when `alreadySubmitted` is
41
+ * true, so a curator never sees an option that would just silently
42
+ * fail as a duplicate. */
43
+ onFetchCurationStatus?: (author: string, permlink: string, type: CurationType) => Promise<CurationStatus>;
16
44
  }): import("react/jsx-runtime").JSX.Element;
45
+ export {};
@@ -35,6 +35,23 @@ export interface PostActionButtonProps {
35
35
  initialCommentsCount?: number;
36
36
  /** Called when user confirms vote with percent (1–100). Frontend handles signing/broadcast. */
37
37
  onUpvote?: (percent: number) => void | Promise<void>;
38
+ /** Shows the curator-only "Request curation" toggle inside the vote
39
+ * slider. Caller resolves this from `isCurator && !!onCurationRequest
40
+ * && <not already curated> && <content published via HiveSuite>`. */
41
+ curationEligible?: boolean;
42
+ /** Required alongside `curationEligible` — sizes the curation-weight
43
+ * slider's default range before the server limit resolves. */
44
+ curationType?: 'post' | 'snap' | 'comment';
45
+ /** Fired with the chosen curation weight right after a successful
46
+ * vote, only when the curator switched the toggle on. */
47
+ onCurationRequest?: (weight: number) => void | Promise<void>;
48
+ /** Looks up the server-configured max curation weight for
49
+ * `curationType`, plus whether this content was already submitted
50
+ * for curation by any curator. */
51
+ onFetchCurationStatus?: (author: string, permlink: string, type: 'post' | 'snap' | 'comment') => Promise<{
52
+ maxWeight: number;
53
+ alreadySubmitted: boolean;
54
+ }>;
38
55
  /** Called when user submits a comment. Frontend handles signing/broadcast.
39
56
  * Return `false` to indicate the operation was cancelled — the composer text will be preserved.
40
57
  * `voteWeight` is non-null when the composer's upvote-on-publish toggle is enabled
@@ -156,5 +173,5 @@ export interface PostActionButtonProps {
156
173
  * polls, community detail) where there isn't room for four icons. */
157
174
  actionsAsMenu?: boolean;
158
175
  }
159
- export declare function PostActionButton({ author, permlink, currentUser: currentUserProp, hiveValue, hiveIconUrl, payoutTooltip, payoutDetails, initialVotes, initialVoteCount, initialFlagWeight, initialCommentsCount, onUpvote, onSubmitComment, onComments, onEdit, onReblog, isReblogged, onCheckReblogged, onReSnap, onShare, onTip, onReport, onToggleBookmark, isBookmarked, onDelete, onPin, onUnpin, onClickCommentUpvote, onUserClick, getUserUrl, ecencyToken, threeSpeakApiKey, giphyApiKey, templateToken, templateApiBaseUrl, disableCommentsModal, onClickCommentIcon, onClickCommentCount, hasCommented, myReplyKey, showVoteButton, parentTags, defaultReward, defaultBeneficiaries, beneficiaryFavorites, defaultVotePercent, voteWeightStep, allowLandscapeVideos, actionsAsMenu, awaitingWalletApproval, postCreatedAt, size, }: PostActionButtonProps): import("react/jsx-runtime").JSX.Element;
176
+ export declare function PostActionButton({ author, permlink, currentUser: currentUserProp, hiveValue, hiveIconUrl, payoutTooltip, payoutDetails, initialVotes, initialVoteCount, initialFlagWeight, initialCommentsCount, onUpvote, curationEligible, curationType, onCurationRequest, onFetchCurationStatus, onSubmitComment, onComments, onEdit, onReblog, isReblogged, onCheckReblogged, onReSnap, onShare, onTip, onReport, onToggleBookmark, isBookmarked, onDelete, onPin, onUnpin, onClickCommentUpvote, onUserClick, getUserUrl, ecencyToken, threeSpeakApiKey, giphyApiKey, templateToken, templateApiBaseUrl, disableCommentsModal, onClickCommentIcon, onClickCommentCount, hasCommented, myReplyKey, showVoteButton, parentTags, defaultReward, defaultBeneficiaries, beneficiaryFavorites, defaultVotePercent, voteWeightStep, allowLandscapeVideos, actionsAsMenu, awaitingWalletApproval, postCreatedAt, size, }: PostActionButtonProps): import("react/jsx-runtime").JSX.Element;
160
177
  export default PostActionButton;
@@ -105,6 +105,19 @@ export interface SnapsFeedCardProps {
105
105
  /** Collapse the per-card secondary actions (reblog · share · tip ·
106
106
  * flag) into a single 3-dot kebab menu inside the action bar. */
107
107
  actionsAsMenu?: boolean;
108
+ /** When true, a heart button is shown so the curator can request an
109
+ * on-chain upvote with a chosen weight (1–6%). */
110
+ isCurator?: boolean;
111
+ /** Called when the curator submits a curation request. Weight is 1–6. */
112
+ onCurationRequest?: (author: string, permlink: string, weight: number) => void | Promise<void>;
113
+ /** Looks up the server-configured max curation weight for a content
114
+ * type, plus whether this content was already submitted for curation
115
+ * by any curator. Forwarded to the card's vote slider and to the
116
+ * already-voted fallback <CurationButton/>. */
117
+ onFetchCurationStatus?: (author: string, permlink: string, type: 'post' | 'snap' | 'comment') => Promise<{
118
+ maxWeight: number;
119
+ alreadySubmitted: boolean;
120
+ }>;
108
121
  }
109
122
  declare const SnapsFeedCard: FC<SnapsFeedCardProps>;
110
123
  export default SnapsFeedCard;
@@ -123,6 +123,18 @@ export interface SnapsFeedViewProps {
123
123
  * flag) into a single 3-dot kebab menu. Forwarded to every
124
124
  * <SnapsFeedCard/>. */
125
125
  actionsAsMenu?: boolean;
126
+ /** When true, a heart button is shown on each snap card so the curator
127
+ * can request an on-chain upvote (1–6%). Forwarded to every <SnapsFeedCard/>. */
128
+ isCurator?: boolean;
129
+ /** Called when the curator submits a curation request on a snap. */
130
+ onCurationRequest?: (author: string, permlink: string, weight: number) => void | Promise<void>;
131
+ /** Looks up the server-configured max curation weight for a content
132
+ * type, plus whether it's already been submitted for curation.
133
+ * Forwarded to every <SnapsFeedCard/>. */
134
+ onFetchCurationStatus?: (author: string, permlink: string, type: 'post' | 'snap' | 'comment') => Promise<{
135
+ maxWeight: number;
136
+ alreadySubmitted: boolean;
137
+ }>;
126
138
  /** When `true`, the desktop 4-column layout grows naturally with its
127
139
  * content instead of pinning each column to a fixed-height per-column
128
140
  * scroller. Use this when the parent page already provides a single
@@ -132,5 +144,5 @@ export interface SnapsFeedViewProps {
132
144
  pageScroll?: boolean;
133
145
  onActiveFeedChange?: (feed: SnapsFeedKey) => void;
134
146
  }
135
- export declare function SnapsFeedView({ feeds, labels, avatars, defaultPrimary, currentUser, onUpvote, onSubmitComment, onClickCommentUpvote, onReblog, isPostReblogged, onCheckReblogged, onReSnap, onTip, onSharePost, onCommentClick, onClickCommentIcon, onClickCommentCount, onReportPost, onToggleBookmark, isPostBookmarked, onDeletePost, onEditSnap, onVotePoll, onUserClick, onPostClick, getPostUrl, getUserUrl, getTagUrl, getCommunityUrl, ecencyToken, threeSpeakApiKey, giphyApiKey, templateToken, templateApiBaseUrl, defaultVotePercent, voteWeightStep, allowLandscapeVideos, awaitingWalletApproval, defaultReward, toolbar, footer, renderHeaderActions, actionsAsMenu, pageScroll, onActiveFeedChange, }: SnapsFeedViewProps): import("react/jsx-runtime").JSX.Element;
147
+ export declare function SnapsFeedView({ feeds, labels, avatars, defaultPrimary, currentUser, onUpvote, onSubmitComment, onClickCommentUpvote, onReblog, isPostReblogged, onCheckReblogged, onReSnap, onTip, onSharePost, onCommentClick, onClickCommentIcon, onClickCommentCount, onReportPost, onToggleBookmark, isPostBookmarked, onDeletePost, onEditSnap, onVotePoll, onUserClick, onPostClick, getPostUrl, getUserUrl, getTagUrl, getCommunityUrl, ecencyToken, threeSpeakApiKey, giphyApiKey, templateToken, templateApiBaseUrl, defaultVotePercent, voteWeightStep, allowLandscapeVideos, awaitingWalletApproval, defaultReward, toolbar, footer, renderHeaderActions, actionsAsMenu, isCurator, onCurationRequest, onFetchCurationStatus, pageScroll, onActiveFeedChange, }: SnapsFeedViewProps): import("react/jsx-runtime").JSX.Element;
136
148
  export default SnapsFeedView;
@@ -82,6 +82,19 @@ interface InlineCommentItemProps {
82
82
  decentMemesAppAccount?: string;
83
83
  /** Forwarded to DecentMemes pickers as `frontendInit.theme` / `setTheme`. */
84
84
  decentMemesTheme?: 'light' | 'dark';
85
+ /** When true, a heart button is shown on this comment so the curator
86
+ * can request an on-chain upvote (1–3%). */
87
+ isCurator?: boolean;
88
+ /** Called when the curator submits a curation request. Weight is 1–3. */
89
+ onCurationRequest?: (author: string, permlink: string, weight: number) => void | Promise<void>;
90
+ /** Looks up the server-configured max curation weight for a content
91
+ * type, plus whether it's already been submitted for curation.
92
+ * Forwarded to this comment's vote slider, its already-voted
93
+ * fallback button, and to every nested reply. */
94
+ onFetchCurationStatus?: (author: string, permlink: string, type: 'post' | 'snap' | 'comment') => Promise<{
95
+ maxWeight: number;
96
+ alreadySubmitted: boolean;
97
+ }>;
85
98
  }
86
- export default function InlineCommentItem({ comment, allComments, onReply, onCancelReply, onCommentSubmit, activeReplyKey, currentUser, token, depth, onVotedRefresh, onClickCommentUpvote, ecencyToken, threeSpeakApiKey, giphyApiKey, templateToken, templateApiBaseUrl, hiveIconUrl, onShareComment, onTipComment, onReportComment, onToggleCommentBookmark, isCommentBookmarked, mentionSeedAccounts, onEditComment, onDeleteComment, onNavigateToPost, onUserClick, defaultReward, defaultBeneficiaries, beneficiaryFavorites, defaultVotePercent, voteWeightStep, allowLandscapeVideos, awaitingWalletApproval, renderOptions, parentTags, decentMemesAppAccount, decentMemesTheme, }: InlineCommentItemProps): import("react/jsx-runtime").JSX.Element;
99
+ export default function InlineCommentItem({ comment, allComments, onReply, onCancelReply, onCommentSubmit, activeReplyKey, currentUser, token, depth, onVotedRefresh, onClickCommentUpvote, ecencyToken, threeSpeakApiKey, giphyApiKey, templateToken, templateApiBaseUrl, hiveIconUrl, onShareComment, onTipComment, onReportComment, onToggleCommentBookmark, isCommentBookmarked, mentionSeedAccounts, onEditComment, onDeleteComment, onNavigateToPost, onUserClick, defaultReward, defaultBeneficiaries, beneficiaryFavorites, defaultVotePercent, voteWeightStep, allowLandscapeVideos, awaitingWalletApproval, renderOptions, parentTags, decentMemesAppAccount, decentMemesTheme, isCurator, onCurationRequest, onFetchCurationStatus, }: InlineCommentItemProps): import("react/jsx-runtime").JSX.Element;
87
100
  export {};
@@ -87,6 +87,18 @@ interface InlineCommentSectionProps {
87
87
  decentMemesAppAccount?: string;
88
88
  /** Forwarded to DecentMemes pickers as `frontendInit.theme` / `setTheme`. */
89
89
  decentMemesTheme?: 'light' | 'dark';
90
+ /** When true, a heart button is shown on each comment so the curator
91
+ * can request an on-chain upvote (1–3%). */
92
+ isCurator?: boolean;
93
+ /** Called when the curator submits a curation request on a comment. */
94
+ onCurationRequest?: (author: string, permlink: string, weight: number) => void | Promise<void>;
95
+ /** Looks up the server-configured max curation weight for a content
96
+ * type, plus whether it's already been submitted for curation.
97
+ * Forwarded to every <InlineCommentItem/>. */
98
+ onFetchCurationStatus?: (author: string, permlink: string, type: 'post' | 'snap' | 'comment') => Promise<{
99
+ maxWeight: number;
100
+ alreadySubmitted: boolean;
101
+ }>;
90
102
  }
91
- export default function InlineCommentSection({ author, permlink, currentUser, token, onSubmitComment, onClickCommentUpvote, ecencyToken, threeSpeakApiKey, giphyApiKey, templateToken, templateApiBaseUrl, reportedAuthors, reportedPosts, hiveIconUrl, onShareComment, onTipComment, onReportComment, onToggleCommentBookmark, isCommentBookmarked, mentionSeedAccounts, onEditComment, onDeleteComment, onNavigateToPost, onUserClick, showVoteButton, alreadyVoted, parentTags, defaultReward, defaultBeneficiaries, beneficiaryFavorites, defaultVotePercent, voteWeightStep, allowLandscapeVideos, awaitingWalletApproval, renderOptions, decentMemesAppAccount, decentMemesTheme, }: InlineCommentSectionProps): import("react/jsx-runtime").JSX.Element;
103
+ export default function InlineCommentSection({ author, permlink, currentUser, token, onSubmitComment, onClickCommentUpvote, ecencyToken, threeSpeakApiKey, giphyApiKey, templateToken, templateApiBaseUrl, reportedAuthors, reportedPosts, hiveIconUrl, onShareComment, onTipComment, onReportComment, onToggleCommentBookmark, isCommentBookmarked, mentionSeedAccounts, onEditComment, onDeleteComment, onNavigateToPost, onUserClick, showVoteButton, alreadyVoted, parentTags, defaultReward, defaultBeneficiaries, beneficiaryFavorites, defaultVotePercent, voteWeightStep, allowLandscapeVideos, awaitingWalletApproval, renderOptions, decentMemesAppAccount, decentMemesTheme, isCurator, onCurationRequest, onFetchCurationStatus, }: InlineCommentSectionProps): import("react/jsx-runtime").JSX.Element;
92
104
  export {};
@@ -69,6 +69,18 @@ export interface ProfileSnapsTabProps {
69
69
  defaultReward?: RewardOption;
70
70
  /** Per-card right-side header action menu slot (e.g. Edit / Flag). */
71
71
  renderHeaderActions?: (post: Post) => ReactNode;
72
+ /** When true, a heart button is shown on each snap card so the curator
73
+ * can request an on-chain upvote. Forwarded to <SnapsFeedView/>. */
74
+ isCurator?: boolean;
75
+ /** Called when the curator submits a curation request on a snap. */
76
+ onCurationRequest?: (author: string, permlink: string, weight: number) => void | Promise<void>;
77
+ /** Looks up the server-configured max curation weight for a content
78
+ * type, plus whether it's already been submitted for curation.
79
+ * Forwarded to <SnapsFeedView/>. */
80
+ onFetchCurationStatus?: (author: string, permlink: string, type: 'post' | 'snap' | 'comment') => Promise<{
81
+ maxWeight: number;
82
+ alreadySubmitted: boolean;
83
+ }>;
72
84
  }
73
85
  declare const ProfileSnapsTab: React.FC<ProfileSnapsTabProps>;
74
86
  export default ProfileSnapsTab;
@@ -114,6 +114,20 @@ export interface UserDetailProfileProps {
114
114
  * (e.g. "51000000000" for 51 b RC). Return `false` to indicate cancellation
115
115
  * (keychain denied / user closed the prompt) — the row stays in edit mode. */
116
116
  onUpdateRcDelegation?: (delegatee: string, maxRc: string) => void | boolean | Promise<void | boolean>;
117
+ /** When true, a heart button is shown on each post/blog/snap card so
118
+ * the curator can request an on-chain upvote. */
119
+ isCurator?: boolean;
120
+ /** Called when the curator submits a curation request. `type` is
121
+ * `'post'` for the Posts/Blogs tab or `'snap'` for the Snaps tab. */
122
+ onCurationRequest?: (author: string, permlink: string, weight: number, type: 'post' | 'snap') => void | Promise<void>;
123
+ /** Looks up the server-configured max curation weight for a content
124
+ * type, plus whether it's already been submitted for curation.
125
+ * Forwarded to every card's vote slider and already-voted fallback
126
+ * button. */
127
+ onFetchCurationStatus?: (author: string, permlink: string, type: 'post' | 'snap' | 'comment') => Promise<{
128
+ maxWeight: number;
129
+ alreadySubmitted: boolean;
130
+ }>;
117
131
  /** Wallet tab — RC delegation removal (broadcasts max_rc=0 internally). */
118
132
  onDeleteRcDelegation?: (delegatee: string) => void | boolean | Promise<void | boolean>;
119
133
  /** Wallet tab — create a new HP delegation. `hp` is HP as a numeric string