File size: 1,996 Bytes
cce8120
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#!/usr/bin/env bash
set -euo pipefail

echo "[1/8] Creating authentication..."

mkdir -p services/auth
mkdir -p hooks
mkdir -p context

cat > services/auth/auth.js <<'EOC'
import api from "../api";

export async function login(username,password){
    const {data}=await api.post("/api/auth/login",{
        username,
        password
    });

    localStorage.setItem("access_token",data.access_token);
    return data;
}

export async function logout(){
    localStorage.removeItem("access_token");
}

export async function profile(){
    const {data}=await api.get("/api/auth/me");
    return data;
}

export async function refresh(){
    const {data}=await api.post("/api/auth/refresh");
    localStorage.setItem("access_token",data.access_token);
    return data;
}
EOC

cat > context/AuthContext.jsx <<'EOC'
"use client";

import {createContext,useContext,useEffect,useState} from "react";
import * as auth from "../services/auth/auth";

const AuthContext=createContext(null);

export function AuthProvider({children}){

const [user,setUser]=useState(null);

useEffect(()=>{
auth.profile()
.then(setUser)
.catch(()=>setUser(null));
},[]);

return(
<AuthContext.Provider value={{user,setUser,...auth}}>
{children}
</AuthContext.Provider>
);

}

export function useAuth(){
return useContext(AuthContext);
}
EOC

cat > hooks/useAuth.js <<'EOC'
import {useAuth} from "../context/AuthContext";
export default useAuth;
EOC

echo "[2/8] Wrapping application..."

grep -q "AuthProvider" app/layout.jsx || perl -0pi -e '
s#(<body[^>]*>)#$1\n<AuthProvider>#;
s#(</body>)#</AuthProvider>\n$1#;
s#import#import {AuthProvider} from "../context/AuthContext";\nimport#;
' app/layout.jsx || true

echo "[3/8] Installing..."

npm install

echo "[4/8] Production build..."

npm run build >/dev/null

echo "[5/8] Verify..."

test -f services/auth/auth.js
test -f context/AuthContext.jsx
test -f hooks/useAuth.js

echo "[6/8] Authentication integrated."

echo "[7/8] Frontend verified."

echo "[8/8] Complete."