@strapi/admin 5.23.0 → 5.23.1

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.
@@ -3,6 +3,7 @@
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  var React = require('react');
5
5
  var immer = require('immer');
6
+ var Tracking = require('../../features/Tracking.js');
6
7
  var usePersistentState = require('../../hooks/usePersistentState.js');
7
8
  var Context = require('../Context.js');
8
9
  var Tours = require('./Tours.js');
@@ -37,15 +38,18 @@ const getInitialTourState = (tours)=>{
37
38
  return acc;
38
39
  }, {});
39
40
  };
41
+ const getCompletedTours = (tours)=>{
42
+ return Object.keys(tours).filter((tourName)=>tours[tourName].isCompleted);
43
+ };
44
+ const areAllToursCompleted = (tours)=>Object.values(tours).every((t)=>t.isCompleted);
40
45
  function reducer(state, action) {
41
46
  return immer.produce(state, (draft)=>{
42
47
  if (action.type === 'next_step') {
43
48
  const currentStep = draft.tours[action.payload].currentStep;
44
49
  const tourLength = Tours.tours[action.payload]._meta.totalStepCount;
45
- if (currentStep >= tourLength) return;
46
50
  const nextStep = currentStep + 1;
47
51
  draft.tours[action.payload].currentStep = nextStep;
48
- draft.tours[action.payload].isCompleted = nextStep === tourLength;
52
+ draft.tours[action.payload].isCompleted = nextStep >= tourLength;
49
53
  }
50
54
  if (action.type === 'previous_step') {
51
55
  const currentStep = draft.tours[action.payload].currentStep;
@@ -82,6 +86,7 @@ function reducer(state, action) {
82
86
  }
83
87
  const STORAGE_KEY = 'STRAPI_GUIDED_TOUR';
84
88
  const GuidedTourContext = ({ children, enabled = true })=>{
89
+ const { trackUsage } = Tracking.useTracking();
85
90
  const [storedTours, setStoredTours] = usePersistentState.usePersistentState(STORAGE_KEY, {
86
91
  tours: getInitialTourState(Tours.tours),
87
92
  enabled,
@@ -96,6 +101,25 @@ const GuidedTourContext = ({ children, enabled = true })=>{
96
101
  state,
97
102
  setStoredTours
98
103
  ]);
104
+ // Derive all completed tours from state
105
+ const currentAllCompletedState = areAllToursCompleted(state.tours);
106
+ // Store completed state in ref to survive a re-render,
107
+ // when current state changes this will persist and be used for comparison
108
+ const previousAllCompletedStateRef = React__namespace.useRef(currentAllCompletedState);
109
+ React__namespace.useEffect(()=>{
110
+ const previousAllCompletedState = previousAllCompletedStateRef.current;
111
+ // When the previous state was not complete but the current state is now complete, fire the event
112
+ if (!previousAllCompletedState && currentAllCompletedState) {
113
+ trackUsage('didCompleteGuidedTour', {
114
+ name: 'all'
115
+ });
116
+ }
117
+ // When the current state has all tours completed so will the previous state, the tracking event won't fire again
118
+ previousAllCompletedStateRef.current = currentAllCompletedState;
119
+ }, [
120
+ currentAllCompletedState,
121
+ trackUsage
122
+ ]);
99
123
  return /*#__PURE__*/ jsxRuntime.jsx(GuidedTourProviderImpl, {
100
124
  state: state,
101
125
  dispatch: dispatch,
@@ -104,6 +128,7 @@ const GuidedTourContext = ({ children, enabled = true })=>{
104
128
  };
105
129
 
106
130
  exports.GuidedTourContext = GuidedTourContext;
131
+ exports.getCompletedTours = getCompletedTours;
107
132
  exports.reducer = reducer;
108
133
  exports.useGuidedTour = useGuidedTour;
109
134
  //# sourceMappingURL=Context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Context.js","sources":["../../../../../../admin/src/components/GuidedTour/Context.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { produce } from 'immer';\n\nimport { usePersistentState } from '../../hooks/usePersistentState';\nimport { createContext } from '../Context';\n\nimport { type Tours, tours as guidedTours } from './Tours';\nimport { GUIDED_TOUR_REQUIRED_ACTIONS } from './utils/constants';\nimport { migrateTours } from './utils/migrations';\n\n/* -------------------------------------------------------------------------------------------------\n * GuidedTourProvider\n * -----------------------------------------------------------------------------------------------*/\n\ntype ValidTourName = keyof Tours;\n\n/**\n * Derive the union of all string literal values from GUIDED_TOUR_REQUIRED_ACTIONS\n * (ie didCreateContentTypeSchema | didCreateContent etc...)\n */\ntype ValueOf<T> = T[keyof T];\ntype NonEmptyValueOf<T> = T extends Record<string, never> ? never : ValueOf<T>;\nexport type CompletedActions = NonEmptyValueOf<ValueOf<typeof GUIDED_TOUR_REQUIRED_ACTIONS>>[];\n\ntype Action =\n | {\n type: 'next_step';\n payload: ValidTourName;\n }\n | {\n type: 'previous_step';\n payload: ValidTourName;\n }\n | {\n type: 'go_to_step';\n payload: {\n tourName: ValidTourName;\n step: number;\n };\n }\n | {\n type: 'skip_tour';\n payload: ValidTourName;\n }\n | {\n type: 'skip_all_tours';\n }\n | {\n type: 'reset_all_tours';\n }\n | {\n type: 'set_completed_actions';\n payload: CompletedActions;\n }\n | {\n type: 'remove_completed_action';\n payload: ValueOf<CompletedActions>;\n };\n\ntype TourState = Record<ValidTourName, { currentStep: number; isCompleted: boolean }>;\ntype State = {\n tours: TourState;\n enabled: boolean;\n completedActions: CompletedActions;\n};\n\nconst [GuidedTourProviderImpl, useGuidedTour] = createContext<{\n state: State;\n dispatch: React.Dispatch<Action>;\n}>('GuidedTour');\n\nconst getInitialTourState = (tours: Tours) => {\n return Object.keys(tours).reduce((acc, tourName) => {\n acc[tourName as ValidTourName] = {\n currentStep: 0,\n isCompleted: false,\n };\n\n return acc;\n }, {} as TourState);\n};\n\nfunction reducer(state: State, action: Action): State {\n return produce(state, (draft) => {\n if (action.type === 'next_step') {\n const currentStep = draft.tours[action.payload].currentStep;\n const tourLength = guidedTours[action.payload]._meta.totalStepCount;\n\n if (currentStep >= tourLength) return;\n\n const nextStep = currentStep + 1;\n draft.tours[action.payload].currentStep = nextStep;\n draft.tours[action.payload].isCompleted = nextStep === tourLength;\n }\n\n if (action.type === 'previous_step') {\n const currentStep = draft.tours[action.payload].currentStep;\n\n if (currentStep <= 0) return;\n\n const previousStep = currentStep - 1;\n draft.tours[action.payload].currentStep = previousStep;\n }\n\n if (action.type === 'skip_tour') {\n draft.tours[action.payload].isCompleted = true;\n }\n\n if (action.type === 'set_completed_actions') {\n draft.completedActions = [...new Set([...draft.completedActions, ...action.payload])];\n }\n\n if (action.type === 'remove_completed_action') {\n draft.completedActions = draft.completedActions.filter(\n (completedAction) => completedAction !== action.payload\n );\n }\n\n if (action.type === 'skip_all_tours') {\n draft.enabled = false;\n }\n\n if (action.type === 'reset_all_tours') {\n draft.enabled = true;\n draft.tours = getInitialTourState(guidedTours);\n draft.completedActions = [];\n }\n\n if (action.type === 'go_to_step') {\n draft.tours[action.payload.tourName].currentStep = action.payload.step;\n }\n });\n}\n\nconst STORAGE_KEY = 'STRAPI_GUIDED_TOUR';\nconst GuidedTourContext = ({\n children,\n enabled = true,\n}: {\n children: React.ReactNode;\n enabled?: boolean;\n}) => {\n const [storedTours, setStoredTours] = usePersistentState<State>(STORAGE_KEY, {\n tours: getInitialTourState(guidedTours),\n enabled,\n completedActions: [],\n });\n const migratedTourState = migrateTours(storedTours);\n const [state, dispatch] = React.useReducer(reducer, migratedTourState);\n\n // Sync local storage\n React.useEffect(() => {\n setStoredTours(state);\n }, [state, setStoredTours]);\n\n return (\n <GuidedTourProviderImpl state={state} dispatch={dispatch}>\n {children}\n </GuidedTourProviderImpl>\n );\n};\n\nexport type { Action, State, ValidTourName };\nexport { GuidedTourContext, useGuidedTour, reducer };\n"],"names":["GuidedTourProviderImpl","useGuidedTour","createContext","getInitialTourState","tours","Object","keys","reduce","acc","tourName","currentStep","isCompleted","reducer","state","action","produce","draft","type","payload","tourLength","guidedTours","_meta","totalStepCount","nextStep","previousStep","completedActions","Set","filter","completedAction","enabled","step","STORAGE_KEY","GuidedTourContext","children","storedTours","setStoredTours","usePersistentState","migratedTourState","migrateTours","dispatch","React","useReducer","useEffect","_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"Context.js","sources":["../../../../../../admin/src/components/GuidedTour/Context.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { produce } from 'immer';\n\nimport { useTracking } from '../../features/Tracking';\nimport { usePersistentState } from '../../hooks/usePersistentState';\nimport { createContext } from '../Context';\n\nimport { type Tours, tours as guidedTours } from './Tours';\nimport { GUIDED_TOUR_REQUIRED_ACTIONS } from './utils/constants';\nimport { migrateTours } from './utils/migrations';\n\n/* -------------------------------------------------------------------------------------------------\n * GuidedTourProvider\n * -----------------------------------------------------------------------------------------------*/\n\ntype ValidTourName = keyof Tours;\n\n/**\n * Derive the union of all string literal values from GUIDED_TOUR_REQUIRED_ACTIONS\n * (ie didCreateContentTypeSchema | didCreateContent etc...)\n */\ntype ValueOf<T> = T[keyof T];\ntype NonEmptyValueOf<T> = T extends Record<string, never> ? never : ValueOf<T>;\nexport type CompletedActions = NonEmptyValueOf<ValueOf<typeof GUIDED_TOUR_REQUIRED_ACTIONS>>[];\n\ntype Action =\n | {\n type: 'next_step';\n payload: ValidTourName;\n }\n | {\n type: 'previous_step';\n payload: ValidTourName;\n }\n | {\n type: 'go_to_step';\n payload: {\n tourName: ValidTourName;\n step: number;\n };\n }\n | {\n type: 'skip_tour';\n payload: ValidTourName;\n }\n | {\n type: 'skip_all_tours';\n }\n | {\n type: 'reset_all_tours';\n }\n | {\n type: 'set_completed_actions';\n payload: CompletedActions;\n }\n | {\n type: 'remove_completed_action';\n payload: ValueOf<CompletedActions>;\n };\n\ntype TourState = Record<ValidTourName, { currentStep: number; isCompleted: boolean }>;\ntype State = {\n tours: TourState;\n enabled: boolean;\n completedActions: CompletedActions;\n};\n\nconst [GuidedTourProviderImpl, useGuidedTour] = createContext<{\n state: State;\n dispatch: React.Dispatch<Action>;\n}>('GuidedTour');\n\nconst getInitialTourState = (tours: Tours) => {\n return Object.keys(tours).reduce((acc, tourName) => {\n acc[tourName as ValidTourName] = {\n currentStep: 0,\n isCompleted: false,\n };\n\n return acc;\n }, {} as TourState);\n};\n\nconst getCompletedTours = (tours: TourState): ValidTourName[] => {\n return Object.keys(tours).filter(\n (tourName) => tours[tourName as ValidTourName].isCompleted\n ) as ValidTourName[];\n};\n\nconst areAllToursCompleted = (tours: TourState) => Object.values(tours).every((t) => t.isCompleted);\n\nfunction reducer(state: State, action: Action): State {\n return produce(state, (draft) => {\n if (action.type === 'next_step') {\n const currentStep = draft.tours[action.payload].currentStep;\n const tourLength = guidedTours[action.payload]._meta.totalStepCount;\n\n const nextStep = currentStep + 1;\n draft.tours[action.payload].currentStep = nextStep;\n draft.tours[action.payload].isCompleted = nextStep >= tourLength;\n }\n\n if (action.type === 'previous_step') {\n const currentStep = draft.tours[action.payload].currentStep;\n\n if (currentStep <= 0) return;\n\n const previousStep = currentStep - 1;\n draft.tours[action.payload].currentStep = previousStep;\n }\n\n if (action.type === 'skip_tour') {\n draft.tours[action.payload].isCompleted = true;\n }\n\n if (action.type === 'set_completed_actions') {\n draft.completedActions = [...new Set([...draft.completedActions, ...action.payload])];\n }\n\n if (action.type === 'remove_completed_action') {\n draft.completedActions = draft.completedActions.filter(\n (completedAction) => completedAction !== action.payload\n );\n }\n\n if (action.type === 'skip_all_tours') {\n draft.enabled = false;\n }\n\n if (action.type === 'reset_all_tours') {\n draft.enabled = true;\n draft.tours = getInitialTourState(guidedTours);\n draft.completedActions = [];\n }\n\n if (action.type === 'go_to_step') {\n draft.tours[action.payload.tourName].currentStep = action.payload.step;\n }\n });\n}\n\nconst STORAGE_KEY = 'STRAPI_GUIDED_TOUR';\nconst GuidedTourContext = ({\n children,\n enabled = true,\n}: {\n children: React.ReactNode;\n enabled?: boolean;\n}) => {\n const { trackUsage } = useTracking();\n const [storedTours, setStoredTours] = usePersistentState<State>(STORAGE_KEY, {\n tours: getInitialTourState(guidedTours),\n enabled,\n completedActions: [],\n });\n const migratedTourState = migrateTours(storedTours);\n const [state, dispatch] = React.useReducer(reducer, migratedTourState);\n\n // Sync local storage\n React.useEffect(() => {\n setStoredTours(state);\n }, [state, setStoredTours]);\n\n // Derive all completed tours from state\n const currentAllCompletedState = areAllToursCompleted(state.tours);\n // Store completed state in ref to survive a re-render,\n // when current state changes this will persist and be used for comparison\n const previousAllCompletedStateRef = React.useRef(currentAllCompletedState);\n React.useEffect(() => {\n const previousAllCompletedState = previousAllCompletedStateRef.current;\n // When the previous state was not complete but the current state is now complete, fire the event\n if (!previousAllCompletedState && currentAllCompletedState) {\n trackUsage('didCompleteGuidedTour', { name: 'all' });\n }\n\n // When the current state has all tours completed so will the previous state, the tracking event won't fire again\n previousAllCompletedStateRef.current = currentAllCompletedState;\n }, [currentAllCompletedState, trackUsage]);\n\n return (\n <GuidedTourProviderImpl state={state} dispatch={dispatch}>\n {children}\n </GuidedTourProviderImpl>\n );\n};\n\nexport type { Action, State, ValidTourName };\nexport { GuidedTourContext, useGuidedTour, reducer, getCompletedTours };\n"],"names":["GuidedTourProviderImpl","useGuidedTour","createContext","getInitialTourState","tours","Object","keys","reduce","acc","tourName","currentStep","isCompleted","getCompletedTours","filter","areAllToursCompleted","values","every","t","reducer","state","action","produce","draft","type","payload","tourLength","guidedTours","_meta","totalStepCount","nextStep","previousStep","completedActions","Set","completedAction","enabled","step","STORAGE_KEY","GuidedTourContext","children","trackUsage","useTracking","storedTours","setStoredTours","usePersistentState","migratedTourState","migrateTours","dispatch","React","useReducer","useEffect","currentAllCompletedState","previousAllCompletedStateRef","useRef","previousAllCompletedState","current","name","_jsx"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
3
  import { produce } from 'immer';
4
+ import { useTracking } from '../../features/Tracking.mjs';
4
5
  import { usePersistentState } from '../../hooks/usePersistentState.mjs';
5
6
  import { createContext } from '../Context.mjs';
6
7
  import { tours } from './Tours.mjs';
@@ -16,15 +17,18 @@ const getInitialTourState = (tours)=>{
16
17
  return acc;
17
18
  }, {});
18
19
  };
20
+ const getCompletedTours = (tours)=>{
21
+ return Object.keys(tours).filter((tourName)=>tours[tourName].isCompleted);
22
+ };
23
+ const areAllToursCompleted = (tours)=>Object.values(tours).every((t)=>t.isCompleted);
19
24
  function reducer(state, action) {
20
25
  return produce(state, (draft)=>{
21
26
  if (action.type === 'next_step') {
22
27
  const currentStep = draft.tours[action.payload].currentStep;
23
28
  const tourLength = tours[action.payload]._meta.totalStepCount;
24
- if (currentStep >= tourLength) return;
25
29
  const nextStep = currentStep + 1;
26
30
  draft.tours[action.payload].currentStep = nextStep;
27
- draft.tours[action.payload].isCompleted = nextStep === tourLength;
31
+ draft.tours[action.payload].isCompleted = nextStep >= tourLength;
28
32
  }
29
33
  if (action.type === 'previous_step') {
30
34
  const currentStep = draft.tours[action.payload].currentStep;
@@ -61,6 +65,7 @@ function reducer(state, action) {
61
65
  }
62
66
  const STORAGE_KEY = 'STRAPI_GUIDED_TOUR';
63
67
  const GuidedTourContext = ({ children, enabled = true })=>{
68
+ const { trackUsage } = useTracking();
64
69
  const [storedTours, setStoredTours] = usePersistentState(STORAGE_KEY, {
65
70
  tours: getInitialTourState(tours),
66
71
  enabled,
@@ -75,6 +80,25 @@ const GuidedTourContext = ({ children, enabled = true })=>{
75
80
  state,
76
81
  setStoredTours
77
82
  ]);
83
+ // Derive all completed tours from state
84
+ const currentAllCompletedState = areAllToursCompleted(state.tours);
85
+ // Store completed state in ref to survive a re-render,
86
+ // when current state changes this will persist and be used for comparison
87
+ const previousAllCompletedStateRef = React.useRef(currentAllCompletedState);
88
+ React.useEffect(()=>{
89
+ const previousAllCompletedState = previousAllCompletedStateRef.current;
90
+ // When the previous state was not complete but the current state is now complete, fire the event
91
+ if (!previousAllCompletedState && currentAllCompletedState) {
92
+ trackUsage('didCompleteGuidedTour', {
93
+ name: 'all'
94
+ });
95
+ }
96
+ // When the current state has all tours completed so will the previous state, the tracking event won't fire again
97
+ previousAllCompletedStateRef.current = currentAllCompletedState;
98
+ }, [
99
+ currentAllCompletedState,
100
+ trackUsage
101
+ ]);
78
102
  return /*#__PURE__*/ jsx(GuidedTourProviderImpl, {
79
103
  state: state,
80
104
  dispatch: dispatch,
@@ -82,5 +106,5 @@ const GuidedTourContext = ({ children, enabled = true })=>{
82
106
  });
83
107
  };
84
108
 
85
- export { GuidedTourContext, reducer, useGuidedTour };
109
+ export { GuidedTourContext, getCompletedTours, reducer, useGuidedTour };
86
110
  //# sourceMappingURL=Context.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Context.mjs","sources":["../../../../../../admin/src/components/GuidedTour/Context.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { produce } from 'immer';\n\nimport { usePersistentState } from '../../hooks/usePersistentState';\nimport { createContext } from '../Context';\n\nimport { type Tours, tours as guidedTours } from './Tours';\nimport { GUIDED_TOUR_REQUIRED_ACTIONS } from './utils/constants';\nimport { migrateTours } from './utils/migrations';\n\n/* -------------------------------------------------------------------------------------------------\n * GuidedTourProvider\n * -----------------------------------------------------------------------------------------------*/\n\ntype ValidTourName = keyof Tours;\n\n/**\n * Derive the union of all string literal values from GUIDED_TOUR_REQUIRED_ACTIONS\n * (ie didCreateContentTypeSchema | didCreateContent etc...)\n */\ntype ValueOf<T> = T[keyof T];\ntype NonEmptyValueOf<T> = T extends Record<string, never> ? never : ValueOf<T>;\nexport type CompletedActions = NonEmptyValueOf<ValueOf<typeof GUIDED_TOUR_REQUIRED_ACTIONS>>[];\n\ntype Action =\n | {\n type: 'next_step';\n payload: ValidTourName;\n }\n | {\n type: 'previous_step';\n payload: ValidTourName;\n }\n | {\n type: 'go_to_step';\n payload: {\n tourName: ValidTourName;\n step: number;\n };\n }\n | {\n type: 'skip_tour';\n payload: ValidTourName;\n }\n | {\n type: 'skip_all_tours';\n }\n | {\n type: 'reset_all_tours';\n }\n | {\n type: 'set_completed_actions';\n payload: CompletedActions;\n }\n | {\n type: 'remove_completed_action';\n payload: ValueOf<CompletedActions>;\n };\n\ntype TourState = Record<ValidTourName, { currentStep: number; isCompleted: boolean }>;\ntype State = {\n tours: TourState;\n enabled: boolean;\n completedActions: CompletedActions;\n};\n\nconst [GuidedTourProviderImpl, useGuidedTour] = createContext<{\n state: State;\n dispatch: React.Dispatch<Action>;\n}>('GuidedTour');\n\nconst getInitialTourState = (tours: Tours) => {\n return Object.keys(tours).reduce((acc, tourName) => {\n acc[tourName as ValidTourName] = {\n currentStep: 0,\n isCompleted: false,\n };\n\n return acc;\n }, {} as TourState);\n};\n\nfunction reducer(state: State, action: Action): State {\n return produce(state, (draft) => {\n if (action.type === 'next_step') {\n const currentStep = draft.tours[action.payload].currentStep;\n const tourLength = guidedTours[action.payload]._meta.totalStepCount;\n\n if (currentStep >= tourLength) return;\n\n const nextStep = currentStep + 1;\n draft.tours[action.payload].currentStep = nextStep;\n draft.tours[action.payload].isCompleted = nextStep === tourLength;\n }\n\n if (action.type === 'previous_step') {\n const currentStep = draft.tours[action.payload].currentStep;\n\n if (currentStep <= 0) return;\n\n const previousStep = currentStep - 1;\n draft.tours[action.payload].currentStep = previousStep;\n }\n\n if (action.type === 'skip_tour') {\n draft.tours[action.payload].isCompleted = true;\n }\n\n if (action.type === 'set_completed_actions') {\n draft.completedActions = [...new Set([...draft.completedActions, ...action.payload])];\n }\n\n if (action.type === 'remove_completed_action') {\n draft.completedActions = draft.completedActions.filter(\n (completedAction) => completedAction !== action.payload\n );\n }\n\n if (action.type === 'skip_all_tours') {\n draft.enabled = false;\n }\n\n if (action.type === 'reset_all_tours') {\n draft.enabled = true;\n draft.tours = getInitialTourState(guidedTours);\n draft.completedActions = [];\n }\n\n if (action.type === 'go_to_step') {\n draft.tours[action.payload.tourName].currentStep = action.payload.step;\n }\n });\n}\n\nconst STORAGE_KEY = 'STRAPI_GUIDED_TOUR';\nconst GuidedTourContext = ({\n children,\n enabled = true,\n}: {\n children: React.ReactNode;\n enabled?: boolean;\n}) => {\n const [storedTours, setStoredTours] = usePersistentState<State>(STORAGE_KEY, {\n tours: getInitialTourState(guidedTours),\n enabled,\n completedActions: [],\n });\n const migratedTourState = migrateTours(storedTours);\n const [state, dispatch] = React.useReducer(reducer, migratedTourState);\n\n // Sync local storage\n React.useEffect(() => {\n setStoredTours(state);\n }, [state, setStoredTours]);\n\n return (\n <GuidedTourProviderImpl state={state} dispatch={dispatch}>\n {children}\n </GuidedTourProviderImpl>\n );\n};\n\nexport type { Action, State, ValidTourName };\nexport { GuidedTourContext, useGuidedTour, reducer };\n"],"names":["GuidedTourProviderImpl","useGuidedTour","createContext","getInitialTourState","tours","Object","keys","reduce","acc","tourName","currentStep","isCompleted","reducer","state","action","produce","draft","type","payload","tourLength","guidedTours","_meta","totalStepCount","nextStep","previousStep","completedActions","Set","filter","completedAction","enabled","step","STORAGE_KEY","GuidedTourContext","children","storedTours","setStoredTours","usePersistentState","migratedTourState","migrateTours","dispatch","React","useReducer","useEffect","_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"Context.mjs","sources":["../../../../../../admin/src/components/GuidedTour/Context.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { produce } from 'immer';\n\nimport { useTracking } from '../../features/Tracking';\nimport { usePersistentState } from '../../hooks/usePersistentState';\nimport { createContext } from '../Context';\n\nimport { type Tours, tours as guidedTours } from './Tours';\nimport { GUIDED_TOUR_REQUIRED_ACTIONS } from './utils/constants';\nimport { migrateTours } from './utils/migrations';\n\n/* -------------------------------------------------------------------------------------------------\n * GuidedTourProvider\n * -----------------------------------------------------------------------------------------------*/\n\ntype ValidTourName = keyof Tours;\n\n/**\n * Derive the union of all string literal values from GUIDED_TOUR_REQUIRED_ACTIONS\n * (ie didCreateContentTypeSchema | didCreateContent etc...)\n */\ntype ValueOf<T> = T[keyof T];\ntype NonEmptyValueOf<T> = T extends Record<string, never> ? never : ValueOf<T>;\nexport type CompletedActions = NonEmptyValueOf<ValueOf<typeof GUIDED_TOUR_REQUIRED_ACTIONS>>[];\n\ntype Action =\n | {\n type: 'next_step';\n payload: ValidTourName;\n }\n | {\n type: 'previous_step';\n payload: ValidTourName;\n }\n | {\n type: 'go_to_step';\n payload: {\n tourName: ValidTourName;\n step: number;\n };\n }\n | {\n type: 'skip_tour';\n payload: ValidTourName;\n }\n | {\n type: 'skip_all_tours';\n }\n | {\n type: 'reset_all_tours';\n }\n | {\n type: 'set_completed_actions';\n payload: CompletedActions;\n }\n | {\n type: 'remove_completed_action';\n payload: ValueOf<CompletedActions>;\n };\n\ntype TourState = Record<ValidTourName, { currentStep: number; isCompleted: boolean }>;\ntype State = {\n tours: TourState;\n enabled: boolean;\n completedActions: CompletedActions;\n};\n\nconst [GuidedTourProviderImpl, useGuidedTour] = createContext<{\n state: State;\n dispatch: React.Dispatch<Action>;\n}>('GuidedTour');\n\nconst getInitialTourState = (tours: Tours) => {\n return Object.keys(tours).reduce((acc, tourName) => {\n acc[tourName as ValidTourName] = {\n currentStep: 0,\n isCompleted: false,\n };\n\n return acc;\n }, {} as TourState);\n};\n\nconst getCompletedTours = (tours: TourState): ValidTourName[] => {\n return Object.keys(tours).filter(\n (tourName) => tours[tourName as ValidTourName].isCompleted\n ) as ValidTourName[];\n};\n\nconst areAllToursCompleted = (tours: TourState) => Object.values(tours).every((t) => t.isCompleted);\n\nfunction reducer(state: State, action: Action): State {\n return produce(state, (draft) => {\n if (action.type === 'next_step') {\n const currentStep = draft.tours[action.payload].currentStep;\n const tourLength = guidedTours[action.payload]._meta.totalStepCount;\n\n const nextStep = currentStep + 1;\n draft.tours[action.payload].currentStep = nextStep;\n draft.tours[action.payload].isCompleted = nextStep >= tourLength;\n }\n\n if (action.type === 'previous_step') {\n const currentStep = draft.tours[action.payload].currentStep;\n\n if (currentStep <= 0) return;\n\n const previousStep = currentStep - 1;\n draft.tours[action.payload].currentStep = previousStep;\n }\n\n if (action.type === 'skip_tour') {\n draft.tours[action.payload].isCompleted = true;\n }\n\n if (action.type === 'set_completed_actions') {\n draft.completedActions = [...new Set([...draft.completedActions, ...action.payload])];\n }\n\n if (action.type === 'remove_completed_action') {\n draft.completedActions = draft.completedActions.filter(\n (completedAction) => completedAction !== action.payload\n );\n }\n\n if (action.type === 'skip_all_tours') {\n draft.enabled = false;\n }\n\n if (action.type === 'reset_all_tours') {\n draft.enabled = true;\n draft.tours = getInitialTourState(guidedTours);\n draft.completedActions = [];\n }\n\n if (action.type === 'go_to_step') {\n draft.tours[action.payload.tourName].currentStep = action.payload.step;\n }\n });\n}\n\nconst STORAGE_KEY = 'STRAPI_GUIDED_TOUR';\nconst GuidedTourContext = ({\n children,\n enabled = true,\n}: {\n children: React.ReactNode;\n enabled?: boolean;\n}) => {\n const { trackUsage } = useTracking();\n const [storedTours, setStoredTours] = usePersistentState<State>(STORAGE_KEY, {\n tours: getInitialTourState(guidedTours),\n enabled,\n completedActions: [],\n });\n const migratedTourState = migrateTours(storedTours);\n const [state, dispatch] = React.useReducer(reducer, migratedTourState);\n\n // Sync local storage\n React.useEffect(() => {\n setStoredTours(state);\n }, [state, setStoredTours]);\n\n // Derive all completed tours from state\n const currentAllCompletedState = areAllToursCompleted(state.tours);\n // Store completed state in ref to survive a re-render,\n // when current state changes this will persist and be used for comparison\n const previousAllCompletedStateRef = React.useRef(currentAllCompletedState);\n React.useEffect(() => {\n const previousAllCompletedState = previousAllCompletedStateRef.current;\n // When the previous state was not complete but the current state is now complete, fire the event\n if (!previousAllCompletedState && currentAllCompletedState) {\n trackUsage('didCompleteGuidedTour', { name: 'all' });\n }\n\n // When the current state has all tours completed so will the previous state, the tracking event won't fire again\n previousAllCompletedStateRef.current = currentAllCompletedState;\n }, [currentAllCompletedState, trackUsage]);\n\n return (\n <GuidedTourProviderImpl state={state} dispatch={dispatch}>\n {children}\n </GuidedTourProviderImpl>\n );\n};\n\nexport type { Action, State, ValidTourName };\nexport { GuidedTourContext, useGuidedTour, reducer, getCompletedTours };\n"],"names":["GuidedTourProviderImpl","useGuidedTour","createContext","getInitialTourState","tours","Object","keys","reduce","acc","tourName","currentStep","isCompleted","getCompletedTours","filter","areAllToursCompleted","values","every","t","reducer","state","action","produce","draft","type","payload","tourLength","guidedTours","_meta","totalStepCount","nextStep","previousStep","completedActions","Set","completedAction","enabled","step","STORAGE_KEY","GuidedTourContext","children","trackUsage","useTracking","storedTours","setStoredTours","usePersistentState","migratedTourState","migrateTours","dispatch","React","useReducer","useEffect","currentAllCompletedState","previousAllCompletedStateRef","useRef","previousAllCompletedState","current","name","_jsx"],"mappings":"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"}
@@ -132,13 +132,13 @@ const TASK_CONTENT = [
132
132
  const GuidedTourHomepageOverview = ()=>{
133
133
  const { formatMessage } = reactIntl.useIntl();
134
134
  const { trackUsage } = Tracking.useTracking();
135
- const tours = Context.useGuidedTour('Overview', (s)=>s.state.tours);
135
+ const tourState = Context.useGuidedTour('Overview', (s)=>s.state.tours);
136
136
  const dispatch = Context.useGuidedTour('Overview', (s)=>s.dispatch);
137
137
  const enabled = Context.useGuidedTour('Overview', (s)=>s.state.enabled);
138
138
  const completedActions = Context.useGuidedTour('Overview', (s)=>s.state.completedActions);
139
139
  const { data: guidedTourMeta } = admin.useGetGuidedTourMetaQuery();
140
- const tourNames = Object.keys(tours);
141
- const completedTours = tourNames.filter((tourName)=>tours[tourName].isCompleted);
140
+ const tourNames = Object.keys(tourState);
141
+ const completedTours = Context.getCompletedTours(tourState);
142
142
  const completionPercentage = tourNames.length > 0 ? Math.round(completedTours.length / tourNames.length * 100) : 0;
143
143
  const handleConfirmDialog = ()=>{
144
144
  trackUsage('didSkipGuidedTour', {
@@ -148,14 +148,20 @@ const GuidedTourHomepageOverview = ()=>{
148
148
  type: 'skip_all_tours'
149
149
  });
150
150
  };
151
- const handleClickStrapiCloud = (tourName)=>{
152
- trackUsage('didCompleteGuidedTour', {
153
- name: tourName
154
- });
155
- dispatch({
156
- type: 'skip_tour',
157
- payload: tourName
151
+ const handleStartTour = (tourName)=>{
152
+ trackUsage('didStartGuidedTour', {
153
+ name: tourName,
154
+ fromHomepage: true
158
155
  });
156
+ if (tourName === 'strapiCloud') {
157
+ trackUsage('didCompleteGuidedTour', {
158
+ name: tourName
159
+ });
160
+ dispatch({
161
+ type: 'next_step',
162
+ payload: tourName
163
+ });
164
+ }
159
165
  };
160
166
  if (!guidedTourMeta?.data.isFirstSuperAdminUser || !enabled) {
161
167
  return null;
@@ -201,12 +207,14 @@ const GuidedTourHomepageOverview = ()=>{
201
207
  paddingBottom: 8,
202
208
  gap: 2,
203
209
  children: [
204
- /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Typography, {
210
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
205
211
  variant: "pi",
206
- children: [
207
- completionPercentage,
208
- "%"
209
- ]
212
+ children: formatMessage({
213
+ id: 'tours.overview.completed',
214
+ defaultMessage: '{completed}% completed'
215
+ }, {
216
+ completed: completionPercentage
217
+ })
210
218
  }),
211
219
  /*#__PURE__*/ jsxRuntime.jsx(StyledProgressBar, {
212
220
  value: completionPercentage
@@ -256,7 +264,7 @@ const GuidedTourHomepageOverview = ()=>{
256
264
  hasRadius: true,
257
265
  children: TASK_CONTENT.map((task)=>{
258
266
  const tourName = task.tourName;
259
- const tour = tours[tourName];
267
+ const tour = tourState[tourName];
260
268
  const isLinkDisabled = tourName !== 'contentTypeBuilder' && !completedActions.includes(constants.GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.createSchema);
261
269
  return /*#__PURE__*/ jsxRuntime.jsx(TourTaskContainer, {
262
270
  tag: "li",
@@ -307,15 +315,16 @@ const GuidedTourHomepageOverview = ()=>{
307
315
  isExternal: true,
308
316
  disabled: isLinkDisabled,
309
317
  href: task.link.to,
310
- onClick: ()=>handleClickStrapiCloud(task.tourName),
318
+ onClick: ()=>handleStartTour(task.tourName),
311
319
  children: formatMessage(task.link.label)
312
320
  }) : /*#__PURE__*/ jsxRuntime.jsx(designSystem.Link, {
313
321
  endIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.ChevronRight, {}),
314
322
  disabled: isLinkDisabled,
315
323
  to: task.link.to,
316
324
  tag: reactRouterDom.NavLink,
317
- onClick: ()=>trackUsage('didStartGuidedTourFromHomepage', {
318
- name: tourName
325
+ onClick: ()=>trackUsage('didStartGuidedTour', {
326
+ name: tourName,
327
+ fromHomepage: true
319
328
  }),
320
329
  children: formatMessage(task.link.label)
321
330
  })
@@ -1 +1 @@
1
- {"version":3,"file":"Overview.js","sources":["../../../../../../admin/src/components/GuidedTour/Overview.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Dialog, Flex, Link, ProgressBar, Typography } from '@strapi/design-system';\nimport { CheckCircle, ChevronRight } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\nimport { styled, useTheme } from 'styled-components';\n\nimport { useTracking } from '../../features/Tracking';\nimport { useGetGuidedTourMetaQuery } from '../../services/admin';\nimport { ConfirmDialog } from '../ConfirmDialog';\n\nimport { type ValidTourName, useGuidedTour } from './Context';\nimport { GUIDED_TOUR_REQUIRED_ACTIONS } from './utils/constants';\n\n/* -------------------------------------------------------------------------------------------------\n * Styled\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledProgressBar = styled(ProgressBar)`\n width: 100%;\n background-color: ${({ theme }) => theme.colors.neutral150};\n > div {\n background-color: ${({ theme }) => theme.colors.success500};\n }\n`;\n\nconst Container = styled(Flex)`\n width: 100%;\n border-radius: ${({ theme }) => theme.borderRadius};\n background-color: ${({ theme }) => theme.colors.neutral0};\n box-shadow: ${({ theme }) => theme.shadows.tableShadow};\n align-items: stretch;\n`;\n\nconst ContentSection = styled(Flex)`\n flex: 1;\n padding: ${({ theme }) => theme.spaces[8]};\n`;\n\nconst VerticalSeparator = styled.div`\n width: 1px;\n background-color: ${({ theme }) => theme.colors.neutral150};\n`;\n\nconst TourTaskContainer = styled(Flex)`\n &:not(:last-child) {\n border-bottom: ${({ theme }) => `1px solid ${theme.colors.neutral150}`};\n }\n padding: ${({ theme }) => theme.spaces[4]};\n`;\n\nconst TodoCircle = styled(Box)`\n border: 1px solid ${({ theme }) => theme.colors.neutral300};\n border-radius: 50%;\n height: 13px;\n width: 13px;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * Constants\n * -----------------------------------------------------------------------------------------------*/\n\nconst LINK_LABEL = {\n id: 'tours.overview.tour.link',\n defaultMessage: 'Start',\n};\nconst DONE_LABEL = {\n id: 'tours.overview.tour.done',\n defaultMessage: 'Done',\n};\n\nconst TASK_CONTENT = [\n {\n tourName: 'contentTypeBuilder',\n link: {\n label: LINK_LABEL,\n to: '/plugins/content-type-builder',\n },\n title: {\n id: 'tours.overview.contentTypeBuilder.label',\n defaultMessage: 'Create your schema',\n },\n done: DONE_LABEL,\n },\n {\n tourName: 'contentManager',\n link: {\n label: LINK_LABEL,\n to: '/content-manager',\n },\n title: {\n id: 'tours.overview.contentManager.label',\n defaultMessage: 'Create and publish content',\n },\n done: DONE_LABEL,\n },\n {\n tourName: 'apiTokens',\n link: {\n label: LINK_LABEL,\n to: '/settings/api-tokens',\n },\n title: {\n id: 'tours.overview.apiTokens.label',\n defaultMessage: 'Copy an API token',\n },\n done: DONE_LABEL,\n },\n {\n tourName: 'strapiCloud',\n link: {\n label: {\n id: 'tours.overview.strapiCloud.link',\n defaultMessage: 'Read documentation',\n },\n to: 'https://docs.strapi.io/cloud/intro',\n },\n title: {\n id: 'tours.overview.strapiCloud.label',\n defaultMessage: 'Deploy your application to Strapi Cloud',\n },\n done: DONE_LABEL,\n isExternal: true,\n },\n];\n\n/* -------------------------------------------------------------------------------------------------\n * GuidedTourOverview\n * -----------------------------------------------------------------------------------------------*/\n\nconst WaveIcon = () => {\n const theme = useTheme();\n return (\n <svg width=\"26\" height=\"27\" viewBox=\"0 0 26 27\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M24.4138 9.30762C25.1565 10.5578 25.6441 11.9429 25.8481 13.3827C26.0522 14.8225 25.9687 16.2885 25.6026 17.6958C25.2365 19.1032 24.5949 20.4239 23.7151 21.5818C22.8352 22.7396 21.7345 23.7114 20.4766 24.4411C19.2188 25.1708 17.8287 25.6439 16.3868 25.8329C14.945 26.022 13.48 25.9232 12.0765 25.5424C10.673 25.1616 9.35903 24.5063 8.21045 23.6144C7.06188 22.7226 6.10154 21.6118 5.385 20.3464L0.268755 11.4851C0.0253867 11.0275 -0.0308559 10.4934 0.111878 9.99514C0.254612 9.49692 0.585176 9.07356 1.03392 8.81426C1.48266 8.55497 2.01453 8.47999 2.51746 8.60514C3.02039 8.73028 3.45511 9.04576 3.73001 9.48512L6.05 13.5001C6.11567 13.6139 6.20309 13.7136 6.30729 13.7936C6.41148 13.8735 6.53041 13.9322 6.65728 13.9662C6.78415 14.0002 6.91647 14.0089 7.04669 13.9918C7.17692 13.9746 7.3025 13.932 7.41625 13.8664C7.53001 13.8007 7.62972 13.7133 7.70969 13.6091C7.78966 13.5049 7.84833 13.386 7.88234 13.2591C7.91635 13.1322 7.92504 12.9999 7.90791 12.8697C7.89078 12.7395 7.84817 12.6139 7.78251 12.5001L2.87501 4.00012C2.63164 3.54255 2.57539 3.00837 2.71813 2.51014C2.86086 2.01192 3.19143 1.58856 3.64017 1.32926C4.08891 1.06997 4.62078 0.994994 5.12371 1.12014C5.62664 1.24528 6.06136 1.56077 6.33626 2.00012L11.25 10.5001C11.3137 10.6175 11.4003 10.7209 11.5046 10.8042C11.609 10.8876 11.7289 10.9492 11.8575 10.9854C11.986 11.0216 12.1205 11.0318 12.253 11.0152C12.3855 10.9986 12.5133 10.9556 12.629 10.8888C12.7446 10.8221 12.8457 10.7328 12.9263 10.6263C13.0068 10.5198 13.0653 10.3982 13.0981 10.2688C13.1309 10.1394 13.1375 10.0047 13.1174 9.87264C13.0974 9.74062 13.0511 9.61395 12.9813 9.50012L9.23125 3.00012C8.9738 2.54125 8.90753 1.99941 9.04682 1.49203C9.18612 0.984641 9.51974 0.552582 9.97539 0.289483C10.431 0.0263834 10.972 -0.0465606 11.4811 0.0864587C11.9902 0.219478 12.4263 0.547745 12.695 1.00012L17.75 9.76512C16.6322 10.8916 16.0035 12.4132 16 14.0001C15.9963 15.2989 16.4177 16.5633 17.2 17.6001C17.278 17.7074 17.3766 17.7981 17.49 17.867C17.6034 17.9358 17.7293 17.9814 17.8605 18.001C17.9917 18.0207 18.1255 18.0141 18.2541 17.9816C18.3827 17.9491 18.5035 17.8913 18.6096 17.8116C18.7156 17.7319 18.8048 17.6319 18.8718 17.5175C18.9388 17.403 18.9824 17.2763 19 17.1448C19.0176 17.0134 19.0089 16.8797 18.9743 16.7516C18.9398 16.6236 18.8801 16.5036 18.7988 16.3989C18.4824 15.9765 18.2528 15.4958 18.1231 14.9843C17.9934 14.4729 17.9661 13.9408 18.0429 13.4188C18.1197 12.8967 18.2991 12.3951 18.5706 11.9426C18.8421 11.4902 19.2005 11.096 19.625 10.7826C19.8224 10.6365 19.9592 10.4229 20.0092 10.1825C20.0592 9.94202 20.019 9.69157 19.8963 9.47887L18.4638 7.00012C18.2063 6.54125 18.14 5.99941 18.2793 5.49203C18.4186 4.98464 18.7522 4.55258 19.2079 4.28948C19.6635 4.02638 20.2045 3.95344 20.7136 4.08646C21.2227 4.21948 21.6588 4.54774 21.9275 5.00012L24.4138 9.30762ZM20.7425 2.18262C21.4432 2.36725 22.1001 2.68931 22.6752 3.13008C23.2503 3.57084 23.7321 4.12153 24.0925 4.75012L24.1338 4.82137C24.2664 5.05111 24.4848 5.21877 24.741 5.28745C24.8679 5.32146 25.0002 5.33015 25.1304 5.31302C25.2607 5.29589 25.3862 5.25328 25.5 5.18762C25.6138 5.12196 25.7135 5.03453 25.7934 4.93034C25.8734 4.82614 25.9321 4.70721 25.9661 4.58035C26.0001 4.45348 26.0088 4.32115 25.9917 4.19093C25.9745 4.0607 25.9319 3.93513 25.8663 3.82137L25.825 3.75012C25.3335 2.89321 24.6767 2.14252 23.8926 1.54167C23.1085 0.940821 22.2128 0.501801 21.2575 0.250119C21.002 0.184041 20.7307 0.221665 20.5028 0.354786C20.2749 0.487908 20.1088 0.705731 20.0409 0.960766C19.9729 1.2158 20.0085 1.48736 20.14 1.71625C20.2714 1.94513 20.488 2.11277 20.7425 2.18262ZM6.9475 25.2151C5.65171 24.1925 4.56342 22.9315 3.74126 21.5001C3.67559 21.3864 3.58817 21.2866 3.48397 21.2067C3.37978 21.1267 3.26085 21.068 3.13398 21.034C3.00711 21 2.87479 20.9913 2.74456 21.0085C2.61434 21.0256 2.48876 21.0682 2.37501 21.1339C2.26125 21.1995 2.16154 21.287 2.08157 21.3911C2.00159 21.4953 1.94293 21.6143 1.90892 21.7411C1.87491 21.868 1.86622 22.0003 1.88335 22.1306C1.90048 22.2608 1.94309 22.3864 2.00875 22.5001C2.95782 24.1511 4.21368 25.6056 5.70875 26.7851C5.91728 26.9455 6.18063 27.0173 6.44172 26.9849C6.70282 26.9525 6.94062 26.8185 7.10359 26.612C7.26655 26.4054 7.34156 26.143 7.31234 25.8815C7.28313 25.62 7.15204 25.3806 6.9475 25.2151Z\"\n fill={theme.colors.primary600}\n />\n </svg>\n );\n};\n\nexport const GuidedTourHomepageOverview = () => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n\n const tours = useGuidedTour('Overview', (s) => s.state.tours);\n const dispatch = useGuidedTour('Overview', (s) => s.dispatch);\n const enabled = useGuidedTour('Overview', (s) => s.state.enabled);\n const completedActions = useGuidedTour('Overview', (s) => s.state.completedActions);\n const { data: guidedTourMeta } = useGetGuidedTourMetaQuery();\n\n const tourNames = Object.keys(tours) as ValidTourName[];\n const completedTours = tourNames.filter((tourName) => tours[tourName].isCompleted);\n const completionPercentage =\n tourNames.length > 0 ? Math.round((completedTours.length / tourNames.length) * 100) : 0;\n\n const handleConfirmDialog = () => {\n trackUsage('didSkipGuidedTour', { name: 'all' });\n dispatch({ type: 'skip_all_tours' });\n };\n\n const handleClickStrapiCloud = (tourName: ValidTourName) => {\n trackUsage('didCompleteGuidedTour', { name: tourName });\n dispatch({ type: 'skip_tour', payload: tourName });\n };\n\n if (!guidedTourMeta?.data.isFirstSuperAdminUser || !enabled) {\n return null;\n }\n\n return (\n <Container tag=\"section\" gap={0}>\n {/* Greeting */}\n <ContentSection direction=\"column\" gap={2} alignItems=\"start\">\n <WaveIcon />\n <Flex direction=\"column\" alignItems=\"start\" gap={1} paddingTop={4}>\n <Typography tag=\"h2\" fontSize=\"20px\" fontWeight=\"bold\">\n {formatMessage({\n id: 'tours.overview.title',\n defaultMessage: 'Discover your application!',\n })}\n </Typography>\n <Typography>\n {formatMessage({\n id: 'tours.overview.subtitle',\n defaultMessage: 'Follow the guided tour to get the most out of Strapi.',\n })}\n </Typography>\n </Flex>\n <Flex\n direction=\"column\"\n alignItems=\"flex-start\"\n width=\"100%\"\n paddingTop={5}\n paddingBottom={8}\n gap={2}\n >\n <Typography variant=\"pi\">{completionPercentage}%</Typography>\n <StyledProgressBar value={completionPercentage} />\n </Flex>\n <Dialog.Root>\n <Dialog.Trigger>\n <Button variant=\"tertiary\">\n {formatMessage({\n id: 'tours.overview.close',\n defaultMessage: 'Close guided tour',\n })}\n </Button>\n </Dialog.Trigger>\n <ConfirmDialog onConfirm={handleConfirmDialog}>\n {formatMessage({\n id: 'tours.overview.close.description',\n defaultMessage: 'Are you sure you want to close the guided tour?',\n })}\n </ConfirmDialog>\n </Dialog.Root>\n </ContentSection>\n <VerticalSeparator />\n {/* Task List */}\n <ContentSection direction=\"column\" alignItems=\"start\">\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {formatMessage({\n id: 'tours.overview.tasks',\n defaultMessage: 'Your tasks',\n })}\n </Typography>\n <Box tag=\"ul\" width=\"100%\" borderColor=\"neutral150\" marginTop={4} hasRadius>\n {TASK_CONTENT.map((task) => {\n const tourName = task.tourName as ValidTourName;\n const tour = tours[tourName];\n\n const isLinkDisabled =\n tourName !== 'contentTypeBuilder' &&\n !completedActions.includes(\n GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.createSchema\n );\n\n return (\n <TourTaskContainer\n tag=\"li\"\n aria-label={formatMessage(task.title)}\n key={tourName}\n alignItems=\"center\"\n justifyContent=\"space-between\"\n >\n {tour.isCompleted ? (\n <>\n <Flex gap={2}>\n <CheckCircle fill=\"success500\" />\n <Typography style={{ textDecoration: 'line-through' }} textColor=\"neutral500\">\n {formatMessage(task.title)}\n </Typography>\n </Flex>\n <Typography variant=\"omega\" textColor=\"neutral500\">\n {formatMessage(task.done)}\n </Typography>\n </>\n ) : (\n <>\n <Flex gap={2} alignItems=\"center\">\n <Flex height=\"16px\" width=\"16px\" justifyContent=\"center\">\n <TodoCircle />\n </Flex>\n <Typography>{formatMessage(task.title)}</Typography>\n </Flex>\n {task.isExternal ? (\n <Link\n isExternal\n disabled={isLinkDisabled}\n href={task.link.to}\n onClick={() => handleClickStrapiCloud(task.tourName as ValidTourName)}\n >\n {formatMessage(task.link.label)}\n </Link>\n ) : (\n <Link\n endIcon={<ChevronRight />}\n disabled={isLinkDisabled}\n to={task.link.to}\n tag={NavLink}\n onClick={() =>\n trackUsage('didStartGuidedTourFromHomepage', { name: tourName })\n }\n >\n {formatMessage(task.link.label)}\n </Link>\n )}\n </>\n )}\n </TourTaskContainer>\n );\n })}\n </Box>\n </ContentSection>\n </Container>\n );\n};\n"],"names":["StyledProgressBar","styled","ProgressBar","theme","colors","neutral150","success500","Container","Flex","borderRadius","neutral0","shadows","tableShadow","ContentSection","spaces","VerticalSeparator","div","TourTaskContainer","TodoCircle","Box","neutral300","LINK_LABEL","id","defaultMessage","DONE_LABEL","TASK_CONTENT","tourName","link","label","to","title","done","isExternal","WaveIcon","useTheme","_jsx","svg","width","height","viewBox","fill","xmlns","path","d","primary600","GuidedTourHomepageOverview","formatMessage","useIntl","trackUsage","useTracking","tours","useGuidedTour","s","state","dispatch","enabled","completedActions","data","guidedTourMeta","useGetGuidedTourMetaQuery","tourNames","Object","keys","completedTours","filter","isCompleted","completionPercentage","length","Math","round","handleConfirmDialog","name","type","handleClickStrapiCloud","payload","isFirstSuperAdminUser","_jsxs","tag","gap","direction","alignItems","paddingTop","Typography","fontSize","fontWeight","paddingBottom","variant","value","Dialog","Root","Trigger","Button","ConfirmDialog","onConfirm","borderColor","marginTop","hasRadius","map","task","tour","isLinkDisabled","includes","GUIDED_TOUR_REQUIRED_ACTIONS","contentTypeBuilder","createSchema","aria-label","justifyContent","_Fragment","CheckCircle","style","textDecoration","textColor","Link","disabled","href","onClick","endIcon","ChevronRight","NavLink"],"mappings":"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"}
1
+ {"version":3,"file":"Overview.js","sources":["../../../../../../admin/src/components/GuidedTour/Overview.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Dialog, Flex, Link, ProgressBar, Typography } from '@strapi/design-system';\nimport { CheckCircle, ChevronRight } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\nimport { styled, useTheme } from 'styled-components';\n\nimport { useTracking } from '../../features/Tracking';\nimport { useGetGuidedTourMetaQuery } from '../../services/admin';\nimport { ConfirmDialog } from '../ConfirmDialog';\n\nimport { type ValidTourName, useGuidedTour, getCompletedTours } from './Context';\nimport { GUIDED_TOUR_REQUIRED_ACTIONS } from './utils/constants';\n\n/* -------------------------------------------------------------------------------------------------\n * Styled\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledProgressBar = styled(ProgressBar)`\n width: 100%;\n background-color: ${({ theme }) => theme.colors.neutral150};\n > div {\n background-color: ${({ theme }) => theme.colors.success500};\n }\n`;\n\nconst Container = styled(Flex)`\n width: 100%;\n border-radius: ${({ theme }) => theme.borderRadius};\n background-color: ${({ theme }) => theme.colors.neutral0};\n box-shadow: ${({ theme }) => theme.shadows.tableShadow};\n align-items: stretch;\n`;\n\nconst ContentSection = styled(Flex)`\n flex: 1;\n padding: ${({ theme }) => theme.spaces[8]};\n`;\n\nconst VerticalSeparator = styled.div`\n width: 1px;\n background-color: ${({ theme }) => theme.colors.neutral150};\n`;\n\nconst TourTaskContainer = styled(Flex)`\n &:not(:last-child) {\n border-bottom: ${({ theme }) => `1px solid ${theme.colors.neutral150}`};\n }\n padding: ${({ theme }) => theme.spaces[4]};\n`;\n\nconst TodoCircle = styled(Box)`\n border: 1px solid ${({ theme }) => theme.colors.neutral300};\n border-radius: 50%;\n height: 13px;\n width: 13px;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * Constants\n * -----------------------------------------------------------------------------------------------*/\n\nconst LINK_LABEL = {\n id: 'tours.overview.tour.link',\n defaultMessage: 'Start',\n};\nconst DONE_LABEL = {\n id: 'tours.overview.tour.done',\n defaultMessage: 'Done',\n};\n\nconst TASK_CONTENT = [\n {\n tourName: 'contentTypeBuilder',\n link: {\n label: LINK_LABEL,\n to: '/plugins/content-type-builder',\n },\n title: {\n id: 'tours.overview.contentTypeBuilder.label',\n defaultMessage: 'Create your schema',\n },\n done: DONE_LABEL,\n },\n {\n tourName: 'contentManager',\n link: {\n label: LINK_LABEL,\n to: '/content-manager',\n },\n title: {\n id: 'tours.overview.contentManager.label',\n defaultMessage: 'Create and publish content',\n },\n done: DONE_LABEL,\n },\n {\n tourName: 'apiTokens',\n link: {\n label: LINK_LABEL,\n to: '/settings/api-tokens',\n },\n title: {\n id: 'tours.overview.apiTokens.label',\n defaultMessage: 'Copy an API token',\n },\n done: DONE_LABEL,\n },\n {\n tourName: 'strapiCloud',\n link: {\n label: {\n id: 'tours.overview.strapiCloud.link',\n defaultMessage: 'Read documentation',\n },\n to: 'https://docs.strapi.io/cloud/intro',\n },\n title: {\n id: 'tours.overview.strapiCloud.label',\n defaultMessage: 'Deploy your application to Strapi Cloud',\n },\n done: DONE_LABEL,\n isExternal: true,\n },\n];\n\n/* -------------------------------------------------------------------------------------------------\n * GuidedTourOverview\n * -----------------------------------------------------------------------------------------------*/\n\nconst WaveIcon = () => {\n const theme = useTheme();\n return (\n <svg width=\"26\" height=\"27\" viewBox=\"0 0 26 27\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M24.4138 9.30762C25.1565 10.5578 25.6441 11.9429 25.8481 13.3827C26.0522 14.8225 25.9687 16.2885 25.6026 17.6958C25.2365 19.1032 24.5949 20.4239 23.7151 21.5818C22.8352 22.7396 21.7345 23.7114 20.4766 24.4411C19.2188 25.1708 17.8287 25.6439 16.3868 25.8329C14.945 26.022 13.48 25.9232 12.0765 25.5424C10.673 25.1616 9.35903 24.5063 8.21045 23.6144C7.06188 22.7226 6.10154 21.6118 5.385 20.3464L0.268755 11.4851C0.0253867 11.0275 -0.0308559 10.4934 0.111878 9.99514C0.254612 9.49692 0.585176 9.07356 1.03392 8.81426C1.48266 8.55497 2.01453 8.47999 2.51746 8.60514C3.02039 8.73028 3.45511 9.04576 3.73001 9.48512L6.05 13.5001C6.11567 13.6139 6.20309 13.7136 6.30729 13.7936C6.41148 13.8735 6.53041 13.9322 6.65728 13.9662C6.78415 14.0002 6.91647 14.0089 7.04669 13.9918C7.17692 13.9746 7.3025 13.932 7.41625 13.8664C7.53001 13.8007 7.62972 13.7133 7.70969 13.6091C7.78966 13.5049 7.84833 13.386 7.88234 13.2591C7.91635 13.1322 7.92504 12.9999 7.90791 12.8697C7.89078 12.7395 7.84817 12.6139 7.78251 12.5001L2.87501 4.00012C2.63164 3.54255 2.57539 3.00837 2.71813 2.51014C2.86086 2.01192 3.19143 1.58856 3.64017 1.32926C4.08891 1.06997 4.62078 0.994994 5.12371 1.12014C5.62664 1.24528 6.06136 1.56077 6.33626 2.00012L11.25 10.5001C11.3137 10.6175 11.4003 10.7209 11.5046 10.8042C11.609 10.8876 11.7289 10.9492 11.8575 10.9854C11.986 11.0216 12.1205 11.0318 12.253 11.0152C12.3855 10.9986 12.5133 10.9556 12.629 10.8888C12.7446 10.8221 12.8457 10.7328 12.9263 10.6263C13.0068 10.5198 13.0653 10.3982 13.0981 10.2688C13.1309 10.1394 13.1375 10.0047 13.1174 9.87264C13.0974 9.74062 13.0511 9.61395 12.9813 9.50012L9.23125 3.00012C8.9738 2.54125 8.90753 1.99941 9.04682 1.49203C9.18612 0.984641 9.51974 0.552582 9.97539 0.289483C10.431 0.0263834 10.972 -0.0465606 11.4811 0.0864587C11.9902 0.219478 12.4263 0.547745 12.695 1.00012L17.75 9.76512C16.6322 10.8916 16.0035 12.4132 16 14.0001C15.9963 15.2989 16.4177 16.5633 17.2 17.6001C17.278 17.7074 17.3766 17.7981 17.49 17.867C17.6034 17.9358 17.7293 17.9814 17.8605 18.001C17.9917 18.0207 18.1255 18.0141 18.2541 17.9816C18.3827 17.9491 18.5035 17.8913 18.6096 17.8116C18.7156 17.7319 18.8048 17.6319 18.8718 17.5175C18.9388 17.403 18.9824 17.2763 19 17.1448C19.0176 17.0134 19.0089 16.8797 18.9743 16.7516C18.9398 16.6236 18.8801 16.5036 18.7988 16.3989C18.4824 15.9765 18.2528 15.4958 18.1231 14.9843C17.9934 14.4729 17.9661 13.9408 18.0429 13.4188C18.1197 12.8967 18.2991 12.3951 18.5706 11.9426C18.8421 11.4902 19.2005 11.096 19.625 10.7826C19.8224 10.6365 19.9592 10.4229 20.0092 10.1825C20.0592 9.94202 20.019 9.69157 19.8963 9.47887L18.4638 7.00012C18.2063 6.54125 18.14 5.99941 18.2793 5.49203C18.4186 4.98464 18.7522 4.55258 19.2079 4.28948C19.6635 4.02638 20.2045 3.95344 20.7136 4.08646C21.2227 4.21948 21.6588 4.54774 21.9275 5.00012L24.4138 9.30762ZM20.7425 2.18262C21.4432 2.36725 22.1001 2.68931 22.6752 3.13008C23.2503 3.57084 23.7321 4.12153 24.0925 4.75012L24.1338 4.82137C24.2664 5.05111 24.4848 5.21877 24.741 5.28745C24.8679 5.32146 25.0002 5.33015 25.1304 5.31302C25.2607 5.29589 25.3862 5.25328 25.5 5.18762C25.6138 5.12196 25.7135 5.03453 25.7934 4.93034C25.8734 4.82614 25.9321 4.70721 25.9661 4.58035C26.0001 4.45348 26.0088 4.32115 25.9917 4.19093C25.9745 4.0607 25.9319 3.93513 25.8663 3.82137L25.825 3.75012C25.3335 2.89321 24.6767 2.14252 23.8926 1.54167C23.1085 0.940821 22.2128 0.501801 21.2575 0.250119C21.002 0.184041 20.7307 0.221665 20.5028 0.354786C20.2749 0.487908 20.1088 0.705731 20.0409 0.960766C19.9729 1.2158 20.0085 1.48736 20.14 1.71625C20.2714 1.94513 20.488 2.11277 20.7425 2.18262ZM6.9475 25.2151C5.65171 24.1925 4.56342 22.9315 3.74126 21.5001C3.67559 21.3864 3.58817 21.2866 3.48397 21.2067C3.37978 21.1267 3.26085 21.068 3.13398 21.034C3.00711 21 2.87479 20.9913 2.74456 21.0085C2.61434 21.0256 2.48876 21.0682 2.37501 21.1339C2.26125 21.1995 2.16154 21.287 2.08157 21.3911C2.00159 21.4953 1.94293 21.6143 1.90892 21.7411C1.87491 21.868 1.86622 22.0003 1.88335 22.1306C1.90048 22.2608 1.94309 22.3864 2.00875 22.5001C2.95782 24.1511 4.21368 25.6056 5.70875 26.7851C5.91728 26.9455 6.18063 27.0173 6.44172 26.9849C6.70282 26.9525 6.94062 26.8185 7.10359 26.612C7.26655 26.4054 7.34156 26.143 7.31234 25.8815C7.28313 25.62 7.15204 25.3806 6.9475 25.2151Z\"\n fill={theme.colors.primary600}\n />\n </svg>\n );\n};\n\nexport const GuidedTourHomepageOverview = () => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n\n const tourState = useGuidedTour('Overview', (s) => s.state.tours);\n const dispatch = useGuidedTour('Overview', (s) => s.dispatch);\n const enabled = useGuidedTour('Overview', (s) => s.state.enabled);\n const completedActions = useGuidedTour('Overview', (s) => s.state.completedActions);\n const { data: guidedTourMeta } = useGetGuidedTourMetaQuery();\n\n const tourNames = Object.keys(tourState) as ValidTourName[];\n const completedTours = getCompletedTours(tourState);\n const completionPercentage =\n tourNames.length > 0 ? Math.round((completedTours.length / tourNames.length) * 100) : 0;\n\n const handleConfirmDialog = () => {\n trackUsage('didSkipGuidedTour', { name: 'all' });\n dispatch({ type: 'skip_all_tours' });\n };\n\n const handleStartTour = (tourName: ValidTourName) => {\n trackUsage('didStartGuidedTour', { name: tourName, fromHomepage: true });\n\n if (tourName === 'strapiCloud') {\n trackUsage('didCompleteGuidedTour', { name: tourName });\n dispatch({ type: 'next_step', payload: tourName });\n }\n };\n\n if (!guidedTourMeta?.data.isFirstSuperAdminUser || !enabled) {\n return null;\n }\n\n return (\n <Container tag=\"section\" gap={0}>\n {/* Greeting */}\n <ContentSection direction=\"column\" gap={2} alignItems=\"start\">\n <WaveIcon />\n <Flex direction=\"column\" alignItems=\"start\" gap={1} paddingTop={4}>\n <Typography tag=\"h2\" fontSize=\"20px\" fontWeight=\"bold\">\n {formatMessage({\n id: 'tours.overview.title',\n defaultMessage: 'Discover your application!',\n })}\n </Typography>\n <Typography>\n {formatMessage({\n id: 'tours.overview.subtitle',\n defaultMessage: 'Follow the guided tour to get the most out of Strapi.',\n })}\n </Typography>\n </Flex>\n <Flex\n direction=\"column\"\n alignItems=\"flex-start\"\n width=\"100%\"\n paddingTop={5}\n paddingBottom={8}\n gap={2}\n >\n <Typography variant=\"pi\">\n {formatMessage(\n {\n id: 'tours.overview.completed',\n defaultMessage: '{completed}% completed',\n },\n { completed: completionPercentage }\n )}\n </Typography>\n <StyledProgressBar value={completionPercentage} />\n </Flex>\n <Dialog.Root>\n <Dialog.Trigger>\n <Button variant=\"tertiary\">\n {formatMessage({\n id: 'tours.overview.close',\n defaultMessage: 'Close guided tour',\n })}\n </Button>\n </Dialog.Trigger>\n <ConfirmDialog onConfirm={handleConfirmDialog}>\n {formatMessage({\n id: 'tours.overview.close.description',\n defaultMessage: 'Are you sure you want to close the guided tour?',\n })}\n </ConfirmDialog>\n </Dialog.Root>\n </ContentSection>\n <VerticalSeparator />\n {/* Task List */}\n <ContentSection direction=\"column\" alignItems=\"start\">\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {formatMessage({\n id: 'tours.overview.tasks',\n defaultMessage: 'Your tasks',\n })}\n </Typography>\n <Box tag=\"ul\" width=\"100%\" borderColor=\"neutral150\" marginTop={4} hasRadius>\n {TASK_CONTENT.map((task) => {\n const tourName = task.tourName as ValidTourName;\n const tour = tourState[tourName];\n\n const isLinkDisabled =\n tourName !== 'contentTypeBuilder' &&\n !completedActions.includes(\n GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.createSchema\n );\n\n return (\n <TourTaskContainer\n tag=\"li\"\n aria-label={formatMessage(task.title)}\n key={tourName}\n alignItems=\"center\"\n justifyContent=\"space-between\"\n >\n {tour.isCompleted ? (\n <>\n <Flex gap={2}>\n <CheckCircle fill=\"success500\" />\n <Typography style={{ textDecoration: 'line-through' }} textColor=\"neutral500\">\n {formatMessage(task.title)}\n </Typography>\n </Flex>\n <Typography variant=\"omega\" textColor=\"neutral500\">\n {formatMessage(task.done)}\n </Typography>\n </>\n ) : (\n <>\n <Flex gap={2} alignItems=\"center\">\n <Flex height=\"16px\" width=\"16px\" justifyContent=\"center\">\n <TodoCircle />\n </Flex>\n <Typography>{formatMessage(task.title)}</Typography>\n </Flex>\n {task.isExternal ? (\n <Link\n isExternal\n disabled={isLinkDisabled}\n href={task.link.to}\n onClick={() => handleStartTour(task.tourName as ValidTourName)}\n >\n {formatMessage(task.link.label)}\n </Link>\n ) : (\n <Link\n endIcon={<ChevronRight />}\n disabled={isLinkDisabled}\n to={task.link.to}\n tag={NavLink}\n onClick={() =>\n trackUsage('didStartGuidedTour', { name: tourName, fromHomepage: true })\n }\n >\n {formatMessage(task.link.label)}\n </Link>\n )}\n </>\n )}\n </TourTaskContainer>\n );\n })}\n </Box>\n </ContentSection>\n </Container>\n );\n};\n"],"names":["StyledProgressBar","styled","ProgressBar","theme","colors","neutral150","success500","Container","Flex","borderRadius","neutral0","shadows","tableShadow","ContentSection","spaces","VerticalSeparator","div","TourTaskContainer","TodoCircle","Box","neutral300","LINK_LABEL","id","defaultMessage","DONE_LABEL","TASK_CONTENT","tourName","link","label","to","title","done","isExternal","WaveIcon","useTheme","_jsx","svg","width","height","viewBox","fill","xmlns","path","d","primary600","GuidedTourHomepageOverview","formatMessage","useIntl","trackUsage","useTracking","tourState","useGuidedTour","s","state","tours","dispatch","enabled","completedActions","data","guidedTourMeta","useGetGuidedTourMetaQuery","tourNames","Object","keys","completedTours","getCompletedTours","completionPercentage","length","Math","round","handleConfirmDialog","name","type","handleStartTour","fromHomepage","payload","isFirstSuperAdminUser","_jsxs","tag","gap","direction","alignItems","paddingTop","Typography","fontSize","fontWeight","paddingBottom","variant","completed","value","Dialog","Root","Trigger","Button","ConfirmDialog","onConfirm","borderColor","marginTop","hasRadius","map","task","tour","isLinkDisabled","includes","GUIDED_TOUR_REQUIRED_ACTIONS","contentTypeBuilder","createSchema","aria-label","justifyContent","isCompleted","_Fragment","CheckCircle","style","textDecoration","textColor","Link","disabled","href","onClick","endIcon","ChevronRight","NavLink"],"mappings":"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"}
@@ -8,7 +8,7 @@ import { styled, useTheme } from 'styled-components';
8
8
  import { useTracking } from '../../features/Tracking.mjs';
9
9
  import { useGetGuidedTourMetaQuery } from '../../services/admin.mjs';
10
10
  import { ConfirmDialog } from '../ConfirmDialog.mjs';
11
- import { useGuidedTour } from './Context.mjs';
11
+ import { useGuidedTour, getCompletedTours } from './Context.mjs';
12
12
  import { GUIDED_TOUR_REQUIRED_ACTIONS } from './utils/constants.mjs';
13
13
 
14
14
  /* -------------------------------------------------------------------------------------------------
@@ -130,13 +130,13 @@ const TASK_CONTENT = [
130
130
  const GuidedTourHomepageOverview = ()=>{
131
131
  const { formatMessage } = useIntl();
132
132
  const { trackUsage } = useTracking();
133
- const tours = useGuidedTour('Overview', (s)=>s.state.tours);
133
+ const tourState = useGuidedTour('Overview', (s)=>s.state.tours);
134
134
  const dispatch = useGuidedTour('Overview', (s)=>s.dispatch);
135
135
  const enabled = useGuidedTour('Overview', (s)=>s.state.enabled);
136
136
  const completedActions = useGuidedTour('Overview', (s)=>s.state.completedActions);
137
137
  const { data: guidedTourMeta } = useGetGuidedTourMetaQuery();
138
- const tourNames = Object.keys(tours);
139
- const completedTours = tourNames.filter((tourName)=>tours[tourName].isCompleted);
138
+ const tourNames = Object.keys(tourState);
139
+ const completedTours = getCompletedTours(tourState);
140
140
  const completionPercentage = tourNames.length > 0 ? Math.round(completedTours.length / tourNames.length * 100) : 0;
141
141
  const handleConfirmDialog = ()=>{
142
142
  trackUsage('didSkipGuidedTour', {
@@ -146,14 +146,20 @@ const GuidedTourHomepageOverview = ()=>{
146
146
  type: 'skip_all_tours'
147
147
  });
148
148
  };
149
- const handleClickStrapiCloud = (tourName)=>{
150
- trackUsage('didCompleteGuidedTour', {
151
- name: tourName
152
- });
153
- dispatch({
154
- type: 'skip_tour',
155
- payload: tourName
149
+ const handleStartTour = (tourName)=>{
150
+ trackUsage('didStartGuidedTour', {
151
+ name: tourName,
152
+ fromHomepage: true
156
153
  });
154
+ if (tourName === 'strapiCloud') {
155
+ trackUsage('didCompleteGuidedTour', {
156
+ name: tourName
157
+ });
158
+ dispatch({
159
+ type: 'next_step',
160
+ payload: tourName
161
+ });
162
+ }
157
163
  };
158
164
  if (!guidedTourMeta?.data.isFirstSuperAdminUser || !enabled) {
159
165
  return null;
@@ -199,12 +205,14 @@ const GuidedTourHomepageOverview = ()=>{
199
205
  paddingBottom: 8,
200
206
  gap: 2,
201
207
  children: [
202
- /*#__PURE__*/ jsxs(Typography, {
208
+ /*#__PURE__*/ jsx(Typography, {
203
209
  variant: "pi",
204
- children: [
205
- completionPercentage,
206
- "%"
207
- ]
210
+ children: formatMessage({
211
+ id: 'tours.overview.completed',
212
+ defaultMessage: '{completed}% completed'
213
+ }, {
214
+ completed: completionPercentage
215
+ })
208
216
  }),
209
217
  /*#__PURE__*/ jsx(StyledProgressBar, {
210
218
  value: completionPercentage
@@ -254,7 +262,7 @@ const GuidedTourHomepageOverview = ()=>{
254
262
  hasRadius: true,
255
263
  children: TASK_CONTENT.map((task)=>{
256
264
  const tourName = task.tourName;
257
- const tour = tours[tourName];
265
+ const tour = tourState[tourName];
258
266
  const isLinkDisabled = tourName !== 'contentTypeBuilder' && !completedActions.includes(GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.createSchema);
259
267
  return /*#__PURE__*/ jsx(TourTaskContainer, {
260
268
  tag: "li",
@@ -305,15 +313,16 @@ const GuidedTourHomepageOverview = ()=>{
305
313
  isExternal: true,
306
314
  disabled: isLinkDisabled,
307
315
  href: task.link.to,
308
- onClick: ()=>handleClickStrapiCloud(task.tourName),
316
+ onClick: ()=>handleStartTour(task.tourName),
309
317
  children: formatMessage(task.link.label)
310
318
  }) : /*#__PURE__*/ jsx(Link, {
311
319
  endIcon: /*#__PURE__*/ jsx(ChevronRight, {}),
312
320
  disabled: isLinkDisabled,
313
321
  to: task.link.to,
314
322
  tag: NavLink,
315
- onClick: ()=>trackUsage('didStartGuidedTourFromHomepage', {
316
- name: tourName
323
+ onClick: ()=>trackUsage('didStartGuidedTour', {
324
+ name: tourName,
325
+ fromHomepage: true
317
326
  }),
318
327
  children: formatMessage(task.link.label)
319
328
  })
@@ -1 +1 @@
1
- {"version":3,"file":"Overview.mjs","sources":["../../../../../../admin/src/components/GuidedTour/Overview.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Dialog, Flex, Link, ProgressBar, Typography } from '@strapi/design-system';\nimport { CheckCircle, ChevronRight } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\nimport { styled, useTheme } from 'styled-components';\n\nimport { useTracking } from '../../features/Tracking';\nimport { useGetGuidedTourMetaQuery } from '../../services/admin';\nimport { ConfirmDialog } from '../ConfirmDialog';\n\nimport { type ValidTourName, useGuidedTour } from './Context';\nimport { GUIDED_TOUR_REQUIRED_ACTIONS } from './utils/constants';\n\n/* -------------------------------------------------------------------------------------------------\n * Styled\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledProgressBar = styled(ProgressBar)`\n width: 100%;\n background-color: ${({ theme }) => theme.colors.neutral150};\n > div {\n background-color: ${({ theme }) => theme.colors.success500};\n }\n`;\n\nconst Container = styled(Flex)`\n width: 100%;\n border-radius: ${({ theme }) => theme.borderRadius};\n background-color: ${({ theme }) => theme.colors.neutral0};\n box-shadow: ${({ theme }) => theme.shadows.tableShadow};\n align-items: stretch;\n`;\n\nconst ContentSection = styled(Flex)`\n flex: 1;\n padding: ${({ theme }) => theme.spaces[8]};\n`;\n\nconst VerticalSeparator = styled.div`\n width: 1px;\n background-color: ${({ theme }) => theme.colors.neutral150};\n`;\n\nconst TourTaskContainer = styled(Flex)`\n &:not(:last-child) {\n border-bottom: ${({ theme }) => `1px solid ${theme.colors.neutral150}`};\n }\n padding: ${({ theme }) => theme.spaces[4]};\n`;\n\nconst TodoCircle = styled(Box)`\n border: 1px solid ${({ theme }) => theme.colors.neutral300};\n border-radius: 50%;\n height: 13px;\n width: 13px;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * Constants\n * -----------------------------------------------------------------------------------------------*/\n\nconst LINK_LABEL = {\n id: 'tours.overview.tour.link',\n defaultMessage: 'Start',\n};\nconst DONE_LABEL = {\n id: 'tours.overview.tour.done',\n defaultMessage: 'Done',\n};\n\nconst TASK_CONTENT = [\n {\n tourName: 'contentTypeBuilder',\n link: {\n label: LINK_LABEL,\n to: '/plugins/content-type-builder',\n },\n title: {\n id: 'tours.overview.contentTypeBuilder.label',\n defaultMessage: 'Create your schema',\n },\n done: DONE_LABEL,\n },\n {\n tourName: 'contentManager',\n link: {\n label: LINK_LABEL,\n to: '/content-manager',\n },\n title: {\n id: 'tours.overview.contentManager.label',\n defaultMessage: 'Create and publish content',\n },\n done: DONE_LABEL,\n },\n {\n tourName: 'apiTokens',\n link: {\n label: LINK_LABEL,\n to: '/settings/api-tokens',\n },\n title: {\n id: 'tours.overview.apiTokens.label',\n defaultMessage: 'Copy an API token',\n },\n done: DONE_LABEL,\n },\n {\n tourName: 'strapiCloud',\n link: {\n label: {\n id: 'tours.overview.strapiCloud.link',\n defaultMessage: 'Read documentation',\n },\n to: 'https://docs.strapi.io/cloud/intro',\n },\n title: {\n id: 'tours.overview.strapiCloud.label',\n defaultMessage: 'Deploy your application to Strapi Cloud',\n },\n done: DONE_LABEL,\n isExternal: true,\n },\n];\n\n/* -------------------------------------------------------------------------------------------------\n * GuidedTourOverview\n * -----------------------------------------------------------------------------------------------*/\n\nconst WaveIcon = () => {\n const theme = useTheme();\n return (\n <svg width=\"26\" height=\"27\" viewBox=\"0 0 26 27\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M24.4138 9.30762C25.1565 10.5578 25.6441 11.9429 25.8481 13.3827C26.0522 14.8225 25.9687 16.2885 25.6026 17.6958C25.2365 19.1032 24.5949 20.4239 23.7151 21.5818C22.8352 22.7396 21.7345 23.7114 20.4766 24.4411C19.2188 25.1708 17.8287 25.6439 16.3868 25.8329C14.945 26.022 13.48 25.9232 12.0765 25.5424C10.673 25.1616 9.35903 24.5063 8.21045 23.6144C7.06188 22.7226 6.10154 21.6118 5.385 20.3464L0.268755 11.4851C0.0253867 11.0275 -0.0308559 10.4934 0.111878 9.99514C0.254612 9.49692 0.585176 9.07356 1.03392 8.81426C1.48266 8.55497 2.01453 8.47999 2.51746 8.60514C3.02039 8.73028 3.45511 9.04576 3.73001 9.48512L6.05 13.5001C6.11567 13.6139 6.20309 13.7136 6.30729 13.7936C6.41148 13.8735 6.53041 13.9322 6.65728 13.9662C6.78415 14.0002 6.91647 14.0089 7.04669 13.9918C7.17692 13.9746 7.3025 13.932 7.41625 13.8664C7.53001 13.8007 7.62972 13.7133 7.70969 13.6091C7.78966 13.5049 7.84833 13.386 7.88234 13.2591C7.91635 13.1322 7.92504 12.9999 7.90791 12.8697C7.89078 12.7395 7.84817 12.6139 7.78251 12.5001L2.87501 4.00012C2.63164 3.54255 2.57539 3.00837 2.71813 2.51014C2.86086 2.01192 3.19143 1.58856 3.64017 1.32926C4.08891 1.06997 4.62078 0.994994 5.12371 1.12014C5.62664 1.24528 6.06136 1.56077 6.33626 2.00012L11.25 10.5001C11.3137 10.6175 11.4003 10.7209 11.5046 10.8042C11.609 10.8876 11.7289 10.9492 11.8575 10.9854C11.986 11.0216 12.1205 11.0318 12.253 11.0152C12.3855 10.9986 12.5133 10.9556 12.629 10.8888C12.7446 10.8221 12.8457 10.7328 12.9263 10.6263C13.0068 10.5198 13.0653 10.3982 13.0981 10.2688C13.1309 10.1394 13.1375 10.0047 13.1174 9.87264C13.0974 9.74062 13.0511 9.61395 12.9813 9.50012L9.23125 3.00012C8.9738 2.54125 8.90753 1.99941 9.04682 1.49203C9.18612 0.984641 9.51974 0.552582 9.97539 0.289483C10.431 0.0263834 10.972 -0.0465606 11.4811 0.0864587C11.9902 0.219478 12.4263 0.547745 12.695 1.00012L17.75 9.76512C16.6322 10.8916 16.0035 12.4132 16 14.0001C15.9963 15.2989 16.4177 16.5633 17.2 17.6001C17.278 17.7074 17.3766 17.7981 17.49 17.867C17.6034 17.9358 17.7293 17.9814 17.8605 18.001C17.9917 18.0207 18.1255 18.0141 18.2541 17.9816C18.3827 17.9491 18.5035 17.8913 18.6096 17.8116C18.7156 17.7319 18.8048 17.6319 18.8718 17.5175C18.9388 17.403 18.9824 17.2763 19 17.1448C19.0176 17.0134 19.0089 16.8797 18.9743 16.7516C18.9398 16.6236 18.8801 16.5036 18.7988 16.3989C18.4824 15.9765 18.2528 15.4958 18.1231 14.9843C17.9934 14.4729 17.9661 13.9408 18.0429 13.4188C18.1197 12.8967 18.2991 12.3951 18.5706 11.9426C18.8421 11.4902 19.2005 11.096 19.625 10.7826C19.8224 10.6365 19.9592 10.4229 20.0092 10.1825C20.0592 9.94202 20.019 9.69157 19.8963 9.47887L18.4638 7.00012C18.2063 6.54125 18.14 5.99941 18.2793 5.49203C18.4186 4.98464 18.7522 4.55258 19.2079 4.28948C19.6635 4.02638 20.2045 3.95344 20.7136 4.08646C21.2227 4.21948 21.6588 4.54774 21.9275 5.00012L24.4138 9.30762ZM20.7425 2.18262C21.4432 2.36725 22.1001 2.68931 22.6752 3.13008C23.2503 3.57084 23.7321 4.12153 24.0925 4.75012L24.1338 4.82137C24.2664 5.05111 24.4848 5.21877 24.741 5.28745C24.8679 5.32146 25.0002 5.33015 25.1304 5.31302C25.2607 5.29589 25.3862 5.25328 25.5 5.18762C25.6138 5.12196 25.7135 5.03453 25.7934 4.93034C25.8734 4.82614 25.9321 4.70721 25.9661 4.58035C26.0001 4.45348 26.0088 4.32115 25.9917 4.19093C25.9745 4.0607 25.9319 3.93513 25.8663 3.82137L25.825 3.75012C25.3335 2.89321 24.6767 2.14252 23.8926 1.54167C23.1085 0.940821 22.2128 0.501801 21.2575 0.250119C21.002 0.184041 20.7307 0.221665 20.5028 0.354786C20.2749 0.487908 20.1088 0.705731 20.0409 0.960766C19.9729 1.2158 20.0085 1.48736 20.14 1.71625C20.2714 1.94513 20.488 2.11277 20.7425 2.18262ZM6.9475 25.2151C5.65171 24.1925 4.56342 22.9315 3.74126 21.5001C3.67559 21.3864 3.58817 21.2866 3.48397 21.2067C3.37978 21.1267 3.26085 21.068 3.13398 21.034C3.00711 21 2.87479 20.9913 2.74456 21.0085C2.61434 21.0256 2.48876 21.0682 2.37501 21.1339C2.26125 21.1995 2.16154 21.287 2.08157 21.3911C2.00159 21.4953 1.94293 21.6143 1.90892 21.7411C1.87491 21.868 1.86622 22.0003 1.88335 22.1306C1.90048 22.2608 1.94309 22.3864 2.00875 22.5001C2.95782 24.1511 4.21368 25.6056 5.70875 26.7851C5.91728 26.9455 6.18063 27.0173 6.44172 26.9849C6.70282 26.9525 6.94062 26.8185 7.10359 26.612C7.26655 26.4054 7.34156 26.143 7.31234 25.8815C7.28313 25.62 7.15204 25.3806 6.9475 25.2151Z\"\n fill={theme.colors.primary600}\n />\n </svg>\n );\n};\n\nexport const GuidedTourHomepageOverview = () => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n\n const tours = useGuidedTour('Overview', (s) => s.state.tours);\n const dispatch = useGuidedTour('Overview', (s) => s.dispatch);\n const enabled = useGuidedTour('Overview', (s) => s.state.enabled);\n const completedActions = useGuidedTour('Overview', (s) => s.state.completedActions);\n const { data: guidedTourMeta } = useGetGuidedTourMetaQuery();\n\n const tourNames = Object.keys(tours) as ValidTourName[];\n const completedTours = tourNames.filter((tourName) => tours[tourName].isCompleted);\n const completionPercentage =\n tourNames.length > 0 ? Math.round((completedTours.length / tourNames.length) * 100) : 0;\n\n const handleConfirmDialog = () => {\n trackUsage('didSkipGuidedTour', { name: 'all' });\n dispatch({ type: 'skip_all_tours' });\n };\n\n const handleClickStrapiCloud = (tourName: ValidTourName) => {\n trackUsage('didCompleteGuidedTour', { name: tourName });\n dispatch({ type: 'skip_tour', payload: tourName });\n };\n\n if (!guidedTourMeta?.data.isFirstSuperAdminUser || !enabled) {\n return null;\n }\n\n return (\n <Container tag=\"section\" gap={0}>\n {/* Greeting */}\n <ContentSection direction=\"column\" gap={2} alignItems=\"start\">\n <WaveIcon />\n <Flex direction=\"column\" alignItems=\"start\" gap={1} paddingTop={4}>\n <Typography tag=\"h2\" fontSize=\"20px\" fontWeight=\"bold\">\n {formatMessage({\n id: 'tours.overview.title',\n defaultMessage: 'Discover your application!',\n })}\n </Typography>\n <Typography>\n {formatMessage({\n id: 'tours.overview.subtitle',\n defaultMessage: 'Follow the guided tour to get the most out of Strapi.',\n })}\n </Typography>\n </Flex>\n <Flex\n direction=\"column\"\n alignItems=\"flex-start\"\n width=\"100%\"\n paddingTop={5}\n paddingBottom={8}\n gap={2}\n >\n <Typography variant=\"pi\">{completionPercentage}%</Typography>\n <StyledProgressBar value={completionPercentage} />\n </Flex>\n <Dialog.Root>\n <Dialog.Trigger>\n <Button variant=\"tertiary\">\n {formatMessage({\n id: 'tours.overview.close',\n defaultMessage: 'Close guided tour',\n })}\n </Button>\n </Dialog.Trigger>\n <ConfirmDialog onConfirm={handleConfirmDialog}>\n {formatMessage({\n id: 'tours.overview.close.description',\n defaultMessage: 'Are you sure you want to close the guided tour?',\n })}\n </ConfirmDialog>\n </Dialog.Root>\n </ContentSection>\n <VerticalSeparator />\n {/* Task List */}\n <ContentSection direction=\"column\" alignItems=\"start\">\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {formatMessage({\n id: 'tours.overview.tasks',\n defaultMessage: 'Your tasks',\n })}\n </Typography>\n <Box tag=\"ul\" width=\"100%\" borderColor=\"neutral150\" marginTop={4} hasRadius>\n {TASK_CONTENT.map((task) => {\n const tourName = task.tourName as ValidTourName;\n const tour = tours[tourName];\n\n const isLinkDisabled =\n tourName !== 'contentTypeBuilder' &&\n !completedActions.includes(\n GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.createSchema\n );\n\n return (\n <TourTaskContainer\n tag=\"li\"\n aria-label={formatMessage(task.title)}\n key={tourName}\n alignItems=\"center\"\n justifyContent=\"space-between\"\n >\n {tour.isCompleted ? (\n <>\n <Flex gap={2}>\n <CheckCircle fill=\"success500\" />\n <Typography style={{ textDecoration: 'line-through' }} textColor=\"neutral500\">\n {formatMessage(task.title)}\n </Typography>\n </Flex>\n <Typography variant=\"omega\" textColor=\"neutral500\">\n {formatMessage(task.done)}\n </Typography>\n </>\n ) : (\n <>\n <Flex gap={2} alignItems=\"center\">\n <Flex height=\"16px\" width=\"16px\" justifyContent=\"center\">\n <TodoCircle />\n </Flex>\n <Typography>{formatMessage(task.title)}</Typography>\n </Flex>\n {task.isExternal ? (\n <Link\n isExternal\n disabled={isLinkDisabled}\n href={task.link.to}\n onClick={() => handleClickStrapiCloud(task.tourName as ValidTourName)}\n >\n {formatMessage(task.link.label)}\n </Link>\n ) : (\n <Link\n endIcon={<ChevronRight />}\n disabled={isLinkDisabled}\n to={task.link.to}\n tag={NavLink}\n onClick={() =>\n trackUsage('didStartGuidedTourFromHomepage', { name: tourName })\n }\n >\n {formatMessage(task.link.label)}\n </Link>\n )}\n </>\n )}\n </TourTaskContainer>\n );\n })}\n </Box>\n </ContentSection>\n </Container>\n );\n};\n"],"names":["StyledProgressBar","styled","ProgressBar","theme","colors","neutral150","success500","Container","Flex","borderRadius","neutral0","shadows","tableShadow","ContentSection","spaces","VerticalSeparator","div","TourTaskContainer","TodoCircle","Box","neutral300","LINK_LABEL","id","defaultMessage","DONE_LABEL","TASK_CONTENT","tourName","link","label","to","title","done","isExternal","WaveIcon","useTheme","_jsx","svg","width","height","viewBox","fill","xmlns","path","d","primary600","GuidedTourHomepageOverview","formatMessage","useIntl","trackUsage","useTracking","tours","useGuidedTour","s","state","dispatch","enabled","completedActions","data","guidedTourMeta","useGetGuidedTourMetaQuery","tourNames","Object","keys","completedTours","filter","isCompleted","completionPercentage","length","Math","round","handleConfirmDialog","name","type","handleClickStrapiCloud","payload","isFirstSuperAdminUser","_jsxs","tag","gap","direction","alignItems","paddingTop","Typography","fontSize","fontWeight","paddingBottom","variant","value","Dialog","Root","Trigger","Button","ConfirmDialog","onConfirm","borderColor","marginTop","hasRadius","map","task","tour","isLinkDisabled","includes","GUIDED_TOUR_REQUIRED_ACTIONS","contentTypeBuilder","createSchema","aria-label","justifyContent","_Fragment","CheckCircle","style","textDecoration","textColor","Link","disabled","href","onClick","endIcon","ChevronRight","NavLink"],"mappings":"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"}
1
+ {"version":3,"file":"Overview.mjs","sources":["../../../../../../admin/src/components/GuidedTour/Overview.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Dialog, Flex, Link, ProgressBar, Typography } from '@strapi/design-system';\nimport { CheckCircle, ChevronRight } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\nimport { styled, useTheme } from 'styled-components';\n\nimport { useTracking } from '../../features/Tracking';\nimport { useGetGuidedTourMetaQuery } from '../../services/admin';\nimport { ConfirmDialog } from '../ConfirmDialog';\n\nimport { type ValidTourName, useGuidedTour, getCompletedTours } from './Context';\nimport { GUIDED_TOUR_REQUIRED_ACTIONS } from './utils/constants';\n\n/* -------------------------------------------------------------------------------------------------\n * Styled\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledProgressBar = styled(ProgressBar)`\n width: 100%;\n background-color: ${({ theme }) => theme.colors.neutral150};\n > div {\n background-color: ${({ theme }) => theme.colors.success500};\n }\n`;\n\nconst Container = styled(Flex)`\n width: 100%;\n border-radius: ${({ theme }) => theme.borderRadius};\n background-color: ${({ theme }) => theme.colors.neutral0};\n box-shadow: ${({ theme }) => theme.shadows.tableShadow};\n align-items: stretch;\n`;\n\nconst ContentSection = styled(Flex)`\n flex: 1;\n padding: ${({ theme }) => theme.spaces[8]};\n`;\n\nconst VerticalSeparator = styled.div`\n width: 1px;\n background-color: ${({ theme }) => theme.colors.neutral150};\n`;\n\nconst TourTaskContainer = styled(Flex)`\n &:not(:last-child) {\n border-bottom: ${({ theme }) => `1px solid ${theme.colors.neutral150}`};\n }\n padding: ${({ theme }) => theme.spaces[4]};\n`;\n\nconst TodoCircle = styled(Box)`\n border: 1px solid ${({ theme }) => theme.colors.neutral300};\n border-radius: 50%;\n height: 13px;\n width: 13px;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * Constants\n * -----------------------------------------------------------------------------------------------*/\n\nconst LINK_LABEL = {\n id: 'tours.overview.tour.link',\n defaultMessage: 'Start',\n};\nconst DONE_LABEL = {\n id: 'tours.overview.tour.done',\n defaultMessage: 'Done',\n};\n\nconst TASK_CONTENT = [\n {\n tourName: 'contentTypeBuilder',\n link: {\n label: LINK_LABEL,\n to: '/plugins/content-type-builder',\n },\n title: {\n id: 'tours.overview.contentTypeBuilder.label',\n defaultMessage: 'Create your schema',\n },\n done: DONE_LABEL,\n },\n {\n tourName: 'contentManager',\n link: {\n label: LINK_LABEL,\n to: '/content-manager',\n },\n title: {\n id: 'tours.overview.contentManager.label',\n defaultMessage: 'Create and publish content',\n },\n done: DONE_LABEL,\n },\n {\n tourName: 'apiTokens',\n link: {\n label: LINK_LABEL,\n to: '/settings/api-tokens',\n },\n title: {\n id: 'tours.overview.apiTokens.label',\n defaultMessage: 'Copy an API token',\n },\n done: DONE_LABEL,\n },\n {\n tourName: 'strapiCloud',\n link: {\n label: {\n id: 'tours.overview.strapiCloud.link',\n defaultMessage: 'Read documentation',\n },\n to: 'https://docs.strapi.io/cloud/intro',\n },\n title: {\n id: 'tours.overview.strapiCloud.label',\n defaultMessage: 'Deploy your application to Strapi Cloud',\n },\n done: DONE_LABEL,\n isExternal: true,\n },\n];\n\n/* -------------------------------------------------------------------------------------------------\n * GuidedTourOverview\n * -----------------------------------------------------------------------------------------------*/\n\nconst WaveIcon = () => {\n const theme = useTheme();\n return (\n <svg width=\"26\" height=\"27\" viewBox=\"0 0 26 27\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M24.4138 9.30762C25.1565 10.5578 25.6441 11.9429 25.8481 13.3827C26.0522 14.8225 25.9687 16.2885 25.6026 17.6958C25.2365 19.1032 24.5949 20.4239 23.7151 21.5818C22.8352 22.7396 21.7345 23.7114 20.4766 24.4411C19.2188 25.1708 17.8287 25.6439 16.3868 25.8329C14.945 26.022 13.48 25.9232 12.0765 25.5424C10.673 25.1616 9.35903 24.5063 8.21045 23.6144C7.06188 22.7226 6.10154 21.6118 5.385 20.3464L0.268755 11.4851C0.0253867 11.0275 -0.0308559 10.4934 0.111878 9.99514C0.254612 9.49692 0.585176 9.07356 1.03392 8.81426C1.48266 8.55497 2.01453 8.47999 2.51746 8.60514C3.02039 8.73028 3.45511 9.04576 3.73001 9.48512L6.05 13.5001C6.11567 13.6139 6.20309 13.7136 6.30729 13.7936C6.41148 13.8735 6.53041 13.9322 6.65728 13.9662C6.78415 14.0002 6.91647 14.0089 7.04669 13.9918C7.17692 13.9746 7.3025 13.932 7.41625 13.8664C7.53001 13.8007 7.62972 13.7133 7.70969 13.6091C7.78966 13.5049 7.84833 13.386 7.88234 13.2591C7.91635 13.1322 7.92504 12.9999 7.90791 12.8697C7.89078 12.7395 7.84817 12.6139 7.78251 12.5001L2.87501 4.00012C2.63164 3.54255 2.57539 3.00837 2.71813 2.51014C2.86086 2.01192 3.19143 1.58856 3.64017 1.32926C4.08891 1.06997 4.62078 0.994994 5.12371 1.12014C5.62664 1.24528 6.06136 1.56077 6.33626 2.00012L11.25 10.5001C11.3137 10.6175 11.4003 10.7209 11.5046 10.8042C11.609 10.8876 11.7289 10.9492 11.8575 10.9854C11.986 11.0216 12.1205 11.0318 12.253 11.0152C12.3855 10.9986 12.5133 10.9556 12.629 10.8888C12.7446 10.8221 12.8457 10.7328 12.9263 10.6263C13.0068 10.5198 13.0653 10.3982 13.0981 10.2688C13.1309 10.1394 13.1375 10.0047 13.1174 9.87264C13.0974 9.74062 13.0511 9.61395 12.9813 9.50012L9.23125 3.00012C8.9738 2.54125 8.90753 1.99941 9.04682 1.49203C9.18612 0.984641 9.51974 0.552582 9.97539 0.289483C10.431 0.0263834 10.972 -0.0465606 11.4811 0.0864587C11.9902 0.219478 12.4263 0.547745 12.695 1.00012L17.75 9.76512C16.6322 10.8916 16.0035 12.4132 16 14.0001C15.9963 15.2989 16.4177 16.5633 17.2 17.6001C17.278 17.7074 17.3766 17.7981 17.49 17.867C17.6034 17.9358 17.7293 17.9814 17.8605 18.001C17.9917 18.0207 18.1255 18.0141 18.2541 17.9816C18.3827 17.9491 18.5035 17.8913 18.6096 17.8116C18.7156 17.7319 18.8048 17.6319 18.8718 17.5175C18.9388 17.403 18.9824 17.2763 19 17.1448C19.0176 17.0134 19.0089 16.8797 18.9743 16.7516C18.9398 16.6236 18.8801 16.5036 18.7988 16.3989C18.4824 15.9765 18.2528 15.4958 18.1231 14.9843C17.9934 14.4729 17.9661 13.9408 18.0429 13.4188C18.1197 12.8967 18.2991 12.3951 18.5706 11.9426C18.8421 11.4902 19.2005 11.096 19.625 10.7826C19.8224 10.6365 19.9592 10.4229 20.0092 10.1825C20.0592 9.94202 20.019 9.69157 19.8963 9.47887L18.4638 7.00012C18.2063 6.54125 18.14 5.99941 18.2793 5.49203C18.4186 4.98464 18.7522 4.55258 19.2079 4.28948C19.6635 4.02638 20.2045 3.95344 20.7136 4.08646C21.2227 4.21948 21.6588 4.54774 21.9275 5.00012L24.4138 9.30762ZM20.7425 2.18262C21.4432 2.36725 22.1001 2.68931 22.6752 3.13008C23.2503 3.57084 23.7321 4.12153 24.0925 4.75012L24.1338 4.82137C24.2664 5.05111 24.4848 5.21877 24.741 5.28745C24.8679 5.32146 25.0002 5.33015 25.1304 5.31302C25.2607 5.29589 25.3862 5.25328 25.5 5.18762C25.6138 5.12196 25.7135 5.03453 25.7934 4.93034C25.8734 4.82614 25.9321 4.70721 25.9661 4.58035C26.0001 4.45348 26.0088 4.32115 25.9917 4.19093C25.9745 4.0607 25.9319 3.93513 25.8663 3.82137L25.825 3.75012C25.3335 2.89321 24.6767 2.14252 23.8926 1.54167C23.1085 0.940821 22.2128 0.501801 21.2575 0.250119C21.002 0.184041 20.7307 0.221665 20.5028 0.354786C20.2749 0.487908 20.1088 0.705731 20.0409 0.960766C19.9729 1.2158 20.0085 1.48736 20.14 1.71625C20.2714 1.94513 20.488 2.11277 20.7425 2.18262ZM6.9475 25.2151C5.65171 24.1925 4.56342 22.9315 3.74126 21.5001C3.67559 21.3864 3.58817 21.2866 3.48397 21.2067C3.37978 21.1267 3.26085 21.068 3.13398 21.034C3.00711 21 2.87479 20.9913 2.74456 21.0085C2.61434 21.0256 2.48876 21.0682 2.37501 21.1339C2.26125 21.1995 2.16154 21.287 2.08157 21.3911C2.00159 21.4953 1.94293 21.6143 1.90892 21.7411C1.87491 21.868 1.86622 22.0003 1.88335 22.1306C1.90048 22.2608 1.94309 22.3864 2.00875 22.5001C2.95782 24.1511 4.21368 25.6056 5.70875 26.7851C5.91728 26.9455 6.18063 27.0173 6.44172 26.9849C6.70282 26.9525 6.94062 26.8185 7.10359 26.612C7.26655 26.4054 7.34156 26.143 7.31234 25.8815C7.28313 25.62 7.15204 25.3806 6.9475 25.2151Z\"\n fill={theme.colors.primary600}\n />\n </svg>\n );\n};\n\nexport const GuidedTourHomepageOverview = () => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n\n const tourState = useGuidedTour('Overview', (s) => s.state.tours);\n const dispatch = useGuidedTour('Overview', (s) => s.dispatch);\n const enabled = useGuidedTour('Overview', (s) => s.state.enabled);\n const completedActions = useGuidedTour('Overview', (s) => s.state.completedActions);\n const { data: guidedTourMeta } = useGetGuidedTourMetaQuery();\n\n const tourNames = Object.keys(tourState) as ValidTourName[];\n const completedTours = getCompletedTours(tourState);\n const completionPercentage =\n tourNames.length > 0 ? Math.round((completedTours.length / tourNames.length) * 100) : 0;\n\n const handleConfirmDialog = () => {\n trackUsage('didSkipGuidedTour', { name: 'all' });\n dispatch({ type: 'skip_all_tours' });\n };\n\n const handleStartTour = (tourName: ValidTourName) => {\n trackUsage('didStartGuidedTour', { name: tourName, fromHomepage: true });\n\n if (tourName === 'strapiCloud') {\n trackUsage('didCompleteGuidedTour', { name: tourName });\n dispatch({ type: 'next_step', payload: tourName });\n }\n };\n\n if (!guidedTourMeta?.data.isFirstSuperAdminUser || !enabled) {\n return null;\n }\n\n return (\n <Container tag=\"section\" gap={0}>\n {/* Greeting */}\n <ContentSection direction=\"column\" gap={2} alignItems=\"start\">\n <WaveIcon />\n <Flex direction=\"column\" alignItems=\"start\" gap={1} paddingTop={4}>\n <Typography tag=\"h2\" fontSize=\"20px\" fontWeight=\"bold\">\n {formatMessage({\n id: 'tours.overview.title',\n defaultMessage: 'Discover your application!',\n })}\n </Typography>\n <Typography>\n {formatMessage({\n id: 'tours.overview.subtitle',\n defaultMessage: 'Follow the guided tour to get the most out of Strapi.',\n })}\n </Typography>\n </Flex>\n <Flex\n direction=\"column\"\n alignItems=\"flex-start\"\n width=\"100%\"\n paddingTop={5}\n paddingBottom={8}\n gap={2}\n >\n <Typography variant=\"pi\">\n {formatMessage(\n {\n id: 'tours.overview.completed',\n defaultMessage: '{completed}% completed',\n },\n { completed: completionPercentage }\n )}\n </Typography>\n <StyledProgressBar value={completionPercentage} />\n </Flex>\n <Dialog.Root>\n <Dialog.Trigger>\n <Button variant=\"tertiary\">\n {formatMessage({\n id: 'tours.overview.close',\n defaultMessage: 'Close guided tour',\n })}\n </Button>\n </Dialog.Trigger>\n <ConfirmDialog onConfirm={handleConfirmDialog}>\n {formatMessage({\n id: 'tours.overview.close.description',\n defaultMessage: 'Are you sure you want to close the guided tour?',\n })}\n </ConfirmDialog>\n </Dialog.Root>\n </ContentSection>\n <VerticalSeparator />\n {/* Task List */}\n <ContentSection direction=\"column\" alignItems=\"start\">\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {formatMessage({\n id: 'tours.overview.tasks',\n defaultMessage: 'Your tasks',\n })}\n </Typography>\n <Box tag=\"ul\" width=\"100%\" borderColor=\"neutral150\" marginTop={4} hasRadius>\n {TASK_CONTENT.map((task) => {\n const tourName = task.tourName as ValidTourName;\n const tour = tourState[tourName];\n\n const isLinkDisabled =\n tourName !== 'contentTypeBuilder' &&\n !completedActions.includes(\n GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.createSchema\n );\n\n return (\n <TourTaskContainer\n tag=\"li\"\n aria-label={formatMessage(task.title)}\n key={tourName}\n alignItems=\"center\"\n justifyContent=\"space-between\"\n >\n {tour.isCompleted ? (\n <>\n <Flex gap={2}>\n <CheckCircle fill=\"success500\" />\n <Typography style={{ textDecoration: 'line-through' }} textColor=\"neutral500\">\n {formatMessage(task.title)}\n </Typography>\n </Flex>\n <Typography variant=\"omega\" textColor=\"neutral500\">\n {formatMessage(task.done)}\n </Typography>\n </>\n ) : (\n <>\n <Flex gap={2} alignItems=\"center\">\n <Flex height=\"16px\" width=\"16px\" justifyContent=\"center\">\n <TodoCircle />\n </Flex>\n <Typography>{formatMessage(task.title)}</Typography>\n </Flex>\n {task.isExternal ? (\n <Link\n isExternal\n disabled={isLinkDisabled}\n href={task.link.to}\n onClick={() => handleStartTour(task.tourName as ValidTourName)}\n >\n {formatMessage(task.link.label)}\n </Link>\n ) : (\n <Link\n endIcon={<ChevronRight />}\n disabled={isLinkDisabled}\n to={task.link.to}\n tag={NavLink}\n onClick={() =>\n trackUsage('didStartGuidedTour', { name: tourName, fromHomepage: true })\n }\n >\n {formatMessage(task.link.label)}\n </Link>\n )}\n </>\n )}\n </TourTaskContainer>\n );\n })}\n </Box>\n </ContentSection>\n </Container>\n );\n};\n"],"names":["StyledProgressBar","styled","ProgressBar","theme","colors","neutral150","success500","Container","Flex","borderRadius","neutral0","shadows","tableShadow","ContentSection","spaces","VerticalSeparator","div","TourTaskContainer","TodoCircle","Box","neutral300","LINK_LABEL","id","defaultMessage","DONE_LABEL","TASK_CONTENT","tourName","link","label","to","title","done","isExternal","WaveIcon","useTheme","_jsx","svg","width","height","viewBox","fill","xmlns","path","d","primary600","GuidedTourHomepageOverview","formatMessage","useIntl","trackUsage","useTracking","tourState","useGuidedTour","s","state","tours","dispatch","enabled","completedActions","data","guidedTourMeta","useGetGuidedTourMetaQuery","tourNames","Object","keys","completedTours","getCompletedTours","completionPercentage","length","Math","round","handleConfirmDialog","name","type","handleStartTour","fromHomepage","payload","isFirstSuperAdminUser","_jsxs","tag","gap","direction","alignItems","paddingTop","Typography","fontSize","fontWeight","paddingBottom","variant","completed","value","Dialog","Root","Trigger","Button","ConfirmDialog","onConfirm","borderColor","marginTop","hasRadius","map","task","tour","isLinkDisabled","includes","GUIDED_TOUR_REQUIRED_ACTIONS","contentTypeBuilder","createSchema","aria-label","justifyContent","isCompleted","_Fragment","CheckCircle","style","textDecoration","textColor","Link","disabled","href","onClick","endIcon","ChevronRight","NavLink"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Tracking.js","sources":["../../../../../admin/src/features/Tracking.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport axios, { AxiosResponse } from 'axios';\n\nimport { Tours } from '../components/GuidedTour/Tours';\nimport { useInitQuery, useTelemetryPropertiesQuery } from '../services/admin';\n\nimport { useAppInfo } from './AppInfo';\nimport { useAuth } from './Auth';\nimport { useStrapiApp } from './StrapiApp';\n\nexport interface TelemetryProperties {\n useTypescriptOnServer?: boolean;\n useTypescriptOnAdmin?: boolean;\n isHostedOnStrapiCloud?: boolean;\n numberOfAllContentTypes?: number;\n numberOfComponents?: number;\n numberOfDynamicZones?: number;\n}\n\nexport interface TrackingContextValue {\n uuid?: string | boolean;\n telemetryProperties?: TelemetryProperties;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nconst TrackingContext = React.createContext<TrackingContextValue>({\n uuid: false,\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface TrackingProviderProps {\n children: React.ReactNode;\n}\n\nconst TrackingProvider = ({ children }: TrackingProviderProps) => {\n const token = useAuth('App', (state) => state.token);\n const { data: initData } = useInitQuery();\n const { uuid } = initData ?? {};\n const getAllWidgets = useStrapiApp('TrackingProvider', (state) => state.widgets.getAll);\n\n const { data } = useTelemetryPropertiesQuery(undefined, {\n skip: !initData?.uuid || !token,\n });\n React.useEffect(() => {\n if (uuid && data) {\n const event = 'didInitializeAdministration';\n try {\n fetch(`${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`, {\n method: 'POST',\n body: JSON.stringify({\n // This event is anonymous\n event,\n userId: '',\n eventPropeties: {},\n groupProperties: {\n ...data,\n projectId: uuid,\n registeredWidgets: getAllWidgets().map((widget) => widget.uid),\n },\n }),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n });\n } catch {\n // silence is golden\n }\n }\n }, [data, uuid, getAllWidgets]);\n const value = React.useMemo(\n () => ({\n uuid,\n telemetryProperties: data,\n }),\n [uuid, data]\n );\n\n return <TrackingContext.Provider value={value}>{children}</TrackingContext.Provider>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * We can group these events together because none have properties so there's no benefit\n * to having them as separate types.\n *\n * Meanwhile those with properties have different property shapes corresponding to the specific\n * event so understanding which properties go with which event is very helpful.\n */\nexport interface EventWithoutProperties {\n name:\n | 'changeComponentsOrder'\n | 'didAddComponentToDynamicZone'\n | 'didBulkDeleteEntries'\n | 'didNotBulkDeleteEntries'\n | 'didChangeDisplayedFields'\n | 'didCheckDraftRelations'\n | 'didClickGuidedTourHomepageApiTokens'\n | 'didClickGuidedTourHomepageContentManager'\n | 'didClickGuidedTourHomepageContentTypeBuilder'\n | 'didClickGuidedTourStep1CollectionType'\n | 'didClickGuidedTourStep2ContentManager'\n | 'didClickGuidedTourStep3ApiTokens'\n | 'didClickonBlogSection'\n | 'didClickonCodeExampleSection'\n | 'didClickonReadTheDocumentationSection'\n | 'didClickOnTryStrapiCloudSection'\n | 'didClickonTutorialSection'\n | 'didCreateGuidedTourCollectionType'\n | 'didCreateGuidedTourEntry'\n | 'didCreateNewRole'\n | 'didCreateRole'\n | 'didDeleteToken'\n | 'didDuplicateRole'\n | 'didEditEditSettings'\n | 'didEditEmailTemplates'\n | 'didEditFieldNameOnContentType'\n | 'didEditListSettings'\n | 'didEditMediaLibraryConfig'\n | 'didEditNameOfContentType'\n | 'didGenerateGuidedTourApiTokens'\n | 'didGoToMarketplace'\n | 'didLaunchGuidedtour'\n | 'didMissMarketplacePlugin'\n | 'didNotCreateFirstAdmin'\n | 'didNotSaveComponent'\n | 'didPluginLearnMore'\n | 'didBulkPublishEntries'\n | 'didNotBulkPublishEntries'\n | 'didUnpublishEntry'\n | 'didBulkUnpublishEntries'\n | 'didNotBulkUnpublishEntries'\n | 'didSaveComponent'\n | 'didSaveContentType'\n | 'didSearch'\n | 'didSkipGuidedtour'\n | 'didSubmitPlugin'\n | 'didSubmitProvider'\n | 'didUpdateConditions'\n | 'didSelectAllMediaLibraryElements'\n | 'didSelectContentTypeFieldSettings'\n | 'didSelectContentTypeSettings'\n | 'didEditAuthenticationProvider'\n | 'didRestoreHistoryVersion'\n | 'hasClickedCTBAddFieldBanner'\n | 'removeComponentFromDynamicZone'\n | 'willAddMoreFieldToContentType'\n | 'willBulkDeleteEntries'\n | 'willBulkPublishEntries'\n | 'willBulkUnpublishEntries'\n | 'willChangeNumberOfEntriesPerPage'\n | 'willCheckDraftRelations'\n | 'willCreateComponent'\n | 'willCreateComponentFromAttributesModal'\n | 'willCreateContentType'\n | 'willCreateFirstAdmin'\n | 'willCreateNewRole'\n | 'willCreateRole'\n | 'willCreateSingleType'\n | 'willCreateStage'\n | 'willCreateWorkflow'\n | 'willDeleteEntryFromList'\n | 'willDeleteFieldOfContentType'\n | 'willDuplicateRole'\n | 'willEditEditLayout'\n | 'willEditEmailTemplates'\n | 'willEditEntryFromButton'\n | 'willEditEntryFromList'\n | 'willEditReleaseFromHome'\n | 'willEditFieldOfContentType'\n | 'willEditMediaLibraryConfig'\n | 'willEditNameOfContentType'\n | 'willEditNameOfSingleType'\n | 'willEditAuthenticationProvider'\n | 'willEditFieldNameOnContentType'\n | 'willEditStage'\n | 'willFilterEntries'\n | 'willInstallPlugin'\n | 'willOpenAuditLogDetailsFromHome'\n | 'willUnpublishEntry'\n | 'willSaveComponent'\n | 'willSaveContentType'\n | 'willSaveContentTypeLayout'\n | 'didEditFieldNameOnContentType'\n | 'didCreateRelease'\n | 'didLaunchGuidedtour';\n properties?: never;\n}\n\ninterface DidAccessAuthenticatedAdministrationEvent {\n name: 'didAccessAuthenticatedAdministration';\n properties: {\n registeredWidgets: string[];\n projectId: string;\n };\n}\n\ninterface DidFilterMediaLibraryElementsEvent {\n name: 'didFilterMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n filter: string;\n };\n}\n\ninterface DidSortMediaLibraryElementsEvent {\n name: 'didSortMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n sort: string;\n };\n}\n\ninterface DidCropFileEvent {\n name: 'didCropFile';\n properties: MediaEvents['properties'] & {\n duplicatedFile: null | boolean;\n };\n}\n\ninterface DidSelectFile {\n name: 'didSelectFile';\n properties: MediaEvents['properties'] & {\n source: 'url' | 'computer';\n };\n}\n\ninterface DidEditMediaLibraryElementsEvent {\n name: 'didEditMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n type: string;\n changeLocation: string | boolean;\n };\n}\n\ninterface MediaEvents {\n name:\n | 'didSearchMediaLibraryElements'\n | 'didReplaceMedia'\n | 'didAddMediaLibraryFolders'\n | 'willAddMediaLibraryAssets';\n properties: {\n location: string;\n };\n}\n\ninterface DidSelectContentTypeFieldTypeEvent {\n name: 'didSelectContentTypeFieldType';\n properties: {\n type?: string;\n };\n}\n\ninterface DidChangeModeEvent {\n name: 'didChangeMode';\n properties: {\n newMode: string;\n };\n}\ninterface DidSubmitWithErrorsFirstAdminEvent {\n name: 'didSubmitWithErrorsFirstAdmin';\n properties: {\n count: string;\n };\n}\n\ninterface WillNavigateEvent {\n name: 'willNavigate';\n properties: {\n from: string;\n to: string;\n };\n}\n\ninterface DidAccessTokenListEvent {\n name: 'didAccessTokenList';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n number: number;\n };\n}\ninterface LogoEvent {\n name: 'didChangeLogo' | 'didClickResetLogo';\n properties: {\n logo: 'menu' | 'auth';\n };\n}\n\ninterface TokenEvents {\n name:\n | 'didCopyTokenKey'\n | 'didAddTokenFromList'\n | 'didEditTokenFromList'\n | 'willAccessTokenList'\n | 'willAddTokenFromList'\n | 'willCreateToken'\n | 'willDeleteToken'\n | 'willEditToken'\n | 'willEditTokenFromList';\n properties: {\n tokenType: 'api-token' | 'transfer-token';\n };\n}\n\ninterface WillModifyTokenEvent {\n name: 'didCreateToken' | 'didEditToken';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n type: 'custom' | 'full-access' | 'read-only' | Array<'push' | 'pull' | 'push-pull'>;\n };\n}\n\ninterface DeleteEntryEvents {\n name: 'willDeleteEntry' | 'didDeleteEntry' | 'didNotDeleteEntry';\n properties: {\n status?: string;\n error?: unknown;\n };\n}\n\ninterface CreateEntryEvents {\n name: 'willCreateEntry' | 'didCreateEntry' | 'didNotCreateEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface PublishEntryEvents {\n name: 'willPublishEntry' | 'didPublishEntry';\n properties: {\n documentId?: string;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface UpdateEntryEvents {\n name: 'willEditEntry' | 'didEditEntry' | 'didNotEditEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface DidFilterEntriesEvent {\n name: 'didFilterEntries';\n properties: {\n useRelation: boolean;\n };\n}\n\ninterface DidPublishRelease {\n name: 'didPublishRelease';\n properties: {\n totalEntries: number;\n totalPublishedEntries: number;\n totalUnpublishedEntries: number;\n };\n}\n\ninterface DidUpdateCTBSchema {\n name: 'didUpdateCTBSchema';\n properties: {\n success: boolean;\n newContentTypes: number;\n editedContentTypes: number;\n deletedContentTypes: number;\n newComponents: number;\n editedComponents: number;\n deletedComponents: number;\n newFields: number;\n editedFields: number;\n deletedFields: number;\n };\n}\n\ninterface DidSkipGuidedTour {\n name: 'didSkipGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidCompleteGuidedTour {\n name: 'didCompleteGuidedTour';\n properties: {\n name: keyof Tours;\n };\n}\n\ninterface DidStartGuidedTour {\n name: 'didStartGuidedTourFromHomepage';\n properties: {\n name: keyof Tours;\n };\n}\n\ninterface WillEditEntryFromHome {\n name: 'willEditEntryFromHome';\n properties: {\n entryType: 'edited' | 'published' | 'assigned';\n };\n}\n\ninterface DidOpenHomeWidgetLink {\n name: 'didOpenHomeWidgetLink';\n properties: {\n widgetUID: string;\n };\n}\n\ninterface DidOpenKeyStatisticsWidgetLink {\n name: 'didOpenKeyStatisticsWidgetLink';\n properties: {\n itemKey: string;\n };\n}\n\ntype EventsWithProperties =\n | CreateEntryEvents\n | PublishEntryEvents\n | DidAccessAuthenticatedAdministrationEvent\n | DidAccessTokenListEvent\n | DidChangeModeEvent\n | DidCropFileEvent\n | DeleteEntryEvents\n | DidEditMediaLibraryElementsEvent\n | DidFilterMediaLibraryElementsEvent\n | DidFilterEntriesEvent\n | DidSelectContentTypeFieldTypeEvent\n | DidSelectFile\n | DidSortMediaLibraryElementsEvent\n | DidSubmitWithErrorsFirstAdminEvent\n | LogoEvent\n | TokenEvents\n | UpdateEntryEvents\n | WillModifyTokenEvent\n | WillNavigateEvent\n | DidPublishRelease\n | MediaEvents\n | DidUpdateCTBSchema\n | DidSkipGuidedTour\n | DidCompleteGuidedTour\n | DidStartGuidedTour\n | DidOpenHomeWidgetLink\n | DidOpenKeyStatisticsWidgetLink\n | WillEditEntryFromHome;\n\nexport type TrackingEvent = EventWithoutProperties | EventsWithProperties;\nexport interface UseTrackingReturn {\n /**\n * This type helps show all the available event names before you start typing,\n * however autocomplete isn't great.\n */\n trackUsage<TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n trackUsage<TEvent extends Extract<TrackingEvent, { properties?: never }>>(\n event: TEvent['name'],\n properties?: never\n ): Promise<null | AxiosResponse<string>>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n trackUsage<TEvent extends Extract<TrackingEvent, { properties: object }>>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n}\n\n/**\n * @description Used to send amplitude events to the Strapi Tracking hub.\n *\n * @example\n * ```tsx\n * import { useTracking } from '@strapi/strapi/admin';\n *\n * const MyComponent = () => {\n * const { trackUsage } = useTracking();\n *\n * const handleClick = () => {\n * trackUsage('my-event', { myProperty: 'myValue' });\n * }\n *\n * return <button onClick={handleClick}>Send Event</button>\n * }\n * ```\n */\nconst useTracking = (): UseTrackingReturn => {\n const { uuid, telemetryProperties } = React.useContext(TrackingContext);\n const userId = useAppInfo('useTracking', (state) => state.userId);\n const trackUsage = React.useCallback(\n async <TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties?: TEvent['properties']\n ) => {\n try {\n if (uuid && !window.strapi.telemetryDisabled) {\n const res = await axios.post<string>(\n `${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`,\n {\n event,\n userId,\n eventProperties: { ...properties },\n userProperties: {},\n groupProperties: {\n ...telemetryProperties,\n projectId: uuid,\n projectType: window.strapi.projectType,\n },\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n }\n );\n\n return res;\n }\n } catch (err) {\n // Silence is golden\n }\n\n return null;\n },\n [telemetryProperties, userId, uuid]\n );\n\n return { trackUsage };\n};\n\nexport { TrackingProvider, useTracking };\n"],"names":["TrackingContext","React","createContext","uuid","TrackingProvider","children","token","useAuth","state","data","initData","useInitQuery","getAllWidgets","useStrapiApp","widgets","getAll","useTelemetryPropertiesQuery","undefined","skip","useEffect","event","fetch","process","env","STRAPI_ANALYTICS_URL","method","body","JSON","stringify","userId","eventPropeties","groupProperties","projectId","registeredWidgets","map","widget","uid","headers","value","useMemo","telemetryProperties","_jsx","Provider","useTracking","useContext","useAppInfo","trackUsage","useCallback","properties","window","strapi","telemetryDisabled","res","axios","post","eventProperties","userProperties","projectType","err"],"mappings":"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"}
1
+ {"version":3,"file":"Tracking.js","sources":["../../../../../admin/src/features/Tracking.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport axios, { AxiosResponse } from 'axios';\n\nimport { Tours } from '../components/GuidedTour/Tours';\nimport { useInitQuery, useTelemetryPropertiesQuery } from '../services/admin';\n\nimport { useAppInfo } from './AppInfo';\nimport { useAuth } from './Auth';\nimport { useStrapiApp } from './StrapiApp';\n\nexport interface TelemetryProperties {\n useTypescriptOnServer?: boolean;\n useTypescriptOnAdmin?: boolean;\n isHostedOnStrapiCloud?: boolean;\n numberOfAllContentTypes?: number;\n numberOfComponents?: number;\n numberOfDynamicZones?: number;\n}\n\nexport interface TrackingContextValue {\n uuid?: string | boolean;\n telemetryProperties?: TelemetryProperties;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nconst TrackingContext = React.createContext<TrackingContextValue>({\n uuid: false,\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface TrackingProviderProps {\n children: React.ReactNode;\n}\n\nconst TrackingProvider = ({ children }: TrackingProviderProps) => {\n const token = useAuth('App', (state) => state.token);\n const { data: initData } = useInitQuery();\n const { uuid } = initData ?? {};\n const getAllWidgets = useStrapiApp('TrackingProvider', (state) => state.widgets.getAll);\n\n const { data } = useTelemetryPropertiesQuery(undefined, {\n skip: !initData?.uuid || !token,\n });\n React.useEffect(() => {\n if (uuid && data) {\n const event = 'didInitializeAdministration';\n try {\n fetch(`${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`, {\n method: 'POST',\n body: JSON.stringify({\n // This event is anonymous\n event,\n userId: '',\n eventPropeties: {},\n groupProperties: {\n ...data,\n projectId: uuid,\n registeredWidgets: getAllWidgets().map((widget) => widget.uid),\n },\n }),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n });\n } catch {\n // silence is golden\n }\n }\n }, [data, uuid, getAllWidgets]);\n const value = React.useMemo(\n () => ({\n uuid,\n telemetryProperties: data,\n }),\n [uuid, data]\n );\n\n return <TrackingContext.Provider value={value}>{children}</TrackingContext.Provider>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * We can group these events together because none have properties so there's no benefit\n * to having them as separate types.\n *\n * Meanwhile those with properties have different property shapes corresponding to the specific\n * event so understanding which properties go with which event is very helpful.\n */\nexport interface EventWithoutProperties {\n name:\n | 'changeComponentsOrder'\n | 'didAddComponentToDynamicZone'\n | 'didBulkDeleteEntries'\n | 'didNotBulkDeleteEntries'\n | 'didChangeDisplayedFields'\n | 'didCheckDraftRelations'\n | 'didClickGuidedTourHomepageApiTokens'\n | 'didClickGuidedTourHomepageContentManager'\n | 'didClickGuidedTourHomepageContentTypeBuilder'\n | 'didClickGuidedTourStep1CollectionType'\n | 'didClickGuidedTourStep2ContentManager'\n | 'didClickGuidedTourStep3ApiTokens'\n | 'didClickonBlogSection'\n | 'didClickonCodeExampleSection'\n | 'didClickonReadTheDocumentationSection'\n | 'didClickOnTryStrapiCloudSection'\n | 'didClickonTutorialSection'\n | 'didCreateGuidedTourCollectionType'\n | 'didCreateGuidedTourEntry'\n | 'didCreateNewRole'\n | 'didCreateRole'\n | 'didDeleteToken'\n | 'didDuplicateRole'\n | 'didEditEditSettings'\n | 'didEditEmailTemplates'\n | 'didEditFieldNameOnContentType'\n | 'didEditListSettings'\n | 'didEditMediaLibraryConfig'\n | 'didEditNameOfContentType'\n | 'didGenerateGuidedTourApiTokens'\n | 'didGoToMarketplace'\n | 'didLaunchGuidedtour'\n | 'didMissMarketplacePlugin'\n | 'didNotCreateFirstAdmin'\n | 'didNotSaveComponent'\n | 'didPluginLearnMore'\n | 'didBulkPublishEntries'\n | 'didNotBulkPublishEntries'\n | 'didUnpublishEntry'\n | 'didBulkUnpublishEntries'\n | 'didNotBulkUnpublishEntries'\n | 'didSaveComponent'\n | 'didSaveContentType'\n | 'didSearch'\n | 'didSkipGuidedtour'\n | 'didSubmitPlugin'\n | 'didSubmitProvider'\n | 'didUpdateConditions'\n | 'didSelectAllMediaLibraryElements'\n | 'didSelectContentTypeFieldSettings'\n | 'didSelectContentTypeSettings'\n | 'didEditAuthenticationProvider'\n | 'didRestoreHistoryVersion'\n | 'hasClickedCTBAddFieldBanner'\n | 'removeComponentFromDynamicZone'\n | 'willAddMoreFieldToContentType'\n | 'willBulkDeleteEntries'\n | 'willBulkPublishEntries'\n | 'willBulkUnpublishEntries'\n | 'willChangeNumberOfEntriesPerPage'\n | 'willCheckDraftRelations'\n | 'willCreateComponent'\n | 'willCreateComponentFromAttributesModal'\n | 'willCreateContentType'\n | 'willCreateFirstAdmin'\n | 'willCreateNewRole'\n | 'willCreateRole'\n | 'willCreateSingleType'\n | 'willCreateStage'\n | 'willCreateWorkflow'\n | 'willDeleteEntryFromList'\n | 'willDeleteFieldOfContentType'\n | 'willDuplicateRole'\n | 'willEditEditLayout'\n | 'willEditEmailTemplates'\n | 'willEditEntryFromButton'\n | 'willEditEntryFromList'\n | 'willEditReleaseFromHome'\n | 'willEditFieldOfContentType'\n | 'willEditMediaLibraryConfig'\n | 'willEditNameOfContentType'\n | 'willEditNameOfSingleType'\n | 'willEditAuthenticationProvider'\n | 'willEditFieldNameOnContentType'\n | 'willEditStage'\n | 'willFilterEntries'\n | 'willInstallPlugin'\n | 'willOpenAuditLogDetailsFromHome'\n | 'willUnpublishEntry'\n | 'willSaveComponent'\n | 'willSaveContentType'\n | 'willSaveContentTypeLayout'\n | 'didEditFieldNameOnContentType'\n | 'didCreateRelease'\n | 'didLaunchGuidedtour';\n properties?: never;\n}\n\ninterface DidAccessAuthenticatedAdministrationEvent {\n name: 'didAccessAuthenticatedAdministration';\n properties: {\n registeredWidgets: string[];\n projectId: string;\n };\n}\n\ninterface DidFilterMediaLibraryElementsEvent {\n name: 'didFilterMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n filter: string;\n };\n}\n\ninterface DidSortMediaLibraryElementsEvent {\n name: 'didSortMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n sort: string;\n };\n}\n\ninterface DidCropFileEvent {\n name: 'didCropFile';\n properties: MediaEvents['properties'] & {\n duplicatedFile: null | boolean;\n };\n}\n\ninterface DidSelectFile {\n name: 'didSelectFile';\n properties: MediaEvents['properties'] & {\n source: 'url' | 'computer';\n };\n}\n\ninterface DidEditMediaLibraryElementsEvent {\n name: 'didEditMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n type: string;\n changeLocation: string | boolean;\n };\n}\n\ninterface MediaEvents {\n name:\n | 'didSearchMediaLibraryElements'\n | 'didReplaceMedia'\n | 'didAddMediaLibraryFolders'\n | 'willAddMediaLibraryAssets';\n properties: {\n location: string;\n };\n}\n\ninterface DidSelectContentTypeFieldTypeEvent {\n name: 'didSelectContentTypeFieldType';\n properties: {\n type?: string;\n };\n}\n\ninterface DidChangeModeEvent {\n name: 'didChangeMode';\n properties: {\n newMode: string;\n };\n}\ninterface DidSubmitWithErrorsFirstAdminEvent {\n name: 'didSubmitWithErrorsFirstAdmin';\n properties: {\n count: string;\n };\n}\n\ninterface WillNavigateEvent {\n name: 'willNavigate';\n properties: {\n from: string;\n to: string;\n };\n}\n\ninterface DidAccessTokenListEvent {\n name: 'didAccessTokenList';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n number: number;\n };\n}\ninterface LogoEvent {\n name: 'didChangeLogo' | 'didClickResetLogo';\n properties: {\n logo: 'menu' | 'auth';\n };\n}\n\ninterface TokenEvents {\n name:\n | 'didCopyTokenKey'\n | 'didAddTokenFromList'\n | 'didEditTokenFromList'\n | 'willAccessTokenList'\n | 'willAddTokenFromList'\n | 'willCreateToken'\n | 'willDeleteToken'\n | 'willEditToken'\n | 'willEditTokenFromList';\n properties: {\n tokenType: 'api-token' | 'transfer-token';\n };\n}\n\ninterface WillModifyTokenEvent {\n name: 'didCreateToken' | 'didEditToken';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n type: 'custom' | 'full-access' | 'read-only' | Array<'push' | 'pull' | 'push-pull'>;\n };\n}\n\ninterface DeleteEntryEvents {\n name: 'willDeleteEntry' | 'didDeleteEntry' | 'didNotDeleteEntry';\n properties: {\n status?: string;\n error?: unknown;\n };\n}\n\ninterface CreateEntryEvents {\n name: 'willCreateEntry' | 'didCreateEntry' | 'didNotCreateEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface PublishEntryEvents {\n name: 'willPublishEntry' | 'didPublishEntry';\n properties: {\n documentId?: string;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface UpdateEntryEvents {\n name: 'willEditEntry' | 'didEditEntry' | 'didNotEditEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface DidFilterEntriesEvent {\n name: 'didFilterEntries';\n properties: {\n useRelation: boolean;\n };\n}\n\ninterface DidPublishRelease {\n name: 'didPublishRelease';\n properties: {\n totalEntries: number;\n totalPublishedEntries: number;\n totalUnpublishedEntries: number;\n };\n}\n\ninterface DidUpdateCTBSchema {\n name: 'didUpdateCTBSchema';\n properties: {\n success: boolean;\n newContentTypes: number;\n editedContentTypes: number;\n deletedContentTypes: number;\n newComponents: number;\n editedComponents: number;\n deletedComponents: number;\n newFields: number;\n editedFields: number;\n deletedFields: number;\n };\n}\n\ninterface DidSkipGuidedTour {\n name: 'didSkipGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidCompleteGuidedTour {\n name: 'didCompleteGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidStartGuidedTour {\n name: 'didStartGuidedTour';\n properties: {\n name: keyof Tours;\n fromHomepage?: boolean;\n };\n}\n\ninterface WillEditEntryFromHome {\n name: 'willEditEntryFromHome';\n properties: {\n entryType: 'edited' | 'published' | 'assigned';\n };\n}\n\ninterface DidOpenHomeWidgetLink {\n name: 'didOpenHomeWidgetLink';\n properties: {\n widgetUID: string;\n };\n}\n\ninterface DidOpenKeyStatisticsWidgetLink {\n name: 'didOpenKeyStatisticsWidgetLink';\n properties: {\n itemKey: string;\n };\n}\n\ntype EventsWithProperties =\n | CreateEntryEvents\n | PublishEntryEvents\n | DidAccessAuthenticatedAdministrationEvent\n | DidAccessTokenListEvent\n | DidChangeModeEvent\n | DidCropFileEvent\n | DeleteEntryEvents\n | DidEditMediaLibraryElementsEvent\n | DidFilterMediaLibraryElementsEvent\n | DidFilterEntriesEvent\n | DidSelectContentTypeFieldTypeEvent\n | DidSelectFile\n | DidSortMediaLibraryElementsEvent\n | DidSubmitWithErrorsFirstAdminEvent\n | LogoEvent\n | TokenEvents\n | UpdateEntryEvents\n | WillModifyTokenEvent\n | WillNavigateEvent\n | DidPublishRelease\n | MediaEvents\n | DidUpdateCTBSchema\n | DidSkipGuidedTour\n | DidCompleteGuidedTour\n | DidStartGuidedTour\n | DidOpenHomeWidgetLink\n | DidOpenKeyStatisticsWidgetLink\n | WillEditEntryFromHome;\n\nexport type TrackingEvent = EventWithoutProperties | EventsWithProperties;\nexport interface UseTrackingReturn {\n /**\n * This type helps show all the available event names before you start typing,\n * however autocomplete isn't great.\n */\n trackUsage<TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n trackUsage<TEvent extends Extract<TrackingEvent, { properties?: never }>>(\n event: TEvent['name'],\n properties?: never\n ): Promise<null | AxiosResponse<string>>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n trackUsage<TEvent extends Extract<TrackingEvent, { properties: object }>>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n}\n\n/**\n * @description Used to send amplitude events to the Strapi Tracking hub.\n *\n * @example\n * ```tsx\n * import { useTracking } from '@strapi/strapi/admin';\n *\n * const MyComponent = () => {\n * const { trackUsage } = useTracking();\n *\n * const handleClick = () => {\n * trackUsage('my-event', { myProperty: 'myValue' });\n * }\n *\n * return <button onClick={handleClick}>Send Event</button>\n * }\n * ```\n */\nconst useTracking = (): UseTrackingReturn => {\n const { uuid, telemetryProperties } = React.useContext(TrackingContext);\n const userId = useAppInfo('useTracking', (state) => state.userId);\n const trackUsage = React.useCallback(\n async <TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties?: TEvent['properties']\n ) => {\n try {\n if (uuid && !window.strapi.telemetryDisabled) {\n const res = await axios.post<string>(\n `${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`,\n {\n event,\n userId,\n eventProperties: { ...properties },\n userProperties: {},\n groupProperties: {\n ...telemetryProperties,\n projectId: uuid,\n projectType: window.strapi.projectType,\n },\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n }\n );\n\n return res;\n }\n } catch (err) {\n // Silence is golden\n }\n\n return null;\n },\n [telemetryProperties, userId, uuid]\n );\n\n return { trackUsage };\n};\n\nexport { TrackingProvider, useTracking };\n"],"names":["TrackingContext","React","createContext","uuid","TrackingProvider","children","token","useAuth","state","data","initData","useInitQuery","getAllWidgets","useStrapiApp","widgets","getAll","useTelemetryPropertiesQuery","undefined","skip","useEffect","event","fetch","process","env","STRAPI_ANALYTICS_URL","method","body","JSON","stringify","userId","eventPropeties","groupProperties","projectId","registeredWidgets","map","widget","uid","headers","value","useMemo","telemetryProperties","_jsx","Provider","useTracking","useContext","useAppInfo","trackUsage","useCallback","properties","window","strapi","telemetryDisabled","res","axios","post","eventProperties","userProperties","projectType","err"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Tracking.mjs","sources":["../../../../../admin/src/features/Tracking.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport axios, { AxiosResponse } from 'axios';\n\nimport { Tours } from '../components/GuidedTour/Tours';\nimport { useInitQuery, useTelemetryPropertiesQuery } from '../services/admin';\n\nimport { useAppInfo } from './AppInfo';\nimport { useAuth } from './Auth';\nimport { useStrapiApp } from './StrapiApp';\n\nexport interface TelemetryProperties {\n useTypescriptOnServer?: boolean;\n useTypescriptOnAdmin?: boolean;\n isHostedOnStrapiCloud?: boolean;\n numberOfAllContentTypes?: number;\n numberOfComponents?: number;\n numberOfDynamicZones?: number;\n}\n\nexport interface TrackingContextValue {\n uuid?: string | boolean;\n telemetryProperties?: TelemetryProperties;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nconst TrackingContext = React.createContext<TrackingContextValue>({\n uuid: false,\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface TrackingProviderProps {\n children: React.ReactNode;\n}\n\nconst TrackingProvider = ({ children }: TrackingProviderProps) => {\n const token = useAuth('App', (state) => state.token);\n const { data: initData } = useInitQuery();\n const { uuid } = initData ?? {};\n const getAllWidgets = useStrapiApp('TrackingProvider', (state) => state.widgets.getAll);\n\n const { data } = useTelemetryPropertiesQuery(undefined, {\n skip: !initData?.uuid || !token,\n });\n React.useEffect(() => {\n if (uuid && data) {\n const event = 'didInitializeAdministration';\n try {\n fetch(`${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`, {\n method: 'POST',\n body: JSON.stringify({\n // This event is anonymous\n event,\n userId: '',\n eventPropeties: {},\n groupProperties: {\n ...data,\n projectId: uuid,\n registeredWidgets: getAllWidgets().map((widget) => widget.uid),\n },\n }),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n });\n } catch {\n // silence is golden\n }\n }\n }, [data, uuid, getAllWidgets]);\n const value = React.useMemo(\n () => ({\n uuid,\n telemetryProperties: data,\n }),\n [uuid, data]\n );\n\n return <TrackingContext.Provider value={value}>{children}</TrackingContext.Provider>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * We can group these events together because none have properties so there's no benefit\n * to having them as separate types.\n *\n * Meanwhile those with properties have different property shapes corresponding to the specific\n * event so understanding which properties go with which event is very helpful.\n */\nexport interface EventWithoutProperties {\n name:\n | 'changeComponentsOrder'\n | 'didAddComponentToDynamicZone'\n | 'didBulkDeleteEntries'\n | 'didNotBulkDeleteEntries'\n | 'didChangeDisplayedFields'\n | 'didCheckDraftRelations'\n | 'didClickGuidedTourHomepageApiTokens'\n | 'didClickGuidedTourHomepageContentManager'\n | 'didClickGuidedTourHomepageContentTypeBuilder'\n | 'didClickGuidedTourStep1CollectionType'\n | 'didClickGuidedTourStep2ContentManager'\n | 'didClickGuidedTourStep3ApiTokens'\n | 'didClickonBlogSection'\n | 'didClickonCodeExampleSection'\n | 'didClickonReadTheDocumentationSection'\n | 'didClickOnTryStrapiCloudSection'\n | 'didClickonTutorialSection'\n | 'didCreateGuidedTourCollectionType'\n | 'didCreateGuidedTourEntry'\n | 'didCreateNewRole'\n | 'didCreateRole'\n | 'didDeleteToken'\n | 'didDuplicateRole'\n | 'didEditEditSettings'\n | 'didEditEmailTemplates'\n | 'didEditFieldNameOnContentType'\n | 'didEditListSettings'\n | 'didEditMediaLibraryConfig'\n | 'didEditNameOfContentType'\n | 'didGenerateGuidedTourApiTokens'\n | 'didGoToMarketplace'\n | 'didLaunchGuidedtour'\n | 'didMissMarketplacePlugin'\n | 'didNotCreateFirstAdmin'\n | 'didNotSaveComponent'\n | 'didPluginLearnMore'\n | 'didBulkPublishEntries'\n | 'didNotBulkPublishEntries'\n | 'didUnpublishEntry'\n | 'didBulkUnpublishEntries'\n | 'didNotBulkUnpublishEntries'\n | 'didSaveComponent'\n | 'didSaveContentType'\n | 'didSearch'\n | 'didSkipGuidedtour'\n | 'didSubmitPlugin'\n | 'didSubmitProvider'\n | 'didUpdateConditions'\n | 'didSelectAllMediaLibraryElements'\n | 'didSelectContentTypeFieldSettings'\n | 'didSelectContentTypeSettings'\n | 'didEditAuthenticationProvider'\n | 'didRestoreHistoryVersion'\n | 'hasClickedCTBAddFieldBanner'\n | 'removeComponentFromDynamicZone'\n | 'willAddMoreFieldToContentType'\n | 'willBulkDeleteEntries'\n | 'willBulkPublishEntries'\n | 'willBulkUnpublishEntries'\n | 'willChangeNumberOfEntriesPerPage'\n | 'willCheckDraftRelations'\n | 'willCreateComponent'\n | 'willCreateComponentFromAttributesModal'\n | 'willCreateContentType'\n | 'willCreateFirstAdmin'\n | 'willCreateNewRole'\n | 'willCreateRole'\n | 'willCreateSingleType'\n | 'willCreateStage'\n | 'willCreateWorkflow'\n | 'willDeleteEntryFromList'\n | 'willDeleteFieldOfContentType'\n | 'willDuplicateRole'\n | 'willEditEditLayout'\n | 'willEditEmailTemplates'\n | 'willEditEntryFromButton'\n | 'willEditEntryFromList'\n | 'willEditReleaseFromHome'\n | 'willEditFieldOfContentType'\n | 'willEditMediaLibraryConfig'\n | 'willEditNameOfContentType'\n | 'willEditNameOfSingleType'\n | 'willEditAuthenticationProvider'\n | 'willEditFieldNameOnContentType'\n | 'willEditStage'\n | 'willFilterEntries'\n | 'willInstallPlugin'\n | 'willOpenAuditLogDetailsFromHome'\n | 'willUnpublishEntry'\n | 'willSaveComponent'\n | 'willSaveContentType'\n | 'willSaveContentTypeLayout'\n | 'didEditFieldNameOnContentType'\n | 'didCreateRelease'\n | 'didLaunchGuidedtour';\n properties?: never;\n}\n\ninterface DidAccessAuthenticatedAdministrationEvent {\n name: 'didAccessAuthenticatedAdministration';\n properties: {\n registeredWidgets: string[];\n projectId: string;\n };\n}\n\ninterface DidFilterMediaLibraryElementsEvent {\n name: 'didFilterMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n filter: string;\n };\n}\n\ninterface DidSortMediaLibraryElementsEvent {\n name: 'didSortMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n sort: string;\n };\n}\n\ninterface DidCropFileEvent {\n name: 'didCropFile';\n properties: MediaEvents['properties'] & {\n duplicatedFile: null | boolean;\n };\n}\n\ninterface DidSelectFile {\n name: 'didSelectFile';\n properties: MediaEvents['properties'] & {\n source: 'url' | 'computer';\n };\n}\n\ninterface DidEditMediaLibraryElementsEvent {\n name: 'didEditMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n type: string;\n changeLocation: string | boolean;\n };\n}\n\ninterface MediaEvents {\n name:\n | 'didSearchMediaLibraryElements'\n | 'didReplaceMedia'\n | 'didAddMediaLibraryFolders'\n | 'willAddMediaLibraryAssets';\n properties: {\n location: string;\n };\n}\n\ninterface DidSelectContentTypeFieldTypeEvent {\n name: 'didSelectContentTypeFieldType';\n properties: {\n type?: string;\n };\n}\n\ninterface DidChangeModeEvent {\n name: 'didChangeMode';\n properties: {\n newMode: string;\n };\n}\ninterface DidSubmitWithErrorsFirstAdminEvent {\n name: 'didSubmitWithErrorsFirstAdmin';\n properties: {\n count: string;\n };\n}\n\ninterface WillNavigateEvent {\n name: 'willNavigate';\n properties: {\n from: string;\n to: string;\n };\n}\n\ninterface DidAccessTokenListEvent {\n name: 'didAccessTokenList';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n number: number;\n };\n}\ninterface LogoEvent {\n name: 'didChangeLogo' | 'didClickResetLogo';\n properties: {\n logo: 'menu' | 'auth';\n };\n}\n\ninterface TokenEvents {\n name:\n | 'didCopyTokenKey'\n | 'didAddTokenFromList'\n | 'didEditTokenFromList'\n | 'willAccessTokenList'\n | 'willAddTokenFromList'\n | 'willCreateToken'\n | 'willDeleteToken'\n | 'willEditToken'\n | 'willEditTokenFromList';\n properties: {\n tokenType: 'api-token' | 'transfer-token';\n };\n}\n\ninterface WillModifyTokenEvent {\n name: 'didCreateToken' | 'didEditToken';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n type: 'custom' | 'full-access' | 'read-only' | Array<'push' | 'pull' | 'push-pull'>;\n };\n}\n\ninterface DeleteEntryEvents {\n name: 'willDeleteEntry' | 'didDeleteEntry' | 'didNotDeleteEntry';\n properties: {\n status?: string;\n error?: unknown;\n };\n}\n\ninterface CreateEntryEvents {\n name: 'willCreateEntry' | 'didCreateEntry' | 'didNotCreateEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface PublishEntryEvents {\n name: 'willPublishEntry' | 'didPublishEntry';\n properties: {\n documentId?: string;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface UpdateEntryEvents {\n name: 'willEditEntry' | 'didEditEntry' | 'didNotEditEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface DidFilterEntriesEvent {\n name: 'didFilterEntries';\n properties: {\n useRelation: boolean;\n };\n}\n\ninterface DidPublishRelease {\n name: 'didPublishRelease';\n properties: {\n totalEntries: number;\n totalPublishedEntries: number;\n totalUnpublishedEntries: number;\n };\n}\n\ninterface DidUpdateCTBSchema {\n name: 'didUpdateCTBSchema';\n properties: {\n success: boolean;\n newContentTypes: number;\n editedContentTypes: number;\n deletedContentTypes: number;\n newComponents: number;\n editedComponents: number;\n deletedComponents: number;\n newFields: number;\n editedFields: number;\n deletedFields: number;\n };\n}\n\ninterface DidSkipGuidedTour {\n name: 'didSkipGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidCompleteGuidedTour {\n name: 'didCompleteGuidedTour';\n properties: {\n name: keyof Tours;\n };\n}\n\ninterface DidStartGuidedTour {\n name: 'didStartGuidedTourFromHomepage';\n properties: {\n name: keyof Tours;\n };\n}\n\ninterface WillEditEntryFromHome {\n name: 'willEditEntryFromHome';\n properties: {\n entryType: 'edited' | 'published' | 'assigned';\n };\n}\n\ninterface DidOpenHomeWidgetLink {\n name: 'didOpenHomeWidgetLink';\n properties: {\n widgetUID: string;\n };\n}\n\ninterface DidOpenKeyStatisticsWidgetLink {\n name: 'didOpenKeyStatisticsWidgetLink';\n properties: {\n itemKey: string;\n };\n}\n\ntype EventsWithProperties =\n | CreateEntryEvents\n | PublishEntryEvents\n | DidAccessAuthenticatedAdministrationEvent\n | DidAccessTokenListEvent\n | DidChangeModeEvent\n | DidCropFileEvent\n | DeleteEntryEvents\n | DidEditMediaLibraryElementsEvent\n | DidFilterMediaLibraryElementsEvent\n | DidFilterEntriesEvent\n | DidSelectContentTypeFieldTypeEvent\n | DidSelectFile\n | DidSortMediaLibraryElementsEvent\n | DidSubmitWithErrorsFirstAdminEvent\n | LogoEvent\n | TokenEvents\n | UpdateEntryEvents\n | WillModifyTokenEvent\n | WillNavigateEvent\n | DidPublishRelease\n | MediaEvents\n | DidUpdateCTBSchema\n | DidSkipGuidedTour\n | DidCompleteGuidedTour\n | DidStartGuidedTour\n | DidOpenHomeWidgetLink\n | DidOpenKeyStatisticsWidgetLink\n | WillEditEntryFromHome;\n\nexport type TrackingEvent = EventWithoutProperties | EventsWithProperties;\nexport interface UseTrackingReturn {\n /**\n * This type helps show all the available event names before you start typing,\n * however autocomplete isn't great.\n */\n trackUsage<TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n trackUsage<TEvent extends Extract<TrackingEvent, { properties?: never }>>(\n event: TEvent['name'],\n properties?: never\n ): Promise<null | AxiosResponse<string>>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n trackUsage<TEvent extends Extract<TrackingEvent, { properties: object }>>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n}\n\n/**\n * @description Used to send amplitude events to the Strapi Tracking hub.\n *\n * @example\n * ```tsx\n * import { useTracking } from '@strapi/strapi/admin';\n *\n * const MyComponent = () => {\n * const { trackUsage } = useTracking();\n *\n * const handleClick = () => {\n * trackUsage('my-event', { myProperty: 'myValue' });\n * }\n *\n * return <button onClick={handleClick}>Send Event</button>\n * }\n * ```\n */\nconst useTracking = (): UseTrackingReturn => {\n const { uuid, telemetryProperties } = React.useContext(TrackingContext);\n const userId = useAppInfo('useTracking', (state) => state.userId);\n const trackUsage = React.useCallback(\n async <TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties?: TEvent['properties']\n ) => {\n try {\n if (uuid && !window.strapi.telemetryDisabled) {\n const res = await axios.post<string>(\n `${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`,\n {\n event,\n userId,\n eventProperties: { ...properties },\n userProperties: {},\n groupProperties: {\n ...telemetryProperties,\n projectId: uuid,\n projectType: window.strapi.projectType,\n },\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n }\n );\n\n return res;\n }\n } catch (err) {\n // Silence is golden\n }\n\n return null;\n },\n [telemetryProperties, userId, uuid]\n );\n\n return { trackUsage };\n};\n\nexport { TrackingProvider, useTracking };\n"],"names":["TrackingContext","React","createContext","uuid","TrackingProvider","children","token","useAuth","state","data","initData","useInitQuery","getAllWidgets","useStrapiApp","widgets","getAll","useTelemetryPropertiesQuery","undefined","skip","useEffect","event","fetch","process","env","STRAPI_ANALYTICS_URL","method","body","JSON","stringify","userId","eventPropeties","groupProperties","projectId","registeredWidgets","map","widget","uid","headers","value","useMemo","telemetryProperties","_jsx","Provider","useTracking","useContext","useAppInfo","trackUsage","useCallback","properties","window","strapi","telemetryDisabled","res","axios","post","eventProperties","userProperties","projectType","err"],"mappings":"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"}
1
+ {"version":3,"file":"Tracking.mjs","sources":["../../../../../admin/src/features/Tracking.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport axios, { AxiosResponse } from 'axios';\n\nimport { Tours } from '../components/GuidedTour/Tours';\nimport { useInitQuery, useTelemetryPropertiesQuery } from '../services/admin';\n\nimport { useAppInfo } from './AppInfo';\nimport { useAuth } from './Auth';\nimport { useStrapiApp } from './StrapiApp';\n\nexport interface TelemetryProperties {\n useTypescriptOnServer?: boolean;\n useTypescriptOnAdmin?: boolean;\n isHostedOnStrapiCloud?: boolean;\n numberOfAllContentTypes?: number;\n numberOfComponents?: number;\n numberOfDynamicZones?: number;\n}\n\nexport interface TrackingContextValue {\n uuid?: string | boolean;\n telemetryProperties?: TelemetryProperties;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nconst TrackingContext = React.createContext<TrackingContextValue>({\n uuid: false,\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface TrackingProviderProps {\n children: React.ReactNode;\n}\n\nconst TrackingProvider = ({ children }: TrackingProviderProps) => {\n const token = useAuth('App', (state) => state.token);\n const { data: initData } = useInitQuery();\n const { uuid } = initData ?? {};\n const getAllWidgets = useStrapiApp('TrackingProvider', (state) => state.widgets.getAll);\n\n const { data } = useTelemetryPropertiesQuery(undefined, {\n skip: !initData?.uuid || !token,\n });\n React.useEffect(() => {\n if (uuid && data) {\n const event = 'didInitializeAdministration';\n try {\n fetch(`${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`, {\n method: 'POST',\n body: JSON.stringify({\n // This event is anonymous\n event,\n userId: '',\n eventPropeties: {},\n groupProperties: {\n ...data,\n projectId: uuid,\n registeredWidgets: getAllWidgets().map((widget) => widget.uid),\n },\n }),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n });\n } catch {\n // silence is golden\n }\n }\n }, [data, uuid, getAllWidgets]);\n const value = React.useMemo(\n () => ({\n uuid,\n telemetryProperties: data,\n }),\n [uuid, data]\n );\n\n return <TrackingContext.Provider value={value}>{children}</TrackingContext.Provider>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * We can group these events together because none have properties so there's no benefit\n * to having them as separate types.\n *\n * Meanwhile those with properties have different property shapes corresponding to the specific\n * event so understanding which properties go with which event is very helpful.\n */\nexport interface EventWithoutProperties {\n name:\n | 'changeComponentsOrder'\n | 'didAddComponentToDynamicZone'\n | 'didBulkDeleteEntries'\n | 'didNotBulkDeleteEntries'\n | 'didChangeDisplayedFields'\n | 'didCheckDraftRelations'\n | 'didClickGuidedTourHomepageApiTokens'\n | 'didClickGuidedTourHomepageContentManager'\n | 'didClickGuidedTourHomepageContentTypeBuilder'\n | 'didClickGuidedTourStep1CollectionType'\n | 'didClickGuidedTourStep2ContentManager'\n | 'didClickGuidedTourStep3ApiTokens'\n | 'didClickonBlogSection'\n | 'didClickonCodeExampleSection'\n | 'didClickonReadTheDocumentationSection'\n | 'didClickOnTryStrapiCloudSection'\n | 'didClickonTutorialSection'\n | 'didCreateGuidedTourCollectionType'\n | 'didCreateGuidedTourEntry'\n | 'didCreateNewRole'\n | 'didCreateRole'\n | 'didDeleteToken'\n | 'didDuplicateRole'\n | 'didEditEditSettings'\n | 'didEditEmailTemplates'\n | 'didEditFieldNameOnContentType'\n | 'didEditListSettings'\n | 'didEditMediaLibraryConfig'\n | 'didEditNameOfContentType'\n | 'didGenerateGuidedTourApiTokens'\n | 'didGoToMarketplace'\n | 'didLaunchGuidedtour'\n | 'didMissMarketplacePlugin'\n | 'didNotCreateFirstAdmin'\n | 'didNotSaveComponent'\n | 'didPluginLearnMore'\n | 'didBulkPublishEntries'\n | 'didNotBulkPublishEntries'\n | 'didUnpublishEntry'\n | 'didBulkUnpublishEntries'\n | 'didNotBulkUnpublishEntries'\n | 'didSaveComponent'\n | 'didSaveContentType'\n | 'didSearch'\n | 'didSkipGuidedtour'\n | 'didSubmitPlugin'\n | 'didSubmitProvider'\n | 'didUpdateConditions'\n | 'didSelectAllMediaLibraryElements'\n | 'didSelectContentTypeFieldSettings'\n | 'didSelectContentTypeSettings'\n | 'didEditAuthenticationProvider'\n | 'didRestoreHistoryVersion'\n | 'hasClickedCTBAddFieldBanner'\n | 'removeComponentFromDynamicZone'\n | 'willAddMoreFieldToContentType'\n | 'willBulkDeleteEntries'\n | 'willBulkPublishEntries'\n | 'willBulkUnpublishEntries'\n | 'willChangeNumberOfEntriesPerPage'\n | 'willCheckDraftRelations'\n | 'willCreateComponent'\n | 'willCreateComponentFromAttributesModal'\n | 'willCreateContentType'\n | 'willCreateFirstAdmin'\n | 'willCreateNewRole'\n | 'willCreateRole'\n | 'willCreateSingleType'\n | 'willCreateStage'\n | 'willCreateWorkflow'\n | 'willDeleteEntryFromList'\n | 'willDeleteFieldOfContentType'\n | 'willDuplicateRole'\n | 'willEditEditLayout'\n | 'willEditEmailTemplates'\n | 'willEditEntryFromButton'\n | 'willEditEntryFromList'\n | 'willEditReleaseFromHome'\n | 'willEditFieldOfContentType'\n | 'willEditMediaLibraryConfig'\n | 'willEditNameOfContentType'\n | 'willEditNameOfSingleType'\n | 'willEditAuthenticationProvider'\n | 'willEditFieldNameOnContentType'\n | 'willEditStage'\n | 'willFilterEntries'\n | 'willInstallPlugin'\n | 'willOpenAuditLogDetailsFromHome'\n | 'willUnpublishEntry'\n | 'willSaveComponent'\n | 'willSaveContentType'\n | 'willSaveContentTypeLayout'\n | 'didEditFieldNameOnContentType'\n | 'didCreateRelease'\n | 'didLaunchGuidedtour';\n properties?: never;\n}\n\ninterface DidAccessAuthenticatedAdministrationEvent {\n name: 'didAccessAuthenticatedAdministration';\n properties: {\n registeredWidgets: string[];\n projectId: string;\n };\n}\n\ninterface DidFilterMediaLibraryElementsEvent {\n name: 'didFilterMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n filter: string;\n };\n}\n\ninterface DidSortMediaLibraryElementsEvent {\n name: 'didSortMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n sort: string;\n };\n}\n\ninterface DidCropFileEvent {\n name: 'didCropFile';\n properties: MediaEvents['properties'] & {\n duplicatedFile: null | boolean;\n };\n}\n\ninterface DidSelectFile {\n name: 'didSelectFile';\n properties: MediaEvents['properties'] & {\n source: 'url' | 'computer';\n };\n}\n\ninterface DidEditMediaLibraryElementsEvent {\n name: 'didEditMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n type: string;\n changeLocation: string | boolean;\n };\n}\n\ninterface MediaEvents {\n name:\n | 'didSearchMediaLibraryElements'\n | 'didReplaceMedia'\n | 'didAddMediaLibraryFolders'\n | 'willAddMediaLibraryAssets';\n properties: {\n location: string;\n };\n}\n\ninterface DidSelectContentTypeFieldTypeEvent {\n name: 'didSelectContentTypeFieldType';\n properties: {\n type?: string;\n };\n}\n\ninterface DidChangeModeEvent {\n name: 'didChangeMode';\n properties: {\n newMode: string;\n };\n}\ninterface DidSubmitWithErrorsFirstAdminEvent {\n name: 'didSubmitWithErrorsFirstAdmin';\n properties: {\n count: string;\n };\n}\n\ninterface WillNavigateEvent {\n name: 'willNavigate';\n properties: {\n from: string;\n to: string;\n };\n}\n\ninterface DidAccessTokenListEvent {\n name: 'didAccessTokenList';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n number: number;\n };\n}\ninterface LogoEvent {\n name: 'didChangeLogo' | 'didClickResetLogo';\n properties: {\n logo: 'menu' | 'auth';\n };\n}\n\ninterface TokenEvents {\n name:\n | 'didCopyTokenKey'\n | 'didAddTokenFromList'\n | 'didEditTokenFromList'\n | 'willAccessTokenList'\n | 'willAddTokenFromList'\n | 'willCreateToken'\n | 'willDeleteToken'\n | 'willEditToken'\n | 'willEditTokenFromList';\n properties: {\n tokenType: 'api-token' | 'transfer-token';\n };\n}\n\ninterface WillModifyTokenEvent {\n name: 'didCreateToken' | 'didEditToken';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n type: 'custom' | 'full-access' | 'read-only' | Array<'push' | 'pull' | 'push-pull'>;\n };\n}\n\ninterface DeleteEntryEvents {\n name: 'willDeleteEntry' | 'didDeleteEntry' | 'didNotDeleteEntry';\n properties: {\n status?: string;\n error?: unknown;\n };\n}\n\ninterface CreateEntryEvents {\n name: 'willCreateEntry' | 'didCreateEntry' | 'didNotCreateEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface PublishEntryEvents {\n name: 'willPublishEntry' | 'didPublishEntry';\n properties: {\n documentId?: string;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface UpdateEntryEvents {\n name: 'willEditEntry' | 'didEditEntry' | 'didNotEditEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface DidFilterEntriesEvent {\n name: 'didFilterEntries';\n properties: {\n useRelation: boolean;\n };\n}\n\ninterface DidPublishRelease {\n name: 'didPublishRelease';\n properties: {\n totalEntries: number;\n totalPublishedEntries: number;\n totalUnpublishedEntries: number;\n };\n}\n\ninterface DidUpdateCTBSchema {\n name: 'didUpdateCTBSchema';\n properties: {\n success: boolean;\n newContentTypes: number;\n editedContentTypes: number;\n deletedContentTypes: number;\n newComponents: number;\n editedComponents: number;\n deletedComponents: number;\n newFields: number;\n editedFields: number;\n deletedFields: number;\n };\n}\n\ninterface DidSkipGuidedTour {\n name: 'didSkipGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidCompleteGuidedTour {\n name: 'didCompleteGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidStartGuidedTour {\n name: 'didStartGuidedTour';\n properties: {\n name: keyof Tours;\n fromHomepage?: boolean;\n };\n}\n\ninterface WillEditEntryFromHome {\n name: 'willEditEntryFromHome';\n properties: {\n entryType: 'edited' | 'published' | 'assigned';\n };\n}\n\ninterface DidOpenHomeWidgetLink {\n name: 'didOpenHomeWidgetLink';\n properties: {\n widgetUID: string;\n };\n}\n\ninterface DidOpenKeyStatisticsWidgetLink {\n name: 'didOpenKeyStatisticsWidgetLink';\n properties: {\n itemKey: string;\n };\n}\n\ntype EventsWithProperties =\n | CreateEntryEvents\n | PublishEntryEvents\n | DidAccessAuthenticatedAdministrationEvent\n | DidAccessTokenListEvent\n | DidChangeModeEvent\n | DidCropFileEvent\n | DeleteEntryEvents\n | DidEditMediaLibraryElementsEvent\n | DidFilterMediaLibraryElementsEvent\n | DidFilterEntriesEvent\n | DidSelectContentTypeFieldTypeEvent\n | DidSelectFile\n | DidSortMediaLibraryElementsEvent\n | DidSubmitWithErrorsFirstAdminEvent\n | LogoEvent\n | TokenEvents\n | UpdateEntryEvents\n | WillModifyTokenEvent\n | WillNavigateEvent\n | DidPublishRelease\n | MediaEvents\n | DidUpdateCTBSchema\n | DidSkipGuidedTour\n | DidCompleteGuidedTour\n | DidStartGuidedTour\n | DidOpenHomeWidgetLink\n | DidOpenKeyStatisticsWidgetLink\n | WillEditEntryFromHome;\n\nexport type TrackingEvent = EventWithoutProperties | EventsWithProperties;\nexport interface UseTrackingReturn {\n /**\n * This type helps show all the available event names before you start typing,\n * however autocomplete isn't great.\n */\n trackUsage<TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n trackUsage<TEvent extends Extract<TrackingEvent, { properties?: never }>>(\n event: TEvent['name'],\n properties?: never\n ): Promise<null | AxiosResponse<string>>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n trackUsage<TEvent extends Extract<TrackingEvent, { properties: object }>>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n}\n\n/**\n * @description Used to send amplitude events to the Strapi Tracking hub.\n *\n * @example\n * ```tsx\n * import { useTracking } from '@strapi/strapi/admin';\n *\n * const MyComponent = () => {\n * const { trackUsage } = useTracking();\n *\n * const handleClick = () => {\n * trackUsage('my-event', { myProperty: 'myValue' });\n * }\n *\n * return <button onClick={handleClick}>Send Event</button>\n * }\n * ```\n */\nconst useTracking = (): UseTrackingReturn => {\n const { uuid, telemetryProperties } = React.useContext(TrackingContext);\n const userId = useAppInfo('useTracking', (state) => state.userId);\n const trackUsage = React.useCallback(\n async <TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties?: TEvent['properties']\n ) => {\n try {\n if (uuid && !window.strapi.telemetryDisabled) {\n const res = await axios.post<string>(\n `${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`,\n {\n event,\n userId,\n eventProperties: { ...properties },\n userProperties: {},\n groupProperties: {\n ...telemetryProperties,\n projectId: uuid,\n projectType: window.strapi.projectType,\n },\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n }\n );\n\n return res;\n }\n } catch (err) {\n // Silence is golden\n }\n\n return null;\n },\n [telemetryProperties, userId, uuid]\n );\n\n return { trackUsage };\n};\n\nexport { TrackingProvider, useTracking };\n"],"names":["TrackingContext","React","createContext","uuid","TrackingProvider","children","token","useAuth","state","data","initData","useInitQuery","getAllWidgets","useStrapiApp","widgets","getAll","useTelemetryPropertiesQuery","undefined","skip","useEffect","event","fetch","process","env","STRAPI_ANALYTICS_URL","method","body","JSON","stringify","userId","eventPropeties","groupProperties","projectId","registeredWidgets","map","widget","uid","headers","value","useMemo","telemetryProperties","_jsx","Provider","useTracking","useContext","useAppInfo","trackUsage","useCallback","properties","window","strapi","telemetryDisabled","res","axios","post","eventProperties","userProperties","projectType","err"],"mappings":"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"}
@@ -881,6 +881,7 @@ var en = {
881
881
  "tours.profile.description": "You can reset the guided tour at any time.",
882
882
  "tours.profile.reset": "Reset guided tour",
883
883
  "tours.profile.notification.success.reset": "Guided tour reset",
884
+ "tours.overview.completed": "{completed}% completed",
884
885
  "widget.key-statistics.title": "Project statistics",
885
886
  "widget.key-statistics.list.admins": "Admins",
886
887
  "widget.key-statistics.list.apiTokens": "API Tokens",
@@ -1 +1 @@
1
- {"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -877,6 +877,7 @@ var en = {
877
877
  "tours.profile.description": "You can reset the guided tour at any time.",
878
878
  "tours.profile.reset": "Reset guided tour",
879
879
  "tours.profile.notification.success.reset": "Guided tour reset",
880
+ "tours.overview.completed": "{completed}% completed",
880
881
  "widget.key-statistics.title": "Project statistics",
881
882
  "widget.key-statistics.list.admins": "Admins",
882
883
  "widget.key-statistics.list.apiTokens": "API Tokens",
@@ -1 +1 @@
1
- {"version":3,"file":"en.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"en.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -48,10 +48,11 @@ declare const useGuidedTour: <Selected, ShouldThrow extends boolean = true>(cons
48
48
  state: State;
49
49
  dispatch: React.Dispatch<Action>;
50
50
  }) => Selected, shouldThrowOnMissingContext?: ShouldThrow | undefined) => ShouldThrow extends true ? Selected : Selected | undefined;
51
+ declare const getCompletedTours: (tours: TourState) => ValidTourName[];
51
52
  declare function reducer(state: State, action: Action): State;
52
53
  declare const GuidedTourContext: ({ children, enabled, }: {
53
54
  children: React.ReactNode;
54
55
  enabled?: boolean;
55
56
  }) => import("react/jsx-runtime").JSX.Element;
56
57
  export type { Action, State, ValidTourName };
57
- export { GuidedTourContext, useGuidedTour, reducer };
58
+ export { GuidedTourContext, useGuidedTour, reducer, getCompletedTours };
@@ -196,13 +196,14 @@ interface DidSkipGuidedTour {
196
196
  interface DidCompleteGuidedTour {
197
197
  name: 'didCompleteGuidedTour';
198
198
  properties: {
199
- name: keyof Tours;
199
+ name: keyof Tours | 'all';
200
200
  };
201
201
  }
202
202
  interface DidStartGuidedTour {
203
- name: 'didStartGuidedTourFromHomepage';
203
+ name: 'didStartGuidedTour';
204
204
  properties: {
205
205
  name: keyof Tours;
206
+ fromHomepage?: boolean;
206
207
  };
207
208
  }
208
209
  interface WillEditEntryFromHome {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/admin",
3
- "version": "5.23.0",
3
+ "version": "5.23.1",
4
4
  "description": "Strapi Admin",
5
5
  "repository": {
6
6
  "type": "git",
@@ -86,10 +86,10 @@
86
86
  "@reduxjs/toolkit": "1.9.7",
87
87
  "@strapi/design-system": "2.0.0-rc.29",
88
88
  "@strapi/icons": "2.0.0-rc.29",
89
- "@strapi/permissions": "5.23.0",
90
- "@strapi/types": "5.23.0",
91
- "@strapi/typescript-utils": "5.23.0",
92
- "@strapi/utils": "5.23.0",
89
+ "@strapi/permissions": "5.23.1",
90
+ "@strapi/types": "5.23.1",
91
+ "@strapi/typescript-utils": "5.23.1",
92
+ "@strapi/utils": "5.23.1",
93
93
  "@testing-library/dom": "10.1.0",
94
94
  "@testing-library/react": "15.0.7",
95
95
  "@testing-library/user-event": "14.5.2",
@@ -143,8 +143,8 @@
143
143
  "zod": "3.25.67"
144
144
  },
145
145
  "devDependencies": {
146
- "@strapi/admin-test-utils": "5.23.0",
147
- "@strapi/data-transfer": "5.23.0",
146
+ "@strapi/admin-test-utils": "5.23.1",
147
+ "@strapi/data-transfer": "5.23.1",
148
148
  "@types/codemirror5": "npm:@types/codemirror@^5.60.15",
149
149
  "@types/fs-extra": "11.0.4",
150
150
  "@types/invariant": "2.2.36",