refactor: use class helper instead of component to handle responsiveness
This commit is contained in:
@@ -4,12 +4,12 @@ import { Kitty } from "../Kitty";
|
|||||||
import { SpotifyPlayer } from "./SpotifyPlayer";
|
import { SpotifyPlayer } from "./SpotifyPlayer";
|
||||||
import { Cava } from "./Cava";
|
import { Cava } from "./Cava";
|
||||||
import { useApp } from "~/hooks/useApp";
|
import { useApp } from "~/hooks/useApp";
|
||||||
import { Responsive } from "../Responsive";
|
import { cn, hideIf } from "~/utils/react";
|
||||||
|
|
||||||
const song = "/audio/asinine-vivement-quoi.mp3";
|
const song = "/audio/asinine-vivement-quoi.mp3";
|
||||||
|
|
||||||
export const Music = () => {
|
export const Music = () => {
|
||||||
const { volume } = useApp();
|
const { volume, screenWidth } = useApp();
|
||||||
|
|
||||||
const audio = useRef<HTMLAudioElement>(null);
|
const audio = useRef<HTMLAudioElement>(null);
|
||||||
|
|
||||||
@@ -55,7 +55,13 @@ export const Music = () => {
|
|||||||
<audio ref={audio} src={song} onTimeUpdate={handleTimeUpdate} loop />
|
<audio ref={audio} src={song} onTimeUpdate={handleTimeUpdate} loop />
|
||||||
{audio.current && metadata ? (
|
{audio.current && metadata ? (
|
||||||
<>
|
<>
|
||||||
<Kitty className="h-full w-1/2 pb-2 pl-2 pr-1 pt-1" rows={5}>
|
<Kitty
|
||||||
|
className={cn(
|
||||||
|
"h-full pb-2 pl-2 pr-1 pt-1",
|
||||||
|
screenWidth < 900 ? "w-full" : "w-1/2",
|
||||||
|
)}
|
||||||
|
rows={5}
|
||||||
|
>
|
||||||
<SpotifyPlayer
|
<SpotifyPlayer
|
||||||
title={metadata.common.title ?? "Unknown"}
|
title={metadata.common.title ?? "Unknown"}
|
||||||
artist={metadata.common.artist ?? "Unknown"}
|
artist={metadata.common.artist ?? "Unknown"}
|
||||||
@@ -66,7 +72,13 @@ export const Music = () => {
|
|||||||
/>
|
/>
|
||||||
</Kitty>
|
</Kitty>
|
||||||
|
|
||||||
<Kitty className="h-full w-1/2 pb-2 pl-1 pr-2 pt-1" rows={5}>
|
<Kitty
|
||||||
|
className={cn(
|
||||||
|
"h-full w-1/2 pb-2 pl-1 pr-2 pt-1",
|
||||||
|
hideIf(screenWidth < 900),
|
||||||
|
)}
|
||||||
|
rows={5}
|
||||||
|
>
|
||||||
<Cava audio={audio} />
|
<Cava audio={audio} />
|
||||||
</Kitty>
|
</Kitty>
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
import { useState, type ReactNode, useEffect } from "react";
|
|
||||||
import { cn } from "~/utils/react";
|
|
||||||
|
|
||||||
export const Responsive = (props: {
|
|
||||||
className?: string;
|
|
||||||
minScreenWidth?: number;
|
|
||||||
children: ReactNode;
|
|
||||||
}) => {
|
|
||||||
const [hidden, setHidden] = useState(false);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (!props.minScreenWidth) return;
|
|
||||||
|
|
||||||
const handleResize = () => {
|
|
||||||
setHidden(
|
|
||||||
props.minScreenWidth !== undefined &&
|
|
||||||
window.innerWidth < props.minScreenWidth,
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
window.addEventListener("resize", handleResize);
|
|
||||||
|
|
||||||
handleResize();
|
|
||||||
|
|
||||||
return () => {
|
|
||||||
window.removeEventListener("resize", handleResize);
|
|
||||||
};
|
|
||||||
}, [props.minScreenWidth]);
|
|
||||||
|
|
||||||
return hidden ? null : props.children;
|
|
||||||
};
|
|
||||||
@@ -17,8 +17,12 @@ import { WaybarTrayWidget } from "./Widgets/WaybarTrayWidget";
|
|||||||
import { WaybarToggleThemeWidget } from "./Widgets/WaybarToggleThemeWidget";
|
import { WaybarToggleThemeWidget } from "./Widgets/WaybarToggleThemeWidget";
|
||||||
import { WaybarWeatherWidget } from "./Widgets/WaybarWeatherWidget";
|
import { WaybarWeatherWidget } from "./Widgets/WaybarWeatherWidget";
|
||||||
import { Responsive } from "../Responsive";
|
import { Responsive } from "../Responsive";
|
||||||
|
import { cn, hideIf } from "~/utils/react";
|
||||||
|
import { useApp } from "~/hooks/useApp";
|
||||||
|
|
||||||
export const Waybar = () => {
|
export const Waybar = () => {
|
||||||
|
const { screenWidth } = useApp();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="grid h-[37px] w-full select-none grid-cols-[1fr_max-content_1fr] grid-rows-1 gap-0">
|
<div className="grid h-[37px] w-full select-none grid-cols-[1fr_max-content_1fr] grid-rows-1 gap-0">
|
||||||
<div className="flex items-center gap-3">
|
<div className="flex items-center gap-3">
|
||||||
@@ -26,8 +30,7 @@ export const Waybar = () => {
|
|||||||
<WaybarHomeWidget />
|
<WaybarHomeWidget />
|
||||||
</WaybarWidgetGroup>
|
</WaybarWidgetGroup>
|
||||||
|
|
||||||
<Responsive minScreenWidth={705}>
|
<WaybarWidgetGroup className={cn(hideIf(screenWidth < 705))}>
|
||||||
<WaybarWidgetGroup>
|
|
||||||
<WaybarCPUWidget
|
<WaybarCPUWidget
|
||||||
variation={1}
|
variation={1}
|
||||||
frequency={3250 + randomMinMax(-100, 100)}
|
frequency={3250 + randomMinMax(-100, 100)}
|
||||||
@@ -45,13 +48,10 @@ export const Waybar = () => {
|
|||||||
/>
|
/>
|
||||||
<WaybarDiskWidget current={35.9} variation={4.1} capacity={160.3} />
|
<WaybarDiskWidget current={35.9} variation={4.1} capacity={160.3} />
|
||||||
</WaybarWidgetGroup>
|
</WaybarWidgetGroup>
|
||||||
</Responsive>
|
|
||||||
|
|
||||||
<Responsive minScreenWidth={910}>
|
<WaybarWidgetGroup className={cn(hideIf(screenWidth < 910))}>
|
||||||
<WaybarWidgetGroup>
|
|
||||||
<WaybarTitleWidget />
|
<WaybarTitleWidget />
|
||||||
</WaybarWidgetGroup>
|
</WaybarWidgetGroup>
|
||||||
</Responsive>
|
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center">
|
<div className="flex items-center">
|
||||||
<WaybarWidgetGroup>
|
<WaybarWidgetGroup>
|
||||||
@@ -61,8 +61,7 @@ export const Waybar = () => {
|
|||||||
</WaybarWidgetGroup>
|
</WaybarWidgetGroup>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center justify-end gap-2">
|
<div className="flex items-center justify-end gap-2">
|
||||||
<Responsive minScreenWidth={1320}>
|
<WaybarWidgetGroup className={cn(hideIf(screenWidth < 1320))}>
|
||||||
<WaybarWidgetGroup>
|
|
||||||
<WaybarTemperatureWidget
|
<WaybarTemperatureWidget
|
||||||
min={50}
|
min={50}
|
||||||
max={70}
|
max={70}
|
||||||
@@ -72,23 +71,18 @@ export const Waybar = () => {
|
|||||||
|
|
||||||
<WaybarBatteryWidget frequency={7000 + randomMinMax(-100, 100)} />
|
<WaybarBatteryWidget frequency={7000 + randomMinMax(-100, 100)} />
|
||||||
</WaybarWidgetGroup>
|
</WaybarWidgetGroup>
|
||||||
</Responsive>
|
|
||||||
|
|
||||||
<Responsive minScreenWidth={970}>
|
<WaybarWidgetGroup className={cn(hideIf(screenWidth < 970))}>
|
||||||
<WaybarWidgetGroup>
|
|
||||||
<WaybarBrightnessWidget />
|
<WaybarBrightnessWidget />
|
||||||
<WaybarVolumeWidget />
|
<WaybarVolumeWidget />
|
||||||
<WaybarMicrophoneWidget />
|
<WaybarMicrophoneWidget />
|
||||||
</WaybarWidgetGroup>
|
</WaybarWidgetGroup>
|
||||||
</Responsive>
|
|
||||||
|
|
||||||
<Responsive minScreenWidth={475}>
|
<WaybarWidgetGroup className={cn(hideIf(screenWidth < 475))}>
|
||||||
<WaybarWidgetGroup>
|
|
||||||
<WaybarTrayWidget />
|
<WaybarTrayWidget />
|
||||||
<WaybarWeatherWidget />
|
<WaybarWeatherWidget />
|
||||||
<WaybarToggleThemeWidget />
|
<WaybarToggleThemeWidget />
|
||||||
</WaybarWidgetGroup>
|
</WaybarWidgetGroup>
|
||||||
</Responsive>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ export const AppContext = createContext<
|
|||||||
| Prettify<
|
| Prettify<
|
||||||
State<"activeKitty", string> &
|
State<"activeKitty", string> &
|
||||||
State<"brightness", number> &
|
State<"brightness", number> &
|
||||||
State<"volume", number>
|
State<"volume", number> & { screenWidth: number }
|
||||||
>
|
>
|
||||||
| undefined
|
| undefined
|
||||||
>(undefined);
|
>(undefined);
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { type ReactNode, useState } from "react";
|
import { type ReactNode, useState, useEffect } from "react";
|
||||||
import { AppContext } from "~/context/AppContext";
|
import { AppContext } from "~/context/AppContext";
|
||||||
|
|
||||||
export const AppProvider = (props: { children?: ReactNode }) => {
|
export const AppProvider = (props: { children?: ReactNode }) => {
|
||||||
@@ -6,6 +6,18 @@ export const AppProvider = (props: { children?: ReactNode }) => {
|
|||||||
const [brightness, setBrightness] = useState(100);
|
const [brightness, setBrightness] = useState(100);
|
||||||
const [volume, setVolume] = useState(100);
|
const [volume, setVolume] = useState(100);
|
||||||
|
|
||||||
|
const [screenWidth, setScreenWidth] = useState(window.innerWidth);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const handleResize = () => {
|
||||||
|
setScreenWidth(window.innerWidth);
|
||||||
|
};
|
||||||
|
|
||||||
|
window.addEventListener("resize", handleResize);
|
||||||
|
|
||||||
|
return () => window.removeEventListener("resize", handleResize);
|
||||||
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<AppContext.Provider
|
<AppContext.Provider
|
||||||
value={{
|
value={{
|
||||||
@@ -15,6 +27,7 @@ export const AppProvider = (props: { children?: ReactNode }) => {
|
|||||||
setBrightness,
|
setBrightness,
|
||||||
volume,
|
volume,
|
||||||
setVolume,
|
setVolume,
|
||||||
|
screenWidth,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{props.children}
|
{props.children}
|
||||||
|
|||||||
@@ -2,3 +2,5 @@ import { type ClassNameValue, twMerge } from "tailwind-merge";
|
|||||||
import { clsx } from "clsx";
|
import { clsx } from "clsx";
|
||||||
|
|
||||||
export const cn = (...classes: Array<ClassNameValue>) => twMerge(clsx(classes));
|
export const cn = (...classes: Array<ClassNameValue>) => twMerge(clsx(classes));
|
||||||
|
|
||||||
|
export const hideIf = (condition: boolean) => (condition ? "hidden" : "");
|
||||||
|
|||||||
Reference in New Issue
Block a user