From 5ad4089d4edfac9695ed04cdecd3299ca08e947b Mon Sep 17 00:00:00 2001 From: tema Date: Sat, 22 Nov 2025 18:11:43 +0900 Subject: [PATCH] Enhance SIM management features and improve UI responsiveness - Introduced SimVoiceOptions model to manage voice-related settings for accounts. - Added debug methods in SimDetailsService and SimOrchestratorService to fetch SIM details directly from Freebit, bypassing subscription validation for troubleshooting. - Updated SimManagementSection and SubscriptionDetail components for improved UI with backdrop blur effects and enhanced layout. - Integrated AuroraBackground component for a visually appealing background in SubscriptionDetail, enhancing user experience. --- apps/bff/prisma/schema.prisma | 12 ++++ .../subscriptions/sim-management.service.ts | 14 +++-- .../services/sim-details.service.ts | 29 +++++++++ .../services/sim-orchestrator.service.ts | 8 +++ apps/portal/src/app/globals.css | 24 +++++++ .../ui/shadcn-io/aurora-background/index.tsx | 62 +++++++++++++++++++ .../components/SimManagementSection.tsx | 11 ++-- .../views/SubscriptionDetail.tsx | 15 +++-- 8 files changed, 160 insertions(+), 15 deletions(-) create mode 100644 apps/portal/src/components/ui/shadcn-io/aurora-background/index.tsx diff --git a/apps/bff/prisma/schema.prisma b/apps/bff/prisma/schema.prisma index ca0edfe1..0ac06053 100644 --- a/apps/bff/prisma/schema.prisma +++ b/apps/bff/prisma/schema.prisma @@ -168,3 +168,15 @@ model SimUsageDaily { @@index([account, date]) @@map("sim_usage_daily") } + +model SimVoiceOptions { + account String @id + voiceMailEnabled Boolean @default(false) @map("voice_mail_enabled") + callWaitingEnabled Boolean @default(false) @map("call_waiting_enabled") + internationalRoamingEnabled Boolean @default(false) @map("international_roaming_enabled") + networkType String @default("4G") @map("network_type") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + @@map("sim_voice_options") +} diff --git a/apps/bff/src/modules/subscriptions/sim-management.service.ts b/apps/bff/src/modules/subscriptions/sim-management.service.ts index 1c058e28..8af0a2b6 100644 --- a/apps/bff/src/modules/subscriptions/sim-management.service.ts +++ b/apps/bff/src/modules/subscriptions/sim-management.service.ts @@ -5,14 +5,13 @@ import type { SimDetails, SimUsage, SimTopUpHistory, -} from "@bff/integrations/freebit/interfaces/freebit.types"; -import type { SimTopUpRequest, SimPlanChangeRequest, SimCancelRequest, SimTopUpHistoryRequest, SimFeaturesUpdateRequest, -} from "./sim-management/types/sim-requests.types"; + SimReissueRequest, +} from "@customer-portal/domain/sim"; import type { SimNotificationContext } from "./sim-management/interfaces/sim-base.interface"; @Injectable() @@ -120,8 +119,13 @@ export class SimManagementService { /** * Reissue eSIM profile */ - async reissueEsimProfile(userId: string, subscriptionId: number, newEid?: string): Promise { - return this.simOrchestrator.reissueEsimProfile(userId, subscriptionId, newEid); + async reissueEsimProfile( + userId: string, + subscriptionId: number, + newEid?: string + ): Promise { + const request: SimReissueRequest = newEid ? { newEid } : {}; + return this.simOrchestrator.reissueEsimProfile(userId, subscriptionId, request); } /** diff --git a/apps/bff/src/modules/subscriptions/sim-management/services/sim-details.service.ts b/apps/bff/src/modules/subscriptions/sim-management/services/sim-details.service.ts index f8584bab..0fb4374a 100644 --- a/apps/bff/src/modules/subscriptions/sim-management/services/sim-details.service.ts +++ b/apps/bff/src/modules/subscriptions/sim-management/services/sim-details.service.ts @@ -40,4 +40,33 @@ export class SimDetailsService { throw error; } } + + /** + * Get SIM details directly from Freebit without subscription validation + * Useful for debugging specific accounts + */ + async getSimDetailsDirectly(account: string): Promise { + try { + this.logger.log(`[DEBUG] Querying Freebit for account: ${account}`); + + const simDetails = await this.freebitService.getSimDetails(account); + + this.logger.log(`[DEBUG] Retrieved SIM details from Freebit`, { + account, + planCode: simDetails.planCode, + planName: simDetails.planName, + status: simDetails.status, + simType: simDetails.simType, + }); + + return simDetails; + } catch (error) { + const sanitizedError = getErrorMessage(error); + this.logger.error(`[DEBUG] Failed to get SIM details for account ${account}`, { + error: sanitizedError, + account, + }); + throw error; + } + } } diff --git a/apps/bff/src/modules/subscriptions/sim-management/services/sim-orchestrator.service.ts b/apps/bff/src/modules/subscriptions/sim-management/services/sim-orchestrator.service.ts index df1fbb3d..19e3adef 100644 --- a/apps/bff/src/modules/subscriptions/sim-management/services/sim-orchestrator.service.ts +++ b/apps/bff/src/modules/subscriptions/sim-management/services/sim-orchestrator.service.ts @@ -157,4 +157,12 @@ export class SimOrchestratorService { ): Promise> { return this.simValidation.debugSimSubscription(userId, subscriptionId); } + + /** + * Debug method to query Freebit directly for any account's details + * Bypasses subscription validation and queries Freebit directly + */ + async getSimDetailsDirectly(account: string): Promise { + return this.simDetails.getSimDetailsDirectly(account); + } } diff --git a/apps/portal/src/app/globals.css b/apps/portal/src/app/globals.css index 9d318749..3e3e5afd 100644 --- a/apps/portal/src/app/globals.css +++ b/apps/portal/src/app/globals.css @@ -3,6 +3,9 @@ @import "../styles/tokens.css"; @import "../styles/utilities.css"; @import "../styles/responsive.css"; +@import "tw-animate-css"; + +@custom-variant dark (&:is(.dark *)); :root { --radius: 0.625rem; @@ -217,3 +220,24 @@ font-family: var(--font-geist-sans), system-ui, sans-serif; } } + +@theme inline { + --animate-aurora: aurora 60s linear infinite; + @keyframes aurora { + from { + backgroundPosition: 50% 50%, 50% 50%; + } + to { + backgroundPosition: 350% 50%, 350% 50%; + } + } +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } +} \ No newline at end of file diff --git a/apps/portal/src/components/ui/shadcn-io/aurora-background/index.tsx b/apps/portal/src/components/ui/shadcn-io/aurora-background/index.tsx new file mode 100644 index 00000000..09c8c1be --- /dev/null +++ b/apps/portal/src/components/ui/shadcn-io/aurora-background/index.tsx @@ -0,0 +1,62 @@ +"use client"; + +import { cn } from "@/lib/utils"; +import React, { ReactNode } from "react"; + +interface AuroraBackgroundProps extends React.HTMLAttributes { + children: ReactNode; + showRadialGradient?: boolean; +} + +export const AuroraBackground = ({ + className, + children, + showRadialGradient = true, + ...props +}: AuroraBackgroundProps) => { + return ( +
+
+
+
+
+ {children} +
+
+ ); +}; diff --git a/apps/portal/src/features/sim-management/components/SimManagementSection.tsx b/apps/portal/src/features/sim-management/components/SimManagementSection.tsx index d637879b..22e2bbb6 100644 --- a/apps/portal/src/features/sim-management/components/SimManagementSection.tsx +++ b/apps/portal/src/features/sim-management/components/SimManagementSection.tsx @@ -137,7 +137,7 @@ export function SimManagementSection({ subscriptionId }: SimManagementSectionPro return (
{/* Header Section */} -
+

@@ -156,7 +156,7 @@ export function SimManagementSection({ subscriptionId }: SimManagementSectionPro {/* Left Column - Main Actions */}
{/* Subscription Details Card */} -
+

Subscription Details

@@ -177,7 +177,7 @@ export function SimManagementSection({ subscriptionId }: SimManagementSectionPro
{/* SIM Management Actions Card */} -
+

SIM Management Actions

@@ -195,7 +195,7 @@ export function SimManagementSection({ subscriptionId }: SimManagementSectionPro
{/* Voice Status Card */} -
+

Voice Status

@@ -214,7 +214,7 @@ export function SimManagementSection({ subscriptionId }: SimManagementSectionPro {/* Right Column - SIM Details & Usage */}
{/* SIM Details Card */} -
+

SIM Details

@@ -228,7 +228,6 @@ export function SimManagementSection({ subscriptionId }: SimManagementSectionPro
-
); } diff --git a/apps/portal/src/features/subscriptions/views/SubscriptionDetail.tsx b/apps/portal/src/features/subscriptions/views/SubscriptionDetail.tsx index 22523238..536a5cd2 100644 --- a/apps/portal/src/features/subscriptions/views/SubscriptionDetail.tsx +++ b/apps/portal/src/features/subscriptions/views/SubscriptionDetail.tsx @@ -25,6 +25,7 @@ import { getSubscriptionStatusIcon, getSubscriptionStatusVariant, } from "@/features/subscriptions/utils/status-presenters"; +import { AuroraBackground } from "@/components/ui/shadcn-io/aurora-background"; export function SubscriptionDetailContainer() { const params = useParams(); @@ -115,8 +116,13 @@ export function SubscriptionDetailContainer() { } return ( -
-
+
+ +
+ + +
+
@@ -134,7 +140,7 @@ export function SubscriptionDetailContainer() {
- + - +

Service Management

@@ -223,6 +229,7 @@ export function SubscriptionDetailContainer() { )} {showInvoices && } +
);