import React, { useContext, useMemo } from "react"; import styled from "styled-components"; import { rem } from "polished"; import { RequestContext } from "../../../context"; import { CodeHighlight, Pane } from "../../../components"; export const Response: React.FC = () => { const { fetching, response, error } = useContext(RequestContext); const { state, code } = useMemo(() => { if (fetching) { return { state: "Fetching", code: null, }; } if (response) { return { state: "Success", code: ( ), }; } if (error) { return { state: "Error", code: ( ), }; } return { state: "Idle", code: null, }; }, [fetching, response, error]); return useMemo(() => { if (state === "Idle") { return Run a query to see what the client returns...; } return ( <> State {state} {code && ( Response {code} )} ); }, [code, state]); }; const Prompt = styled.div` padding: ${(p) => p.theme.space[6]}; text-align: center; color: ${(p) => p.theme.colors.textDimmed.base}; `; const Status = styled.code` color: ${(p) => p.theme.colors.textDimmed.base}; font-size: ${(p) => p.theme.fontSizes.body.m}; line-height: ${(p) => p.theme.lineHeights.body.m}; display: flex; align-items: center; `; const Icon = styled.span` display: block; margin-right: ${(p) => p.theme.space[3]}; width: ${rem(9)}; height: ${rem(9)}; box-sizing: border-box; border: solid 1px; border-radius: 50%; &[data-state="idle"] { border-color: ${(p) => p.theme.colors.divider.base}; } &[data-state="fetching"] { border-color: ${(p) => p.theme.colors.pending.base}; } &[data-state="success"] { border-color: ${(p) => p.theme.colors.success.base}; background-color: ${(p) => p.theme.colors.success.base}; } &[data-state="error"] { border-color: ${(p) => p.theme.colors.error.base}; background-color: ${(p) => p.theme.colors.error.base}; } `;