Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Deploy to production #84

Merged
merged 28 commits into from
Oct 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
08398dd
Allows sidebar to be closed when project ID exists
simonbs Oct 27, 2023
b437401
Hides expand/collapse button when mobileToolbar is undefined
simonbs Oct 27, 2023
0adb2ea
Merge pull request #77 from shapehq/bugfix/sidebar-cannot-be-closed
simonbs Oct 27, 2023
3b40665
Removes unused files
simonbs Oct 27, 2023
08cf3ec
Merge pull request #78 from shapehq/bugfix/hide-collapse-when-mobilet…
simonbs Oct 27, 2023
12d3b61
Merge pull request #79 from shapehq/enhancement/remove-unused-files
simonbs Oct 27, 2023
3e9fa21
Moves TrailingToolbar file
simonbs Oct 27, 2023
7c535af
Passes open state into SidebarContainer
simonbs Oct 27, 2023
b6aa673
Removes usage of isCloseSidebarEnabled to manage isSidebarOpen
simonbs Oct 27, 2023
0f7bb01
Aligns on naming
simonbs Oct 27, 2023
a24a38f
Improves formatting
simonbs Oct 27, 2023
e5b1781
Hides expand/collapse on desktop
simonbs Oct 27, 2023
f50822c
Fixes linting error
simonbs Oct 27, 2023
d751106
Linting warnings causes workflow to fail
simonbs Oct 27, 2023
f4dc88c
Merge pull request #80 from shapehq/bugfix/sidebar-transition
simonbs Oct 27, 2023
51a20fe
Merge branch 'develop' into bugfix/expand-collapse-mobile-toolbar-on-…
simonbs Oct 27, 2023
bed09b4
Merge pull request #82 from shapehq/enhancement/eslint-warnings-as-er…
simonbs Oct 27, 2023
4470eec
Merge pull request #81 from shapehq/bugfix/expand-collapse-mobile-too…
simonbs Oct 27, 2023
cb2819e
Moves loading indicators to common
simonbs Oct 27, 2023
7d5271f
Adds Stoplight viewer
simonbs Oct 27, 2023
b047716
No longer iframes Stoplight viewer
simonbs Oct 27, 2023
daa8bc9
Removes debug log statements
simonbs Oct 27, 2023
d3eb65b
Removes debug log
simonbs Oct 27, 2023
8eac272
Removes Stoplight
simonbs Oct 27, 2023
3108077
Viewers show custom loading indicators
simonbs Oct 27, 2023
6856fa2
Fixes lint errors
simonbs Oct 27, 2023
6dbd147
Improves readability
simonbs Oct 27, 2023
84ed6a3
Merge pull request #83 from shapehq/feature/stoplight
simonbs Oct 27, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint",
"lint": "next lint --max-warnings=0",
"test": "jest"
},
"dependencies": {
Expand Down
16 changes: 16 additions & 0 deletions src/app/documentation-viewer/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import DocumentationViewer from "@/features/docs/view/DocumentationViewer"

type SearchParams = { visualizer: string, url: string }

export default async function Page({
searchParams
}: {
searchParams: SearchParams
}) {
return (
<DocumentationViewer
visualizer={parseInt(searchParams.visualizer)}
url={searchParams.url}
/>
)
}
19 changes: 19 additions & 0 deletions src/common/loading/DelayedLoadingIndicator.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { useState, useEffect } from "react"
import LoadingIndicator from "./LoadingIndicator"

const DelayedLoadingIndicator = ({
delay
}: {
delay?: number
}) => {
const [isVisible, setVisible] = useState(false)
useEffect(() => {
const timer = setTimeout(() => {
setVisible(true)
}, delay || 1000)
return () => clearTimeout(timer)
}, [delay, setVisible])
return <>{isVisible && <LoadingIndicator/>}</>
}

export default DelayedLoadingIndicator
42 changes: 42 additions & 0 deletions src/common/loading/LoadingIndicator.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import { useState, useEffect } from "react"
import { Box, Typography } from "@mui/material"
import { useTheme } from "@mui/material/styles"

const LoadingIndicator = () => {
const theme = useTheme()
const [count, setCount] = useState(0)
useEffect(() => {
const timer = setInterval(() => {
if (count == 3) {
setCount(0)
} else {
setCount(count + 1)
}
}, 200)
return () => clearTimeout(timer)
}, [count, setCount])
return (
<Box style={{
display: "flex",
justifyContent: "center",
alignItems: "center",
height: "100%",
width: "100%",
background: theme.palette.background.default
}}>
{Array.from(Array(3).keys()).map((e) => {
return (
<Typography
key={count}
variant="h3"
sx={{ opacity: e + 1 == count ? 0.5 : 0.2 }}
>
</Typography>
)
})}
</Box>
)
}

export default LoadingIndicator
5 changes: 5 additions & 0 deletions src/common/state/sidebarOpen.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { useSessionStorage } from "usehooks-ts"

export default function useSidebarOpen() {
return useSessionStorage("isSidebarOpen", true)
}
5 changes: 5 additions & 0 deletions src/common/state/useSidebarOpen.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { useSessionStorage } from "usehooks-ts"

export default function useSidebarOpen() {
return useSessionStorage("isSidebarOpen", true)
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
import Swagger from "./Swagger"
"use client"

import Redocly from "./Redocly"
import Swagger from "./Swagger"
import DocumentationVisualizer from "@/features/settings/domain/DocumentationVisualizer"
import useDocumentationVisualizer from "@/features/settings/data/useDocumentationVisualizer"

const DocumentationViewer = ({ url }: { url: string }) => {
const [documentationVisualizer] = useDocumentationVisualizer()
switch (documentationVisualizer) {
case DocumentationVisualizer.SWAGGER:
return <Swagger url={url} />
const DocumentationViewer = ({
visualizer,
url
}: {
visualizer: DocumentationVisualizer,
url: string
}) => {
switch (visualizer) {
case DocumentationVisualizer.REDOCLY:
return <Redocly url={url} />
case DocumentationVisualizer.SWAGGER:
return <Swagger url={url} />
}
}

Expand Down
32 changes: 32 additions & 0 deletions src/features/docs/view/LoadingWrapper.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import { ReactNode } from "react"
import { Box } from "@mui/material"
import LoadingIndicator from "@/common/loading/LoadingIndicator"

const LoadingWrapper = ({
showLoadingIndicator,
children
}: {
showLoadingIndicator: boolean,
children: ReactNode
}) => {
return (
<Box sx={{ width: "100%", height: "100%", position: "relative", overflow: "scroll" }}>
{showLoadingIndicator &&
<Box sx={{ width: "100%", height: "100%", position: "absolute" }}>
<LoadingIndicator/>
</Box>
}
<Box sx={{
width: "100%",
height: "100%",
position: "absolute",
background: "white",
opacity: showLoadingIndicator ? 0 : 1
}}>
{children}
</Box>
</Box>
)
}

export default LoadingWrapper
18 changes: 18 additions & 0 deletions src/features/docs/view/Redocly.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { useState } from "react"
import { RedocStandalone } from "redoc"
import LoadingWrapper from "./LoadingWrapper"

const Redocly = ({ url }: { url: string }) => {
const [isLoading, setLoading] = useState(true)
return (
<LoadingWrapper showLoadingIndicator={isLoading}>
<RedocStandalone
specUrl={url}
options={{ hideLoading: true }}
onLoaded={() => setLoading(false)}
/>
</LoadingWrapper>
)
}

export default Redocly
15 changes: 15 additions & 0 deletions src/features/docs/view/Swagger.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { useState } from "react"
import SwaggerUI from "swagger-ui-react"
import "swagger-ui-react/swagger-ui.css"
import LoadingWrapper from "./LoadingWrapper"

const Swagger = ({ url }: { url: string }) => {
const [isLoading, setLoading] = useState(true)
return (
<LoadingWrapper showLoadingIndicator={isLoading}>
<SwaggerUI url={url} onComplete={() => setLoading(false)} />
</LoadingWrapper>
)
}

export default Swagger
30 changes: 0 additions & 30 deletions src/features/projects/view/DelayedLoading.tsx

This file was deleted.

16 changes: 16 additions & 0 deletions src/features/projects/view/Documentation.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import DocumentationViewer from "@/features/docs/view/DocumentationViewer"
import DocumentationIframe from "./DocumentationIframe"
import DocumentationVisualizer from "@/features/settings/domain/DocumentationVisualizer"
import useDocumentationVisualizer from "@/features/settings/data/useDocumentationVisualizer"

const Documentation = ({ url }: { url: string }) => {
const [visualizer] = useDocumentationVisualizer()
switch (visualizer) {
case DocumentationVisualizer.REDOCLY:
return <DocumentationIframe visualizer={visualizer} url={url} />
case DocumentationVisualizer.SWAGGER:
return <DocumentationViewer visualizer={visualizer} url={url} />
}
}

export default Documentation
28 changes: 28 additions & 0 deletions src/features/projects/view/DocumentationIframe.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { Box } from "@mui/material"
import DelayedLoadingIndicator from "@/common/loading/DelayedLoadingIndicator"
import DocumentationVisualizer from "@/features/settings/domain/DocumentationVisualizer"

const DocumentationIframe = ({
visualizer,
url
}: {
visualizer: DocumentationVisualizer,
url: string
}) => {
const searchParams = new URLSearchParams()
searchParams.append("visualizer", visualizer.toString())
searchParams.append("url", url)
return (
<Box sx={{ width: "100%", height: "100%", position: "relative" }}>
<Box sx={{ width: "100%", height: "100%", position: "absolute" }}>
<DelayedLoadingIndicator/>
</Box>
<iframe
src={`/documentation-viewer?${searchParams.toString()}`}
style={{ width: "100%", height: "100%", position: "absolute" }}
/>
</Box>
)
}

export default DocumentationIframe
8 changes: 4 additions & 4 deletions src/features/projects/view/MainContent.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import Project from "../domain/Project"
import Version from "../domain/Version"
import OpenApiSpecification from "../domain/OpenApiSpecification"
import DelayedLoading from "./DelayedLoading"
import DelayedLoadingIndicator from "@/common/loading/DelayedLoadingIndicator"
import ErrorMessage from "./ErrorMessage"
import DocumentationViewer from "./docs/DocumentationViewer"
import Documentation from "./Documentation"

const MainContent = ({
isLoading,
Expand All @@ -19,9 +19,9 @@ const MainContent = ({
specification?: OpenApiSpecification
}) => {
if (project && version && specification) {
return <DocumentationViewer url={specification.url}/>
return <Documentation url={specification.url}/>
} else if (isLoading) {
return <DelayedLoading/>
return <DelayedLoadingIndicator/>
} else if (error) {
return <ErrorMessage text={error.message}/>
} else if (!project) {
Expand Down
28 changes: 17 additions & 11 deletions src/features/projects/view/client/ProjectsPage.tsx
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
"use client"

import { useState, useEffect } from "react"
import { useEffect } from "react"
import { useRouter } from "next/navigation"
import { useTheme } from "@mui/material/styles"
import useMediaQuery from "@mui/material/useMediaQuery"
import SidebarContainer from "@/features/sidebar/view/client/SidebarContainer"
import Project from "../../domain/Project"
import ProjectList from "../ProjectList"
import MainContent from "../MainContent"
import MobileToolbar from "../MobileToolbar"
import TrailingToolbarItem from "../TrailingToolbarItem"
import MobileToolbar from "../toolbar/MobileToolbar"
import TrailingToolbarItem from "../toolbar/TrailingToolbarItem"
import getSelection from "../../domain/getSelection"
import projectNavigator from "../../domain/projectNavigator"
import updateWindowTitle from "../../domain/updateWindowTitle"
import useProjects from "../../data/useProjects"
import useSidebarOpen from "@/common/state/useSidebarOpen"

export default function ProjectsPage({
projects: serverProjects,
Expand All @@ -28,9 +29,9 @@ export default function ProjectsPage({
}) {
const router = useRouter()
const theme = useTheme()
const [isSidebarOpen, setSidebarOpen] = useSidebarOpen()
const isDesktopLayout = useMediaQuery(theme.breakpoints.up("sm"))
const { projects: clientProjects, error, isLoading: isClientLoading } = useProjects()
const [forceCloseSidebar, setForceCloseSidebar] = useState(false)
const projects = isClientLoading ? (serverProjects || []) : clientProjects
const { project, version, specification } = getSelection({
projects,
Expand All @@ -57,8 +58,16 @@ export default function ProjectsPage({
}
projectNavigator.navigateIfNeeded(router, urlSelection, selection)
}, [router, projectId, versionId, specificationId, project, version, specification])
useEffect(() => {
// Show the sidebar if no project is selected.
if (projectId === undefined) {
setSidebarOpen(true)
}
}, [projectId, setSidebarOpen])
const selectProject = (project: Project) => {
setForceCloseSidebar(!isDesktopLayout)
if (!isDesktopLayout) {
setSidebarOpen(false)
}
const version = project.versions[0]
const specification = version.specifications[0]
projectNavigator.navigate(router, project.id, version.id, specification.id)
Expand All @@ -71,12 +80,9 @@ export default function ProjectsPage({
}
return (
<SidebarContainer
canCloseDrawer={
project !== undefined &&
version !== undefined &&
specification !== undefined
}
forceClose={forceCloseSidebar}
isCloseSidebarEnabled={projectId !== undefined}
isSidebarOpen={isSidebarOpen}
onToggleSidebarOpen={setSidebarOpen}
sidebar={
<ProjectList
isLoading={serverProjects === undefined && isClientLoading}
Expand Down
7 changes: 0 additions & 7 deletions src/features/projects/view/docs/Redocly.tsx

This file was deleted.

8 changes: 0 additions & 8 deletions src/features/projects/view/docs/Swagger.tsx

This file was deleted.

Loading