Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
37 changes: 37 additions & 0 deletions src/app/(main)/AndroidUpgradeNotification.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
'use client';

import { useState } from 'react';
import Flex from '../../components/Flex';

export default function AndroidUpgradeNotification() {
const androidUpgradeNotificationDismissed = localStorage.getItem(
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is this synchronous and okay to use in the render function? if so, just pass !androidUpgradeNotificationDismissed into the useState default and you can drop the useEffect below :)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this may break because of SSR. if so you can make this component imported dynamically so it only renders on the client

import dynamic from 'next/dynamic'
 
const DynamicHeader = dynamic(() => import('../components/header'), {
  ssr: false,
})

'relistenAndroidNotificationDismissed'
);
const [alertVisible, setAlertVisible] = useState(!androidUpgradeNotificationDismissed);

const dismissAlert = () => {
localStorage.setItem('relistenAndroidNotificationDismissed', 'true');
setAlertVisible(false);
};

return alertVisible ? (
<Flex column className="border-b-[1px] border-b-[#aeaeae]">
<section className="relative my-2 flex flex-col justify-center">
<div className="text-center">RELISTEN is now available on the Play Store!</div>
<div className="text-center">
Check it out{' '}
<a
href="https://play.google.com/store/apps/details?id=net.relisten.android&hl=en_US"
className="text-blue-500"
>
here
</a>
.
</div>
<button className="absolute right-2 top-2 text-lg font-bold" onClick={dismissAlert}>
X
</button>
</section>
</Flex>
) : null;
}
91 changes: 49 additions & 42 deletions src/app/(main)/NavBar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,13 @@ import Player from '../../components/Player';
import { SimplePopover } from '../../components/Popover';
import { fetchArtists } from '../queries';
import MainNavHeader from './MainNavHeader';
import { getUserAgent } from './layout';
import AndroidUpgradeNotification from './AndroidUpgradeNotification';

export default async function NavBar() {
const artists = await fetchArtists();
const userAgent = await getUserAgent();
const isAndroid = /android/i.test(userAgent?.ua || '');

const artistSlugsToName = artists.reduce(
(memo, next) => {
Expand All @@ -19,50 +23,53 @@ export default async function NavBar() {
);

return (
<div className="navigation relative flex h-[50px] max-h-[50px] min-h-[50px] grid-cols-3 justify-between border-b-[1px] border-b-[#aeaeae] bg-white text-[#333333] lg:grid">
<MainNavHeader artistSlugsToName={artistSlugsToName} />
<div className="player min-w-[60%] flex-1 text-center lg:min-w-[44vw] xl:min-w-[38vw]">
<Player artistSlugsToName={artistSlugsToName} />
</div>
<SimplePopover content={<Menu />}>
<Flex className="flex-2 h-full cursor-pointer content-end items-center text-center font-medium 2xl:hidden">
<div className="ml-auto flex h-full items-center px-1 active:relative active:top-[1px] active:text-[#333333]">
<i className="fa fa-bars text-inherit" />
</div>
</Flex>
</SimplePopover>
<div className="nav hidden h-full flex-[2] cursor-pointer items-center justify-end text-center font-medium 2xl:flex">
<div className="h-full px-1">
<Link href="/today" legacyBehavior prefetch={false}>
<a className="nav-btn">TIH</a>
</Link>
</div>
<div>
<Link href="/recently-played" legacyBehavior prefetch={false}>
<a className="nav-btn whitespace-nowrap">LIVE</a>
</Link>
</div>
<div>
<Link href="/chat" legacyBehavior prefetch={false}>
<a className="nav-btn">CHAT</a>
</Link>
</div>
<div>
<Link href="/ios" legacyBehavior prefetch={false}>
<a className="nav-btn">iOS</a>
</Link>
</div>
<div>
<Link href="/sonos" legacyBehavior prefetch={false}>
<a className="nav-btn">SONOS</a>
</Link>
<>
<div className="navigation relative flex h-[50px] max-h-[50px] min-h-[50px] grid-cols-3 justify-between border-b-[1px] border-b-[#aeaeae] bg-white text-[#333333] lg:grid">
<MainNavHeader artistSlugsToName={artistSlugsToName} />
<div className="player min-w-[60%] flex-1 text-center lg:min-w-[44vw] xl:min-w-[38vw]">
<Player artistSlugsToName={artistSlugsToName} />
</div>
<div>
<Link href="/about" legacyBehavior prefetch={false}>
<a className="nav-btn">ABOUT</a>
</Link>
<SimplePopover content={<Menu />}>
<Flex className="flex-2 h-full cursor-pointer content-end items-center text-center font-medium 2xl:hidden">
<div className="ml-auto flex h-full items-center px-1 active:relative active:top-[1px] active:text-[#333333]">
<i className="fa fa-bars text-inherit" />
</div>
</Flex>
</SimplePopover>
<div className="nav hidden h-full flex-[2] cursor-pointer items-center justify-end text-center font-medium 2xl:flex">
<div className="h-full px-1">
<Link href="/today" legacyBehavior prefetch={false}>
<a className="nav-btn">TIH</a>
</Link>
</div>
<div>
<Link href="/recently-played" legacyBehavior prefetch={false}>
<a className="nav-btn whitespace-nowrap">LIVE</a>
</Link>
</div>
<div>
<Link href="/chat" legacyBehavior prefetch={false}>
<a className="nav-btn">CHAT</a>
</Link>
</div>
<div>
<Link href="/ios" legacyBehavior prefetch={false}>
<a className="nav-btn">iOS</a>
</Link>
</div>
<div>
<Link href="/sonos" legacyBehavior prefetch={false}>
<a className="nav-btn">SONOS</a>
</Link>
</div>
<div>
<Link href="/about" legacyBehavior prefetch={false}>
<a className="nav-btn">ABOUT</a>
</Link>
</div>
</div>
</div>
</div>
{isAndroid && <AndroidUpgradeNotification />}
</>
);
}
13 changes: 12 additions & 1 deletion src/app/(main)/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,19 @@
import { PropsWithChildren } from 'react';
import parser from 'ua-parser-js';
import NavBar from './NavBar';
import Flex from '../../components/Flex';
import { headers } from 'next/headers';

export default function Layout({ children }: PropsWithChildren) {
export const getUserAgent = async () => {
const headersList = await headers();
const userAgent = headersList.get('user-agent');

if (!userAgent) return null;

return parser(userAgent);
};

export default async function Layout({ children }: PropsWithChildren) {
return (
<Flex column className="h-screen">
<NavBar />
Expand Down