refactor: use class helper instead of component to handle responsiveness

This commit is contained in:
Pihkaal
2024-08-22 18:18:21 +02:00
parent 03d90db620
commit dd6c5faa5a
6 changed files with 77 additions and 87 deletions

View File

@@ -4,12 +4,12 @@ import { Kitty } from "../Kitty";
import { SpotifyPlayer } from "./SpotifyPlayer";
import { Cava } from "./Cava";
import { useApp } from "~/hooks/useApp";
import { Responsive } from "../Responsive";
import { cn, hideIf } from "~/utils/react";
const song = "/audio/asinine-vivement-quoi.mp3";
export const Music = () => {
const { volume } = useApp();
const { volume, screenWidth } = useApp();
const audio = useRef<HTMLAudioElement>(null);
@@ -55,7 +55,13 @@ export const Music = () => {
<audio ref={audio} src={song} onTimeUpdate={handleTimeUpdate} loop />
{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
title={metadata.common.title ?? "Unknown"}
artist={metadata.common.artist ?? "Unknown"}
@@ -66,7 +72,13 @@ export const Music = () => {
/>
</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} />
</Kitty>
</>

View File

@@ -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;
};

View File

@@ -17,8 +17,12 @@ import { WaybarTrayWidget } from "./Widgets/WaybarTrayWidget";
import { WaybarToggleThemeWidget } from "./Widgets/WaybarToggleThemeWidget";
import { WaybarWeatherWidget } from "./Widgets/WaybarWeatherWidget";
import { Responsive } from "../Responsive";
import { cn, hideIf } from "~/utils/react";
import { useApp } from "~/hooks/useApp";
export const Waybar = () => {
const { screenWidth } = useApp();
return (
<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">
@@ -26,8 +30,7 @@ export const Waybar = () => {
<WaybarHomeWidget />
</WaybarWidgetGroup>
<Responsive minScreenWidth={705}>
<WaybarWidgetGroup>
<WaybarWidgetGroup className={cn(hideIf(screenWidth < 705))}>
<WaybarCPUWidget
variation={1}
frequency={3250 + randomMinMax(-100, 100)}
@@ -45,13 +48,10 @@ export const Waybar = () => {
/>
<WaybarDiskWidget current={35.9} variation={4.1} capacity={160.3} />
</WaybarWidgetGroup>
</Responsive>
<Responsive minScreenWidth={910}>
<WaybarWidgetGroup>
<WaybarWidgetGroup className={cn(hideIf(screenWidth < 910))}>
<WaybarTitleWidget />
</WaybarWidgetGroup>
</Responsive>
</div>
<div className="flex items-center">
<WaybarWidgetGroup>
@@ -61,8 +61,7 @@ export const Waybar = () => {
</WaybarWidgetGroup>
</div>
<div className="flex items-center justify-end gap-2">
<Responsive minScreenWidth={1320}>
<WaybarWidgetGroup>
<WaybarWidgetGroup className={cn(hideIf(screenWidth < 1320))}>
<WaybarTemperatureWidget
min={50}
max={70}
@@ -72,23 +71,18 @@ export const Waybar = () => {
<WaybarBatteryWidget frequency={7000 + randomMinMax(-100, 100)} />
</WaybarWidgetGroup>
</Responsive>
<Responsive minScreenWidth={970}>
<WaybarWidgetGroup>
<WaybarWidgetGroup className={cn(hideIf(screenWidth < 970))}>
<WaybarBrightnessWidget />
<WaybarVolumeWidget />
<WaybarMicrophoneWidget />
</WaybarWidgetGroup>
</Responsive>
<Responsive minScreenWidth={475}>
<WaybarWidgetGroup>
<WaybarWidgetGroup className={cn(hideIf(screenWidth < 475))}>
<WaybarTrayWidget />
<WaybarWeatherWidget />
<WaybarToggleThemeWidget />
</WaybarWidgetGroup>
</Responsive>
</div>
</div>
);

View File

@@ -5,7 +5,7 @@ export const AppContext = createContext<
| Prettify<
State<"activeKitty", string> &
State<"brightness", number> &
State<"volume", number>
State<"volume", number> & { screenWidth: number }
>
| undefined
>(undefined);

View File

@@ -1,4 +1,4 @@
import { type ReactNode, useState } from "react";
import { type ReactNode, useState, useEffect } from "react";
import { AppContext } from "~/context/AppContext";
export const AppProvider = (props: { children?: ReactNode }) => {
@@ -6,6 +6,18 @@ export const AppProvider = (props: { children?: ReactNode }) => {
const [brightness, setBrightness] = 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 (
<AppContext.Provider
value={{
@@ -15,6 +27,7 @@ export const AppProvider = (props: { children?: ReactNode }) => {
setBrightness,
volume,
setVolume,
screenWidth,
}}
>
{props.children}

View File

@@ -2,3 +2,5 @@ import { type ClassNameValue, twMerge } from "tailwind-merge";
import { clsx } from "clsx";
export const cn = (...classes: Array<ClassNameValue>) => twMerge(clsx(classes));
export const hideIf = (condition: boolean) => (condition ? "hidden" : "");