mirror of
https://github.com/lingble/twenty.git
synced 2025-10-31 12:47:58 +00:00
#7346 #7343 #7342 #7344 Before: <img width="799" alt="Screenshot 2024-10-08 at 11 59 37" src="https://github.com/user-attachments/assets/a1cd1714-41ed-4f96-85eb-2861e7a8b2c2"> Now:  In order to test: 1. Set ANALYTICS_ENABLED to true 2. Set TINYBIRD_TOKEN to your token from the workspace _twenty_analytics_playground_ 3. Write your client tinybird token in SettingsDeveloppersWebhookDetail.tsx in line 93 4. Create a Webhook in twenty and set wich events it needs to track 5. Run twenty-worker in order to make the webhooks work. 6. Do your tasks in order to populate the data 7. Enter to settings> webhook>your webhook and the statistics section should be displayed.
102 lines
3.2 KiB
TypeScript
102 lines
3.2 KiB
TypeScript
import { NivoLineInput } from '@/settings/developers/webhook/components/SettingsDevelopersWebhookUsageGraph';
|
|
import { webhookGraphDataState } from '@/settings/developers/webhook/states/webhookGraphDataState';
|
|
import { SnackBarVariant } from '@/ui/feedback/snack-bar-manager/components/SnackBar';
|
|
import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
|
|
import { useEffect } from 'react';
|
|
import { useSetRecoilState } from 'recoil';
|
|
|
|
type SettingsDevelopersWebhookUsageGraphEffectProps = {
|
|
webhookId: string;
|
|
};
|
|
|
|
export const SettingsDevelopersWebhookUsageGraphEffect = ({
|
|
webhookId,
|
|
}: SettingsDevelopersWebhookUsageGraphEffectProps) => {
|
|
const setWebhookGraphData = useSetRecoilState(webhookGraphDataState);
|
|
|
|
const { enqueueSnackBar } = useSnackBar();
|
|
|
|
useEffect(() => {
|
|
const fetchData = async () => {
|
|
try {
|
|
const queryString = new URLSearchParams({
|
|
webhookIdRequest: webhookId,
|
|
}).toString();
|
|
const token = 'REPLACE_ME';
|
|
const response = await fetch(
|
|
`https://api.eu-central-1.aws.tinybird.co/v0/pipes/getWebhooksAnalytics.json?${queryString}`,
|
|
{
|
|
headers: {
|
|
Authorization: 'Bearer ' + token,
|
|
},
|
|
},
|
|
);
|
|
const result = await response.json();
|
|
|
|
if (!response.ok) {
|
|
enqueueSnackBar('Something went wrong while fetching webhook usage', {
|
|
variant: SnackBarVariant.Error,
|
|
});
|
|
return;
|
|
}
|
|
|
|
const graphInput = result.data
|
|
.flatMap(
|
|
(dataRow: {
|
|
start_interval: string;
|
|
failure_count: number;
|
|
success_count: number;
|
|
}) => [
|
|
{
|
|
x: dataRow.start_interval,
|
|
y: dataRow.failure_count,
|
|
id: 'failure_count',
|
|
color: 'red',
|
|
},
|
|
{
|
|
x: dataRow.start_interval,
|
|
y: dataRow.success_count,
|
|
id: 'success_count',
|
|
color: 'green',
|
|
},
|
|
],
|
|
)
|
|
.reduce(
|
|
(
|
|
acc: NivoLineInput[],
|
|
{
|
|
id,
|
|
x,
|
|
y,
|
|
color,
|
|
}: { id: string; x: string; y: number; color: string },
|
|
) => {
|
|
const existingGroupIndex = acc.findIndex(
|
|
(group) => group.id === id,
|
|
);
|
|
const isExistingGroup = existingGroupIndex !== -1;
|
|
|
|
if (isExistingGroup) {
|
|
return acc.map((group, index) =>
|
|
index === existingGroupIndex
|
|
? { ...group, data: [...group.data, { x, y }] }
|
|
: group,
|
|
);
|
|
} else {
|
|
return [...acc, { id, color, data: [{ x, y }] }];
|
|
}
|
|
},
|
|
[],
|
|
);
|
|
setWebhookGraphData(graphInput);
|
|
} catch (error) {
|
|
enqueueSnackBar('Something went wrong while fetching webhook usage', {
|
|
variant: SnackBarVariant.Error,
|
|
});
|
|
}
|
|
};
|
|
fetchData();
|
|
}, [enqueueSnackBar, setWebhookGraphData, webhookId]);
|
|
return <></>;
|
|
};
|