celestya
Highly opinionated session management tool for NextJS Frontends
How to use
Add environment vars (dont expose them publically!!)
//.env
CELESTYA_SECRET=XXXXXX // AT_LEAST_32_CHARACTERS
CELESTYA_COOKIE_NAME=XXXX // COOKIE_NAME
CELESTYA_SECURE=true // true / false
Configure the api endpoints
import { API_URL, HOST } from "@/config/env";
import { IConfig, IRequestOptions, Proxy } from "celestya";
const config: IConfig = {
host: HOST || "missing-host",
route: "/api",
apiUrl: API_URL || "missing-api-url",
userEndpoint: "/user",
};
export const POST = (req: any, opt: IRequestOptions) => Proxy("POST", req, opt, config);
export const GET = (req: any, opt: IRequestOptions) => Proxy("GET", req, opt, config);
Configure the provider
import { AuthProvider, Logout } from "celestya/client";
export default function RootLayout({
children,
}: {
children: React.ReactNode,
}) {
return (
<html lang="en">
<body>
<AuthProvider>{children}</AuthProvider>
</body>
</html>
);
}
Use the getSession function in server components (keep in mind they dont revalidate often!)
import { getSession, } from "celestya";
interface User {
email: string
name: string
}
const Navbar = async () => {
const session = await getSession<User>();
return <div>Welcome: {session.user?.name}</div>;
};
export default Navbar;
Use the apiFetch function in server components
import { apiFetch } from "celestya";
import { config } from "@/app/api/[[...endpoint]]/route"
interface User {
email: string
name: string
}
const Navbar = async () => {
const user = await apiFetch("user", {}, config)
return <div>Welcome: {session.user?.name}</div>;
};
export default Navbar;
Use the other functions in client components
import { useAuth } from 'celestya/client'
interface User {
email: string
name: string
}
const Home = async () => {
const { ready, get } = useAuth()
const handleClick = () => {
try {
if (!ready) throw new Error('Not ready')
const res = await get('/user/billing')
console.log(res)
} catch (e) {
console.log(e)
}
}
return <Button onClick={handleClick}>Welcome: {session.user?.name}</div>;
};
export default Navbar;
Todo
- [ ]: Upload request with worker as helper (?)
- [ ]: Refresh logic
- [x]: Change returns at error
- [x]: GET request with auth
- [x]: POST request with auth
- [x]: Fix issue with getSession serverside and config set at layout (If used at api/_/route.tsx)
- [x]: Fix issue with api endpoints if no layout has been loaded (if accessing api directly)