mirror of
https://github.com/AykutSarac/jsoncrack.com.git
synced 2025-02-04 01:32:54 +08:00
implement pro version updates
This commit is contained in:
parent
935901f87e
commit
041fa31a86
@ -1,7 +1,6 @@
|
|||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { FaDiscord, FaGithub, FaLinkedin, FaTwitter } from "react-icons/fa";
|
import { FaDiscord, FaGithub, FaLinkedin, FaTwitter } from "react-icons/fa";
|
||||||
import styled from "styled-components";
|
import styled from "styled-components";
|
||||||
import pkg from "../../../package.json";
|
|
||||||
|
|
||||||
export const StyledFooter = styled.footer`
|
export const StyledFooter = styled.footer`
|
||||||
display: flex;
|
display: flex;
|
||||||
@ -47,7 +46,7 @@ export const Footer = () => (
|
|||||||
<img width="120" height="20" src="assets/icon.png" alt="icon" loading="lazy" />
|
<img width="120" height="20" src="assets/icon.png" alt="icon" loading="lazy" />
|
||||||
</Link>
|
</Link>
|
||||||
<span>
|
<span>
|
||||||
© {new Date().getFullYear()} JSON Crack - {pkg.version}
|
© {new Date().getFullYear()} JSON Crack
|
||||||
</span>
|
</span>
|
||||||
</StyledFooterText>
|
</StyledFooterText>
|
||||||
<StyledIconLinks>
|
<StyledIconLinks>
|
||||||
|
59
src/components/Navbar/index.tsx
Normal file
59
src/components/Navbar/index.tsx
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
import React from "react";
|
||||||
|
import Link from "next/link";
|
||||||
|
import styled from "styled-components";
|
||||||
|
|
||||||
|
const StyledNavbar = styled.div`
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
gap: 20px;
|
||||||
|
padding: 16px 48px;
|
||||||
|
|
||||||
|
@media only screen and (max-width: 768px) {
|
||||||
|
a:first-of-type {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
const StyledLinkWrapper = styled.nav`
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
gap: 20px;
|
||||||
|
`;
|
||||||
|
|
||||||
|
const StyledNavLink = styled(Link)`
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
font-size: 1rem;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: color 0.2s;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
font-weight: 500;
|
||||||
|
color: ${({ theme }) => theme.ORANGE};
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
export const Navbar = () => (
|
||||||
|
<StyledNavbar>
|
||||||
|
<Link href="/">
|
||||||
|
<img src="assets/icon.png" alt="json crack" width="120" />
|
||||||
|
</Link>
|
||||||
|
<StyledLinkWrapper>
|
||||||
|
<StyledNavLink href="/editor">Editor</StyledNavLink>
|
||||||
|
<StyledNavLink href="#features">Features</StyledNavLink>
|
||||||
|
<StyledNavLink href="#sponsor">Sponsor</StyledNavLink>
|
||||||
|
<StyledNavLink
|
||||||
|
href="https://github.com/AykutSarac/jsoncrack.com"
|
||||||
|
target="_blank"
|
||||||
|
rel="external"
|
||||||
|
>
|
||||||
|
GitHub
|
||||||
|
</StyledNavLink>
|
||||||
|
<StyledNavLink href="docs">Documentation</StyledNavLink>
|
||||||
|
</StyledLinkWrapper>
|
||||||
|
</StyledNavbar>
|
||||||
|
);
|
@ -21,27 +21,12 @@ import { baseURL } from "src/constants/data";
|
|||||||
import { TABS } from "src/constants/previewSection";
|
import { TABS } from "src/constants/previewSection";
|
||||||
import { PricingCards } from "../PricingCards";
|
import { PricingCards } from "../PricingCards";
|
||||||
import * as Styles from "./styles";
|
import * as Styles from "./styles";
|
||||||
|
import { Navbar } from "src/components/Navbar";
|
||||||
|
|
||||||
const SyntaxHighlighter = dynamic(() => import("react-syntax-highlighter/dist/cjs/prism-async"), {
|
const SyntaxHighlighter = dynamic(() => import("react-syntax-highlighter/dist/cjs/prism-async"), {
|
||||||
ssr: false,
|
ssr: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
const Navbar = () => (
|
|
||||||
<Styles.StyledNavbar>
|
|
||||||
<Styles.StyledNavLink href="/editor">Editor</Styles.StyledNavLink>
|
|
||||||
<Styles.StyledNavLink href="#features">Features</Styles.StyledNavLink>
|
|
||||||
<Styles.StyledNavLink href="#sponsor">Sponsor</Styles.StyledNavLink>
|
|
||||||
<Styles.StyledNavLink
|
|
||||||
href="https://github.com/AykutSarac/jsoncrack.com"
|
|
||||||
target="_blank"
|
|
||||||
rel="external"
|
|
||||||
>
|
|
||||||
GitHub
|
|
||||||
</Styles.StyledNavLink>
|
|
||||||
<Styles.StyledNavLink href="docs">Documentation</Styles.StyledNavLink>
|
|
||||||
</Styles.StyledNavbar>
|
|
||||||
);
|
|
||||||
|
|
||||||
const HeroSection = () => (
|
const HeroSection = () => (
|
||||||
<Styles.StyledHeroSection id="main">
|
<Styles.StyledHeroSection id="main">
|
||||||
<Styles.StyledTitle>
|
<Styles.StyledTitle>
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import type { AppProps } from "next/app";
|
import type { AppProps } from "next/app";
|
||||||
|
import { useRouter } from "next/router";
|
||||||
import localFont from "@next/font/local";
|
import localFont from "@next/font/local";
|
||||||
import { init } from "@sentry/nextjs";
|
import { init } from "@sentry/nextjs";
|
||||||
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
||||||
@ -9,6 +10,7 @@ import GlobalStyle from "src/constants/globalStyle";
|
|||||||
import { darkTheme, lightTheme } from "src/constants/theme";
|
import { darkTheme, lightTheme } from "src/constants/theme";
|
||||||
import { ModalController } from "src/containers/ModalController";
|
import { ModalController } from "src/containers/ModalController";
|
||||||
import useStored from "src/store/useStored";
|
import useStored from "src/store/useStored";
|
||||||
|
import useUser from "src/store/useUser";
|
||||||
import { ThemeProvider } from "styled-components";
|
import { ThemeProvider } from "styled-components";
|
||||||
|
|
||||||
const monaSans = localFont({
|
const monaSans = localFont({
|
||||||
@ -35,14 +37,19 @@ const queryClient = new QueryClient({
|
|||||||
});
|
});
|
||||||
|
|
||||||
function JsonCrack({ Component, pageProps }: AppProps) {
|
function JsonCrack({ Component, pageProps }: AppProps) {
|
||||||
const [isReady, setReady] = React.useState(false);
|
const [isLoaded, setIsLoaded] = React.useState(false);
|
||||||
|
const { isReady } = useRouter();
|
||||||
const lightmode = useStored(state => state.lightmode);
|
const lightmode = useStored(state => state.lightmode);
|
||||||
|
const checkSession = useUser(state => state.checkSession);
|
||||||
|
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
setReady(true);
|
if (isReady) {
|
||||||
}, []);
|
checkSession();
|
||||||
|
}
|
||||||
|
setIsLoaded(true);
|
||||||
|
}, [checkSession, isReady]);
|
||||||
|
|
||||||
if (isReady)
|
if (isLoaded)
|
||||||
return (
|
return (
|
||||||
<QueryClientProvider client={queryClient}>
|
<QueryClientProvider client={queryClient}>
|
||||||
<GoogleAnalytics />
|
<GoogleAnalytics />
|
||||||
|
@ -2,8 +2,8 @@ import React from "react";
|
|||||||
import dynamic from "next/dynamic";
|
import dynamic from "next/dynamic";
|
||||||
import Head from "next/head";
|
import Head from "next/head";
|
||||||
import materialDark from "react-syntax-highlighter/dist/cjs/styles/prism/material-dark";
|
import materialDark from "react-syntax-highlighter/dist/cjs/styles/prism/material-dark";
|
||||||
import { Button } from "src/components/Button";
|
|
||||||
import { Footer } from "src/components/Footer";
|
import { Footer } from "src/components/Footer";
|
||||||
|
import { Navbar } from "src/components/Navbar";
|
||||||
import styled from "styled-components";
|
import styled from "styled-components";
|
||||||
|
|
||||||
const SyntaxHighlighter = dynamic(() => import("react-syntax-highlighter/dist/cjs/prism-async"), {
|
const SyntaxHighlighter = dynamic(() => import("react-syntax-highlighter/dist/cjs/prism-async"), {
|
||||||
@ -58,14 +58,12 @@ const StyledHighlight = styled.span<{ link?: boolean; alert?: boolean }>`
|
|||||||
const Docs = () => {
|
const Docs = () => {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
<Navbar />
|
||||||
<Head>
|
<Head>
|
||||||
<title>Creating JSON Crack Embed | JSON Crack</title>
|
<title>Creating JSON Crack Embed | JSON Crack</title>
|
||||||
<meta name="description" content="Embedding JSON Crack tutorial into your websites." />
|
<meta name="description" content="Embedding JSON Crack tutorial into your websites." />
|
||||||
</Head>
|
</Head>
|
||||||
<StyledPage>
|
<StyledPage>
|
||||||
<Button href="/" link status="SECONDARY">
|
|
||||||
< Go Back
|
|
||||||
</Button>
|
|
||||||
<h1>Documentation</h1>
|
<h1>Documentation</h1>
|
||||||
<StyledContent>
|
<StyledContent>
|
||||||
<h2># Fetching from URL</h2>
|
<h2># Fetching from URL</h2>
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import { Button } from "src/components/Button";
|
import { Button } from "src/components/Button";
|
||||||
import { Footer } from "src/components/Footer";
|
import { Footer } from "src/components/Footer";
|
||||||
|
import { Navbar } from "src/components/Navbar";
|
||||||
import { PricingCards } from "src/containers/PricingCards";
|
import { PricingCards } from "src/containers/PricingCards";
|
||||||
import styled from "styled-components";
|
import styled from "styled-components";
|
||||||
|
|
||||||
@ -17,6 +18,7 @@ const StyledHeroSection = styled.section`
|
|||||||
const Pricing = () => {
|
const Pricing = () => {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
<Navbar />
|
||||||
<StyledPageWrapper>
|
<StyledPageWrapper>
|
||||||
<Button href="/" link>
|
<Button href="/" link>
|
||||||
< Go Back
|
< Go Back
|
||||||
|
70
src/pages/sign-in.tsx
Normal file
70
src/pages/sign-in.tsx
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
import React from "react";
|
||||||
|
import Link from "next/link";
|
||||||
|
import { useRouter } from "next/router";
|
||||||
|
import { AiOutlineGithub, AiOutlineGoogle } from "react-icons/ai";
|
||||||
|
import { altogic } from "src/api/altogic";
|
||||||
|
import { Button } from "src/components/Button";
|
||||||
|
import { Footer } from "src/components/Footer";
|
||||||
|
import { Navbar } from "src/components/Navbar";
|
||||||
|
import useUser from "src/store/useUser";
|
||||||
|
import styled from "styled-components";
|
||||||
|
|
||||||
|
const StyledPageWrapper = styled.div`
|
||||||
|
padding: 5%;
|
||||||
|
`;
|
||||||
|
|
||||||
|
const StyledHeroSection = styled.section`
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
`;
|
||||||
|
|
||||||
|
const StyledLoginButtons = styled.div`
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
margin-top: 60px;
|
||||||
|
gap: 24px;
|
||||||
|
`;
|
||||||
|
|
||||||
|
const SignIn = () => {
|
||||||
|
const isPremium = useUser(state => state.isPremium());
|
||||||
|
const { replace } = useRouter();
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
if (isPremium) replace("/editor");
|
||||||
|
}, [isPremium, replace]);
|
||||||
|
|
||||||
|
const handleLoginClick = () => {
|
||||||
|
altogic.auth.signInWithProvider("google");
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Navbar />
|
||||||
|
<StyledPageWrapper>
|
||||||
|
<StyledHeroSection>
|
||||||
|
<Link href="/">
|
||||||
|
<img src="assets/icon.png" alt="json crack" width="400" />
|
||||||
|
</Link>
|
||||||
|
<h1>Sign In</h1>
|
||||||
|
</StyledHeroSection>
|
||||||
|
<StyledLoginButtons>
|
||||||
|
<Button status="DANGER" onClick={handleLoginClick}>
|
||||||
|
<AiOutlineGoogle size={24} />
|
||||||
|
Login with Google
|
||||||
|
</Button>
|
||||||
|
<Button status="TERTIARY" disabled>
|
||||||
|
<AiOutlineGithub size={24} />
|
||||||
|
Login with GitHub
|
||||||
|
</Button>
|
||||||
|
</StyledLoginButtons>
|
||||||
|
</StyledPageWrapper>
|
||||||
|
<Footer />
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default SignIn;
|
@ -38,6 +38,7 @@ const useUser = create<UserStates & UserActions>()((set, get) => ({
|
|||||||
set({ user: response.user as any, isAuthenticated: true });
|
set({ user: response.user as any, isAuthenticated: true });
|
||||||
},
|
},
|
||||||
checkSession: async () => {
|
checkSession: async () => {
|
||||||
|
if (location.pathname === "/") return;
|
||||||
const currentSession = altogic.auth.getSession();
|
const currentSession = altogic.auth.getSession();
|
||||||
|
|
||||||
if (currentSession) {
|
if (currentSession) {
|
||||||
@ -53,6 +54,8 @@ const useUser = create<UserStates & UserActions>()((set, get) => ({
|
|||||||
set({ user: data.user as any, isAuthenticated: true });
|
set({ user: data.user as any, isAuthenticated: true });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (get().isPremium()) location.replace(location.href.replace("://", "://pro."));
|
||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user