# Incomplete Analysis and Observation Report of LPUTouch v22.90 ## Barcode scanner files There is an excess of folders in `assets\` starting with `html-*\`, all of which, relate to the barcode scanner. Looks like someone cloned the repo and left it in. Has no functionality. ### Suggestion Delete all folders with regex `assets\html.*` ## Token Generation ```js ngOnInit() { this.localStorage.getUserType().then(e => { this.usertype = e; this.localStorage.getUserId().then(o => { this.userid = o; this.localStorage.getDeviceId().then(i => { this.deviceid = i; this.localStorage.getTokenId().then(s => { this.token = s; this.localStorage.getPassword().then(r => { this.ptest = r; this.localStorage.getplatform().then(g => { this.plat = g; this.token_new(); this.getVersion(); }); }); }); }); }); }); ..... token_new() { this.webServices.createToken({ userName: this.userid, password: this.ptest }).subscribe({ next: o => { this.next = "Bearer " + o.token; this.localStorage.setTokenIdE(this.next); this.getYouDost(); this.webServices.setCounts(this.lat, this.lng, this.usertype, this.userid, this.deviceid, this.token); }, error: o => { this.webServices.setCounts(this.lat, this.lng, this.usertype, this.userid, this.deviceid, this.token); } }); } ``` APP STORES YOUR USERNAME AND PASSWORD IN PLAINTEXT. uses it to generate a token. On every fucking app open. Logic makes no sense. Get UserID->DeviceID->TokenID->Password->Platform. Then use password to generate token. Why not just store the token and refresh it when it expires? Why the hell do you need the password? Using pin generates a `ntoken`. Then the dashboard checks if `token` exists? Then the dashboard generates a new `token`??? Why????? ### Suggestion ## Duplicate profile image getbasicstudentinfo has a base64 encoded image as well as a separate image url. Someplaces b64 is used, others, the powerbi url is used. ### Suggestion Use only powerbi url. It is more efficient and faster to load than the base64 image. Also allows the data to load faster while lazy loading the image. ## JWT Token Expiry You generate a JWT token like 5 million times a day. This creates multiple tokens for the same user. Like genuinely 100 tokens for the same user. The best part? THE TOKEN IS VALID FOR 3 MONTHS. WHY? Are we deadass bruh. ### Suggestion Either expire tokens when a new one is generated or reduce the expiry time to like 1 hour. Generating 100 tokens per day is cancer on the whole system. ## Pin System Pin system is completely client sided. Easily bypassable if you know what you're doing. Also allthat with the token generation bs. ## Menu and Dashboard The menu is refreshed literally every time it is opened. The dashboard does the same thing. This is a huge performance issue and can be easily optimized. Easily optimized because YOU LITERALLY CACHE THE DATA IN THE APP. ### Suggestion Cache the menu and dashboard data and only refresh it when 1. User performs a pull to refresh action 2. User logs in (Dashboard only) 3. Last cache update was more than an n days ago (Menu only) Let the cached data be shown when the user opens the menu/dashboard. This will significantly improve performance and reduce unnecessary API calls. While that happens, refresh the data in the background and update the UI when the new data is available. This will create a much smoother user experience. The menu doesnt need to be updated every time it is opened as the options rarely ever change/update. Preferably 7 days. ## Popups My brother in christ, you have more popups in this app than a fucking casino. Get rid of them. Teacher feedback, mess feedback, class feedback, version update, old version warning yada yada. Its so bad that you have to click through 3 popups just to get to the dashboard. AND THEY LOAD SLOW AF. ### Suggestion Implement a notification system in the app, maybe next to my messages or something. Keep critical stuff like version updates or whatever else as persistent notifications. Make the feedback stuff as notifications as well. I guarentee you 98% of the users don't even remember that the popup is for feedback. We just close it without reading shi. ## Timetable Timetable has some minor issues. Numbering makes 1pm classes display before 9am classes. I do like that you fetch the current day timetable along with the dashboard data. But, 1. That doesn't include makeup classes. 2. Makeup classes don't show up in the day's timetable. You scroll to the end of the days to see dates with makeup classes. This is a very bad UX. ### Suggestion 1. Change the numbering system to something more logical. Maybe use 24hr format or consider am/pm or something. 2. This might be backend issue tbh. ## Mymessages mymessages PLEASE PLEASE PLEASE DO SOMETHING ABOUT MYMESSAGES. It's so bad. It's just a list of messages with no grouping or organization. The search is as bad as it can get. Have categories. Have tabs. Have something. Anything. Especially as a 4th year student, I have 1000+ messages and searching for a specific message is a nightmare. There are so many messages about "so and so company is coming for placements" and "placement drive on this date" that I have to scroll through 100 messages just to find the one message about "you have been shortlisted". Please do something about it. Maybe have a separate tab for placement related messages or something. Anything to make it easier to find important messages. (My messages went up to 152 while typing this lol) ## Notifications I dont think I've ever recieved a single notification from this app. ## QOL 1. Add teacher on leave to the timetable. Maybe show them in red or something. This will help students know which teachers are on leave and which ones are not. 2. Older versions used to allow swiping on the timetable to switch between days. This was a very good feature and it is missing in the new version. It's quite easy to implement and it improves the user experience significantly. Please bring it back. 3. dark mode pls owo. base it on system theme with a toggle. 4. Add a preferences/settings page. This can include stuff like notification preferences, theme preferences, etc. This will give users more control over their app experience and allow them to customize it to their liking.