mirror of
https://github.com/Azure/cosmos-explorer.git
synced 2025-03-28 04:29:13 +00:00
[Query Copilot] Pass user email to query feedback (#1516)
* Pass user email to query feedback AB#2501550 * Await page.frame * Make contact no by default * Add hook to check if it sohuld render the modal in the main component
This commit is contained in:
parent
b6d576b7b6
commit
e9ea887fe7
@ -13,6 +13,7 @@ import {
|
|||||||
import { submitFeedback } from "Explorer/QueryCopilot/QueryCopilotUtilities";
|
import { submitFeedback } from "Explorer/QueryCopilot/QueryCopilotUtilities";
|
||||||
import { useQueryCopilot } from "hooks/useQueryCopilot";
|
import { useQueryCopilot } from "hooks/useQueryCopilot";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
|
import { getUserEmail } from "../../Utils/UserUtils";
|
||||||
|
|
||||||
export const QueryCopilotFeedbackModal: React.FC = (): JSX.Element => {
|
export const QueryCopilotFeedbackModal: React.FC = (): JSX.Element => {
|
||||||
const {
|
const {
|
||||||
@ -26,6 +27,7 @@ export const QueryCopilotFeedbackModal: React.FC = (): JSX.Element => {
|
|||||||
const [isContactAllowed, setIsContactAllowed] = React.useState<boolean>(true);
|
const [isContactAllowed, setIsContactAllowed] = React.useState<boolean>(true);
|
||||||
const [description, setDescription] = React.useState<string>("");
|
const [description, setDescription] = React.useState<string>("");
|
||||||
const [doNotShowAgainChecked, setDoNotShowAgainChecked] = React.useState<boolean>(false);
|
const [doNotShowAgainChecked, setDoNotShowAgainChecked] = React.useState<boolean>(false);
|
||||||
|
const [contact, setContact] = React.useState<string>(getUserEmail());
|
||||||
return (
|
return (
|
||||||
<Modal isOpen={showFeedbackModal}>
|
<Modal isOpen={showFeedbackModal}>
|
||||||
<Stack style={{ padding: 24 }}>
|
<Stack style={{ padding: 24 }}>
|
||||||
@ -69,7 +71,10 @@ export const QueryCopilotFeedbackModal: React.FC = (): JSX.Element => {
|
|||||||
{ key: "no", text: "No, do not contact me." },
|
{ key: "no", text: "No, do not contact me." },
|
||||||
]}
|
]}
|
||||||
selectedKey={isContactAllowed ? "yes" : "no"}
|
selectedKey={isContactAllowed ? "yes" : "no"}
|
||||||
onChange={(_, option) => setIsContactAllowed(option.key === "yes")}
|
onChange={(_, option) => {
|
||||||
|
setIsContactAllowed(option.key === "yes");
|
||||||
|
setContact(option.key === "yes" ? getUserEmail() : "");
|
||||||
|
}}
|
||||||
></ChoiceGroup>
|
></ChoiceGroup>
|
||||||
<Text style={{ fontSize: 12, marginBottom: 14 }}>
|
<Text style={{ fontSize: 12, marginBottom: 14 }}>
|
||||||
By pressing submit, your feedback will be used to improve Microsoft products and services. IT admins for your
|
By pressing submit, your feedback will be used to improve Microsoft products and services. IT admins for your
|
||||||
@ -92,7 +97,7 @@ export const QueryCopilotFeedbackModal: React.FC = (): JSX.Element => {
|
|||||||
onClick={() => {
|
onClick={() => {
|
||||||
closeFeedbackModal();
|
closeFeedbackModal();
|
||||||
setHideFeedbackModalForLikedQueries(doNotShowAgainChecked);
|
setHideFeedbackModalForLikedQueries(doNotShowAgainChecked);
|
||||||
submitFeedback({ generatedQuery, likeQuery, description, userPrompt });
|
submitFeedback({ generatedQuery, likeQuery, description, userPrompt, contact });
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
Submit
|
Submit
|
||||||
|
@ -18,6 +18,7 @@ import "../externals/jquery.typeahead.min.js";
|
|||||||
// Image Dependencies
|
// Image Dependencies
|
||||||
import { QueryCopilotCarousel } from "Explorer/QueryCopilot/CopilotCarousel";
|
import { QueryCopilotCarousel } from "Explorer/QueryCopilot/CopilotCarousel";
|
||||||
import { QueryCopilotFeedbackModal } from "Explorer/QueryCopilot/QueryCopilotFeedbackModal";
|
import { QueryCopilotFeedbackModal } from "Explorer/QueryCopilot/QueryCopilotFeedbackModal";
|
||||||
|
import { useQueryCopilot } from "hooks/useQueryCopilot";
|
||||||
import "../images/CosmosDB_rgb_ui_lighttheme.ico";
|
import "../images/CosmosDB_rgb_ui_lighttheme.ico";
|
||||||
import hdeConnectImage from "../images/HdeConnectCosmosDB.svg";
|
import hdeConnectImage from "../images/HdeConnectCosmosDB.svg";
|
||||||
import "../images/favicon.ico";
|
import "../images/favicon.ico";
|
||||||
@ -63,6 +64,7 @@ const App: React.FunctionComponent = () => {
|
|||||||
const [isLeftPaneExpanded, setIsLeftPaneExpanded] = useState<boolean>(true);
|
const [isLeftPaneExpanded, setIsLeftPaneExpanded] = useState<boolean>(true);
|
||||||
const isCarouselOpen = useCarousel((state) => state.shouldOpen);
|
const isCarouselOpen = useCarousel((state) => state.shouldOpen);
|
||||||
const isCopilotCarouselOpen = useCarousel((state) => state.showCopilotCarousel);
|
const isCopilotCarouselOpen = useCarousel((state) => state.showCopilotCarousel);
|
||||||
|
const shouldShowModal = useQueryCopilot((state) => state.showFeedbackModal);
|
||||||
|
|
||||||
const config = useConfig();
|
const config = useConfig();
|
||||||
const explorer = useKnockoutExplorer(config?.platform);
|
const explorer = useKnockoutExplorer(config?.platform);
|
||||||
@ -126,7 +128,7 @@ const App: React.FunctionComponent = () => {
|
|||||||
{<SQLQuickstartTutorial />}
|
{<SQLQuickstartTutorial />}
|
||||||
{<MongoQuickstartTutorial />}
|
{<MongoQuickstartTutorial />}
|
||||||
{<QueryCopilotCarousel isOpen={isCopilotCarouselOpen} explorer={explorer} />}
|
{<QueryCopilotCarousel isOpen={isCopilotCarouselOpen} explorer={explorer} />}
|
||||||
{<QueryCopilotFeedbackModal />}
|
{shouldShowModal && <QueryCopilotFeedbackModal />}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -6,3 +6,9 @@ export const getFullName = (): string => {
|
|||||||
const { name } = decryptJWTToken(authorizationToken);
|
const { name } = decryptJWTToken(authorizationToken);
|
||||||
return name;
|
return name;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const getUserEmail = (): string => {
|
||||||
|
const { authorizationToken } = userContext;
|
||||||
|
const { upn } = decryptJWTToken(authorizationToken);
|
||||||
|
return upn;
|
||||||
|
};
|
||||||
|
@ -39,7 +39,7 @@ test("Resource token", async () => {
|
|||||||
await page.type("input[class='inputToken']", resourceTokenConnectionString);
|
await page.type("input[class='inputToken']", resourceTokenConnectionString);
|
||||||
await page.click("input[value='Connect']");
|
await page.click("input[value='Connect']");
|
||||||
await page.waitForSelector("iframe");
|
await page.waitForSelector("iframe");
|
||||||
const explorer = page.frame({
|
const explorer = await page.frame({
|
||||||
name: "explorer",
|
name: "explorer",
|
||||||
});
|
});
|
||||||
await explorer.textContent(`css=.dataResourceTree >> "${collectionId}"`);
|
await explorer.textContent(`css=.dataResourceTree >> "${collectionId}"`);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user