-
+ {user && (
+
+ )}
{
+ const { user, isAuthReady } = useAuthContext();
+ const { value } = useConditionalFeature({
+ feature: featureSmartComposer,
+ shouldEvaluate: isAuthReady && !!user,
+ });
+ return !!value;
+};
diff --git a/packages/shared/src/hooks/squads/usePostToSquad.tsx b/packages/shared/src/hooks/squads/usePostToSquad.tsx
index 3d26d488f67..103dbc8ac9a 100644
--- a/packages/shared/src/hooks/squads/usePostToSquad.tsx
+++ b/packages/shared/src/hooks/squads/usePostToSquad.tsx
@@ -84,6 +84,7 @@ interface UsePostToSquadProps {
initialPreview?: ExternalLinkPreview;
onMutate?: (data: unknown) => void;
onError?: (error: ApiErrorResult) => void;
+ displayMutationErrors?: boolean;
}
const getSquadIdOrThrow = (squad: Squad): string => {
@@ -103,6 +104,7 @@ export const usePostToSquad = ({
onSourcePostModerationSuccess,
getSharedPostSuccessToast,
initialPreview,
+ displayMutationErrors = false,
}: UsePostToSquadProps = {}): UsePostToSquad => {
const { toggleGroup, getGroupStatus } = useNotificationSettings();
const { displayToast } = useToastNotification();
@@ -116,14 +118,19 @@ export const usePostToSquad = ({
const requestMethod = requestMethodContext ?? gqlClient.request;
const handleMutationError = useCallback(
- (err: unknown): void => {
+ (err: unknown, options: { displayError?: boolean } = {}): void => {
if (!isApiErrorResult(err)) {
return;
}
+ const { displayError = true } = options;
+ if (displayMutationErrors && displayError) {
+ displayToast(err.response?.errors?.[0]?.message ?? DEFAULT_ERROR);
+ }
+
onError?.(err);
},
- [onError],
+ [displayMutationErrors, displayToast, onError],
);
const handlePostSuccess = useCallback(
@@ -143,7 +150,7 @@ export const usePostToSquad = ({
} = useMutation({
mutationFn: createPost,
onMutate,
- onError: handleMutationError,
+ onError: (err) => handleMutationError(err),
onSuccess: handlePostSuccess,
});
const {
@@ -154,7 +161,7 @@ export const usePostToSquad = ({
mutationFn: editPost,
onMutate,
onSuccess: handlePostSuccess,
- onError: handleMutationError,
+ onError: (err) => handleMutationError(err),
});
const {
@@ -180,7 +187,7 @@ export const usePostToSquad = ({
}
handlePostSuccess(data);
},
- onError: handleMutationError,
+ onError: (err) => handleMutationError(err),
});
const { mutateAsync: getLinkPreview, isPending: isLoadingPreview } =
@@ -196,7 +203,7 @@ export const usePostToSquad = ({
const rateLimited = getApiError(err, ApiError.RateLimited);
const message = rateLimited?.message ?? DEFAULT_ERROR;
displayToast(message);
- handleMutationError(err);
+ handleMutationError(err, { displayError: false });
},
});
@@ -270,7 +277,7 @@ export const usePostToSquad = ({
onSharedPostSuccessfully();
handlePostSuccess(data);
},
- onError: handleMutationError,
+ onError: (err) => handleMutationError(err),
});
const {
@@ -283,7 +290,7 @@ export const usePostToSquad = ({
onSharedPostSuccessfully(true);
handlePostSuccess(data);
},
- onError: handleMutationError,
+ onError: (err) => handleMutationError(err),
});
const {
@@ -305,7 +312,7 @@ export const usePostToSquad = ({
const rateLimited = getApiError(err, ApiError.RateLimited);
const message = rateLimited?.message ?? DEFAULT_ERROR;
displayToast(message);
- handleMutationError(err);
+ handleMutationError(err, { displayError: false });
},
});
diff --git a/packages/shared/src/lib/featureManagement.ts b/packages/shared/src/lib/featureManagement.ts
index 9690a4cdf18..9486a72ffb3 100644
--- a/packages/shared/src/lib/featureManagement.ts
+++ b/packages/shared/src/lib/featureManagement.ts
@@ -63,6 +63,8 @@ export const featureInlineLogin = new Feature('inline_login', false);
export const featureLuckyButton = new Feature('lucky_button', false);
+export const featureSmartComposer = new Feature('smart_composer', false);
+
export const featureAutorotateAds = new Feature('autorotate_ads', 0);
export const featureFeedAdTemplate = new Feature('feed_ad_template', {
diff --git a/packages/shared/src/lib/log.ts b/packages/shared/src/lib/log.ts
index 28449752b04..5814714ee6d 100644
--- a/packages/shared/src/lib/log.ts
+++ b/packages/shared/src/lib/log.ts
@@ -101,6 +101,15 @@ export enum Origin {
}
export enum LogEvent {
+ OpenSmartComposer = 'open smart composer',
+ CloseSmartComposer = 'close smart composer',
+ SubmitSmartComposer = 'submit smart composer',
+ SwitchComposerKind = 'switch composer kind',
+ ToggleComposerMarkdown = 'toggle composer markdown',
+ ToggleComposerExpand = 'toggle composer expand',
+ AddComposerCover = 'add composer cover',
+ RemoveComposerCover = 'remove composer cover',
+ DismissComposerPreview = 'dismiss composer preview',
HidePost = 'hide post',
HidePostFeedbackSubmit = 'hide post feedback submit',
HidePostReport = 'hide post report',