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