element-web/test/stores
kegsay e946674df3
Store refactor: use non-global stores in components (#9293)
* Add Stores and StoresContext and use it in MatrixChat and RoomView

Added a new kind of class:
- Add God object `Stores` which will hold refs to all known stores and the `MatrixClient`. This object is NOT a singleton.
- Add `StoresContext` to hold onto a ref of `Stores` for use inside components.

`StoresContext` is created via:
- Create `Stores` in `MatrixChat`, assigning the `MatrixClient` when we have one set. Currently sets the RVS to `RoomViewStore.instance`.
- Wrap `MatrixChat`s `render()` function in a `StoresContext.Provider` so it can be used anywhere.

`StoresContext` is currently only used in `RoomView` via the following changes:
- Remove the HOC, which redundantly set `mxClient` as a prop. We don't need this as `RoomView` was using the client from `this.context`.
- Change the type of context accepted from `MatrixClientContext` to `StoresContext`.
- Modify alllll the places where `this.context` is used to interact with the client and suffix `.client`.
- Modify places where we use `RoomViewStore.instance` and replace them with `this.context.roomViewStore`.

This makes `RoomView` use a non-global instance of RVS.

* Linting

* SDKContext and make client an optional constructor arg

* Move SDKContext to /src/contexts

* Inject all RVS deps

* Linting

* Remove reset calls; deep copy the INITIAL_STATE to avoid test pollution

* DI singletons used in RoomView; DI them in RoomView-test too

* Initial RoomViewStore.instance after all files are imported to avoid cyclical deps

* Lazily init stores to allow for circular dependencies

Rather than stores accepting a list of other stores in their constructors,
which doesn't work when A needs B and B needs A, make new-style stores simply
accept Stores. When a store needs another store, they access it via `Stores`
which then lazily constructs that store if it needs it. This breaks the
circular dependency at constructor time, without needing to introduce
wiring diagrams or any complex DI framework.

* Delete RoomViewStore.instance

Replaced with Stores.instance.roomViewStore

* Linting

* Move OverridableStores to test/TestStores

* Rejig how eager stores get made; don't automatically do it else tests break

* Linting

* Linting and review comments

* Fix new code to use Stores.instance

* s/Stores/SdkContextClass/g

* Update docs

* Remove unused imports

* Update src/stores/RoomViewStore.tsx

Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>

* Remove empty c'tor to make sonar happy

Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
2022-10-19 13:07:03 +01:00
..
notifications Step 8.1: Remove skinning setup from all tests 2022-03-28 14:02:31 -06:00
right-panel Show chat panel when opening a video room with unread messages (#8812) 2022-06-17 16:57:40 -04:00
room-list New group call experience: Room header and PiP designs (#9351) 2022-10-07 02:27:28 +00:00
widgets Store refactor: use non-global stores in components (#9293) 2022-10-19 13:07:03 +01:00
ActiveWidgetStore-test.ts Fix infinite loop when pinning/unpinning persistent widgets (#8396) 2022-04-25 08:29:54 -04:00
OwnBeaconStore-test.ts Live location share - explicitly stop beacons replaced beacons (PSG-544) (#8933) 2022-06-30 07:33:51 +00:00
RoomViewStore-test.ts Store refactor: use non-global stores in components (#9293) 2022-10-19 13:07:03 +01:00
SpaceStore-test.ts ensure metaspace changes correctly notify listeners (#8611) 2022-05-18 15:15:25 +02:00
TypingStore-test.ts Wire local room logic (#9078) 2022-07-20 09:26:25 +02:00
VoiceRecordingStore-test.ts Generalise VoiceRecording (#9304) 2022-09-21 18:46:28 +02:00
WidgetLayoutStore-test.ts Step 8.1: Remove skinning setup from all tests 2022-03-28 14:02:31 -06:00