From 7868ef82299ae1da5a09334f67d57eb3b472563a Mon Sep 17 00:00:00 2001
From: Abhi <43648792+abhipatel12@users.noreply.github.com>
Date: Sun, 8 Jun 2025 18:01:02 -0400
Subject: feat: Introduce session context and add session duration stat for
`/stats` command (#854)
---
.../cli/src/ui/contexts/SessionContext.test.tsx | 29 +++++++++++++++++
packages/cli/src/ui/contexts/SessionContext.tsx | 38 ++++++++++++++++++++++
2 files changed, 67 insertions(+)
create mode 100644 packages/cli/src/ui/contexts/SessionContext.test.tsx
create mode 100644 packages/cli/src/ui/contexts/SessionContext.tsx
(limited to 'packages/cli/src/ui/contexts')
diff --git a/packages/cli/src/ui/contexts/SessionContext.test.tsx b/packages/cli/src/ui/contexts/SessionContext.test.tsx
new file mode 100644
index 00000000..3b5454cf
--- /dev/null
+++ b/packages/cli/src/ui/contexts/SessionContext.test.tsx
@@ -0,0 +1,29 @@
+/**
+ * @license
+ * Copyright 2025 Google LLC
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+import { render } from 'ink-testing-library';
+import { Text } from 'ink';
+import { SessionProvider, useSession } from './SessionContext.js';
+import { describe, it, expect } from 'vitest';
+
+const TestComponent = () => {
+ const { startTime } = useSession();
+ return {startTime.toISOString()};
+};
+
+describe('SessionContext', () => {
+ it('should provide a start time', () => {
+ const { lastFrame } = render(
+
+
+ ,
+ );
+
+ const frameText = lastFrame();
+ // Check if the output is a valid ISO string, which confirms it's a Date object.
+ expect(new Date(frameText!).toString()).not.toBe('Invalid Date');
+ });
+});
diff --git a/packages/cli/src/ui/contexts/SessionContext.tsx b/packages/cli/src/ui/contexts/SessionContext.tsx
new file mode 100644
index 00000000..c511aa46
--- /dev/null
+++ b/packages/cli/src/ui/contexts/SessionContext.tsx
@@ -0,0 +1,38 @@
+/**
+ * @license
+ * Copyright 2025 Google LLC
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+import React, { createContext, useContext, useState, useMemo } from 'react';
+
+interface SessionContextType {
+ startTime: Date;
+}
+
+const SessionContext = createContext(null);
+
+export const SessionProvider: React.FC<{ children: React.ReactNode }> = ({
+ children,
+}) => {
+ const [startTime] = useState(new Date());
+
+ const value = useMemo(
+ () => ({
+ startTime,
+ }),
+ [startTime],
+ );
+
+ return (
+ {children}
+ );
+};
+
+export const useSession = () => {
+ const context = useContext(SessionContext);
+ if (!context) {
+ throw new Error('useSession must be used within a SessionProvider');
+ }
+ return context;
+};
--
cgit v1.2.3