Files
awesome-reviewers/_reviewers/posthog-keep-state-in-kea.json
2025-08-19 12:19:58 +00:00

70 lines
17 KiB
JSON

[
{
"discussion_id": "2250796145",
"pr_number": 35753,
"pr_file": "frontend/src/lib/components/TaxonomicFilter/taxonomicFilterLogic.tsx",
"created_at": "2025-08-04T08:33:31+00:00",
"commented_code": "() => [(_, props) => props.allowNonCapturedEvents],\n (allowNonCapturedEvents: boolean | undefined) => allowNonCapturedEvents ?? false,\n ],\n+ enablePreaggregatedTableHints: [\n+ () => [(_, props) => props.enablePreaggregatedTableHints],\n+ (enablePreaggregatedTableHints) => !!enablePreaggregatedTableHints,\n+ ],\n taxonomicGroups: [\n- (s) => [\n- s.currentTeam,\n- s.currentProjectId,\n- s.groupAnalyticsTaxonomicGroups,\n- s.groupAnalyticsTaxonomicGroupNames,\n- s.eventNames,\n- s.schemaColumns,\n- s.metadataSource,\n- s.propertyFilters,\n- s.eventMetadataPropertyDefinitions,\n- s.eventOrdering,\n- s.maxContextOptions,\n- ],\n+ (s) =>\n+ [\n+ s.currentTeam,\n+ s.currentProjectId,\n+ s.groupAnalyticsTaxonomicGroups,\n+ s.groupAnalyticsTaxonomicGroupNames,\n+ s.eventNames,\n+ s.schemaColumns,\n+ s.metadataSource,\n+ s.propertyFilters,\n+ s.eventMetadataPropertyDefinitions,\n+ s.eventOrdering,\n+ s.maxContextOptions,\n+ s.enablePreaggregatedTableHints,\n+ ] as any, // workaround as Kea's SelectorTuple has a limit of 11 items: https://github.com/keajs/kea/blob/v3.1.5/src/types.ts#L162-L174",
"repo_full_name": "PostHog/posthog",
"discussion_comments": [
{
"comment_id": "2250796145",
"repo_full_name": "PostHog/posthog",
"pr_number": 35753,
"pr_file": "frontend/src/lib/components/TaxonomicFilter/taxonomicFilterLogic.tsx",
"discussion_id": "2250796145",
"commented_code": "@@ -207,20 +208,26 @@ export const taxonomicFilterLogic = kea<taxonomicFilterLogicType>([\n () => [(_, props) => props.allowNonCapturedEvents],\n (allowNonCapturedEvents: boolean | undefined) => allowNonCapturedEvents ?? false,\n ],\n+ enablePreaggregatedTableHints: [\n+ () => [(_, props) => props.enablePreaggregatedTableHints],\n+ (enablePreaggregatedTableHints) => !!enablePreaggregatedTableHints,\n+ ],\n taxonomicGroups: [\n- (s) => [\n- s.currentTeam,\n- s.currentProjectId,\n- s.groupAnalyticsTaxonomicGroups,\n- s.groupAnalyticsTaxonomicGroupNames,\n- s.eventNames,\n- s.schemaColumns,\n- s.metadataSource,\n- s.propertyFilters,\n- s.eventMetadataPropertyDefinitions,\n- s.eventOrdering,\n- s.maxContextOptions,\n- ],\n+ (s) =>\n+ [\n+ s.currentTeam,\n+ s.currentProjectId,\n+ s.groupAnalyticsTaxonomicGroups,\n+ s.groupAnalyticsTaxonomicGroupNames,\n+ s.eventNames,\n+ s.schemaColumns,\n+ s.metadataSource,\n+ s.propertyFilters,\n+ s.eventMetadataPropertyDefinitions,\n+ s.eventOrdering,\n+ s.maxContextOptions,\n+ s.enablePreaggregatedTableHints,\n+ ] as any, // workaround as Kea's SelectorTuple has a limit of 11 items: https://github.com/keajs/kea/blob/v3.1.5/src/types.ts#L162-L174",
"comment_created_at": "2025-08-04T08:33:31+00:00",
"comment_author": "robbie-c",
"comment_body": "I've worked around these before by grouping them up and making another selector just to get a group of props\r\n\r\ne.g. you could add a selector that returns {currentTeam, currentProjectId} and then taxonomicGroups can use that selector.",
"pr_file_module": null
},
{
"comment_id": "2250881834",
"repo_full_name": "PostHog/posthog",
"pr_number": 35753,
"pr_file": "frontend/src/lib/components/TaxonomicFilter/taxonomicFilterLogic.tsx",
"discussion_id": "2250796145",
"commented_code": "@@ -207,20 +208,26 @@ export const taxonomicFilterLogic = kea<taxonomicFilterLogicType>([\n () => [(_, props) => props.allowNonCapturedEvents],\n (allowNonCapturedEvents: boolean | undefined) => allowNonCapturedEvents ?? false,\n ],\n+ enablePreaggregatedTableHints: [\n+ () => [(_, props) => props.enablePreaggregatedTableHints],\n+ (enablePreaggregatedTableHints) => !!enablePreaggregatedTableHints,\n+ ],\n taxonomicGroups: [\n- (s) => [\n- s.currentTeam,\n- s.currentProjectId,\n- s.groupAnalyticsTaxonomicGroups,\n- s.groupAnalyticsTaxonomicGroupNames,\n- s.eventNames,\n- s.schemaColumns,\n- s.metadataSource,\n- s.propertyFilters,\n- s.eventMetadataPropertyDefinitions,\n- s.eventOrdering,\n- s.maxContextOptions,\n- ],\n+ (s) =>\n+ [\n+ s.currentTeam,\n+ s.currentProjectId,\n+ s.groupAnalyticsTaxonomicGroups,\n+ s.groupAnalyticsTaxonomicGroupNames,\n+ s.eventNames,\n+ s.schemaColumns,\n+ s.metadataSource,\n+ s.propertyFilters,\n+ s.eventMetadataPropertyDefinitions,\n+ s.eventOrdering,\n+ s.maxContextOptions,\n+ s.enablePreaggregatedTableHints,\n+ ] as any, // workaround as Kea's SelectorTuple has a limit of 11 items: https://github.com/keajs/kea/blob/v3.1.5/src/types.ts#L162-L174",
"comment_created_at": "2025-08-04T09:09:02+00:00",
"comment_author": "lricoy",
"comment_body": "This is a nice option. Rafa and Marius updated Kea, and now we can go up to 16 \ud83c\udf89 ",
"pr_file_module": null
}
]
},
{
"discussion_id": "2270824949",
"pr_number": 36474,
"pr_file": "frontend/src/scenes/data-warehouse/DataWarehouseScene.tsx",
"created_at": "2025-08-12T18:48:36+00:00",
"commented_code": "+import { useMemo, useState, useEffect } from 'react'\n import { SceneExport } from 'scenes/sceneTypes'\n+import { PipelineTab } from '~/types'\n import { FEATURE_FLAGS } from 'lib/constants'\n import { featureFlagLogic } from 'lib/logic/featureFlagLogic'\n import { useValues } from 'kea'\n import { NotFound } from 'lib/components/NotFound'\n+import { urls } from 'scenes/urls'\n+import { LemonButton, LemonCard, LemonTag, Tooltip } from '@posthog/lemon-ui'\n+import { PaginationControl, usePagination } from 'lib/lemon-ui/PaginationControl'\n+import { IconPlusSmall, IconCheckCircle, IconInfo } from '@posthog/icons'\n+import { IconOpenInNew } from 'lib/lemon-ui/icons'\n+import { dataWarehouseSettingsLogic } from './settings/dataWarehouseSettingsLogic'\n+import { dataWarehouseSceneLogic } from './settings/dataWarehouseSceneLogic'\n+import { TZLabel } from 'lib/components/TZLabel'\n+import { IconCancel, IconSync, IconExclamation, IconRadioButtonUnchecked } from 'lib/lemon-ui/icons'\n+import { fetchRecentActivity, fetchTotalRowsProcessed, type UnifiedRecentActivity } from './externalDataSourcesLogic'\n \n-export const scene: SceneExport = {\n- component: DataWarehouseScene,\n+export const scene: SceneExport = { component: DataWarehouseScene }\n+\n+const LIST_SIZE = 5\n+\n+const getSourceType = (sourceType: string, availableSources?: Record<string, any> | null): 'Database' | 'API' => {\n+ const fields = availableSources?.[sourceType]?.fields || []\n+ if (fields.some((f: any) => f.name === 'connection_string' || ['host', 'port', 'database'].includes(f.name))) {\n+ return 'Database'\n+ }\n+ if (fields.some((f: any) => f.type === 'oauth' || ['api_key', 'access_token'].includes(f.name))) {\n+ return 'API'\n+ }\n+ return 'API'\n+}\n+\n+interface DashboardDataSource {\n+ id: string\n+ name: string\n+ type: 'Database' | 'API'\n+ status: string | null\n+ lastSync: string | null\n+ rowCount: number | null\n+ url: string\n }\n \n export function DataWarehouseScene(): JSX.Element {\n const { featureFlags } = useValues(featureFlagLogic)\n+ const { dataWarehouseSources, selfManagedTables } = useValues(dataWarehouseSettingsLogic)\n+ const { materializedViews } = useValues(dataWarehouseSceneLogic)\n+\n+ const [recentActivity, setRecentActivity] = useState<UnifiedRecentActivity[]>([])\n+ const [totalRowsProcessed, setTotalRowsProcessed] = useState<number>(0)\n+\n+ useEffect(() => {\n+ const loadData = async (): Promise<void> => {\n+ const [activities, totalRows] = await Promise.all([\n+ fetchRecentActivity(dataWarehouseSources?.results || [], materializedViews),\n+ fetchTotalRowsProcessed(dataWarehouseSources?.results || [], materializedViews),\n+ ])\n+ setRecentActivity(activities)\n+ setTotalRowsProcessed(totalRows)\n+ }\n+\n+ if ((dataWarehouseSources?.results?.length || 0) > 0 || materializedViews.length > 0) {\n+ loadData()\n+ }\n+ }, [dataWarehouseSources?.results, materializedViews])\n+\n+ const allSources = useMemo(",
"repo_full_name": "PostHog/posthog",
"discussion_comments": [
{
"comment_id": "2270824949",
"repo_full_name": "PostHog/posthog",
"pr_number": 36474,
"pr_file": "frontend/src/scenes/data-warehouse/DataWarehouseScene.tsx",
"discussion_id": "2270824949",
"commented_code": "@@ -1,43 +1,358 @@\n+import { useMemo, useState, useEffect } from 'react'\n import { SceneExport } from 'scenes/sceneTypes'\n+import { PipelineTab } from '~/types'\n import { FEATURE_FLAGS } from 'lib/constants'\n import { featureFlagLogic } from 'lib/logic/featureFlagLogic'\n import { useValues } from 'kea'\n import { NotFound } from 'lib/components/NotFound'\n+import { urls } from 'scenes/urls'\n+import { LemonButton, LemonCard, LemonTag, Tooltip } from '@posthog/lemon-ui'\n+import { PaginationControl, usePagination } from 'lib/lemon-ui/PaginationControl'\n+import { IconPlusSmall, IconCheckCircle, IconInfo } from '@posthog/icons'\n+import { IconOpenInNew } from 'lib/lemon-ui/icons'\n+import { dataWarehouseSettingsLogic } from './settings/dataWarehouseSettingsLogic'\n+import { dataWarehouseSceneLogic } from './settings/dataWarehouseSceneLogic'\n+import { TZLabel } from 'lib/components/TZLabel'\n+import { IconCancel, IconSync, IconExclamation, IconRadioButtonUnchecked } from 'lib/lemon-ui/icons'\n+import { fetchRecentActivity, fetchTotalRowsProcessed, type UnifiedRecentActivity } from './externalDataSourcesLogic'\n \n-export const scene: SceneExport = {\n- component: DataWarehouseScene,\n+export const scene: SceneExport = { component: DataWarehouseScene }\n+\n+const LIST_SIZE = 5\n+\n+const getSourceType = (sourceType: string, availableSources?: Record<string, any> | null): 'Database' | 'API' => {\n+ const fields = availableSources?.[sourceType]?.fields || []\n+ if (fields.some((f: any) => f.name === 'connection_string' || ['host', 'port', 'database'].includes(f.name))) {\n+ return 'Database'\n+ }\n+ if (fields.some((f: any) => f.type === 'oauth' || ['api_key', 'access_token'].includes(f.name))) {\n+ return 'API'\n+ }\n+ return 'API'\n+}\n+\n+interface DashboardDataSource {\n+ id: string\n+ name: string\n+ type: 'Database' | 'API'\n+ status: string | null\n+ lastSync: string | null\n+ rowCount: number | null\n+ url: string\n }\n \n export function DataWarehouseScene(): JSX.Element {\n const { featureFlags } = useValues(featureFlagLogic)\n+ const { dataWarehouseSources, selfManagedTables } = useValues(dataWarehouseSettingsLogic)\n+ const { materializedViews } = useValues(dataWarehouseSceneLogic)\n+\n+ const [recentActivity, setRecentActivity] = useState<UnifiedRecentActivity[]>([])\n+ const [totalRowsProcessed, setTotalRowsProcessed] = useState<number>(0)\n+\n+ useEffect(() => {\n+ const loadData = async (): Promise<void> => {\n+ const [activities, totalRows] = await Promise.all([\n+ fetchRecentActivity(dataWarehouseSources?.results || [], materializedViews),\n+ fetchTotalRowsProcessed(dataWarehouseSources?.results || [], materializedViews),\n+ ])\n+ setRecentActivity(activities)\n+ setTotalRowsProcessed(totalRows)\n+ }\n+\n+ if ((dataWarehouseSources?.results?.length || 0) > 0 || materializedViews.length > 0) {\n+ loadData()\n+ }\n+ }, [dataWarehouseSources?.results, materializedViews])\n+\n+ const allSources = useMemo(",
"comment_created_at": "2025-08-12T18:48:36+00:00",
"comment_author": "EDsCODE",
"comment_body": "All of this logic should be contained within kea too. The rule of thumb is state logic should pretty much not exist in the components themselves besides pulling in actions and values. ",
"pr_file_module": null
},
{
"comment_id": "2271667725",
"repo_full_name": "PostHog/posthog",
"pr_number": 36474,
"pr_file": "frontend/src/scenes/data-warehouse/DataWarehouseScene.tsx",
"discussion_id": "2270824949",
"commented_code": "@@ -1,43 +1,358 @@\n+import { useMemo, useState, useEffect } from 'react'\n import { SceneExport } from 'scenes/sceneTypes'\n+import { PipelineTab } from '~/types'\n import { FEATURE_FLAGS } from 'lib/constants'\n import { featureFlagLogic } from 'lib/logic/featureFlagLogic'\n import { useValues } from 'kea'\n import { NotFound } from 'lib/components/NotFound'\n+import { urls } from 'scenes/urls'\n+import { LemonButton, LemonCard, LemonTag, Tooltip } from '@posthog/lemon-ui'\n+import { PaginationControl, usePagination } from 'lib/lemon-ui/PaginationControl'\n+import { IconPlusSmall, IconCheckCircle, IconInfo } from '@posthog/icons'\n+import { IconOpenInNew } from 'lib/lemon-ui/icons'\n+import { dataWarehouseSettingsLogic } from './settings/dataWarehouseSettingsLogic'\n+import { dataWarehouseSceneLogic } from './settings/dataWarehouseSceneLogic'\n+import { TZLabel } from 'lib/components/TZLabel'\n+import { IconCancel, IconSync, IconExclamation, IconRadioButtonUnchecked } from 'lib/lemon-ui/icons'\n+import { fetchRecentActivity, fetchTotalRowsProcessed, type UnifiedRecentActivity } from './externalDataSourcesLogic'\n \n-export const scene: SceneExport = {\n- component: DataWarehouseScene,\n+export const scene: SceneExport = { component: DataWarehouseScene }\n+\n+const LIST_SIZE = 5\n+\n+const getSourceType = (sourceType: string, availableSources?: Record<string, any> | null): 'Database' | 'API' => {\n+ const fields = availableSources?.[sourceType]?.fields || []\n+ if (fields.some((f: any) => f.name === 'connection_string' || ['host', 'port', 'database'].includes(f.name))) {\n+ return 'Database'\n+ }\n+ if (fields.some((f: any) => f.type === 'oauth' || ['api_key', 'access_token'].includes(f.name))) {\n+ return 'API'\n+ }\n+ return 'API'\n+}\n+\n+interface DashboardDataSource {\n+ id: string\n+ name: string\n+ type: 'Database' | 'API'\n+ status: string | null\n+ lastSync: string | null\n+ rowCount: number | null\n+ url: string\n }\n \n export function DataWarehouseScene(): JSX.Element {\n const { featureFlags } = useValues(featureFlagLogic)\n+ const { dataWarehouseSources, selfManagedTables } = useValues(dataWarehouseSettingsLogic)\n+ const { materializedViews } = useValues(dataWarehouseSceneLogic)\n+\n+ const [recentActivity, setRecentActivity] = useState<UnifiedRecentActivity[]>([])\n+ const [totalRowsProcessed, setTotalRowsProcessed] = useState<number>(0)\n+\n+ useEffect(() => {\n+ const loadData = async (): Promise<void> => {\n+ const [activities, totalRows] = await Promise.all([\n+ fetchRecentActivity(dataWarehouseSources?.results || [], materializedViews),\n+ fetchTotalRowsProcessed(dataWarehouseSources?.results || [], materializedViews),\n+ ])\n+ setRecentActivity(activities)\n+ setTotalRowsProcessed(totalRows)\n+ }\n+\n+ if ((dataWarehouseSources?.results?.length || 0) > 0 || materializedViews.length > 0) {\n+ loadData()\n+ }\n+ }, [dataWarehouseSources?.results, materializedViews])\n+\n+ const allSources = useMemo(",
"comment_created_at": "2025-08-13T00:03:29+00:00",
"comment_author": "naumaanh",
"comment_body": "got it, i'll logically adjust this to go into kea, thanks for the rule of thumb i've made sure to note it down \ud83d\udc4d ",
"pr_file_module": null
}
]
}
]