diff --git a/app/Data/UserData.php b/app/Data/UserData.php index 20d6431e32..f66be689dc 100644 --- a/app/Data/UserData.php +++ b/app/Data/UserData.php @@ -4,6 +4,7 @@ namespace App\Data; +use App\Models\Role; use App\Models\User; use App\Platform\Enums\PlayerPreferredMode; use App\Support\Media\UserAvatarUrl; @@ -36,6 +37,7 @@ public function __construct( public Lazy|bool $isGone = false, public Lazy|bool $isMuted = false, public Lazy|bool $isNew = false, + public Lazy|bool $isTeamAccount = false, public Lazy|bool|null $isUserWallActive = null, public Lazy|Carbon|null $lastActivityAt = null, public Lazy|int|null $legacyPermissions = null, @@ -94,6 +96,7 @@ public static function fromUser(User $user): self isGone: Lazy::create(fn () => $user->is_gone), isMuted: Lazy::create(fn () => $user->isMuted()), isNew: Lazy::create(fn () => $user->isNew()), + isTeamAccount: Lazy::create(fn () => $user->hasRole(Role::TEAM_ACCOUNT)), isUserWallActive: Lazy::create(fn () => $user->is_user_wall_active), lastActivityAt: Lazy::create(fn () => $user->last_activity_at), legacyPermissions: Lazy::create(fn () => (int) $user->getAttribute('Permissions')), diff --git a/app/Http/Controllers/Api/SearchApiController.php b/app/Http/Controllers/Api/SearchApiController.php index 1fd626ba6e..ec5226cb8a 100644 --- a/app/Http/Controllers/Api/SearchApiController.php +++ b/app/Http/Controllers/Api/SearchApiController.php @@ -228,7 +228,7 @@ private function searchUsers(string $keyword, ?int $page = null, ?int $perPage = $filteredUsers = $users->filter(fn ($user) => $user->email_verified_at !== null); $results = $filteredUsers->map(function ($user) { - return UserData::fromUser($user)->include('lastActivityAt', 'points', 'pointsSoftcore', 'roles'); + return UserData::fromUser($user)->include('isTeamAccount', 'lastActivityAt', 'points', 'pointsSoftcore'); }); return $this->buildSearchResponse($results, 0.5, $this->buildPaginationMeta($paginator)); @@ -245,7 +245,7 @@ private function searchUsers(string $keyword, ?int $page = null, ?int $perPage = ->take(self::MAX_RESULTS_PER_SCOPE); $results = $filteredUsers->map(function ($user) { - return UserData::fromUser($user)->include('lastActivityAt', 'points', 'pointsSoftcore', 'roles'); + return UserData::fromUser($user)->include('isTeamAccount', 'lastActivityAt', 'points', 'pointsSoftcore'); }); // Calculate average relevance for section ordering. diff --git a/resources/js/common/components/GlobalSearch/components/SearchResults/UserResultDisplay/UserResultDisplay.test.tsx b/resources/js/common/components/GlobalSearch/components/SearchResults/UserResultDisplay/UserResultDisplay.test.tsx index 13948ad26e..03e1b4230d 100644 --- a/resources/js/common/components/GlobalSearch/components/SearchResults/UserResultDisplay/UserResultDisplay.test.tsx +++ b/resources/js/common/components/GlobalSearch/components/SearchResults/UserResultDisplay/UserResultDisplay.test.tsx @@ -123,7 +123,7 @@ describe('Component: UserResultDisplay', () => { const user = createUser({ lastActivityAt: '2024-01-15T10:00:00Z', // !! 2 hours ago - roles: ['team-account'], + isTeamAccount: true, }); render(); @@ -139,7 +139,7 @@ describe('Component: UserResultDisplay', () => { const user = createUser({ lastActivityAt: '2024-01-15T11:57:00Z', // !! 3 minutes ago - roles: ['team-account'], + isTeamAccount: true, }); render(); @@ -152,7 +152,7 @@ describe('Component: UserResultDisplay', () => { // ARRANGE const user = createUser({ lastActivityAt: undefined, - roles: ['team-account'], + isTeamAccount: true, }); render(); @@ -162,14 +162,14 @@ describe('Component: UserResultDisplay', () => { expect(screen.queryByTestId('active-indicator')).not.toBeInTheDocument(); }); - it('given the user has no roles defined and has last activity, still shows the last seen label', () => { + it('given the user has no team account flag and has last activity, still shows the last seen label', () => { // ARRANGE const mockCurrentTime = dayjs.utc('2024-01-15T12:00:00Z').toDate(); vi.setSystemTime(mockCurrentTime); const user = createUser({ lastActivityAt: '2024-01-15T10:00:00Z', - roles: undefined, + isTeamAccount: undefined, }); render(); diff --git a/resources/js/common/components/GlobalSearch/components/SearchResults/UserResultDisplay/UserResultDisplay.tsx b/resources/js/common/components/GlobalSearch/components/SearchResults/UserResultDisplay/UserResultDisplay.tsx index 4ce43de3e4..55bba216ae 100644 --- a/resources/js/common/components/GlobalSearch/components/SearchResults/UserResultDisplay/UserResultDisplay.tsx +++ b/resources/js/common/components/GlobalSearch/components/SearchResults/UserResultDisplay/UserResultDisplay.tsx @@ -2,7 +2,6 @@ import dayjs from 'dayjs'; import type { FC } from 'react'; import { useTranslation } from 'react-i18next'; -import { UserRole } from '@/common/utils/generatedAppConstants'; import { useDiffForHumans } from '@/common/utils/l10n/useDiffForHumans'; interface UserResultDisplayProps { @@ -10,10 +9,8 @@ interface UserResultDisplayProps { } export const UserResultDisplay: FC = ({ user }) => { - const isTeamAccount = user.roles?.includes(UserRole.TEAM_ACCOUNT) ?? false; - const isActive = - !isTeamAccount && user.lastActivityAt + !user.isTeamAccount && user.lastActivityAt ? Math.abs(dayjs(user.lastActivityAt).diff(dayjs(), 'minute')) <= 5 : false; @@ -34,7 +31,7 @@ export const UserResultDisplay: FC = ({ user }) => {
{user.displayName}
- {user.lastActivityAt && !isTeamAccount ? ( + {user.lastActivityAt && !user.isTeamAccount ? ( ) : null}
diff --git a/resources/js/types/generated.d.ts b/resources/js/types/generated.d.ts index a75e867c97..93e522e614 100644 --- a/resources/js/types/generated.d.ts +++ b/resources/js/types/generated.d.ts @@ -406,6 +406,7 @@ isEmailVerified?: boolean; isGone?: boolean; isMuted?: boolean; isNew?: boolean; +isTeamAccount?: boolean; isUserWallActive?: boolean | null; lastActivityAt?: string | null; legacyPermissions?: number | null;