@react-opener/core 0.0.1-alpha.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.
- package/dist/Renderer.d.ts +4 -0
- package/dist/core/store.d.ts +7 -0
- package/dist/core/types.d.ts +37 -0
- package/dist/core/util.d.ts +2 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +307 -0
- package/dist/openerStore.d.ts +32 -0
- package/dist/useOpener.d.ts +27 -0
- package/esm/Renderer.mjs +33 -0
- package/esm/_virtual/_rollupPluginBabelHelpers.mjs +98 -0
- package/esm/core/store.mjs +40 -0
- package/esm/core/util.mjs +109 -0
- package/esm/index.mjs +10 -0
- package/esm/openerStore.mjs +16 -0
- package/esm/useOpener.mjs +23 -0
- package/package.json +53 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { StoreState, StoreApi } from "./types";
|
|
2
|
+
export declare function createStore<ItemState extends Record<string, any> = {}, AdditionalState extends Record<string, any> = {}>(createState?: (setState: StoreApi<StoreState<ItemState> & AdditionalState>["setState"], defaultState: StoreState<ItemState>) => StoreState<ItemState> & AdditionalState): {
|
|
3
|
+
setState: (partial: (StoreState<ItemState> & AdditionalState) | Partial<StoreState<ItemState> & AdditionalState> | ((state: StoreState<ItemState> & AdditionalState) => (StoreState<ItemState> & AdditionalState) | Partial<StoreState<ItemState> & AdditionalState>)) => void;
|
|
4
|
+
getState: () => StoreState<ItemState> & AdditionalState;
|
|
5
|
+
subscribe: (listener: (state: StoreState<ItemState> & AdditionalState, prevState: StoreState<ItemState> & AdditionalState) => void) => () => void;
|
|
6
|
+
getInitialState: () => StoreState<ItemState> & AdditionalState;
|
|
7
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
type ItemElement<T> = (params: {
|
|
2
|
+
close: () => void;
|
|
3
|
+
unmount: () => void;
|
|
4
|
+
} & Omit<ItemType<T>, "element">) => React.ReactNode;
|
|
5
|
+
type OpenAsyncItemElement<T, P> = (params: {
|
|
6
|
+
close: (params: P) => void;
|
|
7
|
+
unmount: (params: P) => void;
|
|
8
|
+
} & Omit<ItemType<T>, "element">) => React.ReactNode;
|
|
9
|
+
export type ItemType<T> = {
|
|
10
|
+
id: string;
|
|
11
|
+
isOpen: boolean;
|
|
12
|
+
element: ItemElement<T>;
|
|
13
|
+
state: T;
|
|
14
|
+
};
|
|
15
|
+
export type StoreState<ItemState extends Record<string, any> = {}> = {
|
|
16
|
+
items: ItemType<ItemState>[];
|
|
17
|
+
open: (element: (Partial<Pick<ItemType<ItemState>, "id" | "isOpen">> & {
|
|
18
|
+
element: ItemElement<ItemState>;
|
|
19
|
+
}) | ItemElement<ItemState>, state?: ItemState) => {
|
|
20
|
+
close: () => void;
|
|
21
|
+
id: string;
|
|
22
|
+
};
|
|
23
|
+
openAsync: <Params>(element: (Partial<Pick<ItemType<ItemState>, "id" | "isOpen">> & {
|
|
24
|
+
element: OpenAsyncItemElement<ItemState, Params>;
|
|
25
|
+
}) | OpenAsyncItemElement<ItemState, Params>, state?: ItemState) => Promise<Params>;
|
|
26
|
+
close: (id: string) => void;
|
|
27
|
+
closeAll: () => void;
|
|
28
|
+
unmount: (id: string) => void;
|
|
29
|
+
unmountAll: () => void;
|
|
30
|
+
};
|
|
31
|
+
export interface StoreApi<T> {
|
|
32
|
+
setState: (partial: T | Partial<T> | ((state: T) => T | Partial<T>)) => void;
|
|
33
|
+
getState: () => T;
|
|
34
|
+
subscribe: (listener: (state: T, prevState: T) => void) => () => void;
|
|
35
|
+
getInitialState: () => T;
|
|
36
|
+
}
|
|
37
|
+
export {};
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createOpenerStore } from "./openerStore";
|
|
2
|
+
import { ReactOpener as _ReactOpener } from "./Renderer";
|
|
3
|
+
import { useOpener } from "./useOpener";
|
|
4
|
+
type CompoundedComponent = typeof _ReactOpener & {
|
|
5
|
+
createStore: typeof createOpenerStore;
|
|
6
|
+
useOpener: typeof useOpener;
|
|
7
|
+
};
|
|
8
|
+
declare const ReactOpener: CompoundedComponent;
|
|
9
|
+
export { ReactOpener };
|
|
10
|
+
export { createStore } from "./core/store";
|
|
11
|
+
export type { ItemType, StoreState, StoreApi } from "./core/types";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
|
|
6
|
+
function _arrayLikeToArray(r, a) {
|
|
7
|
+
(null == a || a > r.length) && (a = r.length);
|
|
8
|
+
for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
|
|
9
|
+
return n;
|
|
10
|
+
}
|
|
11
|
+
function _arrayWithoutHoles(r) {
|
|
12
|
+
if (Array.isArray(r)) return _arrayLikeToArray(r);
|
|
13
|
+
}
|
|
14
|
+
function _defineProperty(e, r, t) {
|
|
15
|
+
return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
|
|
16
|
+
value: t,
|
|
17
|
+
enumerable: true,
|
|
18
|
+
configurable: true,
|
|
19
|
+
writable: true
|
|
20
|
+
}) : e[r] = t, e;
|
|
21
|
+
}
|
|
22
|
+
function _iterableToArray(r) {
|
|
23
|
+
if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r);
|
|
24
|
+
}
|
|
25
|
+
function _nonIterableSpread() {
|
|
26
|
+
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
27
|
+
}
|
|
28
|
+
function ownKeys(e, r) {
|
|
29
|
+
var t = Object.keys(e);
|
|
30
|
+
if (Object.getOwnPropertySymbols) {
|
|
31
|
+
var o = Object.getOwnPropertySymbols(e);
|
|
32
|
+
r && (o = o.filter(function (r) {
|
|
33
|
+
return Object.getOwnPropertyDescriptor(e, r).enumerable;
|
|
34
|
+
})), t.push.apply(t, o);
|
|
35
|
+
}
|
|
36
|
+
return t;
|
|
37
|
+
}
|
|
38
|
+
function _objectSpread2(e) {
|
|
39
|
+
for (var r = 1; r < arguments.length; r++) {
|
|
40
|
+
var t = null != arguments[r] ? arguments[r] : {};
|
|
41
|
+
r % 2 ? ownKeys(Object(t), true).forEach(function (r) {
|
|
42
|
+
_defineProperty(e, r, t[r]);
|
|
43
|
+
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {
|
|
44
|
+
Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
return e;
|
|
48
|
+
}
|
|
49
|
+
function _objectWithoutProperties(e, t) {
|
|
50
|
+
if (null == e) return {};
|
|
51
|
+
var o,
|
|
52
|
+
r,
|
|
53
|
+
i = _objectWithoutPropertiesLoose(e, t);
|
|
54
|
+
if (Object.getOwnPropertySymbols) {
|
|
55
|
+
var n = Object.getOwnPropertySymbols(e);
|
|
56
|
+
for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]);
|
|
57
|
+
}
|
|
58
|
+
return i;
|
|
59
|
+
}
|
|
60
|
+
function _objectWithoutPropertiesLoose(r, e) {
|
|
61
|
+
if (null == r) return {};
|
|
62
|
+
var t = {};
|
|
63
|
+
for (var n in r) if ({}.hasOwnProperty.call(r, n)) {
|
|
64
|
+
if (-1 !== e.indexOf(n)) continue;
|
|
65
|
+
t[n] = r[n];
|
|
66
|
+
}
|
|
67
|
+
return t;
|
|
68
|
+
}
|
|
69
|
+
function _toConsumableArray(r) {
|
|
70
|
+
return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();
|
|
71
|
+
}
|
|
72
|
+
function _toPrimitive(t, r) {
|
|
73
|
+
if ("object" != typeof t || !t) return t;
|
|
74
|
+
var e = t[Symbol.toPrimitive];
|
|
75
|
+
if (void 0 !== e) {
|
|
76
|
+
var i = e.call(t, r);
|
|
77
|
+
if ("object" != typeof i) return i;
|
|
78
|
+
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
79
|
+
}
|
|
80
|
+
return ("string" === r ? String : Number)(t);
|
|
81
|
+
}
|
|
82
|
+
function _toPropertyKey(t) {
|
|
83
|
+
var i = _toPrimitive(t, "string");
|
|
84
|
+
return "symbol" == typeof i ? i : i + "";
|
|
85
|
+
}
|
|
86
|
+
function _typeof(o) {
|
|
87
|
+
"@babel/helpers - typeof";
|
|
88
|
+
|
|
89
|
+
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
|
|
90
|
+
return typeof o;
|
|
91
|
+
} : function (o) {
|
|
92
|
+
return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
|
|
93
|
+
}, _typeof(o);
|
|
94
|
+
}
|
|
95
|
+
function _unsupportedIterableToArray(r, a) {
|
|
96
|
+
if (r) {
|
|
97
|
+
if ("string" == typeof r) return _arrayLikeToArray(r, a);
|
|
98
|
+
var t = {}.toString.call(r).slice(8, -1);
|
|
99
|
+
return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
var _excluded = ["close", "unmount"];
|
|
104
|
+
var genId = function () {
|
|
105
|
+
var count = 0;
|
|
106
|
+
return function () {
|
|
107
|
+
return (++count).toString();
|
|
108
|
+
};
|
|
109
|
+
}();
|
|
110
|
+
var createItem = function createItem(params, state) {
|
|
111
|
+
if (_typeof(params) === "object") {
|
|
112
|
+
var _params$id, _params$isOpen;
|
|
113
|
+
return _objectSpread2(_objectSpread2({}, params), {}, {
|
|
114
|
+
id: (_params$id = params.id) !== null && _params$id !== void 0 ? _params$id : genId(),
|
|
115
|
+
isOpen: (_params$isOpen = params.isOpen) !== null && _params$isOpen !== void 0 ? _params$isOpen : true,
|
|
116
|
+
state: state
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
element: params,
|
|
121
|
+
id: genId(),
|
|
122
|
+
isOpen: true,
|
|
123
|
+
state: state
|
|
124
|
+
};
|
|
125
|
+
};
|
|
126
|
+
var generateDefaultState = function generateDefaultState(set) {
|
|
127
|
+
var updateItems = function updateItems(updater) {
|
|
128
|
+
set(function (state) {
|
|
129
|
+
return {
|
|
130
|
+
items: updater(state.items)
|
|
131
|
+
};
|
|
132
|
+
});
|
|
133
|
+
};
|
|
134
|
+
var closeItem = function closeItem(id) {
|
|
135
|
+
return updateItems(function (items) {
|
|
136
|
+
return items.map(function (item) {
|
|
137
|
+
return item.id === id ? _objectSpread2(_objectSpread2({}, item), {}, {
|
|
138
|
+
isOpen: false
|
|
139
|
+
}) : item;
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
};
|
|
143
|
+
var unmountItem = function unmountItem(id) {
|
|
144
|
+
return updateItems(function (items) {
|
|
145
|
+
return items.filter(function (item) {
|
|
146
|
+
return item.id !== id;
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
};
|
|
150
|
+
var open = function open(params, state) {
|
|
151
|
+
var item = createItem(params, state);
|
|
152
|
+
updateItems(function (items) {
|
|
153
|
+
return [].concat(_toConsumableArray(items), [item]);
|
|
154
|
+
});
|
|
155
|
+
return {
|
|
156
|
+
close: function close() {
|
|
157
|
+
return closeItem(item.id);
|
|
158
|
+
},
|
|
159
|
+
id: item.id
|
|
160
|
+
};
|
|
161
|
+
};
|
|
162
|
+
var openAsync = function openAsync(params, state) {
|
|
163
|
+
return new Promise(function (resolve) {
|
|
164
|
+
var item = createItem(params, state);
|
|
165
|
+
updateItems(function (items) {
|
|
166
|
+
return [].concat(_toConsumableArray(items), [_objectSpread2(_objectSpread2({}, item), {}, {
|
|
167
|
+
element: function element(_ref) {
|
|
168
|
+
var _close = _ref.close,
|
|
169
|
+
_unmount = _ref.unmount,
|
|
170
|
+
rest = _objectWithoutProperties(_ref, _excluded);
|
|
171
|
+
return item.element(_objectSpread2(_objectSpread2({}, rest), {}, {
|
|
172
|
+
close: function close(params) {
|
|
173
|
+
resolve(params);
|
|
174
|
+
_close();
|
|
175
|
+
},
|
|
176
|
+
unmount: function unmount(params) {
|
|
177
|
+
resolve(params);
|
|
178
|
+
_unmount();
|
|
179
|
+
}
|
|
180
|
+
}));
|
|
181
|
+
}
|
|
182
|
+
})]);
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
};
|
|
186
|
+
return {
|
|
187
|
+
items: [],
|
|
188
|
+
open: open,
|
|
189
|
+
openAsync: openAsync,
|
|
190
|
+
close: closeItem,
|
|
191
|
+
closeAll: function closeAll() {
|
|
192
|
+
return updateItems(function (items) {
|
|
193
|
+
return items.map(function (item) {
|
|
194
|
+
return _objectSpread2(_objectSpread2({}, item), {}, {
|
|
195
|
+
isOpen: false
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
},
|
|
200
|
+
unmount: unmountItem,
|
|
201
|
+
unmountAll: function unmountAll() {
|
|
202
|
+
return set({
|
|
203
|
+
items: []
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
function createStore(createState) {
|
|
210
|
+
var state;
|
|
211
|
+
var listeners = new Set();
|
|
212
|
+
var setState = function setState(partial) {
|
|
213
|
+
var nextState = typeof partial === "function" ? partial(state) : partial;
|
|
214
|
+
if (!Object.is(nextState, state)) {
|
|
215
|
+
var previousState = state;
|
|
216
|
+
state = _typeof(nextState) !== "object" || nextState === null ? nextState : Object.assign({}, state, nextState);
|
|
217
|
+
listeners.forEach(function (listener) {
|
|
218
|
+
return listener(state, previousState);
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
var getState = function getState() {
|
|
223
|
+
return state;
|
|
224
|
+
};
|
|
225
|
+
var subscribe = function subscribe(listener) {
|
|
226
|
+
listeners.add(listener);
|
|
227
|
+
return function () {
|
|
228
|
+
return listeners["delete"](listener);
|
|
229
|
+
};
|
|
230
|
+
};
|
|
231
|
+
var getInitialState = function getInitialState() {
|
|
232
|
+
return initialState;
|
|
233
|
+
};
|
|
234
|
+
var api = {
|
|
235
|
+
setState: setState,
|
|
236
|
+
getState: getState,
|
|
237
|
+
subscribe: subscribe,
|
|
238
|
+
getInitialState: getInitialState
|
|
239
|
+
};
|
|
240
|
+
var defaultState = generateDefaultState(setState);
|
|
241
|
+
var initialState = state = createState ? createState(setState, defaultState) : defaultState;
|
|
242
|
+
return api;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
var createOpenerStore = function createOpenerStore() {
|
|
246
|
+
var store = createStore();
|
|
247
|
+
return _objectSpread2(_objectSpread2({}, store), {}, {
|
|
248
|
+
open: store.getState().open,
|
|
249
|
+
openAsync: store.getState().openAsync,
|
|
250
|
+
close: store.getState().close,
|
|
251
|
+
closeAll: store.getState().closeAll,
|
|
252
|
+
unmount: store.getState().unmount,
|
|
253
|
+
unmountAll: store.getState().unmountAll
|
|
254
|
+
});
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
var ReactOpener$1 = function ReactOpener(_ref) {
|
|
258
|
+
var store = _ref.store;
|
|
259
|
+
var _useSyncExternalStore = react.useSyncExternalStore(store.subscribe, store.getState, store.getInitialState),
|
|
260
|
+
items = _useSyncExternalStore.items,
|
|
261
|
+
_close = _useSyncExternalStore.close,
|
|
262
|
+
_unmount = _useSyncExternalStore.unmount,
|
|
263
|
+
unmountAll = _useSyncExternalStore.unmountAll;
|
|
264
|
+
react.useEffect(function () {
|
|
265
|
+
return function () {
|
|
266
|
+
unmountAll();
|
|
267
|
+
};
|
|
268
|
+
}, []);
|
|
269
|
+
return /*#__PURE__*/jsxRuntime.jsx(jsxRuntime.Fragment, {
|
|
270
|
+
children: items.map(function (item) {
|
|
271
|
+
return /*#__PURE__*/jsxRuntime.jsx(react.Fragment, {
|
|
272
|
+
children: typeof item.element === "function" ? item.element(_objectSpread2(_objectSpread2({}, item), {}, {
|
|
273
|
+
close: function close() {
|
|
274
|
+
return _close(item.id);
|
|
275
|
+
},
|
|
276
|
+
unmount: function unmount() {
|
|
277
|
+
return _unmount(item.id);
|
|
278
|
+
}
|
|
279
|
+
})) : item.element
|
|
280
|
+
}, item.id);
|
|
281
|
+
})
|
|
282
|
+
});
|
|
283
|
+
};
|
|
284
|
+
|
|
285
|
+
function useOpener() {
|
|
286
|
+
var ref = react.useRef();
|
|
287
|
+
if (!ref.current) {
|
|
288
|
+
ref.current = createOpenerStore();
|
|
289
|
+
}
|
|
290
|
+
return [{
|
|
291
|
+
open: ref.current.getState().open,
|
|
292
|
+
openAsync: ref.current.getState().openAsync,
|
|
293
|
+
close: ref.current.getState().close,
|
|
294
|
+
closeAll: ref.current.getState().closeAll,
|
|
295
|
+
unmount: ref.current.getState().unmount,
|
|
296
|
+
unmountAll: ref.current.getState().unmountAll
|
|
297
|
+
}, /*#__PURE__*/jsxRuntime.jsx(ReactOpener$1, {
|
|
298
|
+
store: ref.current
|
|
299
|
+
})];
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
var ReactOpener = ReactOpener$1;
|
|
303
|
+
ReactOpener.createStore = createOpenerStore;
|
|
304
|
+
ReactOpener.useOpener = useOpener;
|
|
305
|
+
|
|
306
|
+
exports.ReactOpener = ReactOpener;
|
|
307
|
+
exports.createStore = createStore;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { StoreState } from "./core/types";
|
|
2
|
+
export declare const createOpenerStore: () => {
|
|
3
|
+
open: (element: ((params: {
|
|
4
|
+
close: () => void;
|
|
5
|
+
unmount: () => void;
|
|
6
|
+
} & Omit<import("./core/types").ItemType<StoreState>, "element">) => React.ReactNode) | (Partial<Pick<import("./core/types").ItemType<StoreState>, "id" | "isOpen">> & {
|
|
7
|
+
element: (params: {
|
|
8
|
+
close: () => void;
|
|
9
|
+
unmount: () => void;
|
|
10
|
+
} & Omit<import("./core/types").ItemType<StoreState>, "element">) => React.ReactNode;
|
|
11
|
+
}), state?: StoreState | undefined) => {
|
|
12
|
+
close: () => void;
|
|
13
|
+
id: string;
|
|
14
|
+
};
|
|
15
|
+
openAsync: <Params>(element: ((params: {
|
|
16
|
+
close: (params: Params) => void;
|
|
17
|
+
unmount: (params: Params) => void;
|
|
18
|
+
} & Omit<import("./core/types").ItemType<StoreState>, "element">) => React.ReactNode) | (Partial<Pick<import("./core/types").ItemType<StoreState>, "id" | "isOpen">> & {
|
|
19
|
+
element: (params: {
|
|
20
|
+
close: (params: Params) => void;
|
|
21
|
+
unmount: (params: Params) => void;
|
|
22
|
+
} & Omit<import("./core/types").ItemType<StoreState>, "element">) => React.ReactNode;
|
|
23
|
+
}), state?: StoreState | undefined) => Promise<Params>;
|
|
24
|
+
close: (id: string) => void;
|
|
25
|
+
closeAll: () => void;
|
|
26
|
+
unmount: (id: string) => void;
|
|
27
|
+
unmountAll: () => void;
|
|
28
|
+
setState: (partial: StoreState<StoreState> | Partial<StoreState<StoreState>> | ((state: StoreState<StoreState>) => StoreState<StoreState> | Partial<StoreState<StoreState>>)) => void;
|
|
29
|
+
getState: () => StoreState<StoreState>;
|
|
30
|
+
subscribe: (listener: (state: StoreState<StoreState>, prevState: StoreState<StoreState>) => void) => () => void;
|
|
31
|
+
getInitialState: () => StoreState<StoreState>;
|
|
32
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export declare function useOpener(): readonly [{
|
|
2
|
+
readonly open: (element: ((params: {
|
|
3
|
+
close: () => void;
|
|
4
|
+
unmount: () => void;
|
|
5
|
+
} & Omit<import(".").ItemType<import(".").StoreState>, "element">) => React.ReactNode) | (Partial<Pick<import(".").ItemType<import(".").StoreState>, "id" | "isOpen">> & {
|
|
6
|
+
element: (params: {
|
|
7
|
+
close: () => void;
|
|
8
|
+
unmount: () => void;
|
|
9
|
+
} & Omit<import(".").ItemType<import(".").StoreState>, "element">) => React.ReactNode;
|
|
10
|
+
}), state?: import(".").StoreState | undefined) => {
|
|
11
|
+
close: () => void;
|
|
12
|
+
id: string;
|
|
13
|
+
};
|
|
14
|
+
readonly openAsync: <Params>(element: ((params: {
|
|
15
|
+
close: (params: Params) => void;
|
|
16
|
+
unmount: (params: Params) => void;
|
|
17
|
+
} & Omit<import(".").ItemType<import(".").StoreState>, "element">) => React.ReactNode) | (Partial<Pick<import(".").ItemType<import(".").StoreState>, "id" | "isOpen">> & {
|
|
18
|
+
element: (params: {
|
|
19
|
+
close: (params: Params) => void;
|
|
20
|
+
unmount: (params: Params) => void;
|
|
21
|
+
} & Omit<import(".").ItemType<import(".").StoreState>, "element">) => React.ReactNode;
|
|
22
|
+
}), state?: import(".").StoreState | undefined) => Promise<Params>;
|
|
23
|
+
readonly close: (id: string) => void;
|
|
24
|
+
readonly closeAll: () => void;
|
|
25
|
+
readonly unmount: (id: string) => void;
|
|
26
|
+
readonly unmountAll: () => void;
|
|
27
|
+
}, import("react/jsx-runtime").JSX.Element];
|
package/esm/Renderer.mjs
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { objectSpread2 as _objectSpread2 } from './_virtual/_rollupPluginBabelHelpers.mjs';
|
|
2
|
+
import { useSyncExternalStore, useEffect, Fragment as Fragment$1 } from 'react';
|
|
3
|
+
import { jsx, Fragment } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
var ReactOpener = function ReactOpener(_ref) {
|
|
6
|
+
var store = _ref.store;
|
|
7
|
+
var _useSyncExternalStore = useSyncExternalStore(store.subscribe, store.getState, store.getInitialState),
|
|
8
|
+
items = _useSyncExternalStore.items,
|
|
9
|
+
_close = _useSyncExternalStore.close,
|
|
10
|
+
_unmount = _useSyncExternalStore.unmount,
|
|
11
|
+
unmountAll = _useSyncExternalStore.unmountAll;
|
|
12
|
+
useEffect(function () {
|
|
13
|
+
return function () {
|
|
14
|
+
unmountAll();
|
|
15
|
+
};
|
|
16
|
+
}, []);
|
|
17
|
+
return /*#__PURE__*/jsx(Fragment, {
|
|
18
|
+
children: items.map(function (item) {
|
|
19
|
+
return /*#__PURE__*/jsx(Fragment$1, {
|
|
20
|
+
children: typeof item.element === "function" ? item.element(_objectSpread2(_objectSpread2({}, item), {}, {
|
|
21
|
+
close: function close() {
|
|
22
|
+
return _close(item.id);
|
|
23
|
+
},
|
|
24
|
+
unmount: function unmount() {
|
|
25
|
+
return _unmount(item.id);
|
|
26
|
+
}
|
|
27
|
+
})) : item.element
|
|
28
|
+
}, item.id);
|
|
29
|
+
})
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export { ReactOpener };
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
function _arrayLikeToArray(r, a) {
|
|
2
|
+
(null == a || a > r.length) && (a = r.length);
|
|
3
|
+
for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
|
|
4
|
+
return n;
|
|
5
|
+
}
|
|
6
|
+
function _arrayWithoutHoles(r) {
|
|
7
|
+
if (Array.isArray(r)) return _arrayLikeToArray(r);
|
|
8
|
+
}
|
|
9
|
+
function _defineProperty(e, r, t) {
|
|
10
|
+
return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
|
|
11
|
+
value: t,
|
|
12
|
+
enumerable: true,
|
|
13
|
+
configurable: true,
|
|
14
|
+
writable: true
|
|
15
|
+
}) : e[r] = t, e;
|
|
16
|
+
}
|
|
17
|
+
function _iterableToArray(r) {
|
|
18
|
+
if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r);
|
|
19
|
+
}
|
|
20
|
+
function _nonIterableSpread() {
|
|
21
|
+
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
22
|
+
}
|
|
23
|
+
function ownKeys(e, r) {
|
|
24
|
+
var t = Object.keys(e);
|
|
25
|
+
if (Object.getOwnPropertySymbols) {
|
|
26
|
+
var o = Object.getOwnPropertySymbols(e);
|
|
27
|
+
r && (o = o.filter(function (r) {
|
|
28
|
+
return Object.getOwnPropertyDescriptor(e, r).enumerable;
|
|
29
|
+
})), t.push.apply(t, o);
|
|
30
|
+
}
|
|
31
|
+
return t;
|
|
32
|
+
}
|
|
33
|
+
function _objectSpread2(e) {
|
|
34
|
+
for (var r = 1; r < arguments.length; r++) {
|
|
35
|
+
var t = null != arguments[r] ? arguments[r] : {};
|
|
36
|
+
r % 2 ? ownKeys(Object(t), true).forEach(function (r) {
|
|
37
|
+
_defineProperty(e, r, t[r]);
|
|
38
|
+
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {
|
|
39
|
+
Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return e;
|
|
43
|
+
}
|
|
44
|
+
function _objectWithoutProperties(e, t) {
|
|
45
|
+
if (null == e) return {};
|
|
46
|
+
var o,
|
|
47
|
+
r,
|
|
48
|
+
i = _objectWithoutPropertiesLoose(e, t);
|
|
49
|
+
if (Object.getOwnPropertySymbols) {
|
|
50
|
+
var n = Object.getOwnPropertySymbols(e);
|
|
51
|
+
for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]);
|
|
52
|
+
}
|
|
53
|
+
return i;
|
|
54
|
+
}
|
|
55
|
+
function _objectWithoutPropertiesLoose(r, e) {
|
|
56
|
+
if (null == r) return {};
|
|
57
|
+
var t = {};
|
|
58
|
+
for (var n in r) if ({}.hasOwnProperty.call(r, n)) {
|
|
59
|
+
if (-1 !== e.indexOf(n)) continue;
|
|
60
|
+
t[n] = r[n];
|
|
61
|
+
}
|
|
62
|
+
return t;
|
|
63
|
+
}
|
|
64
|
+
function _toConsumableArray(r) {
|
|
65
|
+
return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();
|
|
66
|
+
}
|
|
67
|
+
function _toPrimitive(t, r) {
|
|
68
|
+
if ("object" != typeof t || !t) return t;
|
|
69
|
+
var e = t[Symbol.toPrimitive];
|
|
70
|
+
if (void 0 !== e) {
|
|
71
|
+
var i = e.call(t, r);
|
|
72
|
+
if ("object" != typeof i) return i;
|
|
73
|
+
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
74
|
+
}
|
|
75
|
+
return ("string" === r ? String : Number)(t);
|
|
76
|
+
}
|
|
77
|
+
function _toPropertyKey(t) {
|
|
78
|
+
var i = _toPrimitive(t, "string");
|
|
79
|
+
return "symbol" == typeof i ? i : i + "";
|
|
80
|
+
}
|
|
81
|
+
function _typeof(o) {
|
|
82
|
+
"@babel/helpers - typeof";
|
|
83
|
+
|
|
84
|
+
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
|
|
85
|
+
return typeof o;
|
|
86
|
+
} : function (o) {
|
|
87
|
+
return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
|
|
88
|
+
}, _typeof(o);
|
|
89
|
+
}
|
|
90
|
+
function _unsupportedIterableToArray(r, a) {
|
|
91
|
+
if (r) {
|
|
92
|
+
if ("string" == typeof r) return _arrayLikeToArray(r, a);
|
|
93
|
+
var t = {}.toString.call(r).slice(8, -1);
|
|
94
|
+
return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export { _arrayLikeToArray as arrayLikeToArray, _arrayWithoutHoles as arrayWithoutHoles, _defineProperty as defineProperty, _iterableToArray as iterableToArray, _nonIterableSpread as nonIterableSpread, _objectSpread2 as objectSpread2, _objectWithoutProperties as objectWithoutProperties, _objectWithoutPropertiesLoose as objectWithoutPropertiesLoose, _toConsumableArray as toConsumableArray, _toPrimitive as toPrimitive, _toPropertyKey as toPropertyKey, _typeof as typeof, _unsupportedIterableToArray as unsupportedIterableToArray };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { typeof as _typeof } from '../_virtual/_rollupPluginBabelHelpers.mjs';
|
|
2
|
+
import { generateDefaultState } from './util.mjs';
|
|
3
|
+
|
|
4
|
+
function createStore(createState) {
|
|
5
|
+
var state;
|
|
6
|
+
var listeners = new Set();
|
|
7
|
+
var setState = function setState(partial) {
|
|
8
|
+
var nextState = typeof partial === "function" ? partial(state) : partial;
|
|
9
|
+
if (!Object.is(nextState, state)) {
|
|
10
|
+
var previousState = state;
|
|
11
|
+
state = _typeof(nextState) !== "object" || nextState === null ? nextState : Object.assign({}, state, nextState);
|
|
12
|
+
listeners.forEach(function (listener) {
|
|
13
|
+
return listener(state, previousState);
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
var getState = function getState() {
|
|
18
|
+
return state;
|
|
19
|
+
};
|
|
20
|
+
var subscribe = function subscribe(listener) {
|
|
21
|
+
listeners.add(listener);
|
|
22
|
+
return function () {
|
|
23
|
+
return listeners["delete"](listener);
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
var getInitialState = function getInitialState() {
|
|
27
|
+
return initialState;
|
|
28
|
+
};
|
|
29
|
+
var api = {
|
|
30
|
+
setState: setState,
|
|
31
|
+
getState: getState,
|
|
32
|
+
subscribe: subscribe,
|
|
33
|
+
getInitialState: getInitialState
|
|
34
|
+
};
|
|
35
|
+
var defaultState = generateDefaultState(setState);
|
|
36
|
+
var initialState = state = createState ? createState(setState, defaultState) : defaultState;
|
|
37
|
+
return api;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export { createStore };
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { objectSpread2 as _objectSpread2, toConsumableArray as _toConsumableArray, objectWithoutProperties as _objectWithoutProperties, typeof as _typeof } from '../_virtual/_rollupPluginBabelHelpers.mjs';
|
|
2
|
+
|
|
3
|
+
var _excluded = ["close", "unmount"];
|
|
4
|
+
var genId = function () {
|
|
5
|
+
var count = 0;
|
|
6
|
+
return function () {
|
|
7
|
+
return (++count).toString();
|
|
8
|
+
};
|
|
9
|
+
}();
|
|
10
|
+
var createItem = function createItem(params, state) {
|
|
11
|
+
if (_typeof(params) === "object") {
|
|
12
|
+
var _params$id, _params$isOpen;
|
|
13
|
+
return _objectSpread2(_objectSpread2({}, params), {}, {
|
|
14
|
+
id: (_params$id = params.id) !== null && _params$id !== void 0 ? _params$id : genId(),
|
|
15
|
+
isOpen: (_params$isOpen = params.isOpen) !== null && _params$isOpen !== void 0 ? _params$isOpen : true,
|
|
16
|
+
state: state
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
element: params,
|
|
21
|
+
id: genId(),
|
|
22
|
+
isOpen: true,
|
|
23
|
+
state: state
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
var generateDefaultState = function generateDefaultState(set) {
|
|
27
|
+
var updateItems = function updateItems(updater) {
|
|
28
|
+
set(function (state) {
|
|
29
|
+
return {
|
|
30
|
+
items: updater(state.items)
|
|
31
|
+
};
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
var closeItem = function closeItem(id) {
|
|
35
|
+
return updateItems(function (items) {
|
|
36
|
+
return items.map(function (item) {
|
|
37
|
+
return item.id === id ? _objectSpread2(_objectSpread2({}, item), {}, {
|
|
38
|
+
isOpen: false
|
|
39
|
+
}) : item;
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
var unmountItem = function unmountItem(id) {
|
|
44
|
+
return updateItems(function (items) {
|
|
45
|
+
return items.filter(function (item) {
|
|
46
|
+
return item.id !== id;
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
var open = function open(params, state) {
|
|
51
|
+
var item = createItem(params, state);
|
|
52
|
+
updateItems(function (items) {
|
|
53
|
+
return [].concat(_toConsumableArray(items), [item]);
|
|
54
|
+
});
|
|
55
|
+
return {
|
|
56
|
+
close: function close() {
|
|
57
|
+
return closeItem(item.id);
|
|
58
|
+
},
|
|
59
|
+
id: item.id
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
var openAsync = function openAsync(params, state) {
|
|
63
|
+
return new Promise(function (resolve) {
|
|
64
|
+
var item = createItem(params, state);
|
|
65
|
+
updateItems(function (items) {
|
|
66
|
+
return [].concat(_toConsumableArray(items), [_objectSpread2(_objectSpread2({}, item), {}, {
|
|
67
|
+
element: function element(_ref) {
|
|
68
|
+
var _close = _ref.close,
|
|
69
|
+
_unmount = _ref.unmount,
|
|
70
|
+
rest = _objectWithoutProperties(_ref, _excluded);
|
|
71
|
+
return item.element(_objectSpread2(_objectSpread2({}, rest), {}, {
|
|
72
|
+
close: function close(params) {
|
|
73
|
+
resolve(params);
|
|
74
|
+
_close();
|
|
75
|
+
},
|
|
76
|
+
unmount: function unmount(params) {
|
|
77
|
+
resolve(params);
|
|
78
|
+
_unmount();
|
|
79
|
+
}
|
|
80
|
+
}));
|
|
81
|
+
}
|
|
82
|
+
})]);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
};
|
|
86
|
+
return {
|
|
87
|
+
items: [],
|
|
88
|
+
open: open,
|
|
89
|
+
openAsync: openAsync,
|
|
90
|
+
close: closeItem,
|
|
91
|
+
closeAll: function closeAll() {
|
|
92
|
+
return updateItems(function (items) {
|
|
93
|
+
return items.map(function (item) {
|
|
94
|
+
return _objectSpread2(_objectSpread2({}, item), {}, {
|
|
95
|
+
isOpen: false
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
},
|
|
100
|
+
unmount: unmountItem,
|
|
101
|
+
unmountAll: function unmountAll() {
|
|
102
|
+
return set({
|
|
103
|
+
items: []
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
export { generateDefaultState };
|
package/esm/index.mjs
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { createOpenerStore } from './openerStore.mjs';
|
|
2
|
+
import { ReactOpener as ReactOpener$1 } from './Renderer.mjs';
|
|
3
|
+
import { useOpener } from './useOpener.mjs';
|
|
4
|
+
export { createStore } from './core/store.mjs';
|
|
5
|
+
|
|
6
|
+
var ReactOpener = ReactOpener$1;
|
|
7
|
+
ReactOpener.createStore = createOpenerStore;
|
|
8
|
+
ReactOpener.useOpener = useOpener;
|
|
9
|
+
|
|
10
|
+
export { ReactOpener };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { objectSpread2 as _objectSpread2 } from './_virtual/_rollupPluginBabelHelpers.mjs';
|
|
2
|
+
import { createStore } from './core/store.mjs';
|
|
3
|
+
|
|
4
|
+
var createOpenerStore = function createOpenerStore() {
|
|
5
|
+
var store = createStore();
|
|
6
|
+
return _objectSpread2(_objectSpread2({}, store), {}, {
|
|
7
|
+
open: store.getState().open,
|
|
8
|
+
openAsync: store.getState().openAsync,
|
|
9
|
+
close: store.getState().close,
|
|
10
|
+
closeAll: store.getState().closeAll,
|
|
11
|
+
unmount: store.getState().unmount,
|
|
12
|
+
unmountAll: store.getState().unmountAll
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export { createOpenerStore };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { useRef } from 'react';
|
|
2
|
+
import { createOpenerStore } from './openerStore.mjs';
|
|
3
|
+
import { ReactOpener } from './Renderer.mjs';
|
|
4
|
+
import { jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
function useOpener() {
|
|
7
|
+
var ref = useRef();
|
|
8
|
+
if (!ref.current) {
|
|
9
|
+
ref.current = createOpenerStore();
|
|
10
|
+
}
|
|
11
|
+
return [{
|
|
12
|
+
open: ref.current.getState().open,
|
|
13
|
+
openAsync: ref.current.getState().openAsync,
|
|
14
|
+
close: ref.current.getState().close,
|
|
15
|
+
closeAll: ref.current.getState().closeAll,
|
|
16
|
+
unmount: ref.current.getState().unmount,
|
|
17
|
+
unmountAll: ref.current.getState().unmountAll
|
|
18
|
+
}, /*#__PURE__*/jsx(ReactOpener, {
|
|
19
|
+
store: ref.current
|
|
20
|
+
})];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export { useOpener };
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@react-opener/core",
|
|
3
|
+
"version": "0.0.1-alpha.1",
|
|
4
|
+
"sideEffects": false,
|
|
5
|
+
"description": "render React Component from anywhere",
|
|
6
|
+
"author": "Yunho Seo",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/yunho1017/react-opener.git"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://react-opener.vercel.app/",
|
|
13
|
+
"keywords": [
|
|
14
|
+
"react",
|
|
15
|
+
"dialog",
|
|
16
|
+
"modal"
|
|
17
|
+
],
|
|
18
|
+
"import": "./esm/index.mjs",
|
|
19
|
+
"main": "./dist/index.js",
|
|
20
|
+
"module": "./esm/index.mjs",
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"exports": {
|
|
23
|
+
"./package.json": "./package.json",
|
|
24
|
+
".": {
|
|
25
|
+
"require": "./dist/index.js",
|
|
26
|
+
"import": "./esm/index.mjs",
|
|
27
|
+
"types": "./dist/index.d.ts"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"peerDependencies": {
|
|
31
|
+
"@types/react": ">=18.0.0",
|
|
32
|
+
"react": ">=18.0.0"
|
|
33
|
+
},
|
|
34
|
+
"files": [
|
|
35
|
+
"dist",
|
|
36
|
+
"esm"
|
|
37
|
+
],
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "rm -rf dist esm && tsc -p tsconfig.json --declaration --emitDeclarationOnly --declarationDir dist && rollup -c rollup.config.js"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@babel/core": "^7.24.6",
|
|
43
|
+
"@babel/preset-env": "^7.24.6",
|
|
44
|
+
"@babel/preset-react": "^7.24.6",
|
|
45
|
+
"@babel/preset-typescript": "^7.24.6",
|
|
46
|
+
"@rollup/plugin-babel": "^6.0.4",
|
|
47
|
+
"@rollup/plugin-commonjs": "^25.0.8",
|
|
48
|
+
"@rollup/plugin-node-resolve": "^15.2.3",
|
|
49
|
+
"@types/react": "^18.3.2",
|
|
50
|
+
"rollup": "^4.18.0",
|
|
51
|
+
"typescript": "^5.4.5"
|
|
52
|
+
}
|
|
53
|
+
}
|