modalStore.tsx 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import {createStore, StoreDefinition} from 'reflux';
  2. import {ModalOptions, ModalRenderProps} from 'sentry/actionCreators/modal';
  3. import ModalActions from 'sentry/actions/modalActions';
  4. import {
  5. makeSafeRefluxStore,
  6. SafeRefluxStore,
  7. SafeStoreDefinition,
  8. } from 'sentry/utils/makeSafeRefluxStore';
  9. type Renderer = (renderProps: ModalRenderProps) => React.ReactNode;
  10. type ModalStoreState = {
  11. options: ModalOptions;
  12. renderer: Renderer | null;
  13. };
  14. type ModalStoreInterface = {
  15. get(): ModalStoreState;
  16. init(): void;
  17. onCloseModal(): void;
  18. onOpenModal(renderer: Renderer, options: ModalOptions): void;
  19. reset(): void;
  20. };
  21. const storeConfig: StoreDefinition & ModalStoreInterface & SafeStoreDefinition = {
  22. unsubscribeListeners: [],
  23. init() {
  24. this.reset();
  25. this.unsubscribeListeners.push(
  26. this.listenTo(ModalActions.closeModal, this.onCloseModal)
  27. );
  28. this.unsubscribeListeners.push(
  29. this.listenTo(ModalActions.openModal, this.onOpenModal)
  30. );
  31. },
  32. get() {
  33. return this.state;
  34. },
  35. reset() {
  36. this.state = {
  37. renderer: null,
  38. options: {},
  39. } as ModalStoreState;
  40. },
  41. onCloseModal() {
  42. this.reset();
  43. this.trigger(this.state);
  44. },
  45. onOpenModal(renderer: Renderer, options: ModalOptions) {
  46. this.state = {renderer, options};
  47. this.trigger(this.state);
  48. },
  49. };
  50. const ModalStore = createStore(makeSafeRefluxStore(storeConfig)) as SafeRefluxStore &
  51. ModalStoreInterface;
  52. export default ModalStore;