@addev-be/ui 0.8.1 → 0.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@addev-be/ui",
3
- "version": "0.8.1",
3
+ "version": "0.8.3",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "watch": "tsc -b --watch",
@@ -42,6 +42,7 @@
42
42
  "peerDependencies": {
43
43
  "react": "^18.3.1",
44
44
  "react-dom": "^18.3.1",
45
+ "react-router-dom": "^6.27.0",
45
46
  "styled-components": "^6.1.13",
46
47
  "vite-plugin-svgr": "^4.2.0"
47
48
  },
@@ -51,6 +52,7 @@
51
52
  "io-ts": "^2.2.21",
52
53
  "lodash": "^4.17.21",
53
54
  "moment": "^2.30.1",
55
+ "react-router-dom": "^7.0.2",
54
56
  "rxjs": "^7.8.1",
55
57
  "uuid": "^10.0.0"
56
58
  }
@@ -0,0 +1,21 @@
1
+ import { useCallback, useState } from 'react';
2
+
3
+ import { ConditionDTO } from '../services/sqlRequests';
4
+
5
+ export const useShowArchived = (initialValue?: boolean) => {
6
+ const [showArchived, setShowArchived] = useState(initialValue ?? false);
7
+
8
+ const toggleShowArchived = useCallback((value?: boolean) => {
9
+ setShowArchived((prev) => (value === undefined ? !prev : value));
10
+ }, []);
11
+
12
+ const archivedConditions: ConditionDTO[] = showArchived
13
+ ? []
14
+ : [{ field: 'Archived', operator: 'notEquals', value: 1 }];
15
+
16
+ return {
17
+ archivedConditions,
18
+ showArchived,
19
+ toggleShowArchived,
20
+ };
21
+ };
@@ -0,0 +1,14 @@
1
+ import { useContext, useEffect } from 'react';
2
+
3
+ import { TrackingContext } from '.';
4
+ import { useLocation } from 'react-router-dom';
5
+
6
+ export const useLocationTracking = () => {
7
+ const { sendEvent } = useContext(TrackingContext);
8
+ const { pathname, search } = useLocation();
9
+ const pathWithSearch = `${pathname}${search}`;
10
+
11
+ useEffect(() => {
12
+ sendEvent('PageView', { path: pathWithSearch });
13
+ }, [pathWithSearch, sendEvent]);
14
+ };
@@ -0,0 +1,71 @@
1
+ import {
2
+ FC,
3
+ PropsWithChildren,
4
+ createContext,
5
+ useCallback,
6
+ useMemo,
7
+ useState,
8
+ } from 'react';
9
+
10
+ import { useSendTrackingEventRequestHandler } from '../../services';
11
+
12
+ export type TrackingContextType = {
13
+ sendEvent: (
14
+ name: string,
15
+ details?: Record<string, string | number | boolean | null>
16
+ ) => void;
17
+ enableTracking: () => void;
18
+ disableTracking: () => void;
19
+ };
20
+
21
+ export const TrackingContext = createContext<TrackingContextType>({
22
+ sendEvent: () => {},
23
+ enableTracking: () => {},
24
+ disableTracking: () => {},
25
+ });
26
+
27
+ export const TrackingProvider: FC<PropsWithChildren> = ({ children }) => {
28
+ const [trackingEnabled, setTrackingEnabled] = useState(true);
29
+ const sendTrackingEvent = useSendTrackingEventRequestHandler();
30
+
31
+ const sendEvent = useCallback(
32
+ (
33
+ name: string,
34
+ details: Record<string, string | number | boolean | null> = {}
35
+ ) => {
36
+ if (trackingEnabled) {
37
+ sendTrackingEvent({
38
+ data: {
39
+ id: '',
40
+ name,
41
+ details,
42
+ },
43
+ });
44
+ }
45
+ },
46
+ [sendTrackingEvent, trackingEnabled]
47
+ );
48
+
49
+ const enableTracking = useCallback(() => {
50
+ setTrackingEnabled(true);
51
+ }, []);
52
+
53
+ const disableTracking = useCallback(() => {
54
+ setTrackingEnabled(false);
55
+ }, []);
56
+
57
+ const value = useMemo(
58
+ () => ({
59
+ sendEvent,
60
+ enableTracking,
61
+ disableTracking,
62
+ }),
63
+ [disableTracking, enableTracking, sendEvent]
64
+ );
65
+
66
+ return (
67
+ <TrackingContext.Provider value={value}>
68
+ {children}
69
+ </TrackingContext.Provider>
70
+ );
71
+ };
@@ -15,6 +15,7 @@ import {
15
15
  import { PortalsProvider } from '../PortalsProvider';
16
16
  import { SettingsProvider } from '../SettingsProvider';
17
17
  import { ThemeProvider } from '../ThemeProvider/ThemeProvider';
18
+ import { TrackingProvider } from '../TrackingProvider';
18
19
  import { defaultTheme } from '../ThemeProvider/defaultTheme';
19
20
 
20
21
  export type UiProvidersProps = PropsWithChildren<{
@@ -56,7 +57,9 @@ export const UiProviders: FC<UiProvidersProps> = ({ $darkMode, children }) => {
56
57
  <UiContext.Provider value={value}>
57
58
  <styles.Root ref={rootRef}>
58
59
  <SettingsProvider>
59
- <PortalsProvider>{children}</PortalsProvider>
60
+ <TrackingProvider>
61
+ <PortalsProvider>{children}</PortalsProvider>
62
+ </TrackingProvider>
60
63
  </SettingsProvider>
61
64
  </styles.Root>
62
65
  </UiContext.Provider>
@@ -1,6 +1,8 @@
1
1
  export * from './AuthenticationProvider';
2
2
  export * from './PortalsProvider';
3
3
  export * from './ThemeProvider';
4
+ export * from './TrackingProvider';
4
5
  export * from './UiProviders';
5
6
 
7
+ export * from './TrackingProvider/hooks';
6
8
  export * from './hooks';
@@ -4,10 +4,14 @@ export * from './hooks';
4
4
  export * from './globalSearch';
5
5
 
6
6
  export * from './requests/auth';
7
+ export * from './requests/generic';
8
+ export * from './requests/tracking';
7
9
  export * from './requests/users';
8
10
  export * from './requests/userProfiles';
9
11
 
10
12
  export * from './types/auth';
11
13
  export * from './types/base';
14
+ export * from './types/generic';
15
+ export * from './types/tracking';
12
16
  export * from './types/users';
13
17
  export * from './types/userProfiles';
@@ -0,0 +1,62 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ import * as t from 'io-ts';
3
+
4
+ import {
5
+ GenericArchiveRequestDTO,
6
+ GenericArchiveResponseDTO,
7
+ GenericDeleteRequestDTO,
8
+ GenericDeleteResponseDTO,
9
+ GenericGetAllRequestDTO,
10
+ GenericGetRequestDTO,
11
+ getGenericGetAllResponseDtoCodec,
12
+ getGenericGetResponseDtoCodec,
13
+ getGenericSaveRequestDtoCodec,
14
+ getGenericSaveResponseDtoCodec,
15
+ } from '../types/generic';
16
+
17
+ import { useLoadingRequestHandler } from '../hooks';
18
+ import { userDtoCodec } from '../types/users';
19
+
20
+ export const useGenericGetRequestHandler = <C extends t.Mixed>(
21
+ name: string,
22
+ codec: C
23
+ ) => {
24
+ const responseCodec = getGenericGetResponseDtoCodec(codec);
25
+ return useLoadingRequestHandler<
26
+ GenericGetRequestDTO,
27
+ t.TypeOf<typeof responseCodec>
28
+ >(name);
29
+ };
30
+
31
+ export const useGenericGetAllRequestHandler = <C extends t.Mixed>(
32
+ name: string,
33
+ codec: C
34
+ ) => {
35
+ const responseCodec = getGenericGetAllResponseDtoCodec(codec);
36
+ return useLoadingRequestHandler<
37
+ GenericGetAllRequestDTO,
38
+ t.TypeOf<typeof responseCodec>
39
+ >(name);
40
+ };
41
+
42
+ export const useGenericSaveRequestHandler = <C extends t.Mixed>(
43
+ name: string,
44
+ codec: C
45
+ ) => {
46
+ const requestCodec = getGenericSaveRequestDtoCodec(codec);
47
+ const responseCodec = getGenericSaveResponseDtoCodec(codec);
48
+ return useLoadingRequestHandler<
49
+ t.TypeOf<typeof requestCodec>,
50
+ t.TypeOf<typeof responseCodec>
51
+ >(name);
52
+ };
53
+
54
+ export const useGenericDeleteRequestHandler = (name: string) =>
55
+ useLoadingRequestHandler<GenericDeleteRequestDTO, GenericDeleteResponseDTO>(
56
+ name
57
+ );
58
+
59
+ export const useGenericArchiveRequestHandler = (name: string) =>
60
+ useLoadingRequestHandler<GenericArchiveRequestDTO, GenericArchiveResponseDTO>(
61
+ name
62
+ );
@@ -0,0 +1,12 @@
1
+ import {
2
+ SendTrackingEventRequestDTO,
3
+ SendTrackingEventResponseDTO,
4
+ } from '../types/tracking';
5
+
6
+ import { useLoadingRequestHandler } from '../hooks';
7
+
8
+ export const useSendTrackingEventRequestHandler = () =>
9
+ useLoadingRequestHandler<
10
+ SendTrackingEventRequestDTO,
11
+ SendTrackingEventResponseDTO
12
+ >('SendTrackingEvent');
@@ -0,0 +1,92 @@
1
+ import * as t from 'io-ts';
2
+
3
+ export const genericGetRequestDtoCodec = t.type(
4
+ {
5
+ id: t.string,
6
+ },
7
+ 'GenericGetRequestDTO'
8
+ );
9
+
10
+ export const getGenericGetResponseDtoCodec = <C extends t.Mixed>(codec: C) =>
11
+ t.type({
12
+ status: t.number,
13
+ data: codec,
14
+ });
15
+
16
+ export type GenericGetRequestDTO = t.TypeOf<typeof genericGetRequestDtoCodec>;
17
+
18
+ /*****/
19
+
20
+ export const genericGetAllRequestDtoCodec = t.type(
21
+ {},
22
+ 'GenericGetAllRequestDTO'
23
+ );
24
+
25
+ export const getGenericGetAllResponseDtoCodec = <C extends t.Mixed>(codec: C) =>
26
+ t.type({
27
+ status: t.number,
28
+ data: t.array(codec),
29
+ });
30
+
31
+ export type GenericGetAllRequestDTO = t.TypeOf<
32
+ typeof genericGetAllRequestDtoCodec
33
+ >;
34
+
35
+ /*****/
36
+
37
+ export const getGenericSaveRequestDtoCodec = <C extends t.Mixed>(codec: C) =>
38
+ t.type({
39
+ data: codec,
40
+ });
41
+
42
+ export const getGenericSaveResponseDtoCodec = <C extends t.Mixed>(codec: C) =>
43
+ t.type({
44
+ status: t.number,
45
+ data: codec,
46
+ });
47
+
48
+ /*****/
49
+
50
+ export const genericArchiveRequestDtoCodec = t.type(
51
+ {
52
+ id: t.string,
53
+ },
54
+ 'GenericArchiveRequestDTO'
55
+ );
56
+
57
+ export const genericArchiveResponseDtoCodec = t.type(
58
+ {
59
+ status: t.number,
60
+ },
61
+ 'GenericArchiveResponseDTO'
62
+ );
63
+
64
+ export type GenericArchiveRequestDTO = t.TypeOf<
65
+ typeof genericArchiveRequestDtoCodec
66
+ >;
67
+ export type GenericArchiveResponseDTO = t.TypeOf<
68
+ typeof genericArchiveResponseDtoCodec
69
+ >;
70
+
71
+ /*****/
72
+
73
+ export const genericDeleteRequestDtoCodec = t.type(
74
+ {
75
+ id: t.string,
76
+ },
77
+ 'GenericDeleteRequestDTO'
78
+ );
79
+
80
+ export const genericDeleteResponseDtoCodec = t.type(
81
+ {
82
+ status: t.number,
83
+ },
84
+ 'GenericDeleteResponseDTO'
85
+ );
86
+
87
+ export type GenericDeleteRequestDTO = t.TypeOf<
88
+ typeof genericDeleteRequestDtoCodec
89
+ >;
90
+ export type GenericDeleteResponseDTO = t.TypeOf<
91
+ typeof genericDeleteResponseDtoCodec
92
+ >;
@@ -0,0 +1,39 @@
1
+ import * as t from 'io-ts';
2
+
3
+ import { baseModelDtoCodec } from './base';
4
+
5
+ export const trackingEventDtoCodec = t.type(
6
+ {
7
+ ...baseModelDtoCodec.props,
8
+ name: t.string,
9
+ details: t.record(
10
+ t.string,
11
+ t.union([t.string, t.number, t.boolean, t.null])
12
+ ),
13
+ },
14
+ 'TrackingEventDTO'
15
+ );
16
+
17
+ export type TrackingEventDTO = t.TypeOf<typeof trackingEventDtoCodec>;
18
+
19
+ export const sendTrackingEventRequestDtoCodec = t.type(
20
+ {
21
+ data: trackingEventDtoCodec,
22
+ },
23
+ 'SendTrackingEventRequestDTO'
24
+ );
25
+
26
+ export const sendTrackingEventResponseDtoCodec = t.type(
27
+ {
28
+ status: t.number,
29
+ data: trackingEventDtoCodec,
30
+ },
31
+ 'SendTrackingEventResponseDTO'
32
+ );
33
+
34
+ export type SendTrackingEventRequestDTO = t.TypeOf<
35
+ typeof sendTrackingEventRequestDtoCodec
36
+ >;
37
+ export type SendTrackingEventResponseDTO = t.TypeOf<
38
+ typeof sendTrackingEventResponseDtoCodec
39
+ >;