Skip to content

Commit

Permalink
Merge pull request #79 from marmelab/telemetry
Browse files Browse the repository at this point in the history
Add telemetry
  • Loading branch information
slax57 authored Jan 10, 2025
2 parents b2d52a9 + e10bf80 commit df19ad4
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 49 deletions.
20 changes: 20 additions & 0 deletions doc/developer/customizing.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,4 +112,24 @@ export const Dashboard = () => (
</CardContent>
</Card>
);
```

## Disabling Telemetry

In production, atomic-crm applications send an anonymous request on mount to a telemetry server operated by Marmelab. You can see this request by looking at the Network tab of your browser DevTools:

```
https://atomic-crm-telemetry.marmelab.com/atomic-crm-telemetry
```

The only data sent to the telemetry server is the admin domain (e.g. “example.com”) - no personal data is ever sent, and no cookie is included in the response. The atomic-crm team uses these domains to track the usage of the framework.

You can opt out of telemetry by simply adding `disableTelemetry` to the `<CRM>` component:

```tsx
import { CRM } from './root/CRM';

const App = () => <CRM disableTelemetry />;

export default App;
```
120 changes: 71 additions & 49 deletions src/root/CRM.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { useEffect } from 'react';
import {
Admin,
CustomRoutes,
Expand Down Expand Up @@ -127,55 +128,76 @@ export const CRM = ({
title = defaultTitle,
dataProvider = defaultDataProvider,
authProvider = defaultAuthProvider,
disableTelemetry,
...rest
}: CRMProps) => (
<ConfigurationProvider
contactGender={contactGender}
companySectors={companySectors}
dealCategories={dealCategories}
dealPipelineStatuses={dealPipelineStatuses}
dealStages={dealStages}
logo={logo}
noteStatuses={noteStatuses}
taskTypes={taskTypes}
title={title}
>
<Admin
dataProvider={dataProvider}
authProvider={authProvider}
store={localStorageStore(undefined, 'CRM')}
layout={Layout}
loginPage={LoginPage}
dashboard={Dashboard}
theme={lightTheme}
darkTheme={darkTheme || null}
i18nProvider={i18nProvider}
requireAuth
{...rest}
}: CRMProps) => {
useEffect(() => {
if (
disableTelemetry ||
process.env.NODE_ENV !== 'production' ||
typeof window === 'undefined' ||
typeof window.location === 'undefined' ||
typeof Image === 'undefined'
) {
return;
}
const img = new Image();
img.src = `https://atomic-crm-telemetry.marmelab.com/atomic-crm-telemetry?domain=${window.location.hostname}`;
}, [disableTelemetry]);

return (
<ConfigurationProvider
contactGender={contactGender}
companySectors={companySectors}
dealCategories={dealCategories}
dealPipelineStatuses={dealPipelineStatuses}
dealStages={dealStages}
logo={logo}
noteStatuses={noteStatuses}
taskTypes={taskTypes}
title={title}
>
<CustomRoutes noLayout>
<Route path={SignupPage.path} element={<SignupPage />} />
<Route
path={SetPasswordPage.path}
element={<SetPasswordPage />}
/>
<Route
path={ForgotPasswordPage.path}
element={<ForgotPasswordPage />}
/>
</CustomRoutes>
<Admin
dataProvider={dataProvider}
authProvider={authProvider}
store={localStorageStore(undefined, 'CRM')}
layout={Layout}
loginPage={LoginPage}
dashboard={Dashboard}
theme={lightTheme}
darkTheme={darkTheme || null}
i18nProvider={i18nProvider}
requireAuth
disableTelemetry
{...rest}
>
<CustomRoutes noLayout>
<Route path={SignupPage.path} element={<SignupPage />} />
<Route
path={SetPasswordPage.path}
element={<SetPasswordPage />}
/>
<Route
path={ForgotPasswordPage.path}
element={<ForgotPasswordPage />}
/>
</CustomRoutes>

<CustomRoutes>
<Route path={SettingsPage.path} element={<SettingsPage />} />
</CustomRoutes>
<Resource name="deals" {...deals} />
<Resource name="contacts" {...contacts} />
<Resource name="companies" {...companies} />
<Resource name="contactNotes" />
<Resource name="dealNotes" />
<Resource name="tasks" list={ListGuesser} />
<Resource name="sales" {...sales} />
<Resource name="tags" list={ListGuesser} />
</Admin>
</ConfigurationProvider>
);
<CustomRoutes>
<Route
path={SettingsPage.path}
element={<SettingsPage />}
/>
</CustomRoutes>
<Resource name="deals" {...deals} />
<Resource name="contacts" {...contacts} />
<Resource name="companies" {...companies} />
<Resource name="contactNotes" />
<Resource name="dealNotes" />
<Resource name="tasks" list={ListGuesser} />
<Resource name="sales" {...sales} />
<Resource name="tags" list={ListGuesser} />
</Admin>
</ConfigurationProvider>
);
};

0 comments on commit df19ad4

Please sign in to comment.