Skip to content
This repository has been archived by the owner on Oct 27, 2024. It is now read-only.

Commit

Permalink
v1.5.6
Browse files Browse the repository at this point in the history
ajout compatibilité ADE
désactivation temporaire absences
  • Loading branch information
hugofnm committed Aug 29, 2024
1 parent 18e2406 commit 0fd7d8f
Show file tree
Hide file tree
Showing 5 changed files with 423 additions and 381 deletions.
81 changes: 54 additions & 27 deletions App.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ UniceNotes
Votre ENT. Dans votre poche.
Développé par Hugo Meleiro (@hugofnm) / MetrixMedia
MIT License
2022 - 2024
2022 - 2025
*/

Expand Down Expand Up @@ -76,7 +76,7 @@ import { setAppIcon } from "@hugofnm/expo-dynamic-app-icon";
// ---------------------------------------------

// IMPORTANT !!!
var appVersion = '1.5.5';
var appVersion = '1.5.6';
var isBeta = false;
// IMPORTANT !!!

Expand All @@ -94,42 +94,54 @@ const servers = [

// Temporary variables - SecureStore
var username = SecureStore.getItemAsync("username").then((result) => {
if (result != "") {
if (result != null) {
username = result;
} else {
username = null;
}
}).catch((error) => {
haptics("error");
Alert.alert("Erreur", "Impossible de récupérer les données de connexion. EC=0xR");
deleteData(false, navigation);
deleteData(false);
}); // User's username

var password = SecureStore.getItemAsync("passkey").then((result) => {
if (result != "") {
if (result != null) {
password = result;
} else {
password = null;
}
}).catch((error) => {
haptics("error");
Alert.alert("Erreur", "Impossible de récupérer les données de connexion. EC=0xR");
deleteData(false, navigation);
deleteData(false);
}); // User's password

var name = SecureStore.getItemAsync("name").then((result) => {
if (result != "") {
name = result;
var adeid = SecureStore.getItemAsync("adeid").then((result) => {
if (result != null) {
adeid = result;
} else {
adeid = null;
}
}).catch((error) => {
haptics("error");
Alert.alert("Erreur", "Impossible de récupérer les données de connexion. EC=0xR");
deleteData(false);
}); // User's ADE Identifier (emploi du temps)

// Temporary variables - AsyncStorage
var name = AsyncStorage.getItem("name").then((result) => {
if (result != null) {
name = result.toString();
} else {
name = null;
}
}).catch((error) => {
haptics("error");
Alert.alert("Erreur", "Impossible de récupérer les données de connexion. EC=0xR");
deleteData(false, navigation);
deleteData(false);
}); // User's name

// Temporary variables - AsyncStorage
var autoSet = AsyncStorage.getItem("autoSet").then((result) => {
if (result != null) {
autoSet = (result === 'true');
Expand Down Expand Up @@ -222,17 +234,23 @@ async function saveUserdata(key, value) {
}

// Fonction de suppression des données - GDPR friendly :)
async function deleteData(warnings = false, navigation) {
async function deleteData(warnings = false, navigation = null) {
if (warnings) {
haptics("warning");
}

if(!__DEV__){
setAppIcon("unicenotes");
}

// Suppression des données
await SecureStore.deleteItemAsync("username"); // Suppression du nom d'utilisateur
username = null;
await SecureStore.deleteItemAsync("passkey"); // Suppression du mot de passe
password = null;
await SecureStore.deleteItemAsync("name"); // Suppression du nom
await SecureStore.deleteItemAsync("adeid"); // Suppression de l'identifiant ADE
adeid = null;
await AsyncStorage.removeItem("name"); // Suppression du nom
name = null;
await AsyncStorage.removeItem("autoSet"); // Suppression de l'autoSet de moyenne générale
autoSet = true;
Expand Down Expand Up @@ -262,7 +280,9 @@ async function deleteData(warnings = false, navigation) {
Alert.alert("Données supprimées", "Retour à la page de connexion.");
haptics("success");
}
logout(navigation);
if (navigation != null) {
logout(navigation);
}
}

// Ouverture de pages web dans le navigateur par défaut
Expand Down Expand Up @@ -446,7 +466,7 @@ async function getCalendar() {
var netInfos = (await Network.getNetworkStateAsync()).isInternetReachable;

if (netInfos == true) {
var cal = await fetch(selectedServer + '/edt/' + username.toString(), {
var cal = await fetch(selectedServer + '/edt/' + adeid.toString(), {
method: 'POST',
headers: {
"Accept": "application/json",
Expand All @@ -464,10 +484,10 @@ async function getCalendar() {
id : item.id,
start: item.start_time,
end: item.end_time,
title: item.description,
subtitle: item.summary,
title: item.summary,
subtitle: item.description,
description: item.location,
color: stringToColour(item.description)
color: stringToColour(item.summary)
})
});

Expand Down Expand Up @@ -817,13 +837,13 @@ function OOBE({ navigation }) {

// Connexion au SSO de l'Université Nice Côte d'Azur et vérification des identifiants
async function ssoUnice(username, password, eula) {
var endpoint = eula ? "/accepteula" : "/login";
if(!isConnected || !ok) {
let apiResp = await fetch(selectedServer + endpoint, {
let apiResp = await fetch(selectedServer + "/signup", {
method: 'POST',
body: JSON.stringify({
username: username,
password: password
password: password,
eula: eula
}),
headers: {
"Accept": "application/json",
Expand Down Expand Up @@ -856,11 +876,14 @@ function OOBE({ navigation }) {
await getPhotoFromENT();
}

adeid = json.adeid;
save("adeid", adeid);

name = json.name;
if (name == null) {
name = "Étudiant";
}
save("name", name);
saveUserdata("name", name);

semesters = json.semesters;
haptics("success");
Expand Down Expand Up @@ -953,7 +976,7 @@ function OOBE({ navigation }) {
<View style={{ flexDirection: 'row', alignItems: 'center', marginBottom: 16 }} >
<Button style={{ marginBottom: 8, marginRight: 8 }} icon="check" mode="contained" onPress={ () => handleLogin(true) }> Accepter </Button>
<Button style={{ marginBottom: 8, marginRight: 8, backgroundColor: style.container.error }} icon="close" mode="contained" onPress={ () => deleteData(true, navigation) }> Refuser </Button>
<IconButton style={{ marginBottom: 8 }} icon="information" mode="contained" onPress={ () => handleURL("https://notes.metrixmedia.fr/eula") }/>
<IconButton style={{ marginBottom: 14 }} icon="information" mode="outlined" onPress={ () => handleURL("https://notes.metrixmedia.fr/eula") }/>
</View>
</BottomSheetView>
</BottomSheet>
Expand Down Expand Up @@ -1120,6 +1143,10 @@ function HomeScreen({ navigation }) {

if(json.success) {
isConnected = true;
if (json.adeid != adeid) {
adeid = json.adeid;
save("adeid", adeid);
}
semesters = json.semesters;
setLoading(false);
setSelectable(true);
Expand All @@ -1146,7 +1173,7 @@ function HomeScreen({ navigation }) {
}

if(mode == "force" || ( mode == "normal" && nextEventLoaded == false )) {
fetch(selectedServer + "/edt/" + username.toString() + "/nextevent", {
fetch(selectedServer + "/edt/" + adeid.toString() + "/nextevent", {
method: 'GET',
headers: {
"Accept": "application/json",
Expand Down Expand Up @@ -1308,7 +1335,7 @@ function HomeScreen({ navigation }) {
<Text style={{ textAlign: 'left' }} variant="displayLarge">Salut ! 👋</Text>
<Text style={{ textAlign: 'left', marginBottom: 16 }} variant='titleMedium'>Tu es connecté·e·s sous le compte de : {"\n"}{username} - {name}</Text>
<Chip style={{ height: 48, marginBottom: 8, justifyContent: 'center' }} disabled={!selectable} onPress={ () => handleLogin("notes") } icon="school" >Notes</Chip>
<Chip style={{ height: 48, marginBottom: 8, justifyContent: 'center' }} disabled={!selectable} onPress={ () => handleLogin("absences") } icon="account-question" >Absences</Chip>
<Chip style={{ height: 48, marginBottom: 8, justifyContent: 'center' }} disabled={true} onPress={ () => handleLogin("absences") } icon="account-question" >Absences (indisponible)</Chip>

<Card style={{ marginBottom: 8 }} disabled={!selectable} onPress={ () => getMyCal(navigation) }>
<Card.Title title="Prochain Cours" />
Expand Down Expand Up @@ -2421,7 +2448,7 @@ function ShowUser({ navigation }) {
}
haptics("success");
name = value;
save("name", value);
saveUserdata("name", value);
setTempName(value);
Keyboard.dismiss();
}
Expand Down Expand Up @@ -2489,7 +2516,7 @@ function IconConfig({ navigation }) {

<ScrollView style={{ paddingLeft: 25, paddingRight: 25 }}>
<Text style={{ marginTop: 16, textAlign: 'left' }} variant="titleMedium">Choisissez votre icône :</Text>
<Chip style={{ height: 36, justifyContent: 'center', marginTop: 16, borderBottomLeftRadius: 0, borderBottomRightRadius: 0 }} disabled > Icônes </Chip>
<Chip style={{ height: 36, justifyContent: 'center', marginTop: 16, borderBottomLeftRadius: 0, borderBottomRightRadius: 0 }} disabled > Icônes officielles </Chip>
<Chip style={{ height: 48, justifyContent: 'center', borderTopLeftRadius: 0, borderTopRightRadius: 0, borderBottomLeftRadius: 0, borderBottomRightRadius: 0, marginTop: 1 }} avatar={<Image size={24} source={require('./assets/icon.png')}/>} onPress={ () => changeIconHome("unicenotes") }> Par défaut </Chip>
<Chip style={{ height: 48, justifyContent: 'center', borderTopLeftRadius: 0, borderTopRightRadius: 0, borderBottomLeftRadius: 0, borderBottomRightRadius: 0, marginTop: 1 }} avatar={<Image size={24} source={require('./assets/icons/icon_magnet.png')}/>} onPress={ () => changeIconHome("magnet") }> Magnet </Chip>
<Chip style={{ height: 48, justifyContent: 'center', borderTopLeftRadius: 0, borderTopRightRadius: 0, borderBottomLeftRadius: 0, borderBottomRightRadius: 0, marginTop: 1 }} avatar={<Image size={24} source={require('./assets/icons/icon_ardente.png')}/>} onPress={ () => changeIconHome("ardente") }> Ardente </Chip>
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<h2 align="center">UniceNotes</h2>

<p align="center">
<b>UniceNotes</b> est un client mobile non-officiel donnant accès à de multiples ressources provenant de l'Espace Numérique de Travail de l'I.U.T de Nice Côte d'Azur (Notes via Intracursus / Emploi du temps et Absences via GPU). Utilisant React Native, il est compatible avec la grande majorité des dispositifs mobiles (<b>iOS et Android</b>). <b>Votre ENT. Dans votre poche.</b>
<b>UniceNotes</b> est un client mobile non-officiel donnant accès à de multiples ressources provenant de l'Espace Numérique de Travail de l'I.U.T de Nice Côte d'Azur (via Intracursus / ADE). Utilisant React Native, il est compatible avec la grande majorité des dispositifs mobiles (<b>iOS et Android</b>). <b>Votre ENT. Dans votre poche.</b>
</p>

## ⚡️ Téléchargement
Expand Down Expand Up @@ -51,7 +51,7 @@ L'application UniceNotes utilise :


avec votre consentement (en vous connectant sur l'application et en acceptant les conditions d'utilisation) afin de vous fournir une expérience utilisateur optimale.
Ces données sont récupérées depuis le site web Intracursus ou GPU de l'Université Côte d'Azur et ne quittent pas votre appareil.
Ces données sont récupérées depuis le site web Intracursus ou ADE de l'Université Côte d'Azur et ne quittent pas votre appareil.
\
Les données de connexion sont **stockées sur votre appareil** et ne sont pas stockées sur un serveur (Seuls vos identifiants sont utilisés sur ```login.univ-cotedazur.fr``` afin de vous identifier et créer un token).
\
Expand Down Expand Up @@ -106,7 +106,7 @@ Toute utilisation de l'application UniceNotes est sous la seule responsabilité
Cette application agit comme un navigateur internet où l'utilisateur effectue des pseudos-requêtes (GET HTTPS) sur l'intranet de l'Université Côte d'Azur. Cette application ne contient aucun code malveillant et ne vise pas à nuire à l'Université Côte d'Azur ou à ses utilisateurs. Les éventuelles suspiscions de "fuites de données" sont infondées dûes à la nature de l'application (les données sont stockées sur l'appareil de l'utilisateur et non sur des serveurs tiers). Plus d'infos : [Voir la documentation](https://github.com/UniceApps/UniceAPIDocumentation).

## 🤝 Conditions d'utilisation :
En acceptant d'utiliser UniceNotes, **MetrixMedia** (l'entité représentant le développeur) se dégage de toute responsabilité émanant de l'utilisation d'UniceNotes. **Je** (l’utilisateur de l’application, le signataire du contrat actuel), suis responsable de mon compte UniCA (Université Côte d’Azur ou Sésame) et **j’accepte les risques associés à l’utilisation de l’application UniceNotes**.
[Consulter les conditions d'utilisation](https://notes.metrixmedia.fr/eula)

---
L'application UniceNotes utilise Expo, un framework basé sur React Native.
Expand Down
6 changes: 3 additions & 3 deletions app.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"expo": {
"name": "UniceNotes",
"slug": "unicenotes",
"version": "1.5.5",
"version": "1.5.6",
"githubUrl": "https://github.com/UniceApps/UniceNotes",
"orientation": "portrait",
"icon": "./assets/icon.png",
Expand All @@ -24,14 +24,14 @@
"CFBundleDevelopmentRegion": "fr"
},
"bundleIdentifier": "fr.hugofnm.unicenotes",
"buildNumber": "6.5.6",
"buildNumber": "6.6.3",
"config": {
"usesNonExemptEncryption": false
}
},
"android": {
"package": "fr.hugofnm.unicenotes",
"versionCode": 25
"versionCode": 27
},
"extra": {
"eas": {
Expand Down
Loading

0 comments on commit 0fd7d8f

Please sign in to comment.