From f2e37e25e3588eb71928f3c777c1d6ff8fc9cf67 Mon Sep 17 00:00:00 2001 From: Najuna Date: Tue, 17 Feb 2026 15:18:45 +0300 Subject: [PATCH] feat: expose user role in getCurrentUser() for custom web apps --- .../src/types/FormulusInterfaceDefinition.ts | 10 ++++-- .../webview/FormulusInterfaceDefinition.ts | 10 ++++-- .../src/webview/FormulusMessageHandlers.ts | 36 +++++++++++++++---- .../webview/FormulusMessageHandlers.types.ts | 6 +++- 4 files changed, 49 insertions(+), 13 deletions(-) diff --git a/formulus-formplayer/src/types/FormulusInterfaceDefinition.ts b/formulus-formplayer/src/types/FormulusInterfaceDefinition.ts index b28d4ffd6..fef86f436 100644 --- a/formulus-formplayer/src/types/FormulusInterfaceDefinition.ts +++ b/formulus-formplayer/src/types/FormulusInterfaceDefinition.ts @@ -8,7 +8,7 @@ * If you've checked out the monorepo use: * cp ..\formulus\src\webview\FormulusInterfaceDefinition.ts .\src\FormulusInterfaceDefinition.ts * - * Current Version: 1.0.17 + * Current Version: 1.0.18 */ /** @@ -458,9 +458,13 @@ export interface FormulusInterface { /** * Get information about the currently authenticated user - * @returns {Promise<{username: string, displayName?: string}>} User information + * @returns {Promise<{username: string, displayName?: string, role?: 'read-only' | 'read-write' | 'admin'}>} User information including role */ - getCurrentUser(): Promise<{ username: string; displayName?: string }>; + getCurrentUser(): Promise<{ + username: string; + displayName?: string; + role?: 'read-only' | 'read-write' | 'admin'; + }>; } /** diff --git a/formulus/src/webview/FormulusInterfaceDefinition.ts b/formulus/src/webview/FormulusInterfaceDefinition.ts index b28d4ffd6..fef86f436 100644 --- a/formulus/src/webview/FormulusInterfaceDefinition.ts +++ b/formulus/src/webview/FormulusInterfaceDefinition.ts @@ -8,7 +8,7 @@ * If you've checked out the monorepo use: * cp ..\formulus\src\webview\FormulusInterfaceDefinition.ts .\src\FormulusInterfaceDefinition.ts * - * Current Version: 1.0.17 + * Current Version: 1.0.18 */ /** @@ -458,9 +458,13 @@ export interface FormulusInterface { /** * Get information about the currently authenticated user - * @returns {Promise<{username: string, displayName?: string}>} User information + * @returns {Promise<{username: string, displayName?: string, role?: 'read-only' | 'read-write' | 'admin'}>} User information including role */ - getCurrentUser(): Promise<{ username: string; displayName?: string }>; + getCurrentUser(): Promise<{ + username: string; + displayName?: string; + role?: 'read-only' | 'read-write' | 'admin'; + }>; } /** diff --git a/formulus/src/webview/FormulusMessageHandlers.ts b/formulus/src/webview/FormulusMessageHandlers.ts index 5cd45328c..3a963096f 100644 --- a/formulus/src/webview/FormulusMessageHandlers.ts +++ b/formulus/src/webview/FormulusMessageHandlers.ts @@ -6,6 +6,7 @@ import { GeolocationService } from '../services/GeolocationService'; import { WebViewMessageEvent, WebView } from 'react-native-webview'; import RNFS from 'react-native-fs'; import * as Keychain from 'react-native-keychain'; +import AsyncStorage from '@react-native-async-storage/async-storage'; import { Alert } from 'react-native'; import * as ImagePicker from 'react-native-image-picker'; import { @@ -962,17 +963,40 @@ export function createFormulusMessageHandlers(): FormulusMessageHandlers { onGetCurrentUser: async (): Promise<{ username: string; displayName?: string; + role?: 'read-only' | 'read-write' | 'admin'; }> => { try { const credentials = await Keychain.getGenericPassword(); - if (credentials) { - return { - username: credentials.username, - displayName: credentials.username, - }; - } else { + if (!credentials) { throw new Error('No user credentials found'); } + + // Retrieve role from stored user info (set during login) + let role: 'read-only' | 'read-write' | 'admin' | undefined; + try { + const userJson = await AsyncStorage.getItem('@user'); + if (userJson) { + const userInfo = JSON.parse(userJson); + if ( + userInfo.role === 'admin' || + userInfo.role === 'read-write' || + userInfo.role === 'read-only' + ) { + role = userInfo.role; + } + } + } catch (roleError) { + console.warn( + 'FormulusMessageHandlers: Failed to retrieve user role:', + roleError, + ); + } + + return { + username: credentials.username, + displayName: credentials.username, + role, + }; } catch (error) { console.error( 'FormulusMessageHandlers: Failed to get current user:', diff --git a/formulus/src/webview/FormulusMessageHandlers.types.ts b/formulus/src/webview/FormulusMessageHandlers.types.ts index 804772822..0809fc1d9 100644 --- a/formulus/src/webview/FormulusMessageHandlers.types.ts +++ b/formulus/src/webview/FormulusMessageHandlers.types.ts @@ -61,7 +61,11 @@ export interface FormulusMessageHandlers { whereClause?: string | null; }) => Promise; onOpenFormplayer?: (data: FormInitData) => Promise; - onGetCurrentUser?: () => Promise<{ username: string; displayName?: string }>; + onGetCurrentUser?: () => Promise<{ + username: string; + displayName?: string; + role?: 'read-only' | 'read-write' | 'admin'; + }>; // Called when the Formplayer WebView signals that it has completed initialization // via a `formplayerInitialized` message. Primarily used for logging/diagnostics. onFormplayerInitialized?: (data: {