diff --git a/src/app/(main)/admin/users/[userId]/UserEditForm.tsx b/src/app/(main)/admin/users/[userId]/UserEditForm.tsx
index 193d2e47..52073459 100644
--- a/src/app/(main)/admin/users/[userId]/UserEditForm.tsx
+++ b/src/app/(main)/admin/users/[userId]/UserEditForm.tsx
@@ -9,15 +9,13 @@ import {
PasswordField,
useToast,
} from '@umami/react-zen';
-import { useApi, useLoginQuery, useMessages, useModified } from '@/components/hooks';
+import { useApi, useLoginQuery, useMessages, useModified, useUser } from '@/components/hooks';
import { ROLES } from '@/lib/constants';
-import { useContext } from 'react';
-import { UserContext } from './UserProvider';
export function UserEditForm({ userId, onSave }: { userId: string; onSave?: () => void }) {
const { formatMessage, labels, messages, getMessage } = useMessages();
const { post, useMutation } = useApi();
- const user = useContext(UserContext);
+ const user = useUser();
const { user: login } = useLoginQuery();
const { toast } = useToast();
const { touch } = useModified();
diff --git a/src/app/(main)/admin/users/[userId]/UserHeader.tsx b/src/app/(main)/admin/users/[userId]/UserHeader.tsx
index f9fcdd64..aeaca0b2 100644
--- a/src/app/(main)/admin/users/[userId]/UserHeader.tsx
+++ b/src/app/(main)/admin/users/[userId]/UserHeader.tsx
@@ -1,10 +1,9 @@
-import { useContext } from 'react';
import { User } from '@/components/icons';
import { PageHeader } from '@/components/common/PageHeader';
-import { UserContext } from '@/app/(main)/admin/users/[userId]/UserProvider';
+import { useUser } from '@/components/hooks';
export function UserHeader() {
- const user = useContext(UserContext);
+ const user = useUser();
return } />;
}
diff --git a/src/app/(main)/teams/[teamId]/TeamEditForm.tsx b/src/app/(main)/teams/[teamId]/TeamEditForm.tsx
index ec3b8fb0..a7b3ff25 100644
--- a/src/app/(main)/teams/[teamId]/TeamEditForm.tsx
+++ b/src/app/(main)/teams/[teamId]/TeamEditForm.tsx
@@ -8,9 +8,7 @@ import {
useToast,
} from '@umami/react-zen';
import { getRandomChars } from '@/lib/crypto';
-import { useContext } from 'react';
-import { useApi, useMessages, useModified } from '@/components/hooks';
-import { TeamContext } from '@/app/(main)/teams/TeamProvider';
+import { useApi, useMessages, useModified, useTeam } from '@/components/hooks';
const generateId = () => `team_${getRandomChars(16)}`;
@@ -23,7 +21,7 @@ export function TeamEditForm({
allowEdit?: boolean;
onSave?: () => void;
}) {
- const team = useContext(TeamContext);
+ const team = useTeam();
const { formatMessage, labels, messages } = useMessages();
const { post, useMutation } = useApi();
const { toast } = useToast();
diff --git a/src/app/(main)/teams/[teamId]/TeamSettings.tsx b/src/app/(main)/teams/[teamId]/TeamSettings.tsx
index af2a4f32..fe9647ea 100644
--- a/src/app/(main)/teams/[teamId]/TeamSettings.tsx
+++ b/src/app/(main)/teams/[teamId]/TeamSettings.tsx
@@ -1,7 +1,6 @@
-import { useContext, useState } from 'react';
+import { useState } from 'react';
import { Column, Tabs, TabList, Tab, TabPanel } from '@umami/react-zen';
-import { TeamContext } from '@/app/(main)/teams/TeamProvider';
-import { useLoginQuery, useMessages, useNavigation } from '@/components/hooks';
+import { useLoginQuery, useMessages, useNavigation, useTeam } from '@/components/hooks';
import { ROLES } from '@/lib/constants';
import { Users } from '@/components/icons';
@@ -14,7 +13,7 @@ import { PageHeader } from '@/components/common/PageHeader';
import { Panel } from '@/components/common/Panel';
export function TeamSettings({ teamId }: { teamId: string }) {
- const team = useContext(TeamContext);
+ const team = useTeam();
const { formatMessage, labels } = useMessages();
const { user } = useLoginQuery();
const { query, pathname } = useNavigation();
diff --git a/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx b/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx
index 5b493d90..c7bd1347 100644
--- a/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx
+++ b/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx
@@ -1,14 +1,19 @@
import { useFormat } from '@/components//hooks/useFormat';
import { Empty } from '@/components/common/Empty';
import { FilterButtons } from '@/components/input/FilterButtons';
-import { useCountryNames, useLocale, useMessages, useTimezone } from '@/components/hooks';
+import {
+ useCountryNames,
+ useLocale,
+ useMessages,
+ useTimezone,
+ useWebsite,
+} from '@/components/hooks';
import { Eye, Visitor, Bolt } from '@/components/icons';
import { BROWSERS, OS_NAMES } from '@/lib/constants';
import { stringToColor } from '@/lib/format';
-import { useContext, useMemo, useState } from 'react';
+import { useMemo, useState } from 'react';
import { Icon, SearchField, StatusLight, Text } from '@umami/react-zen';
import { FixedSizeList } from 'react-window';
-import { WebsiteContext } from '@/app/(main)/websites/WebsiteProvider';
import styles from './RealtimeLog.module.css';
const TYPE_ALL = 'all';
@@ -23,7 +28,7 @@ const icons = {
};
export function RealtimeLog({ data }: { data: any }) {
- const website = useContext(WebsiteContext);
+ const website = useWebsite();
const [search, setSearch] = useState('');
const { formatMessage, labels, messages } = useMessages();
const { formatValue } = useFormat();
diff --git a/src/app/(main)/websites/[websiteId]/realtime/RealtimeUrls.tsx b/src/app/(main)/websites/[websiteId]/realtime/RealtimeUrls.tsx
index 15e53a6b..a6e90763 100644
--- a/src/app/(main)/websites/[websiteId]/realtime/RealtimeUrls.tsx
+++ b/src/app/(main)/websites/[websiteId]/realtime/RealtimeUrls.tsx
@@ -1,18 +1,16 @@
-import { useContext, useState } from 'react';
+import { useState } from 'react';
import { Row } from '@umami/react-zen';
import thenby from 'thenby';
import { percentFilter } from '@/lib/filters';
import { ListTable } from '@/components/metrics/ListTable';
-import { useMessages } from '@/components/hooks';
-import { RealtimeData } from '@/lib/types';
-import { WebsiteContext } from '../WebsiteProvider';
+import { useMessages, useWebsite } from '@/components/hooks';
import { FilterButtons } from '@/components/input/FilterButtons';
const FILTER_REFERRERS = 'filter-referrers';
const FILTER_PAGES = 'filter-pages';
-export function RealtimeUrls({ data }: { data: RealtimeData }) {
- const website = useContext(WebsiteContext);
+export function RealtimeUrls({ data }: { data: any }) {
+ const website = useWebsite();
const { formatMessage, labels } = useMessages();
const { referrers, urls } = data || {};
const [filter, setFilter] = useState(FILTER_REFERRERS);
diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteEditForm.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteEditForm.tsx
index dbefd669..5beeaf70 100644
--- a/src/app/(main)/websites/[websiteId]/settings/WebsiteEditForm.tsx
+++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteEditForm.tsx
@@ -1,4 +1,3 @@
-import { useContext } from 'react';
import {
FormSubmitButton,
Form,
@@ -7,12 +6,11 @@ import {
TextField,
useToast,
} from '@umami/react-zen';
-import { useApi, useMessages, useModified } from '@/components/hooks';
+import { useApi, useMessages, useModified, useWebsite } from '@/components/hooks';
import { DOMAIN_REGEX } from '@/lib/constants';
-import { WebsiteContext } from '@/app/(main)/websites/WebsiteProvider';
export function WebsiteEditForm({ websiteId, onSave }: { websiteId: string; onSave?: () => void }) {
- const website = useContext(WebsiteContext);
+ const website = useWebsite();
const { formatMessage, labels, messages } = useMessages();
const { post, useMutation } = useApi();
const { toast } = useToast();
diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteSettings.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteSettings.tsx
index de775b22..88a33e77 100644
--- a/src/app/(main)/websites/[websiteId]/settings/WebsiteSettings.tsx
+++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteSettings.tsx
@@ -1,14 +1,12 @@
-import { useContext } from 'react';
import { Tabs, TabList, Tab, TabPanel } from '@umami/react-zen';
-import { WebsiteContext } from '@/app/(main)/websites/WebsiteProvider';
-import { useMessages } from '@/components/hooks';
+import { useMessages, useWebsite } from '@/components/hooks';
import { WebsiteShareForm } from './WebsiteShareForm';
import { WebsiteTrackingCode } from './WebsiteTrackingCode';
import { WebsiteData } from './WebsiteData';
import { WebsiteEditForm } from './WebsiteEditForm';
export function WebsiteSettings({ websiteId }: { websiteId: string; openExternal?: boolean }) {
- const website = useContext(WebsiteContext);
+ const website = useWebsite();
const { formatMessage, labels } = useMessages();
return (
diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteSettingsHeader.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteSettingsHeader.tsx
index 5f8c8536..97a0108f 100644
--- a/src/app/(main)/websites/[websiteId]/settings/WebsiteSettingsHeader.tsx
+++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteSettingsHeader.tsx
@@ -1,10 +1,9 @@
-import { useContext } from 'react';
-import { WebsiteContext } from '@/app/(main)/websites/WebsiteProvider';
import { PageHeader } from '@/components/common/PageHeader';
import { Globe } from '@/components/icons';
+import { useWebsite } from '@/components/hooks';
export function WebsiteSettingsHeader() {
- const website = useContext(WebsiteContext);
+ const website = useWebsite();
return } />;
}
diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteTransferForm.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteTransferForm.tsx
index b1b3a45b..f6d06783 100644
--- a/src/app/(main)/websites/[websiteId]/settings/WebsiteTransferForm.tsx
+++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteTransferForm.tsx
@@ -1,4 +1,4 @@
-import { Key, useContext, useState } from 'react';
+import { Key, useState } from 'react';
import {
Button,
Form,
@@ -10,8 +10,13 @@ import {
ListItem,
Text,
} from '@umami/react-zen';
-import { useApi, useLoginQuery, useMessages, useUserTeamsQuery } from '@/components/hooks';
-import { WebsiteContext } from '@/app/(main)/websites/WebsiteProvider';
+import {
+ useApi,
+ useLoginQuery,
+ useMessages,
+ useUserTeamsQuery,
+ useWebsite,
+} from '@/components/hooks';
import { ROLES } from '@/lib/constants';
export function WebsiteTransferForm({
@@ -24,7 +29,7 @@ export function WebsiteTransferForm({
onClose?: () => void;
}) {
const { user } = useLoginQuery();
- const website = useContext(WebsiteContext);
+ const website = useWebsite();
const [teamId, setTeamId] = useState(null);
const { formatMessage, labels, messages } = useMessages();
const { post, useMutation } = useApi();
diff --git a/src/components/hooks/context/useUser.ts b/src/components/hooks/context/useUser.ts
new file mode 100644
index 00000000..dfdf67f1
--- /dev/null
+++ b/src/components/hooks/context/useUser.ts
@@ -0,0 +1,6 @@
+import { UserContext } from '@/app/(main)/admin/users/[userId]/UserProvider';
+import { useContext } from 'react';
+
+export function useUser() {
+ return useContext(UserContext);
+}
diff --git a/src/components/hooks/index.ts b/src/components/hooks/index.ts
index 2de25765..98afd446 100644
--- a/src/components/hooks/index.ts
+++ b/src/components/hooks/index.ts
@@ -4,6 +4,7 @@
export * from './context/useLink';
export * from './context/usePixel';
export * from './context/useTeam';
+export * from './context/useUser';
export * from './context/useWebsite';
// Query hooks
diff --git a/src/components/metrics/PagesTable.tsx b/src/components/metrics/PagesTable.tsx
index 26f3caa7..8d9ba2f1 100644
--- a/src/components/metrics/PagesTable.tsx
+++ b/src/components/metrics/PagesTable.tsx
@@ -1,9 +1,7 @@
-import { WebsiteContext } from '@/app/(main)/websites/WebsiteProvider';
import { FilterButtons } from '@/components/input/FilterButtons';
import { FilterLink } from '@/components/common/FilterLink';
-import { useMessages, useNavigation } from '@/components/hooks';
+import { useMessages, useNavigation, useWebsite } from '@/components/hooks';
import { emptyFilter } from '@/lib/filters';
-import { useContext } from 'react';
import { MetricsTable, MetricsTableProps } from './MetricsTable';
export interface PagesTableProps extends MetricsTableProps {
@@ -14,7 +12,7 @@ export interface PagesTableProps extends MetricsTableProps {
export function PagesTable({ type, allowFilter, ...props }: PagesTableProps) {
const { router, updateParams } = useNavigation();
const { formatMessage, labels } = useMessages();
- const { domain } = useContext(WebsiteContext);
+ const { domain } = useWebsite();
const handleChange = (id: any) => {
router.push(updateParams({ view: id }));