Skip to content

Commit

Permalink
chore(next-release/main) - merge from main (#6940)
Browse files Browse the repository at this point in the history
* Minor edits to Vite + React quickstart (#6926)

* Updates to Vite + React quickstart

* Update src/fragments/gen2/quickstart/build-a-backend.mdx

Co-authored-by: Kevin Old <kevold@amazon.com>

* Update build-a-backend.mdx

* Update build-a-backend.mdx

* Update build-a-backend.mdx

---------

Co-authored-by: Kevin Old <kevold@amazon.com>

* fix: Fix incorrect auth import path in migration guide. (#6934)

* fix: Update incorrect `updateMFAPreference` parameter in JS v6 migration guide. (#6935)

* Amplify Android Release 2.14.11 (#6933)

* chore: refactor .layout-header into separate component (#6826)

* platform typed as optional

* refactor init

* remove commented code

* remove angry useEffect

* fix typing

* added layoutcontext so mobile menu closes on navigation

* move import

---------

Co-authored-by: katiegoines <katiegoines@gmail.com>

---------

Co-authored-by: Jim Eagan <84857865+hibler13@users.noreply.github.com>
Co-authored-by: Kevin Old <kevold@amazon.com>
Co-authored-by: Jim Blanchard <jim.l.blanchard@gmail.com>
Co-authored-by: Ankit Shah <22114629+ankpshah@users.noreply.github.com>
Co-authored-by: Katie Goines <30757403+katiegoines@users.noreply.github.com>
Co-authored-by: katiegoines <katiegoines@gmail.com>
  • Loading branch information
7 people committed Feb 21, 2024
1 parent 81dff0e commit 5af989d
Show file tree
Hide file tree
Showing 8 changed files with 200 additions and 152 deletions.
7 changes: 4 additions & 3 deletions src/components/Breadcrumbs/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ type BreadcrumbItem = {

type Props = {
route: string;
platform: string;
platform?: string;
};

const overrides = {
Expand All @@ -39,7 +39,7 @@ const overrides = {

function generateBreadcrumbs(
route: string,
platform: string
platform?: string
): BreadcrumbItem[] {
const breadcrumbs: BreadcrumbItem[] = [];

Expand All @@ -58,9 +58,10 @@ function generateBreadcrumbs(
href['query'] = { platform };
}
let label = directoryEntry ? directoryEntry.title : url;

const override = overrides[url]
? overrides[url]
: overrides[url.replace('[platform]', platform)];
: overrides[url.replace('[platform]', platform!)];

if (override) {
label = override;
Expand Down
138 changes: 12 additions & 126 deletions src/components/Layout/Layout.tsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,14 @@
import { useState, useEffect, useRef, ReactElement } from 'react';
import { useState, useEffect, ReactElement } from 'react';
import Head from 'next/head';
import { useRouter } from 'next/router';
import {
Button,
ColorMode,
Flex,
Heading,
IconsProvider,
ThemeProvider,
View,
VisuallyHidden
View
} from '@aws-amplify/ui-react';
import classNames from 'classnames';
import { defaultIcons } from '@/themes/defaultIcons';
import { defaultTheme } from '@/themes/defaultTheme';
import { gen2Theme } from '@/themes/gen2Theme';
Expand All @@ -23,28 +20,15 @@ import {
PLATFORM_DISPLAY_NAMES,
Platform
} from '@/data/platforms';
import {
ALGOLIA_API_KEY,
ALGOLIA_INDEX_NAME,
ALGOLIA_APP_ID
} from '../../constants/algolia';
import { GEN2BANNER_URLS } from '@/data/gen2Banner-urls';
import { SpaceShip } from '@/components/SpaceShip';
import { IconMenu, IconDoubleChevron } from '@/components/Icons';
import { LEFT_NAV_LINKS, RIGHT_NAV_LINKS } from '@/utils/globalnav';
import { Menu } from '@/components/Menu';
import { LayoutProvider } from '@/components/Layout';
import { LayoutProvider, LayoutHeader } from '@/components/Layout';
import { TableOfContents } from '@/components/TableOfContents';
import type { HeadingInterface } from '@/components/TableOfContents/TableOfContents';
import { PlatformNavigator } from '@/components/PlatformNavigator';
import flatDirectory from '@/directory/flatDirectory.json';
import { Breadcrumbs } from '@/components/Breadcrumbs';
import { debounce } from '@/utils/debounce';
import { DocSearch } from '@docsearch/react';
import '@docsearch/css';
import { PageLastUpdated } from '../PageLastUpdated';
import Feedback from '../Feedback';
import RepoActions from '../Menu/RepoActions';
import { Banner } from '@/components/Banner';
import { usePathWithoutHash } from '@/utils/usePathWithoutHash';
import {
Expand Down Expand Up @@ -78,8 +62,6 @@ export const Layout = ({
const [menuOpen, toggleMenuOpen] = useState(false);
const [colorMode, setColorMode] = useState<ColorMode>('system');
const [tocHeadings, setTocHeadings] = useState<HeadingInterface[]>([]);
const menuButtonRef = useRef<HTMLButtonElement>(null);
const sidebarMenuButtonRef = useRef<HTMLButtonElement>(null);
const mainId = 'pageMain';
const showTOC = hasTOC && tocHeadings.length > 0;
const router = useRouter();
Expand All @@ -92,7 +74,6 @@ export const Layout = ({
let currentPlatform = isGen2 ? undefined : DEFAULT_PLATFORM;
const isContributor = asPathWithNoHash.split('/')[1] === 'contribute';
const currentGlobalNavMenuItem = isContributor ? 'Contribute' : 'Docs';
const isPrev = asPathWithNoHash.split('/')[2] === 'prev';

const handleColorModeChange = (mode: ColorMode) => {
setColorMode(mode);
Expand Down Expand Up @@ -125,8 +106,8 @@ export const Layout = ({
currentPlatform = platform
? platform
: PLATFORMS.includes(asPathPlatform)
? asPathPlatform
: DEFAULT_PLATFORM;
? asPathPlatform
: DEFAULT_PLATFORM;
}

const title = [
Expand All @@ -139,18 +120,6 @@ export const Layout = ({

const description = `${pageDescription} AWS Amplify Documentation`;

const handleMenuToggle = () => {
if (!menuOpen) {
toggleMenuOpen(true);
// For keyboard navigators, move focus to the close menu button in the nav
setTimeout(() => sidebarMenuButtonRef?.current?.focus(), 0);
} else {
toggleMenuOpen(false);
// For keyboard navigators, move focus back to menu button in header
menuButtonRef?.current?.focus();
}
};

const handleScroll = debounce((e) => {
const bodyScroll = e.target.documentElement.scrollTop;
if (bodyScroll > 20) {
Expand Down Expand Up @@ -258,96 +227,13 @@ export const Layout = ({
isGen2={isGen2}
mainId={mainId}
/>
<View as="header" className="layout-header">
<Flex className={`layout-search layout-search--${pageType}`}>
<Button
onClick={() => handleMenuToggle()}
size="small"
ref={menuButtonRef}
className="search-menu-toggle mobile-toggle"
>
<IconMenu aria-hidden="true" />
Menu
</Button>

<View
className={classNames(
'layout-search__search',
`layout-search__search--${pageType}`,
{ 'layout-search__search--toc': showTOC }
)}
>
<View className="layout-search__search__container">
<DocSearch
appId={process.env.ALGOLIA_APP_ID || ALGOLIA_APP_ID}
indexName={
process.env.ALGOLIA_INDEX_NAME || ALGOLIA_INDEX_NAME
}
apiKey={process.env.ALGOLIA_API_KEY || ALGOLIA_API_KEY}
searchParameters={{
facetFilters: [
`platform:${isGen2 ? 'gen2' : currentPlatform}`
]
}}
/>
</View>
</View>
</Flex>
<View
className={classNames('layout-sidebar', {
'layout-sidebar--expanded': menuOpen
})}
>
<View
className={classNames('layout-sidebar__backdrop', {
'layout-sidebar__backdrop--expanded': menuOpen
})}
onClick={() => toggleMenuOpen(false)}
></View>
<View
className={classNames('layout-sidebar__inner', {
'layout-sidebar__inner--expanded': menuOpen
})}
>
<Button
size="small"
colorTheme="overlay"
className={classNames('layout-sidebar__mobile-toggle', {
'layout-sidebar__mobile-toggle--open': menuOpen
})}
ref={sidebarMenuButtonRef}
onClick={() => handleMenuToggle()}
>
<IconDoubleChevron />
<VisuallyHidden>Close menu</VisuallyHidden>
</Button>
{isGen2 ? null : (
<div className="layout-sidebar-platform">
<PlatformNavigator
currentPlatform={currentPlatform}
isPrev={isPrev}
/>
</div>
)}

<div className="layout-sidebar-menu">
<Menu
currentPlatform={currentPlatform}
path={asPathWithNoHash}
/>
<div className="layout-sidebar-feedback">
<RepoActions router={router}></RepoActions>
<Feedback router={router}></Feedback>
</div>
{showLastUpdatedDate && (
<PageLastUpdated
directoryData={flatDirectory[router.pathname]}
/>
)}
</div>
</View>
</View>
</View>
<LayoutHeader
hasTOC={hasTOC}
tocHeadings={tocHeadings}
pageType={pageType}
platform={platform}
showLastUpdatedDate={showLastUpdatedDate}
></LayoutHeader>
<View key={asPathWithNoHash} className="layout-main">
<Flex
id={mainId}
Expand Down
157 changes: 157 additions & 0 deletions src/components/Layout/LayoutHeader.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
import { useContext, useRef } from 'react';
import { useRouter } from 'next/router';
import { Button, Flex, View, VisuallyHidden } from '@aws-amplify/ui-react';
import classNames from 'classnames';
import { DEFAULT_PLATFORM, PLATFORMS, Platform } from '@/data/platforms';
import {
ALGOLIA_API_KEY,
ALGOLIA_INDEX_NAME,
ALGOLIA_APP_ID
} from '../../constants/algolia';
import { IconMenu, IconDoubleChevron } from '@/components/Icons';
import { Menu } from '@/components/Menu';
import { LayoutContext } from '@/components/Layout';
import type { HeadingInterface } from '@/components/TableOfContents/TableOfContents';
import { PlatformNavigator } from '@/components/PlatformNavigator';
import flatDirectory from 'src/directory/flatDirectory.json';
import { DocSearch } from '@docsearch/react';
import '@docsearch/css';
import { PageLastUpdated } from '../PageLastUpdated';
import Feedback from '../Feedback';
import RepoActions from '../Menu/RepoActions';
import { usePathWithoutHash } from '@/utils/usePathWithoutHash';

export const LayoutHeader = ({
hasTOC = true,
tocHeadings,
pageType = 'inner',
platform,
showLastUpdatedDate = true
}: {
hasTOC?: boolean;
tocHeadings: HeadingInterface[];
pageType?: 'home' | 'inner';
platform?: Platform;
showLastUpdatedDate: boolean;
}) => {
const { menuOpen, toggleMenuOpen } = useContext(LayoutContext);
const menuButtonRef = useRef<HTMLButtonElement>(null);
const sidebarMenuButtonRef = useRef<HTMLButtonElement>(null);
const showTOC = hasTOC && tocHeadings.length > 0;
const router = useRouter();
const asPathWithNoHash = usePathWithoutHash();
const isGen2 = asPathWithNoHash.split('/')[1] === 'gen2';
let currentPlatform = isGen2 ? undefined : DEFAULT_PLATFORM;
const isPrev = asPathWithNoHash.split('/')[2] === 'prev';

if (!isGen2) {
// [platform] will always be the very first subpath right?
// when using `router.asPath` it returns a string that starts with a '/'
// To get the "platform" the client was trying to visit, we have to get the string at index 1
// Doing this because when visiting a 404 page, there is no `router.query.platform`, so we have
// to check where the user was trying to visit from
const asPathPlatform = asPathWithNoHash.split('/')[1] as Platform;

currentPlatform = platform
? platform
: PLATFORMS.includes(asPathPlatform)
? asPathPlatform
: DEFAULT_PLATFORM;
}

const handleMenuToggle = () => {
if (!menuOpen) {
toggleMenuOpen(true);
// For keyboard navigators, move focus to the close menu button in the nav
setTimeout(() => sidebarMenuButtonRef?.current?.focus(), 0);
} else {
toggleMenuOpen(false);
// For keyboard navigators, move focus back to menu button in header
menuButtonRef?.current?.focus();
}
};

return (
<View as="header" className="layout-header">
<Flex className={`layout-search layout-search--${pageType}`}>
<Button
onClick={() => handleMenuToggle()}
size="small"
ref={menuButtonRef}
className="search-menu-toggle mobile-toggle"
>
<IconMenu aria-hidden="true" />
Menu
</Button>

<View
className={classNames(
'layout-search__search',
`layout-search__search--${pageType}`,
{ 'layout-search__search--toc': showTOC }
)}
>
<View className="layout-search__search__container">
<DocSearch
appId={process.env.ALGOLIA_APP_ID || ALGOLIA_APP_ID}
indexName={process.env.ALGOLIA_INDEX_NAME || ALGOLIA_INDEX_NAME}
apiKey={process.env.ALGOLIA_API_KEY || ALGOLIA_API_KEY}
searchParameters={{
facetFilters: [`platform:${isGen2 ? 'gen2' : currentPlatform}`]
}}
/>
</View>
</View>
</Flex>
<View
className={classNames('layout-sidebar', {
'layout-sidebar--expanded': menuOpen
})}
>
<View
className={classNames('layout-sidebar__backdrop', {
'layout-sidebar__backdrop--expanded': menuOpen
})}
onClick={() => toggleMenuOpen(false)}
></View>
<View
className={classNames('layout-sidebar__inner', {
'layout-sidebar__inner--expanded': menuOpen
})}
>
<Button
size="small"
colorTheme="overlay"
className={classNames('layout-sidebar__mobile-toggle', {
'layout-sidebar__mobile-toggle--open': menuOpen
})}
ref={sidebarMenuButtonRef}
onClick={() => handleMenuToggle()}
>
<IconDoubleChevron />
<VisuallyHidden>Close menu</VisuallyHidden>
</Button>
{isGen2 ? null : (
<div className="layout-sidebar-platform">
<PlatformNavigator
currentPlatform={currentPlatform}
isPrev={isPrev}
/>
</div>
)}

<div className="layout-sidebar-menu">
<Menu currentPlatform={currentPlatform} path={asPathWithNoHash} />
<div className="layout-sidebar-feedback">
<RepoActions router={router}></RepoActions>
<Feedback router={router}></Feedback>
</div>
{showLastUpdatedDate && (
<PageLastUpdated directoryData={flatDirectory[router.pathname]} />
)}
</div>
</View>
</View>
</View>
);
};
1 change: 1 addition & 0 deletions src/components/Layout/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export { Layout } from './Layout';
export { LayoutHeader } from './LayoutHeader';
export { LayoutContext, LayoutProvider } from './LayoutProvider';
2 changes: 1 addition & 1 deletion src/constants/versions.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
export const versions = {
ANDROID_VERSION: '2.14.10',
ANDROID_VERSION: '2.14.11',
ANDROID_DEVPREVIEW: '1.36.5-dev-preview.0',
ANDROID_V1_VERSION: '1.38.8',
ANDROID_V1_GEO_VERSION: '1.0.1',
Expand Down
Loading

0 comments on commit 5af989d

Please sign in to comment.