feat: add cars page
This commit is contained in:
parent
55d67cf118
commit
40c8616240
@ -14,6 +14,7 @@ export default defineConfig({
|
|||||||
'process.env.FIREBASE_STORAGE_BUCKET': JSON.stringify(process.env.FIREBASE_STORAGE_BUCKET),
|
'process.env.FIREBASE_STORAGE_BUCKET': JSON.stringify(process.env.FIREBASE_STORAGE_BUCKET),
|
||||||
'process.env.FIREBASE_MESSAGING_SENDER_ID': JSON.stringify(process.env.FIREBASE_MESSAGING_SENDER_ID),
|
'process.env.FIREBASE_MESSAGING_SENDER_ID': JSON.stringify(process.env.FIREBASE_MESSAGING_SENDER_ID),
|
||||||
'process.env.FIREBASE_APP_ID': JSON.stringify(process.env.FIREBASE_APP_ID),
|
'process.env.FIREBASE_APP_ID': JSON.stringify(process.env.FIREBASE_APP_ID),
|
||||||
|
'process.env.FIREBASE_DATABASE_URL': JSON.stringify(process.env.FIREBASE_DATABASE_URL),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
25
src/pages/CarsPage.vue
Normal file
25
src/pages/CarsPage.vue
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<h2>Cars</h2>
|
||||||
|
<Loader v-if="showLoader"/>
|
||||||
|
<div class="flex flex-column gap-3" v-else>
|
||||||
|
<Card v-for="(car, i) in cars" :key="i">
|
||||||
|
<template #title> {{car.name}} </template>
|
||||||
|
<template #subtitle> {{car.type}} </template>
|
||||||
|
</Card>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { computed } from 'vue';
|
||||||
|
import Loader from '@/components/Loader.vue';
|
||||||
|
import Card from 'primevue/card'
|
||||||
|
import { useCarsStore } from '@/store/cars.js';
|
||||||
|
|
||||||
|
const carsStore = useCarsStore();
|
||||||
|
|
||||||
|
const cars = computed(() => carsStore.cars);
|
||||||
|
const showLoader = computed(() => carsStore.showLoader);
|
||||||
|
</script>
|
||||||
|
|
||||||
@ -3,14 +3,17 @@
|
|||||||
import { ref } from 'vue';
|
import { ref } from 'vue';
|
||||||
import { useAuthStore } from '@/store/auth';
|
import { useAuthStore } from '@/store/auth';
|
||||||
import Loader from '@/components/Loader.vue';
|
import Loader from '@/components/Loader.vue';
|
||||||
|
import { useRouter } from 'vue-router';
|
||||||
|
|
||||||
const authStore = useAuthStore()
|
const authStore = useAuthStore();
|
||||||
|
const router = useRouter();
|
||||||
|
|
||||||
const email = ref('')
|
const email = ref('')
|
||||||
const password = ref('')
|
const password = ref('')
|
||||||
|
|
||||||
const signin = async () => {
|
const signin = async () => {
|
||||||
await authStore.auth('signIn',{ email: email.value, password: password.value })
|
await authStore.auth('signIn',{ email: email.value, password: password.value })
|
||||||
|
await router.push('/cars');
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@ -3,14 +3,17 @@
|
|||||||
import { ref } from 'vue';
|
import { ref } from 'vue';
|
||||||
import { useAuthStore } from '@/store/auth';
|
import { useAuthStore } from '@/store/auth';
|
||||||
import Loader from '@/components/Loader.vue';
|
import Loader from '@/components/Loader.vue';
|
||||||
|
import { useRouter } from 'vue-router';
|
||||||
|
|
||||||
const authStore = useAuthStore()
|
const authStore = useAuthStore()
|
||||||
|
const router = useRouter();
|
||||||
|
|
||||||
const email = ref('')
|
const email = ref('')
|
||||||
const password = ref('')
|
const password = ref('')
|
||||||
|
|
||||||
const signup = async () => {
|
const signup = async () => {
|
||||||
await authStore.auth('signUp', { email: email.value, password: password.value })
|
await authStore.auth('signUp', { email: email.value, password: password.value })
|
||||||
|
await router.push('/cars');
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@ -13,6 +13,11 @@ const router = createRouter({
|
|||||||
path: '/sign-in',
|
path: '/sign-in',
|
||||||
name: 'SignIn',
|
name: 'SignIn',
|
||||||
component: () => import('../pages/SignIn.vue')
|
component: () => import('../pages/SignIn.vue')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/cars',
|
||||||
|
name: 'Cars',
|
||||||
|
component: () => import('../pages/CarsPage.vue')
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
|||||||
@ -52,40 +52,41 @@ export const useAuthStore = defineStore('auth', () => {
|
|||||||
token: data.idToken,
|
token: data.idToken,
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (!(e instanceof AxiosError)){
|
if (e instanceof AxiosError){
|
||||||
|
switch (e?.response?.data?.error?.message) {
|
||||||
|
case 'EMAIL_EXISTS':
|
||||||
|
error.value = 'Email already exists';
|
||||||
|
break;
|
||||||
|
case 'OPERATION_NOT_ALLOWED':
|
||||||
|
error.value = 'Operation not allowed';
|
||||||
|
break;
|
||||||
|
case 'TOO_MANY_ATTEMPTS_TRY_LATER':
|
||||||
|
error.value = 'Too many attempts';
|
||||||
|
break;
|
||||||
|
case 'EMAIL_NOT_FOUND':
|
||||||
|
error.value = 'Email not found';
|
||||||
|
break;
|
||||||
|
case 'INVALID_LOGIN_CREDENTIALS':
|
||||||
|
error.value = 'Invalid credentials';
|
||||||
|
break;
|
||||||
|
case 'INVALID_PASSWORD':
|
||||||
|
error.value = 'Invalid password';
|
||||||
|
break;
|
||||||
|
case 'WEAK_PASSWORD':
|
||||||
|
error.value = 'Password is weak';
|
||||||
|
break;
|
||||||
|
case 'USER_DISABLED':
|
||||||
|
error.value = 'User disabled';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
error.value = 'Something went wrong';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
error.value = 'Something went wrong';
|
error.value = 'Something went wrong';
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (e?.response?.data?.error?.message) {
|
throw new Error(error.value);
|
||||||
case 'EMAIL_EXISTS':
|
|
||||||
error.value = 'Email already exists';
|
|
||||||
return;
|
|
||||||
case 'OPERATION_NOT_ALLOWED':
|
|
||||||
error.value = 'Operation not allowed';
|
|
||||||
return;
|
|
||||||
case 'TOO_MANY_ATTEMPTS_TRY_LATER':
|
|
||||||
error.value = 'Too many attempts';
|
|
||||||
return;
|
|
||||||
case 'EMAIL_NOT_FOUND':
|
|
||||||
error.value = 'Email not found';
|
|
||||||
return;
|
|
||||||
case 'INVALID_LOGIN_CREDENTIALS':
|
|
||||||
error.value = 'Invalid credentials';
|
|
||||||
return;
|
|
||||||
case 'INVALID_PASSWORD':
|
|
||||||
error.value = 'Invalid password';
|
|
||||||
return;
|
|
||||||
case 'WEAK_PASSWORD':
|
|
||||||
error.value = 'Password is weak';
|
|
||||||
return;
|
|
||||||
case 'USER_DISABLED':
|
|
||||||
error.value = 'User disabled';
|
|
||||||
return;
|
|
||||||
default:
|
|
||||||
error.value = 'Something went wrong';
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} finally {
|
} finally {
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
}
|
}
|
||||||
|
|||||||
25
src/store/cars.ts
Normal file
25
src/store/cars.ts
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import api from '@/utils/api.ts';
|
||||||
|
import { defineStore } from 'pinia';
|
||||||
|
import { onMounted, ref } from 'vue';
|
||||||
|
|
||||||
|
export const useCarsStore = defineStore('cars', () => {
|
||||||
|
const cars = ref([]);
|
||||||
|
const showLoader = ref(false);
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
try {
|
||||||
|
showLoader.value = true;
|
||||||
|
const response = await api.get(`/cars.json`);
|
||||||
|
cars.value = Object.values(response.data)
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
} finally {
|
||||||
|
showLoader.value = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
cars,
|
||||||
|
showLoader,
|
||||||
|
}
|
||||||
|
})
|
||||||
25
src/utils/api.ts
Normal file
25
src/utils/api.ts
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import router from '@/router';
|
||||||
|
import { useAuthStore } from '@/store/auth.ts';
|
||||||
|
import axios from 'axios';
|
||||||
|
|
||||||
|
const api = axios.create({
|
||||||
|
baseURL: process.env.FIREBASE_DATABASE_URL,
|
||||||
|
});
|
||||||
|
|
||||||
|
api.interceptors.request.use((config) => {
|
||||||
|
const authStore = useAuthStore();
|
||||||
|
let params = new URLSearchParams();
|
||||||
|
params.append('auth', authStore.userInfo.token);
|
||||||
|
config.params = params;
|
||||||
|
|
||||||
|
return config
|
||||||
|
})
|
||||||
|
|
||||||
|
api.interceptors.response.use(null, (response) => {
|
||||||
|
if (response.status === 401) {
|
||||||
|
router.push('/sign-in')
|
||||||
|
}
|
||||||
|
return response;
|
||||||
|
})
|
||||||
|
|
||||||
|
export default api;
|
||||||
Loading…
x
Reference in New Issue
Block a user