Files
twenty/packages/twenty-front/src/testing/profiling/components/ProfilingReporter.tsx
T
Charles Bochet d81f006979 Rename Jotai state hooks and utilities to consistent Atom-based naming (#18209)
## Summary

Rename all Jotai-based state management hooks and utilities to a
consistent naming convention that:
1. Removes legacy Recoil naming (`useRecoilXxxV2`, `createXxxV2`)
2. Always includes `Atom` in the name to distinguish from jotai native
hooks
3. Follows a consistent ordering: `Atom` → `Component` → `Family` →
`Type` (`State`/`Selector`)
4. Includes the type qualifier (`State` or `Selector`) in all
value-reading hooks to avoid naming conflicts with jotai's native
`useAtomValue`

## Naming Convention

**Hooks**:
`use[Set]Atom[Component][Family][State|Selector][Value|State|CallbackState]`
**Utils**: `createAtom[Component][Family][State|Selector]`

## Changes

### Hooks renamed (definition files + all usages across ~1,500 files):

| Old Name (Recoil) | Intermediate (Atom) | Final Name |
|---|---|---|
| `useRecoilValueV2` | `useAtomValue` | **`useAtomStateValue`** |
| `useRecoilStateV2` | `useAtomState` | `useAtomState` |
| `useSetRecoilStateV2` | `useSetAtomState` | `useSetAtomState` |
| `useFamilyRecoilValueV2` | `useFamilyAtomValue` |
**`useAtomFamilyStateValue`** |
| `useSetFamilyRecoilStateV2` | `useSetFamilyAtomState` |
**`useSetAtomFamilyState`** |
| `useFamilySelectorValueV2` | `useFamilySelectorValue` |
**`useAtomFamilySelectorValue`** |
| `useFamilySelectorStateV2` | `useFamilySelectorState` |
**`useAtomFamilySelectorState`** |
| `useRecoilComponentValueV2` | `useAtomComponentValue` |
**`useAtomComponentStateValue`** |
| `useRecoilComponentStateV2` | `useAtomComponentState` |
`useAtomComponentState` |
| `useSetRecoilComponentStateV2` | `useSetAtomComponentState` |
`useSetAtomComponentState` |
| `useRecoilComponentFamilyValueV2` | `useAtomComponentFamilyValue` |
**`useAtomComponentFamilyStateValue`** |
| `useRecoilComponentFamilyStateV2` | `useAtomComponentFamilyState` |
`useAtomComponentFamilyState` |
| `useSetRecoilComponentFamilyStateV2` |
`useSetAtomComponentFamilyState` | `useSetAtomComponentFamilyState` |
| `useRecoilComponentSelectorValueV2` | `useAtomComponentSelectorValue`
| `useAtomComponentSelectorValue` |
| `useRecoilComponentFamilySelectorValueV2` |
`useAtomComponentFamilySelectorValue` |
`useAtomComponentFamilySelectorValue` |
| `useRecoilComponentStateCallbackStateV2` |
`useAtomComponentStateCallbackState` |
`useAtomComponentStateCallbackState` |
| `useRecoilComponentSelectorCallbackStateV2` |
`useAtomComponentSelectorCallbackState` |
`useAtomComponentSelectorCallbackState` |
| `useRecoilComponentFamilyStateCallbackStateV2` |
`useAtomComponentFamilyStateCallbackState` |
`useAtomComponentFamilyStateCallbackState` |
| `useRecoilComponentFamilySelectorCallbackStateV2` |
`useAtomComponentFamilySelectorCallbackState` |
`useAtomComponentFamilySelectorCallbackState` |

### Utilities renamed:

| Old Name (Recoil) | Final Name |
|---|---|
| `createStateV2` | **`createAtomState`** |
| `createFamilyStateV2` | **`createAtomFamilyState`** |
| `createSelectorV2` | **`createAtomSelector`** |
| `createFamilySelectorV2` | **`createAtomFamilySelector`** |
| `createWritableSelectorV2` | **`createAtomWritableSelector`** |
| `createWritableFamilySelectorV2` |
**`createAtomWritableFamilySelector`** |
| `createComponentStateV2` | **`createAtomComponentState`** |
| `createComponentFamilyStateV2` | **`createAtomComponentFamilyState`**
|
| `createComponentSelectorV2` | **`createAtomComponentSelector`** |
| `createComponentFamilySelectorV2` |
**`createAtomComponentFamilySelector`** |

## Details

- All definition files renamed to match new convention
- All import paths and usages updated across the entire `twenty-front`
package
- Jotai's native `useAtomValue` is aliased as `useJotaiAtomValue` in the
wrapper hook to avoid collision
- Legacy Recoil files in `state/utils/` and `component-state/utils/`
left untouched (separate naming scope)
- Typecheck passes cleanly
2026-02-25 01:55:46 +01:00

98 lines
3.4 KiB
TypeScript

import styled from '@emotion/styled';
import { useMemo } from 'react';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { PROFILING_REPORTER_DIV_ID } from '~/testing/profiling/constants/ProfilingReporterDivId';
import { currentProfilingRunIndexState } from '~/testing/profiling/states/currentProfilingRunIndexState';
import { profilingSessionDataPointsState } from '~/testing/profiling/states/profilingSessionDataPointsState';
import { profilingSessionStatusState } from '~/testing/profiling/states/profilingSessionStatusState';
import { computeProfilingReport } from '~/testing/profiling/utils/computeProfilingReport';
const StyledTable = styled.table`
border: 1px solid black;
th,
td {
border: 1px solid black;
}
td {
padding: 5px;
}
`;
export const ProfilingReporter = () => {
const profilingSessionDataPoints = useAtomStateValue(
profilingSessionDataPointsState,
);
const currentProfilingRunIndex = useAtomStateValue(
currentProfilingRunIndexState,
);
const profilingSessionStatus = useAtomStateValue(profilingSessionStatusState);
const profilingReport = useMemo(
() => computeProfilingReport(profilingSessionDataPoints),
[profilingSessionDataPoints],
);
return (
<div
data-profiling-report={JSON.stringify(profilingReport)}
id={PROFILING_REPORTER_DIV_ID}
>
<h2>Profiling report</h2>
<div>
Run #{currentProfilingRunIndex} - Status {profilingSessionStatus}
</div>
<StyledTable>
<thead>
<tr>
<th>Run name</th>
<th>Min</th>
<th>Average</th>
<th>P50</th>
<th>P80</th>
<th>P90</th>
<th>P95</th>
<th>P99</th>
<th>Max</th>
<th>Variance</th>
</tr>
</thead>
<tbody>
<tr style={{ fontWeight: 'bold' }}>
<td>Total</td>
<td>{Math.round(profilingReport.total.min * 1000) / 1000}ms</td>
<td>{Math.round(profilingReport.total.average * 1000) / 1000}ms</td>
<td>{Math.round(profilingReport.total.p50 * 1000) / 1000}ms</td>
<td>{Math.round(profilingReport.total.p80 * 1000) / 1000}ms</td>
<td>{Math.round(profilingReport.total.p90 * 1000) / 1000}ms</td>
<td>{Math.round(profilingReport.total.p95 * 1000) / 1000}ms</td>
<td>{Math.round(profilingReport.total.p99 * 1000) / 1000}ms</td>
<td>{Math.round(profilingReport.total.max * 1000) / 1000}ms</td>
<td>
{Math.round(profilingReport.total.variance * 1000000) / 1000000}
</td>
</tr>
{Object.entries(profilingReport.runs).map(([runName, report]) => (
<tr key={runName}>
<td>{runName}</td>
<td>{Math.round(report.min * 1000) / 1000}ms</td>
<td>{Math.round(report.average * 1000) / 1000}ms</td>
<td>{Math.round(report.p50 * 1000) / 1000}ms</td>
<td>{Math.round(report.p80 * 1000) / 1000}ms</td>
<td>{Math.round(report.p90 * 1000) / 1000}ms</td>
<td>{Math.round(report.p95 * 1000) / 1000}ms</td>
<td>{Math.round(report.p99 * 1000) / 1000}ms</td>
<td>{Math.round(report.max * 1000) / 1000}ms</td>
<td>{Math.round(report.variance * 1000000) / 1000000}</td>
</tr>
))}
</tbody>
</StyledTable>
</div>
);
};