Advertisement
AlexFSmirnov

Modal Template

Oct 20th, 2020
599
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import React from 'react';
  2. import _ from 'lodash';
  3.  
  4. const normalizeUrl = (url: string) => {
  5.     return {
  6.         url,
  7.         shouldReload: true,
  8.     };
  9. };
  10.  
  11. enum DataType {
  12.     HTML = 'html',
  13.     React = 'react',
  14. }
  15.  
  16. export interface ModalProps {
  17.     url: string;
  18.     requestData?: object;
  19.     requestType?: 'GET' | 'POST';
  20.     events: Record<string, (data?: string) => void>; // map from event name to callback
  21.     isActive?: boolean;
  22.     onModalClosed: (eventData: string) => void;
  23. }
  24.  
  25. export interface ModalState {
  26.     type: DataType | null;
  27.     reactComponent: React.ReactNode;
  28.     shouldTemplateFetcherUpdate: boolean;
  29.     normalizedUrl: string;
  30. }
  31.  
  32. class Modal extends React.Component<ModalProps, ModalState> {
  33.     state: ModalState = {
  34.         type: null,
  35.         reactComponent: null,
  36.         shouldTemplateFetcherUpdate: true,
  37.         normalizedUrl: '',
  38.     };
  39.  
  40.     componentDidMount() {
  41.         this.handleUrlChanged();
  42.     }
  43.  
  44.     componentDidUpdate(prevProps: ModalProps) {
  45.         if (prevProps.url !== this.props.url) {
  46.             this.handleUrlChanged();
  47.         }
  48.     }
  49.  
  50.     componentWillUnmount() {
  51.         // unregister from parent modal
  52.     }
  53.  
  54.     handleUrlChanged = () => {
  55.         const { url, shouldReload } = normalizeUrl(this.props.url);
  56.         const type = this.getContentType(url);
  57.         this.setState({ type, normalizedUrl: url, shouldTemplateFetcherUpdate: shouldReload });
  58.     };
  59.  
  60.     getContentType = (url: string) => {
  61.         // If given url exists in router
  62.         if (url) {
  63.             return DataType.React;
  64.         }
  65.  
  66.         return DataType.HTML;
  67.     };
  68.  
  69.     close = (eventData: string) => {
  70.         this.props.onModalClosed(eventData);
  71.  
  72.         if (!_.isUndefined(eventData)) {
  73.             this.triggerEvent('data-received', eventData);
  74.         }
  75.         this.triggerEvent('disposing');
  76.         this.triggerEvent('hide', eventData);
  77.     };
  78.  
  79.     triggerEvent = (eventName: string, eventData?: string) => {
  80.         this.props.events[eventName](eventData);
  81.     };
  82.  
  83.     setupEventListeners = () => {
  84.         // ajaxify functionality here
  85.     };
  86.  
  87.     render() {
  88.         const { type, normalizedUrl, reactComponent, shouldTemplateFetcherUpdate } = this.state;
  89.         if (!type) {
  90.             return 'Loader';
  91.         }
  92.  
  93.         return type === DataType.React
  94.             ? (
  95.                 <div>{reactComponent}</div>
  96.             )
  97.             : (
  98.                 <TemplateFetcher url={normalizedUrl} freeezUpdates={!shouldTemplateFetcherUpdate} />
  99.             );
  100.     }
  101. }
  102.  
  103. export default Modal;
  104.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement