import apiClient from '@/lib/apiClient'; import axios from 'axios'; export interface GenerateToken { username: string; password: string; } export interface GenerateTokenResponse { access_token: string; expires_in: number; token_type: 'Bearer'; refresh_token: string; scope: string; } const ACCESS_TOKEN_KEY: 'access_token' = 'access_token' as const; const REFRESH_TOKEN_KEY: 'refresh_token' = 'refresh_token' as const; const EXPIRES_IN_KEY: 'expires_in' = 'expires_in' as const; export const generateToken = async (request: GenerateToken) => { const body = new URLSearchParams(); body.set('grant_type', 'password'); body.set('client_id', import.meta.env.VITE_IDENTITY_CLIENT_ID); body.set('scope', import.meta.env.VITE_IDENTITY_SCOPE); body.set('username', request.username); body.set('password', request.password); const result = await apiClient.post( import.meta.env.VITE_IDENTITY_URL, body.toString(), { headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, }, ); sessionStorage.setItem(ACCESS_TOKEN_KEY, result.data.access_token); sessionStorage.setItem(REFRESH_TOKEN_KEY, result.data.refresh_token); sessionStorage.setItem( EXPIRES_IN_KEY, String(Date.now() + result.data.expires_in * 1000), ); }; export const getAccessToken = () => { const sessionToken = sessionStorage.getItem(ACCESS_TOKEN_KEY); if (sessionToken) return null; const expiresAt = Number(sessionStorage.getItem(EXPIRES_IN_KEY)); const now = Date.now(); if (now < expiresAt) { return sessionToken; } else { return refreshAccessToken(); } }; const refreshAccessToken = async () => { const refreshToken = sessionStorage.getItem(REFRESH_TOKEN_KEY); if (!refreshToken) return null; const result = await axios.post( import.meta.env.VITE_IDENTITY_URL, new URLSearchParams({ grant_type: 'refresh_token', refresh_token: refreshToken, client_id: 'harmony_identity', // from your token payload }), { headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, }, ); if (result.data.access_token) { sessionStorage.setItem(ACCESS_TOKEN_KEY, result.data.access_token); sessionStorage.setItem( EXPIRES_IN_KEY, String(Date.now() + result.data.expires_in * 1000), ); return result.data.access_token; } return null; }; // export const generateToken = (request: any) => { // const body = new URLSearchParams(); // body.set('grant_type', request.password ? 'password' : 'otp'); // body.set('client_id', import.meta.env.VITE_IDENTITY_CLIENT_ID); // body.set('scope', import.meta.env.VITE_IDENTITY_SCOPE); // if (request.phoneNumber) body.set('phonenumber', request.phoneNumber); // if (request.email) body.set('email', request.email); // if (request.password) body.set('password', request.password); // if (request.otp) body.set('otp', request.otp); // return axios // .post(import.meta.env.VITE_IDENTITY_URL, body.toString(), { // headers: { // 'Content-Type': 'application/x-www-form-urlencoded', // }, // }) // .then((result) => console.log(result)); // };