Compare commits

...

6 commits

Author SHA1 Message Date
keplyx
97d84d92f5 Prevent unselecting machine reminder value 2020-03-08 13:57:09 +01:00
keplyx
a9fcbfe719 Merge branch 'april-fools' into dev 2020-03-08 13:53:58 +01:00
keplyx
bcdd1f9875 Moved custom theme in AprilFoolsManager.js 2020-03-08 13:29:43 +01:00
keplyx
52131ac401 Fixed crash 2020-03-08 13:26:14 +01:00
keplyx
c555aabd5a Show intro slider on first start for april fools 2020-03-08 13:21:14 +01:00
keplyx
9e90c9d8f3 Added basic april fools functionality 2020-03-08 12:50:18 +01:00
10 changed files with 161 additions and 30 deletions

17
App.js
View file

@ -12,6 +12,7 @@ import {createStackNavigator} from '@react-navigation/stack';
import DrawerNavigator from './navigation/DrawerNavigator';
import NotificationsManager from "./utils/NotificationsManager";
import {Provider as PaperProvider} from 'react-native-paper';
import AprilFoolsManager from "./utils/AprilFoolsManager";
type Props = {};
@ -19,6 +20,7 @@ type State = {
isLoading: boolean,
showIntro: boolean,
showUpdate: boolean,
showAprilFools: boolean,
currentTheme: ?Object,
};
@ -30,6 +32,7 @@ export default class App extends React.Component<Props, State> {
isLoading: true,
showIntro: true,
showUpdate: true,
showAprilFools: false,
currentTheme: null,
};
@ -68,9 +71,11 @@ export default class App extends React.Component<Props, State> {
this.setState({
showIntro: false,
showUpdate: false,
showAprilFools: false,
});
AsyncStorageManager.getInstance().savePref(AsyncStorageManager.getInstance().preferences.showIntro.key, '0');
AsyncStorageManager.getInstance().savePref(AsyncStorageManager.getInstance().preferences.showUpdate5.key, '0');
AsyncStorageManager.getInstance().savePref(AsyncStorageManager.getInstance().preferences.showAprilFoolsStart.key, '0');
}
async componentDidMount() {
@ -96,7 +101,8 @@ export default class App extends React.Component<Props, State> {
isLoading: false,
currentTheme: ThemeManager.getCurrentTheme(),
showIntro: AsyncStorageManager.getInstance().preferences.showIntro.current === '1',
showUpdate: AsyncStorageManager.getInstance().preferences.showUpdate5.current === '1'
showUpdate: AsyncStorageManager.getInstance().preferences.showUpdate5.current === '1',
showAprilFools: AprilFoolsManager.getInstance().isAprilFoolsEnabled() && AsyncStorageManager.getInstance().preferences.showAprilFoolsStart.current === '1',
});
// Status bar goes dark if set too fast
setTimeout(this.setupStatusBar, 1000);
@ -109,9 +115,12 @@ export default class App extends React.Component<Props, State> {
render() {
if (this.state.isLoading) {
return null;
} else if (this.state.showIntro || this.state.showUpdate) {
return <CustomIntroSlider onDone={this.onIntroDone}
isUpdate={this.state.showUpdate && !this.state.showIntro}/>;
} else if (this.state.showIntro || this.state.showUpdate || this.state.showAprilFools) {
return <CustomIntroSlider
onDone={this.onIntroDone}
isUpdate={this.state.showUpdate && !this.state.showIntro}
isAprilFools={this.state.showAprilFools && !this.state.showIntro}
/>;
} else {
return (

View file

@ -39,13 +39,15 @@ const styles = StyleSheet.create({
type Props = {
onDone: Function,
isUpdate: boolean
isUpdate: boolean,
isAprilFools: boolean,
};
export default class CustomIntroSlider extends React.Component<Props> {
introSlides: Array<Object>;
updateSlides: Array<Object>;
aprilFoolsSlides: Array<Object>;
constructor() {
super();
@ -108,7 +110,16 @@ export default class CustomIntroSlider extends React.Component<Props> {
icon: 'email',
colors: ['#e01928', '#be1522'],
},
]
];
this.aprilFoolsSlides = [
{
key: '1',
title: i18n.t('intro.aprilFoolsSlide.title'),
text: i18n.t('intro.aprilFoolsSlide.text'),
icon: 'information',
colors: ['#e01928', '#be1522'],
},
];
}
@ -144,10 +155,15 @@ export default class CustomIntroSlider extends React.Component<Props> {
}
render() {
let slides = this.introSlides;
if (this.props.isUpdate)
slides = this.updateSlides;
else if (this.props.isAprilFools)
slides = this.aprilFoolsSlides;
return (
<AppIntroSlider
renderItem={CustomIntroSlider.getIntroRenderItem}
slides={this.props.isUpdate ? this.updateSlides : this.introSlides}
slides={slides}
onDone={this.props.onDone}
bottomButton
showSkipButton

View file

@ -8,6 +8,7 @@ import WebDataManager from "../utils/WebDataManager";
import PlanningEventManager from '../utils/PlanningEventManager';
import {Avatar, Divider, List} from 'react-native-paper';
import CustomAgenda from "../components/CustomAgenda";
import AprilFoolsManager from "../utils/AprilFoolsManager";
LocaleConfig.locales['fr'] = {
monthNames: ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'],
@ -209,6 +210,8 @@ export default class PlanningScreen extends React.Component<Props, State> {
this.pushEventInOrder(agendaItems, eventList[i], PlanningEventManager.getEventStartDate(eventList[i]));
}
}
if (AprilFoolsManager.getInstance().isAprilFoolsEnabled())
agendaItems["2020-04-01"].push(AprilFoolsManager.getFakeEvent());
this.setState({agendaItems: agendaItems})
}

View file

@ -5,7 +5,8 @@ import {View} from 'react-native';
import ThemeManager from "../utils/ThemeManager";
import i18n from "i18n-js";
import WebSectionList from "../components/WebSectionList";
import {Card, Text, Title} from 'react-native-paper';
import {Card, Text} from 'react-native-paper';
import AprilFoolsManager from "../utils/AprilFoolsManager";
const DATA_URL = "https://etud.insa-toulouse.fr/~amicale_app/menu/menu_data.json";
@ -72,6 +73,8 @@ export default class SelfMenuScreen extends React.Component<Props> {
}
];
}
if (AprilFoolsManager.getInstance().isAprilFoolsEnabled() && fetchedData.length > 0)
fetchedData[0].meal[0].foodcategory = AprilFoolsManager.getFakeMenuItem(fetchedData[0].meal[0].foodcategory);
// fetched data is an array here
for (let i = 0; i < fetchedData.length; i++) {
result.push(
@ -125,18 +128,18 @@ export default class SelfMenuScreen extends React.Component<Props> {
flex: 0,
margin: 10,
}}>
<Card.Title
title={item.name}
/>
<View style={{
width: '80%',
marginLeft: 'auto',
marginRight: 'auto',
borderBottomWidth: 1,
borderBottomColor: ThemeManager.getCurrentThemeVariables().primary,
marginTop: 10,
marginBottom: 5,
}}/>
<Card.Title
title={item.name}
/>
<View style={{
width: '80%',
marginLeft: 'auto',
marginRight: 'auto',
borderBottomWidth: 1,
borderBottomColor: ThemeManager.getCurrentThemeVariables().primary,
marginTop: 10,
marginBottom: 5,
}}/>
<Card.Content>
{item.dishes.map((object) =>
<View>

View file

@ -45,15 +45,17 @@ export default class SettingsScreen extends React.Component<Props, State> {
* @param value The value to store
*/
onProxiwashNotifPickerValueChange(value: string) {
let key = AsyncStorageManager.getInstance().preferences.proxiwashNotifications.key;
AsyncStorageManager.getInstance().savePref(key, value);
this.setState({
proxiwashNotifPickerSelected: value
});
let intVal = 0;
if (value !== 'never')
intVal = parseInt(value);
NotificationsManager.setMachineReminderNotificationTime(intVal);
if (value != null) {
let key = AsyncStorageManager.getInstance().preferences.proxiwashNotifications.key;
AsyncStorageManager.getInstance().savePref(key, value);
this.setState({
proxiwashNotifPickerSelected: value
});
let intVal = 0;
if (value !== 'never')
intVal = parseInt(value);
NotificationsManager.setMachineReminderNotificationTime(intVal);
}
}
/**

View file

@ -52,6 +52,10 @@
"title": "New in this update!",
"text": "Never miss an email anymore! Acces your INSA webmail from the app using the left menu.\nPlanex has also seen some improvements!\n\nSome of your remarks where taken into account for this update, more to come.\nThanks for your feedback on the survey! "
},
"aprilFoolsSlide": {
"title": "New in this update!",
"text": "We heard you, you don't like the new design and colors, so we changed them!\nLove."
},
"buttons": {
"next": "Next",
"skip": "Skip",

View file

@ -52,6 +52,10 @@
"title": "Nouveau dans cette mise à jour !",
"text": "Ne ratez plus jamais un email ! Accédez à vos mails INSA depuis le menu à gauche.\nPlanex a aussi été un peu amélioré !\n\nUne partie de vos remarques ont été prises en compte pour cette mise à jour, d'autres sont à venir.\nMerci pour votre retour lors du sondage !"
},
"aprilFoolsSlide": {
"title": "Nouveau dans cette mise à jour !",
"text": "Nous vous avons entendu, vous n'aimez pas le nouveau design et couleurs, alors on les as changés !\nLa bise."
},
"buttons": {
"next": "Suivant",
"skip": "Passer",

View file

@ -0,0 +1,77 @@
// @flow
/**
* Singleton class used to manage themes
*/
export default class AprilFoolsManager {
static instance: AprilFoolsManager | null = null;
aprilFoolsEnabled: boolean;
constructor() {
let today = new Date();
this.aprilFoolsEnabled = (today.getDate() === 1 && today.getMonth() === 3);
}
/**
* Get this class instance or create one if none is found
* @returns {ThemeManager}
*/
static getInstance(): AprilFoolsManager {
return AprilFoolsManager.instance === null ?
AprilFoolsManager.instance = new AprilFoolsManager() :
AprilFoolsManager.instance;
}
static getFakeEvent() {
return {
category_id: 1,
club: "Coucou",
date_begin: "2020-04-01 20:30:00",
date_end: "2020-04-01 23:59:00",
description: "Trop génial",
id: "-1",
logo: null,
title: "Super event trop whoaou",
url: null
};
}
static getFakeMenuItem(menu: Object) {
if (menu[1]["dishes"].length >= 3) {
menu[1]["dishes"].splice(0, 0, {name: "Truc à la con"});
menu[1]["dishes"].splice(2, 0, {name: "Autre truc à la con"});
} else {
menu[1]["dishes"].push({name: "Truc à la con"});
menu[1]["dishes"].push({name: "Autre truc à la con"});
}
return menu;
}
static getAprilFoolsTheme(currentTheme : Object) {
return {
...currentTheme,
colors: {
...currentTheme.colors,
primary: '#bebe03',
accent: '#bebe03',
background: '#5b3e02',
tabBackground: "#5b3e02",
card: "#5b3e02",
surface: "#5b3e02",
dividerBackground: '#362201',
textDisabled: '#b9b9b9',
// Calendar/Agenda
agendaBackgroundColor: '#5b3e02',
agendaDayTextColor: '#6d6d6d',
},
};
}
isAprilFoolsEnabled() {
return this.aprilFoolsEnabled;
}
};

View file

@ -74,6 +74,11 @@ export default class AsyncStorageManager {
default: '1',
current: '',
},
showAprilFoolsStart: {
key: 'showAprilFoolsStart',
default: '1',
current: '',
},
};
/**

View file

@ -1,8 +1,9 @@
// @flow
import AsyncStorageManager from "./AsyncStorageManager";
// import {DarkTheme as NavDarkTheme, DefaultTheme as NavDefaultTheme} from '@react-navigation/native';
import {DarkTheme, DefaultTheme} from 'react-native-paper';
import AprilFoolsManager from "./AprilFoolsManager";
/**
* Singleton class used to manage themes
*/
@ -114,6 +115,13 @@ export default class ThemeManager {
* @returns {Object}
*/
static getCurrentTheme(): Object {
if (AprilFoolsManager.getInstance().isAprilFoolsEnabled())
return AprilFoolsManager.getAprilFoolsTheme(ThemeManager.getBaseTheme());
else
return ThemeManager.getBaseTheme()
}
static getBaseTheme() {
if (ThemeManager.getNightMode())
return ThemeManager.getDarkTheme();
else