@buoy-gg/impersonate 1.0.3-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +58 -0
- package/lib/commonjs/impersonate/components/DataNukeSettings.js +715 -0
- package/lib/commonjs/impersonate/components/ImpersonateBanner.js +217 -0
- package/lib/commonjs/impersonate/components/ImpersonateHistoryList.js +173 -0
- package/lib/commonjs/impersonate/components/ImpersonateModal.js +304 -0
- package/lib/commonjs/impersonate/components/ImpersonateStatusBar.js +130 -0
- package/lib/commonjs/impersonate/components/UserAvatar.js +146 -0
- package/lib/commonjs/impersonate/components/UserCard.js +200 -0
- package/lib/commonjs/impersonate/components/UserSearchView.js +227 -0
- package/lib/commonjs/impersonate/components/index.js +85 -0
- package/lib/commonjs/impersonate/hooks/index.js +64 -0
- package/lib/commonjs/impersonate/hooks/useAutoClearAsyncStorage.js +144 -0
- package/lib/commonjs/impersonate/hooks/useAutoClearReactQuery.js +155 -0
- package/lib/commonjs/impersonate/hooks/useAutoClearRedux.js +188 -0
- package/lib/commonjs/impersonate/hooks/useImpersonate.js +215 -0
- package/lib/commonjs/impersonate/hooks/useImpersonateHistory.js +56 -0
- package/lib/commonjs/impersonate/index.js +49 -0
- package/lib/commonjs/impersonate/types/index.js +16 -0
- package/lib/commonjs/impersonate/types/types.js +1 -0
- package/lib/commonjs/impersonate/utils/impersonateListener.js +280 -0
- package/lib/commonjs/impersonate/utils/impersonateStore.js +607 -0
- package/lib/commonjs/impersonate/utils/index.js +49 -0
- package/lib/commonjs/index.js +118 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/preset.js +214 -0
- package/lib/module/impersonate/components/DataNukeSettings.js +710 -0
- package/lib/module/impersonate/components/ImpersonateBanner.js +211 -0
- package/lib/module/impersonate/components/ImpersonateHistoryList.js +168 -0
- package/lib/module/impersonate/components/ImpersonateModal.js +300 -0
- package/lib/module/impersonate/components/ImpersonateStatusBar.js +125 -0
- package/lib/module/impersonate/components/UserAvatar.js +140 -0
- package/lib/module/impersonate/components/UserCard.js +195 -0
- package/lib/module/impersonate/components/UserSearchView.js +222 -0
- package/lib/module/impersonate/components/index.js +11 -0
- package/lib/module/impersonate/hooks/index.js +7 -0
- package/lib/module/impersonate/hooks/useAutoClearAsyncStorage.js +140 -0
- package/lib/module/impersonate/hooks/useAutoClearReactQuery.js +151 -0
- package/lib/module/impersonate/hooks/useAutoClearRedux.js +183 -0
- package/lib/module/impersonate/hooks/useImpersonate.js +212 -0
- package/lib/module/impersonate/hooks/useImpersonateHistory.js +52 -0
- package/lib/module/impersonate/index.js +13 -0
- package/lib/module/impersonate/types/index.js +3 -0
- package/lib/module/impersonate/types/types.js +1 -0
- package/lib/module/impersonate/utils/impersonateListener.js +271 -0
- package/lib/module/impersonate/utils/impersonateStore.js +604 -0
- package/lib/module/impersonate/utils/index.js +4 -0
- package/lib/module/index.js +103 -0
- package/lib/module/preset.js +209 -0
- package/lib/typescript/impersonate/components/DataNukeSettings.d.ts +37 -0
- package/lib/typescript/impersonate/components/DataNukeSettings.d.ts.map +1 -0
- package/lib/typescript/impersonate/components/ImpersonateBanner.d.ts +40 -0
- package/lib/typescript/impersonate/components/ImpersonateBanner.d.ts.map +1 -0
- package/lib/typescript/impersonate/components/ImpersonateHistoryList.d.ts +24 -0
- package/lib/typescript/impersonate/components/ImpersonateHistoryList.d.ts.map +1 -0
- package/lib/typescript/impersonate/components/ImpersonateModal.d.ts +10 -0
- package/lib/typescript/impersonate/components/ImpersonateModal.d.ts.map +1 -0
- package/lib/typescript/impersonate/components/ImpersonateStatusBar.d.ts +15 -0
- package/lib/typescript/impersonate/components/ImpersonateStatusBar.d.ts.map +1 -0
- package/lib/typescript/impersonate/components/UserAvatar.d.ts +32 -0
- package/lib/typescript/impersonate/components/UserAvatar.d.ts.map +1 -0
- package/lib/typescript/impersonate/components/UserCard.d.ts +28 -0
- package/lib/typescript/impersonate/components/UserCard.d.ts.map +1 -0
- package/lib/typescript/impersonate/components/UserSearchView.d.ts +31 -0
- package/lib/typescript/impersonate/components/UserSearchView.d.ts.map +1 -0
- package/lib/typescript/impersonate/components/index.d.ts +16 -0
- package/lib/typescript/impersonate/components/index.d.ts.map +1 -0
- package/lib/typescript/impersonate/hooks/index.d.ts +11 -0
- package/lib/typescript/impersonate/hooks/index.d.ts.map +1 -0
- package/lib/typescript/impersonate/hooks/useAutoClearAsyncStorage.d.ts +48 -0
- package/lib/typescript/impersonate/hooks/useAutoClearAsyncStorage.d.ts.map +1 -0
- package/lib/typescript/impersonate/hooks/useAutoClearReactQuery.d.ts +48 -0
- package/lib/typescript/impersonate/hooks/useAutoClearReactQuery.d.ts.map +1 -0
- package/lib/typescript/impersonate/hooks/useAutoClearRedux.d.ts +78 -0
- package/lib/typescript/impersonate/hooks/useAutoClearRedux.d.ts.map +1 -0
- package/lib/typescript/impersonate/hooks/useImpersonate.d.ts +76 -0
- package/lib/typescript/impersonate/hooks/useImpersonate.d.ts.map +1 -0
- package/lib/typescript/impersonate/hooks/useImpersonateHistory.d.ts +43 -0
- package/lib/typescript/impersonate/hooks/useImpersonateHistory.d.ts.map +1 -0
- package/lib/typescript/impersonate/index.d.ts +5 -0
- package/lib/typescript/impersonate/index.d.ts.map +1 -0
- package/lib/typescript/impersonate/types/index.d.ts +2 -0
- package/lib/typescript/impersonate/types/index.d.ts.map +1 -0
- package/lib/typescript/impersonate/types/types.d.ts +177 -0
- package/lib/typescript/impersonate/types/types.d.ts.map +1 -0
- package/lib/typescript/impersonate/utils/impersonateListener.d.ts +115 -0
- package/lib/typescript/impersonate/utils/impersonateListener.d.ts.map +1 -0
- package/lib/typescript/impersonate/utils/impersonateStore.d.ts +151 -0
- package/lib/typescript/impersonate/utils/impersonateStore.d.ts.map +1 -0
- package/lib/typescript/impersonate/utils/index.d.ts +3 -0
- package/lib/typescript/impersonate/utils/index.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +80 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/preset.d.ts +71 -0
- package/lib/typescript/preset.d.ts.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "DataNukeSettingsComponent", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _DataNukeSettings.DataNukeSettings;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "ImpersonateBanner", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () {
|
|
15
|
+
return _ImpersonateBanner.ImpersonateBanner;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
Object.defineProperty(exports, "ImpersonateBannerMinimal", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () {
|
|
21
|
+
return _ImpersonateBanner.ImpersonateBannerMinimal;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
Object.defineProperty(exports, "ImpersonateHistoryList", {
|
|
25
|
+
enumerable: true,
|
|
26
|
+
get: function () {
|
|
27
|
+
return _ImpersonateHistoryList.ImpersonateHistoryList;
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
Object.defineProperty(exports, "ImpersonateModal", {
|
|
31
|
+
enumerable: true,
|
|
32
|
+
get: function () {
|
|
33
|
+
return _ImpersonateModal.ImpersonateModal;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
Object.defineProperty(exports, "ImpersonateStatusBar", {
|
|
37
|
+
enumerable: true,
|
|
38
|
+
get: function () {
|
|
39
|
+
return _ImpersonateStatusBar.ImpersonateStatusBar;
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
Object.defineProperty(exports, "UserSearchView", {
|
|
43
|
+
enumerable: true,
|
|
44
|
+
get: function () {
|
|
45
|
+
return _UserSearchView.UserSearchView;
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
Object.defineProperty(exports, "createImpersonateTool", {
|
|
49
|
+
enumerable: true,
|
|
50
|
+
get: function () {
|
|
51
|
+
return _preset.createImpersonateTool;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
Object.defineProperty(exports, "getImpersonatedUserId", {
|
|
55
|
+
enumerable: true,
|
|
56
|
+
get: function () {
|
|
57
|
+
return _impersonateListener.getImpersonatedUserId;
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
Object.defineProperty(exports, "impersonateListener", {
|
|
61
|
+
enumerable: true,
|
|
62
|
+
get: function () {
|
|
63
|
+
return _impersonateListener.impersonateListener;
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
Object.defineProperty(exports, "impersonateStore", {
|
|
67
|
+
enumerable: true,
|
|
68
|
+
get: function () {
|
|
69
|
+
return _impersonateStore.impersonateStore;
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
Object.defineProperty(exports, "isImpersonating", {
|
|
73
|
+
enumerable: true,
|
|
74
|
+
get: function () {
|
|
75
|
+
return _impersonateListener.isImpersonating;
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
Object.defineProperty(exports, "setImpersonateConfig", {
|
|
79
|
+
enumerable: true,
|
|
80
|
+
get: function () {
|
|
81
|
+
return _impersonateListener.setImpersonateConfig;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
Object.defineProperty(exports, "startImpersonateListener", {
|
|
85
|
+
enumerable: true,
|
|
86
|
+
get: function () {
|
|
87
|
+
return _impersonateListener.startImpersonateListener;
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
Object.defineProperty(exports, "stopImpersonateListener", {
|
|
91
|
+
enumerable: true,
|
|
92
|
+
get: function () {
|
|
93
|
+
return _impersonateListener.stopImpersonateListener;
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
Object.defineProperty(exports, "useImpersonate", {
|
|
97
|
+
enumerable: true,
|
|
98
|
+
get: function () {
|
|
99
|
+
return _useImpersonate.useImpersonate;
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
Object.defineProperty(exports, "useImpersonateHistory", {
|
|
103
|
+
enumerable: true,
|
|
104
|
+
get: function () {
|
|
105
|
+
return _useImpersonateHistory.useImpersonateHistory;
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
var _preset = require("./preset");
|
|
109
|
+
var _ImpersonateModal = require("./impersonate/components/ImpersonateModal");
|
|
110
|
+
var _ImpersonateBanner = require("./impersonate/components/ImpersonateBanner");
|
|
111
|
+
var _UserSearchView = require("./impersonate/components/UserSearchView");
|
|
112
|
+
var _DataNukeSettings = require("./impersonate/components/DataNukeSettings");
|
|
113
|
+
var _ImpersonateHistoryList = require("./impersonate/components/ImpersonateHistoryList");
|
|
114
|
+
var _ImpersonateStatusBar = require("./impersonate/components/ImpersonateStatusBar");
|
|
115
|
+
var _useImpersonate = require("./impersonate/hooks/useImpersonate");
|
|
116
|
+
var _useImpersonateHistory = require("./impersonate/hooks/useImpersonateHistory");
|
|
117
|
+
var _impersonateStore = require("./impersonate/utils/impersonateStore");
|
|
118
|
+
var _impersonateListener = require("./impersonate/utils/impersonateListener");
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"commonjs"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createImpersonateTool = createImpersonateTool;
|
|
7
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
8
|
+
var _reactNative = require("react-native");
|
|
9
|
+
var _ImpersonateModal = require("./impersonate/components/ImpersonateModal");
|
|
10
|
+
var _ImpersonateBanner = require("./impersonate/components/ImpersonateBanner");
|
|
11
|
+
var _impersonateStore = require("./impersonate/utils/impersonateStore");
|
|
12
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
13
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
14
|
+
/**
|
|
15
|
+
* Impersonate Tool Preset
|
|
16
|
+
*
|
|
17
|
+
* Factory function to create a configured impersonate tool for FloatingDevTools.
|
|
18
|
+
* No default preset is exported because configuration (onSearchUsers) is required.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
// NOTE: The listener is started lazily when the modal opens (via useImpersonate hook)
|
|
22
|
+
// This ensures we patch AFTER @buoy-gg/network has patched fetch, so network
|
|
23
|
+
// can see our injected headers in its request capture.
|
|
24
|
+
|
|
25
|
+
// =============================================================================
|
|
26
|
+
// ICON COMPONENT
|
|
27
|
+
// =============================================================================
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Impersonate tool icon - a mask/person symbol
|
|
31
|
+
*/
|
|
32
|
+
function ImpersonateIcon({
|
|
33
|
+
size,
|
|
34
|
+
color = "#F59E0B"
|
|
35
|
+
}) {
|
|
36
|
+
const scale = size / 24;
|
|
37
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
38
|
+
style: [styles.iconContainer, {
|
|
39
|
+
width: size,
|
|
40
|
+
height: size
|
|
41
|
+
}],
|
|
42
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
43
|
+
style: [styles.iconText, {
|
|
44
|
+
fontSize: 14 * scale,
|
|
45
|
+
color
|
|
46
|
+
}],
|
|
47
|
+
children: "IMP"
|
|
48
|
+
})
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// =============================================================================
|
|
53
|
+
// WRAPPER COMPONENT
|
|
54
|
+
// =============================================================================
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Wrapper component that renders both the modal and the auto-banner.
|
|
58
|
+
* The banner handles its own visibility based on store state (isActive + showBanner).
|
|
59
|
+
* Clicking the banner opens the modal.
|
|
60
|
+
*/
|
|
61
|
+
function ImpersonateToolWrapper(props) {
|
|
62
|
+
const [forceOpen, setForceOpen] = (0, _react.useState)(false);
|
|
63
|
+
|
|
64
|
+
// Reset force state when parent closes the modal
|
|
65
|
+
(0, _react.useEffect)(() => {
|
|
66
|
+
if (!props.visible) {
|
|
67
|
+
setForceOpen(false);
|
|
68
|
+
}
|
|
69
|
+
}, [props.visible]);
|
|
70
|
+
const handleBannerPress = () => {
|
|
71
|
+
setForceOpen(true);
|
|
72
|
+
};
|
|
73
|
+
const handleClose = () => {
|
|
74
|
+
setForceOpen(false);
|
|
75
|
+
// Only notify parent if they had the modal open
|
|
76
|
+
if (props.visible) {
|
|
77
|
+
props.onClose();
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
81
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_ImpersonateModal.ImpersonateModal, {
|
|
82
|
+
...props,
|
|
83
|
+
visible: props.visible || forceOpen,
|
|
84
|
+
onClose: handleClose
|
|
85
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_ImpersonateBanner.ImpersonateBanner, {
|
|
86
|
+
position: "top",
|
|
87
|
+
offset: 50,
|
|
88
|
+
onPress: handleBannerPress
|
|
89
|
+
})]
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// =============================================================================
|
|
94
|
+
// FACTORY FUNCTION
|
|
95
|
+
// =============================================================================
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Create an impersonate tool with custom configuration
|
|
99
|
+
*
|
|
100
|
+
* The tool automatically displays a floating banner when impersonation is active.
|
|
101
|
+
* This can be toggled in the Settings tab or via developer defaults.
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* ```tsx
|
|
105
|
+
* import { createImpersonateTool } from '@buoy-gg/impersonate';
|
|
106
|
+
* import { queryClient } from './queryClient';
|
|
107
|
+
*
|
|
108
|
+
* const impersonateTool = createImpersonateTool({
|
|
109
|
+
* onSearchUsers: async (query) => {
|
|
110
|
+
* const response = await api.searchUsers({ email: query });
|
|
111
|
+
* return response.users.map(u => ({
|
|
112
|
+
* id: u.id,
|
|
113
|
+
* displayName: u.name,
|
|
114
|
+
* email: u.email,
|
|
115
|
+
* metadata: { role: u.role, createdAt: u.createdAt }
|
|
116
|
+
* }));
|
|
117
|
+
* },
|
|
118
|
+
* onClearReactQuery: () => queryClient.clear(),
|
|
119
|
+
* onClearRedux: () => store.dispatch({ type: 'RESET' }),
|
|
120
|
+
*
|
|
121
|
+
* // Optional: Developer defaults (override hardcoded, overridden by persisted)
|
|
122
|
+
* defaults: {
|
|
123
|
+
* headerKey: 'x-admin-impersonate',
|
|
124
|
+
* showBanner: true, // Show floating banner when impersonating
|
|
125
|
+
* dataNukeSettings: {
|
|
126
|
+
* reactQuery: true,
|
|
127
|
+
* redux: false,
|
|
128
|
+
* },
|
|
129
|
+
* },
|
|
130
|
+
*
|
|
131
|
+
* // Optional: Hide settings tab for simple testing
|
|
132
|
+
* showSettingsTab: true,
|
|
133
|
+
* });
|
|
134
|
+
*
|
|
135
|
+
* // In your app - banner is automatic, no extra setup needed!
|
|
136
|
+
* <FloatingDevTools apps={[impersonateTool]} />
|
|
137
|
+
* ```
|
|
138
|
+
*/
|
|
139
|
+
function createImpersonateTool(config) {
|
|
140
|
+
const {
|
|
141
|
+
id = "impersonate",
|
|
142
|
+
name = "IMPERSONATE",
|
|
143
|
+
description = "User impersonation for admin testing",
|
|
144
|
+
defaults,
|
|
145
|
+
showSettingsTab = true,
|
|
146
|
+
onSearchUsers,
|
|
147
|
+
onClearReactQuery,
|
|
148
|
+
onClearRedux,
|
|
149
|
+
onClearAsyncStorage,
|
|
150
|
+
onClearMMKV
|
|
151
|
+
} = config;
|
|
152
|
+
|
|
153
|
+
// Initialize store with developer defaults if provided
|
|
154
|
+
if (defaults) {
|
|
155
|
+
_impersonateStore.impersonateStore.setDeveloperDefaults(defaults);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Create the tool configuration object
|
|
159
|
+
const tool = {
|
|
160
|
+
id,
|
|
161
|
+
name,
|
|
162
|
+
description,
|
|
163
|
+
slot: "both",
|
|
164
|
+
icon: ({
|
|
165
|
+
size
|
|
166
|
+
}) => /*#__PURE__*/(0, _jsxRuntime.jsx)(ImpersonateIcon, {
|
|
167
|
+
size: size,
|
|
168
|
+
color: "#F59E0B"
|
|
169
|
+
}),
|
|
170
|
+
component: props => /*#__PURE__*/(0, _jsxRuntime.jsx)(ImpersonateToolWrapper, {
|
|
171
|
+
...props,
|
|
172
|
+
onSearchUsers: onSearchUsers,
|
|
173
|
+
onClearReactQuery: onClearReactQuery,
|
|
174
|
+
onClearRedux: onClearRedux,
|
|
175
|
+
onClearAsyncStorage: onClearAsyncStorage,
|
|
176
|
+
onClearMMKV: onClearMMKV,
|
|
177
|
+
showSettingsTab: showSettingsTab
|
|
178
|
+
}),
|
|
179
|
+
props: {
|
|
180
|
+
enableSharedModalDimensions: false
|
|
181
|
+
},
|
|
182
|
+
// Export banner component for host app to use
|
|
183
|
+
Banner: _ImpersonateBanner.ImpersonateBanner
|
|
184
|
+
};
|
|
185
|
+
return tool;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// =============================================================================
|
|
189
|
+
// STYLES
|
|
190
|
+
// =============================================================================
|
|
191
|
+
|
|
192
|
+
const styles = _reactNative.StyleSheet.create({
|
|
193
|
+
iconContainer: {
|
|
194
|
+
alignItems: "center",
|
|
195
|
+
justifyContent: "center"
|
|
196
|
+
},
|
|
197
|
+
iconText: {
|
|
198
|
+
fontWeight: "700",
|
|
199
|
+
letterSpacing: -0.5
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
// =============================================================================
|
|
204
|
+
// NOTE: No default preset export
|
|
205
|
+
// =============================================================================
|
|
206
|
+
// Unlike other tools, the impersonate tool REQUIRES configuration
|
|
207
|
+
// (specifically the onSearchUsers callback). Therefore, we don't export
|
|
208
|
+
// a default preset. Users must call createImpersonateTool() with their config.
|
|
209
|
+
//
|
|
210
|
+
// If you want a basic preset for testing without search:
|
|
211
|
+
//
|
|
212
|
+
// export const impersonateToolPresetBasic = createImpersonateTool({
|
|
213
|
+
// onSearchUsers: async () => [],
|
|
214
|
+
// });
|