export function SandyRatingButton()

in desktop/flipper-ui-core/src/chrome/RatingButton.tsx [268:359]


export function SandyRatingButton() {
  const [promptData, setPromptData] =
    useState<UserFeedback.FeedbackPrompt | null>(null);
  const [isShown, setIsShown] = useState(false);
  const [hasTriggered, setHasTriggered] = useState(false);
  const sessionId = useStore((store) => store.application.sessionId);
  const loggedIn = useValue(isLoggedIn());

  const triggerPopover = useCallback(() => {
    if (!hasTriggered) {
      setIsShown(true);
      setHasTriggered(true);
    }
  }, [hasTriggered]);

  useEffect(() => {
    if (
      getRenderHostInstance().GK('flipper_enable_star_ratiings') &&
      !hasTriggered &&
      loggedIn
    ) {
      reportPlatformFailures(
        UserFeedback.getPrompt().then((prompt) => {
          setPromptData(prompt);
          setTimeout(triggerPopover, 30000);
        }),
        'RatingButton:getPrompt',
      ).catch((e) => {
        console.warn('Failed to load ratings prompt:', e);
      });
    }
  }, [triggerPopover, hasTriggered, loggedIn]);

  const onClick = () => {
    const willBeShown = !isShown;
    setIsShown(willBeShown);
    setHasTriggered(true);
    if (!willBeShown) {
      UserFeedback.dismiss(sessionId);
    }
  };

  const submitRating = (rating: number) => {
    UserFeedback.submitRating(rating, sessionId);
  };

  const submitComment = (
    rating: number,
    comment: string,
    selectedPredefinedComments: Array<string>,
    allowUserInfoSharing: boolean,
  ) => {
    UserFeedback.submitComment(
      rating,
      comment,
      selectedPredefinedComments,
      allowUserInfoSharing,
      sessionId,
    );
  };

  if (!promptData) {
    return null;
  }
  if (!promptData.shouldPopup || (hasTriggered && !isShown)) {
    return null;
  }
  return (
    <Popover
      visible={isShown}
      content={
        <FeedbackComponent
          submitRating={submitRating}
          submitComment={submitComment}
          close={() => {
            setIsShown(false);
          }}
          dismiss={onClick}
          promptData={promptData}
        />
      }
      placement="right"
      trigger="click">
      <LeftRailButton
        icon={<StarOutlined />}
        title="Rate Flipper"
        onClick={onClick}
        small
      />
    </Popover>
  );
}