pocketbase-react 0.1.1 → 0.1.2

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 +492 -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 +28 -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 +67 -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 +26 -0
  17. package/es/hooks/useClientContext.d.ts +2 -0
  18. package/es/hooks/useClientContext.js +9 -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 +39 -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 +71 -0
  35. package/{dist/cjs → es}/store/store.d.ts +1 -1
  36. package/es/store/store.js +46 -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 +49 -0
  40. package/lib/context/client.js +21 -0
  41. package/lib/context/content.js +83 -0
  42. package/lib/context/index.js +42 -0
  43. package/lib/hooks/index.js +29 -0
  44. package/lib/hooks/useAppContent.js +38 -0
  45. package/lib/hooks/useClientContext.js +15 -0
  46. package/lib/index.js +55 -0
  47. package/lib/interfaces/Record.js +1 -0
  48. package/lib/interfaces/index.js +16 -0
  49. package/lib/store/actions/index.js +12 -0
  50. package/lib/store/actions/records.js +58 -0
  51. package/lib/store/index.js +55 -0
  52. package/lib/store/reducers/index.js +13 -0
  53. package/lib/store/reducers/records.js +85 -0
  54. package/lib/store/store.js +63 -0
  55. package/lib/store/types/index.js +16 -0
  56. package/package.json +94 -35
  57. package/src/context/Pocketbase.tsx +43 -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 +67 -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,492 @@
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
+
44
+ const addRecord = (key, payload) => ({
45
+ type: ADD_RECORD,
46
+ key,
47
+ payload
48
+ });
49
+
50
+ const addRecords = (key, payload) => ({
51
+ type: ADD_RECORDS,
52
+ key,
53
+ payload
54
+ });
55
+
56
+ const deleteRecord$1 = (key, payload) => ({
57
+ type: DELETE_RECORD,
58
+ key,
59
+ payload
60
+ });
61
+
62
+ const deleteRecords$1 = (key, payload) => ({
63
+ type: DELETE_RECORDS,
64
+ key,
65
+ payload
66
+ });
67
+
68
+ const updateRecord$1 = (key, payload) => ({
69
+ type: UPDATE_RECORD,
70
+ key,
71
+ payload
72
+ });
73
+
74
+ var records$1 = /*#__PURE__*/Object.freeze({
75
+ __proto__: null,
76
+ setRecords: setRecords,
77
+ addRecord: addRecord,
78
+ addRecords: addRecords,
79
+ deleteRecord: deleteRecord$1,
80
+ deleteRecords: deleteRecords$1,
81
+ updateRecord: updateRecord$1
82
+ });
83
+
84
+ function _extends() {
85
+ _extends = Object.assign ? Object.assign.bind() : function (target) {
86
+ for (var i = 1; i < arguments.length; i++) {
87
+ var source = arguments[i];
88
+
89
+ for (var key in source) {
90
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
91
+ target[key] = source[key];
92
+ }
93
+ }
94
+ }
95
+
96
+ return target;
97
+ };
98
+ return _extends.apply(this, arguments);
99
+ }
100
+
101
+ function appendRecord(record, records) {
102
+ return [...records, record];
103
+ }
104
+
105
+ function appendRecords(recordsToAppend, records) {
106
+ return [...records, ...recordsToAppend];
107
+ }
108
+
109
+ function updateRecord(record, records) {
110
+ return records.map(r => {
111
+ if (r.id === record.id) {
112
+ return record;
113
+ }
114
+
115
+ return r;
116
+ });
117
+ }
118
+
119
+ function deleteRecord(record, records) {
120
+ return records.filter(r => r.id !== record.id);
121
+ }
122
+
123
+ function deleteRecords(recordsToDelete, records) {
124
+ return records.filter(r => !recordsToDelete.includes(r));
125
+ }
126
+
127
+ const records = (state = {}, action) => {
128
+ var _state$action$key;
129
+
130
+ const list = (_state$action$key = state[action.key]) != null ? _state$action$key : [];
131
+
132
+ switch (action.type) {
133
+ case SET_RECORDS:
134
+ if (Array.isArray(action.payload)) {
135
+ return _extends({}, state, {
136
+ [action.key]: action.payload
137
+ });
138
+ }
139
+
140
+ case ADD_RECORD:
141
+ return _extends({}, state, {
142
+ [action.key]: appendRecord(action.payload, list)
143
+ });
144
+
145
+ case ADD_RECORDS:
146
+ return _extends({}, state, {
147
+ [action.key]: appendRecords(action.payload, list)
148
+ });
149
+
150
+ case DELETE_RECORD:
151
+ return _extends({}, state, {
152
+ [action.key]: deleteRecord(action.payload, list)
153
+ });
154
+
155
+ case DELETE_RECORDS:
156
+ return _extends({}, state, {
157
+ [action.key]: deleteRecords(action.payload, list)
158
+ });
159
+
160
+ case UPDATE_RECORD:
161
+ return _extends({}, state, {
162
+ [action.key]: updateRecord(action.payload, list)
163
+ });
164
+
165
+ default:
166
+ return state;
167
+ }
168
+ };
169
+
170
+ const appReducer = redux.combineReducers({
171
+ records: records
172
+ });
173
+
174
+ /** A function that accepts a potential "extra argument" value to be injected later,
175
+ * and returns an instance of the thunk middleware that uses that value
176
+ */
177
+ function createThunkMiddleware(extraArgument) {
178
+ // Standard Redux middleware definition pattern:
179
+ // See: https://redux.js.org/tutorials/fundamentals/part-4-store#writing-custom-middleware
180
+ var middleware = function middleware(_ref) {
181
+ var dispatch = _ref.dispatch,
182
+ getState = _ref.getState;
183
+ return function (next) {
184
+ return function (action) {
185
+ // The thunk middleware looks for any functions that were passed to `store.dispatch`.
186
+ // If this "action" is really a function, call it and return the result.
187
+ if (typeof action === 'function') {
188
+ // Inject the store's `dispatch` and `getState` methods, as well as any "extra arg"
189
+ return action(dispatch, getState, extraArgument);
190
+ } // Otherwise, pass the action down the middleware chain as usual
191
+
192
+
193
+ return next(action);
194
+ };
195
+ };
196
+ };
197
+
198
+ return middleware;
199
+ }
200
+
201
+ var thunk = createThunkMiddleware(); // Attach the factory function so users can create a customized version
202
+ // with whatever "extra arg" they want to inject into their thunks
203
+
204
+ thunk.withExtraArgument = createThunkMiddleware;
205
+ var thunk$1 = thunk;
206
+
207
+ const CustomStorage = {
208
+ getItem: async (_key, ..._args) => {
209
+ if (typeof document !== 'undefined') {
210
+ console.log("I'm on the web!");
211
+ return localStorage.getItem(_key);
212
+ } else if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {
213
+ console.log("I'm in react-native");
214
+ return await AsyncStorage__default["default"].getItem(_key);
215
+ }
216
+ },
217
+ setItem: async (_key, _value, ..._args) => {
218
+ if (typeof document !== 'undefined') {
219
+ return localStorage.setItem(_key, _value);
220
+ } else if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {
221
+ return await AsyncStorage__default["default"].setItem(_key, _value);
222
+ }
223
+ },
224
+ removeItem: async (_key, ..._args) => {
225
+ if (typeof document !== 'undefined') {
226
+ return localStorage.removeItem(_key);
227
+ } else if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {
228
+ return await AsyncStorage__default["default"].removeItem(_key);
229
+ }
230
+ }
231
+ };
232
+ const persistConfig = {
233
+ key: 'root',
234
+ storage: CustomStorage
235
+ };
236
+ const reducer = toolkit.combineReducers({
237
+ reducer: reduxPersist.persistReducer(persistConfig, appReducer)
238
+ });
239
+ const store = toolkit.configureStore({
240
+ reducer,
241
+ middleware: [thunk$1]
242
+ });
243
+ const useAppDispatch = store.dispatch;
244
+ const useAppSelector = reactRedux.useSelector;
245
+ const persistor = reduxPersist.persistStore(store);
246
+
247
+ const useClientContext = () => {
248
+ const context = React.useContext(ClientContext);
249
+ return context;
250
+ };
251
+
252
+ const ContentContext = React.createContext(null);
253
+ const ContentProvider = props => {
254
+ const client = useClientContext();
255
+ const dispatch = useAppDispatch;
256
+ const [collections, _] = React__namespace.useState(props.collections || []);
257
+ const actions = {
258
+ subscribe: async collectionName => {
259
+ // save local that collectionName should be subscribed
260
+ await (client == null ? void 0 : client.realtime.subscribe(collectionName, event => {
261
+ switch (event.action) {
262
+ case 'create':
263
+ dispatch(addRecord(collectionName, event.record));
264
+ break;
265
+
266
+ case 'update':
267
+ dispatch(updateRecord$1(collectionName, event.record));
268
+ break;
269
+
270
+ case 'delete':
271
+ dispatch(deleteRecord$1(collectionName, event.record));
272
+ break;
273
+ }
274
+ }));
275
+ },
276
+ unsubscribe: collectionName => {
277
+ if (collectionName) {
278
+ client == null ? void 0 : client.realtime.unsubscribe(collectionName);
279
+ } else {
280
+ client == null ? void 0 : client.realtime.unsubscribe();
281
+ }
282
+ },
283
+ fetch: async collectionName => {
284
+ const records = await (client == null ? void 0 : client.records.getFullList(collectionName, 200));
285
+ dispatch(setRecords(collectionName, records));
286
+ },
287
+ create: async (collectionName, record) => {
288
+ await (client == null ? void 0 : client.records.create(collectionName, record));
289
+ },
290
+ update: async (collectionName, recordId, record) => {
291
+ await (client == null ? void 0 : client.records.update(collectionName, recordId, record));
292
+ },
293
+ delete: async (collectionName, recordId) => {
294
+ await (client == null ? void 0 : client.records.delete(collectionName, recordId));
295
+ }
296
+ };
297
+ React.useEffect(() => {
298
+ if (collections) {
299
+ collections.forEach(collectionName => {
300
+ actions.fetch(collectionName);
301
+ actions.subscribe(collectionName);
302
+ });
303
+ }
304
+
305
+ return () => actions.unsubscribe();
306
+ }, [collections]);
307
+ return /*#__PURE__*/React__namespace.createElement(ContentContext.Provider, {
308
+ value: actions
309
+ }, props.children);
310
+ };
311
+
312
+ const ClientContext = React.createContext(null);
313
+ const ClientProvider = props => {
314
+ return /*#__PURE__*/React__namespace.createElement(ClientContext.Provider, {
315
+ value: props.client
316
+ }, props.children);
317
+ };
318
+
319
+ 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); }
320
+
321
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
322
+
323
+ 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); } }
324
+
325
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
326
+
327
+ function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
328
+
329
+ function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
330
+
331
+ function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
332
+
333
+ 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); }
334
+
335
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
336
+
337
+ 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; }
338
+
339
+ var PersistGate =
340
+ /*#__PURE__*/
341
+ function (_PureComponent) {
342
+ _inherits(PersistGate, _PureComponent);
343
+
344
+ function PersistGate() {
345
+ var _getPrototypeOf2;
346
+
347
+ var _this;
348
+
349
+ _classCallCheck(this, PersistGate);
350
+
351
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
352
+ args[_key] = arguments[_key];
353
+ }
354
+
355
+ _this = _possibleConstructorReturn(this, (_getPrototypeOf2 = _getPrototypeOf(PersistGate)).call.apply(_getPrototypeOf2, [this].concat(args)));
356
+
357
+ _defineProperty(_assertThisInitialized(_this), "state", {
358
+ bootstrapped: false
359
+ });
360
+
361
+ _defineProperty(_assertThisInitialized(_this), "_unsubscribe", void 0);
362
+
363
+ _defineProperty(_assertThisInitialized(_this), "handlePersistorState", function () {
364
+ var persistor = _this.props.persistor;
365
+
366
+ var _persistor$getState = persistor.getState(),
367
+ bootstrapped = _persistor$getState.bootstrapped;
368
+
369
+ if (bootstrapped) {
370
+ if (_this.props.onBeforeLift) {
371
+ Promise.resolve(_this.props.onBeforeLift()).finally(function () {
372
+ return _this.setState({
373
+ bootstrapped: true
374
+ });
375
+ });
376
+ } else {
377
+ _this.setState({
378
+ bootstrapped: true
379
+ });
380
+ }
381
+
382
+ _this._unsubscribe && _this._unsubscribe();
383
+ }
384
+ });
385
+
386
+ return _this;
387
+ }
388
+
389
+ _createClass(PersistGate, [{
390
+ key: "componentDidMount",
391
+ value: function componentDidMount() {
392
+ this._unsubscribe = this.props.persistor.subscribe(this.handlePersistorState);
393
+ this.handlePersistorState();
394
+ }
395
+ }, {
396
+ key: "componentWillUnmount",
397
+ value: function componentWillUnmount() {
398
+ this._unsubscribe && this._unsubscribe();
399
+ }
400
+ }, {
401
+ key: "render",
402
+ value: function render() {
403
+ {
404
+ 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.');
405
+ }
406
+
407
+ if (typeof this.props.children === 'function') {
408
+ return this.props.children(this.state.bootstrapped);
409
+ }
410
+
411
+ return this.state.bootstrapped ? this.props.children : this.props.loading;
412
+ }
413
+ }]);
414
+
415
+ return PersistGate;
416
+ }(React.PureComponent);
417
+
418
+ _defineProperty(PersistGate, "defaultProps", {
419
+ children: null,
420
+ loading: null
421
+ });
422
+
423
+ const PocketbaseContext = React.createContext(null);
424
+ const Pocketbase = props => {
425
+ const [client, setClient] = React__namespace.useState(null);
426
+ React.useEffect(() => {
427
+ const client = new PocketBase__default["default"](props.serverURL);
428
+ client.admins.authViaEmail(props.credentials.username, props.credentials.password).then(() => {
429
+ setClient(client);
430
+ console.log('Pocketbase client initialized');
431
+ });
432
+ }, [props.serverURL]);
433
+ return client ? /*#__PURE__*/React__namespace.createElement(ClientProvider, {
434
+ client: client
435
+ }, /*#__PURE__*/React__namespace.createElement(reactRedux.Provider, {
436
+ store: store
437
+ }, /*#__PURE__*/React__namespace.createElement(PersistGate, {
438
+ persistor: persistor
439
+ }, /*#__PURE__*/React__namespace.createElement(ContentProvider, {
440
+ collections: props.initialCollections
441
+ }, props.children)))) : null;
442
+ };
443
+
444
+ function useAppContent(collectionName, initialFetch = false) {
445
+ var _store$useAppSelector;
446
+
447
+ const records = (_store$useAppSelector = useAppSelector(state => state.reducer.records[collectionName])) != null ? _store$useAppSelector : [];
448
+ const context = React.useContext(ContentContext);
449
+ React.useEffect(() => {
450
+ if (initialFetch) {
451
+ context == null ? void 0 : context.fetch(collectionName);
452
+ }
453
+ }, [collectionName, initialFetch]);
454
+ const actions = {
455
+ subscribe: async () => await (context == null ? void 0 : context.subscribe(collectionName)),
456
+ unsubscribe: () => context == null ? void 0 : context.unsubscribe(collectionName),
457
+ refetch: async () => await (context == null ? void 0 : context.fetch(collectionName)),
458
+ create: async record => await (context == null ? void 0 : context.create(collectionName, record)),
459
+ update: async (id, record) => await (context == null ? void 0 : context.update(collectionName, id, record)),
460
+ delete: async id => await (context == null ? void 0 : context.delete(collectionName, id))
461
+ };
462
+ return {
463
+ records,
464
+ actions
465
+ };
466
+ }
467
+
468
+ exports.ADD_RECORD = ADD_RECORD;
469
+ exports.ADD_RECORDS = ADD_RECORDS;
470
+ exports.ClientContext = ClientContext;
471
+ exports.ClientProvider = ClientProvider;
472
+ exports.ContentContext = ContentContext;
473
+ exports.ContentProvider = ContentProvider;
474
+ exports.DELETE_RECORD = DELETE_RECORD;
475
+ exports.DELETE_RECORDS = DELETE_RECORDS;
476
+ exports.Pocketbase = Pocketbase;
477
+ exports.PocketbaseContext = PocketbaseContext;
478
+ exports.SET_RECORDS = SET_RECORDS;
479
+ exports.UPDATE_RECORD = UPDATE_RECORD;
480
+ exports.appReducer = appReducer;
481
+ exports.persistConfig = persistConfig;
482
+ exports.persistor = persistor;
483
+ exports.recordsAction = records$1;
484
+ exports.store = store;
485
+ exports.useAppContent = useAppContent;
486
+ exports.useAppDispatch = useAppDispatch;
487
+ exports.useAppSelector = useAppSelector;
488
+ exports.useClientContext = useClientContext;
489
+
490
+ Object.defineProperty(exports, '__esModule', { value: true });
491
+
492
+ }));
@@ -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",g=(e,t)=>({type:f,key:e,payload:t}),E=(e,t)=>({type:y,key:e,payload:t}),R=(e,t)=>({type:h,key:e,payload:t}),O=(e,t)=>({type:v,key:e,payload:t});var _=Object.freeze({__proto__:null,setRecords:g,addRecord:E,addRecords:(e,t)=>({type:b,key:e,payload:t}),deleteRecord:R,deleteRecords:(e,t)=>({type:m,key:e,payload:t}),updateRecord:O});function k(){return k=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},k.apply(this,arguments)}function w(e,t){return[...t,e]}function C(e,t){return[...t,...e]}function S(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 k({},e,{[t.key]:t.payload});case y:return k({},e,{[t.key]:w(t.payload,n)});case b:return k({},e,{[t.key]:C(t.payload,n)});case h:return k({},e,{[t.key]:D(t.payload,n)});case m:return k({},e,{[t.key]:P(t.payload,n)});case v:return k({},e,{[t.key]:S(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?(console.log("I'm on the web!"),localStorage.getItem(e)):"undefined"!=typeof navigator&&"ReactNative"===navigator.product?(console.log("I'm in react-native"),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,z=a.useSelector,M=o.persistStore(q),N=()=>t.useContext(V),B=t.createContext(null),F=e=>{const r=N(),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(E(e,t.record));break;case"update":n(O(e,t.record));break;case"delete":n(R(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(g(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),console.log("Pocketbase client initialized")}))}),[e.serverURL]),r?l.createElement(W,{client:r},l.createElement(a.Provider,{store:q},l.createElement($,{persistor:M},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=M,e.recordsAction=_,e.store=q,e.useAppContent=function(e,r=!1){var n;const o=null!=(n=z((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=z,e.useClientContext=N,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,28 @@
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
+ console.log('Pocketbase client initialized');
17
+ });
18
+ }, [props.serverURL]);
19
+ return client ? /*#__PURE__*/React.createElement(ClientProvider, {
20
+ client: client
21
+ }, /*#__PURE__*/React.createElement(Provider, {
22
+ store: store.store
23
+ }, /*#__PURE__*/React.createElement(PersistGate, {
24
+ persistor: store.persistor
25
+ }, /*#__PURE__*/React.createElement(ContentProvider, {
26
+ collections: props.initialCollections
27
+ }, props.children)))) : null;
28
+ };
@@ -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,67 @@
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
+
20
+ case 'update':
21
+ dispatch(recordsAction.updateRecord(collectionName, event.record));
22
+ break;
23
+
24
+ case 'delete':
25
+ dispatch(recordsAction.deleteRecord(collectionName, event.record));
26
+ break;
27
+
28
+ default:
29
+ break;
30
+ }
31
+ }));
32
+ },
33
+ unsubscribe: collectionName => {
34
+ if (collectionName) {
35
+ client == null ? void 0 : client.realtime.unsubscribe(collectionName);
36
+ } else {
37
+ client == null ? void 0 : client.realtime.unsubscribe();
38
+ }
39
+ },
40
+ fetch: async collectionName => {
41
+ const records = await (client == null ? void 0 : client.records.getFullList(collectionName, 200));
42
+ dispatch(recordsAction.setRecords(collectionName, records));
43
+ },
44
+ create: async (collectionName, record) => {
45
+ await (client == null ? void 0 : client.records.create(collectionName, record));
46
+ },
47
+ update: async (collectionName, recordId, record) => {
48
+ await (client == null ? void 0 : client.records.update(collectionName, recordId, record));
49
+ },
50
+ delete: async (collectionName, recordId) => {
51
+ await (client == null ? void 0 : client.records.delete(collectionName, recordId));
52
+ }
53
+ };
54
+ useEffect(() => {
55
+ if (collections) {
56
+ collections.forEach(collectionName => {
57
+ actions.fetch(collectionName);
58
+ actions.subscribe(collectionName);
59
+ });
60
+ }
61
+
62
+ return () => actions.unsubscribe();
63
+ }, [collections]);
64
+ return /*#__PURE__*/React.createElement(ContentContext.Provider, {
65
+ value: actions
66
+ }, props.children);
67
+ };
File without changes