diff --git a/src/AppRouter.tsx b/src/AppRouter.tsx index 1858dc30..d47fe664 100644 --- a/src/AppRouter.tsx +++ b/src/AppRouter.tsx @@ -5,11 +5,21 @@ import { ShellBarComponent } from './components/Core/ShellBar.tsx'; import { SentryRoutes } from './mount.ts'; import ProjectPage from './spaces/onboarding/pages/ProjectPage.tsx'; import McpPage from './spaces/mcp/pages/McpPage.tsx'; +import { SearchParamToggleVisibility } from './components/Helper/FeatureToggleExistance.tsx'; function AppRouter() { return ( <> - + { + if (params === undefined) return true; + if (params.get('showHeaderBar') === null) return true; + return params?.get('showHeaderBar') === 'true'; + }} + > + + + }> diff --git a/src/components/Core/BetaButton.tsx b/src/components/Core/BetaButton.tsx new file mode 100644 index 00000000..3f76eba7 --- /dev/null +++ b/src/components/Core/BetaButton.tsx @@ -0,0 +1,58 @@ +import { ButtonDomRef, Button, Icon, PopoverDomRef, Popover, Text } from '@ui5/webcomponents-react'; +import { useState, useRef, RefObject } from 'react'; +import styles from './ShellBar.module.css'; +import { useTranslation } from 'react-i18next'; +import PopoverPlacement from '@ui5/webcomponents/dist/types/PopoverPlacement.js'; +import { ThemingParameters } from '@ui5/webcomponents-react-base'; + +export function BetaButton() { + const [betaPopoverOpen, setBetaPopoverOpen] = useState(false); + const betaButtonRef = useRef(null); + const betaPopoverRef = useRef(null); + const { t } = useTranslation(); + + const onBetaClick = () => { + if (betaButtonRef.current) { + betaPopoverRef.current!.opener = betaButtonRef.current; + setBetaPopoverOpen(!betaPopoverOpen); + } + }; + + return ( + <> + + + ); +} + +const BetaPopover = ({ + open, + setOpen, + popoverRef, +}: { + open: boolean; + setOpen: (arg0: boolean) => void; + popoverRef: RefObject; +}) => { + const { t } = useTranslation(); + + return ( + setOpen(false)}> + + {t('ShellBar.betaButtonDescription')} + + + ); +}; diff --git a/src/components/Core/FeedbackButton.tsx b/src/components/Core/FeedbackButton.tsx new file mode 100644 index 00000000..1fc3d8aa --- /dev/null +++ b/src/components/Core/FeedbackButton.tsx @@ -0,0 +1,170 @@ +import { + PopoverDomRef, + Ui5CustomEvent, + TextAreaDomRef, + Button, + ButtonDomRef, + Popover, + Form, + FormGroup, + FormItem, + Label, + Link, + RatingIndicator, + TextArea, +} from '@ui5/webcomponents-react'; +import { Dispatch, RefObject, SetStateAction, useRef, useState } from 'react'; +import { useAuthOnboarding } from '../../spaces/onboarding/auth/AuthContextOnboarding'; +import { useTranslation } from 'react-i18next'; +import { ButtonClickEventDetail } from '@ui5/webcomponents/dist/Button.js'; +import PopoverPlacement from '@ui5/webcomponents/dist/types/PopoverPlacement.js'; +import ButtonDesign from '@ui5/webcomponents/dist/types/ButtonDesign.js'; + +type UI5RatingIndicatorElement = HTMLElement & { value: number }; + +export function FeedbackButton() { + const feedbackPopoverRef = useRef(null); + const [feedbackMessage, setFeedbackMessage] = useState(''); + const [feedbackSent, setFeedbackSent] = useState(false); + const [feedbackPopoverOpen, setFeedbackPopoverOpen] = useState(false); + const [rating, setRating] = useState(0); + const { user } = useAuthOnboarding(); + + const onFeedbackClick = (e: Ui5CustomEvent) => { + feedbackPopoverRef.current!.opener = e.target; + setFeedbackPopoverOpen(!feedbackPopoverOpen); + }; + + const onFeedbackMessageChange = (event: Ui5CustomEvent) => { + const newValue = event.target.value; + setFeedbackMessage(newValue); + }; + + async function onFeedbackSent() { + const payload = { + message: feedbackMessage, + rating: rating.toString(), + user: user?.email, + environment: window.location.hostname, + }; + try { + await fetch('/api/feedback', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(payload), + }); + } catch (err) { + console.log(err); + } finally { + setFeedbackSent(true); + } + } + + return ( + <> +