/* Copyright (C) 2023-2026 QuantumNous This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ import type { FlowQuotaDataItem, FlowUserFilterOption, } from '@/features/dashboard/types' export type FlowDisplayState = 'loading' | 'error' | 'empty' | 'chart' export interface FlowResponse { success: boolean data?: FlowQuotaDataItem[] message?: string } export function requireSuccessfulFlowRows( response: FlowResponse, fallbackMessage: string ): FlowQuotaDataItem[] { if (!response.success) { throw new Error(response.message || fallbackMessage) } return response.data ?? [] } export function flowDisplayState(options: { isLoading: boolean isError: boolean linkCount: number themeReady: boolean }): FlowDisplayState { if (options.isLoading) return 'loading' if (options.isError) return 'error' if (options.linkCount === 0) return 'empty' if (!options.themeReady) return 'loading' return 'chart' } export function compactFlowSelectionLabel(count: number): string { return count > 0 ? String(count) : '*' } export function visibleFlowUsers( users: FlowUserFilterOption[], selectedUsers: string[] ): FlowUserFilterOption[] { if (selectedUsers.length === 0) return users const selected = new Set(selectedUsers) return users.filter((user) => selected.has(user.value)) }