diff options
Diffstat (limited to 'extension/react-app/src')
| -rw-r--r-- | extension/react-app/src/components/Onboarding.tsx | 115 | ||||
| -rw-r--r-- | extension/react-app/src/tabs/gui.tsx | 2 | 
2 files changed, 117 insertions, 0 deletions
| diff --git a/extension/react-app/src/components/Onboarding.tsx b/extension/react-app/src/components/Onboarding.tsx new file mode 100644 index 00000000..061faba5 --- /dev/null +++ b/extension/react-app/src/components/Onboarding.tsx @@ -0,0 +1,115 @@ +import { useSelector } from "react-redux"; +import { RootStore } from "../redux/store"; +import React, { useState, useEffect } from "react"; +import styled from "styled-components"; +import { ArrowLeft, ArrowRight } from "@styled-icons/heroicons-outline"; +import { defaultBorderRadius } from "."; + +const StyledDiv = styled.div` +  position: absolute; +  top: 0; +  left: 0; +  width: 100%; +  height: 100%; +  background-color: #1e1e1e; +  z-index: 200; +`; + +const StyledSpan = styled.span` +  padding: 8px; +  border-radius: ${defaultBorderRadius}; +  &:hover { +    background-color: #ffffff33; +  } +`; + +const Onboarding = () => { +  const [counter, setCounter] = useState(4); +  const gifs = ["intro", "explain", "edit", "generate"]; +  const topMessages = [ +    "Welcome to Continue!", +    "Answer coding questions", +    "Edit in natural language", +    "Generate files from scratch", +  ]; +  const bottomMessages = [ +    "", +    "Ask Continue about a part of your code to get another perspective", +    "Highlight a section of code and instruct Continue to refactor it", +    "Let Continue build the scaffolding of Python scripts, React components, and more", +  ]; + +  const vscMediaUrl = useSelector( +    (state: RootStore) => state.config.vscMediaUrl +  ); + +  useEffect(() => { +    const hasVisited = localStorage.getItem("hasVisited"); +    if (hasVisited) { +      setCounter(4); +    } else { +      setCounter(0); +      localStorage.setItem("hasVisited", "true"); +    } +  }, []); + +  return ( +    <StyledDiv hidden={counter >= 4}> +      <div +        style={{ +          display: "grid", +          justifyContent: "center", +          alignItems: "center", +          height: "100%", +          textAlign: "center", +          background: `linear-gradient( +            101.79deg, +            #12887a66 0%, +            #87245c66 32%, +            #e1263766 63%, +            #ffb21566 100% +          )`, +          paddingLeft: "16px", +          paddingRight: "16px", +        }} +      > +        <h1>{topMessages[counter]}</h1> +        <div style={{ display: "flex", justifyContent: "center" }}> +          <img +            src={`https://github.com/continuedev/continue/blob/main/media/${gifs[counter]}.gif?raw=true`} +            alt={topMessages[counter]} +          /> +        </div> +        <p>{bottomMessages[counter]}</p> +        <p +          style={{ +            paddingLeft: "50px", +            paddingRight: "50px", +            paddingBottom: "50px", +            textAlign: "center", +          }} +        > +          <div +            style={{ +              cursor: "pointer", +            }} +          > +            <StyledSpan +              hidden={counter === 0} +              onClick={() => setCounter((prev) => Math.max(prev - 1, 0))} +            > +              <ArrowLeft width="18px" strokeWidth="2px" /> Previous +            </StyledSpan> +            <span hidden={counter === 0}>{" | "}</span> +            <StyledSpan onClick={() => setCounter((prev) => prev + 1)}> +              Click to {counter === 3 || "learn how to"} use Continue{" "} +              <ArrowRight width="18px" strokeWidth="2px" /> +            </StyledSpan> +          </div> +        </p> +      </div> +    </StyledDiv> +  ); +}; + +export default Onboarding; diff --git a/extension/react-app/src/tabs/gui.tsx b/extension/react-app/src/tabs/gui.tsx index 646aef50..0e60e05c 100644 --- a/extension/react-app/src/tabs/gui.tsx +++ b/extension/react-app/src/tabs/gui.tsx @@ -23,6 +23,7 @@ import { RootStore } from "../redux/store";  import LoadingCover from "../components/LoadingCover";  import { postVscMessage } from "../vscode";  import UserInputContainer from "../components/UserInputContainer"; +import Onboarding from "../components/Onboarding";  const TopGUIDiv = styled.div`    overflow: hidden; @@ -267,6 +268,7 @@ function GUI(props: GUIProps) {    // const iterations = useSelector(selectIterations);    return (      <> +      <Onboarding></Onboarding>        <LoadingCover hidden={true} message="Downloading local model..." />        <TextDialog          showDialog={showFeedbackDialog} | 
