Version 1.0.0 - Initialisation du depot

This commit is contained in:
2025-07-25 18:00:14 +02:00
commit e3d7a911f4
51 changed files with 4335 additions and 0 deletions

24
src/utils/Access.vue Normal file
View File

@@ -0,0 +1,24 @@
<template>
</template>
<script setup>
import { useRouter } from 'vue-router';
import { useUserStore } from '@/stores/userStore';
import { useGlobalStore } from '@/stores/globalStore';
const userStore = useUserStore();
const globalStore = useGlobalStore();
const router = useRouter();
console.log("Access Vue Loaded");
console.log(globalStore.lastGuild + "LAST GUILD FROM ACCESS VUE");
if(!globalStore.lastGuild && globalStore.lastGuild !== null) {
router.push("/servers");
} else {
router.push(`/servers/${globalStore.lastGuild}`);
}
</script>

22
src/utils/IORequest.js Normal file
View File

@@ -0,0 +1,22 @@
import { socket } from '@/socket';
export function IORequest(event, callback, data) {
console.log(`IORequest: Emitting event ${event} with data:`, data);
socket.emit(event, data);
if (callback && typeof callback === 'function') {
socket.once(event, (response) => {
console.log(`IORequest: Received response for event ${event}:`, response);
callback(response);
});
}
}
export function IOListener(event, callback) {
console.log(`IOListener: Listen for event ${event}`);
socket.on(event, (data) => {
if (callback && typeof callback === 'function') {
console.log(`IOListener: Received data for event ${event}:`, data);
callback(data);
}
});
}

40
src/utils/Loader.vue Normal file
View File

@@ -0,0 +1,40 @@
<script setup>
import DefaultSplash from '@/components/Layout/DefaultSplash.vue';
const defaultMessage = "On s'accorde et on prépare le concert !";
const props = defineProps({
interuptionMessage: {
type: String,
default: null
}
});
</script>
<template>
<DefaultSplash>
<h1 v-if="!interuptionMessage" class="separate"><Icon spin-pulse icon="fa-solid fa-spinner"/> Chargement de l'interface</h1>
<h1 v-else><Icon icon="fa-solid fa-warning"/> Connexion interrompue</h1>
<p v-if="interuptionMessage" class="retry"><Icon spin-pulse icon="fa-solid fa-spinner"/> Tentative de reconnexion en cours</p>
<p v-if="interuptionMessage" class="error"><Icon icon="fa-solid fa-circle-xmark"/> {{ interuptionMessage }}</p>
<p v-else>{{ defaultMessage }}</p>
</DefaultSplash>
</template>
<style scoped>
.retry {
font-size: 1.2em;
margin-top: 10px;
}
.error {
color: var(--text-error);
}
.separate {
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
}
</style>

85
src/utils/Redirect.vue Normal file
View File

@@ -0,0 +1,85 @@
<template>
<DefaultSplash width="600px;">
<h1><Icon spin-pulse icon="fa-solid fa-spinner"/> Connexion en cours</h1>
<p>Vous allez être redirigé vers l'application.</p>
<div class="info">
<p class="second">Session : {{ loginStore.session }}</p>
<p class="second">Auth_Code : {{ route.query.code }}</p>
</div>
</DefaultSplash>
</template>
<script setup>
import DefaultSplash from '@/components/Layout/DefaultSplash.vue';
import { useLoginStore } from '@/stores/loginStore';
import { useRoute, useRouter } from 'vue-router';
import {socket} from '@/socket.js';
const loginStore = useLoginStore();
const route = useRoute();
const router = useRouter();
if(!loginStore.session) {
router.push("/login?error=" + encodeURIComponent("Session expirée ou non valide"));
}
if(!route.query.code) {
if(route.query.error) {
router.push("/login?error=" + encodeURIComponent("Connexion refusée par l'utilisateur"));
} else {
// If no error is specified, redirect to login with a generic error message
router.push("/login?error=" + encodeURIComponent("Code d'authentification Discord manquant"));
}
} else {
// Edit socket auth
socket.auth = {
sessionId: loginStore.session,
auth_code: route.query.code
};
socket.connect();
}
socket.on("NEW_TOKEN", (token) => {
loginStore.setToken(token);
loginStore.setSession(null)
router.push("/");
});
socket.on("error", () => {
router.push("/login?error=" + encodeURIComponent("Déconnexion du serveur lors de la connexion"));
});
socket.on("disconnect", () => {
router.push("/login?error=" + encodeURIComponent("Erreur lors de l'authentification, veuillez réessayer"));
});
socket.on("connect_error", (error) => {
router.push("/login?error=" + encodeURIComponent("Erreur de connexion au serveur : " + error.message));
});
socket.on("NEW_SESSION", (data) => {
console.log("Nouvelle session reçue :", data);
loginStore.setSession(data);
});
</script>
<style scoped>
.second {
color: var(--text-secondary);
font-size: 12px;;
word-break: break-all;
}
.info p {
margin: 0;
padding: 0;
}
.info {
display: flex;
flex-direction: column;
align-items: center;
gap: -10px;
}
</style>

View File

@@ -0,0 +1,88 @@
<template>
<Loader :interuption-message='interuptionMessage' v-if="globalStore.isLoading || interuptionMessage" />
<slot v-else></slot>
</template>
<script setup>
import Loader from '@/utils/Loader.vue';
import { ref } from 'vue';
import { useLoginStore } from '@/stores/loginStore';
import { socket } from '@/socket.js';
import { useRouter } from 'vue-router';
import { IOListener, IORequest } from '@/utils/IORequest';
import { useUserStore } from '@/stores/userStore';
import { useGlobalStore } from '@/stores/globalStore';
const router = useRouter();
const interuptionMessage = ref(null);
const needReload = ref(true)
const loginStore = useLoginStore();
const userStore = useUserStore();
const globalStore = useGlobalStore();
loginStore.clearSession();
socket.auth.sessionId = null;
socket.auth.token = loginStore.token;
if(!socket.connected) {
socket.connect();
}
IOListener("/USER/READY", () => {
IORequest("/USER/INFO", (data) => {
interuptionMessage.value = null;
userStore.setUserInfo(data);
console.log("User info received:", data);
globalStore.setLoading(false);
});
});
IOListener("AUTH_ERROR", (error) => {
console.error("Authentication error:", error);
loginStore.setToken(null);
globalStore.setLoading(true)
router.push("/login?error=" + encodeURIComponent("Erreur d'authentification : " + error));
socket.removeAllListeners();
needReload.value = false
})
socket.on("connect", () => {
interuptionMessage.value = null;
globalStore.setLoading(true);
});
socket.on("connect_error", (error) => {
interuptionMessage.value = "Erreur de connexion au serveur : " + error.message;
tryReconnect();
});
socket.on("error", () => {
interuptionMessage.value = "Erreur de connexion au serveur, veuillez réessayer plus tard";
tryReconnect();
})
socket.on("disconnect", () => {
interuptionMessage.value = "Déconnecté du serveur";
tryReconnect();
})
function tryReconnect() {
if(socket.connected) {
interuptionMessage.value = null;
return;
}
setInterval(() => {
console.log("Tentative de reconnexion au serveur...");
if(!socket.connected || !needReload.value) {
socket.auth.token = loginStore.token;
socket.connect();
} else {
clearInterval(this);
}
}, 3000); // Essai de reconnexion après 5 secondes
}
</script>r

11
src/utils/UserRequest.js Normal file
View File

@@ -0,0 +1,11 @@
import { useLoginStore } from "@/stores/loginStore";
import { IORequest } from "@/utils/IORequest";
export function signOut(router) {
const loginStore = useLoginStore();
IORequest("/USER/SIGNOUT", () => {
loginStore.setToken(null);
router.push("/login?message=" + encodeURIComponent("Vous avez été déconnecté"));
})
}