Files
calendar/apps/web/modules/feature-opt-in/components/FeatureOptInBannerWrapper.tsx
T
Benny JooandGitHub e64fad8e34 refactor: remove 6 @calcom/trpc imports from packages/features (#27727)
* migrate booker layout selector

* move schedule hooks and types

* migrate feature opt in components

* migrate feedback dialog

* update

* migrate schedule hooks

* migrate useSegments

* update

* update import paths

* fix import paths

* mv useTimesForSchedule back to features

* fix
2026-02-07 09:05:09 -03:00

105 lines
3.2 KiB
TypeScript

"use client";
import type { OptInFeatureConfig } from "@calcom/features/feature-opt-in/config";
import { FeedbackDialog } from "./FeedbackDialog";
import type { ReactElement } from "react";
import { createPortal } from "react-dom";
import { FeatureOptInBanner } from "./FeatureOptInBanner";
import type { FeatureOptInMutations } from "./FeatureOptInConfirmDialog";
import { FeatureOptInConfirmDialog } from "./FeatureOptInConfirmDialog";
type UserRoleContext = {
isOrgAdmin: boolean;
orgId: number | null;
adminTeamIds: number[];
adminTeamNames: { id: number; name: string }[];
};
type FeedbackState = {
showFeedbackDialog: boolean;
feedbackDialogProps: {
surveyId: string;
ratingQuestionId: string;
commentQuestionId: string;
titleKey?: string;
descriptionKey?: string;
showOn?: "all" | "desktop" | "mobile";
} | null;
onFeedbackComplete: () => void;
};
type FeatureOptInTrackingData = {
enableFor: "user" | "organization" | "teams";
teamCount?: number;
autoOptIn: boolean;
};
type FeatureOptInBannerState = {
shouldShow: boolean;
isLoading: boolean;
featureConfig: OptInFeatureConfig | null;
canOptIn: boolean;
blockingReason: string | null;
userRoleContext: UserRoleContext | null;
isDialogOpen: boolean;
openDialog: () => void;
closeDialog: () => void;
dismiss: () => void;
markOptedIn: () => void;
mutations: FeatureOptInMutations;
feedback: FeedbackState;
trackFeatureEnabled: (data: FeatureOptInTrackingData) => void;
};
interface FeatureOptInBannerWrapperProps {
state: FeatureOptInBannerState;
}
function FeatureOptInBannerWrapper({ state }: FeatureOptInBannerWrapperProps): ReactElement | null {
if (!state.featureConfig) {
return null;
}
return (
<>
{state.shouldShow &&
typeof document !== "undefined" &&
createPortal(
<FeatureOptInBanner
featureConfig={state.featureConfig}
onDismiss={state.dismiss}
onOpenDialog={state.openDialog}
/>,
document.body
)}
{state.userRoleContext && (
<FeatureOptInConfirmDialog
isOpen={state.isDialogOpen}
onClose={state.closeDialog}
onDismissBanner={state.dismiss}
onOptInSuccess={state.markOptedIn}
featureConfig={state.featureConfig}
userRoleContext={state.userRoleContext}
mutations={state.mutations}
onTrackFeatureEnabled={state.trackFeatureEnabled}
/>
)}
{state.feedback.feedbackDialogProps && (
<FeedbackDialog
isOpen={state.feedback.showFeedbackDialog}
onClose={state.feedback.onFeedbackComplete}
onSubmitSuccess={state.feedback.onFeedbackComplete}
surveyId={state.feedback.feedbackDialogProps.surveyId}
ratingQuestionId={state.feedback.feedbackDialogProps.ratingQuestionId}
commentQuestionId={state.feedback.feedbackDialogProps.commentQuestionId}
titleKey={state.feedback.feedbackDialogProps.titleKey}
descriptionKey={state.feedback.feedbackDialogProps.descriptionKey}
showOn={state.feedback.feedbackDialogProps.showOn}
/>
)}
</>
);
}
export default FeatureOptInBannerWrapper;