initial commit

This commit is contained in:
ferdiansyah783
2025-08-05 12:35:40 +07:00
commit fffa2ead5c
1069 changed files with 118056 additions and 0 deletions
+48
View File
@@ -0,0 +1,48 @@
import axios from 'axios'
const getToken = () => {
return localStorage.getItem('authToken')
}
export const api = axios.create({
baseURL: process.env.NEXT_PUBLIC_API_URL,
headers: {
'Content-Type': 'application/json'
},
timeout: 10000
})
api.interceptors.request.use(
config => {
const token = getToken()
if (token) {
config.headers.Authorization = `Bearer ${token}`
}
return config
},
error => {
return Promise.reject(error)
}
)
api.interceptors.response.use(
response => response,
error => {
const status = error.response?.status
if (status === 401) {
console.warn('Unauthorized. Redirecting to login...')
window.location.href = '/login'
}
if (status === 403) {
console.error('Forbidden: Kamu tidak punya akses.')
}
if (status >= 500) {
console.error('Server error:', error.response?.data?.message || 'Terjadi kesalahan server.')
}
return Promise.reject(error)
}
)
+37
View File
@@ -0,0 +1,37 @@
import { useMutation } from '@tanstack/react-query'
import { api } from '../api'
import { redirect } from 'next/navigation'
type LoginPayload = {
email: string
password: string
}
export const useAuthMutation = {
login: () => {
return useMutation({
mutationFn: async (payload: LoginPayload) => {
const response = await api.post('/auth/login', payload)
return response.data.data
},
onSuccess: data => {
// Optional: refetch 'users' list after success
localStorage.setItem('authToken', data.token)
localStorage.setItem('user', JSON.stringify(data.user))
}
})
},
logout: () => {
return useMutation({
mutationFn: async () => {
await api.post('/auth/logout')
},
onSuccess: () => {
// Optional: refetch 'users' list after success
localStorage.removeItem('authToken')
localStorage.removeItem('user')
}
})
}
}
+27
View File
@@ -0,0 +1,27 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'
import { api } from '../api'
import { User } from '../../types/services/user'
type CreateUserPayload = {
name: string
email: string
}
const useUsersMutation = {
createUser: () => {
const queryClient = useQueryClient()
return useMutation<User, Error, CreateUserPayload>({
mutationFn: async newUser => {
const response = await api.post('/users', newUser)
return response.data
},
onSuccess: () => {
// Optional: refetch 'users' list after success
queryClient.invalidateQueries({ queryKey: ['users'] })
}
})
}
}
export default useUsersMutation
+15
View File
@@ -0,0 +1,15 @@
import { useQuery } from '@tanstack/react-query'
import { Products } from '../../types/services/products'
import { api } from '../api'
export const useProductsQuery = {
getProducts: () => {
return useQuery<Products>({
queryKey: ['products'],
queryFn: async () => {
const res = await api.get('/products')
return res.data.data
}
})
}
}
+17
View File
@@ -0,0 +1,17 @@
import { useQuery } from '@tanstack/react-query'
import { api } from '../api'
import { User } from '../../types/services/user'
const useUsersQuery = {
getUsers: () => {
return useQuery<User[]>({
queryKey: ['users'],
queryFn: async () => {
const res = await api.get('/users')
return res.data
}
})
}
}
export default useUsersQuery