mirror of
https://github.com/steveiliop56/tinyauth.git
synced 2025-10-28 20:55:42 +00:00
* wip * feat: make forms functional * feat: finalize pages * chore: remove unused translations * feat: app context * feat: user context * feat: finalize username login * fix: use correct tab order in login form * feat: add oauth logic * chore: update readme and assets * chore: rename docs back to assets * feat: favicons * feat: custom background image config option * chore: add acknowledgements for background image * feat: sanitize redirect URL * feat: sanitize redirect URL on check * chore: fix dependabot config * refactor: bot suggestions * fix: correctly redirect to app and check for untrusted redirects * fix: run oauth auto redirect only when there is a redirect URI * refactor: change select color * fix: fix dockerfiles * fix: fix hook rendering * chore: remove translations cdn * chore: formatting * feat: validate api response against zod schema * fix: use axios error instead of generic error in login page
45 lines
1016 B
TypeScript
45 lines
1016 B
TypeScript
import {
|
|
appContextSchema,
|
|
AppContextSchema,
|
|
} from "@/schemas/app-context-schema";
|
|
import { createContext, useContext } from "react";
|
|
import { useSuspenseQuery } from "@tanstack/react-query";
|
|
import axios from "axios";
|
|
|
|
const AppContext = createContext<AppContextSchema | null>(null);
|
|
|
|
export const AppContextProvider = ({
|
|
children,
|
|
}: {
|
|
children: React.ReactNode;
|
|
}) => {
|
|
const { isFetching, data, error } = useSuspenseQuery({
|
|
queryKey: ["app"],
|
|
queryFn: () => axios.get("/api/app").then((res) => res.data),
|
|
});
|
|
|
|
if (error && !isFetching) {
|
|
throw error;
|
|
}
|
|
|
|
const validated = appContextSchema.safeParse(data);
|
|
|
|
if (validated.success === false) {
|
|
throw validated.error;
|
|
}
|
|
|
|
return (
|
|
<AppContext.Provider value={validated.data}>{children}</AppContext.Provider>
|
|
);
|
|
};
|
|
|
|
export const useAppContext = () => {
|
|
const context = useContext(AppContext);
|
|
|
|
if (!context) {
|
|
throw new Error("useAppContext must be used within an AppContextProvider");
|
|
}
|
|
|
|
return context;
|
|
};
|