* WIP(delete): remove business logic from controller
* fix(deletion): handle group leave logic on app server still
* fix(lint): unused import
* fix(import): bracket syntax
* fix(test): adapt test for worker flow
* fix(deletion): update delete/feedback form copy
* fix(text): don't break to new paragraph about Gems
* fix(deletion): remove orphaned chat messages
* Revert "fix(deletion): handle group leave logic on app server still"
This reverts commit 9db541f4c3.
* fix(tests): remove tests
These can potentially be tested in the worker's suite? They target functionality that the group leave route handles within the deletion flow
* fix(lint): no-undef
* refactor redis setup into own file and use ioredis
* use bullmq directly to schedule jobs
* add space
* add key prefix
* add semicolon
* fix(jobs): update redis package
---------
Co-authored-by: Phillip Thelen <phillip@habitica.com>
* Refactor(tasks): Centralize daily task start date normalization
* fix datepicker server day shifts by zeroing time
---------
Co-authored-by: Hafiz <hafizbhamidi@gmail.com>
wrap the conditional group update and the user save in a single transaction so a failure between them can't leave members[uid] and RSVPNeeded out of sync
* apply email passed via body if it is missing from apple profile
* Add Web UI to set email if apple does not provide one
* fix lint
* remove trailing space
* fix(register): show field if social auth without email
* fix(ux): add explanatory text
* fix(lint): max-len
* fix(data): remove unused field
* fix(auth): pass email around as necessary in Apple flow
* fix(auth): still wrong place argh
* Fix(auth): handle email in Apple registration flow
---------
Co-authored-by: Phillip Thelen <phillip@habitica.com>
Co-authored-by: Hafiz <hafizbhamidi@gmail.com>
use dateCreated instead of customerId to identify previously upgraded groups. Team cron clears customerId on expired plans as a query optimization, which makes them invisible to the upgrade flow. dateCreated is set on every group plan since the feature was introduced and is never cleared, so it reliably indicates a group was previously upgraded.
* fix(guilds): remove join retired public guild loophole
* fix(groups): adjust test expectations
and move some business logic back out of the controller
* test(challenges): add cases related to public Guilds, Tavern and otherwise
* fix(tests): more erroneously public test guilds, lint
* fix(tests): still more setup tweaks
* fix(lint): whitespace
* fix(tests): couple more adjustments
* fix(test): last challenge issue??
* Add group plan selection modal for upgrades
Allow users to select an existing group to upgrade before creating a new one.
* crlf -> lf lint
* set selection of group plan
Also tiny UI fixes
* Update group plan selection to include expired plans
* Add includeExpiredPlans option to group fetching
* force flag when fetching group plans
* Update group plan eligibility check
* Fix eslint error in push notification import
* replace chaining (?.) w/null check
* Remove comment
* set initial selected group plan, and fix card rounding
* format member count
* Show warning for pending party invites when upgrading to paid group plan
Show warning for pending party invites when upgrading to paid group plan. If user upgrades from party to group, remove any pending invites
* suppress error toasts for group modal, and UI tweaks for group modal
suppress error toast for 404 on party fetch for users without a party (for group modal), Increase check SVG size in selectableCard, and show "Previously upgraded" label for parties that were canceled group plans
* Clear upgradingGroup state after group plan payment
* Update emoji system to native Unicode rendering
* Fix line endings in habiticaMarkdown test
* fix indented code block detection for markdown-it v14
* update habitica-markdown to include v3 emoji dataset (pointed towards test branch)
* size emoji in markdown
* emoji autocomplete to chat, messages, tasks, and profile
add :emoji shortcode autocomplete dropdown (reusing existing autocomplete mixin w/new helper)
* try upping github-action fix
* trying another github actions fix
* update habitica-markdown package version (v3.0.0 -> v4.0.0)
* Fix emoji autocomplete overlapping actual text
position dropdown below text
* update group-plans info card styles
* Support Melior emoji autocomplete & more places for emoji autocomplete
Include emoji autocomplete in task checklists, tags, challenge name/summary/description
* position emoji autocomplete dropdown below text area
* fix: replace nested ternary
* Emoji autocomplete fixes
Fix emoji autocomplete overlapping checklist text, and add short name emoji autocomplete
* Have emoji autocomplete dropdown directly below text, add to task tag
* Fix emoji autocomplete starting at beginning/end initially
* lint/line length
* Add group plan selection modal for upgrades
Allow users to select an existing group to upgrade before creating a new one.
* crlf -> lf lint
* set selection of group plan
Also tiny UI fixes
* Update group plan selection to include expired plans
* Add includeExpiredPlans option to group fetching
* force flag when fetching group plans
* Update group plan eligibility check
* Fix eslint error in push notification import
* replace chaining (?.) w/null check
* Remove comment
* set initial selected group plan, and fix card rounding
* format member count
* Show warning for pending party invites when upgrading to paid group plan
Show warning for pending party invites when upgrading to paid group plan. If user upgrades from party to group, remove any pending invites
* suppress error toasts for group modal, and UI tweaks for group modal
suppress error toast for 404 on party fetch for users without a party (for group modal), Increase check SVG size in selectableCard, and show "Previously upgraded" label for parties that were canceled group plans
* Clear upgradingGroup state after group plan payment
* Update emoji system to native Unicode rendering
* Fix line endings in habiticaMarkdown test
* fix indented code block detection for markdown-it v14
* update habitica-markdown to include v3 emoji dataset (pointed towards test branch)
* size emoji in markdown
* emoji autocomplete to chat, messages, tasks, and profile
add :emoji shortcode autocomplete dropdown (reusing existing autocomplete mixin w/new helper)
* try upping github-action fix
* trying another github actions fix
* update habitica-markdown package version (v3.0.0 -> v4.0.0)
* Fix emoji autocomplete overlapping actual text
position dropdown below text
* update group-plans info card styles
* Support Melior emoji autocomplete & more places for emoji autocomplete
Include emoji autocomplete in task checklists, tags, challenge name/summary/description
* position emoji autocomplete dropdown below text area
* fix: replace nested ternary
* Emoji autocomplete fixes
Fix emoji autocomplete overlapping checklist text, and add short name emoji autocomplete
* Have emoji autocomplete dropdown directly below text, add to task tag
* Fix emoji autocomplete starting at beginning/end initially
* lint/line length
* Revert "trying another github actions fix"
This reverts commit 72fc7fc20e.
* Revert "try upping github-action fix"
This reverts commit 70e48a57aa.
* fix(git): revert ci changes
---------
Co-authored-by: Kalista Payne <kalista@habitica.com>
* Add group plan selection modal for upgrades
Allow users to select an existing group to upgrade before creating a new one.
* crlf -> lf lint
* set selection of group plan
Also tiny UI fixes
* Update group plan selection to include expired plans
* Add includeExpiredPlans option to group fetching
* force flag when fetching group plans
* Update group plan eligibility check
* Fix eslint error in push notification import
* replace chaining (?.) w/null check
* Remove comment
* set initial selected group plan, and fix card rounding
* format member count
* Show warning for pending party invites when upgrading to paid group plan
Show warning for pending party invites when upgrading to paid group plan. If user upgrades from party to group, remove any pending invites
* suppress error toasts for group modal, and UI tweaks for group modal
suppress error toast for 404 on party fetch for users without a party (for group modal), Increase check SVG size in selectableCard, and show "Previously upgraded" label for parties that were canceled group plans
* Clear upgradingGroup state after group plan payment
* Add new api call for kubernetes startup probe
* add hostname as tag for loggly
* Only listen to one change
* increase vite min chunk size
* respond gracefully to shutdown signal
* update server readiness according to mongodb and redis connection
* make larger vite chunks
* fix lint
* build cached content files for mobile during gulp build
* load already cached content files during startup
* add option for mongoose to define minPoolSize
* cache client index.html for 10 minutes. Improves initial load times
* add option to auth to use lean version of user doc
* add a way to produce a heapdump from the command line
* fix lint
* replace lodash template usage with micromustache
* remove function brackets from translations
* add newline
* remove old test
* split core translations from content translations
* fix directory not existing
* fix lint
* fix(content): textual tweaks and updates
* fix(link): direct to FAQ instead of wiki
* fix(faq): correct Markdown
* Show orb of rebirth confirmation modal after use (window refresh)
* Set and check rebirth confirmation modal from localstorage
Set and check rebirth confirmation modal from localstorage after window reload
* Don't show orb of rebirth confirmation modal until page reloads
* message effective limit optimization
* Keep max limit for web (400 recent messages)
* Fix amount of messages initially being shown
* PM_PER_PAGE set to 50
* Increases number of messages in inbox test
* Increases number of messages for inbox pagination test
* Set and check rebirth confirmation modal from localstorage
Set and check rebirth confirmation modal from localstorage after window reload
* Don't show orb of rebirth confirmation modal until page reloads
* message effective limit optimization
* Keep max limit for web (400 recent messages)
* Add UUID validation for 'before' query parameter
* add party message stress test tool in admin panel
* lint
* add MAX_PM_COUNT of 400, admin tool for stress testing messages
* comment
* update stress test inbox message tool to use logged in user
* comment
---------
Co-authored-by: Kalista Payne <kalista@habitica.com>
* fix(content): textual tweaks and updates
* fix(link): direct to FAQ instead of wiki
* fix(faq): correct Markdown
* Show orb of rebirth confirmation modal after use (window refresh)
* Set and check rebirth confirmation modal from localstorage
Set and check rebirth confirmation modal from localstorage after window reload
* Don't show orb of rebirth confirmation modal until page reloads
* message effective limit optimization
* Keep max limit for web (400 recent messages)
* Fix amount of messages initially being shown
* PM_PER_PAGE set to 50
* Increases number of messages in inbox test
* Increases number of messages for inbox pagination test
* Set and check rebirth confirmation modal from localstorage
Set and check rebirth confirmation modal from localstorage after window reload
* Don't show orb of rebirth confirmation modal until page reloads
* message effective limit optimization
* Keep max limit for web (400 recent messages)
* Add UUID validation for 'before' query parameter
* add party message stress test tool in admin panel
* lint
* add MAX_PM_COUNT of 400, admin tool for stress testing messages
* comment
* update stress test inbox message tool to use logged in user
* comment
---------
Co-authored-by: Kalista Payne <kalista@habitica.com>
* fix test wording
* make shadow mute work for dms
* shadow mute chat messages
* shadow mute invites
* oops
* refactor mute handling into middleware
* correctly throw error
* fix
* test(chat): expect errors when muted
Also fixes the Linux version in the mongo commands. Again. wtf
---------
Co-authored-by: Kalista Payne <kalista@habitica.com>
* add new frontend files
* Add UI for managing blockers
* correctly reset local data after creating blocker
* Tweak wording
* Add UI for managing blockers
* restructure admin pages
* add blocker to block emails from registration
* lint fixes
* Await genericPurchase completion before page reload to prevent request cancellation.
Also adds defensive check for undefined error.response in axios interceptor to prevent "t.response undefined" errors.
* Fix shop tabs overflow off screen at certain zoom levels
Fix quest cards get cut off on small screens
Fix pop-up windows extend past screen edges on mobile
* Update ToS error message
- Updated account suspension message from "This account, User ID..." to "Your account @[username] has been
blocked..."
- Modified server auth middleware to pass username parameter when throwing account suspended error
-Modified auth utils loginRes function to include username in suspended account error
- Updated client bannedAccountModal component to pass username (empty string if unavailable)
- Updated login test to expect username in account suspended message
* lint fix
* Responsive Layout for Equipment Containers
- Added responsive CSS for mobile (<768px) and tablet (769px-1024px)
- Implemented flex-wrap layout that automatically stacks items in rows of 4 on smaller
* remove redundant disabled styles in task modals
The .disabled class conflicting with existing disabled state implementations
* Revert "Merge branch 'fiz/item-container-scaling' into qa/bat"
This reverts commit 4f28bfaad4dbeade66e507fd10904c133b206bda, reversing
changes made to 477dd6328acc6a63f5e7f1e98f2dd581665f1898.
* fix(blockers): duplicated code from rebase
* fix(admin): revert accidental change from rebase
* move !error.response to correct level
!error.response before any attempt to access error.response.status
* chore(github): split responsiveness to #15514
---------
Co-authored-by: Phillip Thelen <phillip@habitica.com>
Co-authored-by: Kalista Payne <kalista@habitica.com>
* Fix profile modal tab navigation URLs for both own and other users profiles
- Add routes for /user/profile, /user/stats, and /user/achievements
- Update selectPage() to properly update URLs when switching tabs
- Own profile uses /user/{tab} format
- Other users' profiles use /profile/{userId}#{tab} format
- Parse hash fragments when navigating to other users' profile tabs
- Ensure direct navigation to tab URLs opens correct tab
* Fix undefined userId
* Server now matches usernames case insensitively like client
- Preserves original capitalization in mention text
- Fixes profile links not working with wrong case mentions
* lint fixes
* g1g1 width auto sizing w/padding
* Challenge participants spacing & text sizing fix
* Fix inconsistent profile URL format between own and other users' profiles
- Update profile tab navigation to use consistent URL format for all users
- Redirect old /user/* routes to new format for backward compatibility
- Update all navigation points (dropdown menu, notifications) to use new URLs
* Update End Challenge modal
- Replace dropdown with searchable input (384x32px) for winner selection
- Add visual badge state with gems icons for challenge completion
- Update Delete Challenge flow with refund info and proper styling
- Add close button (X) with opacity hover effect
- Enhance Award Winner button with gem icon and dynamic prize display
- Apply conditional styling based on winner selection state
- Update text colors: Maroon/50 for delete warning, Gray/100 for "OR" text
- Add proper translations for gem/gems and refund description
* lint error fixes
* end challenge modal fixes
* lint fix
* Use existing closeX component, minor UI fixes to close challenge modal
* fix lint
* Delete icon color to match text on close challenge modal
use color field to set delete icon color
* Highlight username on close challenge modal color updates
- Background color on hover: purple-600
- Text color on hover: purple-300
- Changed transition from just background-color to all so both color changes animate smoothly
* Fix strings
* Refactor g1g1 notifications from database-driven to event-based system
Changed g1g1 (gift one get one) notifications to display automatically during event periods instead of requiring database storage. Notifications now appear based on event calendar dates and use sessionStorage for dismissal state.
- Display g1g1 notification when event is active in worldState
- Store dismissal state in sessionStorage with event-specific keys
- Remove dependency on user.notifications database array
- Maintain identical user experience and appearance
* Update prize card to match participants card on challenges
* End Challenge modal UI tweaks
* Prevent false mention highlights
Prevent false mention highlights when a user's display name matches another user's username. The purple mention indicator now only appears for actual @username mentions.
* lint fixes
* Remove mention highlight
* Mention highlighting to only highlight w/username mentions
* Update G1G1 Notification
- Updated text styling for title & description
- Updated button styling
- Updated close button
* lint fix
* Add updated G1G1 notification SVGs
* Don't highlight display name w/mention
* g1g1 UI updates
- Fix sizing of gift SVGs (96px tall)
- Update button to use button element and styles <button class="btn btn-secondary mx-auto">
- Fixed positioning, color, and hover state of close icon (default white 50% opacity, hover 75% opacity)
* Fix g1g1 close icon hover state
Fix hover state of close icon (default white 50% opacity, hover 75% opacity)
* g1g1 close hover state fix
* End challenge UI updates
- Fix modal title positioning
- Fix close icon positioning
- Fix spacing between title and gem graphic
- Fix spacing between label and input field
- Fix search icon position, change input hint to "@Username"
- Set search results text align start/left with 16px starting padding.
- Fix Award Button state
* remove trailing space
* Fix exit hover state on g1g1
* fix g1g1 close icon (directly render close icon)
* new line
* Update z-index of g1g1 close button
* add display name support for mention highlighting
mention highlights now trigger for both username and display name mentions.
* Override default close button color (gray -> white)
(Also revert the renderWithMentions change)
* Fix mention display name test (& fix lint)
* Revert display name mention, strictly only username
Mentions work w/username only (works w/case insensitive as well)
* Improved case-insensitive username matching
* add close-white.svg, replace close.svg on g1g1
* find mentions that match the current user's username (case-insensitive)
* fix lint errors
* end challenge modal UI updates
* Don't change gem color on update
* disabled state button match button.scss syling
* remove padding from g1g1 close
* Directly use button.scss on end challenge modal
* Update disabled state for button.scss
* explicitly set close challenge modal button disabled/enabled state
* fix trailing space
* Add font details (and fix text color) for button disabled state
* Update award winner button min-height & padding
* button.scss button disabled styling updates
* Remove redundant disabled override on award winner button
* lint
* Use single gifts svg, and apply transform to flip horizontally
Remove unneeded gifts_end.svg
* Replaced the hardcoded #1A1B1D color with the $black from colors.scss
* Removed the 0.5em padding w/p-2
* added v-once to the refund text element
* Converted the line-height values from pixel values to multipliers