From 68dded731da8168dddc2949f495f1647a661f159 Mon Sep 17 00:00:00 2001 From: Jason Park <93040528+JasonNotJson@users.noreply.github.com> Date: Sat, 7 Oct 2023 00:58:27 +0900 Subject: [PATCH] feat: forum threads notification (#474) * fix(deps): update dependency @aws-amplify/auth to v4 (#352) Co-authored-by: Renovate Bot * Feature: Added Dark theme (#365) * Theme provider to Syllabus & context to containers * Add context on components in Syllabus which may require fix for dark mode * feat: replace @reach/router to react-router v6 * feat: update header for all apps * fix: reinstall react-router-dom v6 and history after rebase * feat: add new themes * fix: lock files * feat: install TailwindCSS on Campus * feat: install TailwindCSS on Syllabus * feat: change theme-toggle color according to current theme * fix: change locations of tailwind import; remove unused log * feat: dark theme on Timetable * Feat: Added new sidebar icons from material ui icons * Feat: Separated icons into different component * fix: added package json and pnpm lock updates * feat: pass isDark property to styled components * feat: dark theme on Syllabus (CourseItem not yet) * fix: wrap ThemeProvider on Nav; use new theme colors * fix: use className instead of passing theme as props * feat: dark theme on CourseInfo (not completed) * fix: Made theme types exportable * fix: created sidebar wrapper locally instead of bit * fix: Fixed styling of icon group button * feat: added user profile icon * feat: Added dark mode styling to other links * fix: moved browser router wrapper outside to fix navigation * fix: used const instead of let for navigation hook * fix: fixed import order * feat: CourseInfo dark mode * feat: Made title logo svg into a component * fix: made title logo text colour change when theme toggle * fix: fixed extra stylings when dark mode * fix: updated package versions and pnpm lock file * feat: update loading-spinner & solve background color flicker while loading page in dark mode * feat: added dark mode styling to about us pages * feat: added dark mode styling to extra pages * feat: dark theme to mobile bottom nav * feat: update header & loading-spinner & body tag background color * feat: added dark mode background * fix: fixed title logo on sidebar not changing colours when switching modes * fix: added tab colours when dark mode * fix: added dark mode colours to partner page text * feat: dark mode for Labs * fix: related courses width * feat: update spinner in Syllabus; dark mode for Campus * fix: timetable course item scrollable space height * feat: make timetable course item darker in dark mode * feat: install tailwind in feeds (not used yet) * feat: redirecting page styling * feat: update sign in modal * feat: updated header component and pnpm lock file accordingly * fix: updated colors and header dependencies * fix: eslint fixes for campus folder * feat: added dark mode styling to campus folder * fix: eslint fixes in syllabus folder * fix: updated dark mode styling * fix: updated dark mode syllabus * fix: updated dark mode styling root folder * fix: syllabus border & step arrow color * fix: fixed styling for social media icons in partners * fix: removed unused imports * fix: Or-button dark mode color * fix: remove FilterWarningsPlugin * fix: update lock files * fix: remove -y option * fix: update lock files * fix: update @aws-amplify/auth in syllabus * fix: update loading spinner in Feeds * fix: add theme prop to LoadingSpinner in Feeds Co-authored-by: YHhaoareyou * fix: clear search keywords when onclick related courses * Debug: mobile dark mode debug (#373) * feat: dark mode & new messages on welcome modal * fix: dark mode on sign in modal & user login icon * chore(deps): update dependency eslint-plugin-react to v7.29.4 (#361) Co-authored-by: Renovate Bot * chore(deps): update dependency ts-loader to v9.2.8 (#359) Co-authored-by: Renovate Bot * feat: remove unused dependencies (#377) * Feature/darktheme colors (#378) * feat: added quarterColors for both light and dark mode * feat: Added google analytics to theme changes * fix: fixed user profile icon to make it consistent * fix: code refactoring * fix: code refactoring in syllabus * feat: added dark semantic colors * fix: added colors based on numbers too * fix: added a todo comment * fix: fix semantic text colors dark mode * feat: update quarter switch colors & icons * feat: update timetable course items and color selector with new theme colors Co-authored-by: Nicholas Narmada * Feature: Timetable dark theme (#379) * feat: Dark mode for pro tips and colors selector popup in Timetable * feat: update theme colors dependency for all apps * feat: add the hovering effect to the member cards (#381) * feat: update the hovering effect for member cards * fix: remove unused libraries; fix html background color in dark mode; disable card's hyperlink * fix: makes the code shorter and neater * fix: syllabus pnpm lock file * fix: syllabus pnpm lock file Co-authored-by: YHhaoareyou * Migrate from Webpack to Vite (#382) * feat: vite tested by career folder * feat: replace systemjs import with dynamic import to import vite project * feat: ignore dynamic import problem caused by webpack * feat: Migrate Campus from Webpack to Vite * fix: restore career * feat: register vite app campus by single-spa-layout * feat: migrate Syllabus to vite (error unsolved) * fix: fix lockfile * fix: solve "exportStar not a function", "undefined global" and use Vite envvar * feat: migrate syllabus to vite (done) * remove webpack from all apps except root * feat: migrate root to vite * feat: remove webpack related scripts & solve import-map not supported problem in Safari * feat: import static assets; solve errors of custom props passed to dom * fix: run eslint fix * fix: build script & config * feat: build config & debug global var * fix: output asset files path * feat: disable css code split in build * fix: run eslint fix * feat: preload css from mf apps to root; replace react-s-alert with react-toastify * feat: configure public path & env var for each app * fix: run eslint fix * feat: service-worker * fix: eslint fix * update lock files * fix: missing package * fix: externalize styles from other mf app * fix: campus room badge styles Co-authored-by: AustinZhu * fix: env without using dotenv explicitly (#385) * fix: packages version * fix: change env var name * fix: remove systemjs package; add peer dependencies * fix: feeds domain on staging/prod * Feature: About Us page link from Home page & split Home from Root-config (#387) * fix: remove custom sw * feat: add link to aboutus page from home * fix: eslint * Feature/fix card padding (#388) * fix: fixing the responsive design for members card * fix: fixing the responsive design for members card * fix: font color, repeated className, figure tag * fix: install missing dependency: @aws-amplify/core * fix: remove course function * feat: alert translation * fix: eslint * feat: add workbox runtimeCaching config * Fix service worker to enable it to replace old one (#389) * fix: add cleanupOutdatedCaches option * use custom sw & force update * skipWaiting and claim before cleanupOutdatedCaches * add ts files to NetworkFirst cache * remove ts from cache * register sw on index.html * change sw from ts to js * test updates to trigger build * registerSW in index.html * remove unused code and comment of registering sw * update files to trigger build * feat: add a profile card component; add hover & click effect; add a closing tab on cards (#390) * feat: add a profile card component; add hover & click effect; add closing tab on cards * fix: rename profile card & prop; type for useState * fix: syllabus minor styling issues * Update README.md * Migrate from Webpack to Vite (#386) * fix(deps): update dependency @aws-amplify/auth to v4 (#352) Co-authored-by: Renovate Bot * Feature: Added Dark theme (#365) * Theme provider to Syllabus & context to containers * Add context on components in Syllabus which may require fix for dark mode * feat: replace @reach/router to react-router v6 * feat: update header for all apps * fix: reinstall react-router-dom v6 and history after rebase * feat: add new themes * fix: lock files * feat: install TailwindCSS on Campus * feat: install TailwindCSS on Syllabus * feat: change theme-toggle color according to current theme * fix: change locations of tailwind import; remove unused log * feat: dark theme on Timetable * Feat: Added new sidebar icons from material ui icons * Feat: Separated icons into different component * fix: added package json and pnpm lock updates * feat: pass isDark property to styled components * feat: dark theme on Syllabus (CourseItem not yet) * fix: wrap ThemeProvider on Nav; use new theme colors * fix: use className instead of passing theme as props * feat: dark theme on CourseInfo (not completed) * fix: Made theme types exportable * fix: created sidebar wrapper locally instead of bit * fix: Fixed styling of icon group button * feat: added user profile icon * feat: Added dark mode styling to other links * fix: moved browser router wrapper outside to fix navigation * fix: used const instead of let for navigation hook * fix: fixed import order * feat: CourseInfo dark mode * feat: Made title logo svg into a component * fix: made title logo text colour change when theme toggle * fix: fixed extra stylings when dark mode * fix: updated package versions and pnpm lock file * feat: update loading-spinner & solve background color flicker while loading page in dark mode * feat: added dark mode styling to about us pages * feat: added dark mode styling to extra pages * feat: dark theme to mobile bottom nav * feat: update header & loading-spinner & body tag background color * feat: added dark mode background * fix: fixed title logo on sidebar not changing colours when switching modes * fix: added tab colours when dark mode * fix: added dark mode colours to partner page text * feat: dark mode for Labs * fix: related courses width * feat: update spinner in Syllabus; dark mode for Campus * fix: timetable course item scrollable space height * feat: make timetable course item darker in dark mode * feat: install tailwind in feeds (not used yet) * feat: redirecting page styling * feat: update sign in modal * feat: updated header component and pnpm lock file accordingly * fix: updated colors and header dependencies * fix: eslint fixes for campus folder * feat: added dark mode styling to campus folder * fix: eslint fixes in syllabus folder * fix: updated dark mode styling * fix: updated dark mode syllabus * fix: updated dark mode styling root folder * fix: syllabus border & step arrow color * fix: fixed styling for social media icons in partners * fix: removed unused imports * fix: Or-button dark mode color * fix: remove FilterWarningsPlugin * fix: update lock files * fix: remove -y option * fix: update lock files * fix: update @aws-amplify/auth in syllabus * fix: update loading spinner in Feeds * fix: add theme prop to LoadingSpinner in Feeds Co-authored-by: YHhaoareyou * fix: clear search keywords when onclick related courses * Debug: mobile dark mode debug (#373) * feat: dark mode & new messages on welcome modal * fix: dark mode on sign in modal & user login icon * chore(deps): update dependency eslint-plugin-react to v7.29.4 (#361) Co-authored-by: Renovate Bot * chore(deps): update dependency ts-loader to v9.2.8 (#359) Co-authored-by: Renovate Bot * feat: remove unused dependencies (#377) * Feature/darktheme colors (#378) * feat: added quarterColors for both light and dark mode * feat: Added google analytics to theme changes * fix: fixed user profile icon to make it consistent * fix: code refactoring * fix: code refactoring in syllabus * feat: added dark semantic colors * fix: added colors based on numbers too * fix: added a todo comment * fix: fix semantic text colors dark mode * feat: update quarter switch colors & icons * feat: update timetable course items and color selector with new theme colors Co-authored-by: Nicholas Narmada * Feature: Timetable dark theme (#379) * feat: Dark mode for pro tips and colors selector popup in Timetable * feat: update theme colors dependency for all apps * feat: add the hovering effect to the member cards (#381) * feat: update the hovering effect for member cards * fix: remove unused libraries; fix html background color in dark mode; disable card's hyperlink * fix: makes the code shorter and neater * fix: syllabus pnpm lock file * fix: syllabus pnpm lock file Co-authored-by: YHhaoareyou * Migrate from Webpack to Vite (#382) * feat: vite tested by career folder * feat: replace systemjs import with dynamic import to import vite project * feat: ignore dynamic import problem caused by webpack * feat: Migrate Campus from Webpack to Vite * fix: restore career * feat: register vite app campus by single-spa-layout * feat: migrate Syllabus to vite (error unsolved) * fix: fix lockfile * fix: solve "exportStar not a function", "undefined global" and use Vite envvar * feat: migrate syllabus to vite (done) * remove webpack from all apps except root * feat: migrate root to vite * feat: remove webpack related scripts & solve import-map not supported problem in Safari * feat: import static assets; solve errors of custom props passed to dom * fix: run eslint fix * fix: build script & config * feat: build config & debug global var * fix: output asset files path * feat: disable css code split in build * fix: run eslint fix * feat: preload css from mf apps to root; replace react-s-alert with react-toastify * feat: configure public path & env var for each app * fix: run eslint fix * feat: service-worker * fix: eslint fix * update lock files * fix: missing package * fix: externalize styles from other mf app * fix: campus room badge styles Co-authored-by: AustinZhu * fix: env without using dotenv explicitly (#385) * fix: packages version * fix: change env var name * fix: remove systemjs package; add peer dependencies * fix: feeds domain on staging/prod * Feature: About Us page link from Home page & split Home from Root-config (#387) * fix: remove custom sw * feat: add link to aboutus page from home * fix: eslint * Feature/fix card padding (#388) * fix: fixing the responsive design for members card * fix: fixing the responsive design for members card * fix: font color, repeated className, figure tag * fix: install missing dependency: @aws-amplify/core * fix: remove course function * feat: alert translation * fix: eslint * feat: add workbox runtimeCaching config * Fix service worker to enable it to replace old one (#389) * fix: add cleanupOutdatedCaches option * use custom sw & force update * skipWaiting and claim before cleanupOutdatedCaches * add ts files to NetworkFirst cache * remove ts from cache * register sw on index.html * change sw from ts to js * test updates to trigger build * registerSW in index.html * remove unused code and comment of registering sw * update files to trigger build * feat: add a profile card component; add hover & click effect; add a closing tab on cards (#390) * feat: add a profile card component; add hover & click effect; add closing tab on cards * fix: rename profile card & prop; type for useState * fix: syllabus minor styling issues * Update README.md Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Renovate Bot Co-authored-by: Nicholas Narmada <36405403+nichnarmada@users.noreply.github.com> Co-authored-by: Nicholas Narmada Co-authored-by: Xinyue Tao <96937379+xinyue296@users.noreply.github.com> Co-authored-by: AustinZhu * add script-src-elem to Content Security Policy (#391) * Hotfix (#392) * add script-src-elem to Content Security Policy * fix csp * Hotfix (#393) * add script-src-elem to Content Security Policy * fix csp * add blob:https: to csp * fix blob in csp * fix: remove csp * fix: remove all webpack-related packages & setting * Allow all in CSP * Fix: preload style, csp allow all, refactor index html & env var (#404) * fix style prelload link * refactor index.html & add env variables * remove slash from the end of base path env var * import other mf's css files as external * run eslint fix * run eslint fix * Update README.md (#397) Github -> GitHub * chore(deps): update dependency esbuild to v0.14.43 (#384) Co-authored-by: Renovate Bot * chore(deps): update dependencies * chore(deps): update dependencies * chore(deps): update dependencies * fix: preload & enable styles from other mf app * fix: packages version (fix React to v17) * Language filter for Feeds (#409) * filter feeds by language * feat: styling lang filter button * feat: Back button to Feeds list page * Remove using @apply in css file due to amp style problem * feat: added turbo-repo woooo (#420) * update feeds * update feeds * refactor: refactored project structure * feat: added turborepo * feat: eslint custom config dependency * fix: fix lint script * fix: removed self dependent dependencies * chore: pnpm lock updates * fix: remove dont purge tailwind from script * feat: add turbo scripts to monorepo * fix: fixed folder paths for github actions * fix: fixed campus pnpm-lock file * fix: updated pnpm lock again * fix: updated types for feed info * fix: feeds submodule & root env & campus type mismatch Co-authored-by: YHhaoareyou * feat: adding web hooks for forums * feat: updating meet our team page (#426) * feat: editing meet our team page * feat: adding michael to the MeetOurMembers page * feat: edited my position * feat: changing Jason's role to cheerleader * fix: downgrade pnpm version for test * feat: adding gunjan and aditya to the team * fix: fixing aditya image * feat: adding pam to the team * fix:fixing pnpm lock issues --------- Co-authored-by: YHhaoareyou * Export Bit components to turborepo packages (#428) * feat: created ui package * feat: added tailwind and prettier * chore: file linting * refactor: removed unnecessary files * refactor: configured build * feature: add storybook * feat: import all bit components * refactor: remove unused stories * refactor: updated language menu to newest mui * refactor: refactored media func * refactor: use headlessui for modal * refactor: refactor imports and exports * chore: pnpm build script * chore: added packages * chore: update package json and lock files * refactor: re-added Modal component * refactor: changed import paths internal ui package * refactor: added colors.json to be importable * refactor: changed import path * refactor: updated shared eslint and prettier * chore: reformatted files * refactor: changed type of media func * refactor: removed unused assets * refactor: refactored media functions * refactor: fixed import path * chore: updated vite to latest * chore: updated single-spa and removed unused vite plugin * fix: fixed pnpm lock * fix: removed react-refresh * fix: overrided esbuild version * fix: fixed pnpm lock * refactor: changed loading spinner to func * refactor: changed prettier to cjs file * refactor: updated mui * fix: fixed packages * fix: test version down jpg loader * fix: fixed window and document in theme context * fix: test remove theme context file * fix: fix error document * test commit * fix: use client in component * fix: under reconstruction feeds * fix: next output export --------- Co-authored-by: Nicholas Narmada * Feature: Remove bit from npmrc (#431) * fix: remove bit details from npmrc * fix: remove bit portion of readme * fix: fixing tailwind:build from tailwind to tailwindcss * feat: reorganizing meet our teams list * feat: adding alfonso lien and shiori * chore: ah comeon * chore: what in the hell is a JPG and a jpg * chore: oh Jason focus comeon why are you doing stupid stuff mistaking jpg with png * feat: adding forum into develop (#446) * feat: create single-spa app-parcel for Forum * Add explanation for adding new app-parcel in WasedaTime * Comment out routing for Career * Initialize components for Forum * feat: install tailwind in Forum * Add required utilities to Forum * Add Forum icon to navbar * feature/forum-basic-styling (#415) * feat: added basic styling + dummy data for forum incl. board, comments and comment form * fix: arrangement between each section in Forum * fix: code style by eslint Co-authored-by: YHhaoareyou * Feature/forum-basic-routing (#416) * feat: added basic styling + dummy data for forum incl. board, comments and comment form * pulled forum-basic into this branch * feat: filter posts by boardid, boardmenu routing * feat: "basic routing for posts + boards" * Run pnpm fix * fix: available boards Co-authored-by: YHhaoareyou * Recoil installation and defining global states (#417) * created tag modal component * added recoil in root.components.tsx * feat: define recoil state Co-authored-by: Kyoungjun Han * Feature/forum-create-thread-basic (#418) * feat: conditional create thread text area basic * feat: added tags + group buttons w/ basic toggle * feat: added submit btn (not functional) * changed default state of expanded thread input * feat: menuitems json, createthread styling * added number type for boardindex function * Run pnpm fix * Define boards & tags; change structure of dummy threads & comments * Group filter for Forum (#419) * feature: group filter styling * Update groups * feat: Toggle global states for groups when clicking on items in group menu * fix group items structure * feature: filtering function * fix: move filter functions to another file * init School filter form and add scholl icons * feat: switch open status of school filter modal * feat: tab item title, normal and active style * feat: toggle selected group by school filter * feat: moved forum folder to apps * User auth for Forum (#421) * feat: User login & verify auth when opening thread form and creating new thread * chore: add todo message for implementing submitting new thread API * feat: Add auth for comment form * feat: value and onChange func for new thread form * Customize Header for Forum (will replace Header component in other apps) * fix: default host of each microfrontend * added recoil in root.components.tsx * error report to Hao * fix: modal not showing due to wrong classname and attributes * update for jan 5 2023 * sorry it took so long * debug: recover tags modal display after adopting turbo * feat: set header input form as tag modal button * fix: removed bit from forum * fix: updated eslint config * choreL updated package json * fix: remove bit details from npmrc * fix: remove bit token form npmrc * Fix errors when importing common packages (#432) * fix: temporarily comment out error codes in Feeds * fix: update esbuild and fix tailwind build command * fix: temporarily change the target of ReactModal.setAppElement * fix: commented out translation & navigation function and fix typo of color variables * fix: language switch icon size * fix: move i18n config from packages folder to each microfrontend * fix: recover sign in modal * feat: create single-spa app-parcel for Forum * Add explanation for adding new app-parcel in WasedaTime * Comment out routing for Career * Initialize components for Forum * feat: install tailwind in Forum * Add required utilities to Forum * Add Forum icon to navbar * feature/forum-basic-styling (#415) * feat: added basic styling + dummy data for forum incl. board, comments and comment form * fix: arrangement between each section in Forum * fix: code style by eslint Co-authored-by: YHhaoareyou * Feature/forum-basic-routing (#416) * feat: added basic styling + dummy data for forum incl. board, comments and comment form * pulled forum-basic into this branch * feat: filter posts by boardid, boardmenu routing * feat: "basic routing for posts + boards" * Run pnpm fix * fix: available boards Co-authored-by: YHhaoareyou * Recoil installation and defining global states (#417) * created tag modal component * added recoil in root.components.tsx * feat: define recoil state Co-authored-by: Kyoungjun Han * Feature/forum-create-thread-basic (#418) * feat: conditional create thread text area basic * feat: added tags + group buttons w/ basic toggle * feat: added submit btn (not functional) * changed default state of expanded thread input * feat: menuitems json, createthread styling * added number type for boardindex function * Run pnpm fix * Define boards & tags; change structure of dummy threads & comments * Group filter for Forum (#419) * feature: group filter styling * Update groups * feat: Toggle global states for groups when clicking on items in group menu * fix group items structure * feature: filtering function * fix: move filter functions to another file * init School filter form and add scholl icons * feat: switch open status of school filter modal * feat: tab item title, normal and active style * feat: toggle selected group by school filter * feat: moved forum folder to apps * User auth for Forum (#421) * feat: User login & verify auth when opening thread form and creating new thread * chore: add todo message for implementing submitting new thread API * feat: Add auth for comment form * feat: value and onChange func for new thread form * Customize Header for Forum (will replace Header component in other apps) * fix: default host of each microfrontend * added recoil in root.components.tsx * error report to Hao * fix: modal not showing due to wrong classname and attributes * update for jan 5 2023 * sorry it took so long * debug: recover tags modal display after adopting turbo * feat: set header input form as tag modal button * fix: removed bit from forum * fix: updated eslint config * choreL updated package json * fix: remove bit token form npmrc * fix: i18n config and signInModal in Forum * fix: image config in Feeds * Feature/forum get post (#445) * feat: create single-spa app-parcel for Forum * Add explanation for adding new app-parcel in WasedaTime * Comment out routing for Career * Initialize components for Forum * feat: install tailwind in Forum * Add required utilities to Forum * Add Forum icon to navbar * feature/forum-basic-styling (#415) * feat: added basic styling + dummy data for forum incl. board, comments and comment form * fix: arrangement between each section in Forum * fix: code style by eslint Co-authored-by: YHhaoareyou * Feature/forum-basic-routing (#416) * feat: added basic styling + dummy data for forum incl. board, comments and comment form * pulled forum-basic into this branch * feat: filter posts by boardid, boardmenu routing * feat: "basic routing for posts + boards" * Run pnpm fix * fix: available boards Co-authored-by: YHhaoareyou * Recoil installation and defining global states (#417) * created tag modal component * added recoil in root.components.tsx * feat: define recoil state Co-authored-by: Kyoungjun Han * Feature/forum-create-thread-basic (#418) * feat: conditional create thread text area basic * feat: added tags + group buttons w/ basic toggle * feat: added submit btn (not functional) * changed default state of expanded thread input * feat: menuitems json, createthread styling * added number type for boardindex function * Run pnpm fix * Define boards & tags; change structure of dummy threads & comments * Group filter for Forum (#419) * feature: group filter styling * Update groups * feat: Toggle global states for groups when clicking on items in group menu * fix group items structure * feature: filtering function * fix: move filter functions to another file * init School filter form and add scholl icons * feat: switch open status of school filter modal * feat: tab item title, normal and active style * feat: toggle selected group by school filter * feat: moved forum folder to apps * User auth for Forum (#421) * feat: User login & verify auth when opening thread form and creating new thread * chore: add todo message for implementing submitting new thread API * feat: Add auth for comment form * feat: value and onChange func for new thread form * Customize Header for Forum (will replace Header component in other apps) * fix: default host of each microfrontend * added recoil in root.components.tsx * error report to Hao * fix: modal not showing due to wrong classname and attributes * update for jan 5 2023 * sorry it took so long * debug: recover tags modal display after adopting turbo * feat: set header input form as tag modal button * fix: removed bit from forum * fix: updated eslint config * choreL updated package json * fix: remove bit details from npmrc * fix: remove bit token form npmrc * feat: restarting branch * feat: adding changes to new branch * feat: testing * feat: adding dependency localforage * chores: small edits * feat: finishing migrate from branch to branch * feat: deleting two view sections. * feat: adding tags to post model * fix: fixed tag posting * feat: creating school choosing dropdown * chores: small adjustments * feat: updating dropdown will need to change it to something else * Feature/forum update delete post (#444) * feat: add edit and delete button & call delete api * feat: confirm delete thread modal * feat: thread edit modal (form not yet) * feat: edit thread form completed * fix: fixing out API * feat: figuring shit out * fix: undefined colors variable * feat: adding some actions too * Feature/new layout (#441) * feat: new layout * feat: whole new layout will merge to parent branch to get inifinte scroll * fix: fixing actions to compatible version * feat: infinite scroll to load more threads (#442) Co-authored-by: YHhaoareyou * feat: forum restructuring (#443) * feat: initiating new branch for hastags * feat: working on forum homepage now can call all data * feat: forum home func * yo * chorse: getting rid of stuff * feat: major changes added some refresh functionalities --------- Co-authored-by: Kyoungjun Han * feat: new prop fromRoot for link condition * chore: comment out thread edit function and button * chores: deleting comments * feat: display all threads on forum home page * feat: adding comment delete with refresh * feat: adding icon for views --------- Co-authored-by: YHhaoareyou Co-authored-by: Kyoungjun Han --------- Co-authored-by: YHhaoareyou Co-authored-by: Michael Kaminski <91806277+kamlnskll@users.noreply.github.com> Co-authored-by: Kyoungjun Han Co-authored-by: Nicholas Narmada * fix: forum was commeted out * feat: fixing board conditional * feat: fixing thread tag * feat: adding bread crumbs * feat: working but need to fix issue of mounting * feat: tags searching * feat: examining useEffect * fix: add boardId and tags as dependencies for the first useEffect * fix: scroll function activation * feat: adding search tag box * feat: Add board menu in create thread to forum root * feat: adding school selection * feat: draft of tag menu * feat: tweaking with Nicholas component * fix: fixed styling of menu button and dropdown * fix: fixed Nicholas component * feat: added some functionalities for board to tag filtiering * Revert "Merge branch 'develop' of https://github.com/wasedatime/wasedatime-web into feature/forum-basic" This reverts commit 8f529dd122369328f51fc8180bbc5ddc16b4a614, reversing changes made to b098087ecae7ed8f3226a35d9be23004eedcb116. * feat: reverting changes to original * feat: major update * feat: adding styling * feat: adding more styling I guess i am done * feat: additional tag filtering logic * fix: change feeds folder directory * feat: adding FeedBackBox * chore: replace @vitejs/plugin-react-refresh with @vitejs/plugin-react * feat: styling tags and school button * feat: fixing feed back box --------- Co-authored-by: YHhaoareyou Co-authored-by: Michael Kaminski <91806277+kamlnskll@users.noreply.github.com> Co-authored-by: Kyoungjun Han Co-authored-by: Nicholas Narmada * feat: final check on develop now time to deploy * feat: adding type safety to prevent from accessing null length * feat: adding array safety * fix: adding another type safety for response array * feat: adding some common css to see the change * feat: altering styling * feat: adding responive ness * feat: altered timeline new feature add comment logo no more title and tag * feat: changing our mission * feat: enlarging the fontsize of forums. Currently it was just too small (#453) Also changed the original eventlistener for scrolling back to infinite scroll component * fix: fixing App layout and adding onclikc to fix links (#454) * fix: fixing App layout and adding onclikc to fix links * feat: refactoring threadblock structure * chore: fixing tag typo * feat: fixing finalization * feat: adding max width to thread post card * feat: added comment count (#456) * fix: fix new feature image size * feat: adding forum comment notification functionality (#458) * fix: add Forum route to Root App.tsx * fix: add Forum routes with params in Root * chore: add Forum to sitemap * chore: test hard-coded subpath in Forum * fix: remove hard-coded path and add NotFound in Forum * feat: adding images to forums (#460) * feat: adding image indicator * feat: adding boolean flag for page thread * feat: forum-timstamp (#462) * Added Timestamp * feat: localization to JST from UTC --------- Co-authored-by: KTheAsianimeBoi * fix: fixing idToken retreaval function (#464) * fix: fixing feeds * feat: forum time formating with page thread formating (#466) * feat: disabling feeds and campus * fix:login failed error message and post direct url (#468) * feat: adding index html to forum src * feat: adding routing on index.html * feat: adding index html * feat: forum redirect and styling (#472) * feat: adding redirect logic for success and minor styling * feat: dynamic sizing * fix: unifing border thickness * feat: adding thread notification --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Renovate Bot Co-authored-by: Nicholas Narmada <36405403+nichnarmada@users.noreply.github.com> Co-authored-by: YHhaoareyou Co-authored-by: Nicholas Narmada Co-authored-by: Xinyue Tao <96937379+xinyue296@users.noreply.github.com> Co-authored-by: AustinZhu Co-authored-by: Ikko Ashimine Co-authored-by: Michael Kaminski <91806277+kamlnskll@users.noreply.github.com> Co-authored-by: Kyoungjun Han Co-authored-by: KTheAsianimeBoi Co-authored-by: Umar Farooq <33097722+Umar-Mughal@users.noreply.github.com> --- apps/feeds/components/FeedLink.tsx | 12 ++- apps/forum/src/components/App.tsx | 2 + apps/forum/src/utils/getDate.ts | 15 +++ apps/forum/src/utils/storeDate.ts | 14 +++ apps/root/package.json | 1 + apps/root/pnpm-lock.yaml | 83 ++++++++++++++++ .../aboutUs/MeetOurTeam/MeetOurTeam.tsx | 4 - .../src/components/block/IconTextGroup.tsx | 32 +++++-- apps/root/src/components/frame/MobileNav.tsx | 17 +++- apps/root/src/components/frame/Nav.tsx | 96 ++++++++++++++++++- apps/root/src/components/frame/Sidebar.tsx | 1 + apps/root/src/utils/fetchNotification.ts | 18 ++++ apps/root/src/utils/getDate.ts | 30 ++++++ apps/root/src/utils/shouldCallApi.ts | 26 +++++ apps/root/src/wasedatime-root-config.ts | 14 +++ 15 files changed, 339 insertions(+), 26 deletions(-) create mode 100644 apps/forum/src/utils/getDate.ts create mode 100644 apps/forum/src/utils/storeDate.ts create mode 100644 apps/root/src/utils/fetchNotification.ts create mode 100644 apps/root/src/utils/getDate.ts create mode 100644 apps/root/src/utils/shouldCallApi.ts diff --git a/apps/feeds/components/FeedLink.tsx b/apps/feeds/components/FeedLink.tsx index 12437b4a6..4855ad0e8 100644 --- a/apps/feeds/components/FeedLink.tsx +++ b/apps/feeds/components/FeedLink.tsx @@ -5,7 +5,7 @@ import Grid from "@mui/material/Grid" import Card from "@mui/material/Card" import CardActionArea from "@mui/material/CardActionArea" import CardContent from "@mui/material/CardContent" -import Image from 'next/image' +import Image from "next/image" import React, { useEffect, useState } from "react" import { FeedInfo } from "../constants/types" import { Lang, LangMap } from "../constants/langs" @@ -38,14 +38,14 @@ const FeedLink = ({ name, feed, locale }: Props) => { } } } - console.log(coverImg); + setCover(coverImg) }, []) return ( - {

-
- {cover && Feed Cover Image} +
+ {cover && ( + Feed Cover Image + )}
diff --git a/apps/forum/src/components/App.tsx b/apps/forum/src/components/App.tsx index efff15e16..914e1e859 100644 --- a/apps/forum/src/components/App.tsx +++ b/apps/forum/src/components/App.tsx @@ -12,6 +12,7 @@ import FeedBackBox from "./FeedBackBox"; import ArrowBackIcon from "@mui/icons-material/ArrowBack"; import { API } from "@aws-amplify/api"; import { getUserAttr, getIdToken, LoadingSpinner } from "wasedatime-ui"; +import { storeDate } from "@app/utils/storeDate"; const App = () => { return ( @@ -67,6 +68,7 @@ const InnerApp = () => { useEffect(() => { fetchNotification(); + storeDate(); }, []); return ( diff --git a/apps/forum/src/utils/getDate.ts b/apps/forum/src/utils/getDate.ts new file mode 100644 index 000000000..c4ae2f6c6 --- /dev/null +++ b/apps/forum/src/utils/getDate.ts @@ -0,0 +1,15 @@ +export const getCurrentDateInJST = () => { + const date = new Date(); + const jstOffset = 9 * 60; // JST is UTC+9 + const localOffset = date.getTimezoneOffset(); + date.setMinutes(date.getMinutes() + localOffset + jstOffset); + + const YYYY = date.getFullYear(); + const MM = String(date.getMonth() + 1).padStart(2, "0"); // Months are 0-based + const DD = String(date.getDate()).padStart(2, "0"); + const HH = String(date.getHours()).padStart(2, "0"); + const mm = String(date.getMinutes()).padStart(2, "0"); + const SS = String(date.getSeconds()).padStart(2, "0"); + + return `${YYYY}${MM}${DD}${HH}${mm}${SS}`; +}; diff --git a/apps/forum/src/utils/storeDate.ts b/apps/forum/src/utils/storeDate.ts new file mode 100644 index 000000000..513e19fc5 --- /dev/null +++ b/apps/forum/src/utils/storeDate.ts @@ -0,0 +1,14 @@ +import { getCurrentDateInJST } from "./getDate"; + +export const storeDate = () => { + const storedDateInJST = localStorage.getItem("lastCheckedDateJST"); + const currentDateInJST = getCurrentDateInJST(); + + if (!storedDateInJST) { + // If there's no stored date, set the current date to local storage. + localStorage.setItem("lastCheckedDateJST", currentDateInJST); + } else if (storedDateInJST !== currentDateInJST) { + // If the stored date and the current date are different, update the stored date. + localStorage.setItem("lastCheckedDateJST", currentDateInJST); + } +}; diff --git a/apps/root/package.json b/apps/root/package.json index 181bf874b..63cda7caf 100644 --- a/apps/root/package.json +++ b/apps/root/package.json @@ -56,6 +56,7 @@ "vite-plugin-pwa": "0.12.0" }, "dependencies": { + "@aws-amplify/api": "4.0.42", "@aws-amplify/auth": "4.5.6", "@aws-amplify/core": "4.5.6", "@emotion/react": "11.9.0", diff --git a/apps/root/pnpm-lock.yaml b/apps/root/pnpm-lock.yaml index 549cf601f..0c9a2f492 100644 --- a/apps/root/pnpm-lock.yaml +++ b/apps/root/pnpm-lock.yaml @@ -5,6 +5,9 @@ settings: excludeLinksFromLockfile: false dependencies: + '@aws-amplify/api': + specifier: 4.0.42 + version: 4.0.42(react-native@0.68.2) '@aws-amplify/auth': specifier: 4.5.6 version: 4.5.6(react-native@0.68.2) @@ -262,6 +265,44 @@ packages: leven: 3.1.0 dev: true + /@aws-amplify/api-graphql@2.3.6(react-native@0.68.2): + resolution: {integrity: sha512-bAFApP7Yw2uLythEG4og0nDm8xVqqEMLKiT5AUpElKmlzU5t106gYissRLet+oHeiE2DMnIWCL9g/rOn93Z1NQ==} + dependencies: + '@aws-amplify/api-rest': 2.0.42(react-native@0.68.2) + '@aws-amplify/auth': 4.5.6(react-native@0.68.2) + '@aws-amplify/cache': 4.0.44(react-native@0.68.2) + '@aws-amplify/core': 4.5.6(react-native@0.68.2) + '@aws-amplify/pubsub': 4.4.3(react-native@0.68.2) + graphql: 15.8.0 + uuid: 3.4.0 + zen-observable-ts: 0.8.19 + transitivePeerDependencies: + - debug + - encoding + - react-native + dev: false + + /@aws-amplify/api-rest@2.0.42(react-native@0.68.2): + resolution: {integrity: sha512-37BUCnI1PM273jUwWceEZVi0frO0mHY8dY/9EZ2zUmA6Rbscbm5ZpyB8E+txtO+odbbBxnU5JHdc7JnWr7Fwpw==} + dependencies: + '@aws-amplify/core': 4.5.6(react-native@0.68.2) + axios: 0.21.4 + transitivePeerDependencies: + - debug + - react-native + dev: false + + /@aws-amplify/api@4.0.42(react-native@0.68.2): + resolution: {integrity: sha512-h+nm6Frbu4G2Ftc7s0SVdQEoLOE9tVlfRM6q0JrQ48Ilu1myQdQ3wormWUxdhlpkuTq+UOYcDTcIUeiD3CC2mA==} + dependencies: + '@aws-amplify/api-graphql': 2.3.6(react-native@0.68.2) + '@aws-amplify/api-rest': 2.0.42(react-native@0.68.2) + transitivePeerDependencies: + - debug + - encoding + - react-native + dev: false + /@aws-amplify/auth@4.5.6(react-native@0.68.2): resolution: {integrity: sha512-G0pxqKaVouuhVK6qH0EBHG5ziNVRT7AzKSj8jN2I7klHtFJHnY/F6NEEjr/e99IgbyzspjWX5xFRBAQecgF44A==} dependencies: @@ -297,6 +338,21 @@ packages: - react-native dev: false + /@aws-amplify/pubsub@4.4.3(react-native@0.68.2): + resolution: {integrity: sha512-bpjucdYHpnrz0fq+0PZ/UfaUR67z7RUm13iDL3GnX8TMCRTTaquOF7S2Sfn9zlWzwDOFzrne6JAl8lnwBmjuEw==} + dependencies: + '@aws-amplify/auth': 4.5.6(react-native@0.68.2) + '@aws-amplify/cache': 4.0.44(react-native@0.68.2) + '@aws-amplify/core': 4.5.6(react-native@0.68.2) + graphql: 15.8.0 + paho-mqtt: 1.1.0 + uuid: 3.4.0 + zen-observable-ts: 0.8.19 + transitivePeerDependencies: + - encoding + - react-native + dev: false + /@aws-crypto/ie11-detection@1.0.0: resolution: {integrity: sha512-kCKVhCF1oDxFYgQrxXmIrS5oaWulkvRcPz+QBDMsUr2crbF4VGgGT6+uQhSwJFdUAQ2A//Vq+uT83eJrkzFgXA==} dependencies: @@ -3564,6 +3620,14 @@ packages: engines: {node: '>= 0.4'} dev: true + /axios@0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + dependencies: + follow-redirects: 1.15.3 + transitivePeerDependencies: + - debug + dev: false + /babel-core@7.0.0-bridge.0(@babel/core@7.18.2): resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} peerDependencies: @@ -5037,6 +5101,16 @@ packages: resolution: {integrity: sha512-1gIBiWJNR0tKUNv8gZuk7l9rVX06OuLzY9AoGio7y/JT4V1IZErEMEq2TJS+PFcw/y0RshZ1J/27VfK1UQzYVg==} engines: {node: '>=0.4.0'} + /follow-redirects@1.15.3: + resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: @@ -5210,6 +5284,11 @@ packages: /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + /graphql@15.8.0: + resolution: {integrity: sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==} + engines: {node: '>= 10.x'} + dev: false + /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true @@ -6745,6 +6824,10 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + /paho-mqtt@1.1.0: + resolution: {integrity: sha512-KPbL9KAB0ASvhSDbOrZBaccXS+/s7/LIofbPyERww8hM5Ko71GUJQ6Nmg0BWqj8phAIT8zdf/Sd/RftHU9i2HA==} + dev: false + /param-case@3.0.4: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} dependencies: diff --git a/apps/root/src/components/aboutUs/MeetOurTeam/MeetOurTeam.tsx b/apps/root/src/components/aboutUs/MeetOurTeam/MeetOurTeam.tsx index 99ed0052f..81b916fc8 100644 --- a/apps/root/src/components/aboutUs/MeetOurTeam/MeetOurTeam.tsx +++ b/apps/root/src/components/aboutUs/MeetOurTeam/MeetOurTeam.tsx @@ -35,10 +35,6 @@ const MeetOurTeam = () => { const { t } = useTranslation() const [activeCardName, setActiveCardName] = useState("") - useEffect(() => { - console.log(activeCardName) - }, [activeCardName]) - return ( diff --git a/apps/root/src/components/block/IconTextGroup.tsx b/apps/root/src/components/block/IconTextGroup.tsx index 2c4e47ca0..009820588 100644 --- a/apps/root/src/components/block/IconTextGroup.tsx +++ b/apps/root/src/components/block/IconTextGroup.tsx @@ -19,6 +19,7 @@ interface IconTextGroupProps { iconPath?: string expanded?: boolean currentPath?: string + tooltip?: string } const NavItemBlock = styled.div<NavItemBlockProps>` @@ -62,6 +63,7 @@ export const IconTextGroup = ({ iconPath, expanded, currentPath, + tooltip, }: IconTextGroupProps) => { const [isHover, setIsHover] = useState(false) return ( @@ -72,17 +74,27 @@ export const IconTextGroup = ({ onMouseOver={() => setIsHover(true)} onMouseOut={() => setIsHover(false)} > - <div className="text-light-text2 group-hover:text-light-main dark:text-dark-text2 dark:group-hover:text-dark-text1"> - {isHover && hoverIcon ? hoverIcon : icon} + <div className="relative inline-flex items-center"> + {" "} + {/* This is the wrapper */} + <div className="text-light-text2 group-hover:text-light-main dark:text-dark-text2 dark:group-hover:text-dark-text1"> + {isHover && hoverIcon ? hoverIcon : icon} + </div> + {text && ( + <NavItemText + className="ml-2 text-light-text2 group-hover:text-light-main dark:text-dark-text2 dark:group-hover:text-dark-text1" // added ml-2 for spacing + expanded={expanded} + > + {text} + </NavItemText> + )} + {/* Tooltip rendering */} + {tooltip && expanded && ( + <span className="absolute top-1/2 left-full z-10 ml-2 w-auto -translate-y-1/2 transform whitespace-nowrap rounded bg-light-main px-3 py-2 text-xl text-dark-text1 dark:bg-dark-main"> + {tooltip} + </span> + )} </div> - {text && ( - <NavItemText - className="text-light-text2 group-hover:text-light-main dark:text-dark-text2 dark:group-hover:text-dark-text1" - expanded={expanded} - > - {text} - </NavItemText> - )} </NavItemBlock> ) } diff --git a/apps/root/src/components/frame/MobileNav.tsx b/apps/root/src/components/frame/MobileNav.tsx index 857c768c9..c4b714112 100644 --- a/apps/root/src/components/frame/MobileNav.tsx +++ b/apps/root/src/components/frame/MobileNav.tsx @@ -27,11 +27,18 @@ const MobileNav = ({ navItems, openSignInModal }: Props) => { className="flex-1 text-center" customOnClick={() => setCurrentPath(item.path)} > - <div className="text-light-text2 group-hover:text-light-main dark:text-dark-text2 dark:group-hover:text-dark-text1"> - {item.icon} - </div> - <div className="text-lg text-light-text2 group-hover:text-light-main dark:text-dark-text2 dark:group-hover:text-dark-text1"> - {item.name} + <div className="relative"> + <div className="text-light-text2 group-hover:text-light-main dark:text-dark-text2 dark:group-hover:text-dark-text1"> + {item.icon} + </div> + <div className="text-lg text-light-text2 group-hover:text-light-main dark:text-dark-text2 dark:group-hover:text-dark-text1"> + {item.name} + </div> + {item.tooltip && ( + <span className="absolute top-0 left-1/2 z-10 -translate-x-1/2 -translate-y-full transform whitespace-nowrap rounded bg-light-main px-3 py-2 text-lg text-dark-text1 dark:bg-dark-main"> + {item.tooltip} + </span> + )} </div> </LinkOutsideRouter> )) diff --git a/apps/root/src/components/frame/Nav.tsx b/apps/root/src/components/frame/Nav.tsx index e46190463..981982898 100644 --- a/apps/root/src/components/frame/Nav.tsx +++ b/apps/root/src/components/frame/Nav.tsx @@ -26,6 +26,13 @@ import { TimetableIconHovered, } from "@app/components/icons/TimetableIcon" import { ThemeContext, ThemeProvider } from "@app/utils/theme-context" +import { + getCurrentDateInJST, + getCurrentDateInUTC, + extractDate, +} from "@app/utils/getDate" +import { shouldCallApi } from "@app/utils/shouldCallApi" +import { fetchNotificaiton } from "@app/utils/fetchNotification" const Sidebar = lazy(() => import("@app/components/frame/Sidebar")) const MobileNav = lazy(() => import("@app/components/frame/MobileNav")) @@ -37,6 +44,7 @@ export interface NavItemsProps { path: string icon: ReactNode iconHovered?: ReactNode + tooltip?: string } const Nav = () => { @@ -50,6 +58,7 @@ const Nav = () => { const { t, i18n } = useTranslation() useEffect(() => { + // fetchNotificaiton("") window.onstorage = () => { i18n.changeLanguage(localStorage.getItem("wasedatime-lng")) } @@ -60,6 +69,52 @@ const Nav = () => { page_path: page_path, }) + const fetchNotificationAndUpdateState = async () => { + try { + const storedDateInJST = localStorage.getItem("lastCheckedDateJST") + const currentDateInJST = getCurrentDateInJST() + const storedDateOnly = extractDate(storedDateInJST || "") + const currentDateOnly = extractDate(currentDateInJST) + + if (!storedDateOnly) { + localStorage.setItem("lastCheckedDateJST", currentDateInJST) + } else if (shouldCallApi()) { + const newPostsCount = await fetchNotificaiton(storedDateInJST || "") + const updatedNavItems = navItems.map((item) => + item.path === "/forum" + ? { + ...item, + tooltip: + newPostsCount > 0 + ? `${newPostsCount} unread posts!` + : "Share something in WTF!", + } + : item + ) + setNavItems(updatedNavItems) + localStorage.setItem("lastCheckedDateJST", currentDateInJST) + localStorage.setItem( + "lastApiCallTimestamp", + new Date().getTime().toString() + ) + } else { + const updatedNavItems = navItems.map((item) => + item.path === "/forum" + ? { + ...item, + tooltip: "Check out WTF!", + } + : item + ) + setNavItems(updatedNavItems) + } + } catch (error) { + console.error("Error fetching notifications:", error) + } + } + + fetchNotificationAndUpdateState() + return history.listen(({ location, action }) => { if (action === "POP") { const new_page_path = location.pathname + location.search @@ -71,7 +126,9 @@ const Nav = () => { }) }, []) - const navItems: NavItemsProps[] = [ + // const currentDateInUTC = getCurrentDateInUTC() + + const [navItems, setNavItems] = useState<NavItemsProps[]>([ { name: t("navigation.timetable"), path: "/courses/timetable", @@ -89,6 +146,7 @@ const Nav = () => { path: "/forum", icon: <ForumIcon />, iconHovered: <ForumIconHovered />, + tooltip: "Check out the new posts!", }, // { // name: t("navigation.campus"), @@ -102,7 +160,41 @@ const Nav = () => { // icon: <FeedsIcon />, // iconHovered: <FeedsIconHovered />, // }, - ] + ]) + + // const navItems: NavItemsProps[] = [ + // { + // name: t("navigation.timetable"), + // path: "/courses/timetable", + // icon: <TimetableIcon />, + // iconHovered: <TimetableIconHovered />, + // }, + // { + // name: t("navigation.syllabus"), + // path: "/courses/syllabus", + // icon: <SyllabusIcon />, + // iconHovered: <SyllabusIconHovered />, + // }, + // { + // name: t("navigation.forum"), + // path: "/forum", + // icon: <ForumIcon />, + // iconHovered: <ForumIconHovered />, + // tooltip: "Check out the new posts!", + // }, + // { + // name: t("navigation.campus"), + // path: "/campus", + // icon: <CampusIcon />, + // iconHovered: <CampusIconHovered />, + // }, + // { + // name: t("navigation.feeds"), + // path: "/feeds", + // icon: <FeedsIcon />, + // iconHovered: <FeedsIconHovered />, + // }, + // ] return ( <Suspense fallback=""> diff --git a/apps/root/src/components/frame/Sidebar.tsx b/apps/root/src/components/frame/Sidebar.tsx index 91528b110..8a58f68b8 100644 --- a/apps/root/src/components/frame/Sidebar.tsx +++ b/apps/root/src/components/frame/Sidebar.tsx @@ -115,6 +115,7 @@ const Sidebar = ({ navItems, openSignInModal }: SidebarProps) => { iconPath={item.path} expanded={expanded} currentPath={currentPath} + tooltip={item.tooltip} /> </LinkOutsideRouter> ))} diff --git a/apps/root/src/utils/fetchNotification.ts b/apps/root/src/utils/fetchNotification.ts new file mode 100644 index 000000000..88a57a77a --- /dev/null +++ b/apps/root/src/utils/fetchNotification.ts @@ -0,0 +1,18 @@ +import { API } from "@aws-amplify/api" + +export const fetchNotificaiton = async (lastCheckDate: string) => { + const res = await API.get( + "wasedatime-dev", + `/forum/notify?lastChecked=${lastCheckDate}`, + { + headers: { + "Content-Type": "application/json", + }, + response: true, + } + ) + + const threadCount = res.data.data + + return threadCount +} diff --git a/apps/root/src/utils/getDate.ts b/apps/root/src/utils/getDate.ts new file mode 100644 index 000000000..0ae37cae6 --- /dev/null +++ b/apps/root/src/utils/getDate.ts @@ -0,0 +1,30 @@ +export const getCurrentDateInJST = () => { + const date = new Date() + const jstOffset = 9 * 60 // JST is UTC+9 + const localOffset = date.getTimezoneOffset() + date.setMinutes(date.getMinutes() + localOffset + jstOffset) + + const YYYY = date.getFullYear() + const MM = String(date.getMonth() + 1).padStart(2, "0") // Months are 0-based + const DD = String(date.getDate()).padStart(2, "0") + const HH = String(date.getHours()).padStart(2, "0") + const mm = String(date.getMinutes()).padStart(2, "0") + const SS = String(date.getSeconds()).padStart(2, "0") + + return `${YYYY}${MM}${DD}${HH}${mm}${SS}` +} + +export const extractDate = (fullDate: string) => { + return fullDate.substring(0, 8) // Extracts the first 8 characters (YYYYMMDD) +} + +export const getCurrentDateInUTC = () => { + const date = new Date() + const YYYY = date.getUTCFullYear() + const MM = String(date.getUTCMonth() + 1).padStart(2, "0") + const DD = String(date.getUTCDate()).padStart(2, "0") + const HH = String(date.getUTCHours()).padStart(2, "0") + const mm = String(date.getUTCMinutes()).padStart(2, "0") + const SS = String(date.getUTCSeconds()).padStart(2, "0") + return `${YYYY}${MM}${DD}${HH}${mm}${SS}` +} diff --git a/apps/root/src/utils/shouldCallApi.ts b/apps/root/src/utils/shouldCallApi.ts new file mode 100644 index 000000000..80ad15ffb --- /dev/null +++ b/apps/root/src/utils/shouldCallApi.ts @@ -0,0 +1,26 @@ +const LAST_API_CALL_TIMESTAMP = "lastApiCallTimestamp" +const ONE_HOUR_IN_MS = 60 * 60 * 1000 + +const convertToTimestamp = (datetime: string) => { + const year = parseInt(datetime.substring(0, 4), 10) + const month = parseInt(datetime.substring(4, 6), 10) - 1 // Months in JS are 0-indexed + const day = parseInt(datetime.substring(6, 8), 10) + const hour = parseInt(datetime.substring(8, 10), 10) + const minute = parseInt(datetime.substring(10, 12), 10) + const second = parseInt(datetime.substring(12, 14), 10) + + return new Date(year, month, day, hour, minute, second).getTime() +} + +export const shouldCallApi = () => { + const lastCallTimestamp = localStorage.getItem("lastApiCallTimestamp") + + if (!lastCallTimestamp) { + return true + } + + const timeSinceLastCall = + new Date().getTime() - parseInt(lastCallTimestamp, 10) + + return timeSinceLastCall > ONE_HOUR_IN_MS +} diff --git a/apps/root/src/wasedatime-root-config.ts b/apps/root/src/wasedatime-root-config.ts index 07b647f77..5358defc2 100644 --- a/apps/root/src/wasedatime-root-config.ts +++ b/apps/root/src/wasedatime-root-config.ts @@ -16,10 +16,24 @@ import Nav from "@app/components/frame/Nav" import { registerSW } from "virtual:pwa-register" +import { API } from "@aws-amplify/api" + if (import.meta.env.MODE !== "development" && "serviceWorker" in navigator) { registerSW() } +const apiConfig = { + API: { + endpoints: [ + { + name: "wasedatime-dev", + endpoint: import.meta.env.VITE_API_BASE_URL, + }, + ], + }, +} +API.configure(apiConfig) + const routes = constructRoutes(document.querySelector("#single-spa-layout")) const applications = constructApplications({ routes,