Spaces:
Build error
Build error
| import React from "react"; | |
| import { useTranslation } from "react-i18next"; | |
| import { useNavigate, useSearchParams } from "react-router"; | |
| import { useMutation } from "@tanstack/react-query"; | |
| import { I18nKey } from "#/i18n/declaration"; | |
| import AllHandsLogo from "#/assets/branding/all-hands-logo.svg?react"; | |
| import { TOSCheckbox } from "#/components/features/waitlist/tos-checkbox"; | |
| import { BrandButton } from "#/components/features/settings/brand-button"; | |
| import { handleCaptureConsent } from "#/utils/handle-capture-consent"; | |
| import { openHands } from "#/api/open-hands-axios"; | |
| export default function AcceptTOS() { | |
| const { t } = useTranslation(); | |
| const navigate = useNavigate(); | |
| const [searchParams] = useSearchParams(); | |
| const [isTosAccepted, setIsTosAccepted] = React.useState(false); | |
| // Get the redirect URL from the query parameters | |
| const redirectUrl = searchParams.get("redirect_url") || "/"; | |
| // Use mutation for accepting TOS | |
| const { mutate: acceptTOS, isPending: isSubmitting } = useMutation({ | |
| mutationFn: async () => { | |
| // Set consent for analytics | |
| handleCaptureConsent(true); | |
| // Call the API to record TOS acceptance in the database | |
| return openHands.post("/api/accept_tos", { | |
| redirect_url: redirectUrl, | |
| }); | |
| }, | |
| onSuccess: (response) => { | |
| // Get the redirect URL from the response | |
| const finalRedirectUrl = response.data.redirect_url || redirectUrl; | |
| // Check if the redirect URL is an external URL (starts with http or https) | |
| if ( | |
| finalRedirectUrl.startsWith("http://") || | |
| finalRedirectUrl.startsWith("https://") | |
| ) { | |
| // For external URLs, redirect using window.location | |
| window.location.href = finalRedirectUrl; | |
| } else { | |
| // For internal routes, use navigate | |
| navigate(finalRedirectUrl); | |
| } | |
| }, | |
| }); | |
| const handleAcceptTOS = () => { | |
| if (isTosAccepted && !isSubmitting) { | |
| acceptTOS(); | |
| } | |
| }; | |
| return ( | |
| <div className="flex flex-col items-center justify-center h-full"> | |
| <div className="border border-tertiary p-8 rounded-lg max-w-md w-full flex flex-col gap-6 items-center bg-base-secondary"> | |
| <AllHandsLogo width={68} height={46} /> | |
| <div className="flex flex-col gap-2 w-full items-center text-center"> | |
| <h1 className="text-2xl font-bold"> | |
| {t(I18nKey.TOS$ACCEPT_TERMS_OF_SERVICE)} | |
| </h1> | |
| <p className="text-sm text-gray-500"> | |
| {t(I18nKey.TOS$ACCEPT_TERMS_DESCRIPTION)} | |
| </p> | |
| </div> | |
| <TOSCheckbox onChange={() => setIsTosAccepted((prev) => !prev)} /> | |
| <BrandButton | |
| isDisabled={!isTosAccepted || isSubmitting} | |
| type="button" | |
| variant="primary" | |
| onClick={handleAcceptTOS} | |
| className="w-full" | |
| > | |
| {isSubmitting ? t(I18nKey.HOME$LOADING) : t(I18nKey.TOS$CONTINUE)} | |
| </BrandButton> | |
| </div> | |
| </div> | |
| ); | |
| } | |