feat: split contexts, providers and hooks

This commit is contained in:
Pihkaal
2024-05-30 15:55:59 +02:00
parent af5fc8cb35
commit 77f3b3ef40
13 changed files with 51 additions and 41 deletions

View File

@@ -1,6 +1,6 @@
import { useState } from "react"; import { useState } from "react";
import { Kitty } from "./components/Kitty"; import { Kitty } from "./components/Kitty";
import { AppProvider } from "./context/AppContext"; import { AppProvider } from "./providers/AppProvider";
import { Music } from "./components/Music"; import { Music } from "./components/Music";
import { Nvim } from "./components/Nvim"; import { Nvim } from "./components/Nvim";

View File

@@ -6,8 +6,9 @@ import {
useCallback, useCallback,
useId, useId,
} from "react"; } from "react";
import { KittyContext, type KittyContextProps } from "../context/KittyContext"; import { type KittyContextProps } from "~/context/KittyContext";
import { useApp } from "../context/AppContext"; import { useApp } from "~/hooks/useApp";
import { KittyProvider } from "~/providers/KittyProvider";
export const CHAR_WIDTH = 12; export const CHAR_WIDTH = 12;
export const CHAR_HEIGHT = 26; export const CHAR_HEIGHT = 26;
@@ -51,7 +52,7 @@ export const Kitty = (props: {
setWidth(`${width}px`); setWidth(`${width}px`);
setHeight(`${height}px`); setHeight(`${height}px`);
setContext(ctx => ({ ...(ctx ?? { active: false }), rows, cols })); setContext((ctx) => ({ ...(ctx ?? { active: false }), rows, cols }));
}, []); }, []);
useEffect(() => { useEffect(() => {
@@ -76,9 +77,9 @@ export const Kitty = (props: {
lineHeight: `${CHAR_HEIGHT}px`, lineHeight: `${CHAR_HEIGHT}px`,
...(activeKitty === id ...(activeKitty === id
? { ? {
borderColor: "#cdd6f4", borderColor: "#cdd6f4",
animationDuration: "200ms", animationDuration: "200ms",
} }
: {}), : {}),
}} }}
ref={container} ref={container}
@@ -87,9 +88,7 @@ export const Kitty = (props: {
className="whitespace-pre" className="whitespace-pre"
style={{ backdropFilter: "blur(2px)", width, height }} style={{ backdropFilter: "blur(2px)", width, height }}
> >
<KittyContext.Provider value={context}> <KittyProvider value={context}>{props.children}</KittyProvider>
{props.children}
</KittyContext.Provider>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -5,8 +5,9 @@ import {
useRef, useRef,
useState, useState,
} from "react"; } from "react";
import { type InnerKittyProps, useKitty } from "../../context/KittyContext"; import { type InnerKittyProps } from "../../context/KittyContext";
import { CHAR_WIDTH } from "../Kitty"; import { CHAR_WIDTH } from "../Kitty";
import { useKitty } from "~/hooks/useKitty";
export const Cava = (props: { audio: RefObject<HTMLAudioElement> }) => { export const Cava = (props: { audio: RefObject<HTMLAudioElement> }) => {
const kitty = useKitty(); const kitty = useKitty();

View File

@@ -2,7 +2,8 @@ import { useState } from "react";
import { formatMMSS } from "../../utils/time"; import { formatMMSS } from "../../utils/time";
import { CharArray } from "../../utils/string"; import { CharArray } from "../../utils/string";
import { CHAR_HEIGHT, CHAR_WIDTH } from "../Kitty"; import { CHAR_HEIGHT, CHAR_WIDTH } from "../Kitty";
import { type InnerKittyProps, useKitty } from "../../context/KittyContext"; import { type InnerKittyProps } from "../../context/KittyContext";
import { useKitty } from "~/hooks/useKitty";
export const SpotifyPlayer = (props: { export const SpotifyPlayer = (props: {
title: string; title: string;

View File

@@ -30,9 +30,9 @@ export const Music = () => {
if (metadata) return; if (metadata) return;
void fetch(song) void fetch(song)
.then(r => r.blob()) .then((r) => r.blob())
.then(b => parseBlob(b)) .then((b) => parseBlob(b))
.then(m => { .then((m) => {
if (!audio.current) return; if (!audio.current) return;
setMetadata(m); setMetadata(m);

View File

@@ -18,7 +18,7 @@ export const WaybarRAMWidget = (props: {
useEffect(() => { useEffect(() => {
const interval = setInterval(() => { const interval = setInterval(() => {
const offset = randomMinMax(-props.variation, props.variation + 1); const offset = randomMinMax(-props.variation, props.variation + 1);
setUsage(x => clamp(x + offset, props.min, props.max)); setUsage((x) => clamp(x + offset, props.min, props.max));
}, props.frequency); }, props.frequency);
return () => clearInterval(interval); return () => clearInterval(interval);

View File

@@ -1,22 +1,5 @@
import { type ReactNode, createContext, useContext, useState } from "react"; import { createContext } from "react";
export const AppContext = createContext< export const AppContext = createContext<
{ activeKitty: string; setActiveKitty: (value: string) => void } | undefined { activeKitty: string; setActiveKitty: (value: string) => void } | undefined
>(undefined); >(undefined);
export const useApp = () => {
const app = useContext(AppContext);
if (!app) throw new Error("`useApp` used outside AppContext");
return app;
};
export const AppProvider = (props: { children?: ReactNode }) => {
const [activeKitty, setActiveKitty] = useState(":r0:");
return (
<AppContext.Provider value={{ activeKitty, setActiveKitty }}>
{props.children}
</AppContext.Provider>
);
};

View File

@@ -1,11 +1,9 @@
import { createContext, useContext } from "react"; import { createContext } from "react";
export const KittyContext = createContext<KittyContextProps | undefined>( export const KittyContext = createContext<KittyContextProps | undefined>(
undefined, undefined,
); );
export const useKitty = () => useContext(KittyContext);
export type KittyContextProps = { export type KittyContextProps = {
rows: number; rows: number;
cols: number; cols: number;

9
src/hooks/useApp.ts Normal file
View File

@@ -0,0 +1,9 @@
import { useContext } from "react";
import { AppContext } from "~/context/AppContext";
export const useApp = () => {
const app = useContext(AppContext);
if (!app) throw new Error("`useApp` used outside AppContext");
return app;
};

4
src/hooks/useKitty.ts Normal file
View File

@@ -0,0 +1,4 @@
import { useContext } from "react";
import { KittyContext } from "~/context/KittyContext";
export const useKitty = () => useContext(KittyContext);

View File

@@ -0,0 +1,12 @@
import { type ReactNode, useState } from "react";
import { AppContext } from "~/context/AppContext";
export const AppProvider = (props: { children?: ReactNode }) => {
const [activeKitty, setActiveKitty] = useState(":r0:");
return (
<AppContext.Provider value={{ activeKitty, setActiveKitty }}>
{props.children}
</AppContext.Provider>
);
};

View File

@@ -0,0 +1,3 @@
import { KittyContext } from "~/context/KittyContext";
export const KittyProvider = KittyContext.Provider;

View File

@@ -6,10 +6,10 @@ const config = {
theme: { theme: {
extend: { extend: {
fontSize: { fontSize: {
"sm": "0.8rem", sm: "0.8rem",
"base": "1rem", base: "1rem",
"lg": "1.25rem", lg: "1.25rem",
"xl": "1.25rem", xl: "1.25rem",
"2xl": "1.563rem", "2xl": "1.563rem",
"3xl": "1.953rem", "3xl": "1.953rem",
"4xl": "2.441rem", "4xl": "2.441rem",