All files / publisher/pages/Publicise Publicise.tsx

53.33% Statements 8/15
71.42% Branches 15/21
66.66% Functions 2/3
53.33% Lines 8/15

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127                                              6x   6x                             6x 6x       6x 6x           6x   6x                                                                                                                                                
import { useParams, NavLink } from "react-router-dom";
import { useQuery } from "react-query";
import {
  Row,
  Col,
  SideNavigation,
  Strip,
  Notification,
  Icon,
} from "@canonical/react-components";
 
import SectionNav from "../../components/SectionNav";
import PubliciseButtons from "./PubliciseButtons";
import PubliciseBadges from "./PubliciseBadges";
import PubliciseCards from "./PubliciseCards";
 
import { setPageTitle } from "../../utils";
 
type Props = {
  view?: undefined | "badges" | "cards";
};
 
function Publicise({ view }: Props): React.JSX.Element {
  const { snapId } = useParams();
 
  const { data, isLoading, isFetched } = useQuery({
    queryKey: ["publiciseData"],
    queryFn: async () => {
      const response = await fetch(`/api/${snapId}/publicise`);
 
      if (!response.ok) {
        throw new Error("There was a problem loading publicise data");
      }
 
      const data = await response.json();
 
      return data.data;
    },
  });
 
  const disableView = () => {
    Iif (data.private) {
      return true;
    }
 
    Eif (!data.is_released) {
      return true;
    }
 
    return false;
  };
 
  setPageTitle(`Publicise ${snapId}`);
 
  return (
    <>
      <h1 className="p-heading--4" aria-live="polite">
        <a href="/snaps">My snaps</a> / <a href={`/${snapId}`}>{snapId}</a> /
        Publicise
      </h1>
 
      <SectionNav snapName={snapId} activeTab="publicise" />
 
      {isLoading && (
        <Strip shallow>
          <p>
            <Icon name="spinner" className="u-animation--spin" />
            &nbsp;Loading...
          </p>
        </Strip>
      )}
 
      {isFetched && data && (
        <Strip shallow>
          {disableView() && (
            <Notification severity="information">
              When your snap is public and has a release, you'll be able to
              share it using Store buttons, badges and embeddable cards. Make
              your snap public in its{" "}
              <a href={`/${snapId}/settings`}>settings page</a>.
            </Notification>
          )}
          <Row className={data.private ? "u-disabled" : ""}>
            <Col size={3}>
              <SideNavigation
                items={[
                  {
                    items: [
                      {
                        "aria-current": !view,
                        label: "Snap Store buttons",
                        to: `/${snapId}/publicise`,
                        component: NavLink,
                      },
                      {
                        "aria-current": view === "badges",
                        label: "GitHub badges",
                        to: `/${snapId}/publicise/badges`,
                        component: NavLink,
                      },
                      {
                        "aria-current": view === "cards",
                        label: "Embeddable cards",
                        to: `/${snapId}/publicise/cards`,
                        component: NavLink,
                      },
                    ],
                  },
                ]}
              />
            </Col>
            <Col size={9}>
              {!view && <PubliciseButtons />}
              {view === "badges" && (
                <PubliciseBadges trending={data.trending} />
              )}
              {view === "cards" && <PubliciseCards />}
            </Col>
          </Row>
        </Strip>
      )}
    </>
  );
}
 
export default Publicise;