{"id":119,"date":"2026-07-28T10:20:06","date_gmt":"2026-07-28T10:20:06","guid":{"rendered":"https:\/\/demensdeum.com\/blog\/2026\/07\/28\/mama-calendar\/"},"modified":"2026-07-28T10:20:06","modified_gmt":"2026-07-28T10:20:06","slug":"mama-calendar","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/fr\/2026\/07\/28\/mama-calendar\/","title":{"rendered":"Mama Calendar &#8211; application de rappel multiplateforme"},"content":{"rendered":"<p>Mama Calendar est une application d&#8217;\u00e9v\u00e9nements et de rappels multiplateforme \u00e9crite en React Native (Expo) avec deux impl\u00e9mentations backend : Node.js + MongoDB et PHP + MariaDB.<\/p>\n<p>L&#8217;application vous permet de cr\u00e9er des \u00e9v\u00e9nements avec cat\u00e9gorisation emoji, de s\u00e9lectionner le type de r\u00e9p\u00e9tition (une fois, annuellement, mensuellement, hebdomadairement, quotidiennement) et de visualiser les \u00e9v\u00e9nements importants des 3 prochains jours dans un onglet \u00ab \u00c9v\u00e9nements importants \u00bb s\u00e9par\u00e9.<\/p>\n<h2>Pile technologique<\/h2>\n<p>Le frontend est \u00e9crit en React Native 0.86 via Expo SDK 57 avec TypeScript, Expo Router pour la navigation et <code>react-native-reanimated<\/code> pour les animations. Les symboles d&#8217;exposition sont utilis\u00e9s pour les ic\u00f4nes (symboles SF sur iOS, ic\u00f4nes mat\u00e9rielles sur Android\/Web).<\/p>\n<p>Le backend est impl\u00e9ment\u00e9 en deux versions\u00a0:<\/p>\n<ul>\n<li><b>Node.js\u00a0:<\/b> Express 4, MongoDB 8 via driver natif, authentification personnalis\u00e9e avec scrypt + salt, gestion manuelle des tokens. Docker Compose affiche le client (nginx), le serveur et MongoDB.<\/li>\n<li><b>PHP\u00a0:<\/b> PHP 8.2 sans frameworks, PDO + MariaDB 11, bcrypt pour le hachage de mot de passe, votre propre routeur et chargement automatique PSR-4 via Composer.<\/li>\n<\/ul>\n<h2>Fonctions applicatives<\/h2>\n<ul>\n<li><b>Enregistrement et autorisation\u00a0:<\/b> syst\u00e8me simple avec nom d&#8217;utilisateur\/mot de passe et jetons du porteur<\/li>\n<li><b>\u00c9v\u00e9nements CRUD\u00a0:<\/b> cr\u00e9ez, affichez, modifiez et supprimez des \u00e9v\u00e9nements avec date, emoji et type de r\u00e9p\u00e9tition<\/li>\n<li><b>Filtrage intelligent\u00a0:<\/b> l&#8217;onglet \u00c9v\u00e9nements importants affiche les \u00e9v\u00e9nements des trois prochains jours, en tenant compte des r\u00e8gles de r\u00e9p\u00e9tition. Par exemple, les \u00e9v\u00e9nements annuels affichent l&#8217;occurrence annuelle la plus proche, mensuellement\u00a0&#8211; par jour du mois, hebdomadairement\u00a0&#8211; par jour de la semaine.<\/li>\n<li><b>S\u00e9lecteur d&#8217;emoji\u00a0:<\/b> 20 emoji pr\u00e9d\u00e9finis pour une cat\u00e9gorisation rapide des \u00e9v\u00e9nements<\/li>\n<li><b>Mise en surbrillance des \u00e9v\u00e9nements d&#8217;aujourd&#8217;hui\u00a0:<\/b> les \u00e9v\u00e9nements d&#8217;aujourd&#8217;hui sont mis en \u00e9vidence sur un fond rouge (#B71C1C)<\/li>\n<li><b>Th\u00e8me sombre\u00a0:<\/b> D\u00e9tection automatique du jeu de couleurs du syst\u00e8me avec des palettes s\u00e9par\u00e9es pour le th\u00e8me clair et sombre<\/li>\n<li><b>Internationalisation\u00a0:<\/b> Langues russe et anglaise via React Context<\/li>\n<li><b>\u0410\u043d\u0438\u043c\u0430\u0446\u0438\u0438:<\/b> \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u043b\u044d\u0448-\u0441\u043a\u0440\u0438\u043d \u0441 Keyframe API \u0438 \u0443\u043f\u0440\u0443\u0433\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u0435\u0439, \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0438\u043a\u043e\u043d\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u043c\u0441\u044f \u0441\u0432\u0435\u0447\u0435\u043d\u0438\u0435\u043c<\/li>\n<li><b>Points de terminaison d&#8217;administration\u00a0:<\/b> gestion des utilisateurs, des jetons et effacement de la base de donn\u00e9es via les jetons principaux<\/li>\n<\/ul>\n<h2>Pourquoi deux impl\u00e9mentations backend\u00a0?<\/h2>\n<p>La version Node.js est la principale, mais la version PHP existe comme alternative \u00e0 un h\u00e9bergement plus classique. L&#8217;API est totalement identique, ce qui permet de basculer entre elles sans changer le code client.<\/p>\n<h2>Infrastructures<\/h2>\n<p>L&#8217;ensemble de la pile est g\u00e9n\u00e9r\u00e9 via Docker Compose\u00a0: le client est assembl\u00e9 via une construction en plusieurs \u00e9tapes (Expo export \u2192 nginx alpine), un serveur sur Node.js, MongoDB 8. Pour la version PHP, il existe un fichier de composition s\u00e9par\u00e9 avec MariaDB 11 et phpunit pour les tests.<\/p>\n<p>L&#8217;assemblage de la version Web est automatis\u00e9 par un script PowerShell qui corrige l&#8217;API_URL avant l&#8217;<code>expo export<\/code> et restaure les originaux apr\u00e8s.<\/p>\n<h2>Sortie<\/h2>\n<p>Mama Calendar est une application multiplateforme compl\u00e8te qui couvre le cycle complet : depuis l&#8217;interface mobile et Web sur React Native jusqu&#8217;\u00e0 deux options c\u00f4t\u00e9 serveur. Le projet est int\u00e9ressant pour son architecture, l&#8217;utilisation des capacit\u00e9s modernes du SDK Expo et la mise en \u0153uvre d&#8217;un double backend.<\/p>\n<h2>Liens<\/h2>\n<p><a href=\"https:\/\/github.com\/zefir1990\/Mama-Calendar\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/zefir1990\/Mama-Calendar<\/a><br \/>\n<a href=\"https:\/\/demensdeum.com\/software\/mama-calendar\/events\" rel=\"noopener\" target=\"_blank\">https:\/\/demensdeum.com\/software\/mama-calendar\/events<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mama Calendar est une application d&#8217;\u00e9v\u00e9nements et de rappels multiplateforme \u00e9crite en React Native (Expo) avec deux impl\u00e9mentations backend : Node.js + MongoDB et PHP + MariaDB. L&#8217;application vous permet de cr\u00e9er des \u00e9v\u00e9nements avec cat\u00e9gorisation emoji, de s\u00e9lectionner le type de r\u00e9p\u00e9tition (une fois, annuellement, mensuellement, hebdomadairement, quotidiennement) et de visualiser les \u00e9v\u00e9nements importants [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-119","post","type-post","status-publish","format-standard","hentry","category-software"],"translation":{"provider":"WPGlobus","version":"3.0.3","language":"fr","enabled_languages":["en","ru","zh","de","ja","fr","es","pt","hi"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"ru":{"title":true,"content":true,"excerpt":false},"zh":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false},"ja":{"title":true,"content":true,"excerpt":false},"fr":{"title":true,"content":true,"excerpt":false},"es":{"title":false,"content":false,"excerpt":false},"pt":{"title":true,"content":true,"excerpt":false},"hi":{"title":true,"content":true,"excerpt":false}}},"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/119","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/comments?post=119"}],"version-history":[{"count":0,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/119\/revisions"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/media?parent=119"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/categories?post=119"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/tags?post=119"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}