Activity

Enrico Leandro

Hi y’all, I haven’t posted in a while.
This is me logging the previous updates to the app, since I forgot to post the devlog.
I’m going to resume development of the app today, as I took a small break to focus on school.

PWA updates

Now the PWA (and even the web version of the app itself), both work totally offline! You can load the webpage itself without any need for a network connection, and of course, all app’s data is already locally stored for reliable usage.
A new update is the PWA install prompt when first opening the website; Since iOS and Android have two different install approaches, the app shows a different prompt based on your OS:
Android allows “one-tap-installs”, as in, I can add an install button on my prompt to trigger the native popup, while iOS doesn’t, and you have to manually “Share > Add to home screen”.

Fixes & QOL improvements

I fixed a few bugs in the code, removed unused logs, changed the iOS icons to match the other platform ones (iOS was way larger, about 1.4x of the others), updated the build to add hashing packages, since I might add pin code for the devices that do not support biometric authentication for the app lock.
I tried restoring Expo Go support, for easy installation of the app, but it might not fully work yet.
As always, I optimized the app a little more, loading wise.

What about lesson schedules?

I’m still working on those. Server side should be done, I added a schedule load context, and I’m working on the actual schedule screens.
It won’t take too long to implement, but I am sure taking my time on it.

Attachment
Attachment
0
Enrico Leandro

PWA!

Now the web version is officially a PWA app, which means you can now technically run the app without even installing it, isn’t that nice?
Fun fact, at first the manifest file wasn’t working and I only later realized I put it in the images folder.. whoops
I don’t know about apple’s icon loading system tho, sometimes it loads properly, other times it just won’t. I’m going to think about that in the future.
After being motivated by a friend (he added it to his app and I… borrowed the idea), I worked a bit to add the open graph tags on the web version of the app. I didn’t do it earlier because the module that’s usually used to do it broke my native mobile app builds, which were more important to me. I managed to find a way to include it for web only.
Now you have a small banner and description in apps that support it!

Other small things

I fixed data reloading by adding new methods inside of the data contexts. I fixed various bugs in the app.

I also worked on the server-side part of the lesson schedulings. I’m taking way too long to continue this app, I’m gonna have to focus more!

Well, that’s all for today. Nice coding to you all!

Attachment
Attachment
0
Enrico Leandro

Server locales!

This took me way longer than it should have. I literally only added server locales with this update, which means now all API responses are translated, including the login email.
I had to install i18n and change all previously hard-coded responses to use that instead, and create the actual translations file.
I also copied the existant sync-locales script, that makes it easy to copy all new fields from one .json file to the other, and logging changes in the console, so everything is in sync!

Attachment
0
Enrico Leandro

Sorry for not having posted i guess, I was kind of tired.
Anyways, I have mostly worked on optimizations, I changed all data loadings to use contexts so all data instances are now shared, which means less load on the database. I still need to make the loading “lazy” so it only reloads on request, which does mean it’s still not a substantial optimization.
I also added a “resend otp” button in the login screen, and a text that allows identifying the right email when you’ve sent one too many: It generates an email ID based on the current timestamp, sending that ID together with the actual OTP code.
When you resend the email, a new text appears below the OTP code field, saying what email you should look for.
Also, now the app doesn’t hide the OTP field if you input a wrong otp, allowing you to retry entering the code without sending a new email.
I’m also working on server translations! I want to make standard errors appear in the app (only the ones I send as a response tho), and have emails sent accordingly to the user’s preferred language.

Attachment
0
Enrico Leandro

Notice response list

Teachers can now see all responses for a notice in the noticeboard!

Offline management

I updated the project to block any outgoing actions for synced classes while offline. Data reading is still possible if the data was loaded at least once, but creating new subjects/classes/lessons etc. is now blocked.
Offline class still has to be developed, currently it’s not possible to add any subjects.

Scheduled exams!

Development for scheduled exams is starting!
This is one of the features I’ve been waiting to develop the most: It was the sole reason why I started building the app in the first place!
For now, only a lessons page is displayed. If a lesson is a scheduled exam, you’ll see the Days card appear, with the labs screen.

Android previews are finally back!

For some reason my simulator had full storage so I couldn’t understand why development builds wouldn’t install. Android screenshots are now going to be included in future devlogs!

Server file upload support

I added file upload support in the server code: File size and uploads support is configurable.
If enabled, the server broadcasts upload support, enabling client-side uploads for documents. Files are paired to index on the main database. The actual file is saved with the server files, but it’s stored using the _id property from the file index, to block any injection attempts, and to mask file names from the server owner.
This does not mean files are 100% safe! If the server’s owner pairs the _id with the index, they can still find the original file name and extension, and load the file.
Avoid sending sensitive data!

What’s next?

Development for today hasn’t finished. I still have to actually finish working on scheduled exams, maybe resources, maybe grades. Main feature development is almost over, so in the near future updates will be QOL, optimizations, bug fixes & code reviews.

See you later tonight!

Attachment
Attachment
Attachment
0
Enrico Leandro

Today was feature day!
(And some optimizations too ^^)

Week schedule timeline!

It’s finally here! Now, you can add your week schedule to the app!
I implemented a timeline view, that autofills breaks based on time. It allows multiple subjects in the same period, and multiple instances of the same subject in different periods (for any weird need schools might have out there).
I also implemented the schedule period creation/edit/remove screen, of course.
Now, you can see what subjects you have scheduled for tomorrow in the home screen!

App Optimizations

Now, all screens share one class data instance, instead of reloading it every time a screen renders. This makes the app appear more uniform, so that all screens stay updated with the same data, to avoid inconsistencies.
Same thing was done for subject data. Screens that use different class objects weren’t updated.
I also disabled auto refreshing to have a smoother app experience.
Data types were updated, and unused imports were deleted from the code.

What’s next?

A few week schedule updates (like automatically picking lesson time, homework due date (time) if a subject’s schedule is already defined.
More things are coming!

Attachment
0
Enrico Leandro

Today (yesterday) was Network Optimizations day.
I didn’t have great internet, so I decided it was time to optimize my app for slow networks, and even offline usage.

Offline app usage

I added a network context to refresh and always try to connect to a list of servers, the fastest one to respond becomes the server used by the app. If it can’t find any, then the app can disable some features, or show no network alerts.
This, combined to local caching of previous network requests, means the app is now fully usable offline to read your registry’s data. I also plan to add a background sync to show the latest data even when offline.

What about slow networks?

I fixed all loading indicators so the user knows the app is actually working, and also changed the loading method to load smaller portions of data separately, for instance, the previous behaviour had the app loading the whole class data including subjects and similar, so network requests would be more heavy, but also more complete. Now, the app loads basic class data with a subject id array, which is used to estimate the number of subjects to load. Afterwards, it individually loads each subject’s info so it can cache it, and effectively load much faster.

Other small things

I changed communications to notice board, since that’s the right name for it.
Also, I added empty view texts (No lessons and similar), and no active class warns for every page (except for the profile page)

What’s next?

I still need to work on actual registry data such as grades, resources, week schedule and so on.

See you in the next devlog!

Attachment
1

Comments

Capy
Capy 20 days ago

😋

Enrico Leandro

Yesterday I didn’t post a devlog, so here we are!

I updated a few things, and started making optimizations for bigger screens (such as iPads).
I also added comunication responses, which can be either “accept/reject” or short messages.
I still have to code the logic for actually viewing the responses from the teacher side.

I’ve also added the support for app icon switching, which is paired to the theme you switch to!
Only some special themes have icons tho.. one is actually hidden in the app somewhere, which was implemented in memory of the predecessor of this app: the Exams app.
That app wasn’t and isn’t planned to go public, you need a pre-made account to join, and a user code. But it was the app I coded before School Manager, designed to help with scheduling exams.
Anyways, good luck finding the theme!
PS: Icon switching is only supported on Android and iOS native apps, so you’ll have to wait before seeing that.

Another thing I added were “Still Cooking” screens for undeveloped sections. This makes the app cleaner for users, instead of having screens that just say “This is the X screen.”

There’s still a lot of work to do, so until the next devlog!

Attachment
Attachment
Attachment
0
Enrico Leandro

Today was bug fixes, quality of life features and UI update day!
I fixed a few bugs server side and client side, and then added small changes such as the communication response pages (for both accept/deny and also message response types), and updated their UIs a couple times.
I also added support for additional complex themes such as the app gradient one!
I also implemented an app lock feature to keep your school data safe from intruders!! You can never be too sure O.O
Anyways, not much for today. Most time was spent screaming at react’s contexts, effects and states for not working, and all the weird errors it kept throwing at me for no reason at all.
Oh well, another day went by.
Until the next devlog!

Attachment
0
Enrico Leandro

Today was server day!
I spent HOURS reviewing the server code, to change how the app class logic works at it’s root.
Now, instead of checking if a user has the teacher flag, it instead looks only if the user is a teacher in the target class when updating.
The only place where a user actually has to be a teacher is when creating new classes.
Currently, all new users will temporarily be given the teacher flag (while in beta).
I also updated the other new components create/update/read/delete methods, so I can keep developing other new sections of the app.
Only client side update today were a few optimizations, such as the refresh control not reloading the entire view now, to improve app feel and “nativeness” i guess.
I also finally implemented the home screen view, that shows exams, lessons, homework for the next day, and upcoming exams for the following 3 days.
Strangely, I didn’t have any weird “computer wants to delete my work” kind of events today.
Well, we’ll meet with another devlog probably tomorrow!

Attachment
0
Enrico Leandro

Heya!
Today I coded a bit less, to work on the github page and project presentation.
I spent a lot of time on the readme file, to make the repo an open space, and to define a clear roadmap of the app, with all the major and minor milestones.
I also coded the calendar screen finally, I had to scream at useless documentations to understand how the react-native-calendars module worked. Oh well.
I also started working on the home screen but I’m too tired to actually finish it today.
Feel free to check out the github page of the project, maybe share some ideas!

Attachment
Attachment
0
Enrico Leandro

It was finally time for debugging and optimizations.
The app is still not complete, but if I keep leaving things unoptimized, who’s gonna fix the countless issues on shipping day?

I did a lot of work today. I fixed some refreshing issues I had with the app, where data would just vanish client-side, and refreshes didn’t work properly.

I’m also learning how to actually use react’s components properly! It’s a lot different from what I’m used to so I’m happy to finally understand it.

I updated the theme settings so it actually refreshes without app restart (which was incredibly difficult to do for some reason), optimized data calls with contexts, fixed most warnings (if not all!) that I got while using the app, a few quality of life features such as clicking an alert’s background to dismiss it, string length limits, a few style changes, placeholders, and I actually fixed the web app so I can finally deploy it for anyone to easily test!
I did have to clone the alerts object to actually make it work in logins tho, as those were modals.. whoops

I also had to rewrite most of the setup logic to actually make the keyboard avoiding views work properly.. react is painful
I’ll probably ship an alpha version of the app really soon, for anyone to test, and then reship with major updates.

Since today’s changes were mostly bug fixes, I don’t really have screenshots to post, except for the homework page which I didn’t upload yet. So I’ll do that today.

See y’all in the next devlog!

Attachment
0
Enrico Leandro

Sadly, today I wasn’t able to code much, yesterday i skipped the devlog since I didn’t manage to complete what I was doing.
Anyways, I coded lesson create and listing methods, same thing for homework.
Creating those was WAY harder than it should’ve been. I had to face differences between iOS and Android’s native pickers, and code differently for both.
I also had a weird issue, my computer just casually decided my project had to die, and started erasing files from it. Thankfully I reacted fast enough to unlink it from icloud, and copy the gitignored files to somewhere safe, fixed icloud sync and then downloading the files from the most recent github commit (which thankfully had everything)
I have a few bug fixes to do, and definitely some UI revisions, but with every day that passes my app gets closer for it’s first beta distribution.
Happy coding to everyone once again!

Attachment
Attachment
0
Enrico Leandro

Today was a very productive day, even if I mainly developed secondary features instead of primary ones.
I managed to add custom alerts, instead of using the native ones, as those weren’t compatible for all platforms, blocking me from using my app in desktop or restricted browser environments.
The buttons are customizable, and it supports custom components (example usage, the invite code for classes).
Also, about that, I also added subject creation support in the app, which was the next small step before reaching the actual important stuff: homework, grades, lessons, exams, and so on.
Nothing special, but still worthy of mentioning.
Lastly, one of the things that took me the longest…. TRANSLATIONS 🤮
I added italian support to the app thanks to i18n, but it was a huge pain to rewrite all of the components to use the module’s render function, and it was even worse to actually write the JSON files, it took me two hours!
(it also took me that long because I used the wrong format and had to write it all from scratch… but we don’t talk about that)
Regardless, now the supports other languages and translations!
I can’t wait to continue coding tomorrow. Cheers everyone!

Attachment
Attachment
Attachment
0
Enrico Leandro

Today I’ve coded a little bit more. I managed to do a huge part of the app, by adding class creation logic and invites (invites are small codes in this format: XXXX-XXXX-XXXX, that allow you to join a class, as a teacher or a student. They can only be created by teachers, and they’re the ones to configure whether the invite is going to let you join as a teacher or a student.)
To join as a teacher, your account account also needs to be flagged as a teacher account, so you can’t share a teacher invite code to a student, as it won’t work. Invites expire after a month.
I created 2 different user accounts to check if data sync worked fine, and to see if invites were also working, which they were!
I somehow predicted the invite acceptation logic by only needing an inviteData.save() function, so I saved myself some extra work.
I am probably halfway done with the app, I only need to add subject and other data creation logic, since data sync is already running.
I am also a bit worried about offline usage, but that’s a problem for another day.
Xarber out!

Attachment
1

Comments

Capy
Capy about 1 month ago

Looking amazing! :)

Enrico Leandro

I created my app with react native, using the expo framework for easier shipping, thanks to EAS.
This was actually a project i had in mind a long while ago, but I never actually started developing it before a couple weeks ago.
This started because of a need of decent school exam management for us students in my classroom, so I developed a small PHP app, but I wanted to share this idea with the world, and so I made a full native app.
My goal is to ship an app that’s reliable even when you’re offline, and can help students manage their school life, possibly with on-device LLM tips and more.
The hardest thing until now was understanding the challenges behind react’s logic, with useEffect, useState, and all the hooks and component limitations.
Of course, integrating a database was also kind of difficult, but I managed to create all the data types and a function to sync the data.
The frontend part is still not complete, a few pages are missing, mainly the subpages such as settings, profile page, etc, but account data sync works.
I used a passwordless approach, sending an OTP code on login, and determining if a user is new to the app or not when creating a token, to make the login feel seamless.
I want the app to be fully usable even without an account, as users shouldn’t feel forced to create one, wherever that’s possible.
I still have a bit of work to do, but the app is coming out nice, and I hope I’ll be able to make students (and teachers)’s lives a little easier with my app.
It will be shipped to app stores, hoping apple decides to allow my app on their part.
With that said, happy coding to everyone!

Attachment
0