refactor(member): update member status stat to dynamically display capitalized user role
All checks were successful
Deploy Flowstate to VPS / deploy (push) Successful in 43s

This commit is contained in:
Chneemann 2026-08-21 04:09:03 +02:00
parent 6a6b8406a4
commit 3db1a18086
No known key found for this signature in database
4 changed files with 27 additions and 9 deletions

View file

@ -5,7 +5,12 @@
"use client"; "use client";
import { getFullName, getInitials, formatTimeAgo } from "@/utils/user"; import {
getFullName,
getInitials,
formatTimeAgo,
capitalize,
} from "@/utils/user";
import { Mail, Clock, ShieldCheck } from "lucide-react"; import { Mail, Clock, ShieldCheck } from "lucide-react";
import { UserListItem } from "@/types/user"; import { UserListItem } from "@/types/user";
@ -36,7 +41,7 @@ export default function MemberProfileCard({ member }: MemberProfileCardProps) {
}, },
{ {
label: "Account Status", label: "Account Status",
value: "Active - Member", value: `Active - ${capitalize(member.role)}`,
icon: ShieldCheck, icon: ShieldCheck,
color: "text-emerald-400 bg-emerald-500/10 border-emerald-500/20", color: "text-emerald-400 bg-emerald-500/10 border-emerald-500/20",
}, },

View file

@ -10,6 +10,7 @@ import {
getInitials, getInitials,
getStatusColor, getStatusColor,
formatTimeAgo, formatTimeAgo,
capitalize,
} from "@/utils/user"; } from "@/utils/user";
import { Mail } from "lucide-react"; import { Mail } from "lucide-react";
import { UserListItem } from "@/types/user"; import { UserListItem } from "@/types/user";
@ -61,7 +62,7 @@ export default function MemberItem({ member }: MemberItemProps) {
{getFullName(member.firstName, member.lastName)} {getFullName(member.firstName, member.lastName)}
</h3> </h3>
<span className="text-[10px] px-2 py-0.5 rounded-md font-semibold border border-border/60 bg-card/60 text-foreground-muted"> <span className="text-[10px] px-2 py-0.5 rounded-md font-semibold border border-border/60 bg-card/60 text-foreground-muted">
Member {capitalize(member.role)}
</span> </span>
</div> </div>

View file

@ -16,7 +16,7 @@ export class UserService {
* *
* @async * @async
* @param {string} userId - The unique identifier of the user. * @param {string} userId - The unique identifier of the user.
* @returns {Promise<{ id: string; firstName: string; lastName: string; email: string; color: string; isOnline: boolean; lastLogin: Date } | null>} The user profile data or null if not found. * @returns {Promise<{ id: string; firstName: string; lastName: string; email: string; role: string; color: string; isOnline: boolean; lastLogin: Date } | null>} The user profile data or null if not found.
*/ */
static async findProfileById(userId: string) { static async findProfileById(userId: string) {
const [user] = await db const [user] = await db
@ -25,6 +25,7 @@ export class UserService {
firstName: usersTable.firstName, firstName: usersTable.firstName,
lastName: usersTable.lastName, lastName: usersTable.lastName,
email: usersTable.email, email: usersTable.email,
role: usersTable.role,
color: usersTable.color, color: usersTable.color,
isOnline: usersTable.isOnline, isOnline: usersTable.isOnline,
lastLogin: usersTable.lastLogin, lastLogin: usersTable.lastLogin,
@ -39,7 +40,7 @@ export class UserService {
* Retrieves a list of all users sorted by their last login date in descending order, placing null values last. * Retrieves a list of all users sorted by their last login date in descending order, placing null values last.
* *
* @async * @async
* @returns {Promise<Array<{ id: string; firstName: string; lastName: string; email: string; color: string; lastLogin: Date; isOnline: boolean }>>} An array of user list items. * @returns {Promise<Array<{ id: string; firstName: string; lastName: string; email: string; role: string; color: string; lastLogin: Date; isOnline: boolean }>>} An array of user list items.
*/ */
static async findAllUsers() { static async findAllUsers() {
return await db return await db
@ -48,6 +49,7 @@ export class UserService {
firstName: usersTable.firstName, firstName: usersTable.firstName,
lastName: usersTable.lastName, lastName: usersTable.lastName,
email: usersTable.email, email: usersTable.email,
role: usersTable.role,
color: usersTable.color, color: usersTable.color,
lastLogin: usersTable.lastLogin, lastLogin: usersTable.lastLogin,
isOnline: usersTable.isOnline, isOnline: usersTable.isOnline,

View file

@ -3,6 +3,17 @@
* @description Utility functions for user formatting, initials generation, and name capitalization. * @description Utility functions for user formatting, initials generation, and name capitalization.
*/ */
/**
* Capitalizes the first letter of a given string.
*
* @param {string} [str] - The string to capitalize.
* @returns {string} The capitalized string or an empty string if undefined/empty.
*/
export function capitalize(str?: string): string {
if (!str) return "";
return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
}
/** /**
* Generates the full name with properly capitalized first and last names. * Generates the full name with properly capitalized first and last names.
* *
@ -11,10 +22,9 @@
* @returns {string} The formatted full name. * @returns {string} The formatted full name.
*/ */
export function getFullName(firstName?: string, lastName?: string): string { export function getFullName(firstName?: string, lastName?: string): string {
const format = (str?: string) => const formattedFirst = capitalize(firstName);
str ? str.charAt(0).toUpperCase() + str.slice(1).toLowerCase() : ""; const formattedLast = capitalize(lastName);
return `${formattedFirst} ${formattedLast}`.trim();
return `${format(firstName)} ${format(lastName)}`.trim();
} }
/** /**