pocketbase-react 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/CHANGELOG.md +3 -1
  2. package/README.md +15 -0
  3. package/dist/pocketbase-react.js +464 -0
  4. package/dist/pocketbase-react.min.js +1 -0
  5. package/{dist/esm → es}/context/Pocketbase.d.ts +1 -3
  6. package/es/context/Pocketbase.js +27 -0
  7. package/{dist/cjs → es}/context/client.d.ts +1 -1
  8. package/es/context/client.js +8 -0
  9. package/{dist/cjs → es}/context/content.d.ts +0 -0
  10. package/es/context/content.js +63 -0
  11. package/{dist/cjs → es}/context/index.d.ts +0 -0
  12. package/es/context/index.js +3 -0
  13. package/{dist/cjs → es}/hooks/index.d.ts +0 -0
  14. package/es/hooks/index.js +2 -0
  15. package/{dist/cjs → es}/hooks/useAppContent.d.ts +1 -1
  16. package/es/hooks/useAppContent.js +25 -0
  17. package/es/hooks/useClientContext.d.ts +2 -0
  18. package/es/hooks/useClientContext.js +7 -0
  19. package/{dist/cjs → es}/index.d.ts +0 -0
  20. package/{dist/esm/index.d.ts → es/index.js} +1 -1
  21. package/{dist/cjs → es}/interfaces/Record.d.ts +1 -1
  22. package/es/interfaces/Record.js +1 -0
  23. package/{dist/cjs → es}/interfaces/index.d.ts +0 -0
  24. package/es/interfaces/index.js +1 -0
  25. package/es/store/actions/index.d.ts +2 -0
  26. package/es/store/actions/index.js +2 -0
  27. package/es/store/actions/records.d.ts +9 -0
  28. package/es/store/actions/records.js +32 -0
  29. package/{dist/cjs → es}/store/index.d.ts +0 -0
  30. package/{dist/esm/store/index.d.ts → es/store/index.js} +1 -1
  31. package/{dist/cjs → es}/store/reducers/index.d.ts +2 -2
  32. package/es/store/reducers/index.js +5 -0
  33. package/{dist/cjs → es}/store/reducers/records.d.ts +2 -3
  34. package/es/store/reducers/records.js +56 -0
  35. package/{dist/cjs → es}/store/store.d.ts +0 -0
  36. package/es/store/store.js +44 -0
  37. package/{dist/cjs → es}/store/types/index.d.ts +0 -0
  38. package/es/store/types/index.js +6 -0
  39. package/lib/context/Pocketbase.js +35 -0
  40. package/lib/context/client.js +15 -0
  41. package/lib/context/content.js +70 -0
  42. package/lib/context/index.js +36 -0
  43. package/lib/hooks/index.js +25 -0
  44. package/lib/hooks/useAppContent.js +31 -0
  45. package/lib/hooks/useClientContext.js +11 -0
  46. package/lib/index.js +47 -0
  47. package/lib/interfaces/Record.js +1 -0
  48. package/lib/interfaces/index.js +14 -0
  49. package/lib/store/actions/index.js +8 -0
  50. package/lib/store/actions/records.js +43 -0
  51. package/lib/store/index.js +47 -0
  52. package/lib/store/reducers/index.js +10 -0
  53. package/lib/store/reducers/records.js +64 -0
  54. package/lib/store/store.js +53 -0
  55. package/lib/store/types/index.js +16 -0
  56. package/package.json +94 -35
  57. package/src/context/Pocketbase.tsx +42 -0
  58. package/src/context/client.tsx +14 -0
  59. package/src/context/content.tsx +88 -0
  60. package/{dist/esm/context/index.d.ts → src/context/index.ts} +0 -0
  61. package/src/hooks/index.ts +2 -0
  62. package/src/hooks/useAppContent.ts +28 -0
  63. package/src/hooks/useClientContext.ts +11 -0
  64. package/src/index.ts +4 -0
  65. package/src/interfaces/Record.ts +10 -0
  66. package/src/interfaces/index.ts +1 -0
  67. package/src/store/actions/index.tsx +3 -0
  68. package/src/store/actions/records.tsx +54 -0
  69. package/src/store/index.ts +4 -0
  70. package/src/store/reducers/index.tsx +12 -0
  71. package/src/store/reducers/records.tsx +78 -0
  72. package/src/store/store.tsx +65 -0
  73. package/src/store/types/index.ts +14 -0
  74. package/dist/cjs/EventSource.d.ts +0 -1
  75. package/dist/cjs/context/Pocketbase.d.ts +0 -15
  76. package/dist/cjs/hooks/useClientContext.d.ts +0 -2
  77. package/dist/cjs/index.js +0 -3478
  78. package/dist/cjs/index.js.map +0 -1
  79. package/dist/cjs/store/actions/index.d.ts +0 -2
  80. package/dist/cjs/store/actions/records.d.ts +0 -11
  81. package/dist/esm/EventSource.d.ts +0 -1
  82. package/dist/esm/context/client.d.ts +0 -8
  83. package/dist/esm/context/content.d.ts +0 -16
  84. package/dist/esm/hooks/index.d.ts +0 -2
  85. package/dist/esm/hooks/useAppContent.d.ts +0 -12
  86. package/dist/esm/hooks/useClientContext.d.ts +0 -2
  87. package/dist/esm/index.js +0 -3433
  88. package/dist/esm/index.js.map +0 -1
  89. package/dist/esm/interfaces/Record.d.ts +0 -10
  90. package/dist/esm/interfaces/index.d.ts +0 -1
  91. package/dist/esm/store/actions/index.d.ts +0 -2
  92. package/dist/esm/store/actions/records.d.ts +0 -11
  93. package/dist/esm/store/reducers/index.d.ts +0 -8
  94. package/dist/esm/store/reducers/records.d.ts +0 -12
  95. package/dist/esm/store/store.d.ts +0 -27
  96. package/dist/esm/store/types/index.d.ts +0 -7
  97. package/dist/index.d.ts +0 -128
package/CHANGELOG.md CHANGED
@@ -12,4 +12,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
12
12
 
13
13
  ### Changed
14
14
  - Readme Instructions and so on
15
- - initialCollections now also "subscribe" instead of just "fetch" content once
15
+ - initialCollections now also "subscribe" instead of just "fetch" content once
16
+ - Adjusted Rollup / Babel Config for use in React
17
+ - Redux now toggles between localStorage / AsyncStorage
package/README.md CHANGED
@@ -1,11 +1,14 @@
1
1
  PocketBase React SDK
2
2
  ======================================================================
3
+ [![Npm package version](https://badgen.net/npm/v/pocketbase-react)](https://npmjs.com/package/pocketbase-react)
4
+
3
5
  Unofficial React SDK (React, React Native, Expo) for interacting with the [PocketBase JS SDK](https://github.com/pocketbase/js-sdk).
4
6
 
5
7
 
6
8
  - [Installation](#installation)
7
9
  - [Usage](#usage)
8
10
  - [Caveats](#caveats)
11
+ - [Development](#development)
9
12
 
10
13
 
11
14
  ## Installation
@@ -125,3 +128,15 @@ DELETE
125
128
  const id = "SOME_ID";
126
129
  actions.delete(id);
127
130
  ```
131
+
132
+ ## Development
133
+
134
+ By using
135
+ ```sh
136
+ npm run build
137
+ # or
138
+ yarn build
139
+ ```
140
+ You will get a folder called dist, which you can use to replace node_modules/pocketbase-react/dist in your React project.
141
+
142
+ ***Maybe someone finds a better way to integrate the package in development with a project***
@@ -0,0 +1,464 @@
1
+ (function (global, factory) {
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react'), require('redux'), require('@reduxjs/toolkit'), require('redux-persist'), require('react-redux'), require('@react-native-async-storage/async-storage'), require('pocketbase')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', 'react', 'redux', '@reduxjs/toolkit', 'redux-persist', 'react-redux', '@react-native-async-storage/async-storage', 'pocketbase'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.PocketbaseReact = {}, global.React, global.redux, global.toolkit, global.reduxPersist, global.reactRedux, global.AsyncStorage, global.Pocketbase));
5
+ })(this, (function (exports, React, redux, toolkit, reduxPersist, reactRedux, AsyncStorage, PocketBase) { 'use strict';
6
+
7
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
+
9
+ function _interopNamespace(e) {
10
+ if (e && e.__esModule) return e;
11
+ var n = Object.create(null);
12
+ if (e) {
13
+ Object.keys(e).forEach(function (k) {
14
+ if (k !== 'default') {
15
+ var d = Object.getOwnPropertyDescriptor(e, k);
16
+ Object.defineProperty(n, k, d.get ? d : {
17
+ enumerable: true,
18
+ get: function () { return e[k]; }
19
+ });
20
+ }
21
+ });
22
+ }
23
+ n["default"] = e;
24
+ return Object.freeze(n);
25
+ }
26
+
27
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
28
+ var AsyncStorage__default = /*#__PURE__*/_interopDefaultLegacy(AsyncStorage);
29
+ var PocketBase__default = /*#__PURE__*/_interopDefaultLegacy(PocketBase);
30
+
31
+ const SET_RECORDS = 'SET_RECORDS';
32
+ const ADD_RECORD = 'ADD_RECORD';
33
+ const ADD_RECORDS = 'ADD_RECORDS';
34
+ const UPDATE_RECORD = 'UPDATE_RECORD';
35
+ const DELETE_RECORD = 'DELETE_RECORD';
36
+ const DELETE_RECORDS = 'DELETE_RECORDS';
37
+
38
+ const setRecords = (key, payload) => ({
39
+ type: SET_RECORDS,
40
+ key,
41
+ payload
42
+ });
43
+ const addRecord = (key, payload) => ({
44
+ type: ADD_RECORD,
45
+ key,
46
+ payload
47
+ });
48
+ const addRecords = (key, payload) => ({
49
+ type: ADD_RECORDS,
50
+ key,
51
+ payload
52
+ });
53
+ const deleteRecord$1 = (key, payload) => ({
54
+ type: DELETE_RECORD,
55
+ key,
56
+ payload
57
+ });
58
+ const deleteRecords$1 = (key, payload) => ({
59
+ type: DELETE_RECORDS,
60
+ key,
61
+ payload
62
+ });
63
+ const updateRecord$1 = (key, payload) => ({
64
+ type: UPDATE_RECORD,
65
+ key,
66
+ payload
67
+ });
68
+
69
+ var records$1 = /*#__PURE__*/Object.freeze({
70
+ __proto__: null,
71
+ setRecords: setRecords,
72
+ addRecord: addRecord,
73
+ addRecords: addRecords,
74
+ deleteRecord: deleteRecord$1,
75
+ deleteRecords: deleteRecords$1,
76
+ updateRecord: updateRecord$1
77
+ });
78
+
79
+ function _extends() {
80
+ _extends = Object.assign ? Object.assign.bind() : function (target) {
81
+ for (var i = 1; i < arguments.length; i++) {
82
+ var source = arguments[i];
83
+ for (var key in source) {
84
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
85
+ target[key] = source[key];
86
+ }
87
+ }
88
+ }
89
+ return target;
90
+ };
91
+ return _extends.apply(this, arguments);
92
+ }
93
+
94
+ function appendRecord(record, records) {
95
+ return [...records, record];
96
+ }
97
+ function appendRecords(recordsToAppend, records) {
98
+ return [...records, ...recordsToAppend];
99
+ }
100
+ function updateRecord(record, records) {
101
+ return records.map(r => {
102
+ if (r.id === record.id) {
103
+ return record;
104
+ }
105
+ return r;
106
+ });
107
+ }
108
+ function deleteRecord(record, records) {
109
+ return records.filter(r => r.id !== record.id);
110
+ }
111
+ function deleteRecords(recordsToDelete, records) {
112
+ return records.filter(r => !recordsToDelete.includes(r));
113
+ }
114
+ const records = (state = {}, action) => {
115
+ var _state$action$key;
116
+ const list = (_state$action$key = state[action.key]) != null ? _state$action$key : [];
117
+ switch (action.type) {
118
+ case SET_RECORDS:
119
+ if (Array.isArray(action.payload)) {
120
+ return _extends({}, state, {
121
+ [action.key]: action.payload
122
+ });
123
+ }
124
+ case ADD_RECORD:
125
+ return _extends({}, state, {
126
+ [action.key]: appendRecord(action.payload, list)
127
+ });
128
+ case ADD_RECORDS:
129
+ return _extends({}, state, {
130
+ [action.key]: appendRecords(action.payload, list)
131
+ });
132
+ case DELETE_RECORD:
133
+ return _extends({}, state, {
134
+ [action.key]: deleteRecord(action.payload, list)
135
+ });
136
+ case DELETE_RECORDS:
137
+ return _extends({}, state, {
138
+ [action.key]: deleteRecords(action.payload, list)
139
+ });
140
+ case UPDATE_RECORD:
141
+ return _extends({}, state, {
142
+ [action.key]: updateRecord(action.payload, list)
143
+ });
144
+ default:
145
+ return state;
146
+ }
147
+ };
148
+
149
+ const appReducer = redux.combineReducers({
150
+ records: records
151
+ });
152
+
153
+ /** A function that accepts a potential "extra argument" value to be injected later,
154
+ * and returns an instance of the thunk middleware that uses that value
155
+ */
156
+ function createThunkMiddleware(extraArgument) {
157
+ // Standard Redux middleware definition pattern:
158
+ // See: https://redux.js.org/tutorials/fundamentals/part-4-store#writing-custom-middleware
159
+ var middleware = function middleware(_ref) {
160
+ var dispatch = _ref.dispatch,
161
+ getState = _ref.getState;
162
+ return function (next) {
163
+ return function (action) {
164
+ // The thunk middleware looks for any functions that were passed to `store.dispatch`.
165
+ // If this "action" is really a function, call it and return the result.
166
+ if (typeof action === 'function') {
167
+ // Inject the store's `dispatch` and `getState` methods, as well as any "extra arg"
168
+ return action(dispatch, getState, extraArgument);
169
+ } // Otherwise, pass the action down the middleware chain as usual
170
+
171
+
172
+ return next(action);
173
+ };
174
+ };
175
+ };
176
+
177
+ return middleware;
178
+ }
179
+
180
+ var thunk = createThunkMiddleware(); // Attach the factory function so users can create a customized version
181
+ // with whatever "extra arg" they want to inject into their thunks
182
+
183
+ thunk.withExtraArgument = createThunkMiddleware;
184
+ var thunk$1 = thunk;
185
+
186
+ const CustomStorage = {
187
+ getItem: async (_key, ..._args) => {
188
+ if (typeof document !== 'undefined') {
189
+ return localStorage.getItem(_key);
190
+ } else if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {
191
+ return await AsyncStorage__default["default"].getItem(_key);
192
+ }
193
+ },
194
+ setItem: async (_key, _value, ..._args) => {
195
+ if (typeof document !== 'undefined') {
196
+ return localStorage.setItem(_key, _value);
197
+ } else if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {
198
+ return await AsyncStorage__default["default"].setItem(_key, _value);
199
+ }
200
+ },
201
+ removeItem: async (_key, ..._args) => {
202
+ if (typeof document !== 'undefined') {
203
+ return localStorage.removeItem(_key);
204
+ } else if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {
205
+ return await AsyncStorage__default["default"].removeItem(_key);
206
+ }
207
+ }
208
+ };
209
+ const persistConfig = {
210
+ key: 'root',
211
+ storage: CustomStorage
212
+ };
213
+ const reducer = toolkit.combineReducers({
214
+ reducer: reduxPersist.persistReducer(persistConfig, appReducer)
215
+ });
216
+ const store = toolkit.configureStore({
217
+ reducer,
218
+ middleware: [thunk$1]
219
+ });
220
+ const useAppDispatch = store.dispatch;
221
+ const useAppSelector = reactRedux.useSelector;
222
+ const persistor = reduxPersist.persistStore(store);
223
+
224
+ const useClientContext = () => {
225
+ const context = React.useContext(ClientContext);
226
+ return context;
227
+ };
228
+
229
+ const ContentContext = React.createContext(null);
230
+ const ContentProvider = props => {
231
+ const client = useClientContext();
232
+ const dispatch = useAppDispatch;
233
+ const [collections, _] = React__namespace.useState(props.collections || []);
234
+ const actions = {
235
+ subscribe: async collectionName => {
236
+ // save local that collectionName should be subscribed
237
+ await (client == null ? void 0 : client.realtime.subscribe(collectionName, event => {
238
+ switch (event.action) {
239
+ case 'create':
240
+ dispatch(addRecord(collectionName, event.record));
241
+ break;
242
+ case 'update':
243
+ dispatch(updateRecord$1(collectionName, event.record));
244
+ break;
245
+ case 'delete':
246
+ dispatch(deleteRecord$1(collectionName, event.record));
247
+ break;
248
+ }
249
+ }));
250
+ },
251
+ unsubscribe: collectionName => {
252
+ if (collectionName) {
253
+ client == null ? void 0 : client.realtime.unsubscribe(collectionName);
254
+ } else {
255
+ client == null ? void 0 : client.realtime.unsubscribe();
256
+ }
257
+ },
258
+ fetch: async collectionName => {
259
+ const records = await (client == null ? void 0 : client.records.getFullList(collectionName, 200));
260
+ dispatch(setRecords(collectionName, records));
261
+ },
262
+ create: async (collectionName, record) => {
263
+ await (client == null ? void 0 : client.records.create(collectionName, record));
264
+ },
265
+ update: async (collectionName, recordId, record) => {
266
+ await (client == null ? void 0 : client.records.update(collectionName, recordId, record));
267
+ },
268
+ delete: async (collectionName, recordId) => {
269
+ await (client == null ? void 0 : client.records.delete(collectionName, recordId));
270
+ }
271
+ };
272
+ React.useEffect(() => {
273
+ if (collections) {
274
+ collections.forEach(collectionName => {
275
+ actions.fetch(collectionName);
276
+ actions.subscribe(collectionName);
277
+ });
278
+ }
279
+ return () => actions.unsubscribe();
280
+ }, [collections]);
281
+ return /*#__PURE__*/React__namespace.createElement(ContentContext.Provider, {
282
+ value: actions
283
+ }, props.children);
284
+ };
285
+
286
+ const ClientContext = React.createContext(null);
287
+ const ClientProvider = props => {
288
+ return /*#__PURE__*/React__namespace.createElement(ClientContext.Provider, {
289
+ value: props.client
290
+ }, props.children);
291
+ };
292
+
293
+ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
294
+
295
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
296
+
297
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
298
+
299
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
300
+
301
+ function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
302
+
303
+ function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
304
+
305
+ function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
306
+
307
+ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
308
+
309
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
310
+
311
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
312
+
313
+ var PersistGate =
314
+ /*#__PURE__*/
315
+ function (_PureComponent) {
316
+ _inherits(PersistGate, _PureComponent);
317
+
318
+ function PersistGate() {
319
+ var _getPrototypeOf2;
320
+
321
+ var _this;
322
+
323
+ _classCallCheck(this, PersistGate);
324
+
325
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
326
+ args[_key] = arguments[_key];
327
+ }
328
+
329
+ _this = _possibleConstructorReturn(this, (_getPrototypeOf2 = _getPrototypeOf(PersistGate)).call.apply(_getPrototypeOf2, [this].concat(args)));
330
+
331
+ _defineProperty(_assertThisInitialized(_this), "state", {
332
+ bootstrapped: false
333
+ });
334
+
335
+ _defineProperty(_assertThisInitialized(_this), "_unsubscribe", void 0);
336
+
337
+ _defineProperty(_assertThisInitialized(_this), "handlePersistorState", function () {
338
+ var persistor = _this.props.persistor;
339
+
340
+ var _persistor$getState = persistor.getState(),
341
+ bootstrapped = _persistor$getState.bootstrapped;
342
+
343
+ if (bootstrapped) {
344
+ if (_this.props.onBeforeLift) {
345
+ Promise.resolve(_this.props.onBeforeLift()).finally(function () {
346
+ return _this.setState({
347
+ bootstrapped: true
348
+ });
349
+ });
350
+ } else {
351
+ _this.setState({
352
+ bootstrapped: true
353
+ });
354
+ }
355
+
356
+ _this._unsubscribe && _this._unsubscribe();
357
+ }
358
+ });
359
+
360
+ return _this;
361
+ }
362
+
363
+ _createClass(PersistGate, [{
364
+ key: "componentDidMount",
365
+ value: function componentDidMount() {
366
+ this._unsubscribe = this.props.persistor.subscribe(this.handlePersistorState);
367
+ this.handlePersistorState();
368
+ }
369
+ }, {
370
+ key: "componentWillUnmount",
371
+ value: function componentWillUnmount() {
372
+ this._unsubscribe && this._unsubscribe();
373
+ }
374
+ }, {
375
+ key: "render",
376
+ value: function render() {
377
+ {
378
+ if (typeof this.props.children === 'function' && this.props.loading) console.error('redux-persist: PersistGate expects either a function child or loading prop, but not both. The loading prop will be ignored.');
379
+ }
380
+
381
+ if (typeof this.props.children === 'function') {
382
+ return this.props.children(this.state.bootstrapped);
383
+ }
384
+
385
+ return this.state.bootstrapped ? this.props.children : this.props.loading;
386
+ }
387
+ }]);
388
+
389
+ return PersistGate;
390
+ }(React.PureComponent);
391
+
392
+ _defineProperty(PersistGate, "defaultProps", {
393
+ children: null,
394
+ loading: null
395
+ });
396
+
397
+ const PocketbaseContext = React.createContext(null);
398
+ const Pocketbase = props => {
399
+ const [client, setClient] = React__namespace.useState(null);
400
+ React.useEffect(() => {
401
+ const client = new PocketBase__default["default"](props.serverURL);
402
+ client.admins.authViaEmail(props.credentials.username, props.credentials.password).then(() => {
403
+ setClient(client);
404
+ });
405
+ }, [props.serverURL]);
406
+ return client ? /*#__PURE__*/React__namespace.createElement(ClientProvider, {
407
+ client: client
408
+ }, /*#__PURE__*/React__namespace.createElement(reactRedux.Provider, {
409
+ store: store
410
+ }, /*#__PURE__*/React__namespace.createElement(PersistGate, {
411
+ persistor: persistor
412
+ }, /*#__PURE__*/React__namespace.createElement(ContentProvider, {
413
+ collections: props.initialCollections
414
+ }, props.children)))) : null;
415
+ };
416
+
417
+ function useAppContent(collectionName, initialFetch = false) {
418
+ var _store$useAppSelector;
419
+ const records = (_store$useAppSelector = useAppSelector(state => state.reducer.records[collectionName])) != null ? _store$useAppSelector : [];
420
+ const context = React.useContext(ContentContext);
421
+ React.useEffect(() => {
422
+ if (initialFetch) {
423
+ context == null ? void 0 : context.fetch(collectionName);
424
+ }
425
+ }, [collectionName, initialFetch]);
426
+ const actions = {
427
+ subscribe: async () => await (context == null ? void 0 : context.subscribe(collectionName)),
428
+ unsubscribe: () => context == null ? void 0 : context.unsubscribe(collectionName),
429
+ refetch: async () => await (context == null ? void 0 : context.fetch(collectionName)),
430
+ create: async record => await (context == null ? void 0 : context.create(collectionName, record)),
431
+ update: async (id, record) => await (context == null ? void 0 : context.update(collectionName, id, record)),
432
+ delete: async id => await (context == null ? void 0 : context.delete(collectionName, id))
433
+ };
434
+ return {
435
+ records,
436
+ actions
437
+ };
438
+ }
439
+
440
+ exports.ADD_RECORD = ADD_RECORD;
441
+ exports.ADD_RECORDS = ADD_RECORDS;
442
+ exports.ClientContext = ClientContext;
443
+ exports.ClientProvider = ClientProvider;
444
+ exports.ContentContext = ContentContext;
445
+ exports.ContentProvider = ContentProvider;
446
+ exports.DELETE_RECORD = DELETE_RECORD;
447
+ exports.DELETE_RECORDS = DELETE_RECORDS;
448
+ exports.Pocketbase = Pocketbase;
449
+ exports.PocketbaseContext = PocketbaseContext;
450
+ exports.SET_RECORDS = SET_RECORDS;
451
+ exports.UPDATE_RECORD = UPDATE_RECORD;
452
+ exports.appReducer = appReducer;
453
+ exports.persistConfig = persistConfig;
454
+ exports.persistor = persistor;
455
+ exports.recordsAction = records$1;
456
+ exports.store = store;
457
+ exports.useAppContent = useAppContent;
458
+ exports.useAppDispatch = useAppDispatch;
459
+ exports.useAppSelector = useAppSelector;
460
+ exports.useClientContext = useClientContext;
461
+
462
+ Object.defineProperty(exports, '__esModule', { value: true });
463
+
464
+ }));
@@ -0,0 +1 @@
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react"),require("redux"),require("@reduxjs/toolkit"),require("redux-persist"),require("react-redux"),require("@react-native-async-storage/async-storage"),require("pocketbase")):"function"==typeof define&&define.amd?define(["exports","react","redux","@reduxjs/toolkit","redux-persist","react-redux","@react-native-async-storage/async-storage","pocketbase"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).PocketbaseReact={},e.React,e.redux,e.toolkit,e.reduxPersist,e.reactRedux,e.AsyncStorage,e.Pocketbase)}(this,(function(e,t,r,n,o,a,i,c){"use strict";function u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function s(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var l=s(t),d=u(i),p=u(c);const f="SET_RECORDS",y="ADD_RECORD",b="ADD_RECORDS",v="UPDATE_RECORD",h="DELETE_RECORD",m="DELETE_RECORDS",E=(e,t)=>({type:f,key:e,payload:t}),R=(e,t)=>({type:y,key:e,payload:t}),g=(e,t)=>({type:h,key:e,payload:t}),O=(e,t)=>({type:v,key:e,payload:t});var _=Object.freeze({__proto__:null,setRecords:E,addRecord:R,addRecords:(e,t)=>({type:b,key:e,payload:t}),deleteRecord:g,deleteRecords:(e,t)=>({type:m,key:e,payload:t}),updateRecord:O});function C(){return C=Object.assign?Object.assign.bind():function(e){for(var t=1;arguments.length>t;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},C.apply(this,arguments)}function S(e,t){return[...t,e]}function k(e,t){return[...t,...e]}function w(e,t){return t.map((t=>t.id===e.id?e:t))}function D(e,t){return t.filter((t=>t.id!==e.id))}function P(e,t){return t.filter((t=>!e.includes(t)))}const x=r.combineReducers({records:(e={},t)=>{var r;const n=null!=(r=e[t.key])?r:[];switch(t.type){case f:if(Array.isArray(t.payload))return C({},e,{[t.key]:t.payload});case y:return C({},e,{[t.key]:S(t.payload,n)});case b:return C({},e,{[t.key]:k(t.payload,n)});case h:return C({},e,{[t.key]:D(t.payload,n)});case m:return C({},e,{[t.key]:P(t.payload,n)});case v:return C({},e,{[t.key]:w(t.payload,n)});default:return e}}});function j(e){return function(t){var r=t.dispatch,n=t.getState;return function(t){return function(o){return"function"==typeof o?o(r,n,e):t(o)}}}}var A=j();A.withExtraArgument=j;var T=A;const I={key:"root",storage:{getItem:async(e,...t)=>"undefined"!=typeof document?localStorage.getItem(e):"undefined"!=typeof navigator&&"ReactNative"===navigator.product?await d.default.getItem(e):void 0,setItem:async(e,t,...r)=>"undefined"!=typeof document?localStorage.setItem(e,t):"undefined"!=typeof navigator&&"ReactNative"===navigator.product?await d.default.setItem(e,t):void 0,removeItem:async(e,...t)=>"undefined"!=typeof document?localStorage.removeItem(e):"undefined"!=typeof navigator&&"ReactNative"===navigator.product?await d.default.removeItem(e):void 0}},L=n.combineReducers({reducer:o.persistReducer(I,x)}),q=n.configureStore({reducer:L,middleware:[T]}),U=q.dispatch,M=a.useSelector,N=o.persistStore(q),z=()=>t.useContext(V),B=t.createContext(null),F=e=>{const r=z(),n=U,[o,a]=l.useState(e.collections||[]),i={subscribe:async e=>{await(null==r?void 0:r.realtime.subscribe(e,(t=>{switch(t.action){case"create":n(R(e,t.record));break;case"update":n(O(e,t.record));break;case"delete":n(g(e,t.record))}})))},unsubscribe:e=>{e?null==r||r.realtime.unsubscribe(e):null==r||r.realtime.unsubscribe()},fetch:async e=>{const t=await(null==r?void 0:r.records.getFullList(e,200));n(E(e,t))},create:async(e,t)=>{await(null==r?void 0:r.records.create(e,t))},update:async(e,t,n)=>{await(null==r?void 0:r.records.update(e,t,n))},delete:async(e,t)=>{await(null==r?void 0:r.records.delete(e,t))}};return t.useEffect((()=>(o&&o.forEach((e=>{i.fetch(e),i.subscribe(e)})),()=>i.unsubscribe())),[o]),l.createElement(B.Provider,{value:i},e.children)},V=t.createContext(null),W=e=>l.createElement(V.Provider,{value:e.client},e.children);function G(e){return G="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},G(e)}function H(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function J(e,t){for(var r=0;t.length>r;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function K(e,t){return!t||"object"!==G(t)&&"function"!=typeof t?X(e):t}function Q(e){return Q=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},Q(e)}function X(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function Y(e,t){return Y=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},Y(e,t)}function Z(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var $=function(e){function t(){var e,r;H(this,t);for(var n=arguments.length,o=Array(n),a=0;n>a;a++)o[a]=arguments[a];return Z(X(r=K(this,(e=Q(t)).call.apply(e,[this].concat(o)))),"state",{bootstrapped:!1}),Z(X(r),"_unsubscribe",void 0),Z(X(r),"handlePersistorState",(function(){r.props.persistor.getState().bootstrapped&&(r.props.onBeforeLift?Promise.resolve(r.props.onBeforeLift()).finally((function(){return r.setState({bootstrapped:!0})})):r.setState({bootstrapped:!0}),r._unsubscribe&&r._unsubscribe())})),r}var r,n,o;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&Y(e,t)}(t,e),r=t,(n=[{key:"componentDidMount",value:function(){this._unsubscribe=this.props.persistor.subscribe(this.handlePersistorState),this.handlePersistorState()}},{key:"componentWillUnmount",value:function(){this._unsubscribe&&this._unsubscribe()}},{key:"render",value:function(){return"function"==typeof this.props.children?this.props.children(this.state.bootstrapped):this.state.bootstrapped?this.props.children:this.props.loading}}])&&J(r.prototype,n),o&&J(r,o),t}(t.PureComponent);Z($,"defaultProps",{children:null,loading:null});const ee=t.createContext(null);e.ADD_RECORD=y,e.ADD_RECORDS=b,e.ClientContext=V,e.ClientProvider=W,e.ContentContext=B,e.ContentProvider=F,e.DELETE_RECORD=h,e.DELETE_RECORDS=m,e.Pocketbase=e=>{const[r,n]=l.useState(null);return t.useEffect((()=>{const t=new p.default(e.serverURL);t.admins.authViaEmail(e.credentials.username,e.credentials.password).then((()=>{n(t)}))}),[e.serverURL]),r?l.createElement(W,{client:r},l.createElement(a.Provider,{store:q},l.createElement($,{persistor:N},l.createElement(F,{collections:e.initialCollections},e.children)))):null},e.PocketbaseContext=ee,e.SET_RECORDS=f,e.UPDATE_RECORD=v,e.appReducer=x,e.persistConfig=I,e.persistor=N,e.recordsAction=_,e.store=q,e.useAppContent=function(e,r=!1){var n;const o=null!=(n=M((t=>t.reducer.records[e])))?n:[],a=t.useContext(B);return t.useEffect((()=>{r&&(null==a||a.fetch(e))}),[e,r]),{records:o,actions:{subscribe:async()=>await(null==a?void 0:a.subscribe(e)),unsubscribe:()=>null==a?void 0:a.unsubscribe(e),refetch:async()=>await(null==a?void 0:a.fetch(e)),create:async t=>await(null==a?void 0:a.create(e,t)),update:async(t,r)=>await(null==a?void 0:a.update(e,t,r)),delete:async t=>await(null==a?void 0:a.delete(e,t))}}},e.useAppDispatch=U,e.useAppSelector=M,e.useClientContext=z,Object.defineProperty(e,"__esModule",{value:!0})}));
@@ -1,6 +1,5 @@
1
1
  import * as React from 'react';
2
- import PocketBase from 'pocketbase/dist/pocketbase.cjs';
3
- import { AsyncStorageStatic } from '@react-native-async-storage/async-storage';
2
+ import PocketBase from 'pocketbase';
4
3
  export declare const PocketbaseContext: React.Context<PocketBase | null>;
5
4
  export declare type PocketbaseProviderProps = {
6
5
  children: React.ReactNode;
@@ -10,6 +9,5 @@ export declare type PocketbaseProviderProps = {
10
9
  password: string;
11
10
  };
12
11
  initialCollections?: string[];
13
- storage: AsyncStorageStatic;
14
12
  };
15
13
  export declare const Pocketbase: (props: PocketbaseProviderProps) => JSX.Element | null;
@@ -0,0 +1,27 @@
1
+ import * as React from 'react';
2
+ import { createContext, useEffect } from 'react';
3
+ import PocketBase from 'pocketbase';
4
+ import { Provider } from 'react-redux';
5
+ import { PersistGate } from 'redux-persist/integration/react';
6
+ import * as store from '../store/store';
7
+ import { ClientProvider } from './client';
8
+ import { ContentProvider } from './content';
9
+ export const PocketbaseContext = createContext(null);
10
+ export const Pocketbase = props => {
11
+ const [client, setClient] = React.useState(null);
12
+ useEffect(() => {
13
+ const client = new PocketBase(props.serverURL);
14
+ client.admins.authViaEmail(props.credentials.username, props.credentials.password).then(() => {
15
+ setClient(client);
16
+ });
17
+ }, [props.serverURL]);
18
+ return client ? /*#__PURE__*/React.createElement(ClientProvider, {
19
+ client: client
20
+ }, /*#__PURE__*/React.createElement(Provider, {
21
+ store: store.store
22
+ }, /*#__PURE__*/React.createElement(PersistGate, {
23
+ persistor: store.persistor
24
+ }, /*#__PURE__*/React.createElement(ContentProvider, {
25
+ collections: props.initialCollections
26
+ }, props.children)))) : null;
27
+ };
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import PocketBase from 'pocketbase/dist/pocketbase.cjs';
2
+ import PocketBase from 'pocketbase';
3
3
  export declare const ClientContext: React.Context<PocketBase | null>;
4
4
  export declare type ClientProviderProps = {
5
5
  children: React.ReactNode;
@@ -0,0 +1,8 @@
1
+ import * as React from 'react';
2
+ import { createContext } from 'react';
3
+ export const ClientContext = createContext(null);
4
+ export const ClientProvider = props => {
5
+ return /*#__PURE__*/React.createElement(ClientContext.Provider, {
6
+ value: props.client
7
+ }, props.children);
8
+ };
File without changes
@@ -0,0 +1,63 @@
1
+ import * as store from '../store/store';
2
+ import * as React from 'react';
3
+ import { createContext, useEffect } from 'react';
4
+ import { useClientContext } from '../hooks/useClientContext';
5
+ import { recordsAction } from '../store/actions';
6
+ export const ContentContext = createContext(null);
7
+ export const ContentProvider = props => {
8
+ const client = useClientContext();
9
+ const dispatch = store.useAppDispatch;
10
+ const [collections, _] = React.useState(props.collections || []);
11
+ const actions = {
12
+ subscribe: async collectionName => {
13
+ // save local that collectionName should be subscribed
14
+ await (client == null ? void 0 : client.realtime.subscribe(collectionName, event => {
15
+ switch (event.action) {
16
+ case 'create':
17
+ dispatch(recordsAction.addRecord(collectionName, event.record));
18
+ break;
19
+ case 'update':
20
+ dispatch(recordsAction.updateRecord(collectionName, event.record));
21
+ break;
22
+ case 'delete':
23
+ dispatch(recordsAction.deleteRecord(collectionName, event.record));
24
+ break;
25
+ default:
26
+ break;
27
+ }
28
+ }));
29
+ },
30
+ unsubscribe: collectionName => {
31
+ if (collectionName) {
32
+ client == null ? void 0 : client.realtime.unsubscribe(collectionName);
33
+ } else {
34
+ client == null ? void 0 : client.realtime.unsubscribe();
35
+ }
36
+ },
37
+ fetch: async collectionName => {
38
+ const records = await (client == null ? void 0 : client.records.getFullList(collectionName, 200));
39
+ dispatch(recordsAction.setRecords(collectionName, records));
40
+ },
41
+ create: async (collectionName, record) => {
42
+ await (client == null ? void 0 : client.records.create(collectionName, record));
43
+ },
44
+ update: async (collectionName, recordId, record) => {
45
+ await (client == null ? void 0 : client.records.update(collectionName, recordId, record));
46
+ },
47
+ delete: async (collectionName, recordId) => {
48
+ await (client == null ? void 0 : client.records.delete(collectionName, recordId));
49
+ }
50
+ };
51
+ useEffect(() => {
52
+ if (collections) {
53
+ collections.forEach(collectionName => {
54
+ actions.fetch(collectionName);
55
+ actions.subscribe(collectionName);
56
+ });
57
+ }
58
+ return () => actions.unsubscribe();
59
+ }, [collections]);
60
+ return /*#__PURE__*/React.createElement(ContentContext.Provider, {
61
+ value: actions
62
+ }, props.children);
63
+ };
File without changes
@@ -0,0 +1,3 @@
1
+ export * from './content';
2
+ export * from './client';
3
+ export * from './Pocketbase';
File without changes
@@ -0,0 +1,2 @@
1
+ export * from './useAppContent';
2
+ export * from './useClientContext';
@@ -1,4 +1,4 @@
1
- import Record from '../interfaces/Record';
1
+ import { Record } from '../interfaces/Record';
2
2
  export declare function useAppContent<T extends Record>(collectionName: string, initialFetch?: boolean): {
3
3
  records: T[];
4
4
  actions: {