diff --git a/README.md b/README.md
index 9dabeef58..de35c56b4 100644
--- a/README.md
+++ b/README.md
@@ -89,13 +89,14 @@ Thank you to our sponsors for making this project possible.
[Become a sponsor →](https://github.com/sponsors/lukevella)
-This project is also supported by the following companies through their open-source sponsorships.
+And thank you to these companies for sponsoring and showing support for this project.
-
+
-
+
-
+
-
-
+
+
+
diff --git a/apps/landing/src/pages/privacy-policy.tsx b/apps/landing/src/pages/privacy-policy.tsx
index 3a137aa55..b175d54f1 100644
--- a/apps/landing/src/pages/privacy-policy.tsx
+++ b/apps/landing/src/pages/privacy-policy.tsx
@@ -9,7 +9,7 @@ const PrivacyPolicy = () => {
Privacy Policy
-
Last updated: 19 April 2023
+
Last updated: 1 August 2023
At rallly.co, we take your privacy seriously. This privacy policy
explains how we collect, use, and disclose your personal data, and
@@ -66,10 +66,18 @@ const PrivacyPolicy = () => {
Sharing of personal data
- We do not share your personal data with third parties, except for our
- data processor, Posthog, which is based in the United States. We have
- implemented appropriate safeguards to protect your personal data when
- it is transferred outside of the European Economic Area.
+ We do not share your personal data with any third parties for
+ marketing or commercial purposes. We may share your personal data with
+ third parties to provide you with our services, to comply with
+ applicable laws and regulations, to respond to a subpoena, search
+ warrant or other lawful request for information we receive, or to
+ otherwise protect our rights.
+
+
+
+ For example, we use Featurebase to make it easy for users to submit
+ feedback. Your name and email may be shared with Featurbase to provide
+ a seamless transition between the two services.
Your rights
diff --git a/apps/web/public/locales/en/app.json b/apps/web/public/locales/en/app.json
index 5969d960b..46269b3bd 100644
--- a/apps/web/public/locales/en/app.json
+++ b/apps/web/public/locales/en/app.json
@@ -10,7 +10,6 @@
"settings": "Settings",
"changeNameDescription": "Enter a new name for this participant.",
"changeNameInfo": "This will not affect any votes you have already made.",
- "close": "Close",
"comments": "Comments",
"continue": "Continue",
"copied": "Copied",
@@ -36,11 +35,6 @@
"emailPlaceholder": "jessie.smith@example.com",
"expiredOrInvalidLink": "This link is expired or invalid. Please request a new link.",
"exportToCsv": "Export to CSV",
- "feedbackFormFooter": "Need help? Visit the support page.",
- "feedbackFormLabel": "How can we improve ?",
- "feedbackFormPlaceholder": "Share your thoughts…",
- "feedbackFormTitle": "Feedback Form",
- "feedbackSent": "Thank you! Your feedback has been sent.",
"forgetMe": "Forget me",
"guest": "Guest",
"ifNeedBe": "If need be",
@@ -76,7 +70,6 @@
"response": "Response",
"save": "Save",
"saveInstruction": "Select your availability and click {action}",
- "send": "Send",
"sendFeedback": "Send Feedback",
"specifyTimes": "Specify times",
"specifyTimesDescription": "Include start and end times for each option",
@@ -213,5 +206,8 @@
"disableCommentsDescription": "Remove the option to leave a comment on the poll",
"planCustomizablePollSettings": "Customizable poll settings",
"clockPreferences": "Clock Preferences",
- "clockPreferencesDescription": "Set your preferred time zone and time format."
+ "clockPreferencesDescription": "Set your preferred time zone and time format.",
+ "featureRequest": "Request a Feature",
+ "bugReport": "Report an Issue",
+ "getSupport": "Get Support"
}
diff --git a/apps/web/src/components/featurebase.tsx b/apps/web/src/components/featurebase.tsx
new file mode 100644
index 000000000..3bba4e59b
--- /dev/null
+++ b/apps/web/src/components/featurebase.tsx
@@ -0,0 +1,44 @@
+import Script from "next/script";
+import React from "react";
+
+import { useUser } from "@/components/user-provider";
+
+export const FeaturebaseProvider = ({ children }: React.PropsWithChildren) => {
+ const { user } = useUser();
+
+ React.useEffect(() => {
+ if (user.isGuest) return;
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ const win = window as any;
+
+ if (typeof win.Featurebase !== "function") {
+ win.Featurebase = function () {
+ // eslint-disable-next-line prefer-rest-params
+ (win.Featurebase.q = win.Featurebase.q || []).push(arguments);
+ };
+ }
+ win.Featurebase(
+ "identify",
+ {
+ organization: "rallly",
+
+ // Required. Replace with your customers data.
+ email: user.email,
+ name: user.name,
+ id: user.id,
+ },
+ (err: Error) => {
+ // Callback function. Called when identify completed.
+ if (err) {
+ console.error(err);
+ }
+ },
+ );
+ }, [user]);
+ return (
+ <>
+
+ {children}
+ >
+ );
+};
diff --git a/apps/web/src/components/feedback.tsx b/apps/web/src/components/feedback.tsx
index 7b18a7333..39282bd95 100644
--- a/apps/web/src/components/feedback.tsx
+++ b/apps/web/src/components/feedback.tsx
@@ -1,107 +1,75 @@
-import { trpc } from "@rallly/backend";
-import { CheckCircleIcon, MegaphoneIcon } from "@rallly/icons";
-import { Button } from "@rallly/ui/button";
-import { Tooltip, TooltipContent, TooltipTrigger } from "@rallly/ui/tooltip";
+import {
+ BugIcon,
+ LifeBuoyIcon,
+ LightbulbIcon,
+ MegaphoneIcon,
+ SmileIcon,
+} from "@rallly/icons";
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+ DropdownMenuTrigger,
+} from "@rallly/ui/dropdown-menu";
import Link from "next/link";
-import { Trans, useTranslation } from "next-i18next";
-import { useForm } from "react-hook-form";
+import { Trans } from "next-i18next";
-import { Logo } from "@/components/logo";
-import { useModalState } from "@/components/modal/use-modal";
-
-const FeedbackForm = (props: { onClose: () => void }) => {
- const { t } = useTranslation();
- const sendFeedback = trpc.feedback.send.useMutation();
- const { handleSubmit, register, formState } = useForm<{ content: string }>();
-
- return (
-
- );
-};
+import { FeaturebaseProvider } from "@/components/featurebase";
const FeedbackButton = () => {
- const { t } = useTranslation();
- const [isVisible, show, close] = useModalState();
- if (isVisible) {
- return ;
- }
-
return (
-
-
-
-
-
-